]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: intrinsify runtime/internal/atomic.{And,Or} on S390X
authorMichael Pratt <mpratt@google.com>
Fri, 16 Oct 2020 21:29:00 +0000 (17:29 -0400)
committerMichael Pratt <mpratt@google.com>
Fri, 23 Oct 2020 15:11:15 +0000 (15:11 +0000)
This is a simplification of LANfloor/LAOfloor since we have a whole
word.

Change-Id: I791641fb4068cad3f73660ce51699ed4653ae0e6
Reviewed-on: https://go-review.googlesource.com/c/go/+/263151
Run-TryBot: Michael Pratt <mpratt@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Trust: Michael Pratt <mpratt@google.com>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
src/cmd/compile/internal/gc/ssa.go
src/cmd/compile/internal/s390x/ssa.go
src/cmd/compile/internal/ssa/gen/S390X.rules
src/cmd/compile/internal/ssa/gen/S390XOps.go
src/cmd/compile/internal/ssa/opGen.go
src/cmd/compile/internal/ssa/rewriteS390X.go

index 2b64b358edf7f05013b5573704063ef981e54226..e70e5a969bd42db747f888aa48d0598d029c0f58 100644 (file)
@@ -3546,7 +3546,7 @@ func init() {
                        s.vars[&memVar] = s.newValue3(ssa.OpAtomicAnd32, types.TypeMem, args[0], args[1], s.mem())
                        return nil
                },
-               sys.AMD64, sys.ARM64, sys.PPC64) // TODO: same arches as And8.
+               sys.AMD64, sys.ARM64, sys.PPC64, sys.S390X) // TODO: same arches as And8.
        addF("runtime/internal/atomic", "Or8",
                func(s *state, n *Node, args []*ssa.Value) *ssa.Value {
                        s.vars[&memVar] = s.newValue3(ssa.OpAtomicOr8, types.TypeMem, args[0], args[1], s.mem())
@@ -3558,7 +3558,7 @@ func init() {
                        s.vars[&memVar] = s.newValue3(ssa.OpAtomicOr32, types.TypeMem, args[0], args[1], s.mem())
                        return nil
                },
-               sys.AMD64, sys.ARM64, sys.PPC64) // TODO: same arches as And8.
+               sys.AMD64, sys.ARM64, sys.PPC64, sys.S390X) // TODO: same arches as And8.
 
        alias("runtime/internal/atomic", "Loadint64", "runtime/internal/atomic", "Load64", all...)
        alias("runtime/internal/atomic", "Xaddint64", "runtime/internal/atomic", "Xadd64", all...)
index 00d253c95a2e49191ae6ea6e2f18b52c735c32e9..e23b31f38556c873ef3d87b97f81294bd797194e 100644 (file)
@@ -761,6 +761,14 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
                p.To.Type = obj.TYPE_MEM
                p.To.Reg = v.Args[0].Reg()
                gc.AddAux(&p.To, v)
+       case ssa.OpS390XLAN, ssa.OpS390XLAO:
+               // LA(N|O) Ry, TMP, 0(Rx)
+               op := s.Prog(v.Op.Asm())
+               op.From.Type = obj.TYPE_REG
+               op.From.Reg = v.Args[1].Reg()
+               op.Reg = s390x.REGTMP
+               op.To.Type = obj.TYPE_MEM
+               op.To.Reg = v.Args[0].Reg()
        case ssa.OpS390XLANfloor, ssa.OpS390XLAOfloor:
                r := v.Args[0].Reg() // clobbered, assumed R1 in comments
 
index e564f638d385b5b440658aaed5f602577cae6189..2d6f091a4eea8e28c27e74fe55a45b24274b1ee7 100644 (file)
          (RXSBG <typ.UInt32> {s390x.NewRotateParams(59, 60, 3)} (MOVDconst [3<<3]) ptr))
        mem)
 
+(AtomicAnd32 ...) => (LAN ...)
+(AtomicOr32  ...) => (LAO ...)
+
 // Lowering extension
 // Note: we always extend to 64 bits even though some ops don't need that many result bits.
 (SignExt8to(16|32|64) ...) => (MOVBreg ...)
