1// Copyright 2022 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// See memmove Go doc for important implementation constraints. 8 9// func memmove(to, from unsafe.Pointer, n uintptr) 10TEXT runtime·memmove<ABIInternal>(SB), NOSPLIT|NOFRAME, $0-24 11 BNE R6, check 12 RET 13 14check: 15 SGTU R4, R5, R7 16 BNE R7, backward 17 18 ADDV R4, R6, R9 // end pointer 19 20 // if the two pointers are not of same alignments, do byte copying 21 SUBVU R5, R4, R7 22 AND $7, R7 23 BNE R7, out 24 25 // if less than 8 bytes, do byte copying 26 SGTU $8, R6, R7 27 BNE R7, out 28 29 // do one byte at a time until 8-aligned 30 AND $7, R4, R8 31 BEQ R8, words 32 MOVB (R5), R7 33 ADDV $1, R5 34 MOVB R7, (R4) 35 ADDV $1, R4 36 JMP -6(PC) 37 38words: 39 // do 8 bytes at a time if there is room 40 ADDV $-7, R9, R6 // R6 is end pointer-7 41 42 PCALIGN $16 43 SGTU R6, R4, R8 44 BEQ R8, out 45 MOVV (R5), R7 46 ADDV $8, R5 47 MOVV R7, (R4) 48 ADDV $8, R4 49 JMP -6(PC) 50 51out: 52 BEQ R4, R9, done 53 MOVB (R5), R7 54 ADDV $1, R5 55 MOVB R7, (R4) 56 ADDV $1, R4 57 JMP -5(PC) 58done: 59 RET 60 61backward: 62 ADDV R6, R5 // from-end pointer 63 ADDV R4, R6, R9 // to-end pointer 64 65 // if the two pointers are not of same alignments, do byte copying 66 SUBVU R9, R5, R7 67 AND $7, R7 68 BNE R7, out1 69 70 // if less than 8 bytes, do byte copying 71 SGTU $8, R6, R7 72 BNE R7, out1 73 74 // do one byte at a time until 8-aligned 75 AND $7, R9, R8 76 BEQ R8, words1 77 ADDV $-1, R5 78 MOVB (R5), R7 79 ADDV $-1, R9 80 MOVB R7, (R9) 81 JMP -6(PC) 82 83words1: 84 // do 8 bytes at a time if there is room 85 ADDV $7, R4, R6 // R6 is start pointer+7 86 87 PCALIGN $16 88 SGTU R9, R6, R8 89 BEQ R8, out1 90 ADDV $-8, R5 91 MOVV (R5), R7 92 ADDV $-8, R9 93 MOVV R7, (R9) 94 JMP -6(PC) 95 96out1: 97 BEQ R4, R9, done1 98 ADDV $-1, R5 99 MOVB (R5), R7 100 ADDV $-1, R9 101 MOVB R7, (R9) 102 JMP -5(PC) 103done1: 104 RET 105