]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: (loong64) optimize float32(abs|sqrt64(float64(x)))
authorXiaolin Zhao <zhaoxiaolin@loongson.cn>
Mon, 12 Jan 2026 08:21:54 +0000 (16:21 +0800)
committerabner chenc <chenguoqi@loongson.cn>
Wed, 28 Jan 2026 14:19:53 +0000 (06:19 -0800)
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>

src/cmd/compile/internal/loong64/ssa.go
src/cmd/compile/internal/ssa/_gen/LOONG64.rules
src/cmd/compile/internal/ssa/_gen/LOONG64Ops.go
src/cmd/compile/internal/ssa/opGen.go
src/cmd/compile/internal/ssa/rewriteLOONG64.go

index dc737732f1b09da786be795614f7f615a0eee19f..2f8cb0585d83090b90098b9b44275faacce7d9a4 100644 (file)
@@ -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
index a40603e93d4caa94e24a7065fa4ac48034693813..9793e6cf34f232e74fb7391138a985ccc8712b56 100644 (file)
 (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)
index 9fd5ede869ee6ddf1c08e9429779c36f42721217..ba8c0679516036bb692e76d9c653d95388ee1016 100644 (file)
@@ -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)
index b5be6e15cbfa33f934ad0838ff91abe0f6a2f07a..ec82ff45a9dc77a59fb391277d6b3f565757c10c 100644 (file)
@@ -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,
index 37aedcbe6e988556a0d3e6bb27496a27b0c26612..93270823d5e15a7425ca8a6466ffd73900d7a968 100644 (file)
@@ -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]