// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. #include "textflag.h" // This could use MOVSQ, but we use MOVSL so that if an object ends in // a 4 byte pointer, we copy it as a unit instead of byte by byte. // func memmove(to, from unsafe.Pointer, n uintptr) TEXT runtime·memmove(SB), NOSPLIT, $0-12 MOVL to+0(FP), DI MOVL from+4(FP), SI MOVL n+8(FP), BX CMPL SI, DI JLS back forward: MOVL BX, CX SHRL $2, CX ANDL $3, BX REP; MOVSL MOVL BX, CX REP; MOVSB RET back: MOVL SI, CX ADDL BX, CX CMPL CX, DI JLS forward ADDL BX, DI ADDL BX, SI STD MOVL BX, CX SHRL $2, CX ANDL $3, BX SUBL $4, DI SUBL $4, SI REP; MOVSL ADDL $3, DI ADDL $3, SI MOVL BX, CX REP; MOVSB CLD // Note: we copy only 4 bytes at a time so that the tail is at most // 3 bytes. That guarantees that we aren't copying pointers with MOVSB. // See issue 13160. RET