github.com/ice-blockchain/go/src@v0.0.0-20240403114104-1564d284e521/runtime/internal/atomic/atomic_loong64.s (about) 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 // bool cas(uint32 *ptr, uint32 old, uint32 new) 8 // Atomically: 9 // if(*ptr == old){ 10 // *ptr = new; 11 // return 1; 12 // } else 13 // return 0; 14 TEXT ·Cas(SB), NOSPLIT, $0-17 15 MOVV ptr+0(FP), R4 16 MOVW old+8(FP), R5 17 MOVW new+12(FP), R6 18 DBAR 19 cas_again: 20 MOVV R6, R7 21 LL (R4), R8 22 BNE R5, R8, cas_fail 23 SC R7, (R4) 24 BEQ R7, cas_again 25 MOVV $1, R4 26 MOVB R4, ret+16(FP) 27 DBAR 28 RET 29 cas_fail: 30 MOVV $0, R4 31 JMP -4(PC) 32 33 // bool cas64(uint64 *ptr, uint64 old, uint64 new) 34 // Atomically: 35 // if(*ptr == old){ 36 // *ptr = new; 37 // return 1; 38 // } else { 39 // return 0; 40 // } 41 TEXT ·Cas64(SB), NOSPLIT, $0-25 42 MOVV ptr+0(FP), R4 43 MOVV old+8(FP), R5 44 MOVV new+16(FP), R6 45 DBAR 46 cas64_again: 47 MOVV R6, R7 48 LLV (R4), R8 49 BNE R5, R8, cas64_fail 50 SCV R7, (R4) 51 BEQ R7, cas64_again 52 MOVV $1, R4 53 MOVB R4, ret+24(FP) 54 DBAR 55 RET 56 cas64_fail: 57 MOVV $0, R4 58 JMP -4(PC) 59 60 TEXT ·Casuintptr(SB), NOSPLIT, $0-25 61 JMP ·Cas64(SB) 62 63 TEXT ·CasRel(SB), NOSPLIT, $0-17 64 JMP ·Cas(SB) 65 66 TEXT ·Loaduintptr(SB), NOSPLIT|NOFRAME, $0-16 67 JMP ·Load64(SB) 68 69 TEXT ·Loaduint(SB), NOSPLIT|NOFRAME, $0-16 70 JMP ·Load64(SB) 71 72 TEXT ·Storeuintptr(SB), NOSPLIT, $0-16 73 JMP ·Store64(SB) 74 75 TEXT ·Xadduintptr(SB), NOSPLIT, $0-24 76 JMP ·Xadd64(SB) 77 78 TEXT ·Loadint64(SB), NOSPLIT, $0-16 79 JMP ·Load64(SB) 80 81 TEXT ·Xaddint64(SB), NOSPLIT, $0-24 82 JMP ·Xadd64(SB) 83 84 // bool casp(void **val, void *old, void *new) 85 // Atomically: 86 // if(*val == old){ 87 // *val = new; 88 // return 1; 89 // } else 90 // return 0; 91 TEXT ·Casp1(SB), NOSPLIT, $0-25 92 JMP ·Cas64(SB) 93 94 // uint32 xadd(uint32 volatile *ptr, int32 delta) 95 // Atomically: 96 // *val += delta; 97 // return *val; 98 TEXT ·Xadd(SB), NOSPLIT, $0-20 99 MOVV ptr+0(FP), R4 100 MOVW delta+8(FP), R5 101 DBAR 102 LL (R4), R6 103 ADDU R6, R5, R7 104 MOVV R7, R6 105 SC R7, (R4) 106 BEQ R7, -4(PC) 107 MOVW R6, ret+16(FP) 108 DBAR 109 RET 110 111 TEXT ·Xadd64(SB), NOSPLIT, $0-24 112 MOVV ptr+0(FP), R4 113 MOVV delta+8(FP), R5 114 DBAR 115 LLV (R4), R6 116 ADDVU R6, R5, R7 117 MOVV R7, R6 118 SCV R7, (R4) 119 BEQ R7, -4(PC) 120 MOVV R6, ret+16(FP) 121 DBAR 122 RET 123 124 TEXT ·Xchg(SB), NOSPLIT, $0-20 125 MOVV ptr+0(FP), R4 126 MOVW new+8(FP), R5 127 128 DBAR 129 MOVV R5, R6 130 LL (R4), R7 131 SC R6, (R4) 132 BEQ R6, -3(PC) 133 MOVW R7, ret+16(FP) 134 DBAR 135 RET 136 137 TEXT ·Xchg64(SB), NOSPLIT, $0-24 138 MOVV ptr+0(FP), R4 139 MOVV new+8(FP), R5 140 141 DBAR 142 MOVV R5, R6 143 LLV (R4), R7 144 SCV R6, (R4) 145 BEQ R6, -3(PC) 146 MOVV R7, ret+16(FP) 147 DBAR 148 RET 149 150 TEXT ·Xchguintptr(SB), NOSPLIT, $0-24 151 JMP ·Xchg64(SB) 152 153 TEXT ·StorepNoWB(SB), NOSPLIT, $0-16 154 JMP ·Store64(SB) 155 156 TEXT ·StoreRel(SB), NOSPLIT, $0-12 157 JMP ·Store(SB) 158 159 TEXT ·StoreRel64(SB), NOSPLIT, $0-16 160 JMP ·Store64(SB) 161 162 TEXT ·StoreReluintptr(SB), NOSPLIT, $0-16 163 JMP ·Store64(SB) 164 165 TEXT ·Store(SB), NOSPLIT, $0-12 166 MOVV ptr+0(FP), R4 167 MOVW val+8(FP), R5 168 DBAR 169 MOVW R5, 0(R4) 170 DBAR 171 RET 172 173 TEXT ·Store8(SB), NOSPLIT, $0-9 174 MOVV ptr+0(FP), R4 175 MOVB val+8(FP), R5 176 DBAR 177 MOVB R5, 0(R4) 178 DBAR 179 RET 180 181 TEXT ·Store64(SB), NOSPLIT, $0-16 182 MOVV ptr+0(FP), R4 183 MOVV val+8(FP), R5 184 DBAR 185 MOVV R5, 0(R4) 186 DBAR 187 RET 188 189 // void Or8(byte volatile*, byte); 190 TEXT ·Or8(SB), NOSPLIT, $0-9 191 MOVV ptr+0(FP), R4 192 MOVBU val+8(FP), R5 193 // Align ptr down to 4 bytes so we can use 32-bit load/store. 194 MOVV $~3, R6 195 AND R4, R6 196 // R7 = ((ptr & 3) * 8) 197 AND $3, R4, R7 198 SLLV $3, R7 199 // Shift val for aligned ptr. R5 = val << R4 200 SLLV R7, R5 201 202 DBAR 203 LL (R6), R7 204 OR R5, R7 205 SC R7, (R6) 206 BEQ R7, -4(PC) 207 DBAR 208 RET 209 210 // void And8(byte volatile*, byte); 211 TEXT ·And8(SB), NOSPLIT, $0-9 212 MOVV ptr+0(FP), R4 213 MOVBU val+8(FP), R5 214 // Align ptr down to 4 bytes so we can use 32-bit load/store. 215 MOVV $~3, R6 216 AND R4, R6 217 // R7 = ((ptr & 3) * 8) 218 AND $3, R4, R7 219 SLLV $3, R7 220 // Shift val for aligned ptr. R5 = val << R7 | ^(0xFF << R7) 221 MOVV $0xFF, R8 222 SLLV R7, R5 223 SLLV R7, R8 224 NOR R0, R8 225 OR R8, R5 226 227 DBAR 228 LL (R6), R7 229 AND R5, R7 230 SC R7, (R6) 231 BEQ R7, -4(PC) 232 DBAR 233 RET 234 235 // func Or(addr *uint32, v uint32) 236 TEXT ·Or(SB), NOSPLIT, $0-12 237 MOVV ptr+0(FP), R4 238 MOVW val+8(FP), R5 239 DBAR 240 LL (R4), R6 241 OR R5, R6 242 SC R6, (R4) 243 BEQ R6, -4(PC) 244 DBAR 245 RET 246 247 // func And(addr *uint32, v uint32) 248 TEXT ·And(SB), NOSPLIT, $0-12 249 MOVV ptr+0(FP), R4 250 MOVW val+8(FP), R5 251 DBAR 252 LL (R4), R6 253 AND R5, R6 254 SC R6, (R4) 255 BEQ R6, -4(PC) 256 DBAR 257 RET 258 259 // func Or32(addr *uint32, v uint32) old uint32 260 TEXT ·Or32(SB), NOSPLIT, $0-20 261 MOVV ptr+0(FP), R4 262 MOVW val+8(FP), R5 263 DBAR 264 LL (R4), R6 265 OR R5, R6, R7 266 SC R7, (R4) 267 BEQ R7, -4(PC) 268 DBAR 269 MOVW R6, ret+16(FP) 270 RET 271 272 // func And32(addr *uint32, v uint32) old uint32 273 TEXT ·And32(SB), NOSPLIT, $0-20 274 MOVV ptr+0(FP), R4 275 MOVW val+8(FP), R5 276 DBAR 277 LL (R4), R6 278 AND R5, R6, R7 279 SC R7, (R4) 280 BEQ R7, -4(PC) 281 DBAR 282 MOVW R6, ret+16(FP) 283 RET 284 285 // func Or64(addr *uint64, v uint64) old uint64 286 TEXT ·Or64(SB), NOSPLIT, $0-24 287 MOVV ptr+0(FP), R4 288 MOVV val+8(FP), R5 289 DBAR 290 LLV (R4), R6 291 OR R5, R6, R7 292 SCV R7, (R4) 293 BEQ R7, -4(PC) 294 DBAR 295 MOVV R6, ret+16(FP) 296 RET 297 298 // func And64(addr *uint64, v uint64) old uint64 299 TEXT ·And64(SB), NOSPLIT, $0-24 300 MOVV ptr+0(FP), R4 301 MOVV val+8(FP), R5 302 DBAR 303 LLV (R4), R6 304 AND R5, R6, R7 305 SCV R7, (R4) 306 BEQ R7, -4(PC) 307 DBAR 308 MOVV R6, ret+16(FP) 309 RET 310 311 // func Anduintptr(addr *uintptr, v uintptr) old uintptr 312 TEXT ·Anduintptr(SB), NOSPLIT, $0-24 313 JMP ·And64(SB) 314 315 // func Oruintptr(addr *uintptr, v uintptr) old uintptr 316 TEXT ·Oruintptr(SB), NOSPLIT, $0-24 317 JMP ·Or64(SB) 318 319 // uint32 runtime∕internal∕atomic·Load(uint32 volatile* ptr) 320 TEXT ·Load(SB),NOSPLIT|NOFRAME,$0-12 321 MOVV ptr+0(FP), R19 322 DBAR 323 MOVWU 0(R19), R19 324 DBAR 325 MOVW R19, ret+8(FP) 326 RET 327 328 // uint8 runtime∕internal∕atomic·Load8(uint8 volatile* ptr) 329 TEXT ·Load8(SB),NOSPLIT|NOFRAME,$0-9 330 MOVV ptr+0(FP), R19 331 DBAR 332 MOVBU 0(R19), R19 333 DBAR 334 MOVB R19, ret+8(FP) 335 RET 336 337 // uint64 runtime∕internal∕atomic·Load64(uint64 volatile* ptr) 338 TEXT ·Load64(SB),NOSPLIT|NOFRAME,$0-16 339 MOVV ptr+0(FP), R19 340 DBAR 341 MOVV 0(R19), R19 342 DBAR 343 MOVV R19, ret+8(FP) 344 RET 345 346 // void *runtime∕internal∕atomic·Loadp(void *volatile *ptr) 347 TEXT ·Loadp(SB),NOSPLIT|NOFRAME,$0-16 348 MOVV ptr+0(FP), R19 349 DBAR 350 MOVV 0(R19), R19 351 DBAR 352 MOVV R19, ret+8(FP) 353 RET 354 355 // uint32 runtime∕internal∕atomic·LoadAcq(uint32 volatile* ptr) 356 TEXT ·LoadAcq(SB),NOSPLIT|NOFRAME,$0-12 357 JMP ·Load(SB) 358 359 // uint64 ·LoadAcq64(uint64 volatile* ptr) 360 TEXT ·LoadAcq64(SB),NOSPLIT|NOFRAME,$0-16 361 JMP ·Load64(SB) 362 363 // uintptr ·LoadAcquintptr(uintptr volatile* ptr) 364 TEXT ·LoadAcquintptr(SB),NOSPLIT|NOFRAME,$0-16 365 JMP ·Load64(SB) 366