Home | History | Annotate | Download | only in runtime
      1 // Copyright 2013 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 #include "textflag.h"
      6 
      7 // This could use MOVSQ, but we use MOVSL so that if an object ends in
      8 // a 4 byte pointer, we copy it as a unit instead of byte by byte.
      9 
     10 TEXT runtimememmove(SB), NOSPLIT, $0-12
     11 	MOVL	to+0(FP), DI
     12 	MOVL	from+4(FP), SI
     13 	MOVL	n+8(FP), BX
     14 
     15 	CMPL	SI, DI
     16 	JLS back
     17 
     18 forward:
     19 	MOVL	BX, CX
     20 	SHRL	$2, CX
     21 	ANDL	$3, BX
     22 	REP; MOVSL
     23 	MOVL	BX, CX
     24 	REP; MOVSB
     25 	RET
     26 
     27 back:
     28 	MOVL	SI, CX
     29 	ADDL	BX, CX
     30 	CMPL	CX, DI
     31 	JLS forward
     32 
     33 	ADDL	BX, DI
     34 	ADDL	BX, SI
     35 	STD
     36 
     37 	MOVL	BX, CX
     38 	SHRL	$2, CX
     39 	ANDL	$3, BX
     40 	SUBL	$4, DI
     41 	SUBL	$4, SI
     42 	REP; MOVSL
     43 	ADDL	$3, DI
     44 	ADDL	$3, SI
     45 	MOVL	BX, CX
     46 	REP; MOVSB
     47 	CLD
     48 
     49 	// Note: we copy only 4 bytes at a time so that the tail is at most
     50 	// 3 bytes. That guarantees that we aren't copying pointers with MOVSB.
     51 	// See issue 13160.
     52 	RET
     53