// Code generated from _gen/LOONG64latelower.rules using 'go generate'; DO NOT EDIT. package rewriteloong64latelower import "cmd/compile/internal/ssa/block" import "cmd/compile/internal/ssa/ssaop" import "cmd/compile/internal/ssa" func RewriteValue(v *ssa.Value) bool { switch v.Op { case ssaop.OpLOONG64MOVBUreg: return rewriteValue_OpLOONG64MOVBUreg(v) case ssaop.OpLOONG64MOVBreg: return rewriteValue_OpLOONG64MOVBreg(v) case ssaop.OpLOONG64MOVHUreg: return rewriteValue_OpLOONG64MOVHUreg(v) case ssaop.OpLOONG64MOVHreg: return rewriteValue_OpLOONG64MOVHreg(v) case ssaop.OpLOONG64MOVVconst: return rewriteValue_OpLOONG64MOVVconst(v) case ssaop.OpLOONG64MOVVnop: return rewriteValue_OpLOONG64MOVVnop(v) case ssaop.OpLOONG64MOVVreg: return rewriteValue_OpLOONG64MOVVreg(v) case ssaop.OpLOONG64MOVWUreg: return rewriteValue_OpLOONG64MOVWUreg(v) case ssaop.OpLOONG64MOVWreg: return rewriteValue_OpLOONG64MOVWreg(v) case ssaop.OpLOONG64SLLVconst: return rewriteValue_OpLOONG64SLLVconst(v) } return false } func rewriteValue_OpLOONG64MOVBUreg(v *ssa.Value) bool { v_0 := v.Args[0] // match: (MOVBUreg x) // cond: ssa.ZeroUpper56Bits(x) // result: x for { x := v_0 if !(ssa.ZeroUpper56Bits(x)) { break } v.CopyOf(x) return true } // match: (MOVBUreg x:(MOVBUload _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVBUload { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVBUreg x:(MOVBUloadidx _ _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVBUloadidx { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVBUreg x:(MOVBUreg _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVBUreg { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } return false } func rewriteValue_OpLOONG64MOVBreg(v *ssa.Value) bool { v_0 := v.Args[0] // match: (MOVBreg x:(MOVBload _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVBload { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVBreg x:(MOVBloadidx _ _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVBloadidx { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVBreg x:(MOVBreg _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVBreg { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } return false } func rewriteValue_OpLOONG64MOVHUreg(v *ssa.Value) bool { v_0 := v.Args[0] // match: (MOVHUreg x) // cond: ssa.ZeroUpper48Bits(x) // result: x for { x := v_0 if !(ssa.ZeroUpper48Bits(x)) { break } v.CopyOf(x) return true } // match: (MOVHUreg x:(MOVBUload _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVBUload { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVHUreg x:(MOVHUload _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVHUload { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVHUreg x:(MOVBUloadidx _ _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVBUloadidx { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVHUreg x:(MOVHUloadidx _ _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVHUloadidx { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVHUreg x:(MOVBUreg _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVBUreg { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVHUreg x:(MOVHUreg _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVHUreg { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } return false } func rewriteValue_OpLOONG64MOVHreg(v *ssa.Value) bool { v_0 := v.Args[0] // match: (MOVHreg x:(MOVBload _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVBload { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVHreg x:(MOVBUload _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVBUload { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVHreg x:(MOVHload _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVHload { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVHreg x:(MOVBloadidx _ _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVBloadidx { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVHreg x:(MOVBUloadidx _ _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVBUloadidx { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVHreg x:(MOVHloadidx _ _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVHloadidx { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVHreg x:(MOVBreg _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVBreg { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVHreg x:(MOVBUreg _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVBUreg { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVHreg x:(MOVHreg _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVHreg { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } return false } func rewriteValue_OpLOONG64MOVVconst(v *ssa.Value) bool { // match: (MOVVconst [0]) // result: (ZERO) for { if ssa.AuxIntToInt64(v.AuxInt) != 0 { break } v.Reset(ssaop.OpLOONG64ZERO) return true } return false } func rewriteValue_OpLOONG64MOVVnop(v *ssa.Value) bool { v_0 := v.Args[0] // match: (MOVVnop (MOVVconst [c])) // result: (MOVVconst [c]) for { if v_0.Op != ssaop.OpLOONG64MOVVconst { break } c := ssa.AuxIntToInt64(v_0.AuxInt) v.Reset(ssaop.OpLOONG64MOVVconst) v.AuxInt = ssa.Int64ToAuxInt(c) return true } return false } func rewriteValue_OpLOONG64MOVVreg(v *ssa.Value) bool { v_0 := v.Args[0] // match: (MOVVreg x) // cond: x.Uses == 1 // result: (MOVVnop x) for { x := v_0 if !(x.Uses == 1) { break } v.Reset(ssaop.OpLOONG64MOVVnop) v.AddArg(x) return true } return false } func rewriteValue_OpLOONG64MOVWUreg(v *ssa.Value) bool { v_0 := v.Args[0] // match: (MOVWUreg x) // cond: ssa.ZeroUpper32Bits(x) // result: x for { x := v_0 if !(ssa.ZeroUpper32Bits(x)) { break } v.CopyOf(x) return true } // match: (MOVWUreg x:(MOVBUload _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVBUload { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVWUreg x:(MOVHUload _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVHUload { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVWUreg x:(MOVWUload _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVWUload { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVWUreg x:(MOVBUloadidx _ _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVBUloadidx { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVWUreg x:(MOVHUloadidx _ _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVHUloadidx { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVWUreg x:(MOVWUloadidx _ _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVWUloadidx { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVWUreg x:(MOVBUreg _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVBUreg { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVWUreg x:(MOVHUreg _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVHUreg { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVWUreg x:(MOVWUreg _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVWUreg { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } return false } func rewriteValue_OpLOONG64MOVWreg(v *ssa.Value) bool { v_0 := v.Args[0] // match: (MOVWreg x:(MOVBload _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVBload { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVWreg x:(MOVBUload _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVBUload { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVWreg x:(MOVHload _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVHload { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVWreg x:(MOVHUload _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVHUload { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVWreg x:(MOVWload _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVWload { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVWreg x:(MOVBloadidx _ _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVBloadidx { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVWreg x:(MOVBUloadidx _ _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVBUloadidx { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVWreg x:(MOVHloadidx _ _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVHloadidx { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVWreg x:(MOVHUloadidx _ _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVHUloadidx { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVWreg x:(MOVWloadidx _ _ _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVWloadidx { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVWreg x:(MOVBreg _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVBreg { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVWreg x:(MOVBUreg _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVBUreg { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVWreg x:(MOVHreg _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVHreg { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } // match: (MOVWreg x:(MOVWreg _)) // result: (MOVVreg x) for { x := v_0 if x.Op != ssaop.OpLOONG64MOVWreg { break } v.Reset(ssaop.OpLOONG64MOVVreg) v.AddArg(x) return true } return false } func rewriteValue_OpLOONG64SLLVconst(v *ssa.Value) bool { v_0 := v.Args[0] // match: (SLLVconst [1] x) // result: (ADDV x x) for { if ssa.AuxIntToInt64(v.AuxInt) != 1 { break } x := v_0 v.Reset(ssaop.OpLOONG64ADDV) v.AddArg2(x, x) return true } return false } func RewriteBlock(b *ssa.Block) bool { switch b.Kind { case block.BlockLOONG64EQZ: // match: (EQZ (XOR x y) yes no) // result: (BEQ x y yes no) for b.Controls[0].Op == ssaop.OpLOONG64XOR { v_0 := b.Controls[0] _ = v_0.Args[1] v_0_0 := v_0.Args[0] v_0_1 := v_0.Args[1] for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 { x := v_0_0 y := v_0_1 b.ResetWithControl2(block.BlockLOONG64BEQ, x, y) return true } } case block.BlockLOONG64NEZ: // match: (NEZ (XOR x y) yes no) // result: (BNE x y yes no) for b.Controls[0].Op == ssaop.OpLOONG64XOR { v_0 := b.Controls[0] _ = v_0.Args[1] v_0_0 := v_0.Args[0] v_0_1 := v_0.Args[1] for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 { x := v_0_0 y := v_0_1 b.ResetWithControl2(block.BlockLOONG64BNE, x, y) return true } } } return false }