mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: simplify the support for 32bit high multiply on loong64
Removes 152 instructions from the Go binary on loong64. Change-Id: Icf8ead4f4ca965f51add85ac5e45c3cca8916401 Reviewed-on: https://go-review.googlesource.com/c/go/+/700335 Reviewed-by: Keith Randall <khr@google.com> Auto-Submit: Michael Pratt <mpratt@google.com> Reviewed-by: Michael Pratt <mpratt@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Meidan Li <limeidan@loongson.cn> Reviewed-by: abner chenc <chenguoqi@loongson.cn>
This commit is contained in:
parent
4c4cefc19a
commit
731e546166
5 changed files with 41 additions and 49 deletions
|
|
@ -185,7 +185,7 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) {
|
||||||
ssa.OpLOONG64MULD,
|
ssa.OpLOONG64MULD,
|
||||||
ssa.OpLOONG64DIVF,
|
ssa.OpLOONG64DIVF,
|
||||||
ssa.OpLOONG64DIVD,
|
ssa.OpLOONG64DIVD,
|
||||||
ssa.OpLOONG64MULV, ssa.OpLOONG64MULHV, ssa.OpLOONG64MULHVU,
|
ssa.OpLOONG64MULV, ssa.OpLOONG64MULHV, ssa.OpLOONG64MULHVU, ssa.OpLOONG64MULH, ssa.OpLOONG64MULHU,
|
||||||
ssa.OpLOONG64DIVV, ssa.OpLOONG64REMV, ssa.OpLOONG64DIVVU, ssa.OpLOONG64REMVU,
|
ssa.OpLOONG64DIVV, ssa.OpLOONG64REMV, ssa.OpLOONG64DIVVU, ssa.OpLOONG64REMVU,
|
||||||
ssa.OpLOONG64FCOPYSGD:
|
ssa.OpLOONG64FCOPYSGD:
|
||||||
p := s.Prog(v.Op.Asm())
|
p := s.Prog(v.Op.Asm())
|
||||||
|
|
|
||||||
|
|
@ -17,8 +17,8 @@
|
||||||
|
|
||||||
(Hmul64 ...) => (MULHV ...)
|
(Hmul64 ...) => (MULHV ...)
|
||||||
(Hmul64u ...) => (MULHVU ...)
|
(Hmul64u ...) => (MULHVU ...)
|
||||||
(Hmul32 x y) => (SRAVconst (MULV (SignExt32to64 x) (SignExt32to64 y)) [32])
|
(Hmul32 ...) => (MULH ...)
|
||||||
(Hmul32u x y) => (SRLVconst (MULV (ZeroExt32to64 x) (ZeroExt32to64 y)) [32])
|
(Hmul32u ...) => (MULHU ...)
|
||||||
|
|
||||||
(Div64 x y) => (DIVV x y)
|
(Div64 x y) => (DIVV x y)
|
||||||
(Div64u ...) => (DIVVU ...)
|
(Div64u ...) => (DIVVU ...)
|
||||||
|
|
|
||||||
|
|
@ -197,6 +197,8 @@ func init() {
|
||||||
{name: "MULV", argLength: 2, reg: gp21, asm: "MULV", commutative: true, typ: "Int64"}, // arg0 * arg1
|
{name: "MULV", argLength: 2, reg: gp21, asm: "MULV", commutative: true, typ: "Int64"}, // arg0 * arg1
|
||||||
{name: "MULHV", argLength: 2, reg: gp21, asm: "MULHV", commutative: true, typ: "Int64"}, // (arg0 * arg1) >> 64, signed
|
{name: "MULHV", argLength: 2, reg: gp21, asm: "MULHV", commutative: true, typ: "Int64"}, // (arg0 * arg1) >> 64, signed
|
||||||
{name: "MULHVU", argLength: 2, reg: gp21, asm: "MULHVU", commutative: true, typ: "UInt64"}, // (arg0 * arg1) >> 64, unsigned
|
{name: "MULHVU", argLength: 2, reg: gp21, asm: "MULHVU", commutative: true, typ: "UInt64"}, // (arg0 * arg1) >> 64, unsigned
|
||||||
|
{name: "MULH", argLength: 2, reg: gp21, asm: "MULH", commutative: true, typ: "Int32"}, // (arg0 * arg1) >> 32, signed
|
||||||
|
{name: "MULHU", argLength: 2, reg: gp21, asm: "MULHU", commutative: true, typ: "UInt32"}, // (arg0 * arg1) >> 32, unsigned
|
||||||
{name: "DIVV", argLength: 2, reg: gp21, asm: "DIVV", typ: "Int64"}, // arg0 / arg1, signed
|
{name: "DIVV", argLength: 2, reg: gp21, asm: "DIVV", typ: "Int64"}, // arg0 / arg1, signed
|
||||||
{name: "DIVVU", argLength: 2, reg: gp21, asm: "DIVVU", typ: "UInt64"}, // arg0 / arg1, unsigned
|
{name: "DIVVU", argLength: 2, reg: gp21, asm: "DIVVU", typ: "UInt64"}, // arg0 / arg1, unsigned
|
||||||
{name: "REMV", argLength: 2, reg: gp21, asm: "REMV", typ: "Int64"}, // arg0 / arg1, signed
|
{name: "REMV", argLength: 2, reg: gp21, asm: "REMV", typ: "Int64"}, // arg0 / arg1, signed
|
||||||
|
|
|
||||||
|
|
@ -1795,6 +1795,8 @@ const (
|
||||||
OpLOONG64MULV
|
OpLOONG64MULV
|
||||||
OpLOONG64MULHV
|
OpLOONG64MULHV
|
||||||
OpLOONG64MULHVU
|
OpLOONG64MULHVU
|
||||||
|
OpLOONG64MULH
|
||||||
|
OpLOONG64MULHU
|
||||||
OpLOONG64DIVV
|
OpLOONG64DIVV
|
||||||
OpLOONG64DIVVU
|
OpLOONG64DIVVU
|
||||||
OpLOONG64REMV
|
OpLOONG64REMV
|
||||||
|
|
@ -24139,6 +24141,36 @@ var opcodeTable = [...]opInfo{
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "MULH",
|
||||||
|
argLen: 2,
|
||||||
|
commutative: true,
|
||||||
|
asm: loong64.AMULH,
|
||||||
|
reg: regInfo{
|
||||||
|
inputs: []inputInfo{
|
||||||
|
{0, 1073741816}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R21 g R23 R24 R25 R26 R27 R28 R29 R31
|
||||||
|
{1, 1073741817}, // ZERO R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R21 g R23 R24 R25 R26 R27 R28 R29 R31
|
||||||
|
},
|
||||||
|
outputs: []outputInfo{
|
||||||
|
{0, 1071644664}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R21 R23 R24 R25 R26 R27 R28 R29 R31
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "MULHU",
|
||||||
|
argLen: 2,
|
||||||
|
commutative: true,
|
||||||
|
asm: loong64.AMULHU,
|
||||||
|
reg: regInfo{
|
||||||
|
inputs: []inputInfo{
|
||||||
|
{0, 1073741816}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R21 g R23 R24 R25 R26 R27 R28 R29 R31
|
||||||
|
{1, 1073741817}, // ZERO R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R21 g R23 R24 R25 R26 R27 R28 R29 R31
|
||||||
|
},
|
||||||
|
outputs: []outputInfo{
|
||||||
|
{0, 1071644664}, // R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R21 R23 R24 R25 R26 R27 R28 R29 R31
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "DIVV",
|
name: "DIVV",
|
||||||
argLen: 2,
|
argLen: 2,
|
||||||
|
|
|
||||||
|
|
@ -296,9 +296,11 @@ func rewriteValueLOONG64(v *Value) bool {
|
||||||
v.Op = OpLOONG64LoweredGetClosurePtr
|
v.Op = OpLOONG64LoweredGetClosurePtr
|
||||||
return true
|
return true
|
||||||
case OpHmul32:
|
case OpHmul32:
|
||||||
return rewriteValueLOONG64_OpHmul32(v)
|
v.Op = OpLOONG64MULH
|
||||||
|
return true
|
||||||
case OpHmul32u:
|
case OpHmul32u:
|
||||||
return rewriteValueLOONG64_OpHmul32u(v)
|
v.Op = OpLOONG64MULHU
|
||||||
|
return true
|
||||||
case OpHmul64:
|
case OpHmul64:
|
||||||
v.Op = OpLOONG64MULHV
|
v.Op = OpLOONG64MULHV
|
||||||
return true
|
return true
|
||||||
|
|
@ -1576,50 +1578,6 @@ func rewriteValueLOONG64_OpEqPtr(v *Value) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func rewriteValueLOONG64_OpHmul32(v *Value) bool {
|
|
||||||
v_1 := v.Args[1]
|
|
||||||
v_0 := v.Args[0]
|
|
||||||
b := v.Block
|
|
||||||
typ := &b.Func.Config.Types
|
|
||||||
// match: (Hmul32 x y)
|
|
||||||
// result: (SRAVconst (MULV (SignExt32to64 x) (SignExt32to64 y)) [32])
|
|
||||||
for {
|
|
||||||
x := v_0
|
|
||||||
y := v_1
|
|
||||||
v.reset(OpLOONG64SRAVconst)
|
|
||||||
v.AuxInt = int64ToAuxInt(32)
|
|
||||||
v0 := b.NewValue0(v.Pos, OpLOONG64MULV, typ.Int64)
|
|
||||||
v1 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64)
|
|
||||||
v1.AddArg(x)
|
|
||||||
v2 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64)
|
|
||||||
v2.AddArg(y)
|
|
||||||
v0.AddArg2(v1, v2)
|
|
||||||
v.AddArg(v0)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
func rewriteValueLOONG64_OpHmul32u(v *Value) bool {
|
|
||||||
v_1 := v.Args[1]
|
|
||||||
v_0 := v.Args[0]
|
|
||||||
b := v.Block
|
|
||||||
typ := &b.Func.Config.Types
|
|
||||||
// match: (Hmul32u x y)
|
|
||||||
// result: (SRLVconst (MULV (ZeroExt32to64 x) (ZeroExt32to64 y)) [32])
|
|
||||||
for {
|
|
||||||
x := v_0
|
|
||||||
y := v_1
|
|
||||||
v.reset(OpLOONG64SRLVconst)
|
|
||||||
v.AuxInt = int64ToAuxInt(32)
|
|
||||||
v0 := b.NewValue0(v.Pos, OpLOONG64MULV, typ.Int64)
|
|
||||||
v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
|
|
||||||
v1.AddArg(x)
|
|
||||||
v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64)
|
|
||||||
v2.AddArg(y)
|
|
||||||
v0.AddArg2(v1, v2)
|
|
||||||
v.AddArg(v0)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
func rewriteValueLOONG64_OpIsInBounds(v *Value) bool {
|
func rewriteValueLOONG64_OpIsInBounds(v *Value) bool {
|
||||||
v_1 := v.Args[1]
|
v_1 := v.Args[1]
|
||||||
v_0 := v.Args[0]
|
v_0 := v.Args[0]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue