|  | // Copyright 2022 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" | 
|  |  | 
|  | // See memmove Go doc for important implementation constraints. | 
|  |  | 
|  | // func memmove(to, from unsafe.Pointer, n uintptr) | 
|  | TEXT runtime·memmove(SB), NOSPLIT|NOFRAME, $0-24 | 
|  | MOVV	to+0(FP), R4 | 
|  | MOVV	from+8(FP), R5 | 
|  | MOVV	n+16(FP), R6 | 
|  | BNE	R6, check | 
|  | RET | 
|  |  | 
|  | check: | 
|  | SGTU	R4, R5, R7 | 
|  | BNE	R7, backward | 
|  |  | 
|  | ADDV	R4, R6, R9 // end pointer | 
|  |  | 
|  | // if the two pointers are not of same alignments, do byte copying | 
|  | SUBVU	R5, R4, R7 | 
|  | AND	$7, R7 | 
|  | BNE	R7, out | 
|  |  | 
|  | // if less than 8 bytes, do byte copying | 
|  | SGTU	$8, R6, R7 | 
|  | BNE	R7, out | 
|  |  | 
|  | // do one byte at a time until 8-aligned | 
|  | AND	$7, R4, R8 | 
|  | BEQ	R8, words | 
|  | MOVB	(R5), R7 | 
|  | ADDV	$1, R5 | 
|  | MOVB	R7, (R4) | 
|  | ADDV	$1, R4 | 
|  | JMP	-6(PC) | 
|  |  | 
|  | words: | 
|  | // do 8 bytes at a time if there is room | 
|  | ADDV	$-7, R9, R6 // R6 is end pointer-7 | 
|  |  | 
|  | SGTU	R6, R4, R8 | 
|  | BEQ	R8, out | 
|  | MOVV	(R5), R7 | 
|  | ADDV	$8, R5 | 
|  | MOVV	R7, (R4) | 
|  | ADDV	$8, R4 | 
|  | JMP	-6(PC) | 
|  |  | 
|  | out: | 
|  | BEQ	R4, R9, done | 
|  | MOVB	(R5), R7 | 
|  | ADDV	$1, R5 | 
|  | MOVB	R7, (R4) | 
|  | ADDV	$1, R4 | 
|  | JMP	-5(PC) | 
|  | done: | 
|  | RET | 
|  |  | 
|  | backward: | 
|  | ADDV	R6, R5 // from-end pointer | 
|  | ADDV	R4, R6, R9 // to-end pointer | 
|  |  | 
|  | // if the two pointers are not of same alignments, do byte copying | 
|  | SUBVU	R9, R5, R7 | 
|  | AND	$7, R7 | 
|  | BNE	R7, out1 | 
|  |  | 
|  | // if less than 8 bytes, do byte copying | 
|  | SGTU	$8, R6, R7 | 
|  | BNE	R7, out1 | 
|  |  | 
|  | // do one byte at a time until 8-aligned | 
|  | AND	$7, R9, R8 | 
|  | BEQ	R8, words1 | 
|  | ADDV	$-1, R5 | 
|  | MOVB	(R5), R7 | 
|  | ADDV	$-1, R9 | 
|  | MOVB	R7, (R9) | 
|  | JMP	-6(PC) | 
|  |  | 
|  | words1: | 
|  | // do 8 bytes at a time if there is room | 
|  | ADDV	$7, R4, R6 // R6 is start pointer+7 | 
|  |  | 
|  | SGTU	R9, R6, R8 | 
|  | BEQ	R8, out1 | 
|  | ADDV	$-8, R5 | 
|  | MOVV	(R5), R7 | 
|  | ADDV	$-8, R9 | 
|  | MOVV	R7, (R9) | 
|  | JMP	-6(PC) | 
|  |  | 
|  | out1: | 
|  | BEQ	R4, R9, done1 | 
|  | ADDV	$-1, R5 | 
|  | MOVB	(R5), R7 | 
|  | ADDV	$-1, R9 | 
|  | MOVB	R7, (R9) | 
|  | JMP	-5(PC) | 
|  | done1: | 
|  | RET |