mirror of
https://github.com/golang/go.git
synced 2025-05-17 05:14:40 +00:00
cmd/compile: use NEG/NEGW pseudo-instructions on riscv64
Also rewrite subtraction of zero to NEG/NEGW. Change-Id: I216e286d1860055f2a07fe2f772cd50f366ea097 Reviewed-on: https://go-review.googlesource.com/c/go/+/221691 Reviewed-by: Cherry Zhang <cherryyz@google.com>
This commit is contained in:
parent
7b2f0ba5b9
commit
26154f31ad
@ -251,7 +251,7 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
|||||||
ssa.OpRISCV64FMVSX, ssa.OpRISCV64FMVDX,
|
ssa.OpRISCV64FMVSX, ssa.OpRISCV64FMVDX,
|
||||||
ssa.OpRISCV64FCVTSW, ssa.OpRISCV64FCVTSL, ssa.OpRISCV64FCVTWS, ssa.OpRISCV64FCVTLS,
|
ssa.OpRISCV64FCVTSW, ssa.OpRISCV64FCVTSL, ssa.OpRISCV64FCVTWS, ssa.OpRISCV64FCVTLS,
|
||||||
ssa.OpRISCV64FCVTDW, ssa.OpRISCV64FCVTDL, ssa.OpRISCV64FCVTWD, ssa.OpRISCV64FCVTLD, ssa.OpRISCV64FCVTDS, ssa.OpRISCV64FCVTSD,
|
ssa.OpRISCV64FCVTDW, ssa.OpRISCV64FCVTDL, ssa.OpRISCV64FCVTWD, ssa.OpRISCV64FCVTLD, ssa.OpRISCV64FCVTDS, ssa.OpRISCV64FCVTSD,
|
||||||
ssa.OpRISCV64NOT:
|
ssa.OpRISCV64NOT, ssa.OpRISCV64NEG, ssa.OpRISCV64NEGW:
|
||||||
p := s.Prog(v.Op.Asm())
|
p := s.Prog(v.Op.Asm())
|
||||||
p.From.Type = obj.TYPE_REG
|
p.From.Type = obj.TYPE_REG
|
||||||
p.From.Reg = v.Args[0].Reg()
|
p.From.Reg = v.Args[0].Reg()
|
||||||
|
@ -84,10 +84,10 @@
|
|||||||
(Xor16 ...) -> (XOR ...)
|
(Xor16 ...) -> (XOR ...)
|
||||||
(Xor8 ...) -> (XOR ...)
|
(Xor8 ...) -> (XOR ...)
|
||||||
|
|
||||||
(Neg64 x) -> (SUB (MOVDconst) x)
|
(Neg64 ...) -> (NEG ...)
|
||||||
(Neg32 x) -> (SUB (MOVWconst) x)
|
(Neg32 ...) -> (NEG ...)
|
||||||
(Neg16 x) -> (SUB (MOVHconst) x)
|
(Neg16 ...) -> (NEG ...)
|
||||||
(Neg8 x) -> (SUB (MOVBconst) x)
|
(Neg8 ...) -> (NEG ...)
|
||||||
(Neg32F ...) -> (FNEGS ...)
|
(Neg32F ...) -> (FNEGS ...)
|
||||||
(Neg64F ...) -> (FNEGD ...)
|
(Neg64F ...) -> (FNEGD ...)
|
||||||
|
|
||||||
@ -497,5 +497,14 @@
|
|||||||
// Subtraction of zero with sign extension.
|
// Subtraction of zero with sign extension.
|
||||||
(SUBW x (MOVWconst [0])) -> (ADDIW [0] x)
|
(SUBW x (MOVWconst [0])) -> (ADDIW [0] x)
|
||||||
|
|
||||||
|
// Subtraction from zero.
|
||||||
|
(SUB (MOVBconst [0]) x) -> (NEG x)
|
||||||
|
(SUB (MOVHconst [0]) x) -> (NEG x)
|
||||||
|
(SUB (MOVWconst [0]) x) -> (NEG x)
|
||||||
|
(SUB (MOVDconst [0]) x) -> (NEG x)
|
||||||
|
|
||||||
|
// Subtraction from zero with sign extension.
|
||||||
|
(SUBW (MOVDconst [0]) x) -> (NEGW x)
|
||||||
|
|
||||||
// remove redundant *const ops
|
// remove redundant *const ops
|
||||||
(ADDI [0] x) -> x
|
(ADDI [0] x) -> x
|
||||||
|
@ -131,6 +131,8 @@ func init() {
|
|||||||
{name: "ADD", argLength: 2, reg: gp21, asm: "ADD", commutative: true}, // arg0 + arg1
|
{name: "ADD", argLength: 2, reg: gp21, asm: "ADD", commutative: true}, // arg0 + arg1
|
||||||
{name: "ADDI", argLength: 1, reg: gp11sb, asm: "ADDI", aux: "Int64"}, // arg0 + auxint
|
{name: "ADDI", argLength: 1, reg: gp11sb, asm: "ADDI", aux: "Int64"}, // arg0 + auxint
|
||||||
{name: "ADDIW", argLength: 1, reg: gp11, asm: "ADDIW", aux: "Int64"}, // 32 low bits of arg0 + auxint, sign extended to 64 bits
|
{name: "ADDIW", argLength: 1, reg: gp11, asm: "ADDIW", aux: "Int64"}, // 32 low bits of arg0 + auxint, sign extended to 64 bits
|
||||||
|
{name: "NEG", argLength: 1, reg: gp11, asm: "NEG"}, // -arg0
|
||||||
|
{name: "NEGW", argLength: 1, reg: gp11, asm: "NEGW"}, // -arg0 of 32 bits, sign extended to 64 bits
|
||||||
{name: "SUB", argLength: 2, reg: gp21, asm: "SUB"}, // arg0 - arg1
|
{name: "SUB", argLength: 2, reg: gp21, asm: "SUB"}, // arg0 - arg1
|
||||||
{name: "SUBW", argLength: 2, reg: gp21, asm: "SUBW"}, // 32 low bits of arg 0 - 32 low bits of arg 1, sign extended to 64 bits
|
{name: "SUBW", argLength: 2, reg: gp21, asm: "SUBW"}, // 32 low bits of arg 0 - 32 low bits of arg 1, sign extended to 64 bits
|
||||||
|
|
||||||
|
@ -1887,6 +1887,8 @@ const (
|
|||||||
OpRISCV64ADD
|
OpRISCV64ADD
|
||||||
OpRISCV64ADDI
|
OpRISCV64ADDI
|
||||||
OpRISCV64ADDIW
|
OpRISCV64ADDIW
|
||||||
|
OpRISCV64NEG
|
||||||
|
OpRISCV64NEGW
|
||||||
OpRISCV64SUB
|
OpRISCV64SUB
|
||||||
OpRISCV64SUBW
|
OpRISCV64SUBW
|
||||||
OpRISCV64MUL
|
OpRISCV64MUL
|
||||||
@ -25058,6 +25060,32 @@ var opcodeTable = [...]opInfo{
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "NEG",
|
||||||
|
argLen: 1,
|
||||||
|
asm: riscv.ANEG,
|
||||||
|
reg: regInfo{
|
||||||
|
inputs: []inputInfo{
|
||||||
|
{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
|
||||||
|
},
|
||||||
|
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: "NEGW",
|
||||||
|
argLen: 1,
|
||||||
|
asm: riscv.ANEGW,
|
||||||
|
reg: regInfo{
|
||||||
|
inputs: []inputInfo{
|
||||||
|
{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
|
||||||
|
},
|
||||||
|
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: "SUB",
|
name: "SUB",
|
||||||
argLen: 2,
|
argLen: 2,
|
||||||
|
@ -324,19 +324,23 @@ func rewriteValueRISCV64(v *Value) bool {
|
|||||||
case OpMul8:
|
case OpMul8:
|
||||||
return rewriteValueRISCV64_OpMul8(v)
|
return rewriteValueRISCV64_OpMul8(v)
|
||||||
case OpNeg16:
|
case OpNeg16:
|
||||||
return rewriteValueRISCV64_OpNeg16(v)
|
v.Op = OpRISCV64NEG
|
||||||
|
return true
|
||||||
case OpNeg32:
|
case OpNeg32:
|
||||||
return rewriteValueRISCV64_OpNeg32(v)
|
v.Op = OpRISCV64NEG
|
||||||
|
return true
|
||||||
case OpNeg32F:
|
case OpNeg32F:
|
||||||
v.Op = OpRISCV64FNEGS
|
v.Op = OpRISCV64FNEGS
|
||||||
return true
|
return true
|
||||||
case OpNeg64:
|
case OpNeg64:
|
||||||
return rewriteValueRISCV64_OpNeg64(v)
|
v.Op = OpRISCV64NEG
|
||||||
|
return true
|
||||||
case OpNeg64F:
|
case OpNeg64F:
|
||||||
v.Op = OpRISCV64FNEGD
|
v.Op = OpRISCV64FNEGD
|
||||||
return true
|
return true
|
||||||
case OpNeg8:
|
case OpNeg8:
|
||||||
return rewriteValueRISCV64_OpNeg8(v)
|
v.Op = OpRISCV64NEG
|
||||||
|
return true
|
||||||
case OpNeq16:
|
case OpNeq16:
|
||||||
return rewriteValueRISCV64_OpNeq16(v)
|
return rewriteValueRISCV64_OpNeq16(v)
|
||||||
case OpNeq32:
|
case OpNeq32:
|
||||||
@ -1950,62 +1954,6 @@ func rewriteValueRISCV64_OpMul8(v *Value) bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func rewriteValueRISCV64_OpNeg16(v *Value) bool {
|
|
||||||
v_0 := v.Args[0]
|
|
||||||
b := v.Block
|
|
||||||
typ := &b.Func.Config.Types
|
|
||||||
// match: (Neg16 x)
|
|
||||||
// result: (SUB (MOVHconst) x)
|
|
||||||
for {
|
|
||||||
x := v_0
|
|
||||||
v.reset(OpRISCV64SUB)
|
|
||||||
v0 := b.NewValue0(v.Pos, OpRISCV64MOVHconst, typ.UInt16)
|
|
||||||
v.AddArg2(v0, x)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
func rewriteValueRISCV64_OpNeg32(v *Value) bool {
|
|
||||||
v_0 := v.Args[0]
|
|
||||||
b := v.Block
|
|
||||||
typ := &b.Func.Config.Types
|
|
||||||
// match: (Neg32 x)
|
|
||||||
// result: (SUB (MOVWconst) x)
|
|
||||||
for {
|
|
||||||
x := v_0
|
|
||||||
v.reset(OpRISCV64SUB)
|
|
||||||
v0 := b.NewValue0(v.Pos, OpRISCV64MOVWconst, typ.UInt32)
|
|
||||||
v.AddArg2(v0, x)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
func rewriteValueRISCV64_OpNeg64(v *Value) bool {
|
|
||||||
v_0 := v.Args[0]
|
|
||||||
b := v.Block
|
|
||||||
typ := &b.Func.Config.Types
|
|
||||||
// match: (Neg64 x)
|
|
||||||
// result: (SUB (MOVDconst) x)
|
|
||||||
for {
|
|
||||||
x := v_0
|
|
||||||
v.reset(OpRISCV64SUB)
|
|
||||||
v0 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
|
|
||||||
v.AddArg2(v0, x)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
func rewriteValueRISCV64_OpNeg8(v *Value) bool {
|
|
||||||
v_0 := v.Args[0]
|
|
||||||
b := v.Block
|
|
||||||
typ := &b.Func.Config.Types
|
|
||||||
// match: (Neg8 x)
|
|
||||||
// result: (SUB (MOVBconst) x)
|
|
||||||
for {
|
|
||||||
x := v_0
|
|
||||||
v.reset(OpRISCV64SUB)
|
|
||||||
v0 := b.NewValue0(v.Pos, OpRISCV64MOVBconst, typ.UInt8)
|
|
||||||
v.AddArg2(v0, x)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
func rewriteValueRISCV64_OpNeq16(v *Value) bool {
|
func rewriteValueRISCV64_OpNeq16(v *Value) bool {
|
||||||
v_1 := v.Args[1]
|
v_1 := v.Args[1]
|
||||||
v_0 := v.Args[0]
|
v_0 := v.Args[0]
|
||||||
@ -3212,6 +3160,50 @@ func rewriteValueRISCV64_OpRISCV64SUB(v *Value) bool {
|
|||||||
v.copyOf(x)
|
v.copyOf(x)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
// match: (SUB (MOVBconst [0]) x)
|
||||||
|
// result: (NEG x)
|
||||||
|
for {
|
||||||
|
if v_0.Op != OpRISCV64MOVBconst || v_0.AuxInt != 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
x := v_1
|
||||||
|
v.reset(OpRISCV64NEG)
|
||||||
|
v.AddArg(x)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
// match: (SUB (MOVHconst [0]) x)
|
||||||
|
// result: (NEG x)
|
||||||
|
for {
|
||||||
|
if v_0.Op != OpRISCV64MOVHconst || v_0.AuxInt != 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
x := v_1
|
||||||
|
v.reset(OpRISCV64NEG)
|
||||||
|
v.AddArg(x)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
// match: (SUB (MOVWconst [0]) x)
|
||||||
|
// result: (NEG x)
|
||||||
|
for {
|
||||||
|
if v_0.Op != OpRISCV64MOVWconst || v_0.AuxInt != 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
x := v_1
|
||||||
|
v.reset(OpRISCV64NEG)
|
||||||
|
v.AddArg(x)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
// match: (SUB (MOVDconst [0]) x)
|
||||||
|
// result: (NEG x)
|
||||||
|
for {
|
||||||
|
if v_0.Op != OpRISCV64MOVDconst || v_0.AuxInt != 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
x := v_1
|
||||||
|
v.reset(OpRISCV64NEG)
|
||||||
|
v.AddArg(x)
|
||||||
|
return true
|
||||||
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
func rewriteValueRISCV64_OpRISCV64SUBW(v *Value) bool {
|
func rewriteValueRISCV64_OpRISCV64SUBW(v *Value) bool {
|
||||||
@ -3229,6 +3221,17 @@ func rewriteValueRISCV64_OpRISCV64SUBW(v *Value) bool {
|
|||||||
v.AddArg(x)
|
v.AddArg(x)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
// match: (SUBW (MOVDconst [0]) x)
|
||||||
|
// result: (NEGW x)
|
||||||
|
for {
|
||||||
|
if v_0.Op != OpRISCV64MOVDconst || v_0.AuxInt != 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
x := v_1
|
||||||
|
v.reset(OpRISCV64NEGW)
|
||||||
|
v.AddArg(x)
|
||||||
|
return true
|
||||||
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
func rewriteValueRISCV64_OpRotateLeft16(v *Value) bool {
|
func rewriteValueRISCV64_OpRotateLeft16(v *Value) bool {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user