]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: fix If lowering on loong64
authorGuoqi Chen <chenguoqi@loongson.cn>
Wed, 16 Aug 2023 02:22:13 +0000 (10:22 +0800)
committerGopher Robot <gobot@golang.org>
Tue, 21 Nov 2023 19:26:25 +0000 (19:26 +0000)
Update #40724

Co-authored-by: Xiaolin Zhao <zhaoxiaolin@loongson.cn>
Change-Id: I44477e32db765e0299d8361bd2b8d2c95564ed28
Reviewed-on: https://go-review.googlesource.com/c/go/+/521788
Reviewed-by: Meidan Li <limeidan@loongson.cn>
Reviewed-by: David Chase <drchase@google.com>
Auto-Submit: David Chase <drchase@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: David Chase <drchase@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
src/cmd/compile/internal/ssa/_gen/LOONG64.rules
src/cmd/compile/internal/ssa/rewriteLOONG64.go

index b9aaa3ff7f7b4c0d24e7ccb05f69977751a0bc4f..2af95191137e6411c8c47e69c5ac8b5e7694d5bc 100644 (file)
 (GetCallerSP ...) => (LoweredGetCallerSP ...)
 (GetCallerPC ...) => (LoweredGetCallerPC ...)
 
-(If cond yes no) => (NE cond yes no)
+(If cond yes no) => (NE (MOVBUreg <typ.UInt64> cond) yes no)
 
 // Write barrier.
 (WB ...) => (LoweredWB ...)
 (EQ (SGTconst [0] x) yes no) => (GEZ x yes no)
 (NE (SGT x (MOVVconst [0])) yes no) => (GTZ x yes no)
 (EQ (SGT x (MOVVconst [0])) yes no) => (LEZ x yes no)
+(MOVBUreg x:((SGT|SGTU) _ _)) => x
 
 // fold offset into address
 (ADDVconst [off1] (MOVVaddr [off2] {sym} ptr)) && is32Bit(off1+int64(off2)) => (MOVVaddr [int32(off1)+int32(off2)] {sym} ptr)
index 757524bdbb8672c2ba7db84dc5c690bb18dba5f2..edd3ffe6b9adca7c810bf64d031748eb2e119251 100644 (file)
@@ -1773,6 +1773,26 @@ func rewriteValueLOONG64_OpLOONG64MOVBUload(v *Value) bool {
 }
 func rewriteValueLOONG64_OpLOONG64MOVBUreg(v *Value) bool {
        v_0 := v.Args[0]
+       // match: (MOVBUreg x:(SGT _ _))
+       // result: x
+       for {
+               x := v_0
+               if x.Op != OpLOONG64SGT {
+                       break
+               }
+               v.copyOf(x)
+               return true
+       }
+       // match: (MOVBUreg x:(SGTU _ _))
+       // result: x
+       for {
+               x := v_0
+               if x.Op != OpLOONG64SGTU {
+                       break
+               }
+               v.copyOf(x)
+               return true
+       }
        // match: (MOVBUreg x:(MOVBUload _ _))
        // result: (MOVVreg x)
        for {
@@ -7608,6 +7628,7 @@ func rewriteValueLOONG64_OpZero(v *Value) bool {
        return false
 }
 func rewriteBlockLOONG64(b *Block) bool {
+       typ := &b.Func.Config.Types
        switch b.Kind {
        case BlockLOONG64EQ:
                // match: (EQ (FPFlagTrue cmp) yes no)
@@ -7807,10 +7828,12 @@ func rewriteBlockLOONG64(b *Block) bool {
                }
        case BlockIf:
                // match: (If cond yes no)
-               // result: (NE cond yes no)
+               // result: (NE (MOVBUreg <typ.UInt64> cond) yes no)
                for {
                        cond := b.Controls[0]
-                       b.resetWithControl(BlockLOONG64NE, cond)
+                       v0 := b.NewValue0(cond.Pos, OpLOONG64MOVBUreg, typ.UInt64)
+                       v0.AddArg(cond)
+                       b.resetWithControl(BlockLOONG64NE, v0)
                        return true
                }
        case BlockLOONG64LEZ: