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