Skip to content

Commit ade9886

Browse files
committed
cmd/compile: provide Load32/Load64/Store32/Store64 atomic intrinsics on riscv64
Updates #36765 Change-Id: Id5ce5c5f60112e4f4cf9eec1b1ec120994934950 Reviewed-on: https://go-review.googlesource.com/c/go/+/223558 Reviewed-by: Cherry Zhang <[email protected]> Run-TryBot: Cherry Zhang <[email protected]> TryBot-Result: Gobot Gobot <[email protected]>
1 parent 20b46c7 commit ade9886

File tree

6 files changed

+113
-8
lines changed

6 files changed

+113
-8
lines changed

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

+5-5
Original file line numberDiff line numberDiff line change
@@ -3339,7 +3339,7 @@ func init() {
33393339
s.vars[&memVar] = s.newValue1(ssa.OpSelect1, types.TypeMem, v)
33403340
return s.newValue1(ssa.OpSelect0, types.Types[TUINT32], v)
33413341
},
3342-
sys.AMD64, sys.ARM64, sys.S390X, sys.MIPS, sys.MIPS64, sys.PPC64)
3342+
sys.AMD64, sys.ARM64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
33433343
addF("runtime/internal/atomic", "Load8",
33443344
func(s *state, n *Node, args []*ssa.Value) *ssa.Value {
33453345
v := s.newValue2(ssa.OpAtomicLoad8, types.NewTuple(types.Types[TUINT8], types.TypeMem), args[0], s.mem())
@@ -3353,7 +3353,7 @@ func init() {
33533353
s.vars[&memVar] = s.newValue1(ssa.OpSelect1, types.TypeMem, v)
33543354
return s.newValue1(ssa.OpSelect0, types.Types[TUINT64], v)
33553355
},
3356-
sys.AMD64, sys.ARM64, sys.S390X, sys.MIPS64, sys.PPC64)
3356+
sys.AMD64, sys.ARM64, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
33573357
addF("runtime/internal/atomic", "LoadAcq",
33583358
func(s *state, n *Node, args []*ssa.Value) *ssa.Value {
33593359
v := s.newValue2(ssa.OpAtomicLoadAcq32, types.NewTuple(types.Types[TUINT32], types.TypeMem), args[0], s.mem())
@@ -3367,14 +3367,14 @@ func init() {
33673367
s.vars[&memVar] = s.newValue1(ssa.OpSelect1, types.TypeMem, v)
33683368
return s.newValue1(ssa.OpSelect0, s.f.Config.Types.BytePtr, v)
33693369
},
3370-
sys.AMD64, sys.ARM64, sys.S390X, sys.MIPS, sys.MIPS64, sys.PPC64)
3370+
sys.AMD64, sys.ARM64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
33713371

33723372
addF("runtime/internal/atomic", "Store",
33733373
func(s *state, n *Node, args []*ssa.Value) *ssa.Value {
33743374
s.vars[&memVar] = s.newValue3(ssa.OpAtomicStore32, types.TypeMem, args[0], args[1], s.mem())
33753375
return nil
33763376
},
3377-
sys.AMD64, sys.ARM64, sys.S390X, sys.MIPS, sys.MIPS64, sys.PPC64)
3377+
sys.AMD64, sys.ARM64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
33783378
addF("runtime/internal/atomic", "Store8",
33793379
func(s *state, n *Node, args []*ssa.Value) *ssa.Value {
33803380
s.vars[&memVar] = s.newValue3(ssa.OpAtomicStore8, types.TypeMem, args[0], args[1], s.mem())
@@ -3386,7 +3386,7 @@ func init() {
33863386
s.vars[&memVar] = s.newValue3(ssa.OpAtomicStore64, types.TypeMem, args[0], args[1], s.mem())
33873387
return nil
33883388
},
3389-
sys.AMD64, sys.ARM64, sys.S390X, sys.MIPS64, sys.PPC64)
3389+
sys.AMD64, sys.ARM64, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X)
33903390
addF("runtime/internal/atomic", "StorepNoWB",
33913391
func(s *state, n *Node, args []*ssa.Value) *ssa.Value {
33923392
s.vars[&memVar] = s.newValue3(ssa.OpAtomicStorePtrNoWB, types.TypeMem, args[0], args[1], s.mem())

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

+23
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,17 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
351351
p.To.Reg = v.Reg0()
352352
s.Prog(riscv.AFENCE)
353353

354+
case ssa.OpRISCV64LoweredAtomicLoad32, ssa.OpRISCV64LoweredAtomicLoad64:
355+
as := riscv.ALRW
356+
if v.Op == ssa.OpRISCV64LoweredAtomicLoad64 {
357+
as = riscv.ALRD
358+
}
359+
p := s.Prog(as)
360+
p.From.Type = obj.TYPE_MEM
361+
p.From.Reg = v.Args[0].Reg()
362+
p.To.Type = obj.TYPE_REG
363+
p.To.Reg = v.Reg0()
364+
354365
case ssa.OpRISCV64LoweredAtomicStore8:
355366
s.Prog(riscv.AFENCE)
356367
p := s.Prog(riscv.AMOVB)
@@ -360,6 +371,18 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
360371
p.To.Reg = v.Args[0].Reg()
361372
s.Prog(riscv.AFENCE)
362373

374+
case ssa.OpRISCV64LoweredAtomicStore32, ssa.OpRISCV64LoweredAtomicStore64:
375+
as := riscv.AAMOSWAPW
376+
if v.Op == ssa.OpRISCV64LoweredAtomicStore64 {
377+
as = riscv.AAMOSWAPD
378+
}
379+
p := s.Prog(as)
380+
p.From.Type = obj.TYPE_REG
381+
p.From.Reg = v.Args[1].Reg()
382+
p.To.Type = obj.TYPE_MEM
383+
p.To.Reg = v.Args[0].Reg()
384+
p.RegTo2 = riscv.REG_ZERO
385+
363386
case ssa.OpRISCV64LoweredZero:
364387
mov, sz := largestMove(v.AuxInt)
365388

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

+9-3
Original file line numberDiff line numberDiff line change
@@ -469,9 +469,15 @@
469469
(InterCall ...) -> (CALLinter ...)
470470

471471
// Atomic Intrinsics
472-
(AtomicLoad8 ...) -> (LoweredAtomicLoad8 ...)
473-
474-
(AtomicStore8 ...) -> (LoweredAtomicStore8 ...)
472+
(AtomicLoad8 ...) -> (LoweredAtomicLoad8 ...)
473+
(AtomicLoad32 ...) -> (LoweredAtomicLoad32 ...)
474+
(AtomicLoad64 ...) -> (LoweredAtomicLoad64 ...)
475+
(AtomicLoadPtr ...) -> (LoweredAtomicLoad64 ...)
476+
477+
(AtomicStore8 ...) -> (LoweredAtomicStore8 ...)
478+
(AtomicStore32 ...) -> (LoweredAtomicStore32 ...)
479+
(AtomicStore64 ...) -> (LoweredAtomicStore64 ...)
480+
(AtomicStorePtrNoWB ...) -> (LoweredAtomicStore64 ...)
475481

476482
// Optimizations
477483

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

+4
Original file line numberDiff line numberDiff line change
@@ -269,10 +269,14 @@ func init() {
269269
// load from arg0. arg1=mem.
270270
// returns <value,memory> so they can be properly ordered with other loads.
271271
{name: "LoweredAtomicLoad8", argLength: 2, reg: gpload, faultOnNilArg0: true},
272+
{name: "LoweredAtomicLoad32", argLength: 2, reg: gpload, faultOnNilArg0: true},
273+
{name: "LoweredAtomicLoad64", argLength: 2, reg: gpload, faultOnNilArg0: true},
272274

273275
// Atomic stores.
274276
// store arg1 to arg0. arg2=mem. returns memory.
275277
{name: "LoweredAtomicStore8", argLength: 3, reg: gpstore, faultOnNilArg0: true, hasSideEffects: true},
278+
{name: "LoweredAtomicStore32", argLength: 3, reg: gpstore, faultOnNilArg0: true, hasSideEffects: true},
279+
{name: "LoweredAtomicStore64", argLength: 3, reg: gpstore, faultOnNilArg0: true, hasSideEffects: true},
276280

277281
// Lowering pass-throughs
278282
{name: "LoweredNilCheck", argLength: 2, faultOnNilArg0: true, nilCheck: true, reg: regInfo{inputs: []regMask{gpspMask}}}, // arg0=ptr,arg1=mem, returns void. Faults if ptr is nil.

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

+54
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

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

0 commit comments

Comments
 (0)