github.com/zxy12/go_duplicate_112_new@v0.0.0-20200807091221-747231827200/src/runtime/internal/atomic/asm_ppc64x.s (about) 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 // +build ppc64 ppc64le 6 7 #include "textflag.h" 8 9 // bool cas(uint32 *ptr, uint32 old, uint32 new) 10 // Atomically: 11 // if(*val == old){ 12 // *val = new; 13 // return 1; 14 // } else 15 // return 0; 16 TEXT runtime∕internal∕atomic·Cas(SB), NOSPLIT, $0-17 17 MOVD ptr+0(FP), R3 18 MOVWZ old+8(FP), R4 19 MOVWZ new+12(FP), R5 20 LWSYNC 21 cas_again: 22 LWAR (R3), R6 23 CMPW R6, R4 24 BNE cas_fail 25 STWCCC R5, (R3) 26 BNE cas_again 27 MOVD $1, R3 28 LWSYNC 29 MOVB R3, ret+16(FP) 30 RET 31 cas_fail: 32 MOVB R0, ret+16(FP) 33 RET 34 35 // bool runtime∕internal∕atomic·Cas64(uint64 *ptr, uint64 old, uint64 new) 36 // Atomically: 37 // if(*val == *old){ 38 // *val = new; 39 // return 1; 40 // } else { 41 // return 0; 42 // } 43 TEXT runtime∕internal∕atomic·Cas64(SB), NOSPLIT, $0-25 44 MOVD ptr+0(FP), R3 45 MOVD old+8(FP), R4 46 MOVD new+16(FP), R5 47 LWSYNC 48 cas64_again: 49 LDAR (R3), R6 50 CMP R6, R4 51 BNE cas64_fail 52 STDCCC R5, (R3) 53 BNE cas64_again 54 MOVD $1, R3 55 LWSYNC 56 MOVB R3, ret+24(FP) 57 RET 58 cas64_fail: 59 MOVB R0, ret+24(FP) 60 RET 61 62 TEXT runtime∕internal∕atomic·CasRel(SB), NOSPLIT, $0-17 63 MOVD ptr+0(FP), R3 64 MOVWZ old+8(FP), R4 65 MOVWZ new+12(FP), R5 66 LWSYNC 67 cas_again: 68 LWAR (R3), $0, R6 // 0 = Mutex release hint 69 CMPW R6, R4 70 BNE cas_fail 71 STWCCC R5, (R3) 72 BNE cas_again 73 MOVD $1, R3 74 MOVB R3, ret+16(FP) 75 RET 76 cas_fail: 77 MOVB R0, ret+16(FP) 78 RET 79 80 TEXT runtime∕internal∕atomic·Casuintptr(SB), NOSPLIT, $0-25 81 BR runtime∕internal∕atomic·Cas64(SB) 82 83 TEXT runtime∕internal∕atomic·Loaduintptr(SB), NOSPLIT|NOFRAME, $0-16 84 BR runtime∕internal∕atomic·Load64(SB) 85 86 TEXT runtime∕internal∕atomic·Loaduint(SB), NOSPLIT|NOFRAME, $0-16 87 BR runtime∕internal∕atomic·Load64(SB) 88 89 TEXT runtime∕internal∕atomic·Storeuintptr(SB), NOSPLIT, $0-16 90 BR runtime∕internal∕atomic·Store64(SB) 91 92 TEXT runtime∕internal∕atomic·Xadduintptr(SB), NOSPLIT, $0-24 93 BR runtime∕internal∕atomic·Xadd64(SB) 94 95 TEXT runtime∕internal∕atomic·Loadint64(SB), NOSPLIT, $0-16 96 BR runtime∕internal∕atomic·Load64(SB) 97 98 TEXT runtime∕internal∕atomic·Xaddint64(SB), NOSPLIT, $0-24 99 BR runtime∕internal∕atomic·Xadd64(SB) 100 101 // bool casp(void **val, void *old, void *new) 102 // Atomically: 103 // if(*val == old){ 104 // *val = new; 105 // return 1; 106 // } else 107 // return 0; 108 TEXT runtime∕internal∕atomic·Casp1(SB), NOSPLIT, $0-25 109 BR runtime∕internal∕atomic·Cas64(SB) 110 111 // uint32 xadd(uint32 volatile *ptr, int32 delta) 112 // Atomically: 113 // *val += delta; 114 // return *val; 115 TEXT runtime∕internal∕atomic·Xadd(SB), NOSPLIT, $0-20 116 MOVD ptr+0(FP), R4 117 MOVW delta+8(FP), R5 118 LWSYNC 119 LWAR (R4), R3 120 ADD R5, R3 121 STWCCC R3, (R4) 122 BNE -3(PC) 123 MOVW R3, ret+16(FP) 124 RET 125 126 TEXT runtime∕internal∕atomic·Xadd64(SB), NOSPLIT, $0-24 127 MOVD ptr+0(FP), R4 128 MOVD delta+8(FP), R5 129 LWSYNC 130 LDAR (R4), R3 131 ADD R5, R3 132 STDCCC R3, (R4) 133 BNE -3(PC) 134 MOVD R3, ret+16(FP) 135 RET 136 137 TEXT runtime∕internal∕atomic·Xchg(SB), NOSPLIT, $0-20 138 MOVD ptr+0(FP), R4 139 MOVW new+8(FP), R5 140 LWSYNC 141 LWAR (R4), R3 142 STWCCC R5, (R4) 143 BNE -2(PC) 144 ISYNC 145 MOVW R3, ret+16(FP) 146 RET 147 148 TEXT runtime∕internal∕atomic·Xchg64(SB), NOSPLIT, $0-24 149 MOVD ptr+0(FP), R4 150 MOVD new+8(FP), R5 151 LWSYNC 152 LDAR (R4), R3 153 STDCCC R5, (R4) 154 BNE -2(PC) 155 ISYNC 156 MOVD R3, ret+16(FP) 157 RET 158 159 TEXT runtime∕internal∕atomic·Xchguintptr(SB), NOSPLIT, $0-24 160 BR runtime∕internal∕atomic·Xchg64(SB) 161 162 163 TEXT runtime∕internal∕atomic·StorepNoWB(SB), NOSPLIT, $0-16 164 BR runtime∕internal∕atomic·Store64(SB) 165 166 TEXT runtime∕internal∕atomic·Store(SB), NOSPLIT, $0-12 167 MOVD ptr+0(FP), R3 168 MOVW val+8(FP), R4 169 SYNC 170 MOVW R4, 0(R3) 171 RET 172 173 TEXT runtime∕internal∕atomic·Store64(SB), NOSPLIT, $0-16 174 MOVD ptr+0(FP), R3 175 MOVD val+8(FP), R4 176 SYNC 177 MOVD R4, 0(R3) 178 RET 179 180 TEXT runtime∕internal∕atomic·StoreRel(SB), NOSPLIT, $0-12 181 MOVD ptr+0(FP), R3 182 MOVW val+8(FP), R4 183 LWSYNC 184 MOVW R4, 0(R3) 185 RET 186 187 // void runtime∕internal∕atomic·Or8(byte volatile*, byte); 188 TEXT runtime∕internal∕atomic·Or8(SB), NOSPLIT, $0-9 189 MOVD ptr+0(FP), R3 190 MOVBZ val+8(FP), R4 191 LWSYNC 192 again: 193 LBAR (R3), R6 194 OR R4, R6 195 STBCCC R6, (R3) 196 BNE again 197 RET 198 199 // void runtime∕internal∕atomic·And8(byte volatile*, byte); 200 TEXT runtime∕internal∕atomic·And8(SB), NOSPLIT, $0-9 201 MOVD ptr+0(FP), R3 202 MOVBZ val+8(FP), R4 203 LWSYNC 204 again: 205 LBAR (R3),R6 206 AND R4,R6 207 STBCCC R6,(R3) 208 BNE again 209 RET