github.com/zebozhuang/go@v0.0.0-20200207033046-f8a98f6f5c5d/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 SYNC 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 ISYNC 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 SYNC 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 ISYNC 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·Casuintptr(SB), NOSPLIT, $0-25 63 BR runtime∕internal∕atomic·Cas64(SB) 64 65 TEXT runtime∕internal∕atomic·Loaduintptr(SB), NOSPLIT|NOFRAME, $0-16 66 BR runtime∕internal∕atomic·Load64(SB) 67 68 TEXT runtime∕internal∕atomic·Loaduint(SB), NOSPLIT|NOFRAME, $0-16 69 BR runtime∕internal∕atomic·Load64(SB) 70 71 TEXT runtime∕internal∕atomic·Storeuintptr(SB), NOSPLIT, $0-16 72 BR runtime∕internal∕atomic·Store64(SB) 73 74 TEXT runtime∕internal∕atomic·Xadduintptr(SB), NOSPLIT, $0-24 75 BR runtime∕internal∕atomic·Xadd64(SB) 76 77 TEXT runtime∕internal∕atomic·Loadint64(SB), NOSPLIT, $0-16 78 BR runtime∕internal∕atomic·Load64(SB) 79 80 TEXT runtime∕internal∕atomic·Xaddint64(SB), NOSPLIT, $0-24 81 BR runtime∕internal∕atomic·Xadd64(SB) 82 83 // bool casp(void **val, void *old, void *new) 84 // Atomically: 85 // if(*val == old){ 86 // *val = new; 87 // return 1; 88 // } else 89 // return 0; 90 TEXT runtime∕internal∕atomic·Casp1(SB), NOSPLIT, $0-25 91 BR runtime∕internal∕atomic·Cas64(SB) 92 93 // uint32 xadd(uint32 volatile *ptr, int32 delta) 94 // Atomically: 95 // *val += delta; 96 // return *val; 97 TEXT runtime∕internal∕atomic·Xadd(SB), NOSPLIT, $0-20 98 MOVD ptr+0(FP), R4 99 MOVW delta+8(FP), R5 100 SYNC 101 LWAR (R4), R3 102 ADD R5, R3 103 STWCCC R3, (R4) 104 BNE -3(PC) 105 ISYNC 106 MOVW R3, ret+16(FP) 107 RET 108 109 TEXT runtime∕internal∕atomic·Xadd64(SB), NOSPLIT, $0-24 110 MOVD ptr+0(FP), R4 111 MOVD delta+8(FP), R5 112 SYNC 113 LDAR (R4), R3 114 ADD R5, R3 115 STDCCC R3, (R4) 116 BNE -3(PC) 117 ISYNC 118 MOVD R3, ret+16(FP) 119 RET 120 121 TEXT runtime∕internal∕atomic·Xchg(SB), NOSPLIT, $0-20 122 MOVD ptr+0(FP), R4 123 MOVW new+8(FP), R5 124 SYNC 125 LWAR (R4), R3 126 STWCCC R5, (R4) 127 BNE -2(PC) 128 ISYNC 129 MOVW R3, ret+16(FP) 130 RET 131 132 TEXT runtime∕internal∕atomic·Xchg64(SB), NOSPLIT, $0-24 133 MOVD ptr+0(FP), R4 134 MOVD new+8(FP), R5 135 SYNC 136 LDAR (R4), R3 137 STDCCC R5, (R4) 138 BNE -2(PC) 139 ISYNC 140 MOVD R3, ret+16(FP) 141 RET 142 143 TEXT runtime∕internal∕atomic·Xchguintptr(SB), NOSPLIT, $0-24 144 BR runtime∕internal∕atomic·Xchg64(SB) 145 146 147 TEXT runtime∕internal∕atomic·StorepNoWB(SB), NOSPLIT, $0-16 148 BR runtime∕internal∕atomic·Store64(SB) 149 150 TEXT runtime∕internal∕atomic·Store(SB), NOSPLIT, $0-12 151 MOVD ptr+0(FP), R3 152 MOVW val+8(FP), R4 153 SYNC 154 MOVW R4, 0(R3) 155 RET 156 157 TEXT runtime∕internal∕atomic·Store64(SB), NOSPLIT, $0-16 158 MOVD ptr+0(FP), R3 159 MOVD val+8(FP), R4 160 SYNC 161 MOVD R4, 0(R3) 162 RET 163 164 // void runtime∕internal∕atomic·Or8(byte volatile*, byte); 165 TEXT runtime∕internal∕atomic·Or8(SB), NOSPLIT, $0-9 166 MOVD ptr+0(FP), R3 167 MOVBZ val+8(FP), R4 168 SYNC 169 again: 170 LBAR (R3), R6 171 OR R4, R6 172 STBCCC R6, (R3) 173 BNE again 174 ISYNC 175 RET 176 177 // void runtime∕internal∕atomic·And8(byte volatile*, byte); 178 TEXT runtime∕internal∕atomic·And8(SB), NOSPLIT, $0-9 179 MOVD ptr+0(FP), R3 180 MOVBZ val+8(FP), R4 181 SYNC 182 again: 183 LBAR (R3),R6 184 AND R4,R6 185 STBCCC R6,(R3) 186 BNE again 187 ISYNC 188 RET