golang.org/toolchain@v0.0.1-go1.9rc2.windows-amd64/src/runtime/memmove_nacl_amd64p32.s (about)

     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 runtime·memmove(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