mirror of
https://github.com/golang/go.git
synced 2026-01-29 07:02:05 +03:00
cmd/compile: (loong64) optimize float32(abs|sqrt64(float64(x)))
Ref: #733621 Updates #75463 Change-Id: Idd8821d1713754097a2fe83a050c25d9ec5b17eb Reviewed-on: https://go-review.googlesource.com/c/go/+/735540 Reviewed-by: abner chenc <chenguoqi@loongson.cn> Reviewed-by: Carlos Amedee <carlos@golang.org> Reviewed-by: David Chase <drchase@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
This commit is contained in:
committed by
abner chenc
parent
514790c2b9
commit
f65fe3216e
@@ -529,6 +529,7 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) {
|
||||
ssa.OpLOONG64BITREV4B,
|
||||
ssa.OpLOONG64BITREVW,
|
||||
ssa.OpLOONG64BITREVV,
|
||||
ssa.OpLOONG64ABSF,
|
||||
ssa.OpLOONG64ABSD:
|
||||
p := s.Prog(v.Op.Asm())
|
||||
p.From.Type = obj.TYPE_REG
|
||||
|
||||
@@ -773,6 +773,9 @@
|
||||
(SUBF (NEGF (MULF x y)) z) && z.Block.Func.useFMA(v) => (FNMADDF x y z)
|
||||
(SUBD (NEGD (MULD x y)) z) && z.Block.Func.useFMA(v) => (FNMADDD x y z)
|
||||
|
||||
// Absorb conversion between 32 bit and 64 bit if both src and dst are 32 bit.
|
||||
(MOVDF ((ABS|SQRT)D (MOVFD x))) => ((ABS|SQRT)F x)
|
||||
|
||||
// generic simplifications
|
||||
(ADDV x (NEGV y)) => (SUBV x y)
|
||||
(SUBV x (NEGV y)) => (ADDV x y)
|
||||
|
||||
@@ -169,6 +169,7 @@ func init() {
|
||||
{name: "SQRTD", argLength: 1, reg: fp11, asm: "SQRTD"}, // sqrt(arg0), float64
|
||||
{name: "SQRTF", argLength: 1, reg: fp11, asm: "SQRTF"}, // sqrt(arg0), float32
|
||||
|
||||
{name: "ABSF", argLength: 1, reg: fp11, asm: "ABSF"}, // abs(arg0), float32
|
||||
{name: "ABSD", argLength: 1, reg: fp11, asm: "ABSD"}, // abs(arg0), float64
|
||||
|
||||
{name: "CLZW", argLength: 1, reg: gp11, asm: "CLZW"}, // Count leading (high order) zeroes (returns 0-32)
|
||||
|
||||
@@ -4486,6 +4486,7 @@ const (
|
||||
OpLOONG64NEGD
|
||||
OpLOONG64SQRTD
|
||||
OpLOONG64SQRTF
|
||||
OpLOONG64ABSF
|
||||
OpLOONG64ABSD
|
||||
OpLOONG64CLZW
|
||||
OpLOONG64CLZV
|
||||
@@ -69670,6 +69671,19 @@ var opcodeTable = [...]opInfo{
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "ABSF",
|
||||
argLen: 1,
|
||||
asm: loong64.AABSF,
|
||||
reg: regInfo{
|
||||
inputs: []inputInfo{
|
||||
{0, 4611686017353646080}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26 F27 F28 F29 F30 F31
|
||||
},
|
||||
outputs: []outputInfo{
|
||||
{0, 4611686017353646080}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26 F27 F28 F29 F30 F31
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "ABSD",
|
||||
argLen: 1,
|
||||
|
||||
@@ -360,6 +360,8 @@ func rewriteValueLOONG64(v *Value) bool {
|
||||
return rewriteValueLOONG64_OpLOONG64MOVBstore(v)
|
||||
case OpLOONG64MOVBstoreidx:
|
||||
return rewriteValueLOONG64_OpLOONG64MOVBstoreidx(v)
|
||||
case OpLOONG64MOVDF:
|
||||
return rewriteValueLOONG64_OpLOONG64MOVDF(v)
|
||||
case OpLOONG64MOVDload:
|
||||
return rewriteValueLOONG64_OpLOONG64MOVDload(v)
|
||||
case OpLOONG64MOVDloadidx:
|
||||
@@ -3182,6 +3184,40 @@ func rewriteValueLOONG64_OpLOONG64MOVBstoreidx(v *Value) bool {
|
||||
}
|
||||
return false
|
||||
}
|
||||
func rewriteValueLOONG64_OpLOONG64MOVDF(v *Value) bool {
|
||||
v_0 := v.Args[0]
|
||||
// match: (MOVDF (ABSD (MOVFD x)))
|
||||
// result: (ABSF x)
|
||||
for {
|
||||
if v_0.Op != OpLOONG64ABSD {
|
||||
break
|
||||
}
|
||||
v_0_0 := v_0.Args[0]
|
||||
if v_0_0.Op != OpLOONG64MOVFD {
|
||||
break
|
||||
}
|
||||
x := v_0_0.Args[0]
|
||||
v.reset(OpLOONG64ABSF)
|
||||
v.AddArg(x)
|
||||
return true
|
||||
}
|
||||
// match: (MOVDF (SQRTD (MOVFD x)))
|
||||
// result: (SQRTF x)
|
||||
for {
|
||||
if v_0.Op != OpLOONG64SQRTD {
|
||||
break
|
||||
}
|
||||
v_0_0 := v_0.Args[0]
|
||||
if v_0_0.Op != OpLOONG64MOVFD {
|
||||
break
|
||||
}
|
||||
x := v_0_0.Args[0]
|
||||
v.reset(OpLOONG64SQRTF)
|
||||
v.AddArg(x)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
func rewriteValueLOONG64_OpLOONG64MOVDload(v *Value) bool {
|
||||
v_1 := v.Args[1]
|
||||
v_0 := v.Args[0]
|
||||
|
||||
Reference in New Issue
Block a user