aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/internal
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/internal')
-rw-r--r--src/runtime/internal/atomic/asm_ppc64x.s69
1 files changed, 16 insertions, 53 deletions
diff --git a/src/runtime/internal/atomic/asm_ppc64x.s b/src/runtime/internal/atomic/asm_ppc64x.s
index 4a776787a2..a928e400d2 100644
--- a/src/runtime/internal/atomic/asm_ppc64x.s
+++ b/src/runtime/internal/atomic/asm_ppc64x.s
@@ -17,21 +17,20 @@ TEXT runtime∕internal∕atomic·Cas(SB), NOSPLIT, $0-17
MOVD ptr+0(FP), R3
MOVWZ old+8(FP), R4
MOVWZ new+12(FP), R5
-cas_again:
SYNC
+cas_again:
LWAR (R3), R6
CMPW R6, R4
BNE cas_fail
STWCCC R5, (R3)
BNE cas_again
MOVD $1, R3
- SYNC
ISYNC
MOVB R3, ret+16(FP)
RET
cas_fail:
- MOVD $0, R3
- BR -5(PC)
+ MOVB R0, ret+16(FP)
+ RET
// bool runtime∕internal∕atomic·Cas64(uint64 *ptr, uint64 old, uint64 new)
// Atomically:
@@ -45,21 +44,20 @@ TEXT runtime∕internal∕atomic·Cas64(SB), NOSPLIT, $0-25
MOVD ptr+0(FP), R3
MOVD old+8(FP), R4
MOVD new+16(FP), R5
-cas64_again:
SYNC
+cas64_again:
LDAR (R3), R6
CMP R6, R4
BNE cas64_fail
STDCCC R5, (R3)
BNE cas64_again
MOVD $1, R3
- SYNC
ISYNC
MOVB R3, ret+24(FP)
RET
cas64_fail:
- MOVD $0, R3
- BR -5(PC)
+ MOVB R0, ret+24(FP)
+ RET
TEXT runtime∕internal∕atomic·Casuintptr(SB), NOSPLIT, $0-25
BR runtime∕internal∕atomic·Cas64(SB)
@@ -103,8 +101,7 @@ TEXT runtime∕internal∕atomic·Xadd(SB), NOSPLIT, $0-20
LWAR (R4), R3
ADD R5, R3
STWCCC R3, (R4)
- BNE -4(PC)
- SYNC
+ BNE -3(PC)
ISYNC
MOVW R3, ret+16(FP)
RET
@@ -116,8 +113,7 @@ TEXT runtime∕internal∕atomic·Xadd64(SB), NOSPLIT, $0-24
LDAR (R4), R3
ADD R5, R3
STDCCC R3, (R4)
- BNE -4(PC)
- SYNC
+ BNE -3(PC)
ISYNC
MOVD R3, ret+16(FP)
RET
@@ -128,8 +124,7 @@ TEXT runtime∕internal∕atomic·Xchg(SB), NOSPLIT, $0-20
SYNC
LWAR (R4), R3
STWCCC R5, (R4)
- BNE -3(PC)
- SYNC
+ BNE -2(PC)
ISYNC
MOVW R3, ret+16(FP)
RET
@@ -140,8 +135,7 @@ TEXT runtime∕internal∕atomic·Xchg64(SB), NOSPLIT, $0-24
SYNC
LDAR (R4), R3
STDCCC R5, (R4)
- BNE -3(PC)
- SYNC
+ BNE -2(PC)
ISYNC
MOVD R3, ret+16(FP)
RET
@@ -171,26 +165,12 @@ TEXT runtime∕internal∕atomic·Store64(SB), NOSPLIT, $0-16
TEXT runtime∕internal∕atomic·Or8(SB), NOSPLIT, $0-9
MOVD ptr+0(FP), R3
MOVBZ val+8(FP), R4
- // Align ptr down to 4 bytes so we can use 32-bit load/store.
- // R5 = (R3 << 0) & ~3
- RLDCR $0, R3, $~3, R5
- // Compute val shift.
-#ifdef GOARCH_ppc64
- // Big endian. ptr = ptr ^ 3
- XOR $3, R3
-#endif
- // R6 = ((ptr & 3) * 8) = (ptr << 3) & (3*8)
- RLDC $3, R3, $(3*8), R6
- // Shift val for aligned ptr. R4 = val << R6
- SLD R6, R4, R4
-
-again:
SYNC
- LWAR (R5), R6
+again:
+ LBAR (R3), R6
OR R4, R6
- STWCCC R6, (R5)
+ STBCCC R6, (R3)
BNE again
- SYNC
ISYNC
RET
@@ -198,28 +178,11 @@ again:
TEXT runtime∕internal∕atomic·And8(SB), NOSPLIT, $0-9
MOVD ptr+0(FP), R3
MOVBZ val+8(FP), R4
- // Align ptr down to 4 bytes so we can use 32-bit load/store.
- // R5 = (R3 << 0) & ~3
- RLDCR $0, R3, $~3, R5
- // Compute val shift.
-#ifdef GOARCH_ppc64
- // Big endian. ptr = ptr ^ 3
- XOR $3, R3
-#endif
- // R6 = ((ptr & 3) * 8) = (ptr << 3) & (3*8)
- RLDC $3, R3, $(3*8), R6
- // Shift val for aligned ptr. R4 = val << R6 | ^(0xFF << R6)
- MOVD $0xFF, R7
- SLD R6, R4
- SLD R6, R7
- XOR $-1, R7
- OR R7, R4
-again:
SYNC
- LWAR (R5), R6
+again:
+ LBAR (R3), R6
AND R4, R6
- STWCCC R6, (R5)
+ STBCCC R6, (R3)
BNE again
- SYNC
ISYNC
RET