]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: provide Load8/Store8 atomic intrinsics on riscv64
authorJoel Sing <joel@sing.id.au>
Sun, 15 Mar 2020 15:38:43 +0000 (02:38 +1100)
committerJoel Sing <joel@sing.id.au>
Tue, 17 Mar 2020 06:38:32 +0000 (06:38 +0000)
Updates #36765

Change-Id: Ieeb6bbc54e4841a1348ad50e80342ec4bc675e07
Reviewed-on: https://go-review.googlesource.com/c/go/+/223557
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/compile/internal/gc/ssa.go
src/cmd/compile/internal/riscv64/ssa.go
src/cmd/compile/internal/ssa/gen/RISCV64.rules
src/cmd/compile/internal/ssa/gen/RISCV64Ops.go
src/cmd/compile/internal/ssa/opGen.go
src/cmd/compile/internal/ssa/rewriteRISCV64.go

index 2553feefbc4f341723de1574c7a35c83899c76a4..d5a5614ba2f94738c417cd14555ef3ae307cdc45 100644 (file)
@@ -3341,7 +3341,7 @@ func init() {
                        s.vars[&memVar] = s.newValue1(ssa.OpSelect1, types.TypeMem, v)
                        return s.newValue1(ssa.OpSelect0, types.Types[TUINT8], v)
                },
-               sys.AMD64, sys.ARM64, sys.S390X, sys.MIPS, sys.MIPS64, sys.PPC64)
+               sys.AMD64, sys.ARM64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
        addF("runtime/internal/atomic", "Load64",
                func(s *state, n *Node, args []*ssa.Value) *ssa.Value {
                        v := s.newValue2(ssa.OpAtomicLoad64, types.NewTuple(types.Types[TUINT64], types.TypeMem), args[0], s.mem())
@@ -3375,7 +3375,7 @@ func init() {
                        s.vars[&memVar] = s.newValue3(ssa.OpAtomicStore8, types.TypeMem, args[0], args[1], s.mem())
                        return nil
                },
-               sys.AMD64, sys.ARM64, sys.S390X, sys.MIPS, sys.MIPS64, sys.PPC64)
+               sys.AMD64, sys.ARM64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
        addF("runtime/internal/atomic", "Store64",
                func(s *state, n *Node, args []*ssa.Value) *ssa.Value {
                        s.vars[&memVar] = s.newValue3(ssa.OpAtomicStore64, types.TypeMem, args[0], args[1], s.mem())
index 631e069a4ee2738ff441dc612b5a6579933dcb41..13015a5f3d7a1adc6ae4dafc8b51b9f5e49d237d 100644 (file)
@@ -341,6 +341,25 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
                p.To.Name = obj.NAME_EXTERN
                p.To.Sym = gc.BoundsCheckFunc[v.AuxInt]
                s.UseArgs(16) // space used in callee args area by assembly stubs
+
+       case ssa.OpRISCV64LoweredAtomicLoad8:
+               s.Prog(riscv.AFENCE)
+               p := s.Prog(riscv.AMOVBU)
+               p.From.Type = obj.TYPE_MEM
+               p.From.Reg = v.Args[0].Reg()
+               p.To.Type = obj.TYPE_REG
+               p.To.Reg = v.Reg0()
+               s.Prog(riscv.AFENCE)
+
+       case ssa.OpRISCV64LoweredAtomicStore8:
+               s.Prog(riscv.AFENCE)
+               p := s.Prog(riscv.AMOVB)
+               p.From.Type = obj.TYPE_REG
+               p.From.Reg = v.Args[1].Reg()
+               p.To.Type = obj.TYPE_MEM
+               p.To.Reg = v.Args[0].Reg()
+               s.Prog(riscv.AFENCE)
+
        case ssa.OpRISCV64LoweredZero:
                mov, sz := largestMove(v.AuxInt)
 
index fba431368b6e1662ab663e759f044d97f2b604d1..04d93d5f4dee58d36872087808ac2f29203eaafb 100644 (file)
 (ClosureCall ...) -> (CALLclosure ...)
 (InterCall   ...) -> (CALLinter   ...)
 
+// Atomic Intrinsics
+(AtomicLoad8 ...) -> (LoweredAtomicLoad8 ...)
+
+(AtomicStore8 ...) -> (LoweredAtomicStore8 ...)
+
 // Optimizations
 
 // Absorb SNEZ into branch.
index 3fd28b3d10fcdc0bb9be960e7b4402a825732d9c..a8de1ab2d0708f35478abe3688b402e6ec3a4d07 100644 (file)
@@ -265,6 +265,15 @@ func init() {
                        faultOnNilArg1: true,
                },
 
+               // Atomic loads.
+               // load from arg0. arg1=mem.
+               // returns <value,memory> so they can be properly ordered with other loads.
+               {name: "LoweredAtomicLoad8", argLength: 2, reg: gpload, faultOnNilArg0: true},
+
+               // Atomic stores.
+               // store arg1 to arg0. arg2=mem. returns memory.
+               {name: "LoweredAtomicStore8", argLength: 3, reg: gpstore, faultOnNilArg0: true, hasSideEffects: true},
+
                // Lowering pass-throughs
                {name: "LoweredNilCheck", argLength: 2, faultOnNilArg0: true, nilCheck: true, reg: regInfo{inputs: []regMask{gpspMask}}}, // arg0=ptr,arg1=mem, returns void.  Faults if ptr is nil.
                {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{regCtxt}}},                                                // scheduler ensures only at beginning of entry block
index 481b404bf30c94b23bbe1976b12982690311729f..d7913eec9c19cf3b1e342680654e0ab3aa4af3ce 100644 (file)
@@ -1948,6 +1948,8 @@ const (
        OpRISCV64CALLinter
        OpRISCV64LoweredZero
        OpRISCV64LoweredMove
+       OpRISCV64LoweredAtomicLoad8
+       OpRISCV64LoweredAtomicStore8
        OpRISCV64LoweredNilCheck
        OpRISCV64LoweredGetClosurePtr
        OpRISCV64LoweredGetCallerSP
@@ -25912,6 +25914,31 @@ var opcodeTable = [...]opInfo{
                        clobbers: 112, // X5 X6 X7
                },
        },
+       {
+               name:           "LoweredAtomicLoad8",
+               argLen:         2,
+               faultOnNilArg0: true,
+               reg: regInfo{
+                       inputs: []inputInfo{
+                               {0, 9223372037928517622}, // SP X3 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X17 X18 X19 X20 X21 X22 X23 X24 X25 X26 X27 X28 X29 X30 SB
+                       },
+                       outputs: []outputInfo{
+                               {0, 1073741812}, // X3 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X17 X18 X19 X20 X21 X22 X23 X24 X25 X26 X27 X28 X29 X30
+                       },
+               },
+       },
+       {
+               name:           "LoweredAtomicStore8",
+               argLen:         3,
+               faultOnNilArg0: true,
+               hasSideEffects: true,
+               reg: regInfo{
+                       inputs: []inputInfo{
+                               {1, 1073741814},          // SP X3 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X17 X18 X19 X20 X21 X22 X23 X24 X25 X26 X27 X28 X29 X30
+                               {0, 9223372037928517622}, // SP X3 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X17 X18 X19 X20 X21 X22 X23 X24 X25 X26 X27 X28 X29 X30 SB
+                       },
+               },
+       },
        {
                name:           "LoweredNilCheck",
                argLen:         2,
index a7b0ba05b912adb7b711b3e16990da4e3b9c50b7..7284b3f239a7abcf9e6c3d0bb6fd9420c9e13838 100644 (file)
@@ -47,6 +47,12 @@ func rewriteValueRISCV64(v *Value) bool {
        case OpAndB:
                v.Op = OpRISCV64AND
                return true
+       case OpAtomicLoad8:
+               v.Op = OpRISCV64LoweredAtomicLoad8
+               return true
+       case OpAtomicStore8:
+               v.Op = OpRISCV64LoweredAtomicStore8
+               return true
        case OpAvg64u:
                return rewriteValueRISCV64_OpAvg64u(v)
        case OpClosureCall: