diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/cmd/internal/obj/ppc64/a.out.go | 3 | ||||
| -rw-r--r-- | src/cmd/internal/obj/ppc64/anames.go | 3 | ||||
| -rw-r--r-- | src/cmd/internal/obj/ppc64/asm9.go | 10 | ||||
| -rw-r--r-- | src/cmd/internal/obj/ppc64/obj9.go | 3 | ||||
| -rw-r--r-- | src/runtime/atomic_ppc64x.s | 2 | ||||
| -rw-r--r-- | src/runtime/internal/atomic/asm_ppc64x.s | 69 | ||||
| -rw-r--r-- | src/sync/atomic/asm_ppc64x.s | 22 |
7 files changed, 44 insertions, 68 deletions
diff --git a/src/cmd/internal/obj/ppc64/a.out.go b/src/cmd/internal/obj/ppc64/a.out.go index 8cc984260e..8e58c59238 100644 --- a/src/cmd/internal/obj/ppc64/a.out.go +++ b/src/cmd/internal/obj/ppc64/a.out.go @@ -342,8 +342,10 @@ const ( AFSUBS AFSUBSCC AMOVMW + ALBAR ALSW ALWAR + ALWSYNC AMOVWBR AMOVB AMOVBU @@ -401,6 +403,7 @@ const ( ASRAW ASRAWCC ASRWCC + ASTBCCC ASTSW ASTWCCC ASUB diff --git a/src/cmd/internal/obj/ppc64/anames.go b/src/cmd/internal/obj/ppc64/anames.go index 868700f012..eb42c9a953 100644 --- a/src/cmd/internal/obj/ppc64/anames.go +++ b/src/cmd/internal/obj/ppc64/anames.go @@ -118,8 +118,10 @@ var Anames = []string{ "FSUBS", "FSUBSCC", "MOVMW", + "LBAR", "LSW", "LWAR", + "LWSYNC", "MOVWBR", "MOVB", "MOVBU", @@ -177,6 +179,7 @@ var Anames = []string{ "SRAW", "SRAWCC", "SRWCC", + "STBCCC", "STSW", "STWCCC", "SUB", diff --git a/src/cmd/internal/obj/ppc64/asm9.go b/src/cmd/internal/obj/ppc64/asm9.go index e847ec341f..5366809d2f 100644 --- a/src/cmd/internal/obj/ppc64/asm9.go +++ b/src/cmd/internal/obj/ppc64/asm9.go @@ -933,6 +933,7 @@ func buildop(ctxt *obj.Link) { case AECOWX: /* indexed store: op s,(b+a); op s,(b) */ opset(ASTWCCC, r0) + opset(ASTBCCC, r0) opset(ASTDCCC, r0) @@ -1202,6 +1203,7 @@ func buildop(ctxt *obj.Link) { case ASYNC: opset(AISYNC, r0) + opset(ALWSYNC, r0) opset(APTESYNC, r0) opset(ATLBSYNC, r0) @@ -1228,6 +1230,7 @@ func buildop(ctxt *obj.Link) { opset(AFMOVSU, r0) case AECIWX: + opset(ALBAR, r0) opset(ALWAR, r0) opset(ALDAR, r0) @@ -3001,6 +3004,9 @@ func oprrr(ctxt *obj.Link, a obj.As) uint32 { case ASYNC: return OPVCC(31, 598, 0, 0) + case ALWSYNC: + return OPVCC(31, 598, 0, 0) | 1<<21 + case APTESYNC: return OPVCC(31, 598, 0, 0) | 2<<21 @@ -3246,6 +3252,8 @@ func oploadx(ctxt *obj.Link, a obj.As) uint32 { return OPVCC(31, 311, 0, 0) /* lhzux */ case AECIWX: return OPVCC(31, 310, 0, 0) /* eciwx */ + case ALBAR: + return OPVCC(31, 52, 0, 0) /* lbarx */ case ALWAR: return OPVCC(31, 20, 0, 0) /* lwarx */ case ALDAR: @@ -3342,6 +3350,8 @@ func opstorex(ctxt *obj.Link, a obj.As) uint32 { return OPVCC(31, 661, 0, 0) /* stswx */ case AMOVWBR: return OPVCC(31, 662, 0, 0) /* stwbrx */ + case ASTBCCC: + return OPVCC(31, 694, 0, 1) /* stbcx. */ case ASTWCCC: return OPVCC(31, 150, 0, 1) /* stwcx. */ case ASTDCCC: diff --git a/src/cmd/internal/obj/ppc64/obj9.go b/src/cmd/internal/obj/ppc64/obj9.go index 43e4825af0..5f88307a2f 100644 --- a/src/cmd/internal/obj/ppc64/obj9.go +++ b/src/cmd/internal/obj/ppc64/obj9.go @@ -301,6 +301,8 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) { } case ALWAR, + ALBAR, + ASTBCCC, ASTWCCC, AECIWX, AECOWX, @@ -323,6 +325,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) { ASYNC, ATLBSYNC, APTESYNC, + ALWSYNC, ATW, AWORD, ARFI, diff --git a/src/runtime/atomic_ppc64x.s b/src/runtime/atomic_ppc64x.s index 7cdb7466eb..57f672f330 100644 --- a/src/runtime/atomic_ppc64x.s +++ b/src/runtime/atomic_ppc64x.s @@ -10,5 +10,5 @@ TEXT ·publicationBarrier(SB),NOSPLIT|NOFRAME,$0-0 // LWSYNC is the "export" barrier recommended by Power ISA // v2.07 book II, appendix B.2.2.2. // LWSYNC is a load/load, load/store, and store/store barrier. - WORD $0x7c2004ac // LWSYNC + LWSYNC RET 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 diff --git a/src/sync/atomic/asm_ppc64x.s b/src/sync/atomic/asm_ppc64x.s index ed348458b4..2474e96435 100644 --- a/src/sync/atomic/asm_ppc64x.s +++ b/src/sync/atomic/asm_ppc64x.s @@ -15,8 +15,7 @@ TEXT ·SwapUint32(SB),NOSPLIT,$0-20 SYNC LWAR (R3), R5 STWCCC R4, (R3) - BNE -3(PC) - SYNC + BNE -2(PC) ISYNC MOVW R5, old+16(FP) RET @@ -30,8 +29,7 @@ TEXT ·SwapUint64(SB),NOSPLIT,$0-24 SYNC LDAR (R3), R5 STDCCC R4, (R3) - BNE -3(PC) - SYNC + BNE -2(PC) ISYNC MOVD R5, old+16(FP) RET @@ -49,10 +47,9 @@ TEXT ·CompareAndSwapUint32(SB),NOSPLIT,$0-17 SYNC LWAR (R3), R6 CMPW R6, R4 - BNE 8(PC) + BNE 7(PC) STWCCC R5, (R3) - BNE -5(PC) - SYNC + BNE -4(PC) ISYNC MOVD $1, R3 MOVB R3, swapped+16(FP) @@ -73,10 +70,9 @@ TEXT ·CompareAndSwapUint64(SB),NOSPLIT,$0-25 SYNC LDAR (R3), R6 CMP R6, R4 - BNE 8(PC) + BNE 7(PC) STDCCC R5, (R3) - BNE -5(PC) - SYNC + BNE -4(PC) ISYNC MOVD $1, R3 MOVB R3, swapped+24(FP) @@ -94,8 +90,7 @@ TEXT ·AddUint32(SB),NOSPLIT,$0-20 LWAR (R3), R5 ADD R4, R5 STWCCC R5, (R3) - BNE -4(PC) - SYNC + BNE -3(PC) ISYNC MOVW R5, ret+16(FP) RET @@ -113,8 +108,7 @@ TEXT ·AddUint64(SB),NOSPLIT,$0-24 LDAR (R3), R5 ADD R4, R5 STDCCC R5, (R3) - BNE -4(PC) - SYNC + BNE -3(PC) ISYNC MOVD R5, ret+16(FP) RET |