index 417b33cf913f918b7de11cc803e700c5896ceed7..728cfb55088f420ae1a79cb2d571a9b5ad588ec5 100644 (file)
@@ -547,8 +547,10 @@ func init() {
                // Atomic bitwise operations.
                // Note: 'floor' operations round the pointer down to the nearest word boundary
                // which reflects how they are used in the runtime.
-               {name: "LAOfloor", argLength: 3, reg: gpstorelab, asm: "LAO", typ: "Mem", clobberFlags: true, hasSideEffects: true}, // *(floor(arg0, 4)) |= arg1. arg2 = mem.
+               {name: "LAN", argLength: 3, reg: gpstore, asm: "LAN", typ: "Mem", clobberFlags: true, hasSideEffects: true}, // *arg0 &= arg1. arg2 = mem.
                {name: "LANfloor", argLength: 3, reg: gpstorelab, asm: "LAN", typ: "Mem", clobberFlags: true, hasSideEffects: true}, // *(floor(arg0, 4)) &= arg1. arg2 = mem.
+               {name: "LAO", argLength: 3, reg: gpstore, asm: "LAO", typ: "Mem", clobberFlags: true, hasSideEffects: true}, // *arg0 |= arg1. arg2 = mem.
+               {name: "LAOfloor", argLength: 3, reg: gpstorelab, asm: "LAO", typ: "Mem", clobberFlags: true, hasSideEffects: true}, // *(floor(arg0, 4)) |= arg1. arg2 = mem.
 
                // Compare and swap.
                // arg0 = pointer, arg1 = old value, arg2 = new value, arg3 = memory.
index 5afb4abf5c1c00f80b7f15db804f6f4ac703a053..a4938a4992ff14b59983f538d7518c16868c1db2 100644 (file)
@@ -2374,8 +2374,10 @@ const (
        OpS390XLAAG
        OpS390XAddTupleFirst32
        OpS390XAddTupleFirst64
-       OpS390XLAOfloor
+       OpS390XLAN
        OpS390XLANfloor
+       OpS390XLAO
+       OpS390XLAOfloor
        OpS390XLoweredAtomicCas32
        OpS390XLoweredAtomicCas64
        OpS390XLoweredAtomicExchange32
@@ -31905,11 +31907,24 @@ var opcodeTable = [...]opInfo{
                reg:    regInfo{},
        },
        {
-               name:           "LAOfloor",
+               name:           "LAN",
                argLen:         3,
                clobberFlags:   true,
                hasSideEffects: true,
-               asm:            s390x.ALAO,
+               asm:            s390x.ALAN,
+               reg: regInfo{
+                       inputs: []inputInfo{
+                               {0, 4295023614}, // R1 R2 R3 R4 R5 R6 R7 R8 R9 R11 R12 R14 SP SB
+                               {1, 56319},      // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R11 R12 R14 SP
+                       },
+               },
+       },
+       {
+               name:           "LANfloor",
+               argLen:         3,
+               clobberFlags:   true,
+               hasSideEffects: true,
+               asm:            s390x.ALAN,
                reg: regInfo{
                        inputs: []inputInfo{
                                {0, 2},     // R1
@@ -31919,11 +31934,24 @@ var opcodeTable = [...]opInfo{
                },
        },
        {
-               name:           "LANfloor",
+               name:           "LAO",
                argLen:         3,
                clobberFlags:   true,
                hasSideEffects: true,
-               asm:            s390x.ALAN,
+               asm:            s390x.ALAO,
+               reg: regInfo{
+                       inputs: []inputInfo{
+                               {0, 4295023614}, // R1 R2 R3 R4 R5 R6 R7 R8 R9 R11 R12 R14 SP SB
+                               {1, 56319},      // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R11 R12 R14 SP
+                       },
+               },
+       },
+       {
+               name:           "LAOfloor",
+               argLen:         3,
+               clobberFlags:   true,
+               hasSideEffects: true,
+               asm:            s390x.ALAO,
                reg: regInfo{
                        inputs: []inputInfo{
                                {0, 2},     // R1
index 78a57c2388ae852c1cfc082bdfc364b394aed7e1..35b691c12d8f2b3d91f85e173bdd907d6d401ee4 100644 (file)
@@ -49,6 +49,9 @@ func rewriteValueS390X(v *Value) bool {
                return rewriteValueS390X_OpAtomicAdd32(v)
        case OpAtomicAdd64:
                return rewriteValueS390X_OpAtomicAdd64(v)
+       case OpAtomicAnd32:
+               v.Op = OpS390XLAN
+               return true
        case OpAtomicAnd8:
                return rewriteValueS390X_OpAtomicAnd8(v)
        case OpAtomicCompareAndSwap32:
@@ -69,6 +72,9 @@ func rewriteValueS390X(v *Value) bool {
                return rewriteValueS390X_OpAtomicLoadAcq32(v)
        case OpAtomicLoadPtr:
                return rewriteValueS390X_OpAtomicLoadPtr(v)
+       case OpAtomicOr32:
+               v.Op = OpS390XLAO
+               return true
        case OpAtomicOr8:
                return rewriteValueS390X_OpAtomicOr8(v)
        case OpAtomicStore32: