1 // Copyright 2015 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(*val == old){ 10 // *val = new; 11 // return 1; 12 // } else 13 // return 0; 14 TEXT runtimeinternalatomicCas(SB), NOSPLIT, $0-17 15 MOVD ptr+0(FP), R0 16 MOVW old+8(FP), R1 17 MOVW new+12(FP), R2 18 again: 19 LDAXRW (R0), R3 20 CMPW R1, R3 21 BNE ok 22 STLXRW R2, (R0), R3 23 CBNZ R3, again 24 ok: 25 CSET EQ, R0 26 MOVB R0, ret+16(FP) 27 RET 28 29 TEXT runtimeinternalatomicCasuintptr(SB), NOSPLIT, $0-25 30 B runtimeinternalatomicCas64(SB) 31 32 TEXT runtimeinternalatomicLoaduintptr(SB), NOSPLIT, $-8-16 33 B runtimeinternalatomicLoad64(SB) 34 35 TEXT runtimeinternalatomicLoaduint(SB), NOSPLIT, $-8-16 36 B runtimeinternalatomicLoad64(SB) 37 38 TEXT runtimeinternalatomicStoreuintptr(SB), NOSPLIT, $0-16 39 B runtimeinternalatomicStore64(SB) 40 41 TEXT runtimeinternalatomicXadduintptr(SB), NOSPLIT, $0-24 42 B runtimeinternalatomicXadd64(SB) 43 44 TEXT runtimeinternalatomicLoadint64(SB), NOSPLIT, $0-16 45 B runtimeinternalatomicLoad64(SB) 46 47 TEXT runtimeinternalatomicXaddint64(SB), NOSPLIT, $0-24 48 B runtimeinternalatomicXadd64(SB) 49 50 // bool Casp1(void **val, void *old, void *new) 51 // Atomically: 52 // if(*val == old){ 53 // *val = new; 54 // return 1; 55 // } else 56 // return 0; 57 TEXT runtimeinternalatomicCasp1(SB), NOSPLIT, $0-25 58 B runtimeinternalatomicCas64(SB) 59