github.com/geraldss/go/src@v0.0.0-20210511222824-ac7d0ebfc235/runtime/memmove_riscv64.s (about) 1 // Copyright 2016 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 // void runtime·memmove(void*, void*, uintptr) 10 TEXT runtime·memmove(SB),NOSPLIT,$-0-24 11 MOV to+0(FP), T0 12 MOV from+8(FP), T1 13 MOV n+16(FP), T2 14 ADD T1, T2, T5 15 16 // If the destination is ahead of the source, start at the end of the 17 // buffer and go backward. 18 BLTU T1, T0, b 19 20 // If less than eight bytes, do one byte at a time. 21 SLTU $8, T2, T3 22 BNE T3, ZERO, f_outcheck 23 24 // Do one byte at a time until from is eight-aligned. 25 JMP f_aligncheck 26 f_align: 27 MOVB (T1), T3 28 MOVB T3, (T0) 29 ADD $1, T0 30 ADD $1, T1 31 f_aligncheck: 32 AND $7, T1, T3 33 BNE T3, ZERO, f_align 34 35 // Do eight bytes at a time as long as there is room. 36 ADD $-7, T5, T6 37 JMP f_wordscheck 38 f_words: 39 MOV (T1), T3 40 MOV T3, (T0) 41 ADD $8, T0 42 ADD $8, T1 43 f_wordscheck: 44 SLTU T6, T1, T3 45 BNE T3, ZERO, f_words 46 47 // Finish off the remaining partial word. 48 JMP f_outcheck 49 f_out: 50 MOVB (T1), T3 51 MOVB T3, (T0) 52 ADD $1, T0 53 ADD $1, T1 54 f_outcheck: 55 BNE T1, T5, f_out 56 57 RET 58 59 b: 60 ADD T0, T2, T4 61 // If less than eight bytes, do one byte at a time. 62 SLTU $8, T2, T3 63 BNE T3, ZERO, b_outcheck 64 65 // Do one byte at a time until from+n is eight-aligned. 66 JMP b_aligncheck 67 b_align: 68 ADD $-1, T4 69 ADD $-1, T5 70 MOVB (T5), T3 71 MOVB T3, (T4) 72 b_aligncheck: 73 AND $7, T5, T3 74 BNE T3, ZERO, b_align 75 76 // Do eight bytes at a time as long as there is room. 77 ADD $7, T1, T6 78 JMP b_wordscheck 79 b_words: 80 ADD $-8, T4 81 ADD $-8, T5 82 MOV (T5), T3 83 MOV T3, (T4) 84 b_wordscheck: 85 SLTU T5, T6, T3 86 BNE T3, ZERO, b_words 87 88 // Finish off the remaining partial word. 89 JMP b_outcheck 90 b_out: 91 ADD $-1, T4 92 ADD $-1, T5 93 MOVB (T5), T3 94 MOVB T3, (T4) 95 b_outcheck: 96 BNE T5, T1, b_out 97 98 RET