// 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. | |
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 |