]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: use 32x32->64 multiplies on arm64
authorKeith Randall <khr@golang.org>
Mon, 17 Nov 2025 20:47:04 +0000 (12:47 -0800)
committerKeith Randall <khr@google.com>
Mon, 17 Nov 2025 21:45:54 +0000 (13:45 -0800)
Gets rid of some sign extensions.

Change-Id: Ie67ef36b4ca1cd1a2cd9fa5d84578db553578a22
Reviewed-on: https://go-review.googlesource.com/c/go/+/721241
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Junyang Shao <shaojunyang@google.com>
Reviewed-by: Keith Randall <khr@google.com>
src/cmd/compile/internal/ssa/_gen/ARM64.rules
src/cmd/compile/internal/ssa/rewriteARM64.go
test/codegen/arithmetic.go

index f54a692725e5135657c955d36961f69743ae6d1d..04f43f3137fb5f56cc71f8ee4378e344c00b7763 100644 (file)
 
 (Select0 (Mul64uover x y)) => (MUL x y)
 (Select1 (Mul64uover x y)) => (NotEqual (CMPconst (UMULH <typ.UInt64> x y) [0]))
+
+// 32 mul 32 -> 64
+(MUL r:(MOVWUreg x) s:(MOVWUreg y)) && r.Uses == 1 && s.Uses == 1 => (UMULL x y)
+(MUL r:(MOVWreg  x) s:(MOVWreg  y)) && r.Uses == 1 && s.Uses == 1 =>  (MULL x y)
index 6af155883388735f4972cbd6b41ada3dc338c557..6137ec13a0557c2473e7e4701849e9283c2889e3 100644 (file)
@@ -12556,6 +12556,54 @@ func rewriteValueARM64_OpARM64MUL(v *Value) bool {
                }
                break
        }
+       // match: (MUL r:(MOVWUreg x) s:(MOVWUreg y))
+       // cond: r.Uses == 1 && s.Uses == 1
+       // result: (UMULL x y)
+       for {
+               for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+                       r := v_0
+                       if r.Op != OpARM64MOVWUreg {
+                               continue
+                       }
+                       x := r.Args[0]
+                       s := v_1
+                       if s.Op != OpARM64MOVWUreg {
+                               continue
+                       }
+                       y := s.Args[0]
+                       if !(r.Uses == 1 && s.Uses == 1) {
+                               continue
+                       }
+                       v.reset(OpARM64UMULL)
+                       v.AddArg2(x, y)
+                       return true
+               }
+               break
+       }
+       // match: (MUL r:(MOVWreg x) s:(MOVWreg y))
+       // cond: r.Uses == 1 && s.Uses == 1
+       // result: (MULL x y)
+       for {
+               for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
+                       r := v_0
+                       if r.Op != OpARM64MOVWreg {
+                               continue
+                       }
+                       x := r.Args[0]
+                       s := v_1
+                       if s.Op != OpARM64MOVWreg {
+                               continue
+                       }
+                       y := s.Args[0]
+                       if !(r.Uses == 1 && s.Uses == 1) {
+                               continue
+                       }
+                       v.reset(OpARM64MULL)
+                       v.AddArg2(x, y)
+                       return true
+               }
+               break
+       }
        return false
 }
 func rewriteValueARM64_OpARM64MULW(v *Value) bool {
index 6b2c5529e1601e10c4268e93fa51c25f52e210c9..9443d812dc8dd67efc801cccf294cb70e233bd41 100644 (file)
@@ -333,6 +333,15 @@ func Fold2NegMul(a, b int) int {
        return -a * -b
 }
 
+func Mul32(a, b int32) int64 {
+       // arm64:"SMULL" -"MOVW"
+       return int64(a) * int64(b)
+}
+func Mul32U(a, b uint32) uint64 {
+       // arm64:"UMULL" -"MOVWU"
+       return uint64(a) * uint64(b)
+}
+
 // -------------- //
 //    Division    //
 // -------------- //