]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal: intrinsify publicationBarrier on ppc64x
authorLynn Boger <laboger@linux.vnet.ibm.com>
Wed, 4 May 2022 15:07:38 +0000 (10:07 -0500)
committerLynn Boger <laboger@linux.vnet.ibm.com>
Thu, 5 May 2022 21:14:11 +0000 (21:14 +0000)
This enables publicationBarrier to be used as an intrinsic
on ppc64le/ppc64.

A call to this appears in test/bench/go1 BinaryTree17

Change-Id: If53528a82de99688270473cbe23472f37046ad65
Reviewed-on: https://go-review.googlesource.com/c/go/+/404056
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Lynn Boger <laboger@linux.vnet.ibm.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: David Chase <drchase@google.com>
src/cmd/compile/internal/ppc64/ssa.go
src/cmd/compile/internal/ssa/gen/PPC64.rules
src/cmd/compile/internal/ssa/gen/PPC64Ops.go
src/cmd/compile/internal/ssa/opGen.go
src/cmd/compile/internal/ssa/rewritePPC64.go
src/cmd/compile/internal/ssagen/ssa.go

index 8689bd8b27ea3c09ac060971232e9e60d7bc9cdf..e5a9eecc6a995a3f6a57c320caf95d9210b0990f 100644 (file)
@@ -468,6 +468,10 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) {
                p8 := s.Prog(obj.ANOP)
                p6.To.SetTarget(p8)
 
+       case ssa.OpPPC64LoweredPubBarrier:
+               // LWSYNC
+               s.Prog(v.Op.Asm())
+
        case ssa.OpPPC64LoweredGetClosurePtr:
                // Closure pointer is R11 (already)
                ssagen.CheckLoweredGetClosurePtr(v)
index 1fe7ae9e53cf4a0078cfa36b59fb813a2c68530b..bb3ac8ad1be83aa0251898be3907fddbb6f8fa2a 100644 (file)
 // Write barrier.
 (WB ...) => (LoweredWB ...)
 
+// Publication barrier as intrinsic
+(PubBarrier ...) => (LoweredPubBarrier ...)
+
 (PanicBounds [kind] x y mem) && boundsABI(kind) == 0 => (LoweredPanicBoundsA [kind] x y mem)
 (PanicBounds [kind] x y mem) && boundsABI(kind) == 1 => (LoweredPanicBoundsB [kind] x y mem)
 (PanicBounds [kind] x y mem) && boundsABI(kind) == 2 => (LoweredPanicBoundsC [kind] x y mem)
index e3b79200fe102381e8abd0e00d2dc6b8acb273b7..bc7fa0a1a3ffd4f6cd33576d45302102bff85e8f 100644 (file)
@@ -686,6 +686,7 @@ func init() {
                // but may clobber anything else, including R31 (REGTMP).
                {name: "LoweredWB", argLength: 3, reg: regInfo{inputs: []regMask{buildReg("R20"), buildReg("R21")}, clobbers: (callerSave &^ buildReg("R0 R3 R4 R5 R6 R7 R8 R9 R10 R14 R15 R16 R17 R20 R21 g")) | buildReg("R31")}, clobberFlags: true, aux: "Sym", symEffect: "None"},
 
+               {name: "LoweredPubBarrier", argLength: 1, asm: "LWSYNC", hasSideEffects: true}, // Do data barrier. arg0=memory
                // There are three of these functions so that they can have three different register inputs.
                // When we check 0 <= c <= cap (A), then 0 <= b <= c (B), then 0 <= a <= b (C), we want the
                // default registers to match so we don't need to copy registers around unnecessarily.
index 0357fdb12ab46e04fa54b76ab49136fd7ce3a2de..6d2ec4a2352bfe206281bfec1c60eea7e97275f2 100644 (file)
@@ -2138,6 +2138,7 @@ const (
        OpPPC64LoweredAtomicOr8
        OpPPC64LoweredAtomicOr32
        OpPPC64LoweredWB
+       OpPPC64LoweredPubBarrier
        OpPPC64LoweredPanicBoundsA
        OpPPC64LoweredPanicBoundsB
        OpPPC64LoweredPanicBoundsC
@@ -28775,6 +28776,13 @@ var opcodeTable = [...]opInfo{
                        clobbers: 18446744072632408064, // R11 R12 R18 R19 R22 R23 R24 R25 R26 R27 R28 R29 R31 F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26 F27 F28 F29 F30 XER
                },
        },
+       {
+               name:           "LoweredPubBarrier",
+               argLen:         1,
+               hasSideEffects: true,
+               asm:            ppc64.ALWSYNC,
+               reg:            regInfo{},
+       },
        {
                name:    "LoweredPanicBoundsA",
                auxType: auxInt64,
index 1d945be7419f16ce280f0aa40bfcbd3cc644bbb1..a21b757ca925a450eb54833588b2ab9c6fbfecdd 100644 (file)
@@ -643,6 +643,9 @@ func rewriteValuePPC64(v *Value) bool {
                return rewriteValuePPC64_OpPrefetchCache(v)
        case OpPrefetchCacheStreamed:
                return rewriteValuePPC64_OpPrefetchCacheStreamed(v)
+       case OpPubBarrier:
+               v.Op = OpPPC64LoweredPubBarrier
+               return true
        case OpRotateLeft16:
                return rewriteValuePPC64_OpRotateLeft16(v)
        case OpRotateLeft32:
index f6176c4f0595be416211d00637053393f6bfc160..c15fd785636d6f8ccd0b9b3ef41cd45a310a117c 100644 (file)
@@ -3951,7 +3951,7 @@ func InitTables() {
                        s.vars[memVar] = s.newValue1(ssa.OpPubBarrier, types.TypeMem, s.mem())
                        return nil
                },
-               sys.ARM64)
+               sys.ARM64, sys.PPC64)
 
        /******** runtime/internal/sys ********/
        addF("runtime/internal/sys", "Ctz32",