]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/ssa: optimize store-zero rules on loong64
authorlimeidan <limeidan@loongson.cn>
Fri, 18 Oct 2024 01:30:23 +0000 (09:30 +0800)
committerabner chenc <chenguoqi@loongson.cn>
Tue, 22 Oct 2024 01:48:01 +0000 (01:48 +0000)
Change-Id: I4c6ce7b77da05636895127de7bc687c59bd79787
Reviewed-on: https://go-review.googlesource.com/c/go/+/620975
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Reviewed-by: abner chenc <chenguoqi@loongson.cn>
Reviewed-by: Michael Pratt <mpratt@google.com>
src/cmd/compile/internal/ssa/_gen/LOONG64.rules
src/cmd/compile/internal/ssa/rewriteLOONG64.go

index a5000a1facb1a5ee7ae1f879f9868d00c61cdf1a..eec31f9f6cdf8cf5a0bbfb202d80cd987ce569af 100644 (file)
 (MOVWstore [off] {sym} ptr (MOVWreg x) mem) => (MOVWstore [off] {sym} ptr x mem)
 (MOVWstore [off] {sym} ptr (MOVWUreg x) mem) => (MOVWstore [off] {sym} ptr x mem)
 
+(MOVBstore [off] {sym} ptr (MOVVconst [0]) mem) => (MOVBstorezero [off] {sym} ptr mem)
+(MOVHstore [off] {sym} ptr (MOVVconst [0]) mem) => (MOVHstorezero [off] {sym} ptr mem)
+(MOVWstore [off] {sym} ptr (MOVVconst [0]) mem) => (MOVWstorezero [off] {sym} ptr mem)
+(MOVVstore [off] {sym} ptr (MOVVconst [0]) mem) => (MOVVstorezero [off] {sym} ptr mem)
+
 // register indexed load
 (MOVVload [off] {sym} (ADDV ptr idx) mem) && off == 0 && sym == nil => (MOVVloadidx ptr idx mem)
 (MOVWUload [off] {sym} (ADDV ptr idx) mem) && off == 0 && sym == nil => (MOVWUloadidx ptr idx mem)
index 2eb9e64ee3ce738f3ff5694de3a5ca0140d8fa82..30dc407df18bbbebeee73ceeddf0a3682501eeb6 100644 (file)
@@ -2263,6 +2263,22 @@ func rewriteValueLOONG64_OpLOONG64MOVBstore(v *Value) bool {
                v.AddArg3(ptr, x, mem)
                return true
        }
+       // match: (MOVBstore [off] {sym} ptr (MOVVconst [0]) mem)
+       // result: (MOVBstorezero [off] {sym} ptr mem)
+       for {
+               off := auxIntToInt32(v.AuxInt)
+               sym := auxToSym(v.Aux)
+               ptr := v_0
+               if v_1.Op != OpLOONG64MOVVconst || auxIntToInt64(v_1.AuxInt) != 0 {
+                       break
+               }
+               mem := v_2
+               v.reset(OpLOONG64MOVBstorezero)
+               v.AuxInt = int32ToAuxInt(off)
+               v.Aux = symToAux(sym)
+               v.AddArg2(ptr, mem)
+               return true
+       }
        // match: (MOVBstore [off] {sym} (ADDV ptr idx) val mem)
        // cond: off == 0 && sym == nil
        // result: (MOVBstoreidx ptr idx val mem)
@@ -3478,6 +3494,22 @@ func rewriteValueLOONG64_OpLOONG64MOVHstore(v *Value) bool {
                v.AddArg3(ptr, x, mem)
                return true
        }
+       // match: (MOVHstore [off] {sym} ptr (MOVVconst [0]) mem)
+       // result: (MOVHstorezero [off] {sym} ptr mem)
+       for {
+               off := auxIntToInt32(v.AuxInt)
+               sym := auxToSym(v.Aux)
+               ptr := v_0
+               if v_1.Op != OpLOONG64MOVVconst || auxIntToInt64(v_1.AuxInt) != 0 {
+                       break
+               }
+               mem := v_2
+               v.reset(OpLOONG64MOVHstorezero)
+               v.AuxInt = int32ToAuxInt(off)
+               v.Aux = symToAux(sym)
+               v.AddArg2(ptr, mem)
+               return true
+       }
        // match: (MOVHstore [off] {sym} (ADDV ptr idx) val mem)
        // cond: off == 0 && sym == nil
        // result: (MOVHstoreidx ptr idx val mem)
@@ -3892,6 +3924,22 @@ func rewriteValueLOONG64_OpLOONG64MOVVstore(v *Value) bool {
                v.AddArg3(ptr, val, mem)
                return true
        }
+       // match: (MOVVstore [off] {sym} ptr (MOVVconst [0]) mem)
+       // result: (MOVVstorezero [off] {sym} ptr mem)
+       for {
+               off := auxIntToInt32(v.AuxInt)
+               sym := auxToSym(v.Aux)
+               ptr := v_0
+               if v_1.Op != OpLOONG64MOVVconst || auxIntToInt64(v_1.AuxInt) != 0 {
+                       break
+               }
+               mem := v_2
+               v.reset(OpLOONG64MOVVstorezero)
+               v.AuxInt = int32ToAuxInt(off)
+               v.Aux = symToAux(sym)
+               v.AddArg2(ptr, mem)
+               return true
+       }
        // match: (MOVVstore [off] {sym} (ADDV ptr idx) val mem)
        // cond: off == 0 && sym == nil
        // result: (MOVVstoreidx ptr idx val mem)
@@ -4639,6 +4687,22 @@ func rewriteValueLOONG64_OpLOONG64MOVWstore(v *Value) bool {
                v.AddArg3(ptr, x, mem)
                return true
        }
+       // match: (MOVWstore [off] {sym} ptr (MOVVconst [0]) mem)
+       // result: (MOVWstorezero [off] {sym} ptr mem)
+       for {
+               off := auxIntToInt32(v.AuxInt)
+               sym := auxToSym(v.Aux)
+               ptr := v_0
+               if v_1.Op != OpLOONG64MOVVconst || auxIntToInt64(v_1.AuxInt) != 0 {
+                       break
+               }
+               mem := v_2
+               v.reset(OpLOONG64MOVWstorezero)
+               v.AuxInt = int32ToAuxInt(off)
+               v.Aux = symToAux(sym)
+               v.AddArg2(ptr, mem)
+               return true
+       }
        // match: (MOVWstore [off] {sym} (ADDV ptr idx) val mem)
        // cond: off == 0 && sym == nil
        // result: (MOVWstoreidx ptr idx val mem)