]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: simplify the support for 32bit high multiply on loong64
authorXiaolin Zhao <zhaoxiaolin@loongson.cn>
Mon, 1 Sep 2025 07:49:34 +0000 (15:49 +0800)
committerGopher Robot <gobot@golang.org>
Wed, 3 Sep 2025 22:07:48 +0000 (15:07 -0700)
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>
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 bdc8e37b04fe9df588e0a9159de483ec7177d5e5..c917d14298d42566ac6452a8fddde9172bd52334 100644 (file)
@@ -185,7 +185,7 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) {
                ssa.OpLOONG64MULD,
                ssa.OpLOONG64DIVF,
                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.OpLOONG64FCOPYSGD:
                p := s.Prog(v.Op.Asm())
index 6dd28c6d4544e6a97452f8e1b6d80664b55b6ff1..a4a6e901e32960612f74cb7be07b6178b6b9f2c9 100644 (file)
@@ -17,8 +17,8 @@
 
 (Hmul64 ...)  => (MULHV  ...)
 (Hmul64u ...) => (MULHVU ...)
-(Hmul32 x y)  => (SRAVconst (MULV (SignExt32to64 x) (SignExt32to64 y)) [32])
-(Hmul32u x y) => (SRLVconst (MULV (ZeroExt32to64 x) (ZeroExt32to64 y)) [32])
+(Hmul32 ...)  => (MULH  ...)
+(Hmul32u ...) => (MULHU ...)
 
 (Div64 x y) => (DIVV x y)
 (Div64u ...) => (DIVVU ...)
index ed635bfd977eb4d907327ff27f23974a28129155..359cb42056a61cc7dbfaeaab547ebc864d55de92 100644 (file)
@@ -197,6 +197,8 @@ func init() {
                {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: "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: "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
index 7bdb14cec9a5de7b8e9732598e2c96c8f9862232..fca7d810175491115c6164c2674a025747e29bff 100644 (file)
@@ -1795,6 +1795,8 @@ const (
        OpLOONG64MULV
        OpLOONG64MULHV
        OpLOONG64MULHVU
+       OpLOONG64MULH
+       OpLOONG64MULHU
        OpLOONG64DIVV
        OpLOONG64DIVVU
        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",
                argLen: 2,
index 6407628a8b1082dad37c6522df90fcb7792e985d..00731f4b51c93889da8497614514813e3ff12542 100644 (file)
@@ -296,9 +296,11 @@ func rewriteValueLOONG64(v *Value) bool {
                v.Op = OpLOONG64LoweredGetClosurePtr
                return true
        case OpHmul32:
-               return rewriteValueLOONG64_OpHmul32(v)
+               v.Op = OpLOONG64MULH
+               return true
        case OpHmul32u:
-               return rewriteValueLOONG64_OpHmul32u(v)
+               v.Op = OpLOONG64MULHU
+               return true
        case OpHmul64:
                v.Op = OpLOONG64MULHV
                return true
@@ -1576,50 +1578,6 @@ func rewriteValueLOONG64_OpEqPtr(v *Value) bool {
                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 {
        v_1 := v.Args[1]
        v_0 := v.Args[0]