github.com/ice-blockchain/go/src@v0.0.0-20240403114104-1564d284e521/runtime/memmove_mipsx.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 //go:build mips || mipsle 6 7 #include "textflag.h" 8 9 #ifdef GOARCH_mips 10 #define MOVWHI MOVWL 11 #define MOVWLO MOVWR 12 #else 13 #define MOVWHI MOVWR 14 #define MOVWLO MOVWL 15 #endif 16 17 // See memmove Go doc for important implementation constraints. 18 19 // func memmove(to, from unsafe.Pointer, n uintptr) 20 TEXT runtime·memmove(SB),NOSPLIT,$-0-12 21 MOVW n+8(FP), R3 22 MOVW from+4(FP), R2 23 MOVW to+0(FP), R1 24 25 ADDU R3, R2, R4 // end pointer for source 26 ADDU R3, R1, R5 // end pointer for destination 27 28 // if destination is ahead of source, start at the end of the buffer and go backward. 29 SGTU R1, R2, R6 30 BNE R6, backward 31 32 // if less than 4 bytes, use byte by byte copying 33 SGTU $4, R3, R6 34 BNE R6, f_small_copy 35 36 // align destination to 4 bytes 37 AND $3, R1, R6 38 BEQ R6, f_dest_aligned 39 SUBU R1, R0, R6 40 AND $3, R6 41 MOVWHI 0(R2), R7 42 SUBU R6, R3 43 MOVWLO 3(R2), R7 44 ADDU R6, R2 45 MOVWHI R7, 0(R1) 46 ADDU R6, R1 47 48 f_dest_aligned: 49 AND $31, R3, R7 50 AND $3, R3, R6 51 SUBU R7, R5, R7 // end pointer for 32-byte chunks 52 SUBU R6, R5, R6 // end pointer for 4-byte chunks 53 54 // if source is not aligned, use unaligned reads 55 AND $3, R2, R8 56 BNE R8, f_large_ua 57 58 f_large: 59 BEQ R1, R7, f_words 60 ADDU $32, R1 61 MOVW 0(R2), R8 62 MOVW 4(R2), R9 63 MOVW 8(R2), R10 64 MOVW 12(R2), R11 65 MOVW 16(R2), R12 66 MOVW 20(R2), R13 67 MOVW 24(R2), R14 68 MOVW 28(R2), R15 69 ADDU $32, R2 70 MOVW R8, -32(R1) 71 MOVW R9, -28(R1) 72 MOVW R10, -24(R1) 73 MOVW R11, -20(R1) 74 MOVW R12, -16(R1) 75 MOVW R13, -12(R1) 76 MOVW R14, -8(R1) 77 MOVW R15, -4(R1) 78 JMP f_large 79 80 f_words: 81 BEQ R1, R6, f_tail 82 ADDU $4, R1 83 MOVW 0(R2), R8 84 ADDU $4, R2 85 MOVW R8, -4(R1) 86 JMP f_words 87 88 f_tail: 89 BEQ R1, R5, ret 90 MOVWLO -1(R4), R8 91 MOVWLO R8, -1(R5) 92 93 ret: 94 RET 95 96 f_large_ua: 97 BEQ R1, R7, f_words_ua 98 ADDU $32, R1 99 MOVWHI 0(R2), R8 100 MOVWHI 4(R2), R9 101 MOVWHI 8(R2), R10 102 MOVWHI 12(R2), R11 103 MOVWHI 16(R2), R12 104 MOVWHI 20(R2), R13 105 MOVWHI 24(R2), R14 106 MOVWHI 28(R2), R15 107 MOVWLO 3(R2), R8 108 MOVWLO 7(R2), R9 109 MOVWLO 11(R2), R10 110 MOVWLO 15(R2), R11 111 MOVWLO 19(R2), R12 112 MOVWLO 23(R2), R13 113 MOVWLO 27(R2), R14 114 MOVWLO 31(R2), R15 115 ADDU $32, R2 116 MOVW R8, -32(R1) 117 MOVW R9, -28(R1) 118 MOVW R10, -24(R1) 119 MOVW R11, -20(R1) 120 MOVW R12, -16(R1) 121 MOVW R13, -12(R1) 122 MOVW R14, -8(R1) 123 MOVW R15, -4(R1) 124 JMP f_large_ua 125 126 f_words_ua: 127 BEQ R1, R6, f_tail_ua 128 MOVWHI 0(R2), R8 129 ADDU $4, R1 130 MOVWLO 3(R2), R8 131 ADDU $4, R2 132 MOVW R8, -4(R1) 133 JMP f_words_ua 134 135 f_tail_ua: 136 BEQ R1, R5, ret 137 MOVWHI -4(R4), R8 138 MOVWLO -1(R4), R8 139 MOVWLO R8, -1(R5) 140 JMP ret 141 142 f_small_copy: 143 BEQ R1, R5, ret 144 ADDU $1, R1 145 MOVB 0(R2), R6 146 ADDU $1, R2 147 MOVB R6, -1(R1) 148 JMP f_small_copy 149 150 backward: 151 SGTU $4, R3, R6 152 BNE R6, b_small_copy 153 154 AND $3, R5, R6 155 BEQ R6, b_dest_aligned 156 MOVWHI -4(R4), R7 157 SUBU R6, R3 158 MOVWLO -1(R4), R7 159 SUBU R6, R4 160 MOVWLO R7, -1(R5) 161 SUBU R6, R5 162 163 b_dest_aligned: 164 AND $31, R3, R7 165 AND $3, R3, R6 166 ADDU R7, R1, R7 167 ADDU R6, R1, R6 168 169 AND $3, R4, R8 170 BNE R8, b_large_ua 171 172 b_large: 173 BEQ R5, R7, b_words 174 ADDU $-32, R5 175 MOVW -4(R4), R8 176 MOVW -8(R4), R9 177 MOVW -12(R4), R10 178 MOVW -16(R4), R11 179 MOVW -20(R4), R12 180 MOVW -24(R4), R13 181 MOVW -28(R4), R14 182 MOVW -32(R4), R15 183 ADDU $-32, R4 184 MOVW R8, 28(R5) 185 MOVW R9, 24(R5) 186 MOVW R10, 20(R5) 187 MOVW R11, 16(R5) 188 MOVW R12, 12(R5) 189 MOVW R13, 8(R5) 190 MOVW R14, 4(R5) 191 MOVW R15, 0(R5) 192 JMP b_large 193 194 b_words: 195 BEQ R5, R6, b_tail 196 ADDU $-4, R5 197 MOVW -4(R4), R8 198 ADDU $-4, R4 199 MOVW R8, 0(R5) 200 JMP b_words 201 202 b_tail: 203 BEQ R5, R1, ret 204 MOVWHI 0(R2), R8 // R2 and R1 have the same alignment so we don't need to load a whole word 205 MOVWHI R8, 0(R1) 206 JMP ret 207 208 b_large_ua: 209 BEQ R5, R7, b_words_ua 210 ADDU $-32, R5 211 MOVWHI -4(R4), R8 212 MOVWHI -8(R4), R9 213 MOVWHI -12(R4), R10 214 MOVWHI -16(R4), R11 215 MOVWHI -20(R4), R12 216 MOVWHI -24(R4), R13 217 MOVWHI -28(R4), R14 218 MOVWHI -32(R4), R15 219 MOVWLO -1(R4), R8 220 MOVWLO -5(R4), R9 221 MOVWLO -9(R4), R10 222 MOVWLO -13(R4), R11 223 MOVWLO -17(R4), R12 224 MOVWLO -21(R4), R13 225 MOVWLO -25(R4), R14 226 MOVWLO -29(R4), R15 227 ADDU $-32, R4 228 MOVW R8, 28(R5) 229 MOVW R9, 24(R5) 230 MOVW R10, 20(R5) 231 MOVW R11, 16(R5) 232 MOVW R12, 12(R5) 233 MOVW R13, 8(R5) 234 MOVW R14, 4(R5) 235 MOVW R15, 0(R5) 236 JMP b_large_ua 237 238 b_words_ua: 239 BEQ R5, R6, b_tail_ua 240 MOVWHI -4(R4), R8 241 ADDU $-4, R5 242 MOVWLO -1(R4), R8 243 ADDU $-4, R4 244 MOVW R8, 0(R5) 245 JMP b_words_ua 246 247 b_tail_ua: 248 BEQ R5, R1, ret 249 MOVWHI (R2), R8 250 MOVWLO 3(R2), R8 251 MOVWHI R8, 0(R1) 252 JMP ret 253 254 b_small_copy: 255 BEQ R5, R1, ret 256 ADDU $-1, R5 257 MOVB -1(R4), R6 258 ADDU $-1, R4 259 MOVB R6, 0(R5) 260 JMP b_small_copy