Skip to content

Commit 2e918c3

Browse files
committed
cmd/compile: provide Load8/Store8 atomic intrinsics on riscv64
Updates #36765 Change-Id: Ieeb6bbc54e4841a1348ad50e80342ec4bc675e07 Reviewed-on: https://go-review.googlesource.com/c/go/+/223557 Reviewed-by: Cherry Zhang <[email protected]> Run-TryBot: Cherry Zhang <[email protected]> TryBot-Result: Gobot Gobot <[email protected]>
1 parent 7ec4adb commit 2e918c3

File tree

6 files changed

+68
-2
lines changed

6 files changed

+68
-2
lines changed

src/cmd/compile/internal/gc/ssa.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -3341,7 +3341,7 @@ func init() {
33413341
s.vars[&memVar] = s.newValue1(ssa.OpSelect1, types.TypeMem, v)
33423342
return s.newValue1(ssa.OpSelect0, types.Types[TUINT8], v)
33433343
},
3344-
sys.AMD64, sys.ARM64, sys.S390X, sys.MIPS, sys.MIPS64, sys.PPC64)
3344+
sys.AMD64, sys.ARM64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
33453345
addF("runtime/internal/atomic", "Load64",
33463346
func(s *state, n *Node, args []*ssa.Value) *ssa.Value {
33473347
v := s.newValue2(ssa.OpAtomicLoad64, types.NewTuple(types.Types[TUINT64], types.TypeMem), args[0], s.mem())
@@ -3375,7 +3375,7 @@ func init() {
33753375
s.vars[&memVar] = s.newValue3(ssa.OpAtomicStore8, types.TypeMem, args[0], args[1], s.mem())
33763376
return nil
33773377
},
3378-
sys.AMD64, sys.ARM64, sys.S390X, sys.MIPS, sys.MIPS64, sys.PPC64)
3378+
sys.AMD64, sys.ARM64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
33793379
addF("runtime/internal/atomic", "Store64",
33803380
func(s *state, n *Node, args []*ssa.Value) *ssa.Value {
33813381
s.vars[&memVar] = s.newValue3(ssa.OpAtomicStore64, types.TypeMem, args[0], args[1], s.mem())

src/cmd/compile/internal/riscv64/ssa.go

+19
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,25 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
341341
p.To.Name = obj.NAME_EXTERN
342342
p.To.Sym = gc.BoundsCheckFunc[v.AuxInt]
343343
s.UseArgs(16) // space used in callee args area by assembly stubs
344+
345+
case ssa.OpRISCV64LoweredAtomicLoad8:
346+
s.Prog(riscv.AFENCE)
347+
p := s.Prog(riscv.AMOVBU)
348+
p.From.Type = obj.TYPE_MEM
349+
p.From.Reg = v.Args[0].Reg()
350+
p.To.Type = obj.TYPE_REG
351+
p.To.Reg = v.Reg0()
352+
s.Prog(riscv.AFENCE)
353+
354+
case ssa.OpRISCV64LoweredAtomicStore8:
355+
s.Prog(riscv.AFENCE)
356+
p := s.Prog(riscv.AMOVB)
357+
p.From.Type = obj.TYPE_REG
358+
p.From.Reg = v.Args[1].Reg()
359+
p.To.Type = obj.TYPE_MEM
360+
p.To.Reg = v.Args[0].Reg()
361+
s.Prog(riscv.AFENCE)
362+
344363
case ssa.OpRISCV64LoweredZero:
345364
mov, sz := largestMove(v.AuxInt)
346365

src/cmd/compile/internal/ssa/gen/RISCV64.rules

+5
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,11 @@
468468
(ClosureCall ...) -> (CALLclosure ...)
469469
(InterCall ...) -> (CALLinter ...)
470470

471+
// Atomic Intrinsics
472+
(AtomicLoad8 ...) -> (LoweredAtomicLoad8 ...)
473+
474+
(AtomicStore8 ...) -> (LoweredAtomicStore8 ...)
475+
471476
// Optimizations
472477

473478
// Absorb SNEZ into branch.

src/cmd/compile/internal/ssa/gen/RISCV64Ops.go

+9
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,15 @@ func init() {
265265
faultOnNilArg1: true,
266266
},
267267

268+
// Atomic loads.
269+
// load from arg0. arg1=mem.
270+
// returns <value,memory> so they can be properly ordered with other loads.
271+
{name: "LoweredAtomicLoad8", argLength: 2, reg: gpload, faultOnNilArg0: true},
272+
273+
// Atomic stores.
274+
// store arg1 to arg0. arg2=mem. returns memory.
275+
{name: "LoweredAtomicStore8", argLength: 3, reg: gpstore, faultOnNilArg0: true, hasSideEffects: true},
276+
268277
// Lowering pass-throughs
269278
{name: "LoweredNilCheck", argLength: 2, faultOnNilArg0: true, nilCheck: true, reg: regInfo{inputs: []regMask{gpspMask}}}, // arg0=ptr,arg1=mem, returns void. Faults if ptr is nil.
270279
{name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{regCtxt}}}, // scheduler ensures only at beginning of entry block

src/cmd/compile/internal/ssa/opGen.go

+27
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/cmd/compile/internal/ssa/rewriteRISCV64.go

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)