From bd6d78ef37b5a607abfb530f3e353cfa653492f1 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Mon, 6 Jan 2020 22:24:02 -0800 Subject: [PATCH] cmd/compile: use loops to handle commutative ops in rules Prior to this change, we generated additional rules at rulegen time for all possible combinations of args to commutative ops. This is simple and works well, but leads to lots of generated rules. This in turn has increased the size of the compiler, made it hard to compile package ssa on small machines, and provided a disincentive to mark some ops as commutative. This change reworks how we handle commutative ops. Instead of generating a rule per argument permutation, we generate a series of nested loops, one for each commutative op. Each loop tries both possible argument orderings. I also considered attempting to canonicalize the inputs to the rewrite rules. However, because either or both arguments might be nothing more than an identifier, and because there can be arbitrary conditions to evaluate during matching, I did not see how to proceed. The duplicate rule detection now sorts arguments to commutative ops, so that it can detect commutative-only duplicates. There may be further optimizations to the new generated code. In particular, we may not be removing as many bounds checks as before; I have not investigated deeply. If more work here is needed, we could do it with more hints or with improvements to the prove pass. This change has almost no impact on the generated code. It does not pass toolstash-check, however. In a handful of functions, for reasons I do not understand, there are minor position changes. For the entire series ending at this change, there is negligible compiler performance impact. The compiler binary shrinks by about 15%, and package ssa shrinks by about 25%. Package ssa also compiles ~25% faster with ~25% less memory. Change-Id: Ia2ee9ceae7be08a17342319d4e31b0bb238a2ee4 Reviewed-on: https://go-review.googlesource.com/c/go/+/213703 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/compile/internal/ssa/gen/rulegen.go | 245 +- src/cmd/compile/internal/ssa/rewrite386.go | 17838 ++--- src/cmd/compile/internal/ssa/rewriteAMD64.go | 33112 +++------ src/cmd/compile/internal/ssa/rewriteARM.go | 4657 +- src/cmd/compile/internal/ssa/rewriteARM64.go | 37078 ++++------ src/cmd/compile/internal/ssa/rewriteMIPS.go | 952 +- src/cmd/compile/internal/ssa/rewriteMIPS64.go | 463 +- src/cmd/compile/internal/ssa/rewritePPC64.go | 13619 +--- .../compile/internal/ssa/rewriteRISCV64.go | 45 +- src/cmd/compile/internal/ssa/rewriteS390X.go | 26117 ++----- .../internal/ssa/rewrite_rule_idea.txt | 17 + src/cmd/compile/internal/ssa/rewritedec.go | 6 +- .../compile/internal/ssa/rewritegeneric.go | 59114 +++++----------- 13 files changed, 59508 insertions(+), 133755 deletions(-) create mode 100644 src/cmd/compile/internal/ssa/rewrite_rule_idea.txt diff --git a/src/cmd/compile/internal/ssa/gen/rulegen.go b/src/cmd/compile/internal/ssa/gen/rulegen.go index 46d4eee72c..77927cfbd3 100644 --- a/src/cmd/compile/internal/ssa/gen/rulegen.go +++ b/src/cmd/compile/internal/ssa/gen/rulegen.go @@ -140,18 +140,16 @@ func genRulesSuffix(arch arch, suff string) { loc := fmt.Sprintf("%s%s.rules:%d", arch.name, suff, ruleLineno) for _, rule2 := range expandOr(rule) { - for _, rule3 := range commute(rule2, arch) { - r := Rule{rule: rule3, loc: loc} - if rawop := strings.Split(rule3, " ")[0][1:]; isBlock(rawop, arch) { - blockrules[rawop] = append(blockrules[rawop], r) - continue - } - // Do fancier value op matching. - match, _, _ := r.parse() - op, oparch, _, _, _, _ := parseValue(match, arch, loc) - opname := fmt.Sprintf("Op%s%s", oparch, op.name) - oprules[opname] = append(oprules[opname], r) + r := Rule{rule: rule2, loc: loc} + if rawop := strings.Split(rule2, " ")[0][1:]; isBlock(rawop, arch) { + blockrules[rawop] = append(blockrules[rawop], r) + continue } + // Do fancier value op matching. + match, _, _ := r.parse() + op, oparch, _, _, _, _ := parseValue(match, arch, loc) + opname := fmt.Sprintf("Op%s%s", oparch, op.name) + oprules[opname] = append(oprules[opname], r) } rule = "" ruleLineno = 0 @@ -489,6 +487,8 @@ func (u *unusedInspector) node(node ast.Node) { u.scope.objects[name.Name] = obj case *ast.ReturnStmt: u.exprs(node.Results) + case *ast.IncDecStmt: + u.node(node.X) // expressions @@ -554,6 +554,7 @@ type object struct { func fprint(w io.Writer, n Node) { switch n := n.(type) { case *File: + file := n seenRewrite := make(map[[3]string]string) fmt.Fprintf(w, "// Code generated from gen/%s%s.rules; DO NOT EDIT.\n", n.arch.name, n.suffix) fmt.Fprintf(w, "// generated with: cd gen; go run *.go\n") @@ -575,7 +576,11 @@ func fprint(w io.Writer, n Node) { fprint(w, n) if rr, ok := n.(*RuleRewrite); ok { - k := [3]string{rr.match, rr.cond, rr.result} + k := [3]string{ + normalizeMatch(rr.match, file.arch), + normalizeWhitespace(rr.cond), + normalizeWhitespace(rr.result), + } if prev, ok := seenRewrite[k]; ok { log.Fatalf("duplicate rule %s, previously seen at %s\n", rr.loc, prev) } else { @@ -610,10 +615,27 @@ func fprint(w io.Writer, n Node) { } fmt.Fprintf(w, "// result: %s\n", n.result) fmt.Fprintf(w, "for %s {\n", n.check) + nCommutative := 0 for _, n := range n.list { + if b, ok := n.(*CondBreak); ok { + b.insideCommuteLoop = nCommutative > 0 + } fprint(w, n) + if loop, ok := n.(StartCommuteLoop); ok { + if nCommutative != loop.depth { + panic("mismatch commute loop depth") + } + nCommutative++ + } + } + fmt.Fprintf(w, "return true\n") + for i := 0; i < nCommutative; i++ { + fmt.Fprintln(w, "}") } - fmt.Fprintf(w, "return true\n}\n") + if n.commuteDepth > 0 && n.canFail { + fmt.Fprint(w, "break\n") + } + fmt.Fprintf(w, "}\n") case *Declare: fmt.Fprintf(w, "%s := ", n.name) fprint(w, n.value) @@ -621,12 +643,20 @@ func fprint(w io.Writer, n Node) { case *CondBreak: fmt.Fprintf(w, "if ") fprint(w, n.expr) - fmt.Fprintf(w, " {\nbreak\n}\n") + fmt.Fprintf(w, " {\n") + if n.insideCommuteLoop { + fmt.Fprintf(w, "continue") + } else { + fmt.Fprintf(w, "break") + } + fmt.Fprintf(w, "\n}\n") case ast.Node: printConfig.Fprint(w, emptyFset, n) if _, ok := n.(ast.Stmt); ok { fmt.Fprintln(w) } + case StartCommuteLoop: + fmt.Fprintf(w, "for _i%d := 0; _i%d <= 1; _i%d++ {\n", n.depth, n.depth, n.depth) default: log.Fatalf("cannot print %T", n) } @@ -714,15 +744,20 @@ type ( match, cond, result string // top comments check string // top-level boolean expression - alloc int // for unique var names - loc string // file name & line number of the original rule + alloc int // for unique var names + loc string // file name & line number of the original rule + commuteDepth int // used to track depth of commute loops } Declare struct { name string value ast.Expr } CondBreak struct { - expr ast.Expr + expr ast.Expr + insideCommuteLoop bool + } + StartCommuteLoop struct { + depth int } ) @@ -759,7 +794,7 @@ func declf(name, format string, a ...interface{}) *Declare { // breakf constructs a simple "if cond { break }" statement, using exprf for its // condition. func breakf(format string, a ...interface{}) *CondBreak { - return &CondBreak{exprf(format, a...)} + return &CondBreak{expr: exprf(format, a...)} } func genBlockRewrite(rule Rule, arch arch, data blockData) *RuleRewrite { @@ -779,7 +814,7 @@ func genBlockRewrite(rule Rule, arch arch, data blockData) *RuleRewrite { cname := fmt.Sprintf("b.Controls[%v]", i) vname := fmt.Sprintf("v_%v", i) rr.add(declf(vname, cname)) - p, op := genMatch0(rr, arch, arg, vname) + p, op := genMatch0(rr, arch, arg, vname, nil) // TODO: pass non-nil cnt? if op != "" { check := fmt.Sprintf("%s.Op == %s", cname, op) if rr.check == "" { @@ -893,10 +928,11 @@ func genBlockRewrite(rule Rule, arch arch, data blockData) *RuleRewrite { // genMatch returns the variable whose source position should be used for the // result (or "" if no opinion), and a boolean that reports whether the match can fail. func genMatch(rr *RuleRewrite, arch arch, match string) (pos, checkOp string) { - return genMatch0(rr, arch, match, "v") + cnt := varCount(rr.match, rr.cond) + return genMatch0(rr, arch, match, "v", cnt) } -func genMatch0(rr *RuleRewrite, arch arch, match, v string) (pos, checkOp string) { +func genMatch0(rr *RuleRewrite, arch arch, match, v string, cnt map[string]int) (pos, checkOp string) { if match[0] != '(' || match[len(match)-1] != ')' { log.Fatalf("non-compound expr in genMatch0: %q", match) } @@ -927,10 +963,20 @@ func genMatch0(rr *RuleRewrite, arch arch, match, v string) (pos, checkOp string } } + commutative := op.commutative + if commutative { + if args[0] == args[1] { + commutative = false + } + if cnt[args[0]] == 1 && cnt[args[1]] == 1 { + commutative = false + } + } + // Access last argument first to minimize bounds checks. if n := len(args); n > 1 { a := args[n-1] - if a != "_" && !rr.declared(a) && token.IsIdentifier(a) { + if a != "_" && !rr.declared(a) && token.IsIdentifier(a) && !(commutative && len(args) == 2) { rr.add(declf(a, "%s.Args[%d]", v, n-1)) // delete the last argument so it is not reprocessed @@ -939,7 +985,22 @@ func genMatch0(rr *RuleRewrite, arch arch, match, v string) (pos, checkOp string rr.add(stmtf("_ = %s.Args[%d]", v, n-1)) } } + var commuteDepth int + if commutative { + commuteDepth = rr.commuteDepth + rr.add(StartCommuteLoop{commuteDepth}) + rr.commuteDepth++ + } for i, arg := range args { + argidx := strconv.Itoa(i) + if commutative { + switch i { + case 0: + argidx = fmt.Sprintf("_i%d", commuteDepth) + case 1: + argidx = fmt.Sprintf("1^_i%d", commuteDepth) + } + } if arg == "_" { continue } @@ -950,9 +1011,9 @@ func genMatch0(rr *RuleRewrite, arch arch, match, v string) (pos, checkOp string // the old definition and the new definition match. // For example, (add x x). Equality is just pointer equality // on Values (so cse is important to do before lowering). - rr.add(breakf("%s != %s.Args[%d]", arg, v, i)) + rr.add(breakf("%s != %s.Args[%s]", arg, v, argidx)) } else { - rr.add(declf(arg, "%s.Args[%d]", v, i)) + rr.add(declf(arg, "%s.Args[%s]", v, argidx)) } continue } @@ -969,10 +1030,10 @@ func genMatch0(rr *RuleRewrite, arch arch, match, v string) (pos, checkOp string log.Fatalf("don't name args 'b', it is ambiguous with blocks") } - rr.add(declf(argname, "%s.Args[%d]", v, i)) + rr.add(declf(argname, "%s.Args[%s]", v, argidx)) bexpr := exprf("%s.Op != addLater", argname) rr.add(&CondBreak{expr: bexpr}) - argPos, argCheckOp := genMatch0(rr, arch, arg, argname) + argPos, argCheckOp := genMatch0(rr, arch, arg, argname, cnt) bexpr.(*ast.BinaryExpr).Y.(*ast.Ident).Name = argCheckOp if argPos != "" { @@ -1334,99 +1395,6 @@ func expandOr(r string) []string { return res } -// commute returns all equivalent rules to r after applying all possible -// argument swaps to the commutable ops in r. -// Potentially exponential, be careful. -func commute(r string, arch arch) []string { - match, cond, result := Rule{rule: r}.parse() - a := commute1(match, varCount(match, cond), arch) - for i, m := range a { - if cond != "" { - m += " && " + cond - } - m += " -> " + result - a[i] = m - } - if len(a) == 1 && normalizeWhitespace(r) != normalizeWhitespace(a[0]) { - fmt.Println(normalizeWhitespace(r)) - fmt.Println(normalizeWhitespace(a[0])) - log.Fatalf("commute() is not the identity for noncommuting rule") - } - if false && len(a) > 1 { - fmt.Println(r) - for _, x := range a { - fmt.Println(" " + x) - } - } - return a -} - -func commute1(m string, cnt map[string]int, arch arch) []string { - if m[0] == '<' || m[0] == '[' || m[0] == '{' || token.IsIdentifier(m) { - return []string{m} - } - // Split up input. - var prefix string - if i := strings.Index(m, ":"); i >= 0 && token.IsIdentifier(m[:i]) { - prefix = m[:i+1] - m = m[i+1:] - } - if m[0] != '(' || m[len(m)-1] != ')' { - log.Fatalf("non-compound expr in commute1: %q", m) - } - s := split(m[1 : len(m)-1]) - op := s[0] - - commutative := opIsCommutative(op, arch) - var idx0, idx1 int - if commutative { - // Find indexes of two args we can swap. - for i, arg := range s { - if i == 0 || arg[0] == '<' || arg[0] == '[' || arg[0] == '{' { - continue - } - if idx0 == 0 { - idx0 = i - continue - } - if idx1 == 0 { - idx1 = i - break - } - } - if idx1 == 0 { - log.Fatalf("couldn't find first two args of commutative op %q", s[0]) - } - if cnt[s[idx0]] == 1 && cnt[s[idx1]] == 1 || s[idx0] == s[idx1] { - // When we have (Add x y) with no other uses of x and y in the matching rule, - // then we can skip the commutative match (Add y x). - // Same for (Add x x), for any x. - commutative = false - } - } - - // Recursively commute arguments. - a := make([][]string, len(s)) - for i, arg := range s { - a[i] = commute1(arg, cnt, arch) - } - - // Choose all possibilities from all args. - r := crossProduct(a) - - // If commutative, do that again with its two args reversed. - if commutative { - a[idx0], a[idx1] = a[idx1], a[idx0] - r = append(r, crossProduct(a)...) - } - - // Construct result. - for i, x := range r { - r[i] = prefix + "(" + x + ")" - } - return r -} - // varCount returns a map which counts the number of occurrences of // Value variables in the s-expression "match" and the Go expression "cond". func varCount(match, cond string) map[string]int { @@ -1469,22 +1437,6 @@ func varCount1(m string, cnt map[string]int) { } } -// crossProduct returns all possible values -// x[0][i] + " " + x[1][j] + " " + ... + " " + x[len(x)-1][k] -// for all valid values of i, j, ..., k. -func crossProduct(x [][]string) []string { - if len(x) == 1 { - return x[0] - } - var r []string - for _, tail := range crossProduct(x[1:]) { - for _, first := range x[0] { - r = append(r, first+" "+tail) - } - } - return r -} - // normalizeWhitespace replaces 2+ whitespace sequences with a single space. func normalizeWhitespace(x string) string { x = strings.Join(strings.Fields(x), " ") @@ -1516,3 +1468,26 @@ func opIsCommutative(op string, arch arch) bool { } return false } + +func normalizeMatch(m string, arch arch) string { + if token.IsIdentifier(m) { + return m + } + op, typ, auxint, aux, args := extract(m) + if opIsCommutative(op, arch) { + if args[1] < args[0] { + args[0], args[1] = args[1], args[0] + } + } + s := new(strings.Builder) + fmt.Fprintf(s, "%s <%s> [%s] {%s}", op, typ, auxint, aux) + for _, arg := range args { + var prefix string + if i := strings.Index(arg, ":"); i >= 0 && token.IsIdentifier(arg[:i]) { + prefix = arg[:i+1] + arg = arg[i+1:] + } + fmt.Fprint(s, " ", prefix, normalizeMatch(arg, arch)) + } + return s.String() +} diff --git a/src/cmd/compile/internal/ssa/rewrite386.go b/src/cmd/compile/internal/ssa/rewrite386.go index dba61cf347..464e03ee41 100644 --- a/src/cmd/compile/internal/ssa/rewrite386.go +++ b/src/cmd/compile/internal/ssa/rewrite386.go @@ -11,7 +11,7 @@ func rewriteValue386(v *Value) bool { case Op386ADCL: return rewriteValue386_Op386ADCL_0(v) case Op386ADDL: - return rewriteValue386_Op386ADDL_0(v) || rewriteValue386_Op386ADDL_10(v) || rewriteValue386_Op386ADDL_20(v) + return rewriteValue386_Op386ADDL_0(v) || rewriteValue386_Op386ADDL_10(v) case Op386ADDLcarry: return rewriteValue386_Op386ADDLcarry_0(v) case Op386ADDLconst: @@ -105,7 +105,7 @@ func rewriteValue386(v *Value) bool { case Op386MOVBstoreconstidx1: return rewriteValue386_Op386MOVBstoreconstidx1_0(v) case Op386MOVBstoreidx1: - return rewriteValue386_Op386MOVBstoreidx1_0(v) || rewriteValue386_Op386MOVBstoreidx1_10(v) || rewriteValue386_Op386MOVBstoreidx1_20(v) + return rewriteValue386_Op386MOVBstoreidx1_0(v) case Op386MOVLload: return rewriteValue386_Op386MOVLload_0(v) case Op386MOVLloadidx1: @@ -113,7 +113,7 @@ func rewriteValue386(v *Value) bool { case Op386MOVLloadidx4: return rewriteValue386_Op386MOVLloadidx4_0(v) case Op386MOVLstore: - return rewriteValue386_Op386MOVLstore_0(v) || rewriteValue386_Op386MOVLstore_10(v) || rewriteValue386_Op386MOVLstore_20(v) + return rewriteValue386_Op386MOVLstore_0(v) || rewriteValue386_Op386MOVLstore_10(v) case Op386MOVLstoreconst: return rewriteValue386_Op386MOVLstoreconst_0(v) case Op386MOVLstoreconstidx1: @@ -165,7 +165,7 @@ func rewriteValue386(v *Value) bool { case Op386MOVWloadidx2: return rewriteValue386_Op386MOVWloadidx2_0(v) case Op386MOVWstore: - return rewriteValue386_Op386MOVWstore_0(v) || rewriteValue386_Op386MOVWstore_10(v) + return rewriteValue386_Op386MOVWstore_0(v) case Op386MOVWstoreconst: return rewriteValue386_Op386MOVWstoreconst_0(v) case Op386MOVWstoreconstidx1: @@ -173,7 +173,7 @@ func rewriteValue386(v *Value) bool { case Op386MOVWstoreconstidx2: return rewriteValue386_Op386MOVWstoreconstidx2_0(v) case Op386MOVWstoreidx1: - return rewriteValue386_Op386MOVWstoreidx1_0(v) || rewriteValue386_Op386MOVWstoreidx1_10(v) + return rewriteValue386_Op386MOVWstoreidx1_0(v) case Op386MOVWstoreidx2: return rewriteValue386_Op386MOVWstoreidx2_0(v) case Op386MULL: @@ -197,7 +197,7 @@ func rewriteValue386(v *Value) bool { case Op386NOTL: return rewriteValue386_Op386NOTL_0(v) case Op386ORL: - return rewriteValue386_Op386ORL_0(v) || rewriteValue386_Op386ORL_10(v) || rewriteValue386_Op386ORL_20(v) || rewriteValue386_Op386ORL_30(v) || rewriteValue386_Op386ORL_40(v) || rewriteValue386_Op386ORL_50(v) + return rewriteValue386_Op386ORL_0(v) || rewriteValue386_Op386ORL_10(v) case Op386ORLconst: return rewriteValue386_Op386ORLconst_0(v) case Op386ORLconstmodify: @@ -293,7 +293,7 @@ func rewriteValue386(v *Value) bool { case Op386SUBSSload: return rewriteValue386_Op386SUBSSload_0(v) case Op386XORL: - return rewriteValue386_Op386XORL_0(v) || rewriteValue386_Op386XORL_10(v) + return rewriteValue386_Op386XORL_0(v) case Op386XORLconst: return rewriteValue386_Op386XORLconst_0(v) case Op386XORLconstmodify: @@ -712,33 +712,20 @@ func rewriteValue386_Op386ADCL_0(v *Value) bool { // result: (ADCLconst [c] x f) for { f := v.Args[2] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386MOVLconst { - break - } - c := v_1.AuxInt - v.reset(Op386ADCLconst) - v.AuxInt = c - v.AddArg(x) - v.AddArg(f) - return true - } - // match: (ADCL (MOVLconst [c]) x f) - // result: (ADCLconst [c] x f) - for { - f := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386MOVLconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386MOVLconst { + continue + } + c := v_1.AuxInt + v.reset(Op386ADCLconst) + v.AuxInt = c + v.AddArg(x) + v.AddArg(f) + return true } - c := v_0.AuxInt - x := v.Args[1] - v.reset(Op386ADCLconst) - v.AuxInt = c - v.AddArg(x) - v.AddArg(f) - return true + break } return false } @@ -747,78 +734,46 @@ func rewriteValue386_Op386ADDL_0(v *Value) bool { // result: (ADDLconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386MOVLconst { - break - } - c := v_1.AuxInt - v.reset(Op386ADDLconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ADDL (MOVLconst [c]) x) - // result: (ADDLconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386MOVLconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386MOVLconst { + continue + } + c := v_1.AuxInt + v.reset(Op386ADDLconst) + v.AuxInt = c + v.AddArg(x) + return true } - c := v_0.AuxInt - v.reset(Op386ADDLconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (ADDL (SHLLconst [c] x) (SHRLconst [d] x)) // cond: d == 32-c // result: (ROLLconst [c] x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386SHLLconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHRLconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(d == 32-c) { - break - } - v.reset(Op386ROLLconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ADDL (SHRLconst [d] x) (SHLLconst [c] x)) - // cond: d == 32-c - // result: (ROLLconst [c] x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386SHRLconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHLLconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(d == 32-c) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != Op386SHLLconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386SHRLconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(d == 32-c) { + continue + } + v.reset(Op386ROLLconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(Op386ROLLconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (ADDL (SHLLconst x [c]) (SHRWconst x [d])) // cond: c < 16 && d == 16-c && t.Size() == 2 @@ -826,49 +781,27 @@ func rewriteValue386_Op386ADDL_0(v *Value) bool { for { t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386SHLLconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHRWconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(c < 16 && d == 16-c && t.Size() == 2) { - break - } - v.reset(Op386ROLWconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ADDL (SHRWconst x [d]) (SHLLconst x [c])) - // cond: c < 16 && d == 16-c && t.Size() == 2 - // result: (ROLWconst x [c]) - for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386SHRWconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHLLconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(c < 16 && d == 16-c && t.Size() == 2) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != Op386SHLLconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386SHRWconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(c < 16 && d == 16-c && t.Size() == 2) { + continue + } + v.reset(Op386ROLWconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(Op386ROLWconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (ADDL (SHLLconst x [c]) (SHRBconst x [d])) // cond: c < 8 && d == 8-c && t.Size() == 1 @@ -876,700 +809,788 @@ func rewriteValue386_Op386ADDL_0(v *Value) bool { for { t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386SHLLconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHRBconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(c < 8 && d == 8-c && t.Size() == 1) { - break - } - v.reset(Op386ROLBconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ADDL (SHRBconst x [d]) (SHLLconst x [c])) - // cond: c < 8 && d == 8-c && t.Size() == 1 - // result: (ROLBconst x [c]) - for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386SHRBconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHLLconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(c < 8 && d == 8-c && t.Size() == 1) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != Op386SHLLconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386SHRBconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(c < 8 && d == 8-c && t.Size() == 1) { + continue + } + v.reset(Op386ROLBconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(Op386ROLBconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (ADDL x (SHLLconst [3] y)) // result: (LEAL8 x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHLLconst || v_1.AuxInt != 3 { - break - } - y := v_1.Args[0] - v.reset(Op386LEAL8) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADDL (SHLLconst [3] y) x) - // result: (LEAL8 x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386SHLLconst || v_0.AuxInt != 3 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386SHLLconst || v_1.AuxInt != 3 { + continue + } + y := v_1.Args[0] + v.reset(Op386LEAL8) + v.AddArg(x) + v.AddArg(y) + return true } - y := v_0.Args[0] - v.reset(Op386LEAL8) - v.AddArg(x) - v.AddArg(y) - return true + break } - return false -} -func rewriteValue386_Op386ADDL_10(v *Value) bool { // match: (ADDL x (SHLLconst [2] y)) // result: (LEAL4 x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHLLconst || v_1.AuxInt != 2 { - break - } - y := v_1.Args[0] - v.reset(Op386LEAL4) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADDL (SHLLconst [2] y) x) - // result: (LEAL4 x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386SHLLconst || v_0.AuxInt != 2 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386SHLLconst || v_1.AuxInt != 2 { + continue + } + y := v_1.Args[0] + v.reset(Op386LEAL4) + v.AddArg(x) + v.AddArg(y) + return true } - y := v_0.Args[0] - v.reset(Op386LEAL4) - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (ADDL x (SHLLconst [1] y)) // result: (LEAL2 x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHLLconst || v_1.AuxInt != 1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386SHLLconst || v_1.AuxInt != 1 { + continue + } + y := v_1.Args[0] + v.reset(Op386LEAL2) + v.AddArg(x) + v.AddArg(y) + return true } - y := v_1.Args[0] - v.reset(Op386LEAL2) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (ADDL (SHLLconst [1] y) x) + // match: (ADDL x (ADDL y y)) // result: (LEAL2 x y) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386SHLLconst || v_0.AuxInt != 1 { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386ADDL { + continue + } + y := v_1.Args[1] + if y != v_1.Args[0] { + continue + } + v.reset(Op386LEAL2) + v.AddArg(x) + v.AddArg(y) + return true } - y := v_0.Args[0] - v.reset(Op386LEAL2) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (ADDL x (ADDL y y)) - // result: (LEAL2 x y) + // match: (ADDL x (ADDL x y)) + // result: (LEAL2 y x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDL { - break - } - y := v_1.Args[1] - if y != v_1.Args[0] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386ADDL { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + if x != v_1.Args[_i1] { + continue + } + y := v_1.Args[1^_i1] + v.reset(Op386LEAL2) + v.AddArg(y) + v.AddArg(x) + return true + } } - v.reset(Op386LEAL2) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (ADDL (ADDL y y) x) - // result: (LEAL2 x y) + // match: (ADDL (ADDLconst [c] x) y) + // result: (LEAL1 [c] x y) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386ADDL { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != Op386ADDLconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + y := v.Args[1^_i0] + v.reset(Op386LEAL1) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true } - y := v_0.Args[1] - if y != v_0.Args[0] { - break + break + } + return false +} +func rewriteValue386_Op386ADDL_10(v *Value) bool { + // match: (ADDL x (LEAL [c] {s} y)) + // cond: x.Op != OpSB && y.Op != OpSB + // result: (LEAL1 [c] {s} x y) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386LEAL { + continue + } + c := v_1.AuxInt + s := v_1.Aux + y := v_1.Args[0] + if !(x.Op != OpSB && y.Op != OpSB) { + continue + } + v.reset(Op386LEAL1) + v.AuxInt = c + v.Aux = s + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(Op386LEAL2) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (ADDL x (ADDL x y)) - // result: (LEAL2 y x) + // match: (ADDL x l:(MOVLload [off] {sym} ptr mem)) + // cond: canMergeLoadClobber(v, l, x) && clobber(l) + // result: (ADDLload x [off] {sym} ptr mem) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDL { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != Op386MOVLload { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[1] + ptr := l.Args[0] + if !(canMergeLoadClobber(v, l, x) && clobber(l)) { + continue + } + v.reset(Op386ADDLload) + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - y := v_1.Args[1] - if x != v_1.Args[0] { - break + break + } + // match: (ADDL x l:(MOVLloadidx4 [off] {sym} ptr idx mem)) + // cond: canMergeLoadClobber(v, l, x) && clobber(l) + // result: (ADDLloadidx4 x [off] {sym} ptr idx mem) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != Op386MOVLloadidx4 { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[2] + ptr := l.Args[0] + idx := l.Args[1] + if !(canMergeLoadClobber(v, l, x) && clobber(l)) { + continue + } + v.reset(Op386ADDLloadidx4) + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(Op386LEAL2) - v.AddArg(y) - v.AddArg(x) - return true + break } - // match: (ADDL x (ADDL y x)) - // result: (LEAL2 y x) + // match: (ADDL x (NEGL y)) + // result: (SUBL x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDL { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386NEGL { + continue + } + y := v_1.Args[0] + v.reset(Op386SUBL) + v.AddArg(x) + v.AddArg(y) + return true } - _ = v_1.Args[1] - y := v_1.Args[0] - if x != v_1.Args[1] { - break + break + } + return false +} +func rewriteValue386_Op386ADDLcarry_0(v *Value) bool { + // match: (ADDLcarry x (MOVLconst [c])) + // result: (ADDLconstcarry [c] x) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386MOVLconst { + continue + } + c := v_1.AuxInt + v.reset(Op386ADDLconstcarry) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(Op386LEAL2) - v.AddArg(y) - v.AddArg(x) - return true + break } - // match: (ADDL (ADDL x y) x) - // result: (LEAL2 y x) + return false +} +func rewriteValue386_Op386ADDLconst_0(v *Value) bool { + // match: (ADDLconst [c] (ADDL x y)) + // result: (LEAL1 [c] x y) for { - x := v.Args[1] + c := v.AuxInt v_0 := v.Args[0] if v_0.Op != Op386ADDL { break } y := v_0.Args[1] - if x != v_0.Args[0] { - break - } - v.reset(Op386LEAL2) - v.AddArg(y) + x := v_0.Args[0] + v.reset(Op386LEAL1) + v.AuxInt = c v.AddArg(x) + v.AddArg(y) return true } - // match: (ADDL (ADDL y x) x) - // result: (LEAL2 y x) + // match: (ADDLconst [c] (LEAL [d] {s} x)) + // cond: is32Bit(c+d) + // result: (LEAL [c+d] {s} x) for { - x := v.Args[1] + c := v.AuxInt v_0 := v.Args[0] - if v_0.Op != Op386ADDL { + if v_0.Op != Op386LEAL { break } - _ = v_0.Args[1] - y := v_0.Args[0] - if x != v_0.Args[1] { + d := v_0.AuxInt + s := v_0.Aux + x := v_0.Args[0] + if !(is32Bit(c + d)) { break } - v.reset(Op386LEAL2) - v.AddArg(y) + v.reset(Op386LEAL) + v.AuxInt = c + d + v.Aux = s v.AddArg(x) return true } - return false -} -func rewriteValue386_Op386ADDL_20(v *Value) bool { - // match: (ADDL (ADDLconst [c] x) y) - // result: (LEAL1 [c] x y) + // match: (ADDLconst [c] (LEAL1 [d] {s} x y)) + // cond: is32Bit(c+d) + // result: (LEAL1 [c+d] {s} x y) for { - y := v.Args[1] + c := v.AuxInt v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { + if v_0.Op != Op386LEAL1 { break } - c := v_0.AuxInt + d := v_0.AuxInt + s := v_0.Aux + y := v_0.Args[1] x := v_0.Args[0] + if !(is32Bit(c + d)) { + break + } v.reset(Op386LEAL1) - v.AuxInt = c + v.AuxInt = c + d + v.Aux = s v.AddArg(x) v.AddArg(y) return true } - // match: (ADDL y (ADDLconst [c] x)) - // result: (LEAL1 [c] x y) + // match: (ADDLconst [c] (LEAL2 [d] {s} x y)) + // cond: is32Bit(c+d) + // result: (LEAL2 [c+d] {s} x y) for { - _ = v.Args[1] - y := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { + c := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != Op386LEAL2 { break } - c := v_1.AuxInt - x := v_1.Args[0] - v.reset(Op386LEAL1) - v.AuxInt = c + d := v_0.AuxInt + s := v_0.Aux + y := v_0.Args[1] + x := v_0.Args[0] + if !(is32Bit(c + d)) { + break + } + v.reset(Op386LEAL2) + v.AuxInt = c + d + v.Aux = s v.AddArg(x) v.AddArg(y) return true } - // match: (ADDL x (LEAL [c] {s} y)) - // cond: x.Op != OpSB && y.Op != OpSB - // result: (LEAL1 [c] {s} x y) + // match: (ADDLconst [c] (LEAL4 [d] {s} x y)) + // cond: is32Bit(c+d) + // result: (LEAL4 [c+d] {s} x y) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386LEAL { + c := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != Op386LEAL4 { break } - c := v_1.AuxInt - s := v_1.Aux - y := v_1.Args[0] - if !(x.Op != OpSB && y.Op != OpSB) { + d := v_0.AuxInt + s := v_0.Aux + y := v_0.Args[1] + x := v_0.Args[0] + if !(is32Bit(c + d)) { break } - v.reset(Op386LEAL1) - v.AuxInt = c + v.reset(Op386LEAL4) + v.AuxInt = c + d v.Aux = s v.AddArg(x) v.AddArg(y) return true } - // match: (ADDL (LEAL [c] {s} y) x) - // cond: x.Op != OpSB && y.Op != OpSB - // result: (LEAL1 [c] {s} x y) + // match: (ADDLconst [c] (LEAL8 [d] {s} x y)) + // cond: is32Bit(c+d) + // result: (LEAL8 [c+d] {s} x y) for { - x := v.Args[1] + c := v.AuxInt v_0 := v.Args[0] - if v_0.Op != Op386LEAL { + if v_0.Op != Op386LEAL8 { break } - c := v_0.AuxInt + d := v_0.AuxInt s := v_0.Aux - y := v_0.Args[0] - if !(x.Op != OpSB && y.Op != OpSB) { + y := v_0.Args[1] + x := v_0.Args[0] + if !(is32Bit(c + d)) { break } - v.reset(Op386LEAL1) - v.AuxInt = c + v.reset(Op386LEAL8) + v.AuxInt = c + d v.Aux = s v.AddArg(x) v.AddArg(y) return true } - // match: (ADDL x l:(MOVLload [off] {sym} ptr mem)) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (ADDLload x [off] {sym} ptr mem) + // match: (ADDLconst [c] x) + // cond: int32(c)==0 + // result: x for { - _ = v.Args[1] + c := v.AuxInt x := v.Args[0] - l := v.Args[1] - if l.Op != Op386MOVLload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { + if !(int32(c) == 0) { break } - v.reset(Op386ADDLload) - v.AuxInt = off - v.Aux = sym + v.reset(OpCopy) + v.Type = x.Type v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) return true } - // match: (ADDL l:(MOVLload [off] {sym} ptr mem) x) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (ADDLload x [off] {sym} ptr mem) + // match: (ADDLconst [c] (MOVLconst [d])) + // result: (MOVLconst [int64(int32(c+d))]) for { - x := v.Args[1] - l := v.Args[0] - if l.Op != Op386MOVLload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { + c := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != Op386MOVLconst { break } - v.reset(Op386ADDLload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) + d := v_0.AuxInt + v.reset(Op386MOVLconst) + v.AuxInt = int64(int32(c + d)) return true } - // match: (ADDL x l:(MOVLloadidx4 [off] {sym} ptr idx mem)) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (ADDLloadidx4 x [off] {sym} ptr idx mem) + // match: (ADDLconst [c] (ADDLconst [d] x)) + // result: (ADDLconst [int64(int32(c+d))] x) for { - _ = v.Args[1] - x := v.Args[0] - l := v.Args[1] - if l.Op != Op386MOVLloadidx4 { + c := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != Op386ADDLconst { break } - off := l.AuxInt - sym := l.Aux - mem := l.Args[2] - ptr := l.Args[0] - idx := l.Args[1] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break - } - v.reset(Op386ADDLloadidx4) - v.AuxInt = off - v.Aux = sym + d := v_0.AuxInt + x := v_0.Args[0] + v.reset(Op386ADDLconst) + v.AuxInt = int64(int32(c + d)) v.AddArg(x) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) return true } - // match: (ADDL l:(MOVLloadidx4 [off] {sym} ptr idx mem) x) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (ADDLloadidx4 x [off] {sym} ptr idx mem) + return false +} +func rewriteValue386_Op386ADDLconstmodify_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (ADDLconstmodify [valoff1] {sym} (ADDLconst [off2] base) mem) + // cond: ValAndOff(valoff1).canAdd(off2) + // result: (ADDLconstmodify [ValAndOff(valoff1).add(off2)] {sym} base mem) for { - x := v.Args[1] - l := v.Args[0] - if l.Op != Op386MOVLloadidx4 { + valoff1 := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386ADDLconst { break } - off := l.AuxInt - sym := l.Aux - mem := l.Args[2] - ptr := l.Args[0] - idx := l.Args[1] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { + off2 := v_0.AuxInt + base := v_0.Args[0] + if !(ValAndOff(valoff1).canAdd(off2)) { break } - v.reset(Op386ADDLloadidx4) - v.AuxInt = off + v.reset(Op386ADDLconstmodify) + v.AuxInt = ValAndOff(valoff1).add(off2) v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(idx) + v.AddArg(base) v.AddArg(mem) return true } - // match: (ADDL x (NEGL y)) - // result: (SUBL x y) + // match: (ADDLconstmodify [valoff1] {sym1} (LEAL [off2] {sym2} base) mem) + // cond: ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) + // result: (ADDLconstmodify [ValAndOff(valoff1).add(off2)] {mergeSym(sym1,sym2)} base mem) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386NEGL { + valoff1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386LEAL { break } - y := v_1.Args[0] - v.reset(Op386SUBL) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADDL (NEGL y) x) - // result: (SUBL x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386NEGL { + off2 := v_0.AuxInt + sym2 := v_0.Aux + base := v_0.Args[0] + if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } - y := v_0.Args[0] - v.reset(Op386SUBL) - v.AddArg(x) - v.AddArg(y) + v.reset(Op386ADDLconstmodify) + v.AuxInt = ValAndOff(valoff1).add(off2) + v.Aux = mergeSym(sym1, sym2) + v.AddArg(base) + v.AddArg(mem) return true } return false } -func rewriteValue386_Op386ADDLcarry_0(v *Value) bool { - // match: (ADDLcarry x (MOVLconst [c])) - // result: (ADDLconstcarry [c] x) +func rewriteValue386_Op386ADDLconstmodifyidx4_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (ADDLconstmodifyidx4 [valoff1] {sym} (ADDLconst [off2] base) idx mem) + // cond: ValAndOff(valoff1).canAdd(off2) + // result: (ADDLconstmodifyidx4 [ValAndOff(valoff1).add(off2)] {sym} base idx mem) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386MOVLconst { + valoff1 := v.AuxInt + sym := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != Op386ADDLconst { break } - c := v_1.AuxInt - v.reset(Op386ADDLconstcarry) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ADDLcarry (MOVLconst [c]) x) - // result: (ADDLconstcarry [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386MOVLconst { + off2 := v_0.AuxInt + base := v_0.Args[0] + idx := v.Args[1] + if !(ValAndOff(valoff1).canAdd(off2)) { break } - c := v_0.AuxInt - v.reset(Op386ADDLconstcarry) - v.AuxInt = c - v.AddArg(x) + v.reset(Op386ADDLconstmodifyidx4) + v.AuxInt = ValAndOff(valoff1).add(off2) + v.Aux = sym + v.AddArg(base) + v.AddArg(idx) + v.AddArg(mem) return true } - return false -} -func rewriteValue386_Op386ADDLconst_0(v *Value) bool { - // match: (ADDLconst [c] (ADDL x y)) - // result: (LEAL1 [c] x y) + // match: (ADDLconstmodifyidx4 [valoff1] {sym} base (ADDLconst [off2] idx) mem) + // cond: ValAndOff(valoff1).canAdd(off2*4) + // result: (ADDLconstmodifyidx4 [ValAndOff(valoff1).add(off2*4)] {sym} base idx mem) for { - c := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != Op386ADDL { + valoff1 := v.AuxInt + sym := v.Aux + mem := v.Args[2] + base := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386ADDLconst { break } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(Op386LEAL1) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) + off2 := v_1.AuxInt + idx := v_1.Args[0] + if !(ValAndOff(valoff1).canAdd(off2 * 4)) { + break + } + v.reset(Op386ADDLconstmodifyidx4) + v.AuxInt = ValAndOff(valoff1).add(off2 * 4) + v.Aux = sym + v.AddArg(base) + v.AddArg(idx) + v.AddArg(mem) return true } - // match: (ADDLconst [c] (LEAL [d] {s} x)) - // cond: is32Bit(c+d) - // result: (LEAL [c+d] {s} x) + // match: (ADDLconstmodifyidx4 [valoff1] {sym1} (LEAL [off2] {sym2} base) idx mem) + // cond: ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) + // result: (ADDLconstmodifyidx4 [ValAndOff(valoff1).add(off2)] {mergeSym(sym1,sym2)} base idx mem) for { - c := v.AuxInt + valoff1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break } - d := v_0.AuxInt - s := v_0.Aux - x := v_0.Args[0] - if !(is32Bit(c + d)) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + base := v_0.Args[0] + idx := v.Args[1] + if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(Op386LEAL) - v.AuxInt = c + d - v.Aux = s - v.AddArg(x) + v.reset(Op386ADDLconstmodifyidx4) + v.AuxInt = ValAndOff(valoff1).add(off2) + v.Aux = mergeSym(sym1, sym2) + v.AddArg(base) + v.AddArg(idx) + v.AddArg(mem) return true } - // match: (ADDLconst [c] (LEAL1 [d] {s} x y)) - // cond: is32Bit(c+d) - // result: (LEAL1 [c+d] {s} x y) + return false +} +func rewriteValue386_Op386ADDLload_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (ADDLload [off1] {sym} val (ADDLconst [off2] base) mem) + // cond: is32Bit(off1+off2) + // result: (ADDLload [off1+off2] {sym} val base mem) for { - c := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != Op386LEAL1 { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[2] + val := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386ADDLconst { break } - d := v_0.AuxInt - s := v_0.Aux - y := v_0.Args[1] - x := v_0.Args[0] - if !(is32Bit(c + d)) { + off2 := v_1.AuxInt + base := v_1.Args[0] + if !(is32Bit(off1 + off2)) { break } - v.reset(Op386LEAL1) - v.AuxInt = c + d - v.Aux = s - v.AddArg(x) - v.AddArg(y) + v.reset(Op386ADDLload) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(val) + v.AddArg(base) + v.AddArg(mem) return true } - // match: (ADDLconst [c] (LEAL2 [d] {s} x y)) - // cond: is32Bit(c+d) - // result: (LEAL2 [c+d] {s} x y) + // match: (ADDLload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) + // result: (ADDLload [off1+off2] {mergeSym(sym1,sym2)} val base mem) for { - c := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != Op386LEAL2 { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[2] + val := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386LEAL { break } - d := v_0.AuxInt - s := v_0.Aux - y := v_0.Args[1] - x := v_0.Args[0] - if !(is32Bit(c + d)) { + off2 := v_1.AuxInt + sym2 := v_1.Aux + base := v_1.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(Op386LEAL2) - v.AuxInt = c + d - v.Aux = s - v.AddArg(x) - v.AddArg(y) + v.reset(Op386ADDLload) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(val) + v.AddArg(base) + v.AddArg(mem) return true } - // match: (ADDLconst [c] (LEAL4 [d] {s} x y)) - // cond: is32Bit(c+d) - // result: (LEAL4 [c+d] {s} x y) + // match: (ADDLload [off1] {sym1} val (LEAL4 [off2] {sym2} ptr idx) mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (ADDLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} val ptr idx mem) for { - c := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != Op386LEAL4 { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[2] + val := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386LEAL4 { break } - d := v_0.AuxInt - s := v_0.Aux - y := v_0.Args[1] - x := v_0.Args[0] - if !(is32Bit(c + d)) { + off2 := v_1.AuxInt + sym2 := v_1.Aux + idx := v_1.Args[1] + ptr := v_1.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(Op386LEAL4) - v.AuxInt = c + d - v.Aux = s - v.AddArg(x) - v.AddArg(y) + v.reset(Op386ADDLloadidx4) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(val) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) return true } - // match: (ADDLconst [c] (LEAL8 [d] {s} x y)) - // cond: is32Bit(c+d) - // result: (LEAL8 [c+d] {s} x y) + return false +} +func rewriteValue386_Op386ADDLloadidx4_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (ADDLloadidx4 [off1] {sym} val (ADDLconst [off2] base) idx mem) + // cond: is32Bit(off1+off2) + // result: (ADDLloadidx4 [off1+off2] {sym} val base idx mem) for { - c := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != Op386LEAL8 { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[3] + val := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386ADDLconst { break } - d := v_0.AuxInt - s := v_0.Aux - y := v_0.Args[1] - x := v_0.Args[0] - if !(is32Bit(c + d)) { + off2 := v_1.AuxInt + base := v_1.Args[0] + idx := v.Args[2] + if !(is32Bit(off1 + off2)) { break } - v.reset(Op386LEAL8) - v.AuxInt = c + d - v.Aux = s - v.AddArg(x) - v.AddArg(y) + v.reset(Op386ADDLloadidx4) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(val) + v.AddArg(base) + v.AddArg(idx) + v.AddArg(mem) return true } - // match: (ADDLconst [c] x) - // cond: int32(c)==0 - // result: x + // match: (ADDLloadidx4 [off1] {sym} val base (ADDLconst [off2] idx) mem) + // cond: is32Bit(off1+off2*4) + // result: (ADDLloadidx4 [off1+off2*4] {sym} val base idx mem) for { - c := v.AuxInt - x := v.Args[0] - if !(int32(c) == 0) { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[3] + val := v.Args[0] + base := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != Op386ADDLconst { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (ADDLconst [c] (MOVLconst [d])) - // result: (MOVLconst [int64(int32(c+d))]) - for { - c := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != Op386MOVLconst { + off2 := v_2.AuxInt + idx := v_2.Args[0] + if !(is32Bit(off1 + off2*4)) { break } - d := v_0.AuxInt - v.reset(Op386MOVLconst) - v.AuxInt = int64(int32(c + d)) + v.reset(Op386ADDLloadidx4) + v.AuxInt = off1 + off2*4 + v.Aux = sym + v.AddArg(val) + v.AddArg(base) + v.AddArg(idx) + v.AddArg(mem) return true } - // match: (ADDLconst [c] (ADDLconst [d] x)) - // result: (ADDLconst [int64(int32(c+d))] x) + // match: (ADDLloadidx4 [off1] {sym1} val (LEAL [off2] {sym2} base) idx mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) + // result: (ADDLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} val base idx mem) for { - c := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[3] + val := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386LEAL { break } - d := v_0.AuxInt - x := v_0.Args[0] - v.reset(Op386ADDLconst) - v.AuxInt = int64(int32(c + d)) - v.AddArg(x) + off2 := v_1.AuxInt + sym2 := v_1.Aux + base := v_1.Args[0] + idx := v.Args[2] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { + break + } + v.reset(Op386ADDLloadidx4) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(val) + v.AddArg(base) + v.AddArg(idx) + v.AddArg(mem) return true } return false } -func rewriteValue386_Op386ADDLconstmodify_0(v *Value) bool { +func rewriteValue386_Op386ADDLmodify_0(v *Value) bool { b := v.Block config := b.Func.Config - // match: (ADDLconstmodify [valoff1] {sym} (ADDLconst [off2] base) mem) - // cond: ValAndOff(valoff1).canAdd(off2) - // result: (ADDLconstmodify [ValAndOff(valoff1).add(off2)] {sym} base mem) + // match: (ADDLmodify [off1] {sym} (ADDLconst [off2] base) val mem) + // cond: is32Bit(off1+off2) + // result: (ADDLmodify [off1+off2] {sym} base val mem) for { - valoff1 := v.AuxInt + off1 := v.AuxInt sym := v.Aux - mem := v.Args[1] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break } off2 := v_0.AuxInt base := v_0.Args[0] - if !(ValAndOff(valoff1).canAdd(off2)) { + val := v.Args[1] + if !(is32Bit(off1 + off2)) { break } - v.reset(Op386ADDLconstmodify) - v.AuxInt = ValAndOff(valoff1).add(off2) + v.reset(Op386ADDLmodify) + v.AuxInt = off1 + off2 v.Aux = sym v.AddArg(base) + v.AddArg(val) v.AddArg(mem) return true } - // match: (ADDLconstmodify [valoff1] {sym1} (LEAL [off2] {sym2} base) mem) - // cond: ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (ADDLconstmodify [ValAndOff(valoff1).add(off2)] {mergeSym(sym1,sym2)} base mem) + // match: (ADDLmodify [off1] {sym1} (LEAL [off2] {sym2} base) val mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) + // result: (ADDLmodify [off1+off2] {mergeSym(sym1,sym2)} base val mem) for { - valoff1 := v.AuxInt + off1 := v.AuxInt sym1 := v.Aux - mem := v.Args[1] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -1577,28 +1598,30 @@ func rewriteValue386_Op386ADDLconstmodify_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { + val := v.Args[1] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(Op386ADDLconstmodify) - v.AuxInt = ValAndOff(valoff1).add(off2) + v.reset(Op386ADDLmodify) + v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) v.AddArg(base) + v.AddArg(val) v.AddArg(mem) return true } return false } -func rewriteValue386_Op386ADDLconstmodifyidx4_0(v *Value) bool { +func rewriteValue386_Op386ADDLmodifyidx4_0(v *Value) bool { b := v.Block config := b.Func.Config - // match: (ADDLconstmodifyidx4 [valoff1] {sym} (ADDLconst [off2] base) idx mem) - // cond: ValAndOff(valoff1).canAdd(off2) - // result: (ADDLconstmodifyidx4 [ValAndOff(valoff1).add(off2)] {sym} base idx mem) + // match: (ADDLmodifyidx4 [off1] {sym} (ADDLconst [off2] base) idx val mem) + // cond: is32Bit(off1+off2) + // result: (ADDLmodifyidx4 [off1+off2] {sym} base idx val mem) for { - valoff1 := v.AuxInt + off1 := v.AuxInt sym := v.Aux - mem := v.Args[2] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -1606,24 +1629,26 @@ func rewriteValue386_Op386ADDLconstmodifyidx4_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] idx := v.Args[1] - if !(ValAndOff(valoff1).canAdd(off2)) { + val := v.Args[2] + if !(is32Bit(off1 + off2)) { break } - v.reset(Op386ADDLconstmodifyidx4) - v.AuxInt = ValAndOff(valoff1).add(off2) + v.reset(Op386ADDLmodifyidx4) + v.AuxInt = off1 + off2 v.Aux = sym v.AddArg(base) v.AddArg(idx) + v.AddArg(val) v.AddArg(mem) return true } - // match: (ADDLconstmodifyidx4 [valoff1] {sym} base (ADDLconst [off2] idx) mem) - // cond: ValAndOff(valoff1).canAdd(off2*4) - // result: (ADDLconstmodifyidx4 [ValAndOff(valoff1).add(off2*4)] {sym} base idx mem) + // match: (ADDLmodifyidx4 [off1] {sym} base (ADDLconst [off2] idx) val mem) + // cond: is32Bit(off1+off2*4) + // result: (ADDLmodifyidx4 [off1+off2*4] {sym} base idx val mem) for { - valoff1 := v.AuxInt + off1 := v.AuxInt sym := v.Aux - mem := v.Args[2] + mem := v.Args[3] base := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -1631,24 +1656,26 @@ func rewriteValue386_Op386ADDLconstmodifyidx4_0(v *Value) bool { } off2 := v_1.AuxInt idx := v_1.Args[0] - if !(ValAndOff(valoff1).canAdd(off2 * 4)) { + val := v.Args[2] + if !(is32Bit(off1 + off2*4)) { break } - v.reset(Op386ADDLconstmodifyidx4) - v.AuxInt = ValAndOff(valoff1).add(off2 * 4) + v.reset(Op386ADDLmodifyidx4) + v.AuxInt = off1 + off2*4 v.Aux = sym v.AddArg(base) v.AddArg(idx) + v.AddArg(val) v.AddArg(mem) return true } - // match: (ADDLconstmodifyidx4 [valoff1] {sym1} (LEAL [off2] {sym2} base) idx mem) - // cond: ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (ADDLconstmodifyidx4 [ValAndOff(valoff1).add(off2)] {mergeSym(sym1,sym2)} base idx mem) + // match: (ADDLmodifyidx4 [off1] {sym1} (LEAL [off2] {sym2} base) idx val mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) + // result: (ADDLmodifyidx4 [off1+off2] {mergeSym(sym1,sym2)} base idx val mem) for { - valoff1 := v.AuxInt + off1 := v.AuxInt sym1 := v.Aux - mem := v.Args[2] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -1657,25 +1684,85 @@ func rewriteValue386_Op386ADDLconstmodifyidx4_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] idx := v.Args[1] - if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { + val := v.Args[2] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(Op386ADDLconstmodifyidx4) - v.AuxInt = ValAndOff(valoff1).add(off2) + v.reset(Op386ADDLmodifyidx4) + v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) v.AddArg(base) v.AddArg(idx) + v.AddArg(val) v.AddArg(mem) return true } - return false + // match: (ADDLmodifyidx4 [off] {sym} ptr idx (MOVLconst [c]) mem) + // cond: validValAndOff(c,off) + // result: (ADDLconstmodifyidx4 [makeValAndOff(c,off)] {sym} ptr idx mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != Op386MOVLconst { + break + } + c := v_2.AuxInt + if !(validValAndOff(c, off)) { + break + } + v.reset(Op386ADDLconstmodifyidx4) + v.AuxInt = makeValAndOff(c, off) + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + return false } -func rewriteValue386_Op386ADDLload_0(v *Value) bool { +func rewriteValue386_Op386ADDSD_0(v *Value) bool { b := v.Block config := b.Func.Config - // match: (ADDLload [off1] {sym} val (ADDLconst [off2] base) mem) + // match: (ADDSD x l:(MOVSDload [off] {sym} ptr mem)) + // cond: canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l) + // result: (ADDSDload x [off] {sym} ptr mem) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != Op386MOVSDload { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[1] + ptr := l.Args[0] + if !(canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l)) { + continue + } + v.reset(Op386ADDSDload) + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true + } + break + } + return false +} +func rewriteValue386_Op386ADDSDload_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (ADDSDload [off1] {sym} val (ADDLconst [off2] base) mem) // cond: is32Bit(off1+off2) - // result: (ADDLload [off1+off2] {sym} val base mem) + // result: (ADDSDload [off1+off2] {sym} val base mem) for { off1 := v.AuxInt sym := v.Aux @@ -1690,7 +1777,7 @@ func rewriteValue386_Op386ADDLload_0(v *Value) bool { if !(is32Bit(off1 + off2)) { break } - v.reset(Op386ADDLload) + v.reset(Op386ADDSDload) v.AuxInt = off1 + off2 v.Aux = sym v.AddArg(val) @@ -1698,9 +1785,9 @@ func rewriteValue386_Op386ADDLload_0(v *Value) bool { v.AddArg(mem) return true } - // match: (ADDLload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) + // match: (ADDSDload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (ADDLload [off1+off2] {mergeSym(sym1,sym2)} val base mem) + // result: (ADDSDload [off1+off2] {mergeSym(sym1,sym2)} val base mem) for { off1 := v.AuxInt sym1 := v.Aux @@ -1716,7 +1803,7 @@ func rewriteValue386_Op386ADDLload_0(v *Value) bool { if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(Op386ADDLload) + v.reset(Op386ADDSDload) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) v.AddArg(val) @@ -1724,46 +1811,51 @@ func rewriteValue386_Op386ADDLload_0(v *Value) bool { v.AddArg(mem) return true } - // match: (ADDLload [off1] {sym1} val (LEAL4 [off2] {sym2} ptr idx) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (ADDLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} val ptr idx mem) + return false +} +func rewriteValue386_Op386ADDSS_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (ADDSS x l:(MOVSSload [off] {sym} ptr mem)) + // cond: canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l) + // result: (ADDSSload x [off] {sym} ptr mem) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] - val := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386LEAL4 { - break - } - off2 := v_1.AuxInt - sym2 := v_1.Aux - idx := v_1.Args[1] - ptr := v_1.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != Op386MOVSSload { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[1] + ptr := l.Args[0] + if !(canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l)) { + continue + } + v.reset(Op386ADDSSload) + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - v.reset(Op386ADDLloadidx4) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(val) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } return false } -func rewriteValue386_Op386ADDLloadidx4_0(v *Value) bool { +func rewriteValue386_Op386ADDSSload_0(v *Value) bool { b := v.Block config := b.Func.Config - // match: (ADDLloadidx4 [off1] {sym} val (ADDLconst [off2] base) idx mem) + // match: (ADDSSload [off1] {sym} val (ADDLconst [off2] base) mem) // cond: is32Bit(off1+off2) - // result: (ADDLloadidx4 [off1+off2] {sym} val base idx mem) + // result: (ADDSSload [off1+off2] {sym} val base mem) for { off1 := v.AuxInt sym := v.Aux - mem := v.Args[3] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -1771,53 +1863,24 @@ func rewriteValue386_Op386ADDLloadidx4_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - idx := v.Args[2] if !(is32Bit(off1 + off2)) { break } - v.reset(Op386ADDLloadidx4) + v.reset(Op386ADDSSload) v.AuxInt = off1 + off2 v.Aux = sym v.AddArg(val) v.AddArg(base) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (ADDLloadidx4 [off1] {sym} val base (ADDLconst [off2] idx) mem) - // cond: is32Bit(off1+off2*4) - // result: (ADDLloadidx4 [off1+off2*4] {sym} val base idx mem) - for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[3] - val := v.Args[0] - base := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != Op386ADDLconst { - break - } - off2 := v_2.AuxInt - idx := v_2.Args[0] - if !(is32Bit(off1 + off2*4)) { - break - } - v.reset(Op386ADDLloadidx4) - v.AuxInt = off1 + off2*4 - v.Aux = sym - v.AddArg(val) - v.AddArg(base) - v.AddArg(idx) v.AddArg(mem) return true } - // match: (ADDLloadidx4 [off1] {sym1} val (LEAL [off2] {sym2} base) idx mem) + // match: (ADDSSload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (ADDLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} val base idx mem) + // result: (ADDSSload [off1+off2] {mergeSym(sym1,sym2)} val base mem) for { off1 := v.AuxInt sym1 := v.Aux - mem := v.Args[3] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386LEAL { @@ -1826,141 +1889,200 @@ func rewriteValue386_Op386ADDLloadidx4_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - idx := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(Op386ADDLloadidx4) + v.reset(Op386ADDSSload) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) v.AddArg(val) v.AddArg(base) - v.AddArg(idx) v.AddArg(mem) return true } return false } -func rewriteValue386_Op386ADDLmodify_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (ADDLmodify [off1] {sym} (ADDLconst [off2] base) val mem) - // cond: is32Bit(off1+off2) - // result: (ADDLmodify [off1+off2] {sym} base val mem) +func rewriteValue386_Op386ANDL_0(v *Value) bool { + // match: (ANDL x (MOVLconst [c])) + // result: (ANDLconst [c] x) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386MOVLconst { + continue + } + c := v_1.AuxInt + v.reset(Op386ANDLconst) + v.AuxInt = c + v.AddArg(x) + return true } - off2 := v_0.AuxInt - base := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1 + off2)) { - break + break + } + // match: (ANDL x l:(MOVLload [off] {sym} ptr mem)) + // cond: canMergeLoadClobber(v, l, x) && clobber(l) + // result: (ANDLload x [off] {sym} ptr mem) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != Op386MOVLload { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[1] + ptr := l.Args[0] + if !(canMergeLoadClobber(v, l, x) && clobber(l)) { + continue + } + v.reset(Op386ANDLload) + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - v.reset(Op386ADDLmodify) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(base) - v.AddArg(val) - v.AddArg(mem) - return true + break } - // match: (ADDLmodify [off1] {sym1} (LEAL [off2] {sym2} base) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (ADDLmodify [off1+off2] {mergeSym(sym1,sym2)} base val mem) + // match: (ANDL x l:(MOVLloadidx4 [off] {sym} ptr idx mem)) + // cond: canMergeLoadClobber(v, l, x) && clobber(l) + // result: (ANDLloadidx4 x [off] {sym} ptr idx mem) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != Op386MOVLloadidx4 { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[2] + ptr := l.Args[0] + idx := l.Args[1] + if !(canMergeLoadClobber(v, l, x) && clobber(l)) { + continue + } + v.reset(Op386ANDLloadidx4) + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - off2 := v_0.AuxInt - sym2 := v_0.Aux - base := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { + break + } + // match: (ANDL x x) + // result: x + for { + x := v.Args[1] + if x != v.Args[0] { break } - v.reset(Op386ADDLmodify) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(base) - v.AddArg(val) - v.AddArg(mem) + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } return false } -func rewriteValue386_Op386ADDLmodifyidx4_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (ADDLmodifyidx4 [off1] {sym} (ADDLconst [off2] base) idx val mem) - // cond: is32Bit(off1+off2) - // result: (ADDLmodifyidx4 [off1+off2] {sym} base idx val mem) +func rewriteValue386_Op386ANDLconst_0(v *Value) bool { + // match: (ANDLconst [c] (ANDLconst [d] x)) + // result: (ANDLconst [c & d] x) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[3] + c := v.AuxInt v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { - break - } - off2 := v_0.AuxInt - base := v_0.Args[0] - idx := v.Args[1] - val := v.Args[2] - if !(is32Bit(off1 + off2)) { + if v_0.Op != Op386ANDLconst { break } - v.reset(Op386ADDLmodifyidx4) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(base) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) + d := v_0.AuxInt + x := v_0.Args[0] + v.reset(Op386ANDLconst) + v.AuxInt = c & d + v.AddArg(x) return true } - // match: (ADDLmodifyidx4 [off1] {sym} base (ADDLconst [off2] idx) val mem) - // cond: is32Bit(off1+off2*4) - // result: (ADDLmodifyidx4 [off1+off2*4] {sym} base idx val mem) + // match: (ANDLconst [c] _) + // cond: int32(c)==0 + // result: (MOVLconst [0]) for { - off1 := v.AuxInt + c := v.AuxInt + if !(int32(c) == 0) { + break + } + v.reset(Op386MOVLconst) + v.AuxInt = 0 + return true + } + // match: (ANDLconst [c] x) + // cond: int32(c)==-1 + // result: x + for { + c := v.AuxInt + x := v.Args[0] + if !(int32(c) == -1) { + break + } + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + // match: (ANDLconst [c] (MOVLconst [d])) + // result: (MOVLconst [c&d]) + for { + c := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != Op386MOVLconst { + break + } + d := v_0.AuxInt + v.reset(Op386MOVLconst) + v.AuxInt = c & d + return true + } + return false +} +func rewriteValue386_Op386ANDLconstmodify_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (ANDLconstmodify [valoff1] {sym} (ADDLconst [off2] base) mem) + // cond: ValAndOff(valoff1).canAdd(off2) + // result: (ANDLconstmodify [ValAndOff(valoff1).add(off2)] {sym} base mem) + for { + valoff1 := v.AuxInt sym := v.Aux - mem := v.Args[3] - base := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386ADDLconst { break } - off2 := v_1.AuxInt - idx := v_1.Args[0] - val := v.Args[2] - if !(is32Bit(off1 + off2*4)) { + off2 := v_0.AuxInt + base := v_0.Args[0] + if !(ValAndOff(valoff1).canAdd(off2)) { break } - v.reset(Op386ADDLmodifyidx4) - v.AuxInt = off1 + off2*4 + v.reset(Op386ANDLconstmodify) + v.AuxInt = ValAndOff(valoff1).add(off2) v.Aux = sym v.AddArg(base) - v.AddArg(idx) - v.AddArg(val) v.AddArg(mem) return true } - // match: (ADDLmodifyidx4 [off1] {sym1} (LEAL [off2] {sym2} base) idx val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (ADDLmodifyidx4 [off1+off2] {mergeSym(sym1,sym2)} base idx val mem) + // match: (ANDLconstmodify [valoff1] {sym1} (LEAL [off2] {sym2} base) mem) + // cond: ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) + // result: (ANDLconstmodify [ValAndOff(valoff1).add(off2)] {mergeSym(sym1,sym2)} base mem) for { - off1 := v.AuxInt + valoff1 := v.AuxInt sym1 := v.Aux - mem := v.Args[3] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -1968,107 +2090,105 @@ func rewriteValue386_Op386ADDLmodifyidx4_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - idx := v.Args[1] - val := v.Args[2] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { + if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(Op386ADDLmodifyidx4) - v.AuxInt = off1 + off2 + v.reset(Op386ANDLconstmodify) + v.AuxInt = ValAndOff(valoff1).add(off2) v.Aux = mergeSym(sym1, sym2) v.AddArg(base) - v.AddArg(idx) - v.AddArg(val) v.AddArg(mem) return true } - // match: (ADDLmodifyidx4 [off] {sym} ptr idx (MOVLconst [c]) mem) - // cond: validValAndOff(c,off) - // result: (ADDLconstmodifyidx4 [makeValAndOff(c,off)] {sym} ptr idx mem) + return false +} +func rewriteValue386_Op386ANDLconstmodifyidx4_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (ANDLconstmodifyidx4 [valoff1] {sym} (ADDLconst [off2] base) idx mem) + // cond: ValAndOff(valoff1).canAdd(off2) + // result: (ANDLconstmodifyidx4 [ValAndOff(valoff1).add(off2)] {sym} base idx mem) for { - off := v.AuxInt + valoff1 := v.AuxInt sym := v.Aux - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != Op386MOVLconst { + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != Op386ADDLconst { break } - c := v_2.AuxInt - if !(validValAndOff(c, off)) { + off2 := v_0.AuxInt + base := v_0.Args[0] + idx := v.Args[1] + if !(ValAndOff(valoff1).canAdd(off2)) { break } - v.reset(Op386ADDLconstmodifyidx4) - v.AuxInt = makeValAndOff(c, off) + v.reset(Op386ANDLconstmodifyidx4) + v.AuxInt = ValAndOff(valoff1).add(off2) v.Aux = sym - v.AddArg(ptr) + v.AddArg(base) v.AddArg(idx) v.AddArg(mem) return true } - return false -} -func rewriteValue386_Op386ADDSD_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (ADDSD x l:(MOVSDload [off] {sym} ptr mem)) - // cond: canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l) - // result: (ADDSDload x [off] {sym} ptr mem) + // match: (ANDLconstmodifyidx4 [valoff1] {sym} base (ADDLconst [off2] idx) mem) + // cond: ValAndOff(valoff1).canAdd(off2*4) + // result: (ANDLconstmodifyidx4 [ValAndOff(valoff1).add(off2*4)] {sym} base idx mem) for { - _ = v.Args[1] - x := v.Args[0] - l := v.Args[1] - if l.Op != Op386MOVSDload { + valoff1 := v.AuxInt + sym := v.Aux + mem := v.Args[2] + base := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386ADDLconst { break } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l)) { + off2 := v_1.AuxInt + idx := v_1.Args[0] + if !(ValAndOff(valoff1).canAdd(off2 * 4)) { break } - v.reset(Op386ADDSDload) - v.AuxInt = off + v.reset(Op386ANDLconstmodifyidx4) + v.AuxInt = ValAndOff(valoff1).add(off2 * 4) v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) + v.AddArg(base) + v.AddArg(idx) v.AddArg(mem) return true } - // match: (ADDSD l:(MOVSDload [off] {sym} ptr mem) x) - // cond: canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l) - // result: (ADDSDload x [off] {sym} ptr mem) + // match: (ANDLconstmodifyidx4 [valoff1] {sym1} (LEAL [off2] {sym2} base) idx mem) + // cond: ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) + // result: (ANDLconstmodifyidx4 [ValAndOff(valoff1).add(off2)] {mergeSym(sym1,sym2)} base idx mem) for { - x := v.Args[1] - l := v.Args[0] - if l.Op != Op386MOVSDload { + valoff1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != Op386LEAL { break } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l)) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + base := v_0.Args[0] + idx := v.Args[1] + if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(Op386ADDSDload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) + v.reset(Op386ANDLconstmodifyidx4) + v.AuxInt = ValAndOff(valoff1).add(off2) + v.Aux = mergeSym(sym1, sym2) + v.AddArg(base) + v.AddArg(idx) v.AddArg(mem) return true } return false } -func rewriteValue386_Op386ADDSDload_0(v *Value) bool { +func rewriteValue386_Op386ANDLload_0(v *Value) bool { b := v.Block config := b.Func.Config - // match: (ADDSDload [off1] {sym} val (ADDLconst [off2] base) mem) + // match: (ANDLload [off1] {sym} val (ADDLconst [off2] base) mem) // cond: is32Bit(off1+off2) - // result: (ADDSDload [off1+off2] {sym} val base mem) + // result: (ANDLload [off1+off2] {sym} val base mem) for { off1 := v.AuxInt sym := v.Aux @@ -2083,7 +2203,7 @@ func rewriteValue386_Op386ADDSDload_0(v *Value) bool { if !(is32Bit(off1 + off2)) { break } - v.reset(Op386ADDSDload) + v.reset(Op386ANDLload) v.AuxInt = off1 + off2 v.Aux = sym v.AddArg(val) @@ -2091,9 +2211,9 @@ func rewriteValue386_Op386ADDSDload_0(v *Value) bool { v.AddArg(mem) return true } - // match: (ADDSDload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) + // match: (ANDLload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (ADDSDload [off1+off2] {mergeSym(sym1,sym2)} val base mem) + // result: (ANDLload [off1+off2] {mergeSym(sym1,sym2)} val base mem) for { off1 := v.AuxInt sym1 := v.Aux @@ -2109,7 +2229,7 @@ func rewriteValue386_Op386ADDSDload_0(v *Value) bool { if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(Op386ADDSDload) + v.reset(Op386ANDLload) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) v.AddArg(val) @@ -2117,97 +2237,100 @@ func rewriteValue386_Op386ADDSDload_0(v *Value) bool { v.AddArg(mem) return true } - return false -} -func rewriteValue386_Op386ADDSS_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (ADDSS x l:(MOVSSload [off] {sym} ptr mem)) - // cond: canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l) - // result: (ADDSSload x [off] {sym} ptr mem) + // match: (ANDLload [off1] {sym1} val (LEAL4 [off2] {sym2} ptr idx) mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (ANDLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} val ptr idx mem) for { - _ = v.Args[1] - x := v.Args[0] - l := v.Args[1] - if l.Op != Op386MOVSSload { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[2] + val := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386LEAL4 { break } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l)) { + off2 := v_1.AuxInt + sym2 := v_1.Aux + idx := v_1.Args[1] + ptr := v_1.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(Op386ADDSSload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) + v.reset(Op386ANDLloadidx4) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(val) v.AddArg(ptr) + v.AddArg(idx) v.AddArg(mem) return true } - // match: (ADDSS l:(MOVSSload [off] {sym} ptr mem) x) - // cond: canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l) - // result: (ADDSSload x [off] {sym} ptr mem) + return false +} +func rewriteValue386_Op386ANDLloadidx4_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (ANDLloadidx4 [off1] {sym} val (ADDLconst [off2] base) idx mem) + // cond: is32Bit(off1+off2) + // result: (ANDLloadidx4 [off1+off2] {sym} val base idx mem) for { - x := v.Args[1] - l := v.Args[0] - if l.Op != Op386MOVSSload { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[3] + val := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386ADDLconst { break } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l)) { + off2 := v_1.AuxInt + base := v_1.Args[0] + idx := v.Args[2] + if !(is32Bit(off1 + off2)) { break } - v.reset(Op386ADDSSload) - v.AuxInt = off + v.reset(Op386ANDLloadidx4) + v.AuxInt = off1 + off2 v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) + v.AddArg(val) + v.AddArg(base) + v.AddArg(idx) v.AddArg(mem) return true } - return false -} -func rewriteValue386_Op386ADDSSload_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (ADDSSload [off1] {sym} val (ADDLconst [off2] base) mem) - // cond: is32Bit(off1+off2) - // result: (ADDSSload [off1+off2] {sym} val base mem) + // match: (ANDLloadidx4 [off1] {sym} val base (ADDLconst [off2] idx) mem) + // cond: is32Bit(off1+off2*4) + // result: (ANDLloadidx4 [off1+off2*4] {sym} val base idx mem) for { off1 := v.AuxInt sym := v.Aux - mem := v.Args[2] + mem := v.Args[3] val := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { + base := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != Op386ADDLconst { break } - off2 := v_1.AuxInt - base := v_1.Args[0] - if !(is32Bit(off1 + off2)) { + off2 := v_2.AuxInt + idx := v_2.Args[0] + if !(is32Bit(off1 + off2*4)) { break } - v.reset(Op386ADDSSload) - v.AuxInt = off1 + off2 + v.reset(Op386ANDLloadidx4) + v.AuxInt = off1 + off2*4 v.Aux = sym v.AddArg(val) v.AddArg(base) + v.AddArg(idx) v.AddArg(mem) return true } - // match: (ADDSSload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) + // match: (ANDLloadidx4 [off1] {sym1} val (LEAL [off2] {sym2} base) idx mem) // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (ADDSSload [off1+off2] {mergeSym(sym1,sym2)} val base mem) + // result: (ANDLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} val base idx mem) for { off1 := v.AuxInt sym1 := v.Aux - mem := v.Args[2] + mem := v.Args[3] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386LEAL { @@ -2216,734 +2339,521 @@ func rewriteValue386_Op386ADDSSload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] + idx := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(Op386ADDSSload) + v.reset(Op386ANDLloadidx4) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) v.AddArg(val) v.AddArg(base) + v.AddArg(idx) v.AddArg(mem) return true } return false } -func rewriteValue386_Op386ANDL_0(v *Value) bool { - // match: (ANDL x (MOVLconst [c])) - // result: (ANDLconst [c] x) +func rewriteValue386_Op386ANDLmodify_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (ANDLmodify [off1] {sym} (ADDLconst [off2] base) val mem) + // cond: is32Bit(off1+off2) + // result: (ANDLmodify [off1+off2] {sym} base val mem) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386MOVLconst { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != Op386ADDLconst { break } - c := v_1.AuxInt - v.reset(Op386ANDLconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ANDL (MOVLconst [c]) x) - // result: (ANDLconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386MOVLconst { + off2 := v_0.AuxInt + base := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1 + off2)) { break } - c := v_0.AuxInt - v.reset(Op386ANDLconst) - v.AuxInt = c - v.AddArg(x) + v.reset(Op386ANDLmodify) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(base) + v.AddArg(val) + v.AddArg(mem) return true } - // match: (ANDL x l:(MOVLload [off] {sym} ptr mem)) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (ANDLload x [off] {sym} ptr mem) + // match: (ANDLmodify [off1] {sym1} (LEAL [off2] {sym2} base) val mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) + // result: (ANDLmodify [off1+off2] {mergeSym(sym1,sym2)} base val mem) for { - _ = v.Args[1] - x := v.Args[0] - l := v.Args[1] - if l.Op != Op386MOVLload { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != Op386LEAL { break } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + base := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(Op386ANDLload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) + v.reset(Op386ANDLmodify) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(base) + v.AddArg(val) v.AddArg(mem) return true } - // match: (ANDL l:(MOVLload [off] {sym} ptr mem) x) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (ANDLload x [off] {sym} ptr mem) + return false +} +func rewriteValue386_Op386ANDLmodifyidx4_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (ANDLmodifyidx4 [off1] {sym} (ADDLconst [off2] base) idx val mem) + // cond: is32Bit(off1+off2) + // result: (ANDLmodifyidx4 [off1+off2] {sym} base idx val mem) for { - x := v.Args[1] - l := v.Args[0] - if l.Op != Op386MOVLload { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[3] + v_0 := v.Args[0] + if v_0.Op != Op386ADDLconst { break } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { + off2 := v_0.AuxInt + base := v_0.Args[0] + idx := v.Args[1] + val := v.Args[2] + if !(is32Bit(off1 + off2)) { break } - v.reset(Op386ANDLload) - v.AuxInt = off + v.reset(Op386ANDLmodifyidx4) + v.AuxInt = off1 + off2 v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) + v.AddArg(base) + v.AddArg(idx) + v.AddArg(val) v.AddArg(mem) return true } - // match: (ANDL x l:(MOVLloadidx4 [off] {sym} ptr idx mem)) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (ANDLloadidx4 x [off] {sym} ptr idx mem) + // match: (ANDLmodifyidx4 [off1] {sym} base (ADDLconst [off2] idx) val mem) + // cond: is32Bit(off1+off2*4) + // result: (ANDLmodifyidx4 [off1+off2*4] {sym} base idx val mem) for { - _ = v.Args[1] - x := v.Args[0] - l := v.Args[1] - if l.Op != Op386MOVLloadidx4 { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[3] + base := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386ADDLconst { break } - off := l.AuxInt - sym := l.Aux - mem := l.Args[2] - ptr := l.Args[0] - idx := l.Args[1] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { + off2 := v_1.AuxInt + idx := v_1.Args[0] + val := v.Args[2] + if !(is32Bit(off1 + off2*4)) { break } - v.reset(Op386ANDLloadidx4) - v.AuxInt = off + v.reset(Op386ANDLmodifyidx4) + v.AuxInt = off1 + off2*4 v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) + v.AddArg(base) v.AddArg(idx) + v.AddArg(val) v.AddArg(mem) return true } - // match: (ANDL l:(MOVLloadidx4 [off] {sym} ptr idx mem) x) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (ANDLloadidx4 x [off] {sym} ptr idx mem) + // match: (ANDLmodifyidx4 [off1] {sym1} (LEAL [off2] {sym2} base) idx val mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) + // result: (ANDLmodifyidx4 [off1+off2] {mergeSym(sym1,sym2)} base idx val mem) for { - x := v.Args[1] - l := v.Args[0] - if l.Op != Op386MOVLloadidx4 { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[3] + v_0 := v.Args[0] + if v_0.Op != Op386LEAL { break } - off := l.AuxInt - sym := l.Aux - mem := l.Args[2] - ptr := l.Args[0] - idx := l.Args[1] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + base := v_0.Args[0] + idx := v.Args[1] + val := v.Args[2] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(Op386ANDLloadidx4) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) + v.reset(Op386ANDLmodifyidx4) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(base) v.AddArg(idx) + v.AddArg(val) v.AddArg(mem) return true } - // match: (ANDL x x) - // result: x + // match: (ANDLmodifyidx4 [off] {sym} ptr idx (MOVLconst [c]) mem) + // cond: validValAndOff(c,off) + // result: (ANDLconstmodifyidx4 [makeValAndOff(c,off)] {sym} ptr idx mem) for { - x := v.Args[1] - if x != v.Args[0] { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + off := v.AuxInt + sym := v.Aux + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != Op386MOVLconst { + break + } + c := v_2.AuxInt + if !(validValAndOff(c, off)) { + break + } + v.reset(Op386ANDLconstmodifyidx4) + v.AuxInt = makeValAndOff(c, off) + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) return true } return false } -func rewriteValue386_Op386ANDLconst_0(v *Value) bool { - // match: (ANDLconst [c] (ANDLconst [d] x)) - // result: (ANDLconst [c & d] x) +func rewriteValue386_Op386CMPB_0(v *Value) bool { + b := v.Block + // match: (CMPB x (MOVLconst [c])) + // result: (CMPBconst x [int64(int8(c))]) for { - c := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != Op386ANDLconst { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386MOVLconst { break } - d := v_0.AuxInt - x := v_0.Args[0] - v.reset(Op386ANDLconst) - v.AuxInt = c & d + c := v_1.AuxInt + v.reset(Op386CMPBconst) + v.AuxInt = int64(int8(c)) v.AddArg(x) return true } - // match: (ANDLconst [c] _) - // cond: int32(c)==0 - // result: (MOVLconst [0]) + // match: (CMPB (MOVLconst [c]) x) + // result: (InvertFlags (CMPBconst x [int64(int8(c))])) for { - c := v.AuxInt - if !(int32(c) == 0) { + x := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386MOVLconst { break } - v.reset(Op386MOVLconst) - v.AuxInt = 0 + c := v_0.AuxInt + v.reset(Op386InvertFlags) + v0 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) + v0.AuxInt = int64(int8(c)) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (ANDLconst [c] x) - // cond: int32(c)==-1 - // result: x + // match: (CMPB l:(MOVBload {sym} [off] ptr mem) x) + // cond: canMergeLoad(v, l) && clobber(l) + // result: (CMPBload {sym} [off] ptr x mem) for { - c := v.AuxInt - x := v.Args[0] - if !(int32(c) == -1) { + x := v.Args[1] + l := v.Args[0] + if l.Op != Op386MOVBload { break } - v.reset(OpCopy) - v.Type = x.Type + off := l.AuxInt + sym := l.Aux + mem := l.Args[1] + ptr := l.Args[0] + if !(canMergeLoad(v, l) && clobber(l)) { + break + } + v.reset(Op386CMPBload) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) v.AddArg(x) + v.AddArg(mem) return true } - // match: (ANDLconst [c] (MOVLconst [d])) - // result: (MOVLconst [c&d]) + // match: (CMPB x l:(MOVBload {sym} [off] ptr mem)) + // cond: canMergeLoad(v, l) && clobber(l) + // result: (InvertFlags (CMPBload {sym} [off] ptr x mem)) for { - c := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != Op386MOVLconst { + _ = v.Args[1] + x := v.Args[0] + l := v.Args[1] + if l.Op != Op386MOVBload { break } - d := v_0.AuxInt - v.reset(Op386MOVLconst) - v.AuxInt = c & d + off := l.AuxInt + sym := l.Aux + mem := l.Args[1] + ptr := l.Args[0] + if !(canMergeLoad(v, l) && clobber(l)) { + break + } + v.reset(Op386InvertFlags) + v0 := b.NewValue0(l.Pos, Op386CMPBload, types.TypeFlags) + v0.AuxInt = off + v0.Aux = sym + v0.AddArg(ptr) + v0.AddArg(x) + v0.AddArg(mem) + v.AddArg(v0) return true } return false } -func rewriteValue386_Op386ANDLconstmodify_0(v *Value) bool { +func rewriteValue386_Op386CMPBconst_0(v *Value) bool { b := v.Block - config := b.Func.Config - // match: (ANDLconstmodify [valoff1] {sym} (ADDLconst [off2] base) mem) - // cond: ValAndOff(valoff1).canAdd(off2) - // result: (ANDLconstmodify [ValAndOff(valoff1).add(off2)] {sym} base mem) + // match: (CMPBconst (MOVLconst [x]) [y]) + // cond: int8(x)==int8(y) + // result: (FlagEQ) for { - valoff1 := v.AuxInt - sym := v.Aux - mem := v.Args[1] + y := v.AuxInt v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { + if v_0.Op != Op386MOVLconst { break } - off2 := v_0.AuxInt - base := v_0.Args[0] - if !(ValAndOff(valoff1).canAdd(off2)) { + x := v_0.AuxInt + if !(int8(x) == int8(y)) { break } - v.reset(Op386ANDLconstmodify) - v.AuxInt = ValAndOff(valoff1).add(off2) - v.Aux = sym - v.AddArg(base) - v.AddArg(mem) + v.reset(Op386FlagEQ) return true } - // match: (ANDLconstmodify [valoff1] {sym1} (LEAL [off2] {sym2} base) mem) - // cond: ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (ANDLconstmodify [ValAndOff(valoff1).add(off2)] {mergeSym(sym1,sym2)} base mem) + // match: (CMPBconst (MOVLconst [x]) [y]) + // cond: int8(x)uint8(y) + // result: (FlagLT_UGT) for { - valoff1 := v.AuxInt - sym := v.Aux - mem := v.Args[2] + y := v.AuxInt v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { + if v_0.Op != Op386MOVLconst { break } - off2 := v_0.AuxInt - base := v_0.Args[0] - idx := v.Args[1] - if !(ValAndOff(valoff1).canAdd(off2)) { + x := v_0.AuxInt + if !(int8(x) < int8(y) && uint8(x) > uint8(y)) { break } - v.reset(Op386ANDLconstmodifyidx4) - v.AuxInt = ValAndOff(valoff1).add(off2) - v.Aux = sym - v.AddArg(base) - v.AddArg(idx) - v.AddArg(mem) + v.reset(Op386FlagLT_UGT) return true } - // match: (ANDLconstmodifyidx4 [valoff1] {sym} base (ADDLconst [off2] idx) mem) - // cond: ValAndOff(valoff1).canAdd(off2*4) - // result: (ANDLconstmodifyidx4 [ValAndOff(valoff1).add(off2*4)] {sym} base idx mem) + // match: (CMPBconst (MOVLconst [x]) [y]) + // cond: int8(x)>int8(y) && uint8(x) int8(y) && uint8(x) < uint8(y)) { break } - v.reset(Op386ANDLconstmodifyidx4) - v.AuxInt = ValAndOff(valoff1).add(off2 * 4) - v.Aux = sym - v.AddArg(base) - v.AddArg(idx) - v.AddArg(mem) + v.reset(Op386FlagGT_ULT) return true } - // match: (ANDLconstmodifyidx4 [valoff1] {sym1} (LEAL [off2] {sym2} base) idx mem) - // cond: ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (ANDLconstmodifyidx4 [ValAndOff(valoff1).add(off2)] {mergeSym(sym1,sym2)} base idx mem) + // match: (CMPBconst (MOVLconst [x]) [y]) + // cond: int8(x)>int8(y) && uint8(x)>uint8(y) + // result: (FlagGT_UGT) for { - valoff1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] + y := v.AuxInt v_0 := v.Args[0] - if v_0.Op != Op386LEAL { + if v_0.Op != Op386MOVLconst { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - base := v_0.Args[0] - idx := v.Args[1] - if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { + x := v_0.AuxInt + if !(int8(x) > int8(y) && uint8(x) > uint8(y)) { break } - v.reset(Op386ANDLconstmodifyidx4) - v.AuxInt = ValAndOff(valoff1).add(off2) - v.Aux = mergeSym(sym1, sym2) - v.AddArg(base) - v.AddArg(idx) - v.AddArg(mem) + v.reset(Op386FlagGT_UGT) return true } - return false -} -func rewriteValue386_Op386ANDLload_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (ANDLload [off1] {sym} val (ADDLconst [off2] base) mem) - // cond: is32Bit(off1+off2) - // result: (ANDLload [off1+off2] {sym} val base mem) + // match: (CMPBconst (ANDLconst _ [m]) [n]) + // cond: 0 <= int8(m) && int8(m) < int8(n) + // result: (FlagLT_ULT) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[2] - val := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { + n := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != Op386ANDLconst { break } - off2 := v_1.AuxInt - base := v_1.Args[0] - if !(is32Bit(off1 + off2)) { + m := v_0.AuxInt + if !(0 <= int8(m) && int8(m) < int8(n)) { break } - v.reset(Op386ANDLload) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(val) - v.AddArg(base) - v.AddArg(mem) + v.reset(Op386FlagLT_ULT) return true } - // match: (ANDLload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (ANDLload [off1+off2] {mergeSym(sym1,sym2)} val base mem) + // match: (CMPBconst l:(ANDL x y) [0]) + // cond: l.Uses==1 + // result: (TESTB x y) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] - val := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386LEAL { + if v.AuxInt != 0 { break } - off2 := v_1.AuxInt - sym2 := v_1.Aux - base := v_1.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { + l := v.Args[0] + if l.Op != Op386ANDL { break } - v.reset(Op386ANDLload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(val) - v.AddArg(base) - v.AddArg(mem) + y := l.Args[1] + x := l.Args[0] + if !(l.Uses == 1) { + break + } + v.reset(Op386TESTB) + v.AddArg(x) + v.AddArg(y) return true } - // match: (ANDLload [off1] {sym1} val (LEAL4 [off2] {sym2} ptr idx) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (ANDLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} val ptr idx mem) + // match: (CMPBconst l:(ANDLconst [c] x) [0]) + // cond: l.Uses==1 + // result: (TESTBconst [int64(int8(c))] x) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] - val := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386LEAL4 { + if v.AuxInt != 0 { break } - off2 := v_1.AuxInt - sym2 := v_1.Aux - idx := v_1.Args[1] - ptr := v_1.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + l := v.Args[0] + if l.Op != Op386ANDLconst { break } - v.reset(Op386ANDLloadidx4) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(val) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + c := l.AuxInt + x := l.Args[0] + if !(l.Uses == 1) { + break + } + v.reset(Op386TESTBconst) + v.AuxInt = int64(int8(c)) + v.AddArg(x) return true } - return false -} -func rewriteValue386_Op386ANDLloadidx4_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (ANDLloadidx4 [off1] {sym} val (ADDLconst [off2] base) idx mem) - // cond: is32Bit(off1+off2) - // result: (ANDLloadidx4 [off1+off2] {sym} val base idx mem) + // match: (CMPBconst x [0]) + // result: (TESTB x x) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[3] - val := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { - break - } - off2 := v_1.AuxInt - base := v_1.Args[0] - idx := v.Args[2] - if !(is32Bit(off1 + off2)) { + if v.AuxInt != 0 { break } - v.reset(Op386ANDLloadidx4) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(val) - v.AddArg(base) - v.AddArg(idx) - v.AddArg(mem) + x := v.Args[0] + v.reset(Op386TESTB) + v.AddArg(x) + v.AddArg(x) return true } - // match: (ANDLloadidx4 [off1] {sym} val base (ADDLconst [off2] idx) mem) - // cond: is32Bit(off1+off2*4) - // result: (ANDLloadidx4 [off1+off2*4] {sym} val base idx mem) + // match: (CMPBconst l:(MOVBload {sym} [off] ptr mem) [c]) + // cond: l.Uses == 1 && validValAndOff(c, off) && clobber(l) + // result: @l.Block (CMPBconstload {sym} [makeValAndOff(c,off)] ptr mem) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[3] - val := v.Args[0] - base := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != Op386ADDLconst { + c := v.AuxInt + l := v.Args[0] + if l.Op != Op386MOVBload { break } - off2 := v_2.AuxInt - idx := v_2.Args[0] - if !(is32Bit(off1 + off2*4)) { + off := l.AuxInt + sym := l.Aux + mem := l.Args[1] + ptr := l.Args[0] + if !(l.Uses == 1 && validValAndOff(c, off) && clobber(l)) { break } - v.reset(Op386ANDLloadidx4) - v.AuxInt = off1 + off2*4 - v.Aux = sym - v.AddArg(val) - v.AddArg(base) - v.AddArg(idx) - v.AddArg(mem) + b = l.Block + v0 := b.NewValue0(l.Pos, Op386CMPBconstload, types.TypeFlags) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = makeValAndOff(c, off) + v0.Aux = sym + v0.AddArg(ptr) + v0.AddArg(mem) return true } - // match: (ANDLloadidx4 [off1] {sym1} val (LEAL [off2] {sym2} base) idx mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (ANDLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} val base idx mem) + return false +} +func rewriteValue386_Op386CMPBload_0(v *Value) bool { + // match: (CMPBload {sym} [off] ptr (MOVLconst [c]) mem) + // cond: validValAndOff(int64(int8(c)),off) + // result: (CMPBconstload {sym} [makeValAndOff(int64(int8(c)),off)] ptr mem) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[3] - val := v.Args[0] + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != Op386LEAL { + if v_1.Op != Op386MOVLconst { break } - off2 := v_1.AuxInt - sym2 := v_1.Aux - base := v_1.Args[0] - idx := v.Args[2] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { + c := v_1.AuxInt + if !(validValAndOff(int64(int8(c)), off)) { break } - v.reset(Op386ANDLloadidx4) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(val) - v.AddArg(base) - v.AddArg(idx) + v.reset(Op386CMPBconstload) + v.AuxInt = makeValAndOff(int64(int8(c)), off) + v.Aux = sym + v.AddArg(ptr) v.AddArg(mem) return true } return false } -func rewriteValue386_Op386ANDLmodify_0(v *Value) bool { +func rewriteValue386_Op386CMPL_0(v *Value) bool { b := v.Block - config := b.Func.Config - // match: (ANDLmodify [off1] {sym} (ADDLconst [off2] base) val mem) - // cond: is32Bit(off1+off2) - // result: (ANDLmodify [off1+off2] {sym} base val mem) + // match: (CMPL x (MOVLconst [c])) + // result: (CMPLconst x [c]) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { - break - } - off2 := v_0.AuxInt - base := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1 + off2)) { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386MOVLconst { break } - v.reset(Op386ANDLmodify) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(base) - v.AddArg(val) - v.AddArg(mem) + c := v_1.AuxInt + v.reset(Op386CMPLconst) + v.AuxInt = c + v.AddArg(x) return true } - // match: (ANDLmodify [off1] {sym1} (LEAL [off2] {sym2} base) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (ANDLmodify [off1+off2] {mergeSym(sym1,sym2)} base val mem) + // match: (CMPL (MOVLconst [c]) x) + // result: (InvertFlags (CMPLconst x [c])) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] + x := v.Args[1] v_0 := v.Args[0] - if v_0.Op != Op386LEAL { - break - } - off2 := v_0.AuxInt - sym2 := v_0.Aux - base := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { - break - } - v.reset(Op386ANDLmodify) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(base) - v.AddArg(val) - v.AddArg(mem) - return true - } - return false -} -func rewriteValue386_Op386ANDLmodifyidx4_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (ANDLmodifyidx4 [off1] {sym} (ADDLconst [off2] base) idx val mem) - // cond: is32Bit(off1+off2) - // result: (ANDLmodifyidx4 [off1+off2] {sym} base idx val mem) - for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[3] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { - break - } - off2 := v_0.AuxInt - base := v_0.Args[0] - idx := v.Args[1] - val := v.Args[2] - if !(is32Bit(off1 + off2)) { - break - } - v.reset(Op386ANDLmodifyidx4) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(base) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (ANDLmodifyidx4 [off1] {sym} base (ADDLconst [off2] idx) val mem) - // cond: is32Bit(off1+off2*4) - // result: (ANDLmodifyidx4 [off1+off2*4] {sym} base idx val mem) - for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[3] - base := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { - break - } - off2 := v_1.AuxInt - idx := v_1.Args[0] - val := v.Args[2] - if !(is32Bit(off1 + off2*4)) { - break - } - v.reset(Op386ANDLmodifyidx4) - v.AuxInt = off1 + off2*4 - v.Aux = sym - v.AddArg(base) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (ANDLmodifyidx4 [off1] {sym1} (LEAL [off2] {sym2} base) idx val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (ANDLmodifyidx4 [off1+off2] {mergeSym(sym1,sym2)} base idx val mem) - for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[3] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL { - break - } - off2 := v_0.AuxInt - sym2 := v_0.Aux - base := v_0.Args[0] - idx := v.Args[1] - val := v.Args[2] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { - break - } - v.reset(Op386ANDLmodifyidx4) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(base) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (ANDLmodifyidx4 [off] {sym} ptr idx (MOVLconst [c]) mem) - // cond: validValAndOff(c,off) - // result: (ANDLconstmodifyidx4 [makeValAndOff(c,off)] {sym} ptr idx mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != Op386MOVLconst { - break - } - c := v_2.AuxInt - if !(validValAndOff(c, off)) { - break - } - v.reset(Op386ANDLconstmodifyidx4) - v.AuxInt = makeValAndOff(c, off) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - return false -} -func rewriteValue386_Op386CMPB_0(v *Value) bool { - b := v.Block - // match: (CMPB x (MOVLconst [c])) - // result: (CMPBconst x [int64(int8(c))]) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386MOVLconst { - break - } - c := v_1.AuxInt - v.reset(Op386CMPBconst) - v.AuxInt = int64(int8(c)) - v.AddArg(x) - return true - } - // match: (CMPB (MOVLconst [c]) x) - // result: (InvertFlags (CMPBconst x [int64(int8(c))])) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386MOVLconst { + if v_0.Op != Op386MOVLconst { break } c := v_0.AuxInt v.reset(Op386InvertFlags) - v0 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) - v0.AuxInt = int64(int8(c)) + v0 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) + v0.AuxInt = c v0.AddArg(x) v.AddArg(v0) return true } - // match: (CMPB l:(MOVBload {sym} [off] ptr mem) x) + // match: (CMPL l:(MOVLload {sym} [off] ptr mem) x) // cond: canMergeLoad(v, l) && clobber(l) - // result: (CMPBload {sym} [off] ptr x mem) + // result: (CMPLload {sym} [off] ptr x mem) for { x := v.Args[1] l := v.Args[0] - if l.Op != Op386MOVBload { + if l.Op != Op386MOVLload { break } off := l.AuxInt @@ -2953,7 +2863,7 @@ func rewriteValue386_Op386CMPB_0(v *Value) bool { if !(canMergeLoad(v, l) && clobber(l)) { break } - v.reset(Op386CMPBload) + v.reset(Op386CMPLload) v.AuxInt = off v.Aux = sym v.AddArg(ptr) @@ -2961,14 +2871,14 @@ func rewriteValue386_Op386CMPB_0(v *Value) bool { v.AddArg(mem) return true } - // match: (CMPB x l:(MOVBload {sym} [off] ptr mem)) + // match: (CMPL x l:(MOVLload {sym} [off] ptr mem)) // cond: canMergeLoad(v, l) && clobber(l) - // result: (InvertFlags (CMPBload {sym} [off] ptr x mem)) + // result: (InvertFlags (CMPLload {sym} [off] ptr x mem)) for { _ = v.Args[1] x := v.Args[0] l := v.Args[1] - if l.Op != Op386MOVBload { + if l.Op != Op386MOVLload { break } off := l.AuxInt @@ -2979,7 +2889,7 @@ func rewriteValue386_Op386CMPB_0(v *Value) bool { break } v.reset(Op386InvertFlags) - v0 := b.NewValue0(l.Pos, Op386CMPBload, types.TypeFlags) + v0 := b.NewValue0(l.Pos, Op386CMPLload, types.TypeFlags) v0.AuxInt = off v0.Aux = sym v0.AddArg(ptr) @@ -2990,10 +2900,9 @@ func rewriteValue386_Op386CMPB_0(v *Value) bool { } return false } -func rewriteValue386_Op386CMPBconst_0(v *Value) bool { - b := v.Block - // match: (CMPBconst (MOVLconst [x]) [y]) - // cond: int8(x)==int8(y) +func rewriteValue386_Op386CMPLconst_0(v *Value) bool { + // match: (CMPLconst (MOVLconst [x]) [y]) + // cond: int32(x)==int32(y) // result: (FlagEQ) for { y := v.AuxInt @@ -3002,14 +2911,14 @@ func rewriteValue386_Op386CMPBconst_0(v *Value) bool { break } x := v_0.AuxInt - if !(int8(x) == int8(y)) { + if !(int32(x) == int32(y)) { break } v.reset(Op386FlagEQ) return true } - // match: (CMPBconst (MOVLconst [x]) [y]) - // cond: int8(x)uint8(y) + // match: (CMPLconst (MOVLconst [x]) [y]) + // cond: int32(x)uint32(y) // result: (FlagLT_UGT) for { y := v.AuxInt @@ -3034,14 +2943,14 @@ func rewriteValue386_Op386CMPBconst_0(v *Value) bool { break } x := v_0.AuxInt - if !(int8(x) < int8(y) && uint8(x) > uint8(y)) { + if !(int32(x) < int32(y) && uint32(x) > uint32(y)) { break } v.reset(Op386FlagLT_UGT) return true } - // match: (CMPBconst (MOVLconst [x]) [y]) - // cond: int8(x)>int8(y) && uint8(x)int32(y) && uint32(x) int8(y) && uint8(x) < uint8(y)) { + if !(int32(x) > int32(y) && uint32(x) < uint32(y)) { break } v.reset(Op386FlagGT_ULT) return true } - // match: (CMPBconst (MOVLconst [x]) [y]) - // cond: int8(x)>int8(y) && uint8(x)>uint8(y) + // match: (CMPLconst (MOVLconst [x]) [y]) + // cond: int32(x)>int32(y) && uint32(x)>uint32(y) // result: (FlagGT_UGT) for { y := v.AuxInt @@ -3066,14 +2975,30 @@ func rewriteValue386_Op386CMPBconst_0(v *Value) bool { break } x := v_0.AuxInt - if !(int8(x) > int8(y) && uint8(x) > uint8(y)) { + if !(int32(x) > int32(y) && uint32(x) > uint32(y)) { break } v.reset(Op386FlagGT_UGT) return true } - // match: (CMPBconst (ANDLconst _ [m]) [n]) - // cond: 0 <= int8(m) && int8(m) < int8(n) + // match: (CMPLconst (SHRLconst _ [c]) [n]) + // cond: 0 <= n && 0 < c && c <= 32 && (1<uint32(y) + // match: (CMPWconst (MOVLconst [x]) [y]) + // cond: int16(x)uint16(y) // result: (FlagLT_UGT) for { y := v.AuxInt @@ -3325,14 +3255,14 @@ func rewriteValue386_Op386CMPLconst_0(v *Value) bool { break } x := v_0.AuxInt - if !(int32(x) < int32(y) && uint32(x) > uint32(y)) { + if !(int16(x) < int16(y) && uint16(x) > uint16(y)) { break } v.reset(Op386FlagLT_UGT) return true } - // match: (CMPLconst (MOVLconst [x]) [y]) - // cond: int32(x)>int32(y) && uint32(x)int16(y) && uint16(x) int32(y) && uint32(x) < uint32(y)) { + if !(int16(x) > int16(y) && uint16(x) < uint16(y)) { break } v.reset(Op386FlagGT_ULT) return true } - // match: (CMPLconst (MOVLconst [x]) [y]) - // cond: int32(x)>int32(y) && uint32(x)>uint32(y) + // match: (CMPWconst (MOVLconst [x]) [y]) + // cond: int16(x)>int16(y) && uint16(x)>uint16(y) // result: (FlagGT_UGT) for { y := v.AuxInt @@ -3357,30 +3287,14 @@ func rewriteValue386_Op386CMPLconst_0(v *Value) bool { break } x := v_0.AuxInt - if !(int32(x) > int32(y) && uint32(x) > uint32(y)) { + if !(int16(x) > int16(y) && uint16(x) > uint16(y)) { break } v.reset(Op386FlagGT_UGT) return true } - // match: (CMPLconst (SHRLconst _ [c]) [n]) - // cond: 0 <= n && 0 < c && c <= 32 && (1<uint16(y) - // result: (FlagLT_UGT) + return false +} +func rewriteValue386_Op386LEAL_0(v *Value) bool { + // match: (LEAL [c] {s} (ADDLconst [d] x)) + // cond: is32Bit(c+d) + // result: (LEAL [c+d] {s} x) for { - y := v.AuxInt + c := v.AuxInt + s := v.Aux v_0 := v.Args[0] - if v_0.Op != Op386MOVLconst { + if v_0.Op != Op386ADDLconst { break } - x := v_0.AuxInt - if !(int16(x) < int16(y) && uint16(x) > uint16(y)) { + d := v_0.AuxInt + x := v_0.Args[0] + if !(is32Bit(c + d)) { break } - v.reset(Op386FlagLT_UGT) + v.reset(Op386LEAL) + v.AuxInt = c + d + v.Aux = s + v.AddArg(x) return true } - // match: (CMPWconst (MOVLconst [x]) [y]) - // cond: int16(x)>int16(y) && uint16(x) int16(y) && uint16(x) < uint16(y)) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v_0.Args[_i0] + y := v_0.Args[1^_i0] + if !(x.Op != OpSB && y.Op != OpSB) { + continue + } + v.reset(Op386LEAL1) + v.AuxInt = c + v.Aux = s + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(Op386FlagGT_ULT) - return true + break } - // match: (CMPWconst (MOVLconst [x]) [y]) - // cond: int16(x)>int16(y) && uint16(x)>uint16(y) - // result: (FlagGT_UGT) + // match: (LEAL [off1] {sym1} (LEAL [off2] {sym2} x)) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (LEAL [off1+off2] {mergeSym(sym1,sym2)} x) for { - y := v.AuxInt + off1 := v.AuxInt + sym1 := v.Aux v_0 := v.Args[0] - if v_0.Op != Op386MOVLconst { + if v_0.Op != Op386LEAL { break } - x := v_0.AuxInt - if !(int16(x) > int16(y) && uint16(x) > uint16(y)) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + x := v_0.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(Op386FlagGT_UGT) + v.reset(Op386LEAL) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(x) return true } - // match: (CMPWconst (ANDLconst _ [m]) [n]) - // cond: 0 <= int16(m) && int16(m) < int16(n) - // result: (FlagLT_ULT) + // match: (LEAL [off1] {sym1} (LEAL1 [off2] {sym2} x y)) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (LEAL1 [off1+off2] {mergeSym(sym1,sym2)} x y) for { - n := v.AuxInt + off1 := v.AuxInt + sym1 := v.Aux v_0 := v.Args[0] - if v_0.Op != Op386ANDLconst { + if v_0.Op != Op386LEAL1 { break } - m := v_0.AuxInt - if !(0 <= int16(m) && int16(m) < int16(n)) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + y := v_0.Args[1] + x := v_0.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(Op386FlagLT_ULT) + v.reset(Op386LEAL1) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(x) + v.AddArg(y) return true } - // match: (CMPWconst l:(ANDL x y) [0]) - // cond: l.Uses==1 - // result: (TESTW x y) + // match: (LEAL [off1] {sym1} (LEAL2 [off2] {sym2} x y)) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (LEAL2 [off1+off2] {mergeSym(sym1,sym2)} x y) for { - if v.AuxInt != 0 { - break - } - l := v.Args[0] - if l.Op != Op386ANDL { + off1 := v.AuxInt + sym1 := v.Aux + v_0 := v.Args[0] + if v_0.Op != Op386LEAL2 { break } - y := l.Args[1] - x := l.Args[0] - if !(l.Uses == 1) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + y := v_0.Args[1] + x := v_0.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(Op386TESTW) + v.reset(Op386LEAL2) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) v.AddArg(x) v.AddArg(y) return true } - // match: (CMPWconst l:(ANDLconst [c] x) [0]) - // cond: l.Uses==1 - // result: (TESTWconst [int64(int16(c))] x) + // match: (LEAL [off1] {sym1} (LEAL4 [off2] {sym2} x y)) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (LEAL4 [off1+off2] {mergeSym(sym1,sym2)} x y) for { - if v.AuxInt != 0 { - break - } - l := v.Args[0] - if l.Op != Op386ANDLconst { + off1 := v.AuxInt + sym1 := v.Aux + v_0 := v.Args[0] + if v_0.Op != Op386LEAL4 { break } - c := l.AuxInt - x := l.Args[0] - if !(l.Uses == 1) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + y := v_0.Args[1] + x := v_0.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(Op386TESTWconst) - v.AuxInt = int64(int16(c)) + v.reset(Op386LEAL4) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) v.AddArg(x) + v.AddArg(y) return true } - // match: (CMPWconst x [0]) - // result: (TESTW x x) + // match: (LEAL [off1] {sym1} (LEAL8 [off2] {sym2} x y)) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (LEAL8 [off1+off2] {mergeSym(sym1,sym2)} x y) for { - if v.AuxInt != 0 { + off1 := v.AuxInt + sym1 := v.Aux + v_0 := v.Args[0] + if v_0.Op != Op386LEAL8 { break } - x := v.Args[0] - v.reset(Op386TESTW) - v.AddArg(x) + off2 := v_0.AuxInt + sym2 := v_0.Aux + y := v_0.Args[1] + x := v_0.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + break + } + v.reset(Op386LEAL8) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) v.AddArg(x) + v.AddArg(y) return true } - // match: (CMPWconst l:(MOVWload {sym} [off] ptr mem) [c]) - // cond: l.Uses == 1 && validValAndOff(c, off) && clobber(l) - // result: @l.Block (CMPWconstload {sym} [makeValAndOff(c,off)] ptr mem) + return false +} +func rewriteValue386_Op386LEAL1_0(v *Value) bool { + // match: (LEAL1 [c] {s} (ADDLconst [d] x) y) + // cond: is32Bit(c+d) && x.Op != OpSB + // result: (LEAL1 [c+d] {s} x y) for { c := v.AuxInt - l := v.Args[0] - if l.Op != Op386MOVWload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(l.Uses == 1 && validValAndOff(c, off) && clobber(l)) { - break + s := v.Aux + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != Op386ADDLconst { + continue + } + d := v_0.AuxInt + x := v_0.Args[0] + y := v.Args[1^_i0] + if !(is32Bit(c+d) && x.Op != OpSB) { + continue + } + v.reset(Op386LEAL1) + v.AuxInt = c + d + v.Aux = s + v.AddArg(x) + v.AddArg(y) + return true } - b = l.Block - v0 := b.NewValue0(l.Pos, Op386CMPWconstload, types.TypeFlags) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = makeValAndOff(c, off) - v0.Aux = sym - v0.AddArg(ptr) - v0.AddArg(mem) - return true + break + } + // match: (LEAL1 [c] {s} x (SHLLconst [1] y)) + // result: (LEAL2 [c] {s} x y) + for { + c := v.AuxInt + s := v.Aux + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386SHLLconst || v_1.AuxInt != 1 { + continue + } + y := v_1.Args[0] + v.reset(Op386LEAL2) + v.AuxInt = c + v.Aux = s + v.AddArg(x) + v.AddArg(y) + return true + } + break + } + // match: (LEAL1 [c] {s} x (SHLLconst [2] y)) + // result: (LEAL4 [c] {s} x y) + for { + c := v.AuxInt + s := v.Aux + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386SHLLconst || v_1.AuxInt != 2 { + continue + } + y := v_1.Args[0] + v.reset(Op386LEAL4) + v.AuxInt = c + v.Aux = s + v.AddArg(x) + v.AddArg(y) + return true + } + break + } + // match: (LEAL1 [c] {s} x (SHLLconst [3] y)) + // result: (LEAL8 [c] {s} x y) + for { + c := v.AuxInt + s := v.Aux + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386SHLLconst || v_1.AuxInt != 3 { + continue + } + y := v_1.Args[0] + v.reset(Op386LEAL8) + v.AuxInt = c + v.Aux = s + v.AddArg(x) + v.AddArg(y) + return true + } + break + } + // match: (LEAL1 [off1] {sym1} (LEAL [off2] {sym2} x) y) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB + // result: (LEAL1 [off1+off2] {mergeSym(sym1,sym2)} x y) + for { + off1 := v.AuxInt + sym1 := v.Aux + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != Op386LEAL { + continue + } + off2 := v_0.AuxInt + sym2 := v_0.Aux + x := v_0.Args[0] + y := v.Args[1^_i0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { + continue + } + v.reset(Op386LEAL1) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(x) + v.AddArg(y) + return true + } + break } return false } -func rewriteValue386_Op386CMPWload_0(v *Value) bool { - // match: (CMPWload {sym} [off] ptr (MOVLconst [c]) mem) - // cond: validValAndOff(int64(int16(c)),off) - // result: (CMPWconstload {sym} [makeValAndOff(int64(int16(c)),off)] ptr mem) +func rewriteValue386_Op386LEAL2_0(v *Value) bool { + // match: (LEAL2 [c] {s} (ADDLconst [d] x) y) + // cond: is32Bit(c+d) && x.Op != OpSB + // result: (LEAL2 [c+d] {s} x y) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386MOVLconst { + c := v.AuxInt + s := v.Aux + y := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386ADDLconst { break } - c := v_1.AuxInt - if !(validValAndOff(int64(int16(c)), off)) { + d := v_0.AuxInt + x := v_0.Args[0] + if !(is32Bit(c+d) && x.Op != OpSB) { break } - v.reset(Op386CMPWconstload) - v.AuxInt = makeValAndOff(int64(int16(c)), off) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(mem) + v.reset(Op386LEAL2) + v.AuxInt = c + d + v.Aux = s + v.AddArg(x) + v.AddArg(y) return true } - return false -} -func rewriteValue386_Op386DIVSD_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (DIVSD x l:(MOVSDload [off] {sym} ptr mem)) - // cond: canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l) - // result: (DIVSDload x [off] {sym} ptr mem) + // match: (LEAL2 [c] {s} x (ADDLconst [d] y)) + // cond: is32Bit(c+2*d) && y.Op != OpSB + // result: (LEAL2 [c+2*d] {s} x y) for { + c := v.AuxInt + s := v.Aux _ = v.Args[1] x := v.Args[0] - l := v.Args[1] - if l.Op != Op386MOVSDload { + v_1 := v.Args[1] + if v_1.Op != Op386ADDLconst { break } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l)) { + d := v_1.AuxInt + y := v_1.Args[0] + if !(is32Bit(c+2*d) && y.Op != OpSB) { break } - v.reset(Op386DIVSDload) - v.AuxInt = off - v.Aux = sym + v.reset(Op386LEAL2) + v.AuxInt = c + 2*d + v.Aux = s v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) + v.AddArg(y) return true } - return false -} -func rewriteValue386_Op386DIVSDload_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (DIVSDload [off1] {sym} val (ADDLconst [off2] base) mem) - // cond: is32Bit(off1+off2) - // result: (DIVSDload [off1+off2] {sym} val base mem) + // match: (LEAL2 [c] {s} x (SHLLconst [1] y)) + // result: (LEAL4 [c] {s} x y) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[2] - val := v.Args[0] + c := v.AuxInt + s := v.Aux + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { + if v_1.Op != Op386SHLLconst || v_1.AuxInt != 1 { break } - off2 := v_1.AuxInt - base := v_1.Args[0] - if !(is32Bit(off1 + off2)) { + y := v_1.Args[0] + v.reset(Op386LEAL4) + v.AuxInt = c + v.Aux = s + v.AddArg(x) + v.AddArg(y) + return true + } + // match: (LEAL2 [c] {s} x (SHLLconst [2] y)) + // result: (LEAL8 [c] {s} x y) + for { + c := v.AuxInt + s := v.Aux + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386SHLLconst || v_1.AuxInt != 2 { break } - v.reset(Op386DIVSDload) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(val) - v.AddArg(base) - v.AddArg(mem) + y := v_1.Args[0] + v.reset(Op386LEAL8) + v.AuxInt = c + v.Aux = s + v.AddArg(x) + v.AddArg(y) return true } - // match: (DIVSDload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (DIVSDload [off1+off2] {mergeSym(sym1,sym2)} val base mem) + // match: (LEAL2 [off1] {sym1} (LEAL [off2] {sym2} x) y) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB + // result: (LEAL2 [off1+off2] {mergeSym(sym1,sym2)} x y) for { off1 := v.AuxInt sym1 := v.Aux - mem := v.Args[2] - val := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386LEAL { + y := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386LEAL { break } - off2 := v_1.AuxInt - sym2 := v_1.Aux - base := v_1.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + x := v_0.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { break } - v.reset(Op386DIVSDload) + v.reset(Op386LEAL2) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) - v.AddArg(val) - v.AddArg(base) - v.AddArg(mem) + v.AddArg(x) + v.AddArg(y) return true } return false } -func rewriteValue386_Op386DIVSS_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (DIVSS x l:(MOVSSload [off] {sym} ptr mem)) - // cond: canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l) - // result: (DIVSSload x [off] {sym} ptr mem) +func rewriteValue386_Op386LEAL4_0(v *Value) bool { + // match: (LEAL4 [c] {s} (ADDLconst [d] x) y) + // cond: is32Bit(c+d) && x.Op != OpSB + // result: (LEAL4 [c+d] {s} x y) for { - _ = v.Args[1] - x := v.Args[0] - l := v.Args[1] - if l.Op != Op386MOVSSload { + c := v.AuxInt + s := v.Aux + y := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386ADDLconst { break } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l)) { + d := v_0.AuxInt + x := v_0.Args[0] + if !(is32Bit(c+d) && x.Op != OpSB) { break } - v.reset(Op386DIVSSload) - v.AuxInt = off - v.Aux = sym + v.reset(Op386LEAL4) + v.AuxInt = c + d + v.Aux = s v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) + v.AddArg(y) return true } - return false -} -func rewriteValue386_Op386DIVSSload_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (DIVSSload [off1] {sym} val (ADDLconst [off2] base) mem) - // cond: is32Bit(off1+off2) - // result: (DIVSSload [off1+off2] {sym} val base mem) + // match: (LEAL4 [c] {s} x (ADDLconst [d] y)) + // cond: is32Bit(c+4*d) && y.Op != OpSB + // result: (LEAL4 [c+4*d] {s} x y) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[2] - val := v.Args[0] + c := v.AuxInt + s := v.Aux + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { break } - off2 := v_1.AuxInt - base := v_1.Args[0] - if !(is32Bit(off1 + off2)) { + d := v_1.AuxInt + y := v_1.Args[0] + if !(is32Bit(c+4*d) && y.Op != OpSB) { break } - v.reset(Op386DIVSSload) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(val) - v.AddArg(base) - v.AddArg(mem) + v.reset(Op386LEAL4) + v.AuxInt = c + 4*d + v.Aux = s + v.AddArg(x) + v.AddArg(y) return true } - // match: (DIVSSload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (DIVSSload [off1+off2] {mergeSym(sym1,sym2)} val base mem) + // match: (LEAL4 [c] {s} x (SHLLconst [1] y)) + // result: (LEAL8 [c] {s} x y) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] - val := v.Args[0] + c := v.AuxInt + s := v.Aux + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != Op386LEAL { - break - } - off2 := v_1.AuxInt - sym2 := v_1.Aux - base := v_1.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { + if v_1.Op != Op386SHLLconst || v_1.AuxInt != 1 { break } - v.reset(Op386DIVSSload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(val) - v.AddArg(base) - v.AddArg(mem) + y := v_1.Args[0] + v.reset(Op386LEAL8) + v.AuxInt = c + v.Aux = s + v.AddArg(x) + v.AddArg(y) return true } - return false -} -func rewriteValue386_Op386LEAL_0(v *Value) bool { - // match: (LEAL [c] {s} (ADDLconst [d] x)) - // cond: is32Bit(c+d) - // result: (LEAL [c+d] {s} x) + // match: (LEAL4 [off1] {sym1} (LEAL [off2] {sym2} x) y) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB + // result: (LEAL4 [off1+off2] {mergeSym(sym1,sym2)} x y) for { - c := v.AuxInt - s := v.Aux + off1 := v.AuxInt + sym1 := v.Aux + y := v.Args[1] v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { + if v_0.Op != Op386LEAL { break } - d := v_0.AuxInt + off2 := v_0.AuxInt + sym2 := v_0.Aux x := v_0.Args[0] - if !(is32Bit(c + d)) { + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { break } - v.reset(Op386LEAL) - v.AuxInt = c + d - v.Aux = s + v.reset(Op386LEAL4) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) v.AddArg(x) + v.AddArg(y) return true } - // match: (LEAL [c] {s} (ADDL x y)) - // cond: x.Op != OpSB && y.Op != OpSB - // result: (LEAL1 [c] {s} x y) + return false +} +func rewriteValue386_Op386LEAL8_0(v *Value) bool { + // match: (LEAL8 [c] {s} (ADDLconst [d] x) y) + // cond: is32Bit(c+d) && x.Op != OpSB + // result: (LEAL8 [c+d] {s} x y) for { c := v.AuxInt s := v.Aux + y := v.Args[1] v_0 := v.Args[0] - if v_0.Op != Op386ADDL { + if v_0.Op != Op386ADDLconst { break } - y := v_0.Args[1] + d := v_0.AuxInt x := v_0.Args[0] - if !(x.Op != OpSB && y.Op != OpSB) { + if !(is32Bit(c+d) && x.Op != OpSB) { break } - v.reset(Op386LEAL1) - v.AuxInt = c + v.reset(Op386LEAL8) + v.AuxInt = c + d v.Aux = s v.AddArg(x) v.AddArg(y) return true } - // match: (LEAL [c] {s} (ADDL y x)) - // cond: x.Op != OpSB && y.Op != OpSB - // result: (LEAL1 [c] {s} x y) + // match: (LEAL8 [c] {s} x (ADDLconst [d] y)) + // cond: is32Bit(c+8*d) && y.Op != OpSB + // result: (LEAL8 [c+8*d] {s} x y) for { c := v.AuxInt s := v.Aux - v_0 := v.Args[0] - if v_0.Op != Op386ADDL { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386ADDLconst { break } - x := v_0.Args[1] - y := v_0.Args[0] - if !(x.Op != OpSB && y.Op != OpSB) { + d := v_1.AuxInt + y := v_1.Args[0] + if !(is32Bit(c+8*d) && y.Op != OpSB) { break } - v.reset(Op386LEAL1) - v.AuxInt = c + v.reset(Op386LEAL8) + v.AuxInt = c + 8*d v.Aux = s v.AddArg(x) v.AddArg(y) return true } - // match: (LEAL [off1] {sym1} (LEAL [off2] {sym2} x)) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (LEAL [off1+off2] {mergeSym(sym1,sym2)} x) + // match: (LEAL8 [off1] {sym1} (LEAL [off2] {sym2} x) y) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB + // result: (LEAL8 [off1+off2] {mergeSym(sym1,sym2)} x y) for { off1 := v.AuxInt sym1 := v.Aux + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -4050,877 +4148,794 @@ func rewriteValue386_Op386LEAL_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux x := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { break } - v.reset(Op386LEAL) + v.reset(Op386LEAL8) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) v.AddArg(x) + v.AddArg(y) return true } - // match: (LEAL [off1] {sym1} (LEAL1 [off2] {sym2} x y)) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (LEAL1 [off1+off2] {mergeSym(sym1,sym2)} x y) + return false +} +func rewriteValue386_Op386MOVBLSX_0(v *Value) bool { + b := v.Block + // match: (MOVBLSX x:(MOVBload [off] {sym} ptr mem)) + // cond: x.Uses == 1 && clobber(x) + // result: @x.Block (MOVBLSXload [off] {sym} ptr mem) for { - off1 := v.AuxInt - sym1 := v.Aux - v_0 := v.Args[0] - if v_0.Op != Op386LEAL1 { + x := v.Args[0] + if x.Op != Op386MOVBload { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - y := v_0.Args[1] - x := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + off := x.AuxInt + sym := x.Aux + mem := x.Args[1] + ptr := x.Args[0] + if !(x.Uses == 1 && clobber(x)) { break } - v.reset(Op386LEAL1) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(x) - v.AddArg(y) + b = x.Block + v0 := b.NewValue0(x.Pos, Op386MOVBLSXload, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = off + v0.Aux = sym + v0.AddArg(ptr) + v0.AddArg(mem) return true } - // match: (LEAL [off1] {sym1} (LEAL2 [off2] {sym2} x y)) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (LEAL2 [off1+off2] {mergeSym(sym1,sym2)} x y) + // match: (MOVBLSX (ANDLconst [c] x)) + // cond: c & 0x80 == 0 + // result: (ANDLconst [c & 0x7f] x) for { - off1 := v.AuxInt - sym1 := v.Aux v_0 := v.Args[0] - if v_0.Op != Op386LEAL2 { + if v_0.Op != Op386ANDLconst { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - y := v_0.Args[1] + c := v_0.AuxInt x := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + if !(c&0x80 == 0) { break } - v.reset(Op386LEAL2) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.reset(Op386ANDLconst) + v.AuxInt = c & 0x7f v.AddArg(x) - v.AddArg(y) return true } - // match: (LEAL [off1] {sym1} (LEAL4 [off2] {sym2} x y)) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (LEAL4 [off1+off2] {mergeSym(sym1,sym2)} x y) + return false +} +func rewriteValue386_Op386MOVBLSXload_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (MOVBLSXload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) + // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) + // result: (MOVBLSX x) for { - off1 := v.AuxInt - sym1 := v.Aux - v_0 := v.Args[0] - if v_0.Op != Op386LEAL4 { + off := v.AuxInt + sym := v.Aux + _ = v.Args[1] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386MOVBstore { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - y := v_0.Args[1] - x := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + off2 := v_1.AuxInt + sym2 := v_1.Aux + _ = v_1.Args[2] + ptr2 := v_1.Args[0] + x := v_1.Args[1] + if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { break } - v.reset(Op386LEAL4) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.reset(Op386MOVBLSX) v.AddArg(x) - v.AddArg(y) return true } - // match: (LEAL [off1] {sym1} (LEAL8 [off2] {sym2} x y)) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (LEAL8 [off1+off2] {mergeSym(sym1,sym2)} x y) + // match: (MOVBLSXload [off1] {sym1} (LEAL [off2] {sym2} base) mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVBLSXload [off1+off2] {mergeSym(sym1,sym2)} base mem) for { off1 := v.AuxInt sym1 := v.Aux + mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != Op386LEAL8 { + if v_0.Op != Op386LEAL { break } off2 := v_0.AuxInt sym2 := v_0.Aux - y := v_0.Args[1] - x := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + base := v_0.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(Op386LEAL8) + v.reset(Op386MOVBLSXload) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) - v.AddArg(x) - v.AddArg(y) + v.AddArg(base) + v.AddArg(mem) return true } return false } -func rewriteValue386_Op386LEAL1_0(v *Value) bool { - // match: (LEAL1 [c] {s} (ADDLconst [d] x) y) - // cond: is32Bit(c+d) && x.Op != OpSB - // result: (LEAL1 [c+d] {s} x y) +func rewriteValue386_Op386MOVBLZX_0(v *Value) bool { + b := v.Block + // match: (MOVBLZX x:(MOVBload [off] {sym} ptr mem)) + // cond: x.Uses == 1 && clobber(x) + // result: @x.Block (MOVBload [off] {sym} ptr mem) for { - c := v.AuxInt - s := v.Aux - y := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { + x := v.Args[0] + if x.Op != Op386MOVBload { break } - d := v_0.AuxInt - x := v_0.Args[0] - if !(is32Bit(c+d) && x.Op != OpSB) { + off := x.AuxInt + sym := x.Aux + mem := x.Args[1] + ptr := x.Args[0] + if !(x.Uses == 1 && clobber(x)) { break } - v.reset(Op386LEAL1) - v.AuxInt = c + d - v.Aux = s - v.AddArg(x) - v.AddArg(y) + b = x.Block + v0 := b.NewValue0(x.Pos, Op386MOVBload, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = off + v0.Aux = sym + v0.AddArg(ptr) + v0.AddArg(mem) return true } - // match: (LEAL1 [c] {s} y (ADDLconst [d] x)) - // cond: is32Bit(c+d) && x.Op != OpSB - // result: (LEAL1 [c+d] {s} x y) + // match: (MOVBLZX x:(MOVBloadidx1 [off] {sym} ptr idx mem)) + // cond: x.Uses == 1 && clobber(x) + // result: @x.Block (MOVBloadidx1 [off] {sym} ptr idx mem) for { - c := v.AuxInt - s := v.Aux - _ = v.Args[1] - y := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { - break - } - d := v_1.AuxInt - x := v_1.Args[0] - if !(is32Bit(c+d) && x.Op != OpSB) { + x := v.Args[0] + if x.Op != Op386MOVBloadidx1 { break } - v.reset(Op386LEAL1) - v.AuxInt = c + d - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (LEAL1 [c] {s} x (SHLLconst [1] y)) - // result: (LEAL2 [c] {s} x y) - for { - c := v.AuxInt - s := v.Aux - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHLLconst || v_1.AuxInt != 1 { + off := x.AuxInt + sym := x.Aux + mem := x.Args[2] + ptr := x.Args[0] + idx := x.Args[1] + if !(x.Uses == 1 && clobber(x)) { break } - y := v_1.Args[0] - v.reset(Op386LEAL2) - v.AuxInt = c - v.Aux = s - v.AddArg(x) - v.AddArg(y) + b = x.Block + v0 := b.NewValue0(v.Pos, Op386MOVBloadidx1, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = off + v0.Aux = sym + v0.AddArg(ptr) + v0.AddArg(idx) + v0.AddArg(mem) return true } - // match: (LEAL1 [c] {s} (SHLLconst [1] y) x) - // result: (LEAL2 [c] {s} x y) + // match: (MOVBLZX (ANDLconst [c] x)) + // result: (ANDLconst [c & 0xff] x) for { - c := v.AuxInt - s := v.Aux - x := v.Args[1] v_0 := v.Args[0] - if v_0.Op != Op386SHLLconst || v_0.AuxInt != 1 { + if v_0.Op != Op386ANDLconst { break } - y := v_0.Args[0] - v.reset(Op386LEAL2) - v.AuxInt = c - v.Aux = s + c := v_0.AuxInt + x := v_0.Args[0] + v.reset(Op386ANDLconst) + v.AuxInt = c & 0xff v.AddArg(x) - v.AddArg(y) return true } - // match: (LEAL1 [c] {s} x (SHLLconst [2] y)) - // result: (LEAL4 [c] {s} x y) + return false +} +func rewriteValue386_Op386MOVBload_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (MOVBload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) + // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) + // result: (MOVBLZX x) for { - c := v.AuxInt - s := v.Aux + off := v.AuxInt + sym := v.Aux _ = v.Args[1] - x := v.Args[0] + ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != Op386SHLLconst || v_1.AuxInt != 2 { + if v_1.Op != Op386MOVBstore { break } - y := v_1.Args[0] - v.reset(Op386LEAL4) - v.AuxInt = c - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (LEAL1 [c] {s} (SHLLconst [2] y) x) - // result: (LEAL4 [c] {s} x y) - for { - c := v.AuxInt - s := v.Aux - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386SHLLconst || v_0.AuxInt != 2 { + off2 := v_1.AuxInt + sym2 := v_1.Aux + _ = v_1.Args[2] + ptr2 := v_1.Args[0] + x := v_1.Args[1] + if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { break } - y := v_0.Args[0] - v.reset(Op386LEAL4) - v.AuxInt = c - v.Aux = s + v.reset(Op386MOVBLZX) v.AddArg(x) - v.AddArg(y) return true } - // match: (LEAL1 [c] {s} x (SHLLconst [3] y)) - // result: (LEAL8 [c] {s} x y) + // match: (MOVBload [off1] {sym} (ADDLconst [off2] ptr) mem) + // cond: is32Bit(off1+off2) + // result: (MOVBload [off1+off2] {sym} ptr mem) for { - c := v.AuxInt - s := v.Aux - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHLLconst || v_1.AuxInt != 3 { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386ADDLconst { break } - y := v_1.Args[0] - v.reset(Op386LEAL8) - v.AuxInt = c - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (LEAL1 [c] {s} (SHLLconst [3] y) x) - // result: (LEAL8 [c] {s} x y) - for { - c := v.AuxInt - s := v.Aux - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386SHLLconst || v_0.AuxInt != 3 { + off2 := v_0.AuxInt + ptr := v_0.Args[0] + if !(is32Bit(off1 + off2)) { break } - y := v_0.Args[0] - v.reset(Op386LEAL8) - v.AuxInt = c - v.Aux = s - v.AddArg(x) - v.AddArg(y) + v.reset(Op386MOVBload) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(ptr) + v.AddArg(mem) return true } - // match: (LEAL1 [off1] {sym1} (LEAL [off2] {sym2} x) y) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB - // result: (LEAL1 [off1+off2] {mergeSym(sym1,sym2)} x y) + // match: (MOVBload [off1] {sym1} (LEAL [off2] {sym2} base) mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} base mem) for { off1 := v.AuxInt sym1 := v.Aux - y := v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break } off2 := v_0.AuxInt sym2 := v_0.Aux - x := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { + base := v_0.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(Op386LEAL1) + v.reset(Op386MOVBload) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) - v.AddArg(x) - v.AddArg(y) + v.AddArg(base) + v.AddArg(mem) return true } - // match: (LEAL1 [off1] {sym1} y (LEAL [off2] {sym2} x)) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB - // result: (LEAL1 [off1+off2] {mergeSym(sym1,sym2)} x y) + // match: (MOVBload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (MOVBloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] - y := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386LEAL { + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386LEAL1 { break } - off2 := v_1.AuxInt - sym2 := v_1.Aux - x := v_1.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + idx := v_0.Args[1] + ptr := v_0.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(Op386LEAL1) + v.reset(Op386MOVBloadidx1) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) - v.AddArg(x) - v.AddArg(y) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) return true } - return false -} -func rewriteValue386_Op386LEAL2_0(v *Value) bool { - // match: (LEAL2 [c] {s} (ADDLconst [d] x) y) - // cond: is32Bit(c+d) && x.Op != OpSB - // result: (LEAL2 [c+d] {s} x y) + // match: (MOVBload [off] {sym} (ADDL ptr idx) mem) + // cond: ptr.Op != OpSB + // result: (MOVBloadidx1 [off] {sym} ptr idx mem) for { - c := v.AuxInt - s := v.Aux - y := v.Args[1] + off := v.AuxInt + sym := v.Aux + mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - if !(is32Bit(c+d) && x.Op != OpSB) { + if v_0.Op != Op386ADDL { break } - v.reset(Op386LEAL2) - v.AuxInt = c + d - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + if !(ptr.Op != OpSB) { + continue + } + v.reset(Op386MOVBloadidx1) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + break } - // match: (LEAL2 [c] {s} x (ADDLconst [d] y)) - // cond: is32Bit(c+2*d) && y.Op != OpSB - // result: (LEAL2 [c+2*d] {s} x y) + // match: (MOVBload [off] {sym} (SB) _) + // cond: symIsRO(sym) + // result: (MOVLconst [int64(read8(sym, off))]) for { - c := v.AuxInt - s := v.Aux + off := v.AuxInt + sym := v.Aux _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { - break - } - d := v_1.AuxInt - y := v_1.Args[0] - if !(is32Bit(c+2*d) && y.Op != OpSB) { + v_0 := v.Args[0] + if v_0.Op != OpSB || !(symIsRO(sym)) { break } - v.reset(Op386LEAL2) - v.AuxInt = c + 2*d - v.Aux = s - v.AddArg(x) - v.AddArg(y) + v.reset(Op386MOVLconst) + v.AuxInt = int64(read8(sym, off)) return true } - // match: (LEAL2 [c] {s} x (SHLLconst [1] y)) - // result: (LEAL4 [c] {s} x y) + return false +} +func rewriteValue386_Op386MOVBloadidx1_0(v *Value) bool { + // match: (MOVBloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) + // result: (MOVBloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) for { c := v.AuxInt - s := v.Aux - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHLLconst || v_1.AuxInt != 1 { - break + sym := v.Aux + mem := v.Args[2] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != Op386ADDLconst { + continue + } + d := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1^_i0] + v.reset(Op386MOVBloadidx1) + v.AuxInt = int64(int32(c + d)) + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - y := v_1.Args[0] - v.reset(Op386LEAL4) - v.AuxInt = c - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (LEAL2 [c] {s} x (SHLLconst [2] y)) - // result: (LEAL8 [c] {s} x y) + // match: (MOVBloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) + // result: (MOVBloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) for { c := v.AuxInt - s := v.Aux - _ = v.Args[1] - x := v.Args[0] + sym := v.Aux + mem := v.Args[2] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386ADDLconst { + continue + } + d := v_1.AuxInt + idx := v_1.Args[0] + v.reset(Op386MOVBloadidx1) + v.AuxInt = int64(int32(c + d)) + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + break + } + return false +} +func rewriteValue386_Op386MOVBstore_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (MOVBstore [off] {sym} ptr (MOVBLSX x) mem) + // result: (MOVBstore [off] {sym} ptr x mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != Op386SHLLconst || v_1.AuxInt != 2 { + if v_1.Op != Op386MOVBLSX { break } - y := v_1.Args[0] - v.reset(Op386LEAL8) - v.AuxInt = c - v.Aux = s + x := v_1.Args[0] + v.reset(Op386MOVBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) v.AddArg(x) - v.AddArg(y) + v.AddArg(mem) return true } - // match: (LEAL2 [off1] {sym1} (LEAL [off2] {sym2} x) y) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB - // result: (LEAL2 [off1+off2] {mergeSym(sym1,sym2)} x y) + // match: (MOVBstore [off] {sym} ptr (MOVBLZX x) mem) + // result: (MOVBstore [off] {sym} ptr x mem) for { - off1 := v.AuxInt - sym1 := v.Aux - y := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL { - break - } - off2 := v_0.AuxInt - sym2 := v_0.Aux - x := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386MOVBLZX { break } - v.reset(Op386LEAL2) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + x := v_1.Args[0] + v.reset(Op386MOVBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) v.AddArg(x) - v.AddArg(y) + v.AddArg(mem) return true } - return false -} -func rewriteValue386_Op386LEAL4_0(v *Value) bool { - // match: (LEAL4 [c] {s} (ADDLconst [d] x) y) - // cond: is32Bit(c+d) && x.Op != OpSB - // result: (LEAL4 [c+d] {s} x y) + // match: (MOVBstore [off1] {sym} (ADDLconst [off2] ptr) val mem) + // cond: is32Bit(off1+off2) + // result: (MOVBstore [off1+off2] {sym} ptr val mem) for { - c := v.AuxInt - s := v.Aux - y := v.Args[1] + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break } - d := v_0.AuxInt - x := v_0.Args[0] - if !(is32Bit(c+d) && x.Op != OpSB) { + off2 := v_0.AuxInt + ptr := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1 + off2)) { break } - v.reset(Op386LEAL4) - v.AuxInt = c + d - v.Aux = s - v.AddArg(x) - v.AddArg(y) + v.reset(Op386MOVBstore) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(ptr) + v.AddArg(val) + v.AddArg(mem) return true } - // match: (LEAL4 [c] {s} x (ADDLconst [d] y)) - // cond: is32Bit(c+4*d) && y.Op != OpSB - // result: (LEAL4 [c+4*d] {s} x y) + // match: (MOVBstore [off] {sym} ptr (MOVLconst [c]) mem) + // cond: validOff(off) + // result: (MOVBstoreconst [makeValAndOff(int64(int8(c)),off)] {sym} ptr mem) for { - c := v.AuxInt - s := v.Aux - _ = v.Args[1] - x := v.Args[0] + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { - break - } - d := v_1.AuxInt - y := v_1.Args[0] - if !(is32Bit(c+4*d) && y.Op != OpSB) { + if v_1.Op != Op386MOVLconst { break } - v.reset(Op386LEAL4) - v.AuxInt = c + 4*d - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (LEAL4 [c] {s} x (SHLLconst [1] y)) - // result: (LEAL8 [c] {s} x y) - for { - c := v.AuxInt - s := v.Aux - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHLLconst || v_1.AuxInt != 1 { + c := v_1.AuxInt + if !(validOff(off)) { break } - y := v_1.Args[0] - v.reset(Op386LEAL8) - v.AuxInt = c - v.Aux = s - v.AddArg(x) - v.AddArg(y) + v.reset(Op386MOVBstoreconst) + v.AuxInt = makeValAndOff(int64(int8(c)), off) + v.Aux = sym + v.AddArg(ptr) + v.AddArg(mem) return true } - // match: (LEAL4 [off1] {sym1} (LEAL [off2] {sym2} x) y) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB - // result: (LEAL4 [off1+off2] {mergeSym(sym1,sym2)} x y) + // match: (MOVBstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) for { off1 := v.AuxInt sym1 := v.Aux - y := v.Args[1] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break } off2 := v_0.AuxInt sym2 := v_0.Aux - x := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { + base := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(Op386LEAL4) + v.reset(Op386MOVBstore) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) - v.AddArg(x) - v.AddArg(y) + v.AddArg(base) + v.AddArg(val) + v.AddArg(mem) return true } - return false -} -func rewriteValue386_Op386LEAL8_0(v *Value) bool { - // match: (LEAL8 [c] {s} (ADDLconst [d] x) y) - // cond: is32Bit(c+d) && x.Op != OpSB - // result: (LEAL8 [c+d] {s} x y) + // match: (MOVBstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (MOVBstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) for { - c := v.AuxInt - s := v.Aux - y := v.Args[1] + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[2] v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - if !(is32Bit(c+d) && x.Op != OpSB) { + if v_0.Op != Op386LEAL1 { break } - v.reset(Op386LEAL8) - v.AuxInt = c + d + off2 := v_0.AuxInt + sym2 := v_0.Aux + idx := v_0.Args[1] + ptr := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + break + } + v.reset(Op386MOVBstoreidx1) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true + } + // match: (MOVBstore [off] {sym} (ADDL ptr idx) val mem) + // cond: ptr.Op != OpSB + // result: (MOVBstoreidx1 [off] {sym} ptr idx val mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != Op386ADDL { + break + } + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + val := v.Args[1] + if !(ptr.Op != OpSB) { + continue + } + v.reset(Op386MOVBstoreidx1) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true + } + break + } + // match: (MOVBstore [i] {s} p (SHRWconst [8] w) x:(MOVBstore [i-1] {s} p w mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVWstore [i-1] {s} p w mem) + for { + i := v.AuxInt + s := v.Aux + _ = v.Args[2] + p := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386SHRWconst || v_1.AuxInt != 8 { + break + } + w := v_1.Args[0] + x := v.Args[2] + if x.Op != Op386MOVBstore || x.AuxInt != i-1 || x.Aux != s { + break + } + mem := x.Args[2] + if p != x.Args[0] || w != x.Args[1] || !(x.Uses == 1 && clobber(x)) { + break + } + v.reset(Op386MOVWstore) + v.AuxInt = i - 1 v.Aux = s - v.AddArg(x) - v.AddArg(y) + v.AddArg(p) + v.AddArg(w) + v.AddArg(mem) return true } - // match: (LEAL8 [c] {s} x (ADDLconst [d] y)) - // cond: is32Bit(c+8*d) && y.Op != OpSB - // result: (LEAL8 [c+8*d] {s} x y) + // match: (MOVBstore [i] {s} p (SHRLconst [8] w) x:(MOVBstore [i-1] {s} p w mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVWstore [i-1] {s} p w mem) for { - c := v.AuxInt + i := v.AuxInt s := v.Aux - _ = v.Args[1] - x := v.Args[0] + _ = v.Args[2] + p := v.Args[0] v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { + if v_1.Op != Op386SHRLconst || v_1.AuxInt != 8 { break } - d := v_1.AuxInt - y := v_1.Args[0] - if !(is32Bit(c+8*d) && y.Op != OpSB) { + w := v_1.Args[0] + x := v.Args[2] + if x.Op != Op386MOVBstore || x.AuxInt != i-1 || x.Aux != s { break } - v.reset(Op386LEAL8) - v.AuxInt = c + 8*d + mem := x.Args[2] + if p != x.Args[0] || w != x.Args[1] || !(x.Uses == 1 && clobber(x)) { + break + } + v.reset(Op386MOVWstore) + v.AuxInt = i - 1 v.Aux = s - v.AddArg(x) - v.AddArg(y) + v.AddArg(p) + v.AddArg(w) + v.AddArg(mem) return true } - // match: (LEAL8 [off1] {sym1} (LEAL [off2] {sym2} x) y) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB - // result: (LEAL8 [off1+off2] {mergeSym(sym1,sym2)} x y) + // match: (MOVBstore [i] {s} p w x:(MOVBstore {s} [i+1] p (SHRWconst [8] w) mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVWstore [i] {s} p w mem) for { - off1 := v.AuxInt - sym1 := v.Aux - y := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL { + i := v.AuxInt + s := v.Aux + _ = v.Args[2] + p := v.Args[0] + w := v.Args[1] + x := v.Args[2] + if x.Op != Op386MOVBstore || x.AuxInt != i+1 || x.Aux != s { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - x := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { + mem := x.Args[2] + if p != x.Args[0] { break } - v.reset(Op386LEAL8) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(x) - v.AddArg(y) + x_1 := x.Args[1] + if x_1.Op != Op386SHRWconst || x_1.AuxInt != 8 || w != x_1.Args[0] || !(x.Uses == 1 && clobber(x)) { + break + } + v.reset(Op386MOVWstore) + v.AuxInt = i + v.Aux = s + v.AddArg(p) + v.AddArg(w) + v.AddArg(mem) return true } return false } -func rewriteValue386_Op386MOVBLSX_0(v *Value) bool { - b := v.Block - // match: (MOVBLSX x:(MOVBload [off] {sym} ptr mem)) +func rewriteValue386_Op386MOVBstore_10(v *Value) bool { + // match: (MOVBstore [i] {s} p w x:(MOVBstore {s} [i+1] p (SHRLconst [8] w) mem)) // cond: x.Uses == 1 && clobber(x) - // result: @x.Block (MOVBLSXload [off] {sym} ptr mem) + // result: (MOVWstore [i] {s} p w mem) for { - x := v.Args[0] - if x.Op != Op386MOVBload { + i := v.AuxInt + s := v.Aux + _ = v.Args[2] + p := v.Args[0] + w := v.Args[1] + x := v.Args[2] + if x.Op != Op386MOVBstore || x.AuxInt != i+1 || x.Aux != s { break } - off := x.AuxInt - sym := x.Aux - mem := x.Args[1] - ptr := x.Args[0] - if !(x.Uses == 1 && clobber(x)) { + mem := x.Args[2] + if p != x.Args[0] { break } - b = x.Block - v0 := b.NewValue0(x.Pos, Op386MOVBLSXload, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = off - v0.Aux = sym - v0.AddArg(ptr) - v0.AddArg(mem) + x_1 := x.Args[1] + if x_1.Op != Op386SHRLconst || x_1.AuxInt != 8 || w != x_1.Args[0] || !(x.Uses == 1 && clobber(x)) { + break + } + v.reset(Op386MOVWstore) + v.AuxInt = i + v.Aux = s + v.AddArg(p) + v.AddArg(w) + v.AddArg(mem) return true } - // match: (MOVBLSX (ANDLconst [c] x)) - // cond: c & 0x80 == 0 - // result: (ANDLconst [c & 0x7f] x) + // match: (MOVBstore [i] {s} p (SHRLconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SHRLconst [j-8] w) mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVWstore [i-1] {s} p w0 mem) for { - v_0 := v.Args[0] - if v_0.Op != Op386ANDLconst { + i := v.AuxInt + s := v.Aux + _ = v.Args[2] + p := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386SHRLconst { break } - c := v_0.AuxInt - x := v_0.Args[0] - if !(c&0x80 == 0) { + j := v_1.AuxInt + w := v_1.Args[0] + x := v.Args[2] + if x.Op != Op386MOVBstore || x.AuxInt != i-1 || x.Aux != s { break } - v.reset(Op386ANDLconst) - v.AuxInt = c & 0x7f - v.AddArg(x) + mem := x.Args[2] + if p != x.Args[0] { + break + } + w0 := x.Args[1] + if w0.Op != Op386SHRLconst || w0.AuxInt != j-8 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + break + } + v.reset(Op386MOVWstore) + v.AuxInt = i - 1 + v.Aux = s + v.AddArg(p) + v.AddArg(w0) + v.AddArg(mem) return true } return false } -func rewriteValue386_Op386MOVBLSXload_0(v *Value) bool { +func rewriteValue386_Op386MOVBstoreconst_0(v *Value) bool { b := v.Block config := b.Func.Config - // match: (MOVBLSXload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) - // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) - // result: (MOVBLSX x) + // match: (MOVBstoreconst [sc] {s} (ADDLconst [off] ptr) mem) + // cond: ValAndOff(sc).canAdd(off) + // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) for { - off := v.AuxInt - sym := v.Aux - _ = v.Args[1] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386MOVBstore { + sc := v.AuxInt + s := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386ADDLconst { break } - off2 := v_1.AuxInt - sym2 := v_1.Aux - _ = v_1.Args[2] - ptr2 := v_1.Args[0] - x := v_1.Args[1] - if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { + off := v_0.AuxInt + ptr := v_0.Args[0] + if !(ValAndOff(sc).canAdd(off)) { break } - v.reset(Op386MOVBLSX) - v.AddArg(x) + v.reset(Op386MOVBstoreconst) + v.AuxInt = ValAndOff(sc).add(off) + v.Aux = s + v.AddArg(ptr) + v.AddArg(mem) return true } - // match: (MOVBLSXload [off1] {sym1} (LEAL [off2] {sym2} base) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVBLSXload [off1+off2] {mergeSym(sym1,sym2)} base mem) + // match: (MOVBstoreconst [sc] {sym1} (LEAL [off] {sym2} ptr) mem) + // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) for { - off1 := v.AuxInt + sc := v.AuxInt sym1 := v.Aux mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break } - off2 := v_0.AuxInt + off := v_0.AuxInt sym2 := v_0.Aux - base := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { - break - } - v.reset(Op386MOVBLSXload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(base) - v.AddArg(mem) - return true - } - return false -} -func rewriteValue386_Op386MOVBLZX_0(v *Value) bool { - b := v.Block - // match: (MOVBLZX x:(MOVBload [off] {sym} ptr mem)) - // cond: x.Uses == 1 && clobber(x) - // result: @x.Block (MOVBload [off] {sym} ptr mem) - for { - x := v.Args[0] - if x.Op != Op386MOVBload { - break - } - off := x.AuxInt - sym := x.Aux - mem := x.Args[1] - ptr := x.Args[0] - if !(x.Uses == 1 && clobber(x)) { - break - } - b = x.Block - v0 := b.NewValue0(x.Pos, Op386MOVBload, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = off - v0.Aux = sym - v0.AddArg(ptr) - v0.AddArg(mem) - return true - } - // match: (MOVBLZX x:(MOVBloadidx1 [off] {sym} ptr idx mem)) - // cond: x.Uses == 1 && clobber(x) - // result: @x.Block (MOVBloadidx1 [off] {sym} ptr idx mem) - for { - x := v.Args[0] - if x.Op != Op386MOVBloadidx1 { - break - } - off := x.AuxInt - sym := x.Aux - mem := x.Args[2] - ptr := x.Args[0] - idx := x.Args[1] - if !(x.Uses == 1 && clobber(x)) { - break - } - b = x.Block - v0 := b.NewValue0(v.Pos, Op386MOVBloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = off - v0.Aux = sym - v0.AddArg(ptr) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (MOVBLZX (ANDLconst [c] x)) - // result: (ANDLconst [c & 0xff] x) - for { - v_0 := v.Args[0] - if v_0.Op != Op386ANDLconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v.reset(Op386ANDLconst) - v.AuxInt = c & 0xff - v.AddArg(x) - return true - } - return false -} -func rewriteValue386_Op386MOVBload_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (MOVBload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) - // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) - // result: (MOVBLZX x) - for { - off := v.AuxInt - sym := v.Aux - _ = v.Args[1] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386MOVBstore { - break - } - off2 := v_1.AuxInt - sym2 := v_1.Aux - _ = v_1.Args[2] - ptr2 := v_1.Args[0] - x := v_1.Args[1] - if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { - break - } - v.reset(Op386MOVBLZX) - v.AddArg(x) - return true - } - // match: (MOVBload [off1] {sym} (ADDLconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) - // result: (MOVBload [off1+off2] {sym} ptr mem) - for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { - break - } - off2 := v_0.AuxInt ptr := v_0.Args[0] - if !(is32Bit(off1 + off2)) { - break - } - v.reset(Op386MOVBload) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MOVBload [off1] {sym1} (LEAL [off2] {sym2} base) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} base mem) - for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL { - break - } - off2 := v_0.AuxInt - sym2 := v_0.Aux - base := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { + if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(Op386MOVBload) - v.AuxInt = off1 + off2 + v.reset(Op386MOVBstoreconst) + v.AuxInt = ValAndOff(sc).add(off) v.Aux = mergeSym(sym1, sym2) - v.AddArg(base) + v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVBload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVBloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) + // match: (MOVBstoreconst [x] {sym1} (LEAL1 [off] {sym2} ptr idx) mem) + // cond: canMergeSym(sym1, sym2) + // result: (MOVBstoreconstidx1 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) for { - off1 := v.AuxInt + x := v.AuxInt sym1 := v.Aux mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL1 { break } - off2 := v_0.AuxInt + off := v_0.AuxInt sym2 := v_0.Aux idx := v_0.Args[1] ptr := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + if !(canMergeSym(sym1, sym2)) { break } - v.reset(Op386MOVBloadidx1) - v.AuxInt = off1 + off2 + v.reset(Op386MOVBstoreconstidx1) + v.AuxInt = ValAndOff(x).add(off) v.Aux = mergeSym(sym1, sym2) v.AddArg(ptr) v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVBload [off] {sym} (ADDL ptr idx) mem) - // cond: ptr.Op != OpSB - // result: (MOVBloadidx1 [off] {sym} ptr idx mem) + // match: (MOVBstoreconst [x] {sym} (ADDL ptr idx) mem) + // result: (MOVBstoreconstidx1 [x] {sym} ptr idx mem) for { - off := v.AuxInt + x := v.AuxInt sym := v.Aux mem := v.Args[1] v_0 := v.Args[0] @@ -4929,243 +4944,442 @@ func rewriteValue386_Op386MOVBload_0(v *Value) bool { } idx := v_0.Args[1] ptr := v_0.Args[0] - if !(ptr.Op != OpSB) { - break - } - v.reset(Op386MOVBloadidx1) - v.AuxInt = off + v.reset(Op386MOVBstoreconstidx1) + v.AuxInt = x v.Aux = sym v.AddArg(ptr) v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVBload [off] {sym} (ADDL idx ptr) mem) - // cond: ptr.Op != OpSB - // result: (MOVBloadidx1 [off] {sym} ptr idx mem) + // match: (MOVBstoreconst [c] {s} p x:(MOVBstoreconst [a] {s} p mem)) + // cond: x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x) + // result: (MOVWstoreconst [makeValAndOff(ValAndOff(a).Val()&0xff | ValAndOff(c).Val()<<8, ValAndOff(a).Off())] {s} p mem) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386ADDL { + c := v.AuxInt + s := v.Aux + _ = v.Args[1] + p := v.Args[0] + x := v.Args[1] + if x.Op != Op386MOVBstoreconst { break } - ptr := v_0.Args[1] - idx := v_0.Args[0] - if !(ptr.Op != OpSB) { + a := x.AuxInt + if x.Aux != s { break } - v.reset(Op386MOVBloadidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) + mem := x.Args[1] + if p != x.Args[0] || !(x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { + break + } + v.reset(Op386MOVWstoreconst) + v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xff|ValAndOff(c).Val()<<8, ValAndOff(a).Off()) + v.Aux = s + v.AddArg(p) v.AddArg(mem) return true } - // match: (MOVBload [off] {sym} (SB) _) - // cond: symIsRO(sym) - // result: (MOVLconst [int64(read8(sym, off))]) + // match: (MOVBstoreconst [a] {s} p x:(MOVBstoreconst [c] {s} p mem)) + // cond: x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x) + // result: (MOVWstoreconst [makeValAndOff(ValAndOff(a).Val()&0xff | ValAndOff(c).Val()<<8, ValAndOff(a).Off())] {s} p mem) for { - off := v.AuxInt - sym := v.Aux + a := v.AuxInt + s := v.Aux _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpSB || !(symIsRO(sym)) { + p := v.Args[0] + x := v.Args[1] + if x.Op != Op386MOVBstoreconst { break } - v.reset(Op386MOVLconst) - v.AuxInt = int64(read8(sym, off)) + c := x.AuxInt + if x.Aux != s { + break + } + mem := x.Args[1] + if p != x.Args[0] || !(x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { + break + } + v.reset(Op386MOVWstoreconst) + v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xff|ValAndOff(c).Val()<<8, ValAndOff(a).Off()) + v.Aux = s + v.AddArg(p) + v.AddArg(mem) return true } return false } -func rewriteValue386_Op386MOVBloadidx1_0(v *Value) bool { - // match: (MOVBloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) - // result: (MOVBloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) +func rewriteValue386_Op386MOVBstoreconstidx1_0(v *Value) bool { + // match: (MOVBstoreconstidx1 [x] {sym} (ADDLconst [c] ptr) idx mem) + // result: (MOVBstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) for { - c := v.AuxInt + x := v.AuxInt sym := v.Aux mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break } - d := v_0.AuxInt + c := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - v.reset(Op386MOVBloadidx1) - v.AuxInt = int64(int32(c + d)) + v.reset(Op386MOVBstoreconstidx1) + v.AuxInt = ValAndOff(x).add(c) v.Aux = sym v.AddArg(ptr) v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVBloadidx1 [c] {sym} idx (ADDLconst [d] ptr) mem) - // result: (MOVBloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) + // match: (MOVBstoreconstidx1 [x] {sym} ptr (ADDLconst [c] idx) mem) + // result: (MOVBstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) for { - c := v.AuxInt + x := v.AuxInt sym := v.Aux mem := v.Args[2] - idx := v.Args[0] + ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { break } - d := v_1.AuxInt - ptr := v_1.Args[0] - v.reset(Op386MOVBloadidx1) - v.AuxInt = int64(int32(c + d)) + c := v_1.AuxInt + idx := v_1.Args[0] + v.reset(Op386MOVBstoreconstidx1) + v.AuxInt = ValAndOff(x).add(c) v.Aux = sym v.AddArg(ptr) v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVBloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) - // result: (MOVBloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) + // match: (MOVBstoreconstidx1 [c] {s} p i x:(MOVBstoreconstidx1 [a] {s} p i mem)) + // cond: x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x) + // result: (MOVWstoreconstidx1 [makeValAndOff(ValAndOff(a).Val()&0xff | ValAndOff(c).Val()<<8, ValAndOff(a).Off())] {s} p i mem) for { c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { + s := v.Aux + _ = v.Args[2] + p := v.Args[0] + i := v.Args[1] + x := v.Args[2] + if x.Op != Op386MOVBstoreconstidx1 { break } - d := v_1.AuxInt - idx := v_1.Args[0] - v.reset(Op386MOVBloadidx1) - v.AuxInt = int64(int32(c + d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) + a := x.AuxInt + if x.Aux != s { + break + } + mem := x.Args[2] + if p != x.Args[0] || i != x.Args[1] || !(x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { + break + } + v.reset(Op386MOVWstoreconstidx1) + v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xff|ValAndOff(c).Val()<<8, ValAndOff(a).Off()) + v.Aux = s + v.AddArg(p) + v.AddArg(i) v.AddArg(mem) return true } - // match: (MOVBloadidx1 [c] {sym} (ADDLconst [d] idx) ptr mem) - // result: (MOVBloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) + return false +} +func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool { + // match: (MOVBstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) + // result: (MOVBstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) for { c := v.AuxInt sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { - break + mem := v.Args[3] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != Op386ADDLconst { + continue + } + d := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1^_i0] + val := v.Args[2] + v.reset(Op386MOVBstoreidx1) + v.AuxInt = int64(int32(c + d)) + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true } - d := v_0.AuxInt - idx := v_0.Args[0] - ptr := v.Args[1] - v.reset(Op386MOVBloadidx1) - v.AuxInt = int64(int32(c + d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break + } + // match: (MOVBstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) + // result: (MOVBstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) + for { + c := v.AuxInt + sym := v.Aux + mem := v.Args[3] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386ADDLconst { + continue + } + d := v_1.AuxInt + idx := v_1.Args[0] + val := v.Args[2] + v.reset(Op386MOVBstoreidx1) + v.AuxInt = int64(int32(c + d)) + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true + } + break + } + // match: (MOVBstoreidx1 [i] {s} p idx (SHRLconst [8] w) x:(MOVBstoreidx1 [i-1] {s} p idx w mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) + for { + i := v.AuxInt + s := v.Aux + _ = v.Args[3] + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + idx := v.Args[1^_i0] + v_2 := v.Args[2] + if v_2.Op != Op386SHRLconst || v_2.AuxInt != 8 { + continue + } + w := v_2.Args[0] + x := v.Args[3] + if x.Op != Op386MOVBstoreidx1 || x.AuxInt != i-1 || x.Aux != s { + continue + } + mem := x.Args[3] + for _i1 := 0; _i1 <= 1; _i1++ { + if p != x.Args[_i1] || idx != x.Args[1^_i1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + continue + } + v.reset(Op386MOVWstoreidx1) + v.AuxInt = i - 1 + v.Aux = s + v.AddArg(p) + v.AddArg(idx) + v.AddArg(w) + v.AddArg(mem) + return true + } + } + break + } + // match: (MOVBstoreidx1 [i] {s} p idx (SHRWconst [8] w) x:(MOVBstoreidx1 [i-1] {s} p idx w mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) + for { + i := v.AuxInt + s := v.Aux + _ = v.Args[3] + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + idx := v.Args[1^_i0] + v_2 := v.Args[2] + if v_2.Op != Op386SHRWconst || v_2.AuxInt != 8 { + continue + } + w := v_2.Args[0] + x := v.Args[3] + if x.Op != Op386MOVBstoreidx1 || x.AuxInt != i-1 || x.Aux != s { + continue + } + mem := x.Args[3] + for _i1 := 0; _i1 <= 1; _i1++ { + if p != x.Args[_i1] || idx != x.Args[1^_i1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + continue + } + v.reset(Op386MOVWstoreidx1) + v.AuxInt = i - 1 + v.Aux = s + v.AddArg(p) + v.AddArg(idx) + v.AddArg(w) + v.AddArg(mem) + return true + } + } + break + } + // match: (MOVBstoreidx1 [i] {s} p idx w x:(MOVBstoreidx1 [i+1] {s} p idx (SHRLconst [8] w) mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVWstoreidx1 [i] {s} p idx w mem) + for { + i := v.AuxInt + s := v.Aux + _ = v.Args[3] + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + idx := v.Args[1^_i0] + w := v.Args[2] + x := v.Args[3] + if x.Op != Op386MOVBstoreidx1 || x.AuxInt != i+1 || x.Aux != s { + continue + } + mem := x.Args[3] + for _i1 := 0; _i1 <= 1; _i1++ { + if p != x.Args[_i1] || idx != x.Args[1^_i1] { + continue + } + x_2 := x.Args[2] + if x_2.Op != Op386SHRLconst || x_2.AuxInt != 8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + continue + } + v.reset(Op386MOVWstoreidx1) + v.AuxInt = i + v.Aux = s + v.AddArg(p) + v.AddArg(idx) + v.AddArg(w) + v.AddArg(mem) + return true + } + } + break + } + // match: (MOVBstoreidx1 [i] {s} p idx w x:(MOVBstoreidx1 [i+1] {s} p idx (SHRWconst [8] w) mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVWstoreidx1 [i] {s} p idx w mem) + for { + i := v.AuxInt + s := v.Aux + _ = v.Args[3] + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + idx := v.Args[1^_i0] + w := v.Args[2] + x := v.Args[3] + if x.Op != Op386MOVBstoreidx1 || x.AuxInt != i+1 || x.Aux != s { + continue + } + mem := x.Args[3] + for _i1 := 0; _i1 <= 1; _i1++ { + if p != x.Args[_i1] || idx != x.Args[1^_i1] { + continue + } + x_2 := x.Args[2] + if x_2.Op != Op386SHRWconst || x_2.AuxInt != 8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + continue + } + v.reset(Op386MOVWstoreidx1) + v.AuxInt = i + v.Aux = s + v.AddArg(p) + v.AddArg(idx) + v.AddArg(w) + v.AddArg(mem) + return true + } + } + break + } + // match: (MOVBstoreidx1 [i] {s} p idx (SHRLconst [j] w) x:(MOVBstoreidx1 [i-1] {s} p idx w0:(SHRLconst [j-8] w) mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVWstoreidx1 [i-1] {s} p idx w0 mem) + for { + i := v.AuxInt + s := v.Aux + _ = v.Args[3] + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + idx := v.Args[1^_i0] + v_2 := v.Args[2] + if v_2.Op != Op386SHRLconst { + continue + } + j := v_2.AuxInt + w := v_2.Args[0] + x := v.Args[3] + if x.Op != Op386MOVBstoreidx1 || x.AuxInt != i-1 || x.Aux != s { + continue + } + mem := x.Args[3] + for _i1 := 0; _i1 <= 1; _i1++ { + if p != x.Args[_i1] || idx != x.Args[1^_i1] { + continue + } + w0 := x.Args[2] + if w0.Op != Op386SHRLconst || w0.AuxInt != j-8 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + continue + } + v.reset(Op386MOVWstoreidx1) + v.AuxInt = i - 1 + v.Aux = s + v.AddArg(p) + v.AddArg(idx) + v.AddArg(w0) + v.AddArg(mem) + return true + } + } + break } return false } -func rewriteValue386_Op386MOVBstore_0(v *Value) bool { +func rewriteValue386_Op386MOVLload_0(v *Value) bool { b := v.Block config := b.Func.Config - // match: (MOVBstore [off] {sym} ptr (MOVBLSX x) mem) - // result: (MOVBstore [off] {sym} ptr x mem) + // match: (MOVLload [off] {sym} ptr (MOVLstore [off2] {sym2} ptr2 x _)) + // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) + // result: x for { off := v.AuxInt sym := v.Aux - mem := v.Args[2] + _ = v.Args[1] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != Op386MOVBLSX { + if v_1.Op != Op386MOVLstore { break } - x := v_1.Args[0] - v.reset(Op386MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true - } - // match: (MOVBstore [off] {sym} ptr (MOVBLZX x) mem) - // result: (MOVBstore [off] {sym} ptr x mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386MOVBLZX { + off2 := v_1.AuxInt + sym2 := v_1.Aux + _ = v_1.Args[2] + ptr2 := v_1.Args[0] + x := v_1.Args[1] + if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { break } - x := v_1.Args[0] - v.reset(Op386MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) + v.reset(OpCopy) + v.Type = x.Type v.AddArg(x) - v.AddArg(mem) return true } - // match: (MOVBstore [off1] {sym} (ADDLconst [off2] ptr) val mem) + // match: (MOVLload [off1] {sym} (ADDLconst [off2] ptr) mem) // cond: is32Bit(off1+off2) - // result: (MOVBstore [off1+off2] {sym} ptr val mem) + // result: (MOVLload [off1+off2] {sym} ptr mem) for { off1 := v.AuxInt sym := v.Aux - mem := v.Args[2] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - val := v.Args[1] if !(is32Bit(off1 + off2)) { break } - v.reset(Op386MOVBstore) + v.reset(Op386MOVLload) v.AuxInt = off1 + off2 v.Aux = sym v.AddArg(ptr) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVBstore [off] {sym} ptr (MOVLconst [c]) mem) - // cond: validOff(off) - // result: (MOVBstoreconst [makeValAndOff(int64(int8(c)),off)] {sym} ptr mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386MOVLconst { - break - } - c := v_1.AuxInt - if !(validOff(off)) { - break - } - v.reset(Op386MOVBstoreconst) - v.AuxInt = makeValAndOff(int64(int8(c)), off) - v.Aux = sym - v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVBstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) + // match: (MOVLload [off1] {sym1} (LEAL [off2] {sym2} base) mem) // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) + // result: (MOVLload [off1+off2] {mergeSym(sym1,sym2)} base mem) for { off1 := v.AuxInt sym1 := v.Aux - mem := v.Args[2] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -5173,25 +5387,23 @@ func rewriteValue386_Op386MOVBstore_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - val := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(Op386MOVBstore) + v.reset(Op386MOVLload) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) v.AddArg(base) - v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVBstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) + // match: (MOVLload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVBstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) + // result: (MOVLloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) for { off1 := v.AuxInt sym1 := v.Aux - mem := v.Args[2] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL1 { break @@ -5200,1518 +5412,1695 @@ func rewriteValue386_Op386MOVBstore_0(v *Value) bool { sym2 := v_0.Aux idx := v_0.Args[1] ptr := v_0.Args[0] - val := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(Op386MOVBstoreidx1) + v.reset(Op386MOVLloadidx1) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) v.AddArg(ptr) v.AddArg(idx) - v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVBstore [off] {sym} (ADDL ptr idx) val mem) - // cond: ptr.Op != OpSB - // result: (MOVBstoreidx1 [off] {sym} ptr idx val mem) + // match: (MOVLload [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (MOVLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != Op386ADDL { + if v_0.Op != Op386LEAL4 { break } + off2 := v_0.AuxInt + sym2 := v_0.Aux idx := v_0.Args[1] ptr := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(Op386MOVBstoreidx1) - v.AuxInt = off - v.Aux = sym + v.reset(Op386MOVLloadidx4) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) v.AddArg(ptr) v.AddArg(idx) - v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVBstore [off] {sym} (ADDL idx ptr) val mem) + // match: (MOVLload [off] {sym} (ADDL ptr idx) mem) // cond: ptr.Op != OpSB - // result: (MOVBstoreidx1 [off] {sym} ptr idx val mem) + // result: (MOVLloadidx1 [off] {sym} ptr idx mem) for { off := v.AuxInt sym := v.Aux - mem := v.Args[2] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDL { break } - ptr := v_0.Args[1] - idx := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { - break - } - v.reset(Op386MOVBstoreidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVBstore [i] {s} p (SHRWconst [8] w) x:(MOVBstore [i-1] {s} p w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstore [i-1] {s} p w mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - p := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHRWconst || v_1.AuxInt != 8 { - break - } - w := v_1.Args[0] - x := v.Args[2] - if x.Op != Op386MOVBstore || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[2] - if p != x.Args[0] || w != x.Args[1] || !(x.Uses == 1 && clobber(x)) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + if !(ptr.Op != OpSB) { + continue + } + v.reset(Op386MOVLloadidx1) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(Op386MOVWstore) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(w) - v.AddArg(mem) - return true + break } - // match: (MOVBstore [i] {s} p (SHRLconst [8] w) x:(MOVBstore [i-1] {s} p w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstore [i-1] {s} p w mem) + // match: (MOVLload [off] {sym} (SB) _) + // cond: symIsRO(sym) + // result: (MOVLconst [int64(int32(read32(sym, off, config.BigEndian)))]) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - p := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHRLconst || v_1.AuxInt != 8 { - break - } - w := v_1.Args[0] - x := v.Args[2] - if x.Op != Op386MOVBstore || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[2] - if p != x.Args[0] || w != x.Args[1] || !(x.Uses == 1 && clobber(x)) { + off := v.AuxInt + sym := v.Aux + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpSB || !(symIsRO(sym)) { break } - v.reset(Op386MOVWstore) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(w) - v.AddArg(mem) + v.reset(Op386MOVLconst) + v.AuxInt = int64(int32(read32(sym, off, config.BigEndian))) return true } return false } -func rewriteValue386_Op386MOVBstore_10(v *Value) bool { - // match: (MOVBstore [i] {s} p w x:(MOVBstore {s} [i+1] p (SHRWconst [8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstore [i] {s} p w mem) +func rewriteValue386_Op386MOVLloadidx1_0(v *Value) bool { + // match: (MOVLloadidx1 [c] {sym} ptr (SHLLconst [2] idx) mem) + // result: (MOVLloadidx4 [c] {sym} ptr idx mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - p := v.Args[0] - w := v.Args[1] - x := v.Args[2] - if x.Op != Op386MOVBstore || x.AuxInt != i+1 || x.Aux != s { - break - } - mem := x.Args[2] - if p != x.Args[0] { - break - } - x_1 := x.Args[1] - if x_1.Op != Op386SHRWconst || x_1.AuxInt != 8 || w != x_1.Args[0] || !(x.Uses == 1 && clobber(x)) { - break + c := v.AuxInt + sym := v.Aux + mem := v.Args[2] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386SHLLconst || v_1.AuxInt != 2 { + continue + } + idx := v_1.Args[0] + v.reset(Op386MOVLloadidx4) + v.AuxInt = c + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(Op386MOVWstore) - v.AuxInt = i - v.Aux = s - v.AddArg(p) - v.AddArg(w) - v.AddArg(mem) - return true + break } - // match: (MOVBstore [i] {s} p w x:(MOVBstore {s} [i+1] p (SHRLconst [8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstore [i] {s} p w mem) + // match: (MOVLloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) + // result: (MOVLloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - p := v.Args[0] - w := v.Args[1] - x := v.Args[2] - if x.Op != Op386MOVBstore || x.AuxInt != i+1 || x.Aux != s { - break + c := v.AuxInt + sym := v.Aux + mem := v.Args[2] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != Op386ADDLconst { + continue + } + d := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1^_i0] + v.reset(Op386MOVLloadidx1) + v.AuxInt = int64(int32(c + d)) + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - mem := x.Args[2] - if p != x.Args[0] { - break + break + } + // match: (MOVLloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) + // result: (MOVLloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) + for { + c := v.AuxInt + sym := v.Aux + mem := v.Args[2] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386ADDLconst { + continue + } + d := v_1.AuxInt + idx := v_1.Args[0] + v.reset(Op386MOVLloadidx1) + v.AuxInt = int64(int32(c + d)) + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - x_1 := x.Args[1] - if x_1.Op != Op386SHRLconst || x_1.AuxInt != 8 || w != x_1.Args[0] || !(x.Uses == 1 && clobber(x)) { + break + } + return false +} +func rewriteValue386_Op386MOVLloadidx4_0(v *Value) bool { + // match: (MOVLloadidx4 [c] {sym} (ADDLconst [d] ptr) idx mem) + // result: (MOVLloadidx4 [int64(int32(c+d))] {sym} ptr idx mem) + for { + c := v.AuxInt + sym := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != Op386ADDLconst { break } - v.reset(Op386MOVWstore) - v.AuxInt = i - v.Aux = s - v.AddArg(p) - v.AddArg(w) + d := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1] + v.reset(Op386MOVLloadidx4) + v.AuxInt = int64(int32(c + d)) + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVBstore [i] {s} p (SHRLconst [j] w) x:(MOVBstore [i-1] {s} p w0:(SHRLconst [j-8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstore [i-1] {s} p w0 mem) + // match: (MOVLloadidx4 [c] {sym} ptr (ADDLconst [d] idx) mem) + // result: (MOVLloadidx4 [int64(int32(c+4*d))] {sym} ptr idx mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - p := v.Args[0] + c := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != Op386SHRLconst { - break - } - j := v_1.AuxInt - w := v_1.Args[0] - x := v.Args[2] - if x.Op != Op386MOVBstore || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[2] - if p != x.Args[0] { - break - } - w0 := x.Args[1] - if w0.Op != Op386SHRLconst || w0.AuxInt != j-8 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + if v_1.Op != Op386ADDLconst { break } - v.reset(Op386MOVWstore) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(w0) + d := v_1.AuxInt + idx := v_1.Args[0] + v.reset(Op386MOVLloadidx4) + v.AuxInt = int64(int32(c + 4*d)) + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) v.AddArg(mem) return true } return false } -func rewriteValue386_Op386MOVBstoreconst_0(v *Value) bool { +func rewriteValue386_Op386MOVLstore_0(v *Value) bool { b := v.Block config := b.Func.Config - // match: (MOVBstoreconst [sc] {s} (ADDLconst [off] ptr) mem) - // cond: ValAndOff(sc).canAdd(off) - // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) + // match: (MOVLstore [off1] {sym} (ADDLconst [off2] ptr) val mem) + // cond: is32Bit(off1+off2) + // result: (MOVLstore [off1+off2] {sym} ptr val mem) for { - sc := v.AuxInt - s := v.Aux - mem := v.Args[1] + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break } - off := v_0.AuxInt + off2 := v_0.AuxInt ptr := v_0.Args[0] - if !(ValAndOff(sc).canAdd(off)) { + val := v.Args[1] + if !(is32Bit(off1 + off2)) { break } - v.reset(Op386MOVBstoreconst) - v.AuxInt = ValAndOff(sc).add(off) - v.Aux = s + v.reset(Op386MOVLstore) + v.AuxInt = off1 + off2 + v.Aux = sym v.AddArg(ptr) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVBstoreconst [sc] {sym1} (LEAL [off] {sym2} ptr) mem) - // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) + // match: (MOVLstore [off] {sym} ptr (MOVLconst [c]) mem) + // cond: validOff(off) + // result: (MOVLstoreconst [makeValAndOff(int64(int32(c)),off)] {sym} ptr mem) for { - sc := v.AuxInt + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386MOVLconst { + break + } + c := v_1.AuxInt + if !(validOff(off)) { + break + } + v.reset(Op386MOVLstoreconst) + v.AuxInt = makeValAndOff(int64(int32(c)), off) + v.Aux = sym + v.AddArg(ptr) + v.AddArg(mem) + return true + } + // match: (MOVLstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVLstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) + for { + off1 := v.AuxInt sym1 := v.Aux - mem := v.Args[1] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break } - off := v_0.AuxInt + off2 := v_0.AuxInt sym2 := v_0.Aux - ptr := v_0.Args[0] - if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + base := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(Op386MOVBstoreconst) - v.AuxInt = ValAndOff(sc).add(off) + v.reset(Op386MOVLstore) + v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) + v.AddArg(base) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVBstoreconst [x] {sym1} (LEAL1 [off] {sym2} ptr idx) mem) - // cond: canMergeSym(sym1, sym2) - // result: (MOVBstoreconstidx1 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) + // match: (MOVLstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (MOVLstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) for { - x := v.AuxInt + off1 := v.AuxInt sym1 := v.Aux - mem := v.Args[1] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386LEAL1 { break } - off := v_0.AuxInt + off2 := v_0.AuxInt sym2 := v_0.Aux idx := v_0.Args[1] ptr := v_0.Args[0] - if !(canMergeSym(sym1, sym2)) { + val := v.Args[1] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(Op386MOVBstoreconstidx1) - v.AuxInt = ValAndOff(x).add(off) + v.reset(Op386MOVLstoreidx1) + v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) v.AddArg(ptr) v.AddArg(idx) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVBstoreconst [x] {sym} (ADDL ptr idx) mem) - // result: (MOVBstoreconstidx1 [x] {sym} ptr idx mem) + // match: (MOVLstore [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) val mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (MOVLstoreidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) for { - x := v.AuxInt - sym := v.Aux - mem := v.Args[1] + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[2] v_0 := v.Args[0] - if v_0.Op != Op386ADDL { + if v_0.Op != Op386LEAL4 { break } + off2 := v_0.AuxInt + sym2 := v_0.Aux idx := v_0.Args[1] ptr := v_0.Args[0] - v.reset(Op386MOVBstoreconstidx1) - v.AuxInt = x - v.Aux = sym + val := v.Args[1] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + break + } + v.reset(Op386MOVLstoreidx4) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) v.AddArg(ptr) v.AddArg(idx) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVBstoreconst [c] {s} p x:(MOVBstoreconst [a] {s} p mem)) - // cond: x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x) - // result: (MOVWstoreconst [makeValAndOff(ValAndOff(a).Val()&0xff | ValAndOff(c).Val()<<8, ValAndOff(a).Off())] {s} p mem) + // match: (MOVLstore [off] {sym} (ADDL ptr idx) val mem) + // cond: ptr.Op != OpSB + // result: (MOVLstoreidx1 [off] {sym} ptr idx val mem) for { - c := v.AuxInt - s := v.Aux - _ = v.Args[1] - p := v.Args[0] - x := v.Args[1] - if x.Op != Op386MOVBstoreconst { - break - } - a := x.AuxInt - if x.Aux != s { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != Op386ADDL { break } - mem := x.Args[1] - if p != x.Args[0] || !(x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + val := v.Args[1] + if !(ptr.Op != OpSB) { + continue + } + v.reset(Op386MOVLstoreidx1) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true } - v.reset(Op386MOVWstoreconst) - v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xff|ValAndOff(c).Val()<<8, ValAndOff(a).Off()) - v.Aux = s - v.AddArg(p) - v.AddArg(mem) - return true + break } - // match: (MOVBstoreconst [a] {s} p x:(MOVBstoreconst [c] {s} p mem)) - // cond: x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x) - // result: (MOVWstoreconst [makeValAndOff(ValAndOff(a).Val()&0xff | ValAndOff(c).Val()<<8, ValAndOff(a).Off())] {s} p mem) + // match: (MOVLstore {sym} [off] ptr y:(ADDLload x [off] {sym} ptr mem) mem) + // cond: y.Uses==1 && clobber(y) + // result: (ADDLmodify [off] {sym} ptr x mem) for { - a := v.AuxInt - s := v.Aux - _ = v.Args[1] - p := v.Args[0] - x := v.Args[1] - if x.Op != Op386MOVBstoreconst { - break - } - c := x.AuxInt - if x.Aux != s { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + y := v.Args[1] + if y.Op != Op386ADDLload || y.AuxInt != off || y.Aux != sym { break } - mem := x.Args[1] - if p != x.Args[0] || !(x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { + _ = y.Args[2] + x := y.Args[0] + if ptr != y.Args[1] || mem != y.Args[2] || !(y.Uses == 1 && clobber(y)) { break } - v.reset(Op386MOVWstoreconst) - v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xff|ValAndOff(c).Val()<<8, ValAndOff(a).Off()) - v.Aux = s - v.AddArg(p) + v.reset(Op386ADDLmodify) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(x) v.AddArg(mem) return true } - return false -} -func rewriteValue386_Op386MOVBstoreconstidx1_0(v *Value) bool { - // match: (MOVBstoreconstidx1 [x] {sym} (ADDLconst [c] ptr) idx mem) - // result: (MOVBstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) + // match: (MOVLstore {sym} [off] ptr y:(ANDLload x [off] {sym} ptr mem) mem) + // cond: y.Uses==1 && clobber(y) + // result: (ANDLmodify [off] {sym} ptr x mem) for { - x := v.AuxInt + off := v.AuxInt sym := v.Aux mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { + ptr := v.Args[0] + y := v.Args[1] + if y.Op != Op386ANDLload || y.AuxInt != off || y.Aux != sym { break } - c := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - v.reset(Op386MOVBstoreconstidx1) - v.AuxInt = ValAndOff(x).add(c) + _ = y.Args[2] + x := y.Args[0] + if ptr != y.Args[1] || mem != y.Args[2] || !(y.Uses == 1 && clobber(y)) { + break + } + v.reset(Op386ANDLmodify) + v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v.AddArg(idx) + v.AddArg(x) v.AddArg(mem) return true } - // match: (MOVBstoreconstidx1 [x] {sym} ptr (ADDLconst [c] idx) mem) - // result: (MOVBstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) + // match: (MOVLstore {sym} [off] ptr y:(ORLload x [off] {sym} ptr mem) mem) + // cond: y.Uses==1 && clobber(y) + // result: (ORLmodify [off] {sym} ptr x mem) for { - x := v.AuxInt + off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { + y := v.Args[1] + if y.Op != Op386ORLload || y.AuxInt != off || y.Aux != sym { break } - c := v_1.AuxInt - idx := v_1.Args[0] - v.reset(Op386MOVBstoreconstidx1) - v.AuxInt = ValAndOff(x).add(c) + _ = y.Args[2] + x := y.Args[0] + if ptr != y.Args[1] || mem != y.Args[2] || !(y.Uses == 1 && clobber(y)) { + break + } + v.reset(Op386ORLmodify) + v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v.AddArg(idx) + v.AddArg(x) v.AddArg(mem) return true } - // match: (MOVBstoreconstidx1 [c] {s} p i x:(MOVBstoreconstidx1 [a] {s} p i mem)) - // cond: x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x) - // result: (MOVWstoreconstidx1 [makeValAndOff(ValAndOff(a).Val()&0xff | ValAndOff(c).Val()<<8, ValAndOff(a).Off())] {s} p i mem) + // match: (MOVLstore {sym} [off] ptr y:(XORLload x [off] {sym} ptr mem) mem) + // cond: y.Uses==1 && clobber(y) + // result: (XORLmodify [off] {sym} ptr x mem) for { - c := v.AuxInt - s := v.Aux - _ = v.Args[2] - p := v.Args[0] - i := v.Args[1] - x := v.Args[2] - if x.Op != Op386MOVBstoreconstidx1 { - break - } - a := x.AuxInt - if x.Aux != s { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + y := v.Args[1] + if y.Op != Op386XORLload || y.AuxInt != off || y.Aux != sym { break } - mem := x.Args[2] - if p != x.Args[0] || i != x.Args[1] || !(x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { + _ = y.Args[2] + x := y.Args[0] + if ptr != y.Args[1] || mem != y.Args[2] || !(y.Uses == 1 && clobber(y)) { break } - v.reset(Op386MOVWstoreconstidx1) - v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xff|ValAndOff(c).Val()<<8, ValAndOff(a).Off()) - v.Aux = s - v.AddArg(p) - v.AddArg(i) + v.reset(Op386XORLmodify) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(x) v.AddArg(mem) return true } return false } -func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool { - // match: (MOVBstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) - // result: (MOVBstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) +func rewriteValue386_Op386MOVLstore_10(v *Value) bool { + // match: (MOVLstore {sym} [off] ptr y:(ADDL l:(MOVLload [off] {sym} ptr mem) x) mem) + // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) + // result: (ADDLmodify [off] {sym} ptr x mem) for { - c := v.AuxInt + off := v.AuxInt sym := v.Aux - mem := v.Args[3] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { + mem := v.Args[2] + ptr := v.Args[0] + y := v.Args[1] + if y.Op != Op386ADDL { break } - d := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - val := v.Args[2] - v.reset(Op386MOVBstoreidx1) - v.AuxInt = int64(int32(c + d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true + _ = y.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + l := y.Args[_i0] + if l.Op != Op386MOVLload || l.AuxInt != off || l.Aux != sym { + continue + } + _ = l.Args[1] + if ptr != l.Args[0] || mem != l.Args[1] { + continue + } + x := y.Args[1^_i0] + if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + continue + } + v.reset(Op386ADDLmodify) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(x) + v.AddArg(mem) + return true + } + break } - // match: (MOVBstoreidx1 [c] {sym} idx (ADDLconst [d] ptr) val mem) - // result: (MOVBstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) + // match: (MOVLstore {sym} [off] ptr y:(SUBL l:(MOVLload [off] {sym} ptr mem) x) mem) + // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) + // result: (SUBLmodify [off] {sym} ptr x mem) for { - c := v.AuxInt + off := v.AuxInt sym := v.Aux - mem := v.Args[3] - idx := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { + mem := v.Args[2] + ptr := v.Args[0] + y := v.Args[1] + if y.Op != Op386SUBL { break } - d := v_1.AuxInt - ptr := v_1.Args[0] - val := v.Args[2] - v.reset(Op386MOVBstoreidx1) - v.AuxInt = int64(int32(c + d)) + x := y.Args[1] + l := y.Args[0] + if l.Op != Op386MOVLload || l.AuxInt != off || l.Aux != sym { + break + } + _ = l.Args[1] + if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + break + } + v.reset(Op386SUBLmodify) + v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) + v.AddArg(x) v.AddArg(mem) return true } - // match: (MOVBstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) - // result: (MOVBstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) + // match: (MOVLstore {sym} [off] ptr y:(ANDL l:(MOVLload [off] {sym} ptr mem) x) mem) + // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) + // result: (ANDLmodify [off] {sym} ptr x mem) for { - c := v.AuxInt + off := v.AuxInt sym := v.Aux - mem := v.Args[3] + mem := v.Args[2] ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { + y := v.Args[1] + if y.Op != Op386ANDL { break } - d := v_1.AuxInt - idx := v_1.Args[0] - val := v.Args[2] - v.reset(Op386MOVBstoreidx1) - v.AuxInt = int64(int32(c + d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true + _ = y.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + l := y.Args[_i0] + if l.Op != Op386MOVLload || l.AuxInt != off || l.Aux != sym { + continue + } + _ = l.Args[1] + if ptr != l.Args[0] || mem != l.Args[1] { + continue + } + x := y.Args[1^_i0] + if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + continue + } + v.reset(Op386ANDLmodify) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(x) + v.AddArg(mem) + return true + } + break } - // match: (MOVBstoreidx1 [c] {sym} (ADDLconst [d] idx) ptr val mem) - // result: (MOVBstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) + // match: (MOVLstore {sym} [off] ptr y:(ORL l:(MOVLload [off] {sym} ptr mem) x) mem) + // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) + // result: (ORLmodify [off] {sym} ptr x mem) for { - c := v.AuxInt + off := v.AuxInt sym := v.Aux - mem := v.Args[3] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { + mem := v.Args[2] + ptr := v.Args[0] + y := v.Args[1] + if y.Op != Op386ORL { break } - d := v_0.AuxInt - idx := v_0.Args[0] - ptr := v.Args[1] - val := v.Args[2] - v.reset(Op386MOVBstoreidx1) - v.AuxInt = int64(int32(c + d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true + _ = y.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + l := y.Args[_i0] + if l.Op != Op386MOVLload || l.AuxInt != off || l.Aux != sym { + continue + } + _ = l.Args[1] + if ptr != l.Args[0] || mem != l.Args[1] { + continue + } + x := y.Args[1^_i0] + if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + continue + } + v.reset(Op386ORLmodify) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(x) + v.AddArg(mem) + return true + } + break } - // match: (MOVBstoreidx1 [i] {s} p idx (SHRLconst [8] w) x:(MOVBstoreidx1 [i-1] {s} p idx w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) + // match: (MOVLstore {sym} [off] ptr y:(XORL l:(MOVLload [off] {sym} ptr mem) x) mem) + // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) + // result: (XORLmodify [off] {sym} ptr x mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != Op386SHRLconst || v_2.AuxInt != 8 { - break - } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != Op386MOVBstoreidx1 || x.AuxInt != i-1 || x.Aux != s { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + y := v.Args[1] + if y.Op != Op386XORL { break } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { - break + _ = y.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + l := y.Args[_i0] + if l.Op != Op386MOVLload || l.AuxInt != off || l.Aux != sym { + continue + } + _ = l.Args[1] + if ptr != l.Args[0] || mem != l.Args[1] { + continue + } + x := y.Args[1^_i0] + if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + continue + } + v.reset(Op386XORLmodify) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(x) + v.AddArg(mem) + return true } - v.reset(Op386MOVWstoreidx1) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) - return true + break } - // match: (MOVBstoreidx1 [i] {s} p idx (SHRLconst [8] w) x:(MOVBstoreidx1 [i-1] {s} idx p w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) + // match: (MOVLstore {sym} [off] ptr y:(ADDLconst [c] l:(MOVLload [off] {sym} ptr mem)) mem) + // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) && validValAndOff(c,off) + // result: (ADDLconstmodify [makeValAndOff(c,off)] {sym} ptr mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != Op386SHRLconst || v_2.AuxInt != 8 { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + y := v.Args[1] + if y.Op != Op386ADDLconst { break } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != Op386MOVBstoreidx1 || x.AuxInt != i-1 || x.Aux != s { + c := y.AuxInt + l := y.Args[0] + if l.Op != Op386MOVLload || l.AuxInt != off || l.Aux != sym { break } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + _ = l.Args[1] + if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { break } - v.reset(Op386MOVWstoreidx1) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) + v.reset(Op386ADDLconstmodify) + v.AuxInt = makeValAndOff(c, off) + v.Aux = sym + v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVBstoreidx1 [i] {s} idx p (SHRLconst [8] w) x:(MOVBstoreidx1 [i-1] {s} p idx w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) + // match: (MOVLstore {sym} [off] ptr y:(ANDLconst [c] l:(MOVLload [off] {sym} ptr mem)) mem) + // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) && validValAndOff(c,off) + // result: (ANDLconstmodify [makeValAndOff(c,off)] {sym} ptr mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != Op386SHRLconst || v_2.AuxInt != 8 { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + y := v.Args[1] + if y.Op != Op386ANDLconst { break } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != Op386MOVBstoreidx1 || x.AuxInt != i-1 || x.Aux != s { + c := y.AuxInt + l := y.Args[0] + if l.Op != Op386MOVLload || l.AuxInt != off || l.Aux != sym { break } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + _ = l.Args[1] + if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { break } - v.reset(Op386MOVWstoreidx1) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) + v.reset(Op386ANDLconstmodify) + v.AuxInt = makeValAndOff(c, off) + v.Aux = sym + v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVBstoreidx1 [i] {s} idx p (SHRLconst [8] w) x:(MOVBstoreidx1 [i-1] {s} idx p w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) + // match: (MOVLstore {sym} [off] ptr y:(ORLconst [c] l:(MOVLload [off] {sym} ptr mem)) mem) + // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) && validValAndOff(c,off) + // result: (ORLconstmodify [makeValAndOff(c,off)] {sym} ptr mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != Op386SHRLconst || v_2.AuxInt != 8 { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + y := v.Args[1] + if y.Op != Op386ORLconst { break } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != Op386MOVBstoreidx1 || x.AuxInt != i-1 || x.Aux != s { + c := y.AuxInt + l := y.Args[0] + if l.Op != Op386MOVLload || l.AuxInt != off || l.Aux != sym { break } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + _ = l.Args[1] + if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { break } - v.reset(Op386MOVWstoreidx1) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) - return true + v.reset(Op386ORLconstmodify) + v.AuxInt = makeValAndOff(c, off) + v.Aux = sym + v.AddArg(ptr) + v.AddArg(mem) + return true } - // match: (MOVBstoreidx1 [i] {s} p idx (SHRWconst [8] w) x:(MOVBstoreidx1 [i-1] {s} p idx w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) + // match: (MOVLstore {sym} [off] ptr y:(XORLconst [c] l:(MOVLload [off] {sym} ptr mem)) mem) + // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) && validValAndOff(c,off) + // result: (XORLconstmodify [makeValAndOff(c,off)] {sym} ptr mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != Op386SHRWconst || v_2.AuxInt != 8 { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + y := v.Args[1] + if y.Op != Op386XORLconst { break } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != Op386MOVBstoreidx1 || x.AuxInt != i-1 || x.Aux != s { + c := y.AuxInt + l := y.Args[0] + if l.Op != Op386MOVLload || l.AuxInt != off || l.Aux != sym { break } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + _ = l.Args[1] + if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { break } - v.reset(Op386MOVWstoreidx1) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) + v.reset(Op386XORLconstmodify) + v.AuxInt = makeValAndOff(c, off) + v.Aux = sym + v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVBstoreidx1 [i] {s} p idx (SHRWconst [8] w) x:(MOVBstoreidx1 [i-1] {s} idx p w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) + return false +} +func rewriteValue386_Op386MOVLstoreconst_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (MOVLstoreconst [sc] {s} (ADDLconst [off] ptr) mem) + // cond: ValAndOff(sc).canAdd(off) + // result: (MOVLstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) for { - i := v.AuxInt + sc := v.AuxInt s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != Op386SHRWconst || v_2.AuxInt != 8 { - break - } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != Op386MOVBstoreidx1 || x.AuxInt != i-1 || x.Aux != s { + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386ADDLconst { break } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + off := v_0.AuxInt + ptr := v_0.Args[0] + if !(ValAndOff(sc).canAdd(off)) { break } - v.reset(Op386MOVWstoreidx1) - v.AuxInt = i - 1 + v.reset(Op386MOVLstoreconst) + v.AuxInt = ValAndOff(sc).add(off) v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) + v.AddArg(ptr) v.AddArg(mem) return true } - return false -} -func rewriteValue386_Op386MOVBstoreidx1_10(v *Value) bool { - // match: (MOVBstoreidx1 [i] {s} idx p (SHRWconst [8] w) x:(MOVBstoreidx1 [i-1] {s} p idx w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) + // match: (MOVLstoreconst [sc] {sym1} (LEAL [off] {sym2} ptr) mem) + // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVLstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != Op386SHRWconst || v_2.AuxInt != 8 { - break - } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != Op386MOVBstoreidx1 || x.AuxInt != i-1 || x.Aux != s { + sc := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386LEAL { break } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + off := v_0.AuxInt + sym2 := v_0.Aux + ptr := v_0.Args[0] + if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(Op386MOVWstoreidx1) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) + v.reset(Op386MOVLstoreconst) + v.AuxInt = ValAndOff(sc).add(off) + v.Aux = mergeSym(sym1, sym2) + v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVBstoreidx1 [i] {s} idx p (SHRWconst [8] w) x:(MOVBstoreidx1 [i-1] {s} idx p w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx1 [i-1] {s} p idx w mem) + // match: (MOVLstoreconst [x] {sym1} (LEAL1 [off] {sym2} ptr idx) mem) + // cond: canMergeSym(sym1, sym2) + // result: (MOVLstoreconstidx1 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != Op386SHRWconst || v_2.AuxInt != 8 { - break - } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != Op386MOVBstoreidx1 || x.AuxInt != i-1 || x.Aux != s { + x := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386LEAL1 { break } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + off := v_0.AuxInt + sym2 := v_0.Aux + idx := v_0.Args[1] + ptr := v_0.Args[0] + if !(canMergeSym(sym1, sym2)) { break } - v.reset(Op386MOVWstoreidx1) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) + v.reset(Op386MOVLstoreconstidx1) + v.AuxInt = ValAndOff(x).add(off) + v.Aux = mergeSym(sym1, sym2) + v.AddArg(ptr) v.AddArg(idx) - v.AddArg(w) v.AddArg(mem) return true } - // match: (MOVBstoreidx1 [i] {s} p idx w x:(MOVBstoreidx1 [i+1] {s} p idx (SHRLconst [8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx1 [i] {s} p idx w mem) + // match: (MOVLstoreconst [x] {sym1} (LEAL4 [off] {sym2} ptr idx) mem) + // cond: canMergeSym(sym1, sym2) + // result: (MOVLstoreconstidx4 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - w := v.Args[2] - x := v.Args[3] - if x.Op != Op386MOVBstoreidx1 || x.AuxInt != i+1 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { + x := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386LEAL4 { break } - x_2 := x.Args[2] - if x_2.Op != Op386SHRLconst || x_2.AuxInt != 8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + off := v_0.AuxInt + sym2 := v_0.Aux + idx := v_0.Args[1] + ptr := v_0.Args[0] + if !(canMergeSym(sym1, sym2)) { break } - v.reset(Op386MOVWstoreidx1) - v.AuxInt = i - v.Aux = s - v.AddArg(p) + v.reset(Op386MOVLstoreconstidx4) + v.AuxInt = ValAndOff(x).add(off) + v.Aux = mergeSym(sym1, sym2) + v.AddArg(ptr) v.AddArg(idx) - v.AddArg(w) v.AddArg(mem) return true } - // match: (MOVBstoreidx1 [i] {s} p idx w x:(MOVBstoreidx1 [i+1] {s} idx p (SHRLconst [8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx1 [i] {s} p idx w mem) + // match: (MOVLstoreconst [x] {sym} (ADDL ptr idx) mem) + // result: (MOVLstoreconstidx1 [x] {sym} ptr idx mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - w := v.Args[2] - x := v.Args[3] - if x.Op != Op386MOVBstoreidx1 || x.AuxInt != i+1 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { - break - } - x_2 := x.Args[2] - if x_2.Op != Op386SHRLconst || x_2.AuxInt != 8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + x := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386ADDL { break } - v.reset(Op386MOVWstoreidx1) - v.AuxInt = i - v.Aux = s - v.AddArg(p) + idx := v_0.Args[1] + ptr := v_0.Args[0] + v.reset(Op386MOVLstoreconstidx1) + v.AuxInt = x + v.Aux = sym + v.AddArg(ptr) v.AddArg(idx) - v.AddArg(w) v.AddArg(mem) return true } - // match: (MOVBstoreidx1 [i] {s} idx p w x:(MOVBstoreidx1 [i+1] {s} p idx (SHRLconst [8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx1 [i] {s} p idx w mem) + return false +} +func rewriteValue386_Op386MOVLstoreconstidx1_0(v *Value) bool { + // match: (MOVLstoreconstidx1 [c] {sym} ptr (SHLLconst [2] idx) mem) + // result: (MOVLstoreconstidx4 [c] {sym} ptr idx mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - w := v.Args[2] - x := v.Args[3] - if x.Op != Op386MOVBstoreidx1 || x.AuxInt != i+1 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { - break - } - x_2 := x.Args[2] - if x_2.Op != Op386SHRLconst || x_2.AuxInt != 8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + c := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386SHLLconst || v_1.AuxInt != 2 { break } - v.reset(Op386MOVWstoreidx1) - v.AuxInt = i - v.Aux = s - v.AddArg(p) + idx := v_1.Args[0] + v.reset(Op386MOVLstoreconstidx4) + v.AuxInt = c + v.Aux = sym + v.AddArg(ptr) v.AddArg(idx) - v.AddArg(w) v.AddArg(mem) return true } - // match: (MOVBstoreidx1 [i] {s} idx p w x:(MOVBstoreidx1 [i+1] {s} idx p (SHRLconst [8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx1 [i] {s} p idx w mem) + // match: (MOVLstoreconstidx1 [x] {sym} (ADDLconst [c] ptr) idx mem) + // result: (MOVLstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - w := v.Args[2] - x := v.Args[3] - if x.Op != Op386MOVBstoreidx1 || x.AuxInt != i+1 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { - break - } - x_2 := x.Args[2] - if x_2.Op != Op386SHRLconst || x_2.AuxInt != 8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + x := v.AuxInt + sym := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != Op386ADDLconst { break } - v.reset(Op386MOVWstoreidx1) - v.AuxInt = i - v.Aux = s - v.AddArg(p) + c := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1] + v.reset(Op386MOVLstoreconstidx1) + v.AuxInt = ValAndOff(x).add(c) + v.Aux = sym + v.AddArg(ptr) v.AddArg(idx) - v.AddArg(w) v.AddArg(mem) return true } - // match: (MOVBstoreidx1 [i] {s} p idx w x:(MOVBstoreidx1 [i+1] {s} p idx (SHRWconst [8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx1 [i] {s} p idx w mem) + // match: (MOVLstoreconstidx1 [x] {sym} ptr (ADDLconst [c] idx) mem) + // result: (MOVLstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - w := v.Args[2] - x := v.Args[3] - if x.Op != Op386MOVBstoreidx1 || x.AuxInt != i+1 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { - break - } - x_2 := x.Args[2] - if x_2.Op != Op386SHRWconst || x_2.AuxInt != 8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + x := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386ADDLconst { break } - v.reset(Op386MOVWstoreidx1) - v.AuxInt = i - v.Aux = s - v.AddArg(p) + c := v_1.AuxInt + idx := v_1.Args[0] + v.reset(Op386MOVLstoreconstidx1) + v.AuxInt = ValAndOff(x).add(c) + v.Aux = sym + v.AddArg(ptr) v.AddArg(idx) - v.AddArg(w) v.AddArg(mem) return true } - // match: (MOVBstoreidx1 [i] {s} p idx w x:(MOVBstoreidx1 [i+1] {s} idx p (SHRWconst [8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx1 [i] {s} p idx w mem) + return false +} +func rewriteValue386_Op386MOVLstoreconstidx4_0(v *Value) bool { + // match: (MOVLstoreconstidx4 [x] {sym} (ADDLconst [c] ptr) idx mem) + // result: (MOVLstoreconstidx4 [ValAndOff(x).add(c)] {sym} ptr idx mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - w := v.Args[2] - x := v.Args[3] - if x.Op != Op386MOVBstoreidx1 || x.AuxInt != i+1 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { + x := v.AuxInt + sym := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != Op386ADDLconst { break } - x_2 := x.Args[2] - if x_2.Op != Op386SHRWconst || x_2.AuxInt != 8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + c := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1] + v.reset(Op386MOVLstoreconstidx4) + v.AuxInt = ValAndOff(x).add(c) + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + // match: (MOVLstoreconstidx4 [x] {sym} ptr (ADDLconst [c] idx) mem) + // result: (MOVLstoreconstidx4 [ValAndOff(x).add(4*c)] {sym} ptr idx mem) + for { + x := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386ADDLconst { break } - v.reset(Op386MOVWstoreidx1) - v.AuxInt = i - v.Aux = s - v.AddArg(p) + c := v_1.AuxInt + idx := v_1.Args[0] + v.reset(Op386MOVLstoreconstidx4) + v.AuxInt = ValAndOff(x).add(4 * c) + v.Aux = sym + v.AddArg(ptr) v.AddArg(idx) - v.AddArg(w) v.AddArg(mem) return true } - // match: (MOVBstoreidx1 [i] {s} idx p w x:(MOVBstoreidx1 [i+1] {s} p idx (SHRWconst [8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx1 [i] {s} p idx w mem) + return false +} +func rewriteValue386_Op386MOVLstoreidx1_0(v *Value) bool { + // match: (MOVLstoreidx1 [c] {sym} ptr (SHLLconst [2] idx) val mem) + // result: (MOVLstoreidx4 [c] {sym} ptr idx val mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - w := v.Args[2] - x := v.Args[3] - if x.Op != Op386MOVBstoreidx1 || x.AuxInt != i+1 || x.Aux != s { - break + c := v.AuxInt + sym := v.Aux + mem := v.Args[3] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386SHLLconst || v_1.AuxInt != 2 { + continue + } + idx := v_1.Args[0] + val := v.Args[2] + v.reset(Op386MOVLstoreidx4) + v.AuxInt = c + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { - break + break + } + // match: (MOVLstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) + // result: (MOVLstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) + for { + c := v.AuxInt + sym := v.Aux + mem := v.Args[3] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != Op386ADDLconst { + continue + } + d := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1^_i0] + val := v.Args[2] + v.reset(Op386MOVLstoreidx1) + v.AuxInt = int64(int32(c + d)) + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true + } + break + } + // match: (MOVLstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) + // result: (MOVLstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) + for { + c := v.AuxInt + sym := v.Aux + mem := v.Args[3] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386ADDLconst { + continue + } + d := v_1.AuxInt + idx := v_1.Args[0] + val := v.Args[2] + v.reset(Op386MOVLstoreidx1) + v.AuxInt = int64(int32(c + d)) + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true } - x_2 := x.Args[2] - if x_2.Op != Op386SHRWconst || x_2.AuxInt != 8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + break + } + return false +} +func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool { + // match: (MOVLstoreidx4 [c] {sym} (ADDLconst [d] ptr) idx val mem) + // result: (MOVLstoreidx4 [int64(int32(c+d))] {sym} ptr idx val mem) + for { + c := v.AuxInt + sym := v.Aux + mem := v.Args[3] + v_0 := v.Args[0] + if v_0.Op != Op386ADDLconst { break } - v.reset(Op386MOVWstoreidx1) - v.AuxInt = i - v.Aux = s - v.AddArg(p) + d := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1] + val := v.Args[2] + v.reset(Op386MOVLstoreidx4) + v.AuxInt = int64(int32(c + d)) + v.Aux = sym + v.AddArg(ptr) v.AddArg(idx) - v.AddArg(w) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVBstoreidx1 [i] {s} idx p w x:(MOVBstoreidx1 [i+1] {s} idx p (SHRWconst [8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx1 [i] {s} p idx w mem) + // match: (MOVLstoreidx4 [c] {sym} ptr (ADDLconst [d] idx) val mem) + // result: (MOVLstoreidx4 [int64(int32(c+4*d))] {sym} ptr idx val mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - w := v.Args[2] - x := v.Args[3] - if x.Op != Op386MOVBstoreidx1 || x.AuxInt != i+1 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { - break - } - x_2 := x.Args[2] - if x_2.Op != Op386SHRWconst || x_2.AuxInt != 8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + c := v.AuxInt + sym := v.Aux + mem := v.Args[3] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386ADDLconst { break } - v.reset(Op386MOVWstoreidx1) - v.AuxInt = i - v.Aux = s - v.AddArg(p) + d := v_1.AuxInt + idx := v_1.Args[0] + val := v.Args[2] + v.reset(Op386MOVLstoreidx4) + v.AuxInt = int64(int32(c + 4*d)) + v.Aux = sym + v.AddArg(ptr) v.AddArg(idx) - v.AddArg(w) + v.AddArg(val) v.AddArg(mem) return true } - return false -} -func rewriteValue386_Op386MOVBstoreidx1_20(v *Value) bool { - // match: (MOVBstoreidx1 [i] {s} p idx (SHRLconst [j] w) x:(MOVBstoreidx1 [i-1] {s} p idx w0:(SHRLconst [j-8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx1 [i-1] {s} p idx w0 mem) + // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ADDLloadidx4 x [off] {sym} ptr idx mem) mem) + // cond: y.Uses==1 && clobber(y) + // result: (ADDLmodifyidx4 [off] {sym} ptr idx x mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] + off := v.AuxInt + sym := v.Aux + mem := v.Args[3] + ptr := v.Args[0] idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != Op386SHRLconst { - break - } - j := v_2.AuxInt - w := v_2.Args[0] - x := v.Args[3] - if x.Op != Op386MOVBstoreidx1 || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { + y := v.Args[2] + if y.Op != Op386ADDLloadidx4 || y.AuxInt != off || y.Aux != sym { break } - w0 := x.Args[2] - if w0.Op != Op386SHRLconst || w0.AuxInt != j-8 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + _ = y.Args[3] + x := y.Args[0] + if ptr != y.Args[1] || idx != y.Args[2] || mem != y.Args[3] || !(y.Uses == 1 && clobber(y)) { break } - v.reset(Op386MOVWstoreidx1) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) + v.reset(Op386ADDLmodifyidx4) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) v.AddArg(idx) - v.AddArg(w0) + v.AddArg(x) v.AddArg(mem) return true } - // match: (MOVBstoreidx1 [i] {s} p idx (SHRLconst [j] w) x:(MOVBstoreidx1 [i-1] {s} idx p w0:(SHRLconst [j-8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx1 [i-1] {s} p idx w0 mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] + // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ANDLloadidx4 x [off] {sym} ptr idx mem) mem) + // cond: y.Uses==1 && clobber(y) + // result: (ANDLmodifyidx4 [off] {sym} ptr idx x mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[3] + ptr := v.Args[0] idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != Op386SHRLconst { - break - } - j := v_2.AuxInt - w := v_2.Args[0] - x := v.Args[3] - if x.Op != Op386MOVBstoreidx1 || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { + y := v.Args[2] + if y.Op != Op386ANDLloadidx4 || y.AuxInt != off || y.Aux != sym { break } - w0 := x.Args[2] - if w0.Op != Op386SHRLconst || w0.AuxInt != j-8 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + _ = y.Args[3] + x := y.Args[0] + if ptr != y.Args[1] || idx != y.Args[2] || mem != y.Args[3] || !(y.Uses == 1 && clobber(y)) { break } - v.reset(Op386MOVWstoreidx1) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) + v.reset(Op386ANDLmodifyidx4) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) v.AddArg(idx) - v.AddArg(w0) + v.AddArg(x) v.AddArg(mem) return true } - // match: (MOVBstoreidx1 [i] {s} idx p (SHRLconst [j] w) x:(MOVBstoreidx1 [i-1] {s} p idx w0:(SHRLconst [j-8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx1 [i-1] {s} p idx w0 mem) + // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ORLloadidx4 x [off] {sym} ptr idx mem) mem) + // cond: y.Uses==1 && clobber(y) + // result: (ORLmodifyidx4 [off] {sym} ptr idx x mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != Op386SHRLconst { - break - } - j := v_2.AuxInt - w := v_2.Args[0] - x := v.Args[3] - if x.Op != Op386MOVBstoreidx1 || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { + off := v.AuxInt + sym := v.Aux + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + y := v.Args[2] + if y.Op != Op386ORLloadidx4 || y.AuxInt != off || y.Aux != sym { break } - w0 := x.Args[2] - if w0.Op != Op386SHRLconst || w0.AuxInt != j-8 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + _ = y.Args[3] + x := y.Args[0] + if ptr != y.Args[1] || idx != y.Args[2] || mem != y.Args[3] || !(y.Uses == 1 && clobber(y)) { break } - v.reset(Op386MOVWstoreidx1) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) + v.reset(Op386ORLmodifyidx4) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) v.AddArg(idx) - v.AddArg(w0) + v.AddArg(x) v.AddArg(mem) return true } - // match: (MOVBstoreidx1 [i] {s} idx p (SHRLconst [j] w) x:(MOVBstoreidx1 [i-1] {s} idx p w0:(SHRLconst [j-8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx1 [i-1] {s} p idx w0 mem) + // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(XORLloadidx4 x [off] {sym} ptr idx mem) mem) + // cond: y.Uses==1 && clobber(y) + // result: (XORLmodifyidx4 [off] {sym} ptr idx x mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != Op386SHRLconst { - break - } - j := v_2.AuxInt - w := v_2.Args[0] - x := v.Args[3] - if x.Op != Op386MOVBstoreidx1 || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { + off := v.AuxInt + sym := v.Aux + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + y := v.Args[2] + if y.Op != Op386XORLloadidx4 || y.AuxInt != off || y.Aux != sym { break } - w0 := x.Args[2] - if w0.Op != Op386SHRLconst || w0.AuxInt != j-8 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + _ = y.Args[3] + x := y.Args[0] + if ptr != y.Args[1] || idx != y.Args[2] || mem != y.Args[3] || !(y.Uses == 1 && clobber(y)) { break } - v.reset(Op386MOVWstoreidx1) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) + v.reset(Op386XORLmodifyidx4) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) v.AddArg(idx) - v.AddArg(w0) + v.AddArg(x) v.AddArg(mem) return true } - return false -} -func rewriteValue386_Op386MOVLload_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (MOVLload [off] {sym} ptr (MOVLstore [off2] {sym2} ptr2 x _)) - // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) - // result: x + // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ADDL l:(MOVLloadidx4 [off] {sym} ptr idx mem) x) mem) + // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) + // result: (ADDLmodifyidx4 [off] {sym} ptr idx x mem) for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[3] ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386MOVLstore { + idx := v.Args[1] + y := v.Args[2] + if y.Op != Op386ADDL { break } - off2 := v_1.AuxInt - sym2 := v_1.Aux - _ = v_1.Args[2] - ptr2 := v_1.Args[0] - x := v_1.Args[1] - if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { - break + _ = y.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + l := y.Args[_i0] + if l.Op != Op386MOVLloadidx4 || l.AuxInt != off || l.Aux != sym { + continue + } + _ = l.Args[2] + if ptr != l.Args[0] || idx != l.Args[1] || mem != l.Args[2] { + continue + } + x := y.Args[1^_i0] + if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + continue + } + v.reset(Op386ADDLmodifyidx4) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(x) + v.AddArg(mem) + return true } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true + break } - // match: (MOVLload [off1] {sym} (ADDLconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) - // result: (MOVLload [off1+off2] {sym} ptr mem) + // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(SUBL l:(MOVLloadidx4 [off] {sym} ptr idx mem) x) mem) + // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) + // result: (SUBLmodifyidx4 [off] {sym} ptr idx x mem) for { - off1 := v.AuxInt + off := v.AuxInt sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + y := v.Args[2] + if y.Op != Op386SUBL { break } - off2 := v_0.AuxInt - ptr := v_0.Args[0] - if !(is32Bit(off1 + off2)) { + x := y.Args[1] + l := y.Args[0] + if l.Op != Op386MOVLloadidx4 || l.AuxInt != off || l.Aux != sym { break } - v.reset(Op386MOVLload) - v.AuxInt = off1 + off2 + _ = l.Args[2] + if ptr != l.Args[0] || idx != l.Args[1] || mem != l.Args[2] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + break + } + v.reset(Op386SUBLmodifyidx4) + v.AuxInt = off v.Aux = sym v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(x) v.AddArg(mem) return true } - // match: (MOVLload [off1] {sym1} (LEAL [off2] {sym2} base) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVLload [off1+off2] {mergeSym(sym1,sym2)} base mem) + // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ANDL l:(MOVLloadidx4 [off] {sym} ptr idx mem) x) mem) + // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) + // result: (ANDLmodifyidx4 [off] {sym} ptr idx x mem) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL { + off := v.AuxInt + sym := v.Aux + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + y := v.Args[2] + if y.Op != Op386ANDL { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - base := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { - break + _ = y.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + l := y.Args[_i0] + if l.Op != Op386MOVLloadidx4 || l.AuxInt != off || l.Aux != sym { + continue + } + _ = l.Args[2] + if ptr != l.Args[0] || idx != l.Args[1] || mem != l.Args[2] { + continue + } + x := y.Args[1^_i0] + if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + continue + } + v.reset(Op386ANDLmodifyidx4) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(x) + v.AddArg(mem) + return true } - v.reset(Op386MOVLload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(base) - v.AddArg(mem) - return true + break } - // match: (MOVLload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVLloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) + // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ORL l:(MOVLloadidx4 [off] {sym} ptr idx mem) x) mem) + // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) + // result: (ORLmodifyidx4 [off] {sym} ptr idx x mem) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL1 { + off := v.AuxInt + sym := v.Aux + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + y := v.Args[2] + if y.Op != Op386ORL { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { - break + _ = y.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + l := y.Args[_i0] + if l.Op != Op386MOVLloadidx4 || l.AuxInt != off || l.Aux != sym { + continue + } + _ = l.Args[2] + if ptr != l.Args[0] || idx != l.Args[1] || mem != l.Args[2] { + continue + } + x := y.Args[1^_i0] + if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + continue + } + v.reset(Op386ORLmodifyidx4) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(x) + v.AddArg(mem) + return true } - v.reset(Op386MOVLloadidx1) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } - // match: (MOVLload [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) + return false +} +func rewriteValue386_Op386MOVLstoreidx4_10(v *Value) bool { + // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(XORL l:(MOVLloadidx4 [off] {sym} ptr idx mem) x) mem) + // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) + // result: (XORLmodifyidx4 [off] {sym} ptr idx x mem) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL4 { + off := v.AuxInt + sym := v.Aux + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + y := v.Args[2] + if y.Op != Op386XORL { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { - break + _ = y.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + l := y.Args[_i0] + if l.Op != Op386MOVLloadidx4 || l.AuxInt != off || l.Aux != sym { + continue + } + _ = l.Args[2] + if ptr != l.Args[0] || idx != l.Args[1] || mem != l.Args[2] { + continue + } + x := y.Args[1^_i0] + if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + continue + } + v.reset(Op386XORLmodifyidx4) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(x) + v.AddArg(mem) + return true } - v.reset(Op386MOVLloadidx4) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } - // match: (MOVLload [off] {sym} (ADDL ptr idx) mem) - // cond: ptr.Op != OpSB - // result: (MOVLloadidx1 [off] {sym} ptr idx mem) + // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ADDLconst [c] l:(MOVLloadidx4 [off] {sym} ptr idx mem)) mem) + // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) && validValAndOff(c,off) + // result: (ADDLconstmodifyidx4 [makeValAndOff(c,off)] {sym} ptr idx mem) for { off := v.AuxInt sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386ADDL { + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + y := v.Args[2] + if y.Op != Op386ADDLconst { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(ptr.Op != OpSB) { + c := y.AuxInt + l := y.Args[0] + if l.Op != Op386MOVLloadidx4 || l.AuxInt != off || l.Aux != sym { break } - v.reset(Op386MOVLloadidx1) - v.AuxInt = off + _ = l.Args[2] + if ptr != l.Args[0] || idx != l.Args[1] || mem != l.Args[2] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { + break + } + v.reset(Op386ADDLconstmodifyidx4) + v.AuxInt = makeValAndOff(c, off) v.Aux = sym v.AddArg(ptr) v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVLload [off] {sym} (ADDL idx ptr) mem) - // cond: ptr.Op != OpSB - // result: (MOVLloadidx1 [off] {sym} ptr idx mem) + // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ANDLconst [c] l:(MOVLloadidx4 [off] {sym} ptr idx mem)) mem) + // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) && validValAndOff(c,off) + // result: (ANDLconstmodifyidx4 [makeValAndOff(c,off)] {sym} ptr idx mem) for { off := v.AuxInt sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386ADDL { + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + y := v.Args[2] + if y.Op != Op386ANDLconst { break } - ptr := v_0.Args[1] - idx := v_0.Args[0] - if !(ptr.Op != OpSB) { + c := y.AuxInt + l := y.Args[0] + if l.Op != Op386MOVLloadidx4 || l.AuxInt != off || l.Aux != sym { break } - v.reset(Op386MOVLloadidx1) - v.AuxInt = off + _ = l.Args[2] + if ptr != l.Args[0] || idx != l.Args[1] || mem != l.Args[2] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { + break + } + v.reset(Op386ANDLconstmodifyidx4) + v.AuxInt = makeValAndOff(c, off) v.Aux = sym v.AddArg(ptr) v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVLload [off] {sym} (SB) _) - // cond: symIsRO(sym) - // result: (MOVLconst [int64(int32(read32(sym, off, config.BigEndian)))]) + // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ORLconst [c] l:(MOVLloadidx4 [off] {sym} ptr idx mem)) mem) + // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) && validValAndOff(c,off) + // result: (ORLconstmodifyidx4 [makeValAndOff(c,off)] {sym} ptr idx mem) for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpSB || !(symIsRO(sym)) { + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + y := v.Args[2] + if y.Op != Op386ORLconst { break } - v.reset(Op386MOVLconst) - v.AuxInt = int64(int32(read32(sym, off, config.BigEndian))) - return true - } - return false -} -func rewriteValue386_Op386MOVLloadidx1_0(v *Value) bool { - // match: (MOVLloadidx1 [c] {sym} ptr (SHLLconst [2] idx) mem) - // result: (MOVLloadidx4 [c] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHLLconst || v_1.AuxInt != 2 { + c := y.AuxInt + l := y.Args[0] + if l.Op != Op386MOVLloadidx4 || l.AuxInt != off || l.Aux != sym { break } - idx := v_1.Args[0] - v.reset(Op386MOVLloadidx4) - v.AuxInt = c - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVLloadidx1 [c] {sym} (SHLLconst [2] idx) ptr mem) - // result: (MOVLloadidx4 [c] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386SHLLconst || v_0.AuxInt != 2 { + _ = l.Args[2] + if ptr != l.Args[0] || idx != l.Args[1] || mem != l.Args[2] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { break } - idx := v_0.Args[0] - ptr := v.Args[1] - v.reset(Op386MOVLloadidx4) - v.AuxInt = c + v.reset(Op386ORLconstmodifyidx4) + v.AuxInt = makeValAndOff(c, off) v.Aux = sym v.AddArg(ptr) v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVLloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) - // result: (MOVLloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) + // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(XORLconst [c] l:(MOVLloadidx4 [off] {sym} ptr idx mem)) mem) + // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) && validValAndOff(c,off) + // result: (XORLconstmodifyidx4 [makeValAndOff(c,off)] {sym} ptr idx mem) for { - c := v.AuxInt + off := v.AuxInt sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + y := v.Args[2] + if y.Op != Op386XORLconst { break } - d := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - v.reset(Op386MOVLloadidx1) - v.AuxInt = int64(int32(c + d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVLloadidx1 [c] {sym} idx (ADDLconst [d] ptr) mem) - // result: (MOVLloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - idx := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { + c := y.AuxInt + l := y.Args[0] + if l.Op != Op386MOVLloadidx4 || l.AuxInt != off || l.Aux != sym { break } - d := v_1.AuxInt - ptr := v_1.Args[0] - v.reset(Op386MOVLloadidx1) - v.AuxInt = int64(int32(c + d)) + _ = l.Args[2] + if ptr != l.Args[0] || idx != l.Args[1] || mem != l.Args[2] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { + break + } + v.reset(Op386XORLconstmodifyidx4) + v.AuxInt = makeValAndOff(c, off) v.Aux = sym v.AddArg(ptr) v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVLloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) - // result: (MOVLloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) + return false +} +func rewriteValue386_Op386MOVSDconst_0(v *Value) bool { + b := v.Block + config := b.Func.Config + typ := &b.Func.Config.Types + // match: (MOVSDconst [c]) + // cond: config.ctxt.Flag_shared + // result: (MOVSDconst2 (MOVSDconst1 [c])) for { c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { + if !(config.ctxt.Flag_shared) { break } - d := v_1.AuxInt - idx := v_1.Args[0] - v.reset(Op386MOVLloadidx1) - v.AuxInt = int64(int32(c + d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + v.reset(Op386MOVSDconst2) + v0 := b.NewValue0(v.Pos, Op386MOVSDconst1, typ.UInt32) + v0.AuxInt = c + v.AddArg(v0) return true } - // match: (MOVLloadidx1 [c] {sym} (ADDLconst [d] idx) ptr mem) - // result: (MOVLloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) + return false +} +func rewriteValue386_Op386MOVSDload_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (MOVSDload [off1] {sym} (ADDLconst [off2] ptr) mem) + // cond: is32Bit(off1+off2) + // result: (MOVSDload [off1+off2] {sym} ptr mem) for { - c := v.AuxInt + off1 := v.AuxInt sym := v.Aux - mem := v.Args[2] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break } - d := v_0.AuxInt - idx := v_0.Args[0] - ptr := v.Args[1] - v.reset(Op386MOVLloadidx1) - v.AuxInt = int64(int32(c + d)) + off2 := v_0.AuxInt + ptr := v_0.Args[0] + if !(is32Bit(off1 + off2)) { + break + } + v.reset(Op386MOVSDload) + v.AuxInt = off1 + off2 v.Aux = sym v.AddArg(ptr) - v.AddArg(idx) v.AddArg(mem) return true } - return false -} -func rewriteValue386_Op386MOVLloadidx4_0(v *Value) bool { - // match: (MOVLloadidx4 [c] {sym} (ADDLconst [d] ptr) idx mem) - // result: (MOVLloadidx4 [int64(int32(c+d))] {sym} ptr idx mem) + // match: (MOVSDload [off1] {sym1} (LEAL [off2] {sym2} base) mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVSDload [off1+off2] {mergeSym(sym1,sym2)} base mem) for { - c := v.AuxInt - sym := v.Aux + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386LEAL { + break + } + off2 := v_0.AuxInt + sym2 := v_0.Aux + base := v_0.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { + break + } + v.reset(Op386MOVSDload) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(base) + v.AddArg(mem) + return true + } + // match: (MOVSDload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (MOVSDloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) + for { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386LEAL1 { + break + } + off2 := v_0.AuxInt + sym2 := v_0.Aux + idx := v_0.Args[1] + ptr := v_0.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + break + } + v.reset(Op386MOVSDloadidx1) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + // match: (MOVSDload [off1] {sym1} (LEAL8 [off2] {sym2} ptr idx) mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (MOVSDloadidx8 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) + for { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386LEAL8 { + break + } + off2 := v_0.AuxInt + sym2 := v_0.Aux + idx := v_0.Args[1] + ptr := v_0.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + break + } + v.reset(Op386MOVSDloadidx8) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + // match: (MOVSDload [off] {sym} (ADDL ptr idx) mem) + // cond: ptr.Op != OpSB + // result: (MOVSDloadidx1 [off] {sym} ptr idx mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386ADDL { + break + } + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + if !(ptr.Op != OpSB) { + continue + } + v.reset(Op386MOVSDloadidx1) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + break + } + return false +} +func rewriteValue386_Op386MOVSDloadidx1_0(v *Value) bool { + // match: (MOVSDloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) + // result: (MOVSDloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) + for { + c := v.AuxInt + sym := v.Aux mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { @@ -6720,7 +7109,7 @@ func rewriteValue386_Op386MOVLloadidx4_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - v.reset(Op386MOVLloadidx4) + v.reset(Op386MOVSDloadidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym v.AddArg(ptr) @@ -6728,8 +7117,8 @@ func rewriteValue386_Op386MOVLloadidx4_0(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVLloadidx4 [c] {sym} ptr (ADDLconst [d] idx) mem) - // result: (MOVLloadidx4 [int64(int32(c+4*d))] {sym} ptr idx mem) + // match: (MOVSDloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) + // result: (MOVSDloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) for { c := v.AuxInt sym := v.Aux @@ -6741,8 +7130,8 @@ func rewriteValue386_Op386MOVLloadidx4_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - v.reset(Op386MOVLloadidx4) - v.AuxInt = int64(int32(c + 4*d)) + v.reset(Op386MOVSDloadidx1) + v.AuxInt = int64(int32(c + d)) v.Aux = sym v.AddArg(ptr) v.AddArg(idx) @@ -6751,60 +7140,82 @@ func rewriteValue386_Op386MOVLloadidx4_0(v *Value) bool { } return false } -func rewriteValue386_Op386MOVLstore_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (MOVLstore [off1] {sym} (ADDLconst [off2] ptr) val mem) - // cond: is32Bit(off1+off2) - // result: (MOVLstore [off1+off2] {sym} ptr val mem) +func rewriteValue386_Op386MOVSDloadidx8_0(v *Value) bool { + // match: (MOVSDloadidx8 [c] {sym} (ADDLconst [d] ptr) idx mem) + // result: (MOVSDloadidx8 [int64(int32(c+d))] {sym} ptr idx mem) for { - off1 := v.AuxInt + c := v.AuxInt sym := v.Aux mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break } - off2 := v_0.AuxInt + d := v_0.AuxInt ptr := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1 + off2)) { - break - } - v.reset(Op386MOVLstore) - v.AuxInt = off1 + off2 + idx := v.Args[1] + v.reset(Op386MOVSDloadidx8) + v.AuxInt = int64(int32(c + d)) v.Aux = sym v.AddArg(ptr) - v.AddArg(val) + v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVLstore [off] {sym} ptr (MOVLconst [c]) mem) - // cond: validOff(off) - // result: (MOVLstoreconst [makeValAndOff(int64(int32(c)),off)] {sym} ptr mem) + // match: (MOVSDloadidx8 [c] {sym} ptr (ADDLconst [d] idx) mem) + // result: (MOVSDloadidx8 [int64(int32(c+8*d))] {sym} ptr idx mem) for { - off := v.AuxInt + c := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != Op386MOVLconst { + if v_1.Op != Op386ADDLconst { break } - c := v_1.AuxInt - if !(validOff(off)) { + d := v_1.AuxInt + idx := v_1.Args[0] + v.reset(Op386MOVSDloadidx8) + v.AuxInt = int64(int32(c + 8*d)) + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + return false +} +func rewriteValue386_Op386MOVSDstore_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (MOVSDstore [off1] {sym} (ADDLconst [off2] ptr) val mem) + // cond: is32Bit(off1+off2) + // result: (MOVSDstore [off1+off2] {sym} ptr val mem) + for { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != Op386ADDLconst { break } - v.reset(Op386MOVLstoreconst) - v.AuxInt = makeValAndOff(int64(int32(c)), off) + off2 := v_0.AuxInt + ptr := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1 + off2)) { + break + } + v.reset(Op386MOVSDstore) + v.AuxInt = off1 + off2 v.Aux = sym v.AddArg(ptr) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVLstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) + // match: (MOVSDstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVLstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) + // result: (MOVSDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) for { off1 := v.AuxInt sym1 := v.Aux @@ -6820,7 +7231,7 @@ func rewriteValue386_Op386MOVLstore_0(v *Value) bool { if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(Op386MOVLstore) + v.reset(Op386MOVSDstore) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) v.AddArg(base) @@ -6828,9 +7239,9 @@ func rewriteValue386_Op386MOVLstore_0(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVLstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) + // match: (MOVSDstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVLstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) + // result: (MOVSDstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) for { off1 := v.AuxInt sym1 := v.Aux @@ -6847,7 +7258,7 @@ func rewriteValue386_Op386MOVLstore_0(v *Value) bool { if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(Op386MOVLstoreidx1) + v.reset(Op386MOVSDstoreidx1) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) v.AddArg(ptr) @@ -6856,15 +7267,15 @@ func rewriteValue386_Op386MOVLstore_0(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVLstore [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) val mem) + // match: (MOVSDstore [off1] {sym1} (LEAL8 [off2] {sym2} ptr idx) val mem) // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVLstoreidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) + // result: (MOVSDstoreidx8 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) for { off1 := v.AuxInt sym1 := v.Aux mem := v.Args[2] v_0 := v.Args[0] - if v_0.Op != Op386LEAL4 { + if v_0.Op != Op386LEAL8 { break } off2 := v_0.AuxInt @@ -6875,7 +7286,7 @@ func rewriteValue386_Op386MOVLstore_0(v *Value) bool { if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(Op386MOVLstoreidx4) + v.reset(Op386MOVSDstoreidx8) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) v.AddArg(ptr) @@ -6884,9 +7295,9 @@ func rewriteValue386_Op386MOVLstore_0(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVLstore [off] {sym} (ADDL ptr idx) val mem) + // match: (MOVSDstore [off] {sym} (ADDL ptr idx) val mem) // cond: ptr.Op != OpSB - // result: (MOVLstoreidx1 [off] {sym} ptr idx val mem) + // result: (MOVSDstoreidx1 [off] {sym} ptr idx val mem) for { off := v.AuxInt sym := v.Aux @@ -6895,14 +7306,44 @@ func rewriteValue386_Op386MOVLstore_0(v *Value) bool { if v_0.Op != Op386ADDL { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + val := v.Args[1] + if !(ptr.Op != OpSB) { + continue + } + v.reset(Op386MOVSDstoreidx1) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true + } + break + } + return false +} +func rewriteValue386_Op386MOVSDstoreidx1_0(v *Value) bool { + // match: (MOVSDstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) + // result: (MOVSDstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) + for { + c := v.AuxInt + sym := v.Aux + mem := v.Args[3] + v_0 := v.Args[0] + if v_0.Op != Op386ADDLconst { break } - v.reset(Op386MOVLstoreidx1) - v.AuxInt = off + d := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1] + val := v.Args[2] + v.reset(Op386MOVSDstoreidx1) + v.AuxInt = int64(int32(c + d)) v.Aux = sym v.AddArg(ptr) v.AddArg(idx) @@ -6910,25 +7351,22 @@ func rewriteValue386_Op386MOVLstore_0(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVLstore [off] {sym} (ADDL idx ptr) val mem) - // cond: ptr.Op != OpSB - // result: (MOVLstoreidx1 [off] {sym} ptr idx val mem) + // match: (MOVSDstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) + // result: (MOVSDstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) for { - off := v.AuxInt + c := v.AuxInt sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386ADDL { - break - } - ptr := v_0.Args[1] - idx := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { + mem := v.Args[3] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386ADDLconst { break } - v.reset(Op386MOVLstoreidx1) - v.AuxInt = off + d := v_1.AuxInt + idx := v_1.Args[0] + val := v.Args[2] + v.reset(Op386MOVSDstoreidx1) + v.AuxInt = int64(int32(c + d)) v.Aux = sym v.AddArg(ptr) v.AddArg(idx) @@ -6936,871 +7374,988 @@ func rewriteValue386_Op386MOVLstore_0(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVLstore {sym} [off] ptr y:(ADDLload x [off] {sym} ptr mem) mem) - // cond: y.Uses==1 && clobber(y) - // result: (ADDLmodify [off] {sym} ptr x mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - y := v.Args[1] - if y.Op != Op386ADDLload || y.AuxInt != off || y.Aux != sym { - break - } - _ = y.Args[2] - x := y.Args[0] - if ptr != y.Args[1] || mem != y.Args[2] || !(y.Uses == 1 && clobber(y)) { + return false +} +func rewriteValue386_Op386MOVSDstoreidx8_0(v *Value) bool { + // match: (MOVSDstoreidx8 [c] {sym} (ADDLconst [d] ptr) idx val mem) + // result: (MOVSDstoreidx8 [int64(int32(c+d))] {sym} ptr idx val mem) + for { + c := v.AuxInt + sym := v.Aux + mem := v.Args[3] + v_0 := v.Args[0] + if v_0.Op != Op386ADDLconst { break } - v.reset(Op386ADDLmodify) - v.AuxInt = off + d := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1] + val := v.Args[2] + v.reset(Op386MOVSDstoreidx8) + v.AuxInt = int64(int32(c + d)) v.Aux = sym v.AddArg(ptr) - v.AddArg(x) + v.AddArg(idx) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVLstore {sym} [off] ptr y:(ANDLload x [off] {sym} ptr mem) mem) - // cond: y.Uses==1 && clobber(y) - // result: (ANDLmodify [off] {sym} ptr x mem) + // match: (MOVSDstoreidx8 [c] {sym} ptr (ADDLconst [d] idx) val mem) + // result: (MOVSDstoreidx8 [int64(int32(c+8*d))] {sym} ptr idx val mem) for { - off := v.AuxInt + c := v.AuxInt sym := v.Aux - mem := v.Args[2] + mem := v.Args[3] ptr := v.Args[0] - y := v.Args[1] - if y.Op != Op386ANDLload || y.AuxInt != off || y.Aux != sym { - break - } - _ = y.Args[2] - x := y.Args[0] - if ptr != y.Args[1] || mem != y.Args[2] || !(y.Uses == 1 && clobber(y)) { + v_1 := v.Args[1] + if v_1.Op != Op386ADDLconst { break } - v.reset(Op386ANDLmodify) - v.AuxInt = off + d := v_1.AuxInt + idx := v_1.Args[0] + val := v.Args[2] + v.reset(Op386MOVSDstoreidx8) + v.AuxInt = int64(int32(c + 8*d)) v.Aux = sym v.AddArg(ptr) - v.AddArg(x) + v.AddArg(idx) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVLstore {sym} [off] ptr y:(ORLload x [off] {sym} ptr mem) mem) - // cond: y.Uses==1 && clobber(y) - // result: (ORLmodify [off] {sym} ptr x mem) + return false +} +func rewriteValue386_Op386MOVSSconst_0(v *Value) bool { + b := v.Block + config := b.Func.Config + typ := &b.Func.Config.Types + // match: (MOVSSconst [c]) + // cond: config.ctxt.Flag_shared + // result: (MOVSSconst2 (MOVSSconst1 [c])) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - y := v.Args[1] - if y.Op != Op386ORLload || y.AuxInt != off || y.Aux != sym { - break - } - _ = y.Args[2] - x := y.Args[0] - if ptr != y.Args[1] || mem != y.Args[2] || !(y.Uses == 1 && clobber(y)) { + c := v.AuxInt + if !(config.ctxt.Flag_shared) { break } - v.reset(Op386ORLmodify) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) + v.reset(Op386MOVSSconst2) + v0 := b.NewValue0(v.Pos, Op386MOVSSconst1, typ.UInt32) + v0.AuxInt = c + v.AddArg(v0) return true } return false } -func rewriteValue386_Op386MOVLstore_10(v *Value) bool { - // match: (MOVLstore {sym} [off] ptr y:(XORLload x [off] {sym} ptr mem) mem) - // cond: y.Uses==1 && clobber(y) - // result: (XORLmodify [off] {sym} ptr x mem) +func rewriteValue386_Op386MOVSSload_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (MOVSSload [off1] {sym} (ADDLconst [off2] ptr) mem) + // cond: is32Bit(off1+off2) + // result: (MOVSSload [off1+off2] {sym} ptr mem) for { - off := v.AuxInt + off1 := v.AuxInt sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - y := v.Args[1] - if y.Op != Op386XORLload || y.AuxInt != off || y.Aux != sym { + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386ADDLconst { break } - _ = y.Args[2] - x := y.Args[0] - if ptr != y.Args[1] || mem != y.Args[2] || !(y.Uses == 1 && clobber(y)) { + off2 := v_0.AuxInt + ptr := v_0.Args[0] + if !(is32Bit(off1 + off2)) { break } - v.reset(Op386XORLmodify) - v.AuxInt = off + v.reset(Op386MOVSSload) + v.AuxInt = off1 + off2 v.Aux = sym v.AddArg(ptr) - v.AddArg(x) v.AddArg(mem) return true } - // match: (MOVLstore {sym} [off] ptr y:(ADDL l:(MOVLload [off] {sym} ptr mem) x) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) - // result: (ADDLmodify [off] {sym} ptr x mem) + // match: (MOVSSload [off1] {sym1} (LEAL [off2] {sym2} base) mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVSSload [off1+off2] {mergeSym(sym1,sym2)} base mem) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - y := v.Args[1] - if y.Op != Op386ADDL { - break - } - x := y.Args[1] - l := y.Args[0] - if l.Op != Op386MOVLload || l.AuxInt != off || l.Aux != sym { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386LEAL { break } - _ = l.Args[1] - if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + base := v_0.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(Op386ADDLmodify) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) + v.reset(Op386MOVSSload) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(base) v.AddArg(mem) return true } - // match: (MOVLstore {sym} [off] ptr y:(ADDL x l:(MOVLload [off] {sym} ptr mem)) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) - // result: (ADDLmodify [off] {sym} ptr x mem) + // match: (MOVSSload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (MOVSSloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - y := v.Args[1] - if y.Op != Op386ADDL { - break - } - _ = y.Args[1] - x := y.Args[0] - l := y.Args[1] - if l.Op != Op386MOVLload || l.AuxInt != off || l.Aux != sym { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386LEAL1 { break } - _ = l.Args[1] - if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + idx := v_0.Args[1] + ptr := v_0.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(Op386ADDLmodify) - v.AuxInt = off - v.Aux = sym + v.reset(Op386MOVSSloadidx1) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) v.AddArg(ptr) - v.AddArg(x) + v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVLstore {sym} [off] ptr y:(SUBL l:(MOVLload [off] {sym} ptr mem) x) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) - // result: (SUBLmodify [off] {sym} ptr x mem) + // match: (MOVSSload [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (MOVSSloadidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - y := v.Args[1] - if y.Op != Op386SUBL { - break - } - x := y.Args[1] - l := y.Args[0] - if l.Op != Op386MOVLload || l.AuxInt != off || l.Aux != sym { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386LEAL4 { break } - _ = l.Args[1] - if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + idx := v_0.Args[1] + ptr := v_0.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(Op386SUBLmodify) - v.AuxInt = off - v.Aux = sym + v.reset(Op386MOVSSloadidx4) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) v.AddArg(ptr) - v.AddArg(x) + v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVLstore {sym} [off] ptr y:(ANDL l:(MOVLload [off] {sym} ptr mem) x) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) - // result: (ANDLmodify [off] {sym} ptr x mem) + // match: (MOVSSload [off] {sym} (ADDL ptr idx) mem) + // cond: ptr.Op != OpSB + // result: (MOVSSloadidx1 [off] {sym} ptr idx mem) for { off := v.AuxInt sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - y := v.Args[1] - if y.Op != Op386ANDL { + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386ADDL { break } - x := y.Args[1] - l := y.Args[0] - if l.Op != Op386MOVLload || l.AuxInt != off || l.Aux != sym { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + if !(ptr.Op != OpSB) { + continue + } + v.reset(Op386MOVSSloadidx1) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - _ = l.Args[1] - if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + break + } + return false +} +func rewriteValue386_Op386MOVSSloadidx1_0(v *Value) bool { + // match: (MOVSSloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) + // result: (MOVSSloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) + for { + c := v.AuxInt + sym := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != Op386ADDLconst { break } - v.reset(Op386ANDLmodify) - v.AuxInt = off + d := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1] + v.reset(Op386MOVSSloadidx1) + v.AuxInt = int64(int32(c + d)) v.Aux = sym v.AddArg(ptr) - v.AddArg(x) + v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVLstore {sym} [off] ptr y:(ANDL x l:(MOVLload [off] {sym} ptr mem)) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) - // result: (ANDLmodify [off] {sym} ptr x mem) + // match: (MOVSSloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) + // result: (MOVSSloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) for { - off := v.AuxInt + c := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] - y := v.Args[1] - if y.Op != Op386ANDL { - break - } - _ = y.Args[1] - x := y.Args[0] - l := y.Args[1] - if l.Op != Op386MOVLload || l.AuxInt != off || l.Aux != sym { - break - } - _ = l.Args[1] - if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + v_1 := v.Args[1] + if v_1.Op != Op386ADDLconst { break } - v.reset(Op386ANDLmodify) - v.AuxInt = off + d := v_1.AuxInt + idx := v_1.Args[0] + v.reset(Op386MOVSSloadidx1) + v.AuxInt = int64(int32(c + d)) v.Aux = sym v.AddArg(ptr) - v.AddArg(x) + v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVLstore {sym} [off] ptr y:(ORL l:(MOVLload [off] {sym} ptr mem) x) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) - // result: (ORLmodify [off] {sym} ptr x mem) + return false +} +func rewriteValue386_Op386MOVSSloadidx4_0(v *Value) bool { + // match: (MOVSSloadidx4 [c] {sym} (ADDLconst [d] ptr) idx mem) + // result: (MOVSSloadidx4 [int64(int32(c+d))] {sym} ptr idx mem) for { - off := v.AuxInt + c := v.AuxInt sym := v.Aux mem := v.Args[2] - ptr := v.Args[0] - y := v.Args[1] - if y.Op != Op386ORL { - break - } - x := y.Args[1] - l := y.Args[0] - if l.Op != Op386MOVLload || l.AuxInt != off || l.Aux != sym { - break - } - _ = l.Args[1] - if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + v_0 := v.Args[0] + if v_0.Op != Op386ADDLconst { break } - v.reset(Op386ORLmodify) - v.AuxInt = off + d := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1] + v.reset(Op386MOVSSloadidx4) + v.AuxInt = int64(int32(c + d)) v.Aux = sym v.AddArg(ptr) - v.AddArg(x) + v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVLstore {sym} [off] ptr y:(ORL x l:(MOVLload [off] {sym} ptr mem)) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) - // result: (ORLmodify [off] {sym} ptr x mem) + // match: (MOVSSloadidx4 [c] {sym} ptr (ADDLconst [d] idx) mem) + // result: (MOVSSloadidx4 [int64(int32(c+4*d))] {sym} ptr idx mem) for { - off := v.AuxInt + c := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] - y := v.Args[1] - if y.Op != Op386ORL { - break - } - _ = y.Args[1] - x := y.Args[0] - l := y.Args[1] - if l.Op != Op386MOVLload || l.AuxInt != off || l.Aux != sym { - break - } - _ = l.Args[1] - if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + v_1 := v.Args[1] + if v_1.Op != Op386ADDLconst { break } - v.reset(Op386ORLmodify) - v.AuxInt = off + d := v_1.AuxInt + idx := v_1.Args[0] + v.reset(Op386MOVSSloadidx4) + v.AuxInt = int64(int32(c + 4*d)) v.Aux = sym v.AddArg(ptr) - v.AddArg(x) + v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVLstore {sym} [off] ptr y:(XORL l:(MOVLload [off] {sym} ptr mem) x) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) - // result: (XORLmodify [off] {sym} ptr x mem) + return false +} +func rewriteValue386_Op386MOVSSstore_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (MOVSSstore [off1] {sym} (ADDLconst [off2] ptr) val mem) + // cond: is32Bit(off1+off2) + // result: (MOVSSstore [off1+off2] {sym} ptr val mem) for { - off := v.AuxInt + off1 := v.AuxInt sym := v.Aux mem := v.Args[2] - ptr := v.Args[0] - y := v.Args[1] - if y.Op != Op386XORL { - break - } - x := y.Args[1] - l := y.Args[0] - if l.Op != Op386MOVLload || l.AuxInt != off || l.Aux != sym { + v_0 := v.Args[0] + if v_0.Op != Op386ADDLconst { break } - _ = l.Args[1] - if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + off2 := v_0.AuxInt + ptr := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1 + off2)) { break } - v.reset(Op386XORLmodify) - v.AuxInt = off + v.reset(Op386MOVSSstore) + v.AuxInt = off1 + off2 v.Aux = sym v.AddArg(ptr) - v.AddArg(x) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVLstore {sym} [off] ptr y:(XORL x l:(MOVLload [off] {sym} ptr mem)) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) - // result: (XORLmodify [off] {sym} ptr x mem) + // match: (MOVSSstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVSSstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) for { - off := v.AuxInt - sym := v.Aux + off1 := v.AuxInt + sym1 := v.Aux mem := v.Args[2] - ptr := v.Args[0] - y := v.Args[1] - if y.Op != Op386XORL { - break - } - _ = y.Args[1] - x := y.Args[0] - l := y.Args[1] - if l.Op != Op386MOVLload || l.AuxInt != off || l.Aux != sym { + v_0 := v.Args[0] + if v_0.Op != Op386LEAL { break } - _ = l.Args[1] - if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + base := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(Op386XORLmodify) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) + v.reset(Op386MOVSSstore) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(base) + v.AddArg(val) v.AddArg(mem) return true } - return false -} -func rewriteValue386_Op386MOVLstore_20(v *Value) bool { - // match: (MOVLstore {sym} [off] ptr y:(ADDLconst [c] l:(MOVLload [off] {sym} ptr mem)) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) && validValAndOff(c,off) - // result: (ADDLconstmodify [makeValAndOff(c,off)] {sym} ptr mem) + // match: (MOVSSstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (MOVSSstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) for { - off := v.AuxInt - sym := v.Aux + off1 := v.AuxInt + sym1 := v.Aux mem := v.Args[2] - ptr := v.Args[0] - y := v.Args[1] - if y.Op != Op386ADDLconst { - break - } - c := y.AuxInt - l := y.Args[0] - if l.Op != Op386MOVLload || l.AuxInt != off || l.Aux != sym { + v_0 := v.Args[0] + if v_0.Op != Op386LEAL1 { break } - _ = l.Args[1] - if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + idx := v_0.Args[1] + ptr := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(Op386ADDLconstmodify) - v.AuxInt = makeValAndOff(c, off) - v.Aux = sym + v.reset(Op386MOVSSstoreidx1) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVLstore {sym} [off] ptr y:(ANDLconst [c] l:(MOVLload [off] {sym} ptr mem)) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) && validValAndOff(c,off) - // result: (ANDLconstmodify [makeValAndOff(c,off)] {sym} ptr mem) + // match: (MOVSSstore [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) val mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (MOVSSstoreidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) for { - off := v.AuxInt - sym := v.Aux + off1 := v.AuxInt + sym1 := v.Aux mem := v.Args[2] - ptr := v.Args[0] - y := v.Args[1] - if y.Op != Op386ANDLconst { - break - } - c := y.AuxInt - l := y.Args[0] - if l.Op != Op386MOVLload || l.AuxInt != off || l.Aux != sym { + v_0 := v.Args[0] + if v_0.Op != Op386LEAL4 { break } - _ = l.Args[1] - if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + idx := v_0.Args[1] + ptr := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(Op386ANDLconstmodify) - v.AuxInt = makeValAndOff(c, off) - v.Aux = sym + v.reset(Op386MOVSSstoreidx4) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVLstore {sym} [off] ptr y:(ORLconst [c] l:(MOVLload [off] {sym} ptr mem)) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) && validValAndOff(c,off) - // result: (ORLconstmodify [makeValAndOff(c,off)] {sym} ptr mem) + // match: (MOVSSstore [off] {sym} (ADDL ptr idx) val mem) + // cond: ptr.Op != OpSB + // result: (MOVSSstoreidx1 [off] {sym} ptr idx val mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] - ptr := v.Args[0] - y := v.Args[1] - if y.Op != Op386ORLconst { + v_0 := v.Args[0] + if v_0.Op != Op386ADDL { break } - c := y.AuxInt - l := y.Args[0] - if l.Op != Op386MOVLload || l.AuxInt != off || l.Aux != sym { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + val := v.Args[1] + if !(ptr.Op != OpSB) { + continue + } + v.reset(Op386MOVSSstoreidx1) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true } - _ = l.Args[1] - if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { + break + } + return false +} +func rewriteValue386_Op386MOVSSstoreidx1_0(v *Value) bool { + // match: (MOVSSstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) + // result: (MOVSSstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) + for { + c := v.AuxInt + sym := v.Aux + mem := v.Args[3] + v_0 := v.Args[0] + if v_0.Op != Op386ADDLconst { break } - v.reset(Op386ORLconstmodify) - v.AuxInt = makeValAndOff(c, off) + d := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1] + val := v.Args[2] + v.reset(Op386MOVSSstoreidx1) + v.AuxInt = int64(int32(c + d)) v.Aux = sym v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVLstore {sym} [off] ptr y:(XORLconst [c] l:(MOVLload [off] {sym} ptr mem)) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) && validValAndOff(c,off) - // result: (XORLconstmodify [makeValAndOff(c,off)] {sym} ptr mem) + // match: (MOVSSstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) + // result: (MOVSSstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) for { - off := v.AuxInt + c := v.AuxInt sym := v.Aux - mem := v.Args[2] + mem := v.Args[3] ptr := v.Args[0] - y := v.Args[1] - if y.Op != Op386XORLconst { - break - } - c := y.AuxInt - l := y.Args[0] - if l.Op != Op386MOVLload || l.AuxInt != off || l.Aux != sym { - break - } - _ = l.Args[1] - if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { + v_1 := v.Args[1] + if v_1.Op != Op386ADDLconst { break } - v.reset(Op386XORLconstmodify) - v.AuxInt = makeValAndOff(c, off) + d := v_1.AuxInt + idx := v_1.Args[0] + val := v.Args[2] + v.reset(Op386MOVSSstoreidx1) + v.AuxInt = int64(int32(c + d)) v.Aux = sym v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) v.AddArg(mem) return true } return false } -func rewriteValue386_Op386MOVLstoreconst_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (MOVLstoreconst [sc] {s} (ADDLconst [off] ptr) mem) - // cond: ValAndOff(sc).canAdd(off) - // result: (MOVLstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) +func rewriteValue386_Op386MOVSSstoreidx4_0(v *Value) bool { + // match: (MOVSSstoreidx4 [c] {sym} (ADDLconst [d] ptr) idx val mem) + // result: (MOVSSstoreidx4 [int64(int32(c+d))] {sym} ptr idx val mem) for { - sc := v.AuxInt - s := v.Aux - mem := v.Args[1] + c := v.AuxInt + sym := v.Aux + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break } - off := v_0.AuxInt + d := v_0.AuxInt ptr := v_0.Args[0] - if !(ValAndOff(sc).canAdd(off)) { + idx := v.Args[1] + val := v.Args[2] + v.reset(Op386MOVSSstoreidx4) + v.AuxInt = int64(int32(c + d)) + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true + } + // match: (MOVSSstoreidx4 [c] {sym} ptr (ADDLconst [d] idx) val mem) + // result: (MOVSSstoreidx4 [int64(int32(c+4*d))] {sym} ptr idx val mem) + for { + c := v.AuxInt + sym := v.Aux + mem := v.Args[3] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386ADDLconst { break } - v.reset(Op386MOVLstoreconst) - v.AuxInt = ValAndOff(sc).add(off) - v.Aux = s + d := v_1.AuxInt + idx := v_1.Args[0] + val := v.Args[2] + v.reset(Op386MOVSSstoreidx4) + v.AuxInt = int64(int32(c + 4*d)) + v.Aux = sym v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVLstoreconst [sc] {sym1} (LEAL [off] {sym2} ptr) mem) - // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVLstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) + return false +} +func rewriteValue386_Op386MOVWLSX_0(v *Value) bool { + b := v.Block + // match: (MOVWLSX x:(MOVWload [off] {sym} ptr mem)) + // cond: x.Uses == 1 && clobber(x) + // result: @x.Block (MOVWLSXload [off] {sym} ptr mem) for { - sc := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL { + x := v.Args[0] + if x.Op != Op386MOVWload { break } - off := v_0.AuxInt - sym2 := v_0.Aux - ptr := v_0.Args[0] - if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + off := x.AuxInt + sym := x.Aux + mem := x.Args[1] + ptr := x.Args[0] + if !(x.Uses == 1 && clobber(x)) { break } - v.reset(Op386MOVLstoreconst) - v.AuxInt = ValAndOff(sc).add(off) - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(mem) + b = x.Block + v0 := b.NewValue0(x.Pos, Op386MOVWLSXload, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = off + v0.Aux = sym + v0.AddArg(ptr) + v0.AddArg(mem) return true } - // match: (MOVLstoreconst [x] {sym1} (LEAL1 [off] {sym2} ptr idx) mem) - // cond: canMergeSym(sym1, sym2) - // result: (MOVLstoreconstidx1 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) + // match: (MOVWLSX (ANDLconst [c] x)) + // cond: c & 0x8000 == 0 + // result: (ANDLconst [c & 0x7fff] x) for { - x := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != Op386LEAL1 { + if v_0.Op != Op386ANDLconst { break } - off := v_0.AuxInt - sym2 := v_0.Aux - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(canMergeSym(sym1, sym2)) { + c := v_0.AuxInt + x := v_0.Args[0] + if !(c&0x8000 == 0) { break } - v.reset(Op386MOVLstoreconstidx1) - v.AuxInt = ValAndOff(x).add(off) - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + v.reset(Op386ANDLconst) + v.AuxInt = c & 0x7fff + v.AddArg(x) return true } - // match: (MOVLstoreconst [x] {sym1} (LEAL4 [off] {sym2} ptr idx) mem) - // cond: canMergeSym(sym1, sym2) - // result: (MOVLstoreconstidx4 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) + return false +} +func rewriteValue386_Op386MOVWLSXload_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (MOVWLSXload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) + // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) + // result: (MOVWLSX x) for { - x := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL4 { + off := v.AuxInt + sym := v.Aux + _ = v.Args[1] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386MOVWstore { break } - off := v_0.AuxInt - sym2 := v_0.Aux - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(canMergeSym(sym1, sym2)) { + off2 := v_1.AuxInt + sym2 := v_1.Aux + _ = v_1.Args[2] + ptr2 := v_1.Args[0] + x := v_1.Args[1] + if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { break } - v.reset(Op386MOVLstoreconstidx4) - v.AuxInt = ValAndOff(x).add(off) - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + v.reset(Op386MOVWLSX) + v.AddArg(x) return true } - // match: (MOVLstoreconst [x] {sym} (ADDL ptr idx) mem) - // result: (MOVLstoreconstidx1 [x] {sym} ptr idx mem) + // match: (MOVWLSXload [off1] {sym1} (LEAL [off2] {sym2} base) mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVWLSXload [off1+off2] {mergeSym(sym1,sym2)} base mem) for { - x := v.AuxInt - sym := v.Aux + off1 := v.AuxInt + sym1 := v.Aux mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != Op386ADDL { + if v_0.Op != Op386LEAL { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - v.reset(Op386MOVLstoreconstidx1) - v.AuxInt = x - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) + off2 := v_0.AuxInt + sym2 := v_0.Aux + base := v_0.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { + break + } + v.reset(Op386MOVWLSXload) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(base) v.AddArg(mem) return true } return false } -func rewriteValue386_Op386MOVLstoreconstidx1_0(v *Value) bool { - // match: (MOVLstoreconstidx1 [c] {sym} ptr (SHLLconst [2] idx) mem) - // result: (MOVLstoreconstidx4 [c] {sym} ptr idx mem) +func rewriteValue386_Op386MOVWLZX_0(v *Value) bool { + b := v.Block + // match: (MOVWLZX x:(MOVWload [off] {sym} ptr mem)) + // cond: x.Uses == 1 && clobber(x) + // result: @x.Block (MOVWload [off] {sym} ptr mem) for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHLLconst || v_1.AuxInt != 2 { + x := v.Args[0] + if x.Op != Op386MOVWload { break } - idx := v_1.Args[0] - v.reset(Op386MOVLstoreconstidx4) - v.AuxInt = c - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + off := x.AuxInt + sym := x.Aux + mem := x.Args[1] + ptr := x.Args[0] + if !(x.Uses == 1 && clobber(x)) { + break + } + b = x.Block + v0 := b.NewValue0(x.Pos, Op386MOVWload, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = off + v0.Aux = sym + v0.AddArg(ptr) + v0.AddArg(mem) return true } - // match: (MOVLstoreconstidx1 [x] {sym} (ADDLconst [c] ptr) idx mem) - // result: (MOVLstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) + // match: (MOVWLZX x:(MOVWloadidx1 [off] {sym} ptr idx mem)) + // cond: x.Uses == 1 && clobber(x) + // result: @x.Block (MOVWloadidx1 [off] {sym} ptr idx mem) for { - x := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { + x := v.Args[0] + if x.Op != Op386MOVWloadidx1 { break } - c := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - v.reset(Op386MOVLstoreconstidx1) - v.AuxInt = ValAndOff(x).add(c) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + off := x.AuxInt + sym := x.Aux + mem := x.Args[2] + ptr := x.Args[0] + idx := x.Args[1] + if !(x.Uses == 1 && clobber(x)) { + break + } + b = x.Block + v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = off + v0.Aux = sym + v0.AddArg(ptr) + v0.AddArg(idx) + v0.AddArg(mem) return true } - // match: (MOVLstoreconstidx1 [x] {sym} ptr (ADDLconst [c] idx) mem) - // result: (MOVLstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) + // match: (MOVWLZX x:(MOVWloadidx2 [off] {sym} ptr idx mem)) + // cond: x.Uses == 1 && clobber(x) + // result: @x.Block (MOVWloadidx2 [off] {sym} ptr idx mem) for { - x := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { + x := v.Args[0] + if x.Op != Op386MOVWloadidx2 { break } - c := v_1.AuxInt - idx := v_1.Args[0] - v.reset(Op386MOVLstoreconstidx1) - v.AuxInt = ValAndOff(x).add(c) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + off := x.AuxInt + sym := x.Aux + mem := x.Args[2] + ptr := x.Args[0] + idx := x.Args[1] + if !(x.Uses == 1 && clobber(x)) { + break + } + b = x.Block + v0 := b.NewValue0(v.Pos, Op386MOVWloadidx2, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = off + v0.Aux = sym + v0.AddArg(ptr) + v0.AddArg(idx) + v0.AddArg(mem) return true } - return false -} -func rewriteValue386_Op386MOVLstoreconstidx4_0(v *Value) bool { - // match: (MOVLstoreconstidx4 [x] {sym} (ADDLconst [c] ptr) idx mem) - // result: (MOVLstoreconstidx4 [ValAndOff(x).add(c)] {sym} ptr idx mem) + // match: (MOVWLZX (ANDLconst [c] x)) + // result: (ANDLconst [c & 0xffff] x) for { - x := v.AuxInt - sym := v.Aux - mem := v.Args[2] v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { + if v_0.Op != Op386ANDLconst { break } c := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - v.reset(Op386MOVLstoreconstidx4) - v.AuxInt = ValAndOff(x).add(c) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + x := v_0.Args[0] + v.reset(Op386ANDLconst) + v.AuxInt = c & 0xffff + v.AddArg(x) return true } - // match: (MOVLstoreconstidx4 [x] {sym} ptr (ADDLconst [c] idx) mem) - // result: (MOVLstoreconstidx4 [ValAndOff(x).add(4*c)] {sym} ptr idx mem) + return false +} +func rewriteValue386_Op386MOVWload_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (MOVWload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) + // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) + // result: (MOVWLZX x) for { - x := v.AuxInt + off := v.AuxInt sym := v.Aux - mem := v.Args[2] + _ = v.Args[1] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { + if v_1.Op != Op386MOVWstore { break } - c := v_1.AuxInt - idx := v_1.Args[0] - v.reset(Op386MOVLstoreconstidx4) - v.AuxInt = ValAndOff(x).add(4 * c) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + off2 := v_1.AuxInt + sym2 := v_1.Aux + _ = v_1.Args[2] + ptr2 := v_1.Args[0] + x := v_1.Args[1] + if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { + break + } + v.reset(Op386MOVWLZX) + v.AddArg(x) return true } - return false -} -func rewriteValue386_Op386MOVLstoreidx1_0(v *Value) bool { - // match: (MOVLstoreidx1 [c] {sym} ptr (SHLLconst [2] idx) val mem) - // result: (MOVLstoreidx4 [c] {sym} ptr idx val mem) + // match: (MOVWload [off1] {sym} (ADDLconst [off2] ptr) mem) + // cond: is32Bit(off1+off2) + // result: (MOVWload [off1+off2] {sym} ptr mem) for { - c := v.AuxInt + off1 := v.AuxInt sym := v.Aux - mem := v.Args[3] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHLLconst || v_1.AuxInt != 2 { + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386ADDLconst { break } - idx := v_1.Args[0] - val := v.Args[2] - v.reset(Op386MOVLstoreidx4) - v.AuxInt = c + off2 := v_0.AuxInt + ptr := v_0.Args[0] + if !(is32Bit(off1 + off2)) { + break + } + v.reset(Op386MOVWload) + v.AuxInt = off1 + off2 v.Aux = sym v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVLstoreidx1 [c] {sym} (SHLLconst [2] idx) ptr val mem) - // result: (MOVLstoreidx4 [c] {sym} ptr idx val mem) + // match: (MOVWload [off1] {sym1} (LEAL [off2] {sym2} base) mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} base mem) for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[3] + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != Op386SHLLconst || v_0.AuxInt != 2 { + if v_0.Op != Op386LEAL { break } - idx := v_0.Args[0] - ptr := v.Args[1] - val := v.Args[2] - v.reset(Op386MOVLstoreidx4) - v.AuxInt = c - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) + off2 := v_0.AuxInt + sym2 := v_0.Aux + base := v_0.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { + break + } + v.reset(Op386MOVWload) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(base) v.AddArg(mem) return true } - // match: (MOVLstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) - // result: (MOVLstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) + // match: (MOVWload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (MOVWloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[3] + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { + if v_0.Op != Op386LEAL1 { break } - d := v_0.AuxInt + off2 := v_0.AuxInt + sym2 := v_0.Aux + idx := v_0.Args[1] ptr := v_0.Args[0] - idx := v.Args[1] - val := v.Args[2] - v.reset(Op386MOVLstoreidx1) - v.AuxInt = int64(int32(c + d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVLstoreidx1 [c] {sym} idx (ADDLconst [d] ptr) val mem) - // result: (MOVLstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[3] - idx := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - d := v_1.AuxInt - ptr := v_1.Args[0] - val := v.Args[2] - v.reset(Op386MOVLstoreidx1) - v.AuxInt = int64(int32(c + d)) - v.Aux = sym + v.reset(Op386MOVWloadidx1) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) v.AddArg(ptr) v.AddArg(idx) - v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVLstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) - // result: (MOVLstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) + // match: (MOVWload [off1] {sym1} (LEAL2 [off2] {sym2} ptr idx) mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (MOVWloadidx2 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[3] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386LEAL2 { break } - d := v_1.AuxInt - idx := v_1.Args[0] - val := v.Args[2] - v.reset(Op386MOVLstoreidx1) - v.AuxInt = int64(int32(c + d)) - v.Aux = sym + off2 := v_0.AuxInt + sym2 := v_0.Aux + idx := v_0.Args[1] + ptr := v_0.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + break + } + v.reset(Op386MOVWloadidx2) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) v.AddArg(ptr) v.AddArg(idx) - v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVLstoreidx1 [c] {sym} (ADDLconst [d] idx) ptr val mem) - // result: (MOVLstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) + // match: (MOVWload [off] {sym} (ADDL ptr idx) mem) + // cond: ptr.Op != OpSB + // result: (MOVWloadidx1 [off] {sym} ptr idx mem) for { - c := v.AuxInt + off := v.AuxInt sym := v.Aux - mem := v.Args[3] + mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { + if v_0.Op != Op386ADDL { break } - d := v_0.AuxInt - idx := v_0.Args[0] - ptr := v.Args[1] - val := v.Args[2] - v.reset(Op386MOVLstoreidx1) - v.AuxInt = int64(int32(c + d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + if !(ptr.Op != OpSB) { + continue + } + v.reset(Op386MOVWloadidx1) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + break + } + // match: (MOVWload [off] {sym} (SB) _) + // cond: symIsRO(sym) + // result: (MOVLconst [int64(read16(sym, off, config.BigEndian))]) + for { + off := v.AuxInt + sym := v.Aux + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpSB || !(symIsRO(sym)) { + break + } + v.reset(Op386MOVLconst) + v.AuxInt = int64(read16(sym, off, config.BigEndian)) return true } return false } -func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool { - // match: (MOVLstoreidx4 [c] {sym} (ADDLconst [d] ptr) idx val mem) - // result: (MOVLstoreidx4 [int64(int32(c+d))] {sym} ptr idx val mem) +func rewriteValue386_Op386MOVWloadidx1_0(v *Value) bool { + // match: (MOVWloadidx1 [c] {sym} ptr (SHLLconst [1] idx) mem) + // result: (MOVWloadidx2 [c] {sym} ptr idx mem) for { c := v.AuxInt sym := v.Aux - mem := v.Args[3] + mem := v.Args[2] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386SHLLconst || v_1.AuxInt != 1 { + continue + } + idx := v_1.Args[0] + v.reset(Op386MOVWloadidx2) + v.AuxInt = c + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + break + } + // match: (MOVWloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) + // result: (MOVWloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) + for { + c := v.AuxInt + sym := v.Aux + mem := v.Args[2] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != Op386ADDLconst { + continue + } + d := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1^_i0] + v.reset(Op386MOVWloadidx1) + v.AuxInt = int64(int32(c + d)) + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + break + } + // match: (MOVWloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) + // result: (MOVWloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) + for { + c := v.AuxInt + sym := v.Aux + mem := v.Args[2] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386ADDLconst { + continue + } + d := v_1.AuxInt + idx := v_1.Args[0] + v.reset(Op386MOVWloadidx1) + v.AuxInt = int64(int32(c + d)) + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + break + } + return false +} +func rewriteValue386_Op386MOVWloadidx2_0(v *Value) bool { + // match: (MOVWloadidx2 [c] {sym} (ADDLconst [d] ptr) idx mem) + // result: (MOVWloadidx2 [int64(int32(c+d))] {sym} ptr idx mem) + for { + c := v.AuxInt + sym := v.Aux + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -7808,22 +8363,20 @@ func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - val := v.Args[2] - v.reset(Op386MOVLstoreidx4) + v.reset(Op386MOVWloadidx2) v.AuxInt = int64(int32(c + d)) v.Aux = sym v.AddArg(ptr) v.AddArg(idx) - v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVLstoreidx4 [c] {sym} ptr (ADDLconst [d] idx) val mem) - // result: (MOVLstoreidx4 [int64(int32(c+4*d))] {sym} ptr idx val mem) + // match: (MOVWloadidx2 [c] {sym} ptr (ADDLconst [d] idx) mem) + // result: (MOVWloadidx2 [int64(int32(c+2*d))] {sym} ptr idx mem) for { c := v.AuxInt sym := v.Aux - mem := v.Args[3] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -7831,730 +8384,583 @@ func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - val := v.Args[2] - v.reset(Op386MOVLstoreidx4) - v.AuxInt = int64(int32(c + 4*d)) + v.reset(Op386MOVWloadidx2) + v.AuxInt = int64(int32(c + 2*d)) v.Aux = sym v.AddArg(ptr) v.AddArg(idx) - v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ADDLloadidx4 x [off] {sym} ptr idx mem) mem) - // cond: y.Uses==1 && clobber(y) - // result: (ADDLmodifyidx4 [off] {sym} ptr idx x mem) + return false +} +func rewriteValue386_Op386MOVWstore_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (MOVWstore [off] {sym} ptr (MOVWLSX x) mem) + // result: (MOVWstore [off] {sym} ptr x mem) for { off := v.AuxInt sym := v.Aux - mem := v.Args[3] + mem := v.Args[2] ptr := v.Args[0] - idx := v.Args[1] - y := v.Args[2] - if y.Op != Op386ADDLloadidx4 || y.AuxInt != off || y.Aux != sym { - break - } - _ = y.Args[3] - x := y.Args[0] - if ptr != y.Args[1] || idx != y.Args[2] || mem != y.Args[3] || !(y.Uses == 1 && clobber(y)) { + v_1 := v.Args[1] + if v_1.Op != Op386MOVWLSX { break } - v.reset(Op386ADDLmodifyidx4) + x := v_1.Args[0] + v.reset(Op386MOVWstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v.AddArg(idx) v.AddArg(x) v.AddArg(mem) return true } - // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ANDLloadidx4 x [off] {sym} ptr idx mem) mem) - // cond: y.Uses==1 && clobber(y) - // result: (ANDLmodifyidx4 [off] {sym} ptr idx x mem) + // match: (MOVWstore [off] {sym} ptr (MOVWLZX x) mem) + // result: (MOVWstore [off] {sym} ptr x mem) for { off := v.AuxInt sym := v.Aux - mem := v.Args[3] + mem := v.Args[2] ptr := v.Args[0] - idx := v.Args[1] - y := v.Args[2] - if y.Op != Op386ANDLloadidx4 || y.AuxInt != off || y.Aux != sym { - break - } - _ = y.Args[3] - x := y.Args[0] - if ptr != y.Args[1] || idx != y.Args[2] || mem != y.Args[3] || !(y.Uses == 1 && clobber(y)) { + v_1 := v.Args[1] + if v_1.Op != Op386MOVWLZX { break } - v.reset(Op386ANDLmodifyidx4) + x := v_1.Args[0] + v.reset(Op386MOVWstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v.AddArg(idx) v.AddArg(x) v.AddArg(mem) return true } - // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ORLloadidx4 x [off] {sym} ptr idx mem) mem) - // cond: y.Uses==1 && clobber(y) - // result: (ORLmodifyidx4 [off] {sym} ptr idx x mem) + // match: (MOVWstore [off1] {sym} (ADDLconst [off2] ptr) val mem) + // cond: is32Bit(off1+off2) + // result: (MOVWstore [off1+off2] {sym} ptr val mem) for { - off := v.AuxInt + off1 := v.AuxInt sym := v.Aux - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] - y := v.Args[2] - if y.Op != Op386ORLloadidx4 || y.AuxInt != off || y.Aux != sym { + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != Op386ADDLconst { break } - _ = y.Args[3] - x := y.Args[0] - if ptr != y.Args[1] || idx != y.Args[2] || mem != y.Args[3] || !(y.Uses == 1 && clobber(y)) { + off2 := v_0.AuxInt + ptr := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1 + off2)) { break } - v.reset(Op386ORLmodifyidx4) - v.AuxInt = off + v.reset(Op386MOVWstore) + v.AuxInt = off1 + off2 v.Aux = sym v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(x) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(XORLloadidx4 x [off] {sym} ptr idx mem) mem) - // cond: y.Uses==1 && clobber(y) - // result: (XORLmodifyidx4 [off] {sym} ptr idx x mem) + // match: (MOVWstore [off] {sym} ptr (MOVLconst [c]) mem) + // cond: validOff(off) + // result: (MOVWstoreconst [makeValAndOff(int64(int16(c)),off)] {sym} ptr mem) for { off := v.AuxInt sym := v.Aux - mem := v.Args[3] + mem := v.Args[2] ptr := v.Args[0] - idx := v.Args[1] - y := v.Args[2] - if y.Op != Op386XORLloadidx4 || y.AuxInt != off || y.Aux != sym { + v_1 := v.Args[1] + if v_1.Op != Op386MOVLconst { break } - _ = y.Args[3] - x := y.Args[0] - if ptr != y.Args[1] || idx != y.Args[2] || mem != y.Args[3] || !(y.Uses == 1 && clobber(y)) { + c := v_1.AuxInt + if !(validOff(off)) { break } - v.reset(Op386XORLmodifyidx4) - v.AuxInt = off + v.reset(Op386MOVWstoreconst) + v.AuxInt = makeValAndOff(int64(int16(c)), off) v.Aux = sym v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(x) v.AddArg(mem) return true } - // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ADDL l:(MOVLloadidx4 [off] {sym} ptr idx mem) x) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) - // result: (ADDLmodifyidx4 [off] {sym} ptr idx x mem) + // match: (MOVWstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] - y := v.Args[2] - if y.Op != Op386ADDL { - break - } - x := y.Args[1] - l := y.Args[0] - if l.Op != Op386MOVLloadidx4 || l.AuxInt != off || l.Aux != sym { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != Op386LEAL { break } - _ = l.Args[2] - if ptr != l.Args[0] || idx != l.Args[1] || mem != l.Args[2] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + base := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(Op386ADDLmodifyidx4) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(x) + v.reset(Op386MOVWstore) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(base) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ADDL x l:(MOVLloadidx4 [off] {sym} ptr idx mem)) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) - // result: (ADDLmodifyidx4 [off] {sym} ptr idx x mem) + // match: (MOVWstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (MOVWstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] - y := v.Args[2] - if y.Op != Op386ADDL { - break - } - _ = y.Args[1] - x := y.Args[0] - l := y.Args[1] - if l.Op != Op386MOVLloadidx4 || l.AuxInt != off || l.Aux != sym { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != Op386LEAL1 { break } - _ = l.Args[2] - if ptr != l.Args[0] || idx != l.Args[1] || mem != l.Args[2] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + idx := v_0.Args[1] + ptr := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(Op386ADDLmodifyidx4) - v.AuxInt = off - v.Aux = sym + v.reset(Op386MOVWstoreidx1) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) v.AddArg(ptr) v.AddArg(idx) - v.AddArg(x) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(SUBL l:(MOVLloadidx4 [off] {sym} ptr idx mem) x) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) - // result: (SUBLmodifyidx4 [off] {sym} ptr idx x mem) + // match: (MOVWstore [off1] {sym1} (LEAL2 [off2] {sym2} ptr idx) val mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (MOVWstoreidx2 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] - y := v.Args[2] - if y.Op != Op386SUBL { - break - } - x := y.Args[1] - l := y.Args[0] - if l.Op != Op386MOVLloadidx4 || l.AuxInt != off || l.Aux != sym { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != Op386LEAL2 { break } - _ = l.Args[2] - if ptr != l.Args[0] || idx != l.Args[1] || mem != l.Args[2] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + idx := v_0.Args[1] + ptr := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(Op386SUBLmodifyidx4) - v.AuxInt = off - v.Aux = sym + v.reset(Op386MOVWstoreidx2) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) v.AddArg(ptr) v.AddArg(idx) - v.AddArg(x) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ANDL l:(MOVLloadidx4 [off] {sym} ptr idx mem) x) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) - // result: (ANDLmodifyidx4 [off] {sym} ptr idx x mem) + // match: (MOVWstore [off] {sym} (ADDL ptr idx) val mem) + // cond: ptr.Op != OpSB + // result: (MOVWstoreidx1 [off] {sym} ptr idx val mem) for { off := v.AuxInt sym := v.Aux - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] - y := v.Args[2] - if y.Op != Op386ANDL { + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != Op386ADDL { break } - x := y.Args[1] - l := y.Args[0] - if l.Op != Op386MOVLloadidx4 || l.AuxInt != off || l.Aux != sym { + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + val := v.Args[1] + if !(ptr.Op != OpSB) { + continue + } + v.reset(Op386MOVWstoreidx1) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true + } + break + } + // match: (MOVWstore [i] {s} p (SHRLconst [16] w) x:(MOVWstore [i-2] {s} p w mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVLstore [i-2] {s} p w mem) + for { + i := v.AuxInt + s := v.Aux + _ = v.Args[2] + p := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386SHRLconst || v_1.AuxInt != 16 { break } - _ = l.Args[2] - if ptr != l.Args[0] || idx != l.Args[1] || mem != l.Args[2] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + w := v_1.Args[0] + x := v.Args[2] + if x.Op != Op386MOVWstore || x.AuxInt != i-2 || x.Aux != s { break } - v.reset(Op386ANDLmodifyidx4) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(x) + mem := x.Args[2] + if p != x.Args[0] || w != x.Args[1] || !(x.Uses == 1 && clobber(x)) { + break + } + v.reset(Op386MOVLstore) + v.AuxInt = i - 2 + v.Aux = s + v.AddArg(p) + v.AddArg(w) v.AddArg(mem) return true } - return false -} -func rewriteValue386_Op386MOVLstoreidx4_10(v *Value) bool { - // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ANDL x l:(MOVLloadidx4 [off] {sym} ptr idx mem)) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) - // result: (ANDLmodifyidx4 [off] {sym} ptr idx x mem) + // match: (MOVWstore [i] {s} p (SHRLconst [j] w) x:(MOVWstore [i-2] {s} p w0:(SHRLconst [j-16] w) mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVLstore [i-2] {s} p w0 mem) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] - y := v.Args[2] - if y.Op != Op386ANDL { + i := v.AuxInt + s := v.Aux + _ = v.Args[2] + p := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386SHRLconst { break } - _ = y.Args[1] - x := y.Args[0] - l := y.Args[1] - if l.Op != Op386MOVLloadidx4 || l.AuxInt != off || l.Aux != sym { + j := v_1.AuxInt + w := v_1.Args[0] + x := v.Args[2] + if x.Op != Op386MOVWstore || x.AuxInt != i-2 || x.Aux != s { break } - _ = l.Args[2] - if ptr != l.Args[0] || idx != l.Args[1] || mem != l.Args[2] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + mem := x.Args[2] + if p != x.Args[0] { break } - v.reset(Op386ANDLmodifyidx4) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(x) + w0 := x.Args[1] + if w0.Op != Op386SHRLconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + break + } + v.reset(Op386MOVLstore) + v.AuxInt = i - 2 + v.Aux = s + v.AddArg(p) + v.AddArg(w0) v.AddArg(mem) return true } - // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ORL l:(MOVLloadidx4 [off] {sym} ptr idx mem) x) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) - // result: (ORLmodifyidx4 [off] {sym} ptr idx x mem) + return false +} +func rewriteValue386_Op386MOVWstoreconst_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (MOVWstoreconst [sc] {s} (ADDLconst [off] ptr) mem) + // cond: ValAndOff(sc).canAdd(off) + // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] - y := v.Args[2] - if y.Op != Op386ORL { - break - } - x := y.Args[1] - l := y.Args[0] - if l.Op != Op386MOVLloadidx4 || l.AuxInt != off || l.Aux != sym { + sc := v.AuxInt + s := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386ADDLconst { break } - _ = l.Args[2] - if ptr != l.Args[0] || idx != l.Args[1] || mem != l.Args[2] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + off := v_0.AuxInt + ptr := v_0.Args[0] + if !(ValAndOff(sc).canAdd(off)) { break } - v.reset(Op386ORLmodifyidx4) - v.AuxInt = off - v.Aux = sym + v.reset(Op386MOVWstoreconst) + v.AuxInt = ValAndOff(sc).add(off) + v.Aux = s v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(x) v.AddArg(mem) return true } - // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ORL x l:(MOVLloadidx4 [off] {sym} ptr idx mem)) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) - // result: (ORLmodifyidx4 [off] {sym} ptr idx x mem) + // match: (MOVWstoreconst [sc] {sym1} (LEAL [off] {sym2} ptr) mem) + // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] - y := v.Args[2] - if y.Op != Op386ORL { - break - } - _ = y.Args[1] - x := y.Args[0] - l := y.Args[1] - if l.Op != Op386MOVLloadidx4 || l.AuxInt != off || l.Aux != sym { + sc := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386LEAL { break } - _ = l.Args[2] - if ptr != l.Args[0] || idx != l.Args[1] || mem != l.Args[2] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + off := v_0.AuxInt + sym2 := v_0.Aux + ptr := v_0.Args[0] + if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(Op386ORLmodifyidx4) - v.AuxInt = off - v.Aux = sym + v.reset(Op386MOVWstoreconst) + v.AuxInt = ValAndOff(sc).add(off) + v.Aux = mergeSym(sym1, sym2) v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(x) v.AddArg(mem) return true } - // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(XORL l:(MOVLloadidx4 [off] {sym} ptr idx mem) x) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) - // result: (XORLmodifyidx4 [off] {sym} ptr idx x mem) + // match: (MOVWstoreconst [x] {sym1} (LEAL1 [off] {sym2} ptr idx) mem) + // cond: canMergeSym(sym1, sym2) + // result: (MOVWstoreconstidx1 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] - y := v.Args[2] - if y.Op != Op386XORL { - break - } - x := y.Args[1] - l := y.Args[0] - if l.Op != Op386MOVLloadidx4 || l.AuxInt != off || l.Aux != sym { + x := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386LEAL1 { break } - _ = l.Args[2] - if ptr != l.Args[0] || idx != l.Args[1] || mem != l.Args[2] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + off := v_0.AuxInt + sym2 := v_0.Aux + idx := v_0.Args[1] + ptr := v_0.Args[0] + if !(canMergeSym(sym1, sym2)) { break } - v.reset(Op386XORLmodifyidx4) - v.AuxInt = off - v.Aux = sym + v.reset(Op386MOVWstoreconstidx1) + v.AuxInt = ValAndOff(x).add(off) + v.Aux = mergeSym(sym1, sym2) v.AddArg(ptr) v.AddArg(idx) - v.AddArg(x) v.AddArg(mem) return true } - // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(XORL x l:(MOVLloadidx4 [off] {sym} ptr idx mem)) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) - // result: (XORLmodifyidx4 [off] {sym} ptr idx x mem) + // match: (MOVWstoreconst [x] {sym1} (LEAL2 [off] {sym2} ptr idx) mem) + // cond: canMergeSym(sym1, sym2) + // result: (MOVWstoreconstidx2 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] - y := v.Args[2] - if y.Op != Op386XORL { - break - } - _ = y.Args[1] - x := y.Args[0] - l := y.Args[1] - if l.Op != Op386MOVLloadidx4 || l.AuxInt != off || l.Aux != sym { + x := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386LEAL2 { break } - _ = l.Args[2] - if ptr != l.Args[0] || idx != l.Args[1] || mem != l.Args[2] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + off := v_0.AuxInt + sym2 := v_0.Aux + idx := v_0.Args[1] + ptr := v_0.Args[0] + if !(canMergeSym(sym1, sym2)) { break } - v.reset(Op386XORLmodifyidx4) - v.AuxInt = off - v.Aux = sym + v.reset(Op386MOVWstoreconstidx2) + v.AuxInt = ValAndOff(x).add(off) + v.Aux = mergeSym(sym1, sym2) v.AddArg(ptr) v.AddArg(idx) - v.AddArg(x) v.AddArg(mem) return true } - // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ADDLconst [c] l:(MOVLloadidx4 [off] {sym} ptr idx mem)) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) && validValAndOff(c,off) - // result: (ADDLconstmodifyidx4 [makeValAndOff(c,off)] {sym} ptr idx mem) + // match: (MOVWstoreconst [x] {sym} (ADDL ptr idx) mem) + // result: (MOVWstoreconstidx1 [x] {sym} ptr idx mem) for { - off := v.AuxInt + x := v.AuxInt sym := v.Aux - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] - y := v.Args[2] - if y.Op != Op386ADDLconst { - break - } - c := y.AuxInt - l := y.Args[0] - if l.Op != Op386MOVLloadidx4 || l.AuxInt != off || l.Aux != sym { - break - } - _ = l.Args[2] - if ptr != l.Args[0] || idx != l.Args[1] || mem != l.Args[2] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != Op386ADDL { break } - v.reset(Op386ADDLconstmodifyidx4) - v.AuxInt = makeValAndOff(c, off) + idx := v_0.Args[1] + ptr := v_0.Args[0] + v.reset(Op386MOVWstoreconstidx1) + v.AuxInt = x v.Aux = sym v.AddArg(ptr) v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ANDLconst [c] l:(MOVLloadidx4 [off] {sym} ptr idx mem)) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) && validValAndOff(c,off) - // result: (ANDLconstmodifyidx4 [makeValAndOff(c,off)] {sym} ptr idx mem) + // match: (MOVWstoreconst [c] {s} p x:(MOVWstoreconst [a] {s} p mem)) + // cond: x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) + // result: (MOVLstoreconst [makeValAndOff(ValAndOff(a).Val()&0xffff | ValAndOff(c).Val()<<16, ValAndOff(a).Off())] {s} p mem) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] - y := v.Args[2] - if y.Op != Op386ANDLconst { + c := v.AuxInt + s := v.Aux + _ = v.Args[1] + p := v.Args[0] + x := v.Args[1] + if x.Op != Op386MOVWstoreconst { break } - c := y.AuxInt - l := y.Args[0] - if l.Op != Op386MOVLloadidx4 || l.AuxInt != off || l.Aux != sym { + a := x.AuxInt + if x.Aux != s { break } - _ = l.Args[2] - if ptr != l.Args[0] || idx != l.Args[1] || mem != l.Args[2] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { + mem := x.Args[1] + if p != x.Args[0] || !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { break } - v.reset(Op386ANDLconstmodifyidx4) - v.AuxInt = makeValAndOff(c, off) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) + v.reset(Op386MOVLstoreconst) + v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xffff|ValAndOff(c).Val()<<16, ValAndOff(a).Off()) + v.Aux = s + v.AddArg(p) v.AddArg(mem) return true } - // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(ORLconst [c] l:(MOVLloadidx4 [off] {sym} ptr idx mem)) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) && validValAndOff(c,off) - // result: (ORLconstmodifyidx4 [makeValAndOff(c,off)] {sym} ptr idx mem) + // match: (MOVWstoreconst [a] {s} p x:(MOVWstoreconst [c] {s} p mem)) + // cond: x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) + // result: (MOVLstoreconst [makeValAndOff(ValAndOff(a).Val()&0xffff | ValAndOff(c).Val()<<16, ValAndOff(a).Off())] {s} p mem) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] - y := v.Args[2] - if y.Op != Op386ORLconst { + a := v.AuxInt + s := v.Aux + _ = v.Args[1] + p := v.Args[0] + x := v.Args[1] + if x.Op != Op386MOVWstoreconst { break } - c := y.AuxInt - l := y.Args[0] - if l.Op != Op386MOVLloadidx4 || l.AuxInt != off || l.Aux != sym { + c := x.AuxInt + if x.Aux != s { break } - _ = l.Args[2] - if ptr != l.Args[0] || idx != l.Args[1] || mem != l.Args[2] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { + mem := x.Args[1] + if p != x.Args[0] || !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { break } - v.reset(Op386ORLconstmodifyidx4) - v.AuxInt = makeValAndOff(c, off) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) + v.reset(Op386MOVLstoreconst) + v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xffff|ValAndOff(c).Val()<<16, ValAndOff(a).Off()) + v.Aux = s + v.AddArg(p) v.AddArg(mem) return true } - // match: (MOVLstoreidx4 {sym} [off] ptr idx y:(XORLconst [c] l:(MOVLloadidx4 [off] {sym} ptr idx mem)) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) && validValAndOff(c,off) - // result: (XORLconstmodifyidx4 [makeValAndOff(c,off)] {sym} ptr idx mem) + return false +} +func rewriteValue386_Op386MOVWstoreconstidx1_0(v *Value) bool { + // match: (MOVWstoreconstidx1 [c] {sym} ptr (SHLLconst [1] idx) mem) + // result: (MOVWstoreconstidx2 [c] {sym} ptr idx mem) for { - off := v.AuxInt + c := v.AuxInt sym := v.Aux - mem := v.Args[3] + mem := v.Args[2] ptr := v.Args[0] - idx := v.Args[1] - y := v.Args[2] - if y.Op != Op386XORLconst { - break - } - c := y.AuxInt - l := y.Args[0] - if l.Op != Op386MOVLloadidx4 || l.AuxInt != off || l.Aux != sym { - break - } - _ = l.Args[2] - if ptr != l.Args[0] || idx != l.Args[1] || mem != l.Args[2] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { + v_1 := v.Args[1] + if v_1.Op != Op386SHLLconst || v_1.AuxInt != 1 { break } - v.reset(Op386XORLconstmodifyidx4) - v.AuxInt = makeValAndOff(c, off) + idx := v_1.Args[0] + v.reset(Op386MOVWstoreconstidx2) + v.AuxInt = c v.Aux = sym v.AddArg(ptr) v.AddArg(idx) v.AddArg(mem) return true } - return false -} -func rewriteValue386_Op386MOVSDconst_0(v *Value) bool { - b := v.Block - config := b.Func.Config - typ := &b.Func.Config.Types - // match: (MOVSDconst [c]) - // cond: config.ctxt.Flag_shared - // result: (MOVSDconst2 (MOVSDconst1 [c])) + // match: (MOVWstoreconstidx1 [x] {sym} (ADDLconst [c] ptr) idx mem) + // result: (MOVWstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) for { - c := v.AuxInt - if !(config.ctxt.Flag_shared) { + x := v.AuxInt + sym := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != Op386ADDLconst { break } - v.reset(Op386MOVSDconst2) - v0 := b.NewValue0(v.Pos, Op386MOVSDconst1, typ.UInt32) - v0.AuxInt = c - v.AddArg(v0) - return true - } - return false -} -func rewriteValue386_Op386MOVSDload_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (MOVSDload [off1] {sym} (ADDLconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) - // result: (MOVSDload [off1+off2] {sym} ptr mem) - for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { - break - } - off2 := v_0.AuxInt + c := v_0.AuxInt ptr := v_0.Args[0] - if !(is32Bit(off1 + off2)) { - break - } - v.reset(Op386MOVSDload) - v.AuxInt = off1 + off2 + idx := v.Args[1] + v.reset(Op386MOVWstoreconstidx1) + v.AuxInt = ValAndOff(x).add(c) v.Aux = sym v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MOVSDload [off1] {sym1} (LEAL [off2] {sym2} base) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVSDload [off1+off2] {mergeSym(sym1,sym2)} base mem) - for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL { - break - } - off2 := v_0.AuxInt - sym2 := v_0.Aux - base := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { - break - } - v.reset(Op386MOVSDload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(base) - v.AddArg(mem) - return true - } - // match: (MOVSDload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVSDloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) - for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL1 { - break - } - off2 := v_0.AuxInt - sym2 := v_0.Aux - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { - break - } - v.reset(Op386MOVSDloadidx1) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVSDload [off1] {sym1} (LEAL8 [off2] {sym2} ptr idx) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVSDloadidx8 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) - for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL8 { - break - } - off2 := v_0.AuxInt - sym2 := v_0.Aux - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { - break - } - v.reset(Op386MOVSDloadidx8) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVSDload [off] {sym} (ADDL ptr idx) mem) - // cond: ptr.Op != OpSB - // result: (MOVSDloadidx1 [off] {sym} ptr idx mem) + // match: (MOVWstoreconstidx1 [x] {sym} ptr (ADDLconst [c] idx) mem) + // result: (MOVWstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) for { - off := v.AuxInt + x := v.AuxInt sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386ADDL { - break - } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(ptr.Op != OpSB) { + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386ADDLconst { break } - v.reset(Op386MOVSDloadidx1) - v.AuxInt = off + c := v_1.AuxInt + idx := v_1.Args[0] + v.reset(Op386MOVWstoreconstidx1) + v.AuxInt = ValAndOff(x).add(c) v.Aux = sym v.AddArg(ptr) v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVSDload [off] {sym} (ADDL idx ptr) mem) - // cond: ptr.Op != OpSB - // result: (MOVSDloadidx1 [off] {sym} ptr idx mem) + // match: (MOVWstoreconstidx1 [c] {s} p i x:(MOVWstoreconstidx1 [a] {s} p i mem)) + // cond: x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) + // result: (MOVLstoreconstidx1 [makeValAndOff(ValAndOff(a).Val()&0xffff | ValAndOff(c).Val()<<16, ValAndOff(a).Off())] {s} p i mem) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386ADDL { + c := v.AuxInt + s := v.Aux + _ = v.Args[2] + p := v.Args[0] + i := v.Args[1] + x := v.Args[2] + if x.Op != Op386MOVWstoreconstidx1 { break } - ptr := v_0.Args[1] - idx := v_0.Args[0] - if !(ptr.Op != OpSB) { + a := x.AuxInt + if x.Aux != s { break } - v.reset(Op386MOVSDloadidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) + mem := x.Args[2] + if p != x.Args[0] || i != x.Args[1] || !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { + break + } + v.reset(Op386MOVLstoreconstidx1) + v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xffff|ValAndOff(c).Val()<<16, ValAndOff(a).Off()) + v.Aux = s + v.AddArg(p) + v.AddArg(i) v.AddArg(mem) return true } return false } -func rewriteValue386_Op386MOVSDloadidx1_0(v *Value) bool { - // match: (MOVSDloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) - // result: (MOVSDloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) +func rewriteValue386_Op386MOVWstoreconstidx2_0(v *Value) bool { + b := v.Block + // match: (MOVWstoreconstidx2 [x] {sym} (ADDLconst [c] ptr) idx mem) + // result: (MOVWstoreconstidx2 [ValAndOff(x).add(c)] {sym} ptr idx mem) for { - c := v.AuxInt + x := v.AuxInt sym := v.Aux mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break } - d := v_0.AuxInt + c := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - v.reset(Op386MOVSDloadidx1) - v.AuxInt = int64(int32(c + d)) + v.reset(Op386MOVWstoreconstidx2) + v.AuxInt = ValAndOff(x).add(c) v.Aux = sym v.AddArg(ptr) v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVSDloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) - // result: (MOVSDloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) + // match: (MOVWstoreconstidx2 [x] {sym} ptr (ADDLconst [c] idx) mem) + // result: (MOVWstoreconstidx2 [ValAndOff(x).add(2*c)] {sym} ptr idx mem) for { - c := v.AuxInt + x := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] @@ -8562,230 +8968,211 @@ func rewriteValue386_Op386MOVSDloadidx1_0(v *Value) bool { if v_1.Op != Op386ADDLconst { break } - d := v_1.AuxInt + c := v_1.AuxInt idx := v_1.Args[0] - v.reset(Op386MOVSDloadidx1) - v.AuxInt = int64(int32(c + d)) + v.reset(Op386MOVWstoreconstidx2) + v.AuxInt = ValAndOff(x).add(2 * c) v.Aux = sym v.AddArg(ptr) v.AddArg(idx) v.AddArg(mem) return true } - return false -} -func rewriteValue386_Op386MOVSDloadidx8_0(v *Value) bool { - // match: (MOVSDloadidx8 [c] {sym} (ADDLconst [d] ptr) idx mem) - // result: (MOVSDloadidx8 [int64(int32(c+d))] {sym} ptr idx mem) + // match: (MOVWstoreconstidx2 [c] {s} p i x:(MOVWstoreconstidx2 [a] {s} p i mem)) + // cond: x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) + // result: (MOVLstoreconstidx1 [makeValAndOff(ValAndOff(a).Val()&0xffff | ValAndOff(c).Val()<<16, ValAndOff(a).Off())] {s} p (SHLLconst [1] i) mem) for { c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { + s := v.Aux + _ = v.Args[2] + p := v.Args[0] + i := v.Args[1] + x := v.Args[2] + if x.Op != Op386MOVWstoreconstidx2 { break } - d := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - v.reset(Op386MOVSDloadidx8) - v.AuxInt = int64(int32(c + d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVSDloadidx8 [c] {sym} ptr (ADDLconst [d] idx) mem) - // result: (MOVSDloadidx8 [int64(int32(c+8*d))] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { + a := x.AuxInt + if x.Aux != s { break } - d := v_1.AuxInt - idx := v_1.Args[0] - v.reset(Op386MOVSDloadidx8) - v.AuxInt = int64(int32(c + 8*d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) + mem := x.Args[2] + if p != x.Args[0] || i != x.Args[1] || !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { + break + } + v.reset(Op386MOVLstoreconstidx1) + v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xffff|ValAndOff(c).Val()<<16, ValAndOff(a).Off()) + v.Aux = s + v.AddArg(p) + v0 := b.NewValue0(v.Pos, Op386SHLLconst, i.Type) + v0.AuxInt = 1 + v0.AddArg(i) + v.AddArg(v0) v.AddArg(mem) return true } return false } -func rewriteValue386_Op386MOVSDstore_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (MOVSDstore [off1] {sym} (ADDLconst [off2] ptr) val mem) - // cond: is32Bit(off1+off2) - // result: (MOVSDstore [off1+off2] {sym} ptr val mem) +func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool { + // match: (MOVWstoreidx1 [c] {sym} ptr (SHLLconst [1] idx) val mem) + // result: (MOVWstoreidx2 [c] {sym} ptr idx val mem) for { - off1 := v.AuxInt + c := v.AuxInt sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { - break - } - off2 := v_0.AuxInt - ptr := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1 + off2)) { - break - } - v.reset(Op386MOVSDstore) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(ptr) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVSDstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVSDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) - for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL { - break - } - off2 := v_0.AuxInt - sym2 := v_0.Aux - base := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { - break + mem := v.Args[3] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386SHLLconst || v_1.AuxInt != 1 { + continue + } + idx := v_1.Args[0] + val := v.Args[2] + v.reset(Op386MOVWstoreidx2) + v.AuxInt = c + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true } - v.reset(Op386MOVSDstore) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(base) - v.AddArg(val) - v.AddArg(mem) - return true + break } - // match: (MOVSDstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVSDstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) + // match: (MOVWstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) + // result: (MOVWstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL1 { - break - } - off2 := v_0.AuxInt - sym2 := v_0.Aux - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { - break + c := v.AuxInt + sym := v.Aux + mem := v.Args[3] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != Op386ADDLconst { + continue + } + d := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1^_i0] + val := v.Args[2] + v.reset(Op386MOVWstoreidx1) + v.AuxInt = int64(int32(c + d)) + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true } - v.reset(Op386MOVSDstoreidx1) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true + break } - // match: (MOVSDstore [off1] {sym1} (LEAL8 [off2] {sym2} ptr idx) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVSDstoreidx8 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) + // match: (MOVWstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) + // result: (MOVWstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL8 { - break - } - off2 := v_0.AuxInt - sym2 := v_0.Aux - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { - break + c := v.AuxInt + sym := v.Aux + mem := v.Args[3] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386ADDLconst { + continue + } + d := v_1.AuxInt + idx := v_1.Args[0] + val := v.Args[2] + v.reset(Op386MOVWstoreidx1) + v.AuxInt = int64(int32(c + d)) + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true } - v.reset(Op386MOVSDstoreidx8) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true + break } - // match: (MOVSDstore [off] {sym} (ADDL ptr idx) val mem) - // cond: ptr.Op != OpSB - // result: (MOVSDstoreidx1 [off] {sym} ptr idx val mem) + // match: (MOVWstoreidx1 [i] {s} p idx (SHRLconst [16] w) x:(MOVWstoreidx1 [i-2] {s} p idx w mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVLstoreidx1 [i-2] {s} p idx w mem) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386ADDL { - break - } - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { - break + i := v.AuxInt + s := v.Aux + _ = v.Args[3] + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + idx := v.Args[1^_i0] + v_2 := v.Args[2] + if v_2.Op != Op386SHRLconst || v_2.AuxInt != 16 { + continue + } + w := v_2.Args[0] + x := v.Args[3] + if x.Op != Op386MOVWstoreidx1 || x.AuxInt != i-2 || x.Aux != s { + continue + } + mem := x.Args[3] + for _i1 := 0; _i1 <= 1; _i1++ { + if p != x.Args[_i1] || idx != x.Args[1^_i1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + continue + } + v.reset(Op386MOVLstoreidx1) + v.AuxInt = i - 2 + v.Aux = s + v.AddArg(p) + v.AddArg(idx) + v.AddArg(w) + v.AddArg(mem) + return true + } } - v.reset(Op386MOVSDstoreidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true + break } - // match: (MOVSDstore [off] {sym} (ADDL idx ptr) val mem) - // cond: ptr.Op != OpSB - // result: (MOVSDstoreidx1 [off] {sym} ptr idx val mem) + // match: (MOVWstoreidx1 [i] {s} p idx (SHRLconst [j] w) x:(MOVWstoreidx1 [i-2] {s} p idx w0:(SHRLconst [j-16] w) mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVLstoreidx1 [i-2] {s} p idx w0 mem) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386ADDL { - break - } - ptr := v_0.Args[1] - idx := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { - break + i := v.AuxInt + s := v.Aux + _ = v.Args[3] + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + idx := v.Args[1^_i0] + v_2 := v.Args[2] + if v_2.Op != Op386SHRLconst { + continue + } + j := v_2.AuxInt + w := v_2.Args[0] + x := v.Args[3] + if x.Op != Op386MOVWstoreidx1 || x.AuxInt != i-2 || x.Aux != s { + continue + } + mem := x.Args[3] + for _i1 := 0; _i1 <= 1; _i1++ { + if p != x.Args[_i1] || idx != x.Args[1^_i1] { + continue + } + w0 := x.Args[2] + if w0.Op != Op386SHRLconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + continue + } + v.reset(Op386MOVLstoreidx1) + v.AuxInt = i - 2 + v.Aux = s + v.AddArg(p) + v.AddArg(idx) + v.AddArg(w0) + v.AddArg(mem) + return true + } } - v.reset(Op386MOVSDstoreidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true + break } return false } -func rewriteValue386_Op386MOVSDstoreidx1_0(v *Value) bool { - // match: (MOVSDstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) - // result: (MOVSDstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) +func rewriteValue386_Op386MOVWstoreidx2_0(v *Value) bool { + b := v.Block + // match: (MOVWstoreidx2 [c] {sym} (ADDLconst [d] ptr) idx val mem) + // result: (MOVWstoreidx2 [int64(int32(c+d))] {sym} ptr idx val mem) for { c := v.AuxInt sym := v.Aux @@ -8798,7 +9185,7 @@ func rewriteValue386_Op386MOVSDstoreidx1_0(v *Value) bool { ptr := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - v.reset(Op386MOVSDstoreidx1) + v.reset(Op386MOVWstoreidx2) v.AuxInt = int64(int32(c + d)) v.Aux = sym v.AddArg(ptr) @@ -8807,8 +9194,8 @@ func rewriteValue386_Op386MOVSDstoreidx1_0(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVSDstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) - // result: (MOVSDstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) + // match: (MOVWstoreidx2 [c] {sym} ptr (ADDLconst [d] idx) val mem) + // result: (MOVWstoreidx2 [int64(int32(c+2*d))] {sym} ptr idx val mem) for { c := v.AuxInt sym := v.Aux @@ -8821,8 +9208,8 @@ func rewriteValue386_Op386MOVSDstoreidx1_0(v *Value) bool { d := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - v.reset(Op386MOVSDstoreidx1) - v.AuxInt = int64(int32(c + d)) + v.reset(Op386MOVWstoreidx2) + v.AuxInt = int64(int32(c + 2*d)) v.Aux = sym v.AddArg(ptr) v.AddArg(idx) @@ -8830,6293 +9217,1423 @@ func rewriteValue386_Op386MOVSDstoreidx1_0(v *Value) bool { v.AddArg(mem) return true } - return false -} -func rewriteValue386_Op386MOVSDstoreidx8_0(v *Value) bool { - // match: (MOVSDstoreidx8 [c] {sym} (ADDLconst [d] ptr) idx val mem) - // result: (MOVSDstoreidx8 [int64(int32(c+d))] {sym} ptr idx val mem) + // match: (MOVWstoreidx2 [i] {s} p idx (SHRLconst [16] w) x:(MOVWstoreidx2 [i-2] {s} p idx w mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVLstoreidx1 [i-2] {s} p (SHLLconst [1] idx) w mem) for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[3] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { + i := v.AuxInt + s := v.Aux + _ = v.Args[3] + p := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != Op386SHRLconst || v_2.AuxInt != 16 { break } - d := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - val := v.Args[2] - v.reset(Op386MOVSDstoreidx8) - v.AuxInt = int64(int32(c + d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) + w := v_2.Args[0] + x := v.Args[3] + if x.Op != Op386MOVWstoreidx2 || x.AuxInt != i-2 || x.Aux != s { + break + } + mem := x.Args[3] + if p != x.Args[0] || idx != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + break + } + v.reset(Op386MOVLstoreidx1) + v.AuxInt = i - 2 + v.Aux = s + v.AddArg(p) + v0 := b.NewValue0(v.Pos, Op386SHLLconst, idx.Type) + v0.AuxInt = 1 + v0.AddArg(idx) + v.AddArg(v0) + v.AddArg(w) v.AddArg(mem) return true } - // match: (MOVSDstoreidx8 [c] {sym} ptr (ADDLconst [d] idx) val mem) - // result: (MOVSDstoreidx8 [int64(int32(c+8*d))] {sym} ptr idx val mem) + // match: (MOVWstoreidx2 [i] {s} p idx (SHRLconst [j] w) x:(MOVWstoreidx2 [i-2] {s} p idx w0:(SHRLconst [j-16] w) mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVLstoreidx1 [i-2] {s} p (SHLLconst [1] idx) w0 mem) for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[3] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { - break - } - d := v_1.AuxInt - idx := v_1.Args[0] - val := v.Args[2] - v.reset(Op386MOVSDstoreidx8) - v.AuxInt = int64(int32(c + 8*d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) + i := v.AuxInt + s := v.Aux + _ = v.Args[3] + p := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != Op386SHRLconst { + break + } + j := v_2.AuxInt + w := v_2.Args[0] + x := v.Args[3] + if x.Op != Op386MOVWstoreidx2 || x.AuxInt != i-2 || x.Aux != s { + break + } + mem := x.Args[3] + if p != x.Args[0] || idx != x.Args[1] { + break + } + w0 := x.Args[2] + if w0.Op != Op386SHRLconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + break + } + v.reset(Op386MOVLstoreidx1) + v.AuxInt = i - 2 + v.Aux = s + v.AddArg(p) + v0 := b.NewValue0(v.Pos, Op386SHLLconst, idx.Type) + v0.AuxInt = 1 + v0.AddArg(idx) + v.AddArg(v0) + v.AddArg(w0) v.AddArg(mem) return true } return false } -func rewriteValue386_Op386MOVSSconst_0(v *Value) bool { - b := v.Block - config := b.Func.Config - typ := &b.Func.Config.Types - // match: (MOVSSconst [c]) - // cond: config.ctxt.Flag_shared - // result: (MOVSSconst2 (MOVSSconst1 [c])) +func rewriteValue386_Op386MULL_0(v *Value) bool { + // match: (MULL x (MOVLconst [c])) + // result: (MULLconst [c] x) for { - c := v.AuxInt - if !(config.ctxt.Flag_shared) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386MOVLconst { + continue + } + c := v_1.AuxInt + v.reset(Op386MULLconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(Op386MOVSSconst2) - v0 := b.NewValue0(v.Pos, Op386MOVSSconst1, typ.UInt32) - v0.AuxInt = c - v.AddArg(v0) - return true + break + } + // match: (MULL x l:(MOVLload [off] {sym} ptr mem)) + // cond: canMergeLoadClobber(v, l, x) && clobber(l) + // result: (MULLload x [off] {sym} ptr mem) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != Op386MOVLload { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[1] + ptr := l.Args[0] + if !(canMergeLoadClobber(v, l, x) && clobber(l)) { + continue + } + v.reset(Op386MULLload) + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true + } + break + } + // match: (MULL x l:(MOVLloadidx4 [off] {sym} ptr idx mem)) + // cond: canMergeLoadClobber(v, l, x) && clobber(l) + // result: (MULLloadidx4 x [off] {sym} ptr idx mem) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != Op386MOVLloadidx4 { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[2] + ptr := l.Args[0] + idx := l.Args[1] + if !(canMergeLoadClobber(v, l, x) && clobber(l)) { + continue + } + v.reset(Op386MULLloadidx4) + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + break } return false } -func rewriteValue386_Op386MOVSSload_0(v *Value) bool { +func rewriteValue386_Op386MULLconst_0(v *Value) bool { b := v.Block - config := b.Func.Config - // match: (MOVSSload [off1] {sym} (ADDLconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) - // result: (MOVSSload [off1+off2] {sym} ptr mem) + // match: (MULLconst [c] (MULLconst [d] x)) + // result: (MULLconst [int64(int32(c * d))] x) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[1] + c := v.AuxInt v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { - break - } - off2 := v_0.AuxInt - ptr := v_0.Args[0] - if !(is32Bit(off1 + off2)) { + if v_0.Op != Op386MULLconst { break } - v.reset(Op386MOVSSload) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(ptr) - v.AddArg(mem) + d := v_0.AuxInt + x := v_0.Args[0] + v.reset(Op386MULLconst) + v.AuxInt = int64(int32(c * d)) + v.AddArg(x) return true } - // match: (MOVSSload [off1] {sym1} (LEAL [off2] {sym2} base) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVSSload [off1+off2] {mergeSym(sym1,sym2)} base mem) + // match: (MULLconst [-9] x) + // result: (NEGL (LEAL8 x x)) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL { - break - } - off2 := v_0.AuxInt - sym2 := v_0.Aux - base := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { + if v.AuxInt != -9 { break } - v.reset(Op386MOVSSload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(base) - v.AddArg(mem) + x := v.Args[0] + v.reset(Op386NEGL) + v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (MOVSSload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVSSloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) + // match: (MULLconst [-5] x) + // result: (NEGL (LEAL4 x x)) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL1 { - break - } - off2 := v_0.AuxInt - sym2 := v_0.Aux - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + if v.AuxInt != -5 { break } - v.reset(Op386MOVSSloadidx1) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + x := v.Args[0] + v.reset(Op386NEGL) + v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (MOVSSload [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVSSloadidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) + // match: (MULLconst [-3] x) + // result: (NEGL (LEAL2 x x)) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL4 { - break - } - off2 := v_0.AuxInt - sym2 := v_0.Aux - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + if v.AuxInt != -3 { break } - v.reset(Op386MOVSSloadidx4) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + x := v.Args[0] + v.reset(Op386NEGL) + v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (MOVSSload [off] {sym} (ADDL ptr idx) mem) - // cond: ptr.Op != OpSB - // result: (MOVSSloadidx1 [off] {sym} ptr idx mem) + // match: (MULLconst [-1] x) + // result: (NEGL x) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386ADDL { + if v.AuxInt != -1 { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(ptr.Op != OpSB) { + x := v.Args[0] + v.reset(Op386NEGL) + v.AddArg(x) + return true + } + // match: (MULLconst [0] _) + // result: (MOVLconst [0]) + for { + if v.AuxInt != 0 { break } - v.reset(Op386MOVSSloadidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + v.reset(Op386MOVLconst) + v.AuxInt = 0 return true } - // match: (MOVSSload [off] {sym} (ADDL idx ptr) mem) - // cond: ptr.Op != OpSB - // result: (MOVSSloadidx1 [off] {sym} ptr idx mem) + // match: (MULLconst [1] x) + // result: x for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386ADDL { + if v.AuxInt != 1 { break } - ptr := v_0.Args[1] - idx := v_0.Args[0] - if !(ptr.Op != OpSB) { + x := v.Args[0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + // match: (MULLconst [3] x) + // result: (LEAL2 x x) + for { + if v.AuxInt != 3 { break } - v.reset(Op386MOVSSloadidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + x := v.Args[0] + v.reset(Op386LEAL2) + v.AddArg(x) + v.AddArg(x) return true } - return false -} -func rewriteValue386_Op386MOVSSloadidx1_0(v *Value) bool { - // match: (MOVSSloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) - // result: (MOVSSloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) + // match: (MULLconst [5] x) + // result: (LEAL4 x x) for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { + if v.AuxInt != 5 { break } - d := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - v.reset(Op386MOVSSloadidx1) - v.AuxInt = int64(int32(c + d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + x := v.Args[0] + v.reset(Op386LEAL4) + v.AddArg(x) + v.AddArg(x) return true } - // match: (MOVSSloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) - // result: (MOVSSloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) + // match: (MULLconst [7] x) + // result: (LEAL2 x (LEAL2 x x)) for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { + if v.AuxInt != 7 { break } - d := v_1.AuxInt - idx := v_1.Args[0] - v.reset(Op386MOVSSloadidx1) - v.AuxInt = int64(int32(c + d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + x := v.Args[0] + v.reset(Op386LEAL2) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } return false } -func rewriteValue386_Op386MOVSSloadidx4_0(v *Value) bool { - // match: (MOVSSloadidx4 [c] {sym} (ADDLconst [d] ptr) idx mem) - // result: (MOVSSloadidx4 [int64(int32(c+d))] {sym} ptr idx mem) +func rewriteValue386_Op386MULLconst_10(v *Value) bool { + b := v.Block + // match: (MULLconst [9] x) + // result: (LEAL8 x x) for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { + if v.AuxInt != 9 { break } - d := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - v.reset(Op386MOVSSloadidx4) - v.AuxInt = int64(int32(c + d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + x := v.Args[0] + v.reset(Op386LEAL8) + v.AddArg(x) + v.AddArg(x) return true } - // match: (MOVSSloadidx4 [c] {sym} ptr (ADDLconst [d] idx) mem) - // result: (MOVSSloadidx4 [int64(int32(c+4*d))] {sym} ptr idx mem) + // match: (MULLconst [11] x) + // result: (LEAL2 x (LEAL4 x x)) for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { + if v.AuxInt != 11 { break } - d := v_1.AuxInt - idx := v_1.Args[0] - v.reset(Op386MOVSSloadidx4) - v.AuxInt = int64(int32(c + 4*d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + x := v.Args[0] + v.reset(Op386LEAL2) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - return false -} -func rewriteValue386_Op386MOVSSstore_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (MOVSSstore [off1] {sym} (ADDLconst [off2] ptr) val mem) - // cond: is32Bit(off1+off2) - // result: (MOVSSstore [off1+off2] {sym} ptr val mem) + // match: (MULLconst [13] x) + // result: (LEAL4 x (LEAL2 x x)) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { + if v.AuxInt != 13 { break } - off2 := v_0.AuxInt - ptr := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1 + off2)) { + x := v.Args[0] + v.reset(Op386LEAL4) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) + return true + } + // match: (MULLconst [19] x) + // result: (LEAL2 x (LEAL8 x x)) + for { + if v.AuxInt != 19 { break } - v.reset(Op386MOVSSstore) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(ptr) - v.AddArg(val) - v.AddArg(mem) + x := v.Args[0] + v.reset(Op386LEAL2) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (MOVSSstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVSSstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) + // match: (MULLconst [21] x) + // result: (LEAL4 x (LEAL4 x x)) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL { + if v.AuxInt != 21 { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - base := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { + x := v.Args[0] + v.reset(Op386LEAL4) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) + return true + } + // match: (MULLconst [25] x) + // result: (LEAL8 x (LEAL2 x x)) + for { + if v.AuxInt != 25 { break } - v.reset(Op386MOVSSstore) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(base) - v.AddArg(val) - v.AddArg(mem) + x := v.Args[0] + v.reset(Op386LEAL8) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (MOVSSstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVSSstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) + // match: (MULLconst [27] x) + // result: (LEAL8 (LEAL2 x x) (LEAL2 x x)) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL1 { + if v.AuxInt != 27 { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + x := v.Args[0] + v.reset(Op386LEAL8) + v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) + v1.AddArg(x) + v1.AddArg(x) + v.AddArg(v1) + return true + } + // match: (MULLconst [37] x) + // result: (LEAL4 x (LEAL8 x x)) + for { + if v.AuxInt != 37 { break } - v.reset(Op386MOVSSstoreidx1) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) + x := v.Args[0] + v.reset(Op386LEAL4) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (MOVSSstore [off1] {sym1} (LEAL4 [off2] {sym2} ptr idx) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVSSstoreidx4 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) + // match: (MULLconst [41] x) + // result: (LEAL8 x (LEAL4 x x)) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL4 { + if v.AuxInt != 41 { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { - break - } - v.reset(Op386MOVSSstoreidx4) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) + x := v.Args[0] + v.reset(Op386LEAL8) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (MOVSSstore [off] {sym} (ADDL ptr idx) val mem) - // cond: ptr.Op != OpSB - // result: (MOVSSstoreidx1 [off] {sym} ptr idx val mem) + // match: (MULLconst [45] x) + // result: (LEAL8 (LEAL4 x x) (LEAL4 x x)) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386ADDL { - break - } - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { + if v.AuxInt != 45 { break } - v.reset(Op386MOVSSstoreidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) + x := v.Args[0] + v.reset(Op386LEAL8) + v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) + v1.AddArg(x) + v1.AddArg(x) + v.AddArg(v1) return true } - // match: (MOVSSstore [off] {sym} (ADDL idx ptr) val mem) - // cond: ptr.Op != OpSB - // result: (MOVSSstoreidx1 [off] {sym} ptr idx val mem) + return false +} +func rewriteValue386_Op386MULLconst_20(v *Value) bool { + b := v.Block + // match: (MULLconst [73] x) + // result: (LEAL8 x (LEAL8 x x)) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386ADDL { - break - } - ptr := v_0.Args[1] - idx := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { + if v.AuxInt != 73 { break } - v.reset(Op386MOVSSstoreidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) + x := v.Args[0] + v.reset(Op386LEAL8) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - return false -} -func rewriteValue386_Op386MOVSSstoreidx1_0(v *Value) bool { - // match: (MOVSSstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) - // result: (MOVSSstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) + // match: (MULLconst [81] x) + // result: (LEAL8 (LEAL8 x x) (LEAL8 x x)) for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[3] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { + if v.AuxInt != 81 { break } - d := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - val := v.Args[2] - v.reset(Op386MOVSSstoreidx1) - v.AuxInt = int64(int32(c + d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) + x := v.Args[0] + v.reset(Op386LEAL8) + v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) + v1.AddArg(x) + v1.AddArg(x) + v.AddArg(v1) return true } - // match: (MOVSSstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) - // result: (MOVSSstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) + // match: (MULLconst [c] x) + // cond: isPowerOfTwo(c+1) && c >= 15 + // result: (SUBL (SHLLconst [log2(c+1)] x) x) for { c := v.AuxInt - sym := v.Aux - mem := v.Args[3] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { + x := v.Args[0] + if !(isPowerOfTwo(c+1) && c >= 15) { break } - d := v_1.AuxInt - idx := v_1.Args[0] - val := v.Args[2] - v.reset(Op386MOVSSstoreidx1) - v.AuxInt = int64(int32(c + d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) + v.reset(Op386SUBL) + v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) + v0.AuxInt = log2(c + 1) + v0.AddArg(x) + v.AddArg(v0) + v.AddArg(x) return true } - return false -} -func rewriteValue386_Op386MOVSSstoreidx4_0(v *Value) bool { - // match: (MOVSSstoreidx4 [c] {sym} (ADDLconst [d] ptr) idx val mem) - // result: (MOVSSstoreidx4 [int64(int32(c+d))] {sym} ptr idx val mem) + // match: (MULLconst [c] x) + // cond: isPowerOfTwo(c-1) && c >= 17 + // result: (LEAL1 (SHLLconst [log2(c-1)] x) x) for { c := v.AuxInt - sym := v.Aux - mem := v.Args[3] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { + x := v.Args[0] + if !(isPowerOfTwo(c-1) && c >= 17) { break } - d := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - val := v.Args[2] - v.reset(Op386MOVSSstoreidx4) - v.AuxInt = int64(int32(c + d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) + v.reset(Op386LEAL1) + v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) + v0.AuxInt = log2(c - 1) + v0.AddArg(x) + v.AddArg(v0) + v.AddArg(x) return true } - // match: (MOVSSstoreidx4 [c] {sym} ptr (ADDLconst [d] idx) val mem) - // result: (MOVSSstoreidx4 [int64(int32(c+4*d))] {sym} ptr idx val mem) + // match: (MULLconst [c] x) + // cond: isPowerOfTwo(c-2) && c >= 34 + // result: (LEAL2 (SHLLconst [log2(c-2)] x) x) for { c := v.AuxInt - sym := v.Aux - mem := v.Args[3] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { + x := v.Args[0] + if !(isPowerOfTwo(c-2) && c >= 34) { break } - d := v_1.AuxInt - idx := v_1.Args[0] - val := v.Args[2] - v.reset(Op386MOVSSstoreidx4) - v.AuxInt = int64(int32(c + 4*d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) + v.reset(Op386LEAL2) + v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) + v0.AuxInt = log2(c - 2) + v0.AddArg(x) + v.AddArg(v0) + v.AddArg(x) return true } - return false -} -func rewriteValue386_Op386MOVWLSX_0(v *Value) bool { - b := v.Block - // match: (MOVWLSX x:(MOVWload [off] {sym} ptr mem)) - // cond: x.Uses == 1 && clobber(x) - // result: @x.Block (MOVWLSXload [off] {sym} ptr mem) + // match: (MULLconst [c] x) + // cond: isPowerOfTwo(c-4) && c >= 68 + // result: (LEAL4 (SHLLconst [log2(c-4)] x) x) for { + c := v.AuxInt x := v.Args[0] - if x.Op != Op386MOVWload { - break - } - off := x.AuxInt - sym := x.Aux - mem := x.Args[1] - ptr := x.Args[0] - if !(x.Uses == 1 && clobber(x)) { + if !(isPowerOfTwo(c-4) && c >= 68) { break } - b = x.Block - v0 := b.NewValue0(x.Pos, Op386MOVWLSXload, v.Type) - v.reset(OpCopy) + v.reset(Op386LEAL4) + v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) + v0.AuxInt = log2(c - 4) + v0.AddArg(x) v.AddArg(v0) - v0.AuxInt = off - v0.Aux = sym - v0.AddArg(ptr) - v0.AddArg(mem) + v.AddArg(x) return true } - // match: (MOVWLSX (ANDLconst [c] x)) - // cond: c & 0x8000 == 0 - // result: (ANDLconst [c & 0x7fff] x) + // match: (MULLconst [c] x) + // cond: isPowerOfTwo(c-8) && c >= 136 + // result: (LEAL8 (SHLLconst [log2(c-8)] x) x) for { - v_0 := v.Args[0] - if v_0.Op != Op386ANDLconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - if !(c&0x8000 == 0) { + c := v.AuxInt + x := v.Args[0] + if !(isPowerOfTwo(c-8) && c >= 136) { break } - v.reset(Op386ANDLconst) - v.AuxInt = c & 0x7fff + v.reset(Op386LEAL8) + v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) + v0.AuxInt = log2(c - 8) + v0.AddArg(x) + v.AddArg(v0) v.AddArg(x) return true } - return false -} -func rewriteValue386_Op386MOVWLSXload_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (MOVWLSXload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) - // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) - // result: (MOVWLSX x) - for { - off := v.AuxInt - sym := v.Aux - _ = v.Args[1] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386MOVWstore { - break - } - off2 := v_1.AuxInt - sym2 := v_1.Aux - _ = v_1.Args[2] - ptr2 := v_1.Args[0] - x := v_1.Args[1] - if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { - break - } - v.reset(Op386MOVWLSX) - v.AddArg(x) - return true - } - // match: (MOVWLSXload [off1] {sym1} (LEAL [off2] {sym2} base) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVWLSXload [off1+off2] {mergeSym(sym1,sym2)} base mem) - for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL { - break - } - off2 := v_0.AuxInt - sym2 := v_0.Aux - base := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { - break - } - v.reset(Op386MOVWLSXload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(base) - v.AddArg(mem) - return true - } - return false -} -func rewriteValue386_Op386MOVWLZX_0(v *Value) bool { - b := v.Block - // match: (MOVWLZX x:(MOVWload [off] {sym} ptr mem)) - // cond: x.Uses == 1 && clobber(x) - // result: @x.Block (MOVWload [off] {sym} ptr mem) + // match: (MULLconst [c] x) + // cond: c%3 == 0 && isPowerOfTwo(c/3) + // result: (SHLLconst [log2(c/3)] (LEAL2 x x)) for { + c := v.AuxInt x := v.Args[0] - if x.Op != Op386MOVWload { - break - } - off := x.AuxInt - sym := x.Aux - mem := x.Args[1] - ptr := x.Args[0] - if !(x.Uses == 1 && clobber(x)) { + if !(c%3 == 0 && isPowerOfTwo(c/3)) { break } - b = x.Block - v0 := b.NewValue0(x.Pos, Op386MOVWload, v.Type) - v.reset(OpCopy) + v.reset(Op386SHLLconst) + v.AuxInt = log2(c / 3) + v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) + v0.AddArg(x) + v0.AddArg(x) v.AddArg(v0) - v0.AuxInt = off - v0.Aux = sym - v0.AddArg(ptr) - v0.AddArg(mem) return true } - // match: (MOVWLZX x:(MOVWloadidx1 [off] {sym} ptr idx mem)) - // cond: x.Uses == 1 && clobber(x) - // result: @x.Block (MOVWloadidx1 [off] {sym} ptr idx mem) + // match: (MULLconst [c] x) + // cond: c%5 == 0 && isPowerOfTwo(c/5) + // result: (SHLLconst [log2(c/5)] (LEAL4 x x)) for { + c := v.AuxInt x := v.Args[0] - if x.Op != Op386MOVWloadidx1 { - break - } - off := x.AuxInt - sym := x.Aux - mem := x.Args[2] - ptr := x.Args[0] - idx := x.Args[1] - if !(x.Uses == 1 && clobber(x)) { + if !(c%5 == 0 && isPowerOfTwo(c/5)) { break } - b = x.Block - v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) - v.reset(OpCopy) + v.reset(Op386SHLLconst) + v.AuxInt = log2(c / 5) + v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) + v0.AddArg(x) + v0.AddArg(x) v.AddArg(v0) - v0.AuxInt = off - v0.Aux = sym - v0.AddArg(ptr) - v0.AddArg(idx) - v0.AddArg(mem) return true } - // match: (MOVWLZX x:(MOVWloadidx2 [off] {sym} ptr idx mem)) - // cond: x.Uses == 1 && clobber(x) - // result: @x.Block (MOVWloadidx2 [off] {sym} ptr idx mem) + // match: (MULLconst [c] x) + // cond: c%9 == 0 && isPowerOfTwo(c/9) + // result: (SHLLconst [log2(c/9)] (LEAL8 x x)) for { + c := v.AuxInt x := v.Args[0] - if x.Op != Op386MOVWloadidx2 { - break - } - off := x.AuxInt - sym := x.Aux - mem := x.Args[2] - ptr := x.Args[0] - idx := x.Args[1] - if !(x.Uses == 1 && clobber(x)) { + if !(c%9 == 0 && isPowerOfTwo(c/9)) { break } - b = x.Block - v0 := b.NewValue0(v.Pos, Op386MOVWloadidx2, v.Type) - v.reset(OpCopy) + v.reset(Op386SHLLconst) + v.AuxInt = log2(c / 9) + v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) + v0.AddArg(x) + v0.AddArg(x) v.AddArg(v0) - v0.AuxInt = off - v0.Aux = sym - v0.AddArg(ptr) - v0.AddArg(idx) - v0.AddArg(mem) return true } - // match: (MOVWLZX (ANDLconst [c] x)) - // result: (ANDLconst [c & 0xffff] x) + return false +} +func rewriteValue386_Op386MULLconst_30(v *Value) bool { + // match: (MULLconst [c] (MOVLconst [d])) + // result: (MOVLconst [int64(int32(c*d))]) for { + c := v.AuxInt v_0 := v.Args[0] - if v_0.Op != Op386ANDLconst { + if v_0.Op != Op386MOVLconst { break } - c := v_0.AuxInt - x := v_0.Args[0] - v.reset(Op386ANDLconst) - v.AuxInt = c & 0xffff - v.AddArg(x) + d := v_0.AuxInt + v.reset(Op386MOVLconst) + v.AuxInt = int64(int32(c * d)) return true } return false } -func rewriteValue386_Op386MOVWload_0(v *Value) bool { +func rewriteValue386_Op386MULLload_0(v *Value) bool { b := v.Block config := b.Func.Config - // match: (MOVWload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) - // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) - // result: (MOVWLZX x) - for { - off := v.AuxInt - sym := v.Aux - _ = v.Args[1] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386MOVWstore { - break - } - off2 := v_1.AuxInt - sym2 := v_1.Aux - _ = v_1.Args[2] - ptr2 := v_1.Args[0] - x := v_1.Args[1] - if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { - break - } - v.reset(Op386MOVWLZX) - v.AddArg(x) - return true - } - // match: (MOVWload [off1] {sym} (ADDLconst [off2] ptr) mem) + // match: (MULLload [off1] {sym} val (ADDLconst [off2] base) mem) // cond: is32Bit(off1+off2) - // result: (MOVWload [off1+off2] {sym} ptr mem) + // result: (MULLload [off1+off2] {sym} val base mem) for { off1 := v.AuxInt sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { + mem := v.Args[2] + val := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386ADDLconst { break } - off2 := v_0.AuxInt - ptr := v_0.Args[0] + off2 := v_1.AuxInt + base := v_1.Args[0] if !(is32Bit(off1 + off2)) { break } - v.reset(Op386MOVWload) + v.reset(Op386MULLload) v.AuxInt = off1 + off2 v.Aux = sym - v.AddArg(ptr) + v.AddArg(val) + v.AddArg(base) v.AddArg(mem) return true } - // match: (MOVWload [off1] {sym1} (LEAL [off2] {sym2} base) mem) + // match: (MULLload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} base mem) + // result: (MULLload [off1+off2] {mergeSym(sym1,sym2)} val base mem) for { off1 := v.AuxInt sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL { + mem := v.Args[2] + val := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386LEAL { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - base := v_0.Args[0] + off2 := v_1.AuxInt + sym2 := v_1.Aux + base := v_1.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(Op386MOVWload) + v.reset(Op386MULLload) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) + v.AddArg(val) v.AddArg(base) v.AddArg(mem) return true } - // match: (MOVWload [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) mem) + // match: (MULLload [off1] {sym1} val (LEAL4 [off2] {sym2} ptr idx) mem) // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVWloadidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) + // result: (MULLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} val ptr idx mem) for { off1 := v.AuxInt sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL1 { + mem := v.Args[2] + val := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386LEAL4 { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - idx := v_0.Args[1] - ptr := v_0.Args[0] + off2 := v_1.AuxInt + sym2 := v_1.Aux + idx := v_1.Args[1] + ptr := v_1.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(Op386MOVWloadidx1) + v.reset(Op386MULLloadidx4) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) + v.AddArg(val) v.AddArg(ptr) v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVWload [off1] {sym1} (LEAL2 [off2] {sym2} ptr idx) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVWloadidx2 [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) - for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL2 { + return false +} +func rewriteValue386_Op386MULLloadidx4_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (MULLloadidx4 [off1] {sym} val (ADDLconst [off2] base) idx mem) + // cond: is32Bit(off1+off2) + // result: (MULLloadidx4 [off1+off2] {sym} val base idx mem) + for { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[3] + val := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386ADDLconst { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + off2 := v_1.AuxInt + base := v_1.Args[0] + idx := v.Args[2] + if !(is32Bit(off1 + off2)) { break } - v.reset(Op386MOVWloadidx2) + v.reset(Op386MULLloadidx4) v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) + v.Aux = sym + v.AddArg(val) + v.AddArg(base) v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVWload [off] {sym} (ADDL ptr idx) mem) - // cond: ptr.Op != OpSB - // result: (MOVWloadidx1 [off] {sym} ptr idx mem) + // match: (MULLloadidx4 [off1] {sym} val base (ADDLconst [off2] idx) mem) + // cond: is32Bit(off1+off2*4) + // result: (MULLloadidx4 [off1+off2*4] {sym} val base idx mem) for { - off := v.AuxInt + off1 := v.AuxInt sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386ADDL { + mem := v.Args[3] + val := v.Args[0] + base := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != Op386ADDLconst { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(ptr.Op != OpSB) { + off2 := v_2.AuxInt + idx := v_2.Args[0] + if !(is32Bit(off1 + off2*4)) { break } - v.reset(Op386MOVWloadidx1) - v.AuxInt = off + v.reset(Op386MULLloadidx4) + v.AuxInt = off1 + off2*4 v.Aux = sym - v.AddArg(ptr) + v.AddArg(val) + v.AddArg(base) v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVWload [off] {sym} (ADDL idx ptr) mem) - // cond: ptr.Op != OpSB - // result: (MOVWloadidx1 [off] {sym} ptr idx mem) + // match: (MULLloadidx4 [off1] {sym1} val (LEAL [off2] {sym2} base) idx mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MULLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} val base idx mem) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386ADDL { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[3] + val := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386LEAL { break } - ptr := v_0.Args[1] - idx := v_0.Args[0] - if !(ptr.Op != OpSB) { + off2 := v_1.AuxInt + sym2 := v_1.Aux + base := v_1.Args[0] + idx := v.Args[2] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(Op386MOVWloadidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) + v.reset(Op386MULLloadidx4) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(val) + v.AddArg(base) v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVWload [off] {sym} (SB) _) - // cond: symIsRO(sym) - // result: (MOVLconst [int64(read16(sym, off, config.BigEndian))]) + return false +} +func rewriteValue386_Op386MULSD_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (MULSD x l:(MOVSDload [off] {sym} ptr mem)) + // cond: canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l) + // result: (MULSDload x [off] {sym} ptr mem) for { - off := v.AuxInt - sym := v.Aux _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpSB || !(symIsRO(sym)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != Op386MOVSDload { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[1] + ptr := l.Args[0] + if !(canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l)) { + continue + } + v.reset(Op386MULSDload) + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - v.reset(Op386MOVLconst) - v.AuxInt = int64(read16(sym, off, config.BigEndian)) - return true + break } return false } -func rewriteValue386_Op386MOVWloadidx1_0(v *Value) bool { - // match: (MOVWloadidx1 [c] {sym} ptr (SHLLconst [1] idx) mem) - // result: (MOVWloadidx2 [c] {sym} ptr idx mem) +func rewriteValue386_Op386MULSDload_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (MULSDload [off1] {sym} val (ADDLconst [off2] base) mem) + // cond: is32Bit(off1+off2) + // result: (MULSDload [off1+off2] {sym} val base mem) for { - c := v.AuxInt + off1 := v.AuxInt sym := v.Aux mem := v.Args[2] - ptr := v.Args[0] + val := v.Args[0] v_1 := v.Args[1] - if v_1.Op != Op386SHLLconst || v_1.AuxInt != 1 { + if v_1.Op != Op386ADDLconst { break } - idx := v_1.Args[0] - v.reset(Op386MOVWloadidx2) - v.AuxInt = c + off2 := v_1.AuxInt + base := v_1.Args[0] + if !(is32Bit(off1 + off2)) { + break + } + v.reset(Op386MULSDload) + v.AuxInt = off1 + off2 v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) + v.AddArg(val) + v.AddArg(base) v.AddArg(mem) return true } - // match: (MOVWloadidx1 [c] {sym} (SHLLconst [1] idx) ptr mem) - // result: (MOVWloadidx2 [c] {sym} ptr idx mem) + // match: (MULSDload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MULSDload [off1+off2] {mergeSym(sym1,sym2)} val base mem) for { - c := v.AuxInt - sym := v.Aux + off1 := v.AuxInt + sym1 := v.Aux mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386SHLLconst || v_0.AuxInt != 1 { + val := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != Op386LEAL { break } - idx := v_0.Args[0] - ptr := v.Args[1] - v.reset(Op386MOVWloadidx2) - v.AuxInt = c - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) + off2 := v_1.AuxInt + sym2 := v_1.Aux + base := v_1.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { + break + } + v.reset(Op386MULSDload) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(val) + v.AddArg(base) v.AddArg(mem) return true } - // match: (MOVWloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) - // result: (MOVWloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) + return false +} +func rewriteValue386_Op386MULSS_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (MULSS x l:(MOVSSload [off] {sym} ptr mem)) + // cond: canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l) + // result: (MULSSload x [off] {sym} ptr mem) for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != Op386MOVSSload { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[1] + ptr := l.Args[0] + if !(canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l)) { + continue + } + v.reset(Op386MULSSload) + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - d := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - v.reset(Op386MOVWloadidx1) - v.AuxInt = int64(int32(c + d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } - // match: (MOVWloadidx1 [c] {sym} idx (ADDLconst [d] ptr) mem) - // result: (MOVWloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) + return false +} +func rewriteValue386_Op386MULSSload_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (MULSSload [off1] {sym} val (ADDLconst [off2] base) mem) + // cond: is32Bit(off1+off2) + // result: (MULSSload [off1+off2] {sym} val base mem) for { - c := v.AuxInt + off1 := v.AuxInt sym := v.Aux mem := v.Args[2] - idx := v.Args[0] + val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { break } - d := v_1.AuxInt - ptr := v_1.Args[0] - v.reset(Op386MOVWloadidx1) - v.AuxInt = int64(int32(c + d)) + off2 := v_1.AuxInt + base := v_1.Args[0] + if !(is32Bit(off1 + off2)) { + break + } + v.reset(Op386MULSSload) + v.AuxInt = off1 + off2 v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) + v.AddArg(val) + v.AddArg(base) v.AddArg(mem) return true } - // match: (MOVWloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) - // result: (MOVWloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) + // match: (MULSSload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MULSSload [off1+off2] {mergeSym(sym1,sym2)} val base mem) for { - c := v.AuxInt - sym := v.Aux + off1 := v.AuxInt + sym1 := v.Aux mem := v.Args[2] - ptr := v.Args[0] + val := v.Args[0] v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { + if v_1.Op != Op386LEAL { break } - d := v_1.AuxInt - idx := v_1.Args[0] - v.reset(Op386MOVWloadidx1) - v.AuxInt = int64(int32(c + d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWloadidx1 [c] {sym} (ADDLconst [d] idx) ptr mem) - // result: (MOVWloadidx1 [int64(int32(c+d))] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { + off2 := v_1.AuxInt + sym2 := v_1.Aux + base := v_1.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } - d := v_0.AuxInt - idx := v_0.Args[0] - ptr := v.Args[1] - v.reset(Op386MOVWloadidx1) - v.AuxInt = int64(int32(c + d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) + v.reset(Op386MULSSload) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(val) + v.AddArg(base) v.AddArg(mem) return true } return false } -func rewriteValue386_Op386MOVWloadidx2_0(v *Value) bool { - // match: (MOVWloadidx2 [c] {sym} (ADDLconst [d] ptr) idx mem) - // result: (MOVWloadidx2 [int64(int32(c+d))] {sym} ptr idx mem) +func rewriteValue386_Op386NEGL_0(v *Value) bool { + // match: (NEGL (MOVLconst [c])) + // result: (MOVLconst [int64(int32(-c))]) for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { + if v_0.Op != Op386MOVLconst { break } - d := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - v.reset(Op386MOVWloadidx2) - v.AuxInt = int64(int32(c + d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + c := v_0.AuxInt + v.reset(Op386MOVLconst) + v.AuxInt = int64(int32(-c)) return true } - // match: (MOVWloadidx2 [c] {sym} ptr (ADDLconst [d] idx) mem) - // result: (MOVWloadidx2 [int64(int32(c+2*d))] {sym} ptr idx mem) + return false +} +func rewriteValue386_Op386NOTL_0(v *Value) bool { + // match: (NOTL (MOVLconst [c])) + // result: (MOVLconst [^c]) for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { + v_0 := v.Args[0] + if v_0.Op != Op386MOVLconst { break } - d := v_1.AuxInt - idx := v_1.Args[0] - v.reset(Op386MOVWloadidx2) - v.AuxInt = int64(int32(c + 2*d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + c := v_0.AuxInt + v.reset(Op386MOVLconst) + v.AuxInt = ^c return true } return false } -func rewriteValue386_Op386MOVWstore_0(v *Value) bool { +func rewriteValue386_Op386ORL_0(v *Value) bool { b := v.Block - config := b.Func.Config - // match: (MOVWstore [off] {sym} ptr (MOVWLSX x) mem) - // result: (MOVWstore [off] {sym} ptr x mem) + typ := &b.Func.Config.Types + // match: (ORL x (MOVLconst [c])) + // result: (ORLconst [c] x) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386MOVWLSX { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386MOVLconst { + continue + } + c := v_1.AuxInt + v.reset(Op386ORLconst) + v.AuxInt = c + v.AddArg(x) + return true } - x := v_1.Args[0] - v.reset(Op386MOVWstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true + break } - // match: (MOVWstore [off] {sym} ptr (MOVWLZX x) mem) - // result: (MOVWstore [off] {sym} ptr x mem) + // match: ( ORL (SHLLconst [c] x) (SHRLconst [d] x)) + // cond: d == 32-c + // result: (ROLLconst [c] x) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386MOVWLZX { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != Op386SHLLconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386SHRLconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(d == 32-c) { + continue + } + v.reset(Op386ROLLconst) + v.AuxInt = c + v.AddArg(x) + return true } - x := v_1.Args[0] - v.reset(Op386MOVWstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true + break } - // match: (MOVWstore [off1] {sym} (ADDLconst [off2] ptr) val mem) - // cond: is32Bit(off1+off2) - // result: (MOVWstore [off1+off2] {sym} ptr val mem) + // match: ( ORL (SHLLconst x [c]) (SHRWconst x [d])) + // cond: c < 16 && d == 16-c && t.Size() == 2 + // result: (ROLWconst x [c]) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { - break - } - off2 := v_0.AuxInt - ptr := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1 + off2)) { - break + t := v.Type + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != Op386SHLLconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386SHRWconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(c < 16 && d == 16-c && t.Size() == 2) { + continue + } + v.reset(Op386ROLWconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(Op386MOVWstore) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(ptr) - v.AddArg(val) - v.AddArg(mem) - return true + break } - // match: (MOVWstore [off] {sym} ptr (MOVLconst [c]) mem) - // cond: validOff(off) - // result: (MOVWstoreconst [makeValAndOff(int64(int16(c)),off)] {sym} ptr mem) + // match: ( ORL (SHLLconst x [c]) (SHRBconst x [d])) + // cond: c < 8 && d == 8-c && t.Size() == 1 + // result: (ROLBconst x [c]) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386MOVLconst { - break - } - c := v_1.AuxInt - if !(validOff(off)) { - break + t := v.Type + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != Op386SHLLconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386SHRBconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(c < 8 && d == 8-c && t.Size() == 1) { + continue + } + v.reset(Op386ROLBconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(Op386MOVWstoreconst) - v.AuxInt = makeValAndOff(int64(int16(c)), off) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(mem) - return true + break } - // match: (MOVWstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) + // match: (ORL x l:(MOVLload [off] {sym} ptr mem)) + // cond: canMergeLoadClobber(v, l, x) && clobber(l) + // result: (ORLload x [off] {sym} ptr mem) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL { - break - } - off2 := v_0.AuxInt - sym2 := v_0.Aux - base := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != Op386MOVLload { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[1] + ptr := l.Args[0] + if !(canMergeLoadClobber(v, l, x) && clobber(l)) { + continue + } + v.reset(Op386ORLload) + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - v.reset(Op386MOVWstore) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(base) - v.AddArg(val) - v.AddArg(mem) - return true + break } - // match: (MOVWstore [off1] {sym1} (LEAL1 [off2] {sym2} ptr idx) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVWstoreidx1 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) + // match: (ORL x l:(MOVLloadidx4 [off] {sym} ptr idx mem)) + // cond: canMergeLoadClobber(v, l, x) && clobber(l) + // result: (ORLloadidx4 x [off] {sym} ptr idx mem) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL1 { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != Op386MOVLloadidx4 { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[2] + ptr := l.Args[0] + idx := l.Args[1] + if !(canMergeLoadClobber(v, l, x) && clobber(l)) { + continue + } + v.reset(Op386ORLloadidx4) + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - off2 := v_0.AuxInt - sym2 := v_0.Aux - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + break + } + // match: (ORL x x) + // result: x + for { + x := v.Args[1] + if x != v.Args[0] { break } - v.reset(Op386MOVWstoreidx1) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (MOVWstore [off1] {sym1} (LEAL2 [off2] {sym2} ptr idx) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVWstoreidx2 [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) - for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL2 { - break - } - off2 := v_0.AuxInt - sym2 := v_0.Aux - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { - break - } - v.reset(Op386MOVWstoreidx2) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstore [off] {sym} (ADDL ptr idx) val mem) - // cond: ptr.Op != OpSB - // result: (MOVWstoreidx1 [off] {sym} ptr idx val mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386ADDL { - break - } - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { - break - } - v.reset(Op386MOVWstoreidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstore [off] {sym} (ADDL idx ptr) val mem) - // cond: ptr.Op != OpSB - // result: (MOVWstoreidx1 [off] {sym} ptr idx val mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386ADDL { - break - } - ptr := v_0.Args[1] - idx := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { - break - } - v.reset(Op386MOVWstoreidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstore [i] {s} p (SHRLconst [16] w) x:(MOVWstore [i-2] {s} p w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVLstore [i-2] {s} p w mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - p := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHRLconst || v_1.AuxInt != 16 { - break - } - w := v_1.Args[0] - x := v.Args[2] - if x.Op != Op386MOVWstore || x.AuxInt != i-2 || x.Aux != s { - break - } - mem := x.Args[2] - if p != x.Args[0] || w != x.Args[1] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(Op386MOVLstore) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(w) - v.AddArg(mem) - return true - } - return false -} -func rewriteValue386_Op386MOVWstore_10(v *Value) bool { - // match: (MOVWstore [i] {s} p (SHRLconst [j] w) x:(MOVWstore [i-2] {s} p w0:(SHRLconst [j-16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVLstore [i-2] {s} p w0 mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - p := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHRLconst { - break - } - j := v_1.AuxInt - w := v_1.Args[0] - x := v.Args[2] - if x.Op != Op386MOVWstore || x.AuxInt != i-2 || x.Aux != s { - break - } - mem := x.Args[2] - if p != x.Args[0] { - break - } - w0 := x.Args[1] - if w0.Op != Op386SHRLconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(Op386MOVLstore) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(w0) - v.AddArg(mem) - return true - } - return false -} -func rewriteValue386_Op386MOVWstoreconst_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (MOVWstoreconst [sc] {s} (ADDLconst [off] ptr) mem) - // cond: ValAndOff(sc).canAdd(off) - // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) - for { - sc := v.AuxInt - s := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { - break - } - off := v_0.AuxInt - ptr := v_0.Args[0] - if !(ValAndOff(sc).canAdd(off)) { - break - } - v.reset(Op386MOVWstoreconst) - v.AuxInt = ValAndOff(sc).add(off) - v.Aux = s - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MOVWstoreconst [sc] {sym1} (LEAL [off] {sym2} ptr) mem) - // cond: canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) - for { - sc := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL { - break - } - off := v_0.AuxInt - sym2 := v_0.Aux - ptr := v_0.Args[0] - if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { - break - } - v.reset(Op386MOVWstoreconst) - v.AuxInt = ValAndOff(sc).add(off) - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MOVWstoreconst [x] {sym1} (LEAL1 [off] {sym2} ptr idx) mem) - // cond: canMergeSym(sym1, sym2) - // result: (MOVWstoreconstidx1 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) - for { - x := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL1 { - break - } - off := v_0.AuxInt - sym2 := v_0.Aux - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(canMergeSym(sym1, sym2)) { - break - } - v.reset(Op386MOVWstoreconstidx1) - v.AuxInt = ValAndOff(x).add(off) - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWstoreconst [x] {sym1} (LEAL2 [off] {sym2} ptr idx) mem) - // cond: canMergeSym(sym1, sym2) - // result: (MOVWstoreconstidx2 [ValAndOff(x).add(off)] {mergeSym(sym1,sym2)} ptr idx mem) - for { - x := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386LEAL2 { - break - } - off := v_0.AuxInt - sym2 := v_0.Aux - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(canMergeSym(sym1, sym2)) { - break - } - v.reset(Op386MOVWstoreconstidx2) - v.AuxInt = ValAndOff(x).add(off) - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWstoreconst [x] {sym} (ADDL ptr idx) mem) - // result: (MOVWstoreconstidx1 [x] {sym} ptr idx mem) - for { - x := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386ADDL { - break - } - idx := v_0.Args[1] - ptr := v_0.Args[0] - v.reset(Op386MOVWstoreconstidx1) - v.AuxInt = x - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWstoreconst [c] {s} p x:(MOVWstoreconst [a] {s} p mem)) - // cond: x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) - // result: (MOVLstoreconst [makeValAndOff(ValAndOff(a).Val()&0xffff | ValAndOff(c).Val()<<16, ValAndOff(a).Off())] {s} p mem) - for { - c := v.AuxInt - s := v.Aux - _ = v.Args[1] - p := v.Args[0] - x := v.Args[1] - if x.Op != Op386MOVWstoreconst { - break - } - a := x.AuxInt - if x.Aux != s { - break - } - mem := x.Args[1] - if p != x.Args[0] || !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { - break - } - v.reset(Op386MOVLstoreconst) - v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xffff|ValAndOff(c).Val()<<16, ValAndOff(a).Off()) - v.Aux = s - v.AddArg(p) - v.AddArg(mem) - return true - } - // match: (MOVWstoreconst [a] {s} p x:(MOVWstoreconst [c] {s} p mem)) - // cond: x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) - // result: (MOVLstoreconst [makeValAndOff(ValAndOff(a).Val()&0xffff | ValAndOff(c).Val()<<16, ValAndOff(a).Off())] {s} p mem) - for { - a := v.AuxInt - s := v.Aux - _ = v.Args[1] - p := v.Args[0] - x := v.Args[1] - if x.Op != Op386MOVWstoreconst { - break - } - c := x.AuxInt - if x.Aux != s { - break - } - mem := x.Args[1] - if p != x.Args[0] || !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { - break - } - v.reset(Op386MOVLstoreconst) - v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xffff|ValAndOff(c).Val()<<16, ValAndOff(a).Off()) - v.Aux = s - v.AddArg(p) - v.AddArg(mem) - return true - } - return false -} -func rewriteValue386_Op386MOVWstoreconstidx1_0(v *Value) bool { - // match: (MOVWstoreconstidx1 [c] {sym} ptr (SHLLconst [1] idx) mem) - // result: (MOVWstoreconstidx2 [c] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHLLconst || v_1.AuxInt != 1 { - break - } - idx := v_1.Args[0] - v.reset(Op386MOVWstoreconstidx2) - v.AuxInt = c - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWstoreconstidx1 [x] {sym} (ADDLconst [c] ptr) idx mem) - // result: (MOVWstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) - for { - x := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { - break - } - c := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - v.reset(Op386MOVWstoreconstidx1) - v.AuxInt = ValAndOff(x).add(c) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWstoreconstidx1 [x] {sym} ptr (ADDLconst [c] idx) mem) - // result: (MOVWstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem) - for { - x := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { - break - } - c := v_1.AuxInt - idx := v_1.Args[0] - v.reset(Op386MOVWstoreconstidx1) - v.AuxInt = ValAndOff(x).add(c) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWstoreconstidx1 [c] {s} p i x:(MOVWstoreconstidx1 [a] {s} p i mem)) - // cond: x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) - // result: (MOVLstoreconstidx1 [makeValAndOff(ValAndOff(a).Val()&0xffff | ValAndOff(c).Val()<<16, ValAndOff(a).Off())] {s} p i mem) - for { - c := v.AuxInt - s := v.Aux - _ = v.Args[2] - p := v.Args[0] - i := v.Args[1] - x := v.Args[2] - if x.Op != Op386MOVWstoreconstidx1 { - break - } - a := x.AuxInt - if x.Aux != s { - break - } - mem := x.Args[2] - if p != x.Args[0] || i != x.Args[1] || !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { - break - } - v.reset(Op386MOVLstoreconstidx1) - v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xffff|ValAndOff(c).Val()<<16, ValAndOff(a).Off()) - v.Aux = s - v.AddArg(p) - v.AddArg(i) - v.AddArg(mem) - return true - } - return false -} -func rewriteValue386_Op386MOVWstoreconstidx2_0(v *Value) bool { - b := v.Block - // match: (MOVWstoreconstidx2 [x] {sym} (ADDLconst [c] ptr) idx mem) - // result: (MOVWstoreconstidx2 [ValAndOff(x).add(c)] {sym} ptr idx mem) - for { - x := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { - break - } - c := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - v.reset(Op386MOVWstoreconstidx2) - v.AuxInt = ValAndOff(x).add(c) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWstoreconstidx2 [x] {sym} ptr (ADDLconst [c] idx) mem) - // result: (MOVWstoreconstidx2 [ValAndOff(x).add(2*c)] {sym} ptr idx mem) - for { - x := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { - break - } - c := v_1.AuxInt - idx := v_1.Args[0] - v.reset(Op386MOVWstoreconstidx2) - v.AuxInt = ValAndOff(x).add(2 * c) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWstoreconstidx2 [c] {s} p i x:(MOVWstoreconstidx2 [a] {s} p i mem)) - // cond: x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) - // result: (MOVLstoreconstidx1 [makeValAndOff(ValAndOff(a).Val()&0xffff | ValAndOff(c).Val()<<16, ValAndOff(a).Off())] {s} p (SHLLconst [1] i) mem) - for { - c := v.AuxInt - s := v.Aux - _ = v.Args[2] - p := v.Args[0] - i := v.Args[1] - x := v.Args[2] - if x.Op != Op386MOVWstoreconstidx2 { - break - } - a := x.AuxInt - if x.Aux != s { - break - } - mem := x.Args[2] - if p != x.Args[0] || i != x.Args[1] || !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { - break - } - v.reset(Op386MOVLstoreconstidx1) - v.AuxInt = makeValAndOff(ValAndOff(a).Val()&0xffff|ValAndOff(c).Val()<<16, ValAndOff(a).Off()) - v.Aux = s - v.AddArg(p) - v0 := b.NewValue0(v.Pos, Op386SHLLconst, i.Type) - v0.AuxInt = 1 - v0.AddArg(i) - v.AddArg(v0) - v.AddArg(mem) - return true - } - return false -} -func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool { - // match: (MOVWstoreidx1 [c] {sym} ptr (SHLLconst [1] idx) val mem) - // result: (MOVWstoreidx2 [c] {sym} ptr idx val mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[3] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHLLconst || v_1.AuxInt != 1 { - break - } - idx := v_1.Args[0] - val := v.Args[2] - v.reset(Op386MOVWstoreidx2) - v.AuxInt = c - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx1 [c] {sym} (SHLLconst [1] idx) ptr val mem) - // result: (MOVWstoreidx2 [c] {sym} ptr idx val mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[3] - v_0 := v.Args[0] - if v_0.Op != Op386SHLLconst || v_0.AuxInt != 1 { - break - } - idx := v_0.Args[0] - ptr := v.Args[1] - val := v.Args[2] - v.reset(Op386MOVWstoreidx2) - v.AuxInt = c - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) - // result: (MOVWstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[3] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { - break - } - d := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - val := v.Args[2] - v.reset(Op386MOVWstoreidx1) - v.AuxInt = int64(int32(c + d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx1 [c] {sym} idx (ADDLconst [d] ptr) val mem) - // result: (MOVWstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[3] - idx := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { - break - } - d := v_1.AuxInt - ptr := v_1.Args[0] - val := v.Args[2] - v.reset(Op386MOVWstoreidx1) - v.AuxInt = int64(int32(c + d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) - // result: (MOVWstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[3] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { - break - } - d := v_1.AuxInt - idx := v_1.Args[0] - val := v.Args[2] - v.reset(Op386MOVWstoreidx1) - v.AuxInt = int64(int32(c + d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx1 [c] {sym} (ADDLconst [d] idx) ptr val mem) - // result: (MOVWstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[3] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { - break - } - d := v_0.AuxInt - idx := v_0.Args[0] - ptr := v.Args[1] - val := v.Args[2] - v.reset(Op386MOVWstoreidx1) - v.AuxInt = int64(int32(c + d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx1 [i] {s} p idx (SHRLconst [16] w) x:(MOVWstoreidx1 [i-2] {s} p idx w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVLstoreidx1 [i-2] {s} p idx w mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != Op386SHRLconst || v_2.AuxInt != 16 { - break - } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != Op386MOVWstoreidx1 || x.AuxInt != i-2 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(Op386MOVLstoreidx1) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx1 [i] {s} p idx (SHRLconst [16] w) x:(MOVWstoreidx1 [i-2] {s} idx p w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVLstoreidx1 [i-2] {s} p idx w mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != Op386SHRLconst || v_2.AuxInt != 16 { - break - } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != Op386MOVWstoreidx1 || x.AuxInt != i-2 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(Op386MOVLstoreidx1) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx1 [i] {s} idx p (SHRLconst [16] w) x:(MOVWstoreidx1 [i-2] {s} p idx w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVLstoreidx1 [i-2] {s} p idx w mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != Op386SHRLconst || v_2.AuxInt != 16 { - break - } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != Op386MOVWstoreidx1 || x.AuxInt != i-2 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(Op386MOVLstoreidx1) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx1 [i] {s} idx p (SHRLconst [16] w) x:(MOVWstoreidx1 [i-2] {s} idx p w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVLstoreidx1 [i-2] {s} p idx w mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != Op386SHRLconst || v_2.AuxInt != 16 { - break - } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != Op386MOVWstoreidx1 || x.AuxInt != i-2 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(Op386MOVLstoreidx1) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) - return true - } - return false -} -func rewriteValue386_Op386MOVWstoreidx1_10(v *Value) bool { - // match: (MOVWstoreidx1 [i] {s} p idx (SHRLconst [j] w) x:(MOVWstoreidx1 [i-2] {s} p idx w0:(SHRLconst [j-16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVLstoreidx1 [i-2] {s} p idx w0 mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != Op386SHRLconst { - break - } - j := v_2.AuxInt - w := v_2.Args[0] - x := v.Args[3] - if x.Op != Op386MOVWstoreidx1 || x.AuxInt != i-2 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { - break - } - w0 := x.Args[2] - if w0.Op != Op386SHRLconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(Op386MOVLstoreidx1) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx1 [i] {s} p idx (SHRLconst [j] w) x:(MOVWstoreidx1 [i-2] {s} idx p w0:(SHRLconst [j-16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVLstoreidx1 [i-2] {s} p idx w0 mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != Op386SHRLconst { - break - } - j := v_2.AuxInt - w := v_2.Args[0] - x := v.Args[3] - if x.Op != Op386MOVWstoreidx1 || x.AuxInt != i-2 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { - break - } - w0 := x.Args[2] - if w0.Op != Op386SHRLconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(Op386MOVLstoreidx1) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx1 [i] {s} idx p (SHRLconst [j] w) x:(MOVWstoreidx1 [i-2] {s} p idx w0:(SHRLconst [j-16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVLstoreidx1 [i-2] {s} p idx w0 mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != Op386SHRLconst { - break - } - j := v_2.AuxInt - w := v_2.Args[0] - x := v.Args[3] - if x.Op != Op386MOVWstoreidx1 || x.AuxInt != i-2 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { - break - } - w0 := x.Args[2] - if w0.Op != Op386SHRLconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(Op386MOVLstoreidx1) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx1 [i] {s} idx p (SHRLconst [j] w) x:(MOVWstoreidx1 [i-2] {s} idx p w0:(SHRLconst [j-16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVLstoreidx1 [i-2] {s} p idx w0 mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != Op386SHRLconst { - break - } - j := v_2.AuxInt - w := v_2.Args[0] - x := v.Args[3] - if x.Op != Op386MOVWstoreidx1 || x.AuxInt != i-2 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { - break - } - w0 := x.Args[2] - if w0.Op != Op386SHRLconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(Op386MOVLstoreidx1) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) - v.AddArg(mem) - return true - } - return false -} -func rewriteValue386_Op386MOVWstoreidx2_0(v *Value) bool { - b := v.Block - // match: (MOVWstoreidx2 [c] {sym} (ADDLconst [d] ptr) idx val mem) - // result: (MOVWstoreidx2 [int64(int32(c+d))] {sym} ptr idx val mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[3] - v_0 := v.Args[0] - if v_0.Op != Op386ADDLconst { - break - } - d := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - val := v.Args[2] - v.reset(Op386MOVWstoreidx2) - v.AuxInt = int64(int32(c + d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx2 [c] {sym} ptr (ADDLconst [d] idx) val mem) - // result: (MOVWstoreidx2 [int64(int32(c+2*d))] {sym} ptr idx val mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[3] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { - break - } - d := v_1.AuxInt - idx := v_1.Args[0] - val := v.Args[2] - v.reset(Op386MOVWstoreidx2) - v.AuxInt = int64(int32(c + 2*d)) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx2 [i] {s} p idx (SHRLconst [16] w) x:(MOVWstoreidx2 [i-2] {s} p idx w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVLstoreidx1 [i-2] {s} p (SHLLconst [1] idx) w mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != Op386SHRLconst || v_2.AuxInt != 16 { - break - } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != Op386MOVWstoreidx2 || x.AuxInt != i-2 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(Op386MOVLstoreidx1) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v0 := b.NewValue0(v.Pos, Op386SHLLconst, idx.Type) - v0.AuxInt = 1 - v0.AddArg(idx) - v.AddArg(v0) - v.AddArg(w) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx2 [i] {s} p idx (SHRLconst [j] w) x:(MOVWstoreidx2 [i-2] {s} p idx w0:(SHRLconst [j-16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVLstoreidx1 [i-2] {s} p (SHLLconst [1] idx) w0 mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != Op386SHRLconst { - break - } - j := v_2.AuxInt - w := v_2.Args[0] - x := v.Args[3] - if x.Op != Op386MOVWstoreidx2 || x.AuxInt != i-2 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { - break - } - w0 := x.Args[2] - if w0.Op != Op386SHRLconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(Op386MOVLstoreidx1) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v0 := b.NewValue0(v.Pos, Op386SHLLconst, idx.Type) - v0.AuxInt = 1 - v0.AddArg(idx) - v.AddArg(v0) - v.AddArg(w0) - v.AddArg(mem) - return true - } - return false -} -func rewriteValue386_Op386MULL_0(v *Value) bool { - // match: (MULL x (MOVLconst [c])) - // result: (MULLconst [c] x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386MOVLconst { - break - } - c := v_1.AuxInt - v.reset(Op386MULLconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (MULL (MOVLconst [c]) x) - // result: (MULLconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386MOVLconst { - break - } - c := v_0.AuxInt - v.reset(Op386MULLconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (MULL x l:(MOVLload [off] {sym} ptr mem)) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (MULLload x [off] {sym} ptr mem) - for { - _ = v.Args[1] - x := v.Args[0] - l := v.Args[1] - if l.Op != Op386MOVLload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break - } - v.reset(Op386MULLload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MULL l:(MOVLload [off] {sym} ptr mem) x) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (MULLload x [off] {sym} ptr mem) - for { - x := v.Args[1] - l := v.Args[0] - if l.Op != Op386MOVLload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break - } - v.reset(Op386MULLload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MULL x l:(MOVLloadidx4 [off] {sym} ptr idx mem)) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (MULLloadidx4 x [off] {sym} ptr idx mem) - for { - _ = v.Args[1] - x := v.Args[0] - l := v.Args[1] - if l.Op != Op386MOVLloadidx4 { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[2] - ptr := l.Args[0] - idx := l.Args[1] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break - } - v.reset(Op386MULLloadidx4) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MULL l:(MOVLloadidx4 [off] {sym} ptr idx mem) x) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (MULLloadidx4 x [off] {sym} ptr idx mem) - for { - x := v.Args[1] - l := v.Args[0] - if l.Op != Op386MOVLloadidx4 { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[2] - ptr := l.Args[0] - idx := l.Args[1] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break - } - v.reset(Op386MULLloadidx4) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - return false -} -func rewriteValue386_Op386MULLconst_0(v *Value) bool { - b := v.Block - // match: (MULLconst [c] (MULLconst [d] x)) - // result: (MULLconst [int64(int32(c * d))] x) - for { - c := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != Op386MULLconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v.reset(Op386MULLconst) - v.AuxInt = int64(int32(c * d)) - v.AddArg(x) - return true - } - // match: (MULLconst [-9] x) - // result: (NEGL (LEAL8 x x)) - for { - if v.AuxInt != -9 { - break - } - x := v.Args[0] - v.reset(Op386NEGL) - v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MULLconst [-5] x) - // result: (NEGL (LEAL4 x x)) - for { - if v.AuxInt != -5 { - break - } - x := v.Args[0] - v.reset(Op386NEGL) - v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MULLconst [-3] x) - // result: (NEGL (LEAL2 x x)) - for { - if v.AuxInt != -3 { - break - } - x := v.Args[0] - v.reset(Op386NEGL) - v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MULLconst [-1] x) - // result: (NEGL x) - for { - if v.AuxInt != -1 { - break - } - x := v.Args[0] - v.reset(Op386NEGL) - v.AddArg(x) - return true - } - // match: (MULLconst [0] _) - // result: (MOVLconst [0]) - for { - if v.AuxInt != 0 { - break - } - v.reset(Op386MOVLconst) - v.AuxInt = 0 - return true - } - // match: (MULLconst [1] x) - // result: x - for { - if v.AuxInt != 1 { - break - } - x := v.Args[0] - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (MULLconst [3] x) - // result: (LEAL2 x x) - for { - if v.AuxInt != 3 { - break - } - x := v.Args[0] - v.reset(Op386LEAL2) - v.AddArg(x) - v.AddArg(x) - return true - } - // match: (MULLconst [5] x) - // result: (LEAL4 x x) - for { - if v.AuxInt != 5 { - break - } - x := v.Args[0] - v.reset(Op386LEAL4) - v.AddArg(x) - v.AddArg(x) - return true - } - // match: (MULLconst [7] x) - // result: (LEAL2 x (LEAL2 x x)) - for { - if v.AuxInt != 7 { - break - } - x := v.Args[0] - v.reset(Op386LEAL2) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - return false -} -func rewriteValue386_Op386MULLconst_10(v *Value) bool { - b := v.Block - // match: (MULLconst [9] x) - // result: (LEAL8 x x) - for { - if v.AuxInt != 9 { - break - } - x := v.Args[0] - v.reset(Op386LEAL8) - v.AddArg(x) - v.AddArg(x) - return true - } - // match: (MULLconst [11] x) - // result: (LEAL2 x (LEAL4 x x)) - for { - if v.AuxInt != 11 { - break - } - x := v.Args[0] - v.reset(Op386LEAL2) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MULLconst [13] x) - // result: (LEAL4 x (LEAL2 x x)) - for { - if v.AuxInt != 13 { - break - } - x := v.Args[0] - v.reset(Op386LEAL4) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MULLconst [19] x) - // result: (LEAL2 x (LEAL8 x x)) - for { - if v.AuxInt != 19 { - break - } - x := v.Args[0] - v.reset(Op386LEAL2) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MULLconst [21] x) - // result: (LEAL4 x (LEAL4 x x)) - for { - if v.AuxInt != 21 { - break - } - x := v.Args[0] - v.reset(Op386LEAL4) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MULLconst [25] x) - // result: (LEAL8 x (LEAL2 x x)) - for { - if v.AuxInt != 25 { - break - } - x := v.Args[0] - v.reset(Op386LEAL8) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MULLconst [27] x) - // result: (LEAL8 (LEAL2 x x) (LEAL2 x x)) - for { - if v.AuxInt != 27 { - break - } - x := v.Args[0] - v.reset(Op386LEAL8) - v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) - v1.AddArg(x) - v1.AddArg(x) - v.AddArg(v1) - return true - } - // match: (MULLconst [37] x) - // result: (LEAL4 x (LEAL8 x x)) - for { - if v.AuxInt != 37 { - break - } - x := v.Args[0] - v.reset(Op386LEAL4) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MULLconst [41] x) - // result: (LEAL8 x (LEAL4 x x)) - for { - if v.AuxInt != 41 { - break - } - x := v.Args[0] - v.reset(Op386LEAL8) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MULLconst [45] x) - // result: (LEAL8 (LEAL4 x x) (LEAL4 x x)) - for { - if v.AuxInt != 45 { - break - } - x := v.Args[0] - v.reset(Op386LEAL8) - v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) - v1.AddArg(x) - v1.AddArg(x) - v.AddArg(v1) - return true - } - return false -} -func rewriteValue386_Op386MULLconst_20(v *Value) bool { - b := v.Block - // match: (MULLconst [73] x) - // result: (LEAL8 x (LEAL8 x x)) - for { - if v.AuxInt != 73 { - break - } - x := v.Args[0] - v.reset(Op386LEAL8) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MULLconst [81] x) - // result: (LEAL8 (LEAL8 x x) (LEAL8 x x)) - for { - if v.AuxInt != 81 { - break - } - x := v.Args[0] - v.reset(Op386LEAL8) - v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) - v1.AddArg(x) - v1.AddArg(x) - v.AddArg(v1) - return true - } - // match: (MULLconst [c] x) - // cond: isPowerOfTwo(c+1) && c >= 15 - // result: (SUBL (SHLLconst [log2(c+1)] x) x) - for { - c := v.AuxInt - x := v.Args[0] - if !(isPowerOfTwo(c+1) && c >= 15) { - break - } - v.reset(Op386SUBL) - v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) - v0.AuxInt = log2(c + 1) - v0.AddArg(x) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (MULLconst [c] x) - // cond: isPowerOfTwo(c-1) && c >= 17 - // result: (LEAL1 (SHLLconst [log2(c-1)] x) x) - for { - c := v.AuxInt - x := v.Args[0] - if !(isPowerOfTwo(c-1) && c >= 17) { - break - } - v.reset(Op386LEAL1) - v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) - v0.AuxInt = log2(c - 1) - v0.AddArg(x) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (MULLconst [c] x) - // cond: isPowerOfTwo(c-2) && c >= 34 - // result: (LEAL2 (SHLLconst [log2(c-2)] x) x) - for { - c := v.AuxInt - x := v.Args[0] - if !(isPowerOfTwo(c-2) && c >= 34) { - break - } - v.reset(Op386LEAL2) - v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) - v0.AuxInt = log2(c - 2) - v0.AddArg(x) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (MULLconst [c] x) - // cond: isPowerOfTwo(c-4) && c >= 68 - // result: (LEAL4 (SHLLconst [log2(c-4)] x) x) - for { - c := v.AuxInt - x := v.Args[0] - if !(isPowerOfTwo(c-4) && c >= 68) { - break - } - v.reset(Op386LEAL4) - v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) - v0.AuxInt = log2(c - 4) - v0.AddArg(x) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (MULLconst [c] x) - // cond: isPowerOfTwo(c-8) && c >= 136 - // result: (LEAL8 (SHLLconst [log2(c-8)] x) x) - for { - c := v.AuxInt - x := v.Args[0] - if !(isPowerOfTwo(c-8) && c >= 136) { - break - } - v.reset(Op386LEAL8) - v0 := b.NewValue0(v.Pos, Op386SHLLconst, v.Type) - v0.AuxInt = log2(c - 8) - v0.AddArg(x) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (MULLconst [c] x) - // cond: c%3 == 0 && isPowerOfTwo(c/3) - // result: (SHLLconst [log2(c/3)] (LEAL2 x x)) - for { - c := v.AuxInt - x := v.Args[0] - if !(c%3 == 0 && isPowerOfTwo(c/3)) { - break - } - v.reset(Op386SHLLconst) - v.AuxInt = log2(c / 3) - v0 := b.NewValue0(v.Pos, Op386LEAL2, v.Type) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MULLconst [c] x) - // cond: c%5 == 0 && isPowerOfTwo(c/5) - // result: (SHLLconst [log2(c/5)] (LEAL4 x x)) - for { - c := v.AuxInt - x := v.Args[0] - if !(c%5 == 0 && isPowerOfTwo(c/5)) { - break - } - v.reset(Op386SHLLconst) - v.AuxInt = log2(c / 5) - v0 := b.NewValue0(v.Pos, Op386LEAL4, v.Type) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MULLconst [c] x) - // cond: c%9 == 0 && isPowerOfTwo(c/9) - // result: (SHLLconst [log2(c/9)] (LEAL8 x x)) - for { - c := v.AuxInt - x := v.Args[0] - if !(c%9 == 0 && isPowerOfTwo(c/9)) { - break - } - v.reset(Op386SHLLconst) - v.AuxInt = log2(c / 9) - v0 := b.NewValue0(v.Pos, Op386LEAL8, v.Type) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - return false -} -func rewriteValue386_Op386MULLconst_30(v *Value) bool { - // match: (MULLconst [c] (MOVLconst [d])) - // result: (MOVLconst [int64(int32(c*d))]) - for { - c := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != Op386MOVLconst { - break - } - d := v_0.AuxInt - v.reset(Op386MOVLconst) - v.AuxInt = int64(int32(c * d)) - return true - } - return false -} -func rewriteValue386_Op386MULLload_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (MULLload [off1] {sym} val (ADDLconst [off2] base) mem) - // cond: is32Bit(off1+off2) - // result: (MULLload [off1+off2] {sym} val base mem) - for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[2] - val := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { - break - } - off2 := v_1.AuxInt - base := v_1.Args[0] - if !(is32Bit(off1 + off2)) { - break - } - v.reset(Op386MULLload) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(val) - v.AddArg(base) - v.AddArg(mem) - return true - } - // match: (MULLload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MULLload [off1+off2] {mergeSym(sym1,sym2)} val base mem) - for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] - val := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386LEAL { - break - } - off2 := v_1.AuxInt - sym2 := v_1.Aux - base := v_1.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { - break - } - v.reset(Op386MULLload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(val) - v.AddArg(base) - v.AddArg(mem) - return true - } - // match: (MULLload [off1] {sym1} val (LEAL4 [off2] {sym2} ptr idx) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MULLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} val ptr idx mem) - for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] - val := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386LEAL4 { - break - } - off2 := v_1.AuxInt - sym2 := v_1.Aux - idx := v_1.Args[1] - ptr := v_1.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { - break - } - v.reset(Op386MULLloadidx4) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(val) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - return false -} -func rewriteValue386_Op386MULLloadidx4_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (MULLloadidx4 [off1] {sym} val (ADDLconst [off2] base) idx mem) - // cond: is32Bit(off1+off2) - // result: (MULLloadidx4 [off1+off2] {sym} val base idx mem) - for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[3] - val := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { - break - } - off2 := v_1.AuxInt - base := v_1.Args[0] - idx := v.Args[2] - if !(is32Bit(off1 + off2)) { - break - } - v.reset(Op386MULLloadidx4) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(val) - v.AddArg(base) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MULLloadidx4 [off1] {sym} val base (ADDLconst [off2] idx) mem) - // cond: is32Bit(off1+off2*4) - // result: (MULLloadidx4 [off1+off2*4] {sym} val base idx mem) - for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[3] - val := v.Args[0] - base := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != Op386ADDLconst { - break - } - off2 := v_2.AuxInt - idx := v_2.Args[0] - if !(is32Bit(off1 + off2*4)) { - break - } - v.reset(Op386MULLloadidx4) - v.AuxInt = off1 + off2*4 - v.Aux = sym - v.AddArg(val) - v.AddArg(base) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MULLloadidx4 [off1] {sym1} val (LEAL [off2] {sym2} base) idx mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MULLloadidx4 [off1+off2] {mergeSym(sym1,sym2)} val base idx mem) - for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[3] - val := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386LEAL { - break - } - off2 := v_1.AuxInt - sym2 := v_1.Aux - base := v_1.Args[0] - idx := v.Args[2] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { - break - } - v.reset(Op386MULLloadidx4) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(val) - v.AddArg(base) - v.AddArg(idx) - v.AddArg(mem) - return true - } - return false -} -func rewriteValue386_Op386MULSD_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (MULSD x l:(MOVSDload [off] {sym} ptr mem)) - // cond: canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l) - // result: (MULSDload x [off] {sym} ptr mem) - for { - _ = v.Args[1] - x := v.Args[0] - l := v.Args[1] - if l.Op != Op386MOVSDload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l)) { - break - } - v.reset(Op386MULSDload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MULSD l:(MOVSDload [off] {sym} ptr mem) x) - // cond: canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l) - // result: (MULSDload x [off] {sym} ptr mem) - for { - x := v.Args[1] - l := v.Args[0] - if l.Op != Op386MOVSDload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l)) { - break - } - v.reset(Op386MULSDload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - return false -} -func rewriteValue386_Op386MULSDload_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (MULSDload [off1] {sym} val (ADDLconst [off2] base) mem) - // cond: is32Bit(off1+off2) - // result: (MULSDload [off1+off2] {sym} val base mem) - for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[2] - val := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { - break - } - off2 := v_1.AuxInt - base := v_1.Args[0] - if !(is32Bit(off1 + off2)) { - break - } - v.reset(Op386MULSDload) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(val) - v.AddArg(base) - v.AddArg(mem) - return true - } - // match: (MULSDload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MULSDload [off1+off2] {mergeSym(sym1,sym2)} val base mem) - for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] - val := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386LEAL { - break - } - off2 := v_1.AuxInt - sym2 := v_1.Aux - base := v_1.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { - break - } - v.reset(Op386MULSDload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(val) - v.AddArg(base) - v.AddArg(mem) - return true - } - return false -} -func rewriteValue386_Op386MULSS_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (MULSS x l:(MOVSSload [off] {sym} ptr mem)) - // cond: canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l) - // result: (MULSSload x [off] {sym} ptr mem) - for { - _ = v.Args[1] - x := v.Args[0] - l := v.Args[1] - if l.Op != Op386MOVSSload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l)) { - break - } - v.reset(Op386MULSSload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MULSS l:(MOVSSload [off] {sym} ptr mem) x) - // cond: canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l) - // result: (MULSSload x [off] {sym} ptr mem) - for { - x := v.Args[1] - l := v.Args[0] - if l.Op != Op386MOVSSload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l)) { - break - } - v.reset(Op386MULSSload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - return false -} -func rewriteValue386_Op386MULSSload_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (MULSSload [off1] {sym} val (ADDLconst [off2] base) mem) - // cond: is32Bit(off1+off2) - // result: (MULSSload [off1+off2] {sym} val base mem) - for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[2] - val := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386ADDLconst { - break - } - off2 := v_1.AuxInt - base := v_1.Args[0] - if !(is32Bit(off1 + off2)) { - break - } - v.reset(Op386MULSSload) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(val) - v.AddArg(base) - v.AddArg(mem) - return true - } - // match: (MULSSload [off1] {sym1} val (LEAL [off2] {sym2} base) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MULSSload [off1+off2] {mergeSym(sym1,sym2)} val base mem) - for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] - val := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386LEAL { - break - } - off2 := v_1.AuxInt - sym2 := v_1.Aux - base := v_1.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { - break - } - v.reset(Op386MULSSload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(val) - v.AddArg(base) - v.AddArg(mem) - return true - } - return false -} -func rewriteValue386_Op386NEGL_0(v *Value) bool { - // match: (NEGL (MOVLconst [c])) - // result: (MOVLconst [int64(int32(-c))]) - for { - v_0 := v.Args[0] - if v_0.Op != Op386MOVLconst { - break - } - c := v_0.AuxInt - v.reset(Op386MOVLconst) - v.AuxInt = int64(int32(-c)) - return true - } - return false -} -func rewriteValue386_Op386NOTL_0(v *Value) bool { - // match: (NOTL (MOVLconst [c])) - // result: (MOVLconst [^c]) - for { - v_0 := v.Args[0] - if v_0.Op != Op386MOVLconst { - break - } - c := v_0.AuxInt - v.reset(Op386MOVLconst) - v.AuxInt = ^c - return true - } - return false -} -func rewriteValue386_Op386ORL_0(v *Value) bool { - // match: (ORL x (MOVLconst [c])) - // result: (ORLconst [c] x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386MOVLconst { - break - } - c := v_1.AuxInt - v.reset(Op386ORLconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ORL (MOVLconst [c]) x) - // result: (ORLconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386MOVLconst { - break - } - c := v_0.AuxInt - v.reset(Op386ORLconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ORL (SHLLconst [c] x) (SHRLconst [d] x)) - // cond: d == 32-c - // result: (ROLLconst [c] x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386SHLLconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHRLconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(d == 32-c) { - break - } - v.reset(Op386ROLLconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ORL (SHRLconst [d] x) (SHLLconst [c] x)) - // cond: d == 32-c - // result: (ROLLconst [c] x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386SHRLconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHLLconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(d == 32-c) { - break - } - v.reset(Op386ROLLconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ORL (SHLLconst x [c]) (SHRWconst x [d])) - // cond: c < 16 && d == 16-c && t.Size() == 2 - // result: (ROLWconst x [c]) - for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386SHLLconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHRWconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(c < 16 && d == 16-c && t.Size() == 2) { - break - } - v.reset(Op386ROLWconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ORL (SHRWconst x [d]) (SHLLconst x [c])) - // cond: c < 16 && d == 16-c && t.Size() == 2 - // result: (ROLWconst x [c]) - for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386SHRWconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHLLconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(c < 16 && d == 16-c && t.Size() == 2) { - break - } - v.reset(Op386ROLWconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ORL (SHLLconst x [c]) (SHRBconst x [d])) - // cond: c < 8 && d == 8-c && t.Size() == 1 - // result: (ROLBconst x [c]) - for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386SHLLconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHRBconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(c < 8 && d == 8-c && t.Size() == 1) { - break - } - v.reset(Op386ROLBconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ORL (SHRBconst x [d]) (SHLLconst x [c])) - // cond: c < 8 && d == 8-c && t.Size() == 1 - // result: (ROLBconst x [c]) - for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386SHRBconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHLLconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(c < 8 && d == 8-c && t.Size() == 1) { - break - } - v.reset(Op386ROLBconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ORL x l:(MOVLload [off] {sym} ptr mem)) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (ORLload x [off] {sym} ptr mem) - for { - _ = v.Args[1] - x := v.Args[0] - l := v.Args[1] - if l.Op != Op386MOVLload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break - } - v.reset(Op386ORLload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (ORL l:(MOVLload [off] {sym} ptr mem) x) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (ORLload x [off] {sym} ptr mem) - for { - x := v.Args[1] - l := v.Args[0] - if l.Op != Op386MOVLload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break - } - v.reset(Op386ORLload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - return false -} -func rewriteValue386_Op386ORL_10(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORL x l:(MOVLloadidx4 [off] {sym} ptr idx mem)) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (ORLloadidx4 x [off] {sym} ptr idx mem) - for { - _ = v.Args[1] - x := v.Args[0] - l := v.Args[1] - if l.Op != Op386MOVLloadidx4 { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[2] - ptr := l.Args[0] - idx := l.Args[1] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break - } - v.reset(Op386ORLloadidx4) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (ORL l:(MOVLloadidx4 [off] {sym} ptr idx mem) x) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (ORLloadidx4 x [off] {sym} ptr idx mem) - for { - x := v.Args[1] - l := v.Args[0] - if l.Op != Op386MOVLloadidx4 { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[2] - ptr := l.Args[0] - idx := l.Args[1] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break - } - v.reset(Op386ORLloadidx4) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (ORL x x) - // result: x - for { - x := v.Args[1] - if x != v.Args[0] { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (ORL x0:(MOVBload [i0] {s} p mem) s0:(SHLLconst [8] x1:(MOVBload [i1] {s} p mem))) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) - // result: @mergePoint(b,x0,x1) (MOVWload [i0] {s} p mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != Op386MOVBload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - s0 := v.Args[1] - if s0.Op != Op386SHLLconst || s0.AuxInt != 8 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, Op386MOVWload, typ.UInt16) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (ORL s0:(SHLLconst [8] x1:(MOVBload [i1] {s} p mem)) x0:(MOVBload [i0] {s} p mem)) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) - // result: @mergePoint(b,x0,x1) (MOVWload [i0] {s} p mem) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != Op386SHLLconst || s0.AuxInt != 8 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - x0 := v.Args[1] - if x0.Op != Op386MOVBload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x0.Pos, Op386MOVWload, typ.UInt16) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (ORL o0:(ORL x0:(MOVWload [i0] {s} p mem) s0:(SHLLconst [16] x1:(MOVBload [i2] {s} p mem))) s1:(SHLLconst [24] x2:(MOVBload [i3] {s} p mem))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLload [i0] {s} p mem) - for { - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != Op386MOVWload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - s0 := o0.Args[1] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBload { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - s1 := v.Args[1] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBload { - break - } - i3 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x2.Pos, Op386MOVLload, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (ORL o0:(ORL s0:(SHLLconst [16] x1:(MOVBload [i2] {s} p mem)) x0:(MOVWload [i0] {s} p mem)) s1:(SHLLconst [24] x2:(MOVBload [i3] {s} p mem))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLload [i0] {s} p mem) - for { - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBload { - break - } - i2 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - x0 := o0.Args[1] - if x0.Op != Op386MOVWload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] { - break - } - s1 := v.Args[1] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBload { - break - } - i3 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x2.Pos, Op386MOVLload, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (ORL s1:(SHLLconst [24] x2:(MOVBload [i3] {s} p mem)) o0:(ORL x0:(MOVWload [i0] {s} p mem) s0:(SHLLconst [16] x1:(MOVBload [i2] {s} p mem)))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLload [i0] {s} p mem) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBload { - break - } - i3 := x2.AuxInt - s := x2.Aux - mem := x2.Args[1] - p := x2.Args[0] - o0 := v.Args[1] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != Op386MOVWload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] { - break - } - s0 := o0.Args[1] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBload { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x1.Pos, Op386MOVLload, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (ORL s1:(SHLLconst [24] x2:(MOVBload [i3] {s} p mem)) o0:(ORL s0:(SHLLconst [16] x1:(MOVBload [i2] {s} p mem)) x0:(MOVWload [i0] {s} p mem))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLload [i0] {s} p mem) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBload { - break - } - i3 := x2.AuxInt - s := x2.Aux - mem := x2.Args[1] - p := x2.Args[0] - o0 := v.Args[1] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBload { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - x0 := o0.Args[1] - if x0.Op != Op386MOVWload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x0.Pos, Op386MOVLload, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (ORL x0:(MOVBloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem))) - // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) - // result: @mergePoint(b,x0,x1) (MOVWloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != Op386MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s0 := v.Args[1] - if s0.Op != Op386SHLLconst || s0.AuxInt != 8 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - return false -} -func rewriteValue386_Op386ORL_20(v *Value) bool { - b := v.Block - // match: (ORL x0:(MOVBloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem))) - // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) - // result: @mergePoint(b,x0,x1) (MOVWloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != Op386MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s0 := v.Args[1] - if s0.Op != Op386SHLLconst || s0.AuxInt != 8 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL x0:(MOVBloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem))) - // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) - // result: @mergePoint(b,x0,x1) (MOVWloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != Op386MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s0 := v.Args[1] - if s0.Op != Op386SHLLconst || s0.AuxInt != 8 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL x0:(MOVBloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem))) - // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) - // result: @mergePoint(b,x0,x1) (MOVWloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != Op386MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s0 := v.Args[1] - if s0.Op != Op386SHLLconst || s0.AuxInt != 8 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem)) x0:(MOVBloadidx1 [i0] {s} p idx mem)) - // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) - // result: @mergePoint(b,x0,x1) (MOVWloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != Op386SHLLconst || s0.AuxInt != 8 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - x0 := v.Args[1] - if x0.Op != Op386MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem)) x0:(MOVBloadidx1 [i0] {s} p idx mem)) - // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) - // result: @mergePoint(b,x0,x1) (MOVWloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != Op386SHLLconst || s0.AuxInt != 8 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - x0 := v.Args[1] - if x0.Op != Op386MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem)) x0:(MOVBloadidx1 [i0] {s} idx p mem)) - // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) - // result: @mergePoint(b,x0,x1) (MOVWloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != Op386SHLLconst || s0.AuxInt != 8 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - x0 := v.Args[1] - if x0.Op != Op386MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem)) x0:(MOVBloadidx1 [i0] {s} idx p mem)) - // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) - // result: @mergePoint(b,x0,x1) (MOVWloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != Op386SHLLconst || s0.AuxInt != 8 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - x0 := v.Args[1] - if x0.Op != Op386MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL o0:(ORL x0:(MOVWloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem))) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s0 := o0.Args[1] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] { - break - } - s1 := v.Args[1] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[2] - if p != x2.Args[0] || idx != x2.Args[1] || mem != x2.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL o0:(ORL x0:(MOVWloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem))) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s0 := o0.Args[1] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] { - break - } - s1 := v.Args[1] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[2] - if p != x2.Args[0] || idx != x2.Args[1] || mem != x2.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL o0:(ORL x0:(MOVWloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem))) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s0 := o0.Args[1] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] { - break - } - s1 := v.Args[1] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[2] - if p != x2.Args[0] || idx != x2.Args[1] || mem != x2.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - return false -} -func rewriteValue386_Op386ORL_30(v *Value) bool { - b := v.Block - // match: (ORL o0:(ORL x0:(MOVWloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem))) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s0 := o0.Args[1] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] { - break - } - s1 := v.Args[1] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[2] - if p != x2.Args[0] || idx != x2.Args[1] || mem != x2.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)) x0:(MOVWloadidx1 [i0] {s} p idx mem)) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - x0 := o0.Args[1] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] { - break - } - s1 := v.Args[1] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[2] - if p != x2.Args[0] || idx != x2.Args[1] || mem != x2.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)) x0:(MOVWloadidx1 [i0] {s} p idx mem)) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - x0 := o0.Args[1] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] { - break - } - s1 := v.Args[1] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[2] - if p != x2.Args[0] || idx != x2.Args[1] || mem != x2.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)) x0:(MOVWloadidx1 [i0] {s} idx p mem)) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - x0 := o0.Args[1] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] { - break - } - s1 := v.Args[1] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[2] - if p != x2.Args[0] || idx != x2.Args[1] || mem != x2.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)) x0:(MOVWloadidx1 [i0] {s} idx p mem)) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - x0 := o0.Args[1] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] { - break - } - s1 := v.Args[1] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[2] - if p != x2.Args[0] || idx != x2.Args[1] || mem != x2.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL o0:(ORL x0:(MOVWloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem))) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s0 := o0.Args[1] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] { - break - } - s1 := v.Args[1] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[2] - if idx != x2.Args[0] || p != x2.Args[1] || mem != x2.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL o0:(ORL x0:(MOVWloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem))) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s0 := o0.Args[1] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] { - break - } - s1 := v.Args[1] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[2] - if idx != x2.Args[0] || p != x2.Args[1] || mem != x2.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL o0:(ORL x0:(MOVWloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem))) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s0 := o0.Args[1] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] { - break - } - s1 := v.Args[1] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[2] - if idx != x2.Args[0] || p != x2.Args[1] || mem != x2.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL o0:(ORL x0:(MOVWloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem))) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s0 := o0.Args[1] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] { - break - } - s1 := v.Args[1] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[2] - if idx != x2.Args[0] || p != x2.Args[1] || mem != x2.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)) x0:(MOVWloadidx1 [i0] {s} p idx mem)) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - x0 := o0.Args[1] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] { - break - } - s1 := v.Args[1] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[2] - if idx != x2.Args[0] || p != x2.Args[1] || mem != x2.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - return false -} -func rewriteValue386_Op386ORL_40(v *Value) bool { - b := v.Block - // match: (ORL o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)) x0:(MOVWloadidx1 [i0] {s} p idx mem)) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - x0 := o0.Args[1] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] { - break - } - s1 := v.Args[1] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[2] - if idx != x2.Args[0] || p != x2.Args[1] || mem != x2.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)) x0:(MOVWloadidx1 [i0] {s} idx p mem)) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - x0 := o0.Args[1] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] { - break - } - s1 := v.Args[1] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[2] - if idx != x2.Args[0] || p != x2.Args[1] || mem != x2.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)) x0:(MOVWloadidx1 [i0] {s} idx p mem)) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - x0 := o0.Args[1] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] { - break - } - s1 := v.Args[1] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[2] - if idx != x2.Args[0] || p != x2.Args[1] || mem != x2.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem)) o0:(ORL x0:(MOVWloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - s := x2.Aux - mem := x2.Args[2] - p := x2.Args[0] - idx := x2.Args[1] - o0 := v.Args[1] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] { - break - } - s0 := o0.Args[1] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem)) o0:(ORL x0:(MOVWloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - s := x2.Aux - mem := x2.Args[2] - idx := x2.Args[0] - p := x2.Args[1] - o0 := v.Args[1] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] { - break - } - s0 := o0.Args[1] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem)) o0:(ORL x0:(MOVWloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - s := x2.Aux - mem := x2.Args[2] - p := x2.Args[0] - idx := x2.Args[1] - o0 := v.Args[1] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] { - break - } - s0 := o0.Args[1] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem)) o0:(ORL x0:(MOVWloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - s := x2.Aux - mem := x2.Args[2] - idx := x2.Args[0] - p := x2.Args[1] - o0 := v.Args[1] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] { - break - } - s0 := o0.Args[1] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem)) o0:(ORL x0:(MOVWloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - s := x2.Aux - mem := x2.Args[2] - p := x2.Args[0] - idx := x2.Args[1] - o0 := v.Args[1] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] { - break - } - s0 := o0.Args[1] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem)) o0:(ORL x0:(MOVWloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - s := x2.Aux - mem := x2.Args[2] - idx := x2.Args[0] - p := x2.Args[1] - o0 := v.Args[1] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] { - break - } - s0 := o0.Args[1] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem)) o0:(ORL x0:(MOVWloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - s := x2.Aux - mem := x2.Args[2] - p := x2.Args[0] - idx := x2.Args[1] - o0 := v.Args[1] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] { - break - } - s0 := o0.Args[1] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - return false -} -func rewriteValue386_Op386ORL_50(v *Value) bool { - b := v.Block - // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem)) o0:(ORL x0:(MOVWloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - s := x2.Aux - mem := x2.Args[2] - idx := x2.Args[0] - p := x2.Args[1] - o0 := v.Args[1] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] { - break - } - s0 := o0.Args[1] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem)) o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)) x0:(MOVWloadidx1 [i0] {s} p idx mem))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - s := x2.Aux - mem := x2.Args[2] - p := x2.Args[0] - idx := x2.Args[1] - o0 := v.Args[1] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] { - break - } - x0 := o0.Args[1] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem)) o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)) x0:(MOVWloadidx1 [i0] {s} p idx mem))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - s := x2.Aux - mem := x2.Args[2] - idx := x2.Args[0] - p := x2.Args[1] - o0 := v.Args[1] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] { - break - } - x0 := o0.Args[1] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem)) o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)) x0:(MOVWloadidx1 [i0] {s} p idx mem))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - s := x2.Aux - mem := x2.Args[2] - p := x2.Args[0] - idx := x2.Args[1] - o0 := v.Args[1] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] { - break - } - x0 := o0.Args[1] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem)) o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)) x0:(MOVWloadidx1 [i0] {s} p idx mem))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - s := x2.Aux - mem := x2.Args[2] - idx := x2.Args[0] - p := x2.Args[1] - o0 := v.Args[1] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] { - break - } - x0 := o0.Args[1] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem)) o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)) x0:(MOVWloadidx1 [i0] {s} idx p mem))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - s := x2.Aux - mem := x2.Args[2] - p := x2.Args[0] - idx := x2.Args[1] - o0 := v.Args[1] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] { - break - } - x0 := o0.Args[1] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem)) o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem)) x0:(MOVWloadidx1 [i0] {s} idx p mem))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) + // match: (ORL x0:(MOVBload [i0] {s} p mem) s0:(SHLLconst [8] x1:(MOVBload [i1] {s} p mem))) + // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) + // result: @mergePoint(b,x0,x1) (MOVWload [i0] {s} p mem) for { _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - s := x2.Aux - mem := x2.Args[2] - idx := x2.Args[0] - p := x2.Args[1] - o0 := v.Args[1] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] { - break - } - x0 := o0.Args[1] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + if x0.Op != Op386MOVBload { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + s0 := v.Args[1^_i0] + if s0.Op != Op386SHLLconst || s0.AuxInt != 8 { + continue + } + x1 := s0.Args[0] + if x1.Op != Op386MOVBload { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(x1.Pos, Op386MOVWload, typ.UInt16) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(mem) + return true } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true + break } - // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem)) o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)) x0:(MOVWloadidx1 [i0] {s} idx p mem))) + // match: (ORL o0:(ORL x0:(MOVWload [i0] {s} p mem) s0:(SHLLconst [16] x1:(MOVBload [i2] {s} p mem))) s1:(SHLLconst [24] x2:(MOVBload [i3] {s} p mem))) // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) + // result: @mergePoint(b,x0,x1,x2) (MOVLload [i0] {s} p mem) for { _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - s := x2.Aux - mem := x2.Args[2] - p := x2.Args[0] - idx := x2.Args[1] - o0 := v.Args[1] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] { - break - } - x0 := o0.Args[1] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + o0 := v.Args[_i0] + if o0.Op != Op386ORL { + continue + } + _ = o0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + x0 := o0.Args[_i1] + if x0.Op != Op386MOVWload { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + s0 := o0.Args[1^_i1] + if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { + continue + } + x1 := s0.Args[0] + if x1.Op != Op386MOVBload { + continue + } + i2 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] { + continue + } + s1 := v.Args[1^_i0] + if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { + continue + } + x2 := s1.Args[0] + if x2.Op != Op386MOVBload { + continue + } + i3 := x2.AuxInt + if x2.Aux != s { + continue + } + _ = x2.Args[1] + if p != x2.Args[0] || mem != x2.Args[1] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { + continue + } + b = mergePoint(b, x0, x1, x2) + v0 := b.NewValue0(x2.Pos, Op386MOVLload, typ.UInt32) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(mem) + return true + } } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true + break } - // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem)) o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)) x0:(MOVWloadidx1 [i0] {s} idx p mem))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) + // match: (ORL x0:(MOVBloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem))) + // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) + // result: @mergePoint(b,x0,x1) (MOVWloadidx1 [i0] {s} p idx mem) for { _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != Op386MOVBloadidx1 { - break - } - i3 := x2.AuxInt - s := x2.Aux - mem := x2.Args[2] - idx := x2.Args[0] - p := x2.Args[1] - o0 := v.Args[1] - if o0.Op != Op386ORL { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != Op386MOVBloadidx1 { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] { - break - } - x0 := o0.Args[1] - if x0.Op != Op386MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + if x0.Op != Op386MOVBloadidx1 { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x0.Args[_i1] + idx := x0.Args[1^_i1] + s0 := v.Args[1^_i0] + if s0.Op != Op386SHLLconst || s0.AuxInt != 8 { + continue + } + x1 := s0.Args[0] + if x1.Op != Op386MOVBloadidx1 { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[2] + for _i2 := 0; _i2 <= 1; _i2++ { + if p != x1.Args[_i2] || idx != x1.Args[1^_i2] || mem != x1.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(v.Pos, Op386MOVWloadidx1, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(idx) + v0.AddArg(mem) + return true + } + } } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break + break + } + return false +} +func rewriteValue386_Op386ORL_10(v *Value) bool { + b := v.Block + // match: (ORL o0:(ORL x0:(MOVWloadidx1 [i0] {s} p idx mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} p idx mem))) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem))) + // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) + // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + o0 := v.Args[_i0] + if o0.Op != Op386ORL { + continue + } + _ = o0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + x0 := o0.Args[_i1] + if x0.Op != Op386MOVWloadidx1 { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[2] + for _i2 := 0; _i2 <= 1; _i2++ { + p := x0.Args[_i2] + idx := x0.Args[1^_i2] + s0 := o0.Args[1^_i1] + if s0.Op != Op386SHLLconst || s0.AuxInt != 16 { + continue + } + x1 := s0.Args[0] + if x1.Op != Op386MOVBloadidx1 { + continue + } + i2 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[2] + for _i3 := 0; _i3 <= 1; _i3++ { + if p != x1.Args[_i3] || idx != x1.Args[1^_i3] || mem != x1.Args[2] { + continue + } + s1 := v.Args[1^_i0] + if s1.Op != Op386SHLLconst || s1.AuxInt != 24 { + continue + } + x2 := s1.Args[0] + if x2.Op != Op386MOVBloadidx1 { + continue + } + i3 := x2.AuxInt + if x2.Aux != s { + continue + } + _ = x2.Args[2] + for _i4 := 0; _i4 <= 1; _i4++ { + if p != x2.Args[_i4] || idx != x2.Args[1^_i4] || mem != x2.Args[2] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { + continue + } + b = mergePoint(b, x0, x1, x2) + v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(idx) + v0.AddArg(mem) + return true + } + } + } + } } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, Op386MOVLloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true + break } return false } @@ -17516,78 +13033,46 @@ func rewriteValue386_Op386XORL_0(v *Value) bool { // result: (XORLconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386MOVLconst { - break - } - c := v_1.AuxInt - v.reset(Op386XORLconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (XORL (MOVLconst [c]) x) - // result: (XORLconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386MOVLconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386MOVLconst { + continue + } + c := v_1.AuxInt + v.reset(Op386XORLconst) + v.AuxInt = c + v.AddArg(x) + return true } - c := v_0.AuxInt - v.reset(Op386XORLconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (XORL (SHLLconst [c] x) (SHRLconst [d] x)) // cond: d == 32-c // result: (ROLLconst [c] x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386SHLLconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHRLconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(d == 32-c) { - break - } - v.reset(Op386ROLLconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (XORL (SHRLconst [d] x) (SHLLconst [c] x)) - // cond: d == 32-c - // result: (ROLLconst [c] x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386SHRLconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHLLconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(d == 32-c) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != Op386SHLLconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386SHRLconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(d == 32-c) { + continue + } + v.reset(Op386ROLLconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(Op386ROLLconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (XORL (SHLLconst x [c]) (SHRWconst x [d])) // cond: c < 16 && d == 16-c && t.Size() == 2 @@ -17595,49 +13080,27 @@ func rewriteValue386_Op386XORL_0(v *Value) bool { for { t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386SHLLconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHRWconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(c < 16 && d == 16-c && t.Size() == 2) { - break - } - v.reset(Op386ROLWconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (XORL (SHRWconst x [d]) (SHLLconst x [c])) - // cond: c < 16 && d == 16-c && t.Size() == 2 - // result: (ROLWconst x [c]) - for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386SHRWconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHLLconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(c < 16 && d == 16-c && t.Size() == 2) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != Op386SHLLconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386SHRWconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(c < 16 && d == 16-c && t.Size() == 2) { + continue + } + v.reset(Op386ROLWconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(Op386ROLWconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (XORL (SHLLconst x [c]) (SHRBconst x [d])) // cond: c < 8 && d == 8-c && t.Size() == 1 @@ -17645,154 +13108,85 @@ func rewriteValue386_Op386XORL_0(v *Value) bool { for { t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386SHLLconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHRBconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(c < 8 && d == 8-c && t.Size() == 1) { - break - } - v.reset(Op386ROLBconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (XORL (SHRBconst x [d]) (SHLLconst x [c])) - // cond: c < 8 && d == 8-c && t.Size() == 1 - // result: (ROLBconst x [c]) - for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != Op386SHRBconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != Op386SHLLconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(c < 8 && d == 8-c && t.Size() == 1) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != Op386SHLLconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != Op386SHRBconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(c < 8 && d == 8-c && t.Size() == 1) { + continue + } + v.reset(Op386ROLBconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(Op386ROLBconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (XORL x l:(MOVLload [off] {sym} ptr mem)) // cond: canMergeLoadClobber(v, l, x) && clobber(l) // result: (XORLload x [off] {sym} ptr mem) for { _ = v.Args[1] - x := v.Args[0] - l := v.Args[1] - if l.Op != Op386MOVLload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break - } - v.reset(Op386XORLload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (XORL l:(MOVLload [off] {sym} ptr mem) x) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (XORLload x [off] {sym} ptr mem) - for { - x := v.Args[1] - l := v.Args[0] - if l.Op != Op386MOVLload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != Op386MOVLload { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[1] + ptr := l.Args[0] + if !(canMergeLoadClobber(v, l, x) && clobber(l)) { + continue + } + v.reset(Op386XORLload) + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - v.reset(Op386XORLload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true + break } - return false -} -func rewriteValue386_Op386XORL_10(v *Value) bool { // match: (XORL x l:(MOVLloadidx4 [off] {sym} ptr idx mem)) // cond: canMergeLoadClobber(v, l, x) && clobber(l) // result: (XORLloadidx4 x [off] {sym} ptr idx mem) for { _ = v.Args[1] - x := v.Args[0] - l := v.Args[1] - if l.Op != Op386MOVLloadidx4 { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[2] - ptr := l.Args[0] - idx := l.Args[1] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break - } - v.reset(Op386XORLloadidx4) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (XORL l:(MOVLloadidx4 [off] {sym} ptr idx mem) x) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (XORLloadidx4 x [off] {sym} ptr idx mem) - for { - x := v.Args[1] - l := v.Args[0] - if l.Op != Op386MOVLloadidx4 { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[2] - ptr := l.Args[0] - idx := l.Args[1] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != Op386MOVLloadidx4 { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[2] + ptr := l.Args[0] + idx := l.Args[1] + if !(canMergeLoadClobber(v, l, x) && clobber(l)) { + continue + } + v.reset(Op386XORLloadidx4) + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(Op386XORLloadidx4) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } // match: (XORL x x) // result: (MOVLconst [0]) diff --git a/src/cmd/compile/internal/ssa/rewriteAMD64.go b/src/cmd/compile/internal/ssa/rewriteAMD64.go index 98619943d7..11bf714195 100644 --- a/src/cmd/compile/internal/ssa/rewriteAMD64.go +++ b/src/cmd/compile/internal/ssa/rewriteAMD64.go @@ -13,7 +13,7 @@ func rewriteValueAMD64(v *Value) bool { case OpAMD64ADCQconst: return rewriteValueAMD64_OpAMD64ADCQconst_0(v) case OpAMD64ADDL: - return rewriteValueAMD64_OpAMD64ADDL_0(v) || rewriteValueAMD64_OpAMD64ADDL_10(v) || rewriteValueAMD64_OpAMD64ADDL_20(v) + return rewriteValueAMD64_OpAMD64ADDL_0(v) || rewriteValueAMD64_OpAMD64ADDL_10(v) case OpAMD64ADDLconst: return rewriteValueAMD64_OpAMD64ADDLconst_0(v) || rewriteValueAMD64_OpAMD64ADDLconst_10(v) case OpAMD64ADDLconstmodify: @@ -23,7 +23,7 @@ func rewriteValueAMD64(v *Value) bool { case OpAMD64ADDLmodify: return rewriteValueAMD64_OpAMD64ADDLmodify_0(v) case OpAMD64ADDQ: - return rewriteValueAMD64_OpAMD64ADDQ_0(v) || rewriteValueAMD64_OpAMD64ADDQ_10(v) || rewriteValueAMD64_OpAMD64ADDQ_20(v) + return rewriteValueAMD64_OpAMD64ADDQ_0(v) || rewriteValueAMD64_OpAMD64ADDQ_10(v) case OpAMD64ADDQcarry: return rewriteValueAMD64_OpAMD64ADDQcarry_0(v) case OpAMD64ADDQconst: @@ -301,13 +301,13 @@ func rewriteValueAMD64(v *Value) bool { case OpAMD64MOVQi2f: return rewriteValueAMD64_OpAMD64MOVQi2f_0(v) case OpAMD64MOVQload: - return rewriteValueAMD64_OpAMD64MOVQload_0(v) || rewriteValueAMD64_OpAMD64MOVQload_10(v) + return rewriteValueAMD64_OpAMD64MOVQload_0(v) case OpAMD64MOVQloadidx1: return rewriteValueAMD64_OpAMD64MOVQloadidx1_0(v) case OpAMD64MOVQloadidx8: return rewriteValueAMD64_OpAMD64MOVQloadidx8_0(v) case OpAMD64MOVQstore: - return rewriteValueAMD64_OpAMD64MOVQstore_0(v) || rewriteValueAMD64_OpAMD64MOVQstore_10(v) || rewriteValueAMD64_OpAMD64MOVQstore_20(v) || rewriteValueAMD64_OpAMD64MOVQstore_30(v) + return rewriteValueAMD64_OpAMD64MOVQstore_0(v) || rewriteValueAMD64_OpAMD64MOVQstore_10(v) || rewriteValueAMD64_OpAMD64MOVQstore_20(v) case OpAMD64MOVQstoreconst: return rewriteValueAMD64_OpAMD64MOVQstoreconst_0(v) case OpAMD64MOVQstoreconstidx1: @@ -391,7 +391,7 @@ func rewriteValueAMD64(v *Value) bool { case OpAMD64NOTQ: return rewriteValueAMD64_OpAMD64NOTQ_0(v) case OpAMD64ORL: - return rewriteValueAMD64_OpAMD64ORL_0(v) || rewriteValueAMD64_OpAMD64ORL_10(v) || rewriteValueAMD64_OpAMD64ORL_20(v) || rewriteValueAMD64_OpAMD64ORL_30(v) || rewriteValueAMD64_OpAMD64ORL_40(v) || rewriteValueAMD64_OpAMD64ORL_50(v) || rewriteValueAMD64_OpAMD64ORL_60(v) || rewriteValueAMD64_OpAMD64ORL_70(v) || rewriteValueAMD64_OpAMD64ORL_80(v) || rewriteValueAMD64_OpAMD64ORL_90(v) || rewriteValueAMD64_OpAMD64ORL_100(v) || rewriteValueAMD64_OpAMD64ORL_110(v) || rewriteValueAMD64_OpAMD64ORL_120(v) || rewriteValueAMD64_OpAMD64ORL_130(v) + return rewriteValueAMD64_OpAMD64ORL_0(v) || rewriteValueAMD64_OpAMD64ORL_10(v) || rewriteValueAMD64_OpAMD64ORL_20(v) || rewriteValueAMD64_OpAMD64ORL_30(v) case OpAMD64ORLconst: return rewriteValueAMD64_OpAMD64ORLconst_0(v) case OpAMD64ORLconstmodify: @@ -401,7 +401,7 @@ func rewriteValueAMD64(v *Value) bool { case OpAMD64ORLmodify: return rewriteValueAMD64_OpAMD64ORLmodify_0(v) case OpAMD64ORQ: - return rewriteValueAMD64_OpAMD64ORQ_0(v) || rewriteValueAMD64_OpAMD64ORQ_10(v) || rewriteValueAMD64_OpAMD64ORQ_20(v) || rewriteValueAMD64_OpAMD64ORQ_30(v) || rewriteValueAMD64_OpAMD64ORQ_40(v) || rewriteValueAMD64_OpAMD64ORQ_50(v) || rewriteValueAMD64_OpAMD64ORQ_60(v) || rewriteValueAMD64_OpAMD64ORQ_70(v) || rewriteValueAMD64_OpAMD64ORQ_80(v) || rewriteValueAMD64_OpAMD64ORQ_90(v) || rewriteValueAMD64_OpAMD64ORQ_100(v) || rewriteValueAMD64_OpAMD64ORQ_110(v) || rewriteValueAMD64_OpAMD64ORQ_120(v) || rewriteValueAMD64_OpAMD64ORQ_130(v) || rewriteValueAMD64_OpAMD64ORQ_140(v) || rewriteValueAMD64_OpAMD64ORQ_150(v) || rewriteValueAMD64_OpAMD64ORQ_160(v) + return rewriteValueAMD64_OpAMD64ORQ_0(v) || rewriteValueAMD64_OpAMD64ORQ_10(v) || rewriteValueAMD64_OpAMD64ORQ_20(v) case OpAMD64ORQconst: return rewriteValueAMD64_OpAMD64ORQconst_0(v) case OpAMD64ORQconstmodify: @@ -475,7 +475,7 @@ func rewriteValueAMD64(v *Value) bool { case OpAMD64SETBstore: return rewriteValueAMD64_OpAMD64SETBstore_0(v) case OpAMD64SETEQ: - return rewriteValueAMD64_OpAMD64SETEQ_0(v) || rewriteValueAMD64_OpAMD64SETEQ_10(v) || rewriteValueAMD64_OpAMD64SETEQ_20(v) + return rewriteValueAMD64_OpAMD64SETEQ_0(v) || rewriteValueAMD64_OpAMD64SETEQ_10(v) case OpAMD64SETEQstore: return rewriteValueAMD64_OpAMD64SETEQstore_0(v) || rewriteValueAMD64_OpAMD64SETEQstore_10(v) || rewriteValueAMD64_OpAMD64SETEQstore_20(v) case OpAMD64SETG: @@ -495,7 +495,7 @@ func rewriteValueAMD64(v *Value) bool { case OpAMD64SETLstore: return rewriteValueAMD64_OpAMD64SETLstore_0(v) case OpAMD64SETNE: - return rewriteValueAMD64_OpAMD64SETNE_0(v) || rewriteValueAMD64_OpAMD64SETNE_10(v) || rewriteValueAMD64_OpAMD64SETNE_20(v) + return rewriteValueAMD64_OpAMD64SETNE_0(v) || rewriteValueAMD64_OpAMD64SETNE_10(v) case OpAMD64SETNEstore: return rewriteValueAMD64_OpAMD64SETNEstore_0(v) || rewriteValueAMD64_OpAMD64SETNEstore_10(v) || rewriteValueAMD64_OpAMD64SETNEstore_20(v) case OpAMD64SHLL: @@ -573,7 +573,7 @@ func rewriteValueAMD64(v *Value) bool { case OpAMD64XCHGQ: return rewriteValueAMD64_OpAMD64XCHGQ_0(v) case OpAMD64XORL: - return rewriteValueAMD64_OpAMD64XORL_0(v) || rewriteValueAMD64_OpAMD64XORL_10(v) + return rewriteValueAMD64_OpAMD64XORL_0(v) case OpAMD64XORLconst: return rewriteValueAMD64_OpAMD64XORLconst_0(v) || rewriteValueAMD64_OpAMD64XORLconst_10(v) case OpAMD64XORLconstmodify: @@ -583,7 +583,7 @@ func rewriteValueAMD64(v *Value) bool { case OpAMD64XORLmodify: return rewriteValueAMD64_OpAMD64XORLmodify_0(v) case OpAMD64XORQ: - return rewriteValueAMD64_OpAMD64XORQ_0(v) || rewriteValueAMD64_OpAMD64XORQ_10(v) + return rewriteValueAMD64_OpAMD64XORQ_0(v) case OpAMD64XORQconst: return rewriteValueAMD64_OpAMD64XORQconst_0(v) case OpAMD64XORQconstmodify: @@ -1161,40 +1161,23 @@ func rewriteValueAMD64_OpAMD64ADCQ_0(v *Value) bool { // result: (ADCQconst x [c] carry) for { carry := v.Args[2] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVQconst { - break - } - c := v_1.AuxInt - if !(is32Bit(c)) { - break - } - v.reset(OpAMD64ADCQconst) - v.AuxInt = c - v.AddArg(x) - v.AddArg(carry) - return true - } - // match: (ADCQ (MOVQconst [c]) x carry) - // cond: is32Bit(c) - // result: (ADCQconst x [c] carry) - for { - carry := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVQconst { - break - } - c := v_0.AuxInt - x := v.Args[1] - if !(is32Bit(c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64MOVQconst { + continue + } + c := v_1.AuxInt + if !(is32Bit(c)) { + continue + } + v.reset(OpAMD64ADCQconst) + v.AuxInt = c + v.AddArg(x) + v.AddArg(carry) + return true } - v.reset(OpAMD64ADCQconst) - v.AuxInt = c - v.AddArg(x) - v.AddArg(carry) - return true + break } // match: (ADCQ x y (FlagEQ)) // result: (ADDQcarry x y) @@ -1236,78 +1219,46 @@ func rewriteValueAMD64_OpAMD64ADDL_0(v *Value) bool { // result: (ADDLconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVLconst { - break - } - c := v_1.AuxInt - v.reset(OpAMD64ADDLconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ADDL (MOVLconst [c]) x) - // result: (ADDLconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVLconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64MOVLconst { + continue + } + c := v_1.AuxInt + v.reset(OpAMD64ADDLconst) + v.AuxInt = c + v.AddArg(x) + return true } - c := v_0.AuxInt - v.reset(OpAMD64ADDLconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (ADDL (SHLLconst x [c]) (SHRLconst x [d])) // cond: d==32-c // result: (ROLLconst x [c]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLLconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHRLconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(d == 32-c) { - break - } - v.reset(OpAMD64ROLLconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ADDL (SHRLconst x [d]) (SHLLconst x [c])) - // cond: d==32-c - // result: (ROLLconst x [c]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHRLconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLLconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(d == 32-c) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64SHLLconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64SHRLconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(d == 32-c) { + continue + } + v.reset(OpAMD64ROLLconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpAMD64ROLLconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (ADDL (SHLLconst x [c]) (SHRWconst x [d])) // cond: d==16-c && c < 16 && t.Size() == 2 @@ -1315,49 +1266,27 @@ func rewriteValueAMD64_OpAMD64ADDL_0(v *Value) bool { for { t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLLconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHRWconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(d == 16-c && c < 16 && t.Size() == 2) { - break - } - v.reset(OpAMD64ROLWconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ADDL (SHRWconst x [d]) (SHLLconst x [c])) - // cond: d==16-c && c < 16 && t.Size() == 2 - // result: (ROLWconst x [c]) - for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHRWconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLLconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(d == 16-c && c < 16 && t.Size() == 2) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64SHLLconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64SHRWconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(d == 16-c && c < 16 && t.Size() == 2) { + continue + } + v.reset(OpAMD64ROLWconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpAMD64ROLWconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (ADDL (SHLLconst x [c]) (SHRBconst x [d])) // cond: d==8-c && c < 8 && t.Size() == 1 @@ -1365,405 +1294,221 @@ func rewriteValueAMD64_OpAMD64ADDL_0(v *Value) bool { for { t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLLconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHRBconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(d == 8-c && c < 8 && t.Size() == 1) { - break - } - v.reset(OpAMD64ROLBconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ADDL (SHRBconst x [d]) (SHLLconst x [c])) - // cond: d==8-c && c < 8 && t.Size() == 1 - // result: (ROLBconst x [c]) - for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHRBconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLLconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(d == 8-c && c < 8 && t.Size() == 1) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64SHLLconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64SHRBconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(d == 8-c && c < 8 && t.Size() == 1) { + continue + } + v.reset(OpAMD64ROLBconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpAMD64ROLBconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (ADDL x (SHLLconst [3] y)) // result: (LEAL8 x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLLconst || v_1.AuxInt != 3 { - break - } - y := v_1.Args[0] - v.reset(OpAMD64LEAL8) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADDL (SHLLconst [3] y) x) - // result: (LEAL8 x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLLconst || v_0.AuxInt != 3 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64SHLLconst || v_1.AuxInt != 3 { + continue + } + y := v_1.Args[0] + v.reset(OpAMD64LEAL8) + v.AddArg(x) + v.AddArg(y) + return true } - y := v_0.Args[0] - v.reset(OpAMD64LEAL8) - v.AddArg(x) - v.AddArg(y) - return true + break } - return false -} -func rewriteValueAMD64_OpAMD64ADDL_10(v *Value) bool { // match: (ADDL x (SHLLconst [2] y)) // result: (LEAL4 x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLLconst || v_1.AuxInt != 2 { - break - } - y := v_1.Args[0] - v.reset(OpAMD64LEAL4) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADDL (SHLLconst [2] y) x) - // result: (LEAL4 x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLLconst || v_0.AuxInt != 2 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64SHLLconst || v_1.AuxInt != 2 { + continue + } + y := v_1.Args[0] + v.reset(OpAMD64LEAL4) + v.AddArg(x) + v.AddArg(y) + return true } - y := v_0.Args[0] - v.reset(OpAMD64LEAL4) - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (ADDL x (SHLLconst [1] y)) // result: (LEAL2 x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLLconst || v_1.AuxInt != 1 { - break - } - y := v_1.Args[0] - v.reset(OpAMD64LEAL2) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADDL (SHLLconst [1] y) x) - // result: (LEAL2 x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLLconst || v_0.AuxInt != 1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64SHLLconst || v_1.AuxInt != 1 { + continue + } + y := v_1.Args[0] + v.reset(OpAMD64LEAL2) + v.AddArg(x) + v.AddArg(y) + return true } - y := v_0.Args[0] - v.reset(OpAMD64LEAL2) - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (ADDL x (ADDL y y)) // result: (LEAL2 x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ADDL { - break - } - y := v_1.Args[1] - if y != v_1.Args[0] { - break - } - v.reset(OpAMD64LEAL2) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADDL (ADDL y y) x) - // result: (LEAL2 x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDL { - break - } - y := v_0.Args[1] - if y != v_0.Args[0] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64ADDL { + continue + } + y := v_1.Args[1] + if y != v_1.Args[0] { + continue + } + v.reset(OpAMD64LEAL2) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpAMD64LEAL2) - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (ADDL x (ADDL x y)) // result: (LEAL2 y x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ADDL { - break - } - y := v_1.Args[1] - if x != v_1.Args[0] { - break - } - v.reset(OpAMD64LEAL2) - v.AddArg(y) - v.AddArg(x) - return true - } - // match: (ADDL x (ADDL y x)) - // result: (LEAL2 y x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ADDL { - break - } - _ = v_1.Args[1] - y := v_1.Args[0] - if x != v_1.Args[1] { - break - } - v.reset(OpAMD64LEAL2) - v.AddArg(y) - v.AddArg(x) - return true - } - // match: (ADDL (ADDL x y) x) - // result: (LEAL2 y x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDL { - break - } - y := v_0.Args[1] - if x != v_0.Args[0] { - break - } - v.reset(OpAMD64LEAL2) - v.AddArg(y) - v.AddArg(x) - return true - } - // match: (ADDL (ADDL y x) x) - // result: (LEAL2 y x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDL { - break - } - _ = v_0.Args[1] - y := v_0.Args[0] - if x != v_0.Args[1] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64ADDL { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + if x != v_1.Args[_i1] { + continue + } + y := v_1.Args[1^_i1] + v.reset(OpAMD64LEAL2) + v.AddArg(y) + v.AddArg(x) + return true + } } - v.reset(OpAMD64LEAL2) - v.AddArg(y) - v.AddArg(x) - return true + break } - return false -} -func rewriteValueAMD64_OpAMD64ADDL_20(v *Value) bool { // match: (ADDL (ADDLconst [c] x) y) // result: (LEAL1 [c] x y) - for { - y := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDLconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v.reset(OpAMD64LEAL1) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADDL y (ADDLconst [c] x)) - // result: (LEAL1 [c] x y) for { _ = v.Args[1] - y := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ADDLconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64ADDLconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + y := v.Args[1^_i0] + v.reset(OpAMD64LEAL1) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true } - c := v_1.AuxInt - x := v_1.Args[0] - v.reset(OpAMD64LEAL1) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true + break } + return false +} +func rewriteValueAMD64_OpAMD64ADDL_10(v *Value) bool { // match: (ADDL x (LEAL [c] {s} y)) // cond: x.Op != OpSB && y.Op != OpSB // result: (LEAL1 [c] {s} x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64LEAL { - break - } - c := v_1.AuxInt - s := v_1.Aux - y := v_1.Args[0] - if !(x.Op != OpSB && y.Op != OpSB) { - break - } - v.reset(OpAMD64LEAL1) - v.AuxInt = c - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADDL (LEAL [c] {s} y) x) - // cond: x.Op != OpSB && y.Op != OpSB - // result: (LEAL1 [c] {s} x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64LEAL { - break - } - c := v_0.AuxInt - s := v_0.Aux - y := v_0.Args[0] - if !(x.Op != OpSB && y.Op != OpSB) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64LEAL { + continue + } + c := v_1.AuxInt + s := v_1.Aux + y := v_1.Args[0] + if !(x.Op != OpSB && y.Op != OpSB) { + continue + } + v.reset(OpAMD64LEAL1) + v.AuxInt = c + v.Aux = s + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpAMD64LEAL1) - v.AuxInt = c - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (ADDL x (NEGL y)) // result: (SUBL x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64NEGL { - break - } - y := v_1.Args[0] - v.reset(OpAMD64SUBL) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADDL (NEGL y) x) - // result: (SUBL x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64NEGL { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64NEGL { + continue + } + y := v_1.Args[0] + v.reset(OpAMD64SUBL) + v.AddArg(x) + v.AddArg(y) + return true } - y := v_0.Args[0] - v.reset(OpAMD64SUBL) - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (ADDL x l:(MOVLload [off] {sym} ptr mem)) // cond: canMergeLoadClobber(v, l, x) && clobber(l) // result: (ADDLload x [off] {sym} ptr mem) for { _ = v.Args[1] - x := v.Args[0] - l := v.Args[1] - if l.Op != OpAMD64MOVLload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break - } - v.reset(OpAMD64ADDLload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (ADDL l:(MOVLload [off] {sym} ptr mem) x) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (ADDLload x [off] {sym} ptr mem) - for { - x := v.Args[1] - l := v.Args[0] - if l.Op != OpAMD64MOVLload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != OpAMD64MOVLload { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[1] + ptr := l.Args[0] + if !(canMergeLoadClobber(v, l, x) && clobber(l)) { + continue + } + v.reset(OpAMD64ADDLload) + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - v.reset(OpAMD64ADDLload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true + break } return false } @@ -2162,441 +1907,243 @@ func rewriteValueAMD64_OpAMD64ADDQ_0(v *Value) bool { // result: (ADDQconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVQconst { - break - } - c := v_1.AuxInt - if !(is32Bit(c)) { - break - } - v.reset(OpAMD64ADDQconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ADDQ (MOVQconst [c]) x) - // cond: is32Bit(c) - // result: (ADDQconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVQconst { - break - } - c := v_0.AuxInt - if !(is32Bit(c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64MOVQconst { + continue + } + c := v_1.AuxInt + if !(is32Bit(c)) { + continue + } + v.reset(OpAMD64ADDQconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpAMD64ADDQconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (ADDQ (SHLQconst x [c]) (SHRQconst x [d])) // cond: d==64-c // result: (ROLQconst x [c]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLQconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHRQconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(d == 64-c) { - break - } - v.reset(OpAMD64ROLQconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ADDQ (SHRQconst x [d]) (SHLQconst x [c])) - // cond: d==64-c - // result: (ROLQconst x [c]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHRQconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLQconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(d == 64-c) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64SHLQconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64SHRQconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(d == 64-c) { + continue + } + v.reset(OpAMD64ROLQconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpAMD64ROLQconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (ADDQ x (SHLQconst [3] y)) // result: (LEAQ8 x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLQconst || v_1.AuxInt != 3 { - break - } - y := v_1.Args[0] - v.reset(OpAMD64LEAQ8) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADDQ (SHLQconst [3] y) x) - // result: (LEAQ8 x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLQconst || v_0.AuxInt != 3 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64SHLQconst || v_1.AuxInt != 3 { + continue + } + y := v_1.Args[0] + v.reset(OpAMD64LEAQ8) + v.AddArg(x) + v.AddArg(y) + return true } - y := v_0.Args[0] - v.reset(OpAMD64LEAQ8) - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (ADDQ x (SHLQconst [2] y)) // result: (LEAQ4 x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLQconst || v_1.AuxInt != 2 { - break - } - y := v_1.Args[0] - v.reset(OpAMD64LEAQ4) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADDQ (SHLQconst [2] y) x) - // result: (LEAQ4 x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLQconst || v_0.AuxInt != 2 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64SHLQconst || v_1.AuxInt != 2 { + continue + } + y := v_1.Args[0] + v.reset(OpAMD64LEAQ4) + v.AddArg(x) + v.AddArg(y) + return true } - y := v_0.Args[0] - v.reset(OpAMD64LEAQ4) - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (ADDQ x (SHLQconst [1] y)) // result: (LEAQ2 x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLQconst || v_1.AuxInt != 1 { - break - } - y := v_1.Args[0] - v.reset(OpAMD64LEAQ2) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADDQ (SHLQconst [1] y) x) - // result: (LEAQ2 x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLQconst || v_0.AuxInt != 1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64SHLQconst || v_1.AuxInt != 1 { + continue + } + y := v_1.Args[0] + v.reset(OpAMD64LEAQ2) + v.AddArg(x) + v.AddArg(y) + return true } - y := v_0.Args[0] - v.reset(OpAMD64LEAQ2) - v.AddArg(x) - v.AddArg(y) - return true + break } - return false -} -func rewriteValueAMD64_OpAMD64ADDQ_10(v *Value) bool { // match: (ADDQ x (ADDQ y y)) // result: (LEAQ2 x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ADDQ { - break - } - y := v_1.Args[1] - if y != v_1.Args[0] { - break - } - v.reset(OpAMD64LEAQ2) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADDQ (ADDQ y y) x) - // result: (LEAQ2 x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQ { - break - } - y := v_0.Args[1] - if y != v_0.Args[0] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64ADDQ { + continue + } + y := v_1.Args[1] + if y != v_1.Args[0] { + continue + } + v.reset(OpAMD64LEAQ2) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpAMD64LEAQ2) - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (ADDQ x (ADDQ x y)) // result: (LEAQ2 y x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ADDQ { - break - } - y := v_1.Args[1] - if x != v_1.Args[0] { - break - } - v.reset(OpAMD64LEAQ2) - v.AddArg(y) - v.AddArg(x) - return true - } - // match: (ADDQ x (ADDQ y x)) - // result: (LEAQ2 y x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ADDQ { - break - } - _ = v_1.Args[1] - y := v_1.Args[0] - if x != v_1.Args[1] { - break - } - v.reset(OpAMD64LEAQ2) - v.AddArg(y) - v.AddArg(x) - return true - } - // match: (ADDQ (ADDQ x y) x) - // result: (LEAQ2 y x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQ { - break - } - y := v_0.Args[1] - if x != v_0.Args[0] { - break - } - v.reset(OpAMD64LEAQ2) - v.AddArg(y) - v.AddArg(x) - return true - } - // match: (ADDQ (ADDQ y x) x) - // result: (LEAQ2 y x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQ { - break - } - _ = v_0.Args[1] - y := v_0.Args[0] - if x != v_0.Args[1] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64ADDQ { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + if x != v_1.Args[_i1] { + continue + } + y := v_1.Args[1^_i1] + v.reset(OpAMD64LEAQ2) + v.AddArg(y) + v.AddArg(x) + return true + } } - v.reset(OpAMD64LEAQ2) - v.AddArg(y) - v.AddArg(x) - return true + break } // match: (ADDQ (ADDQconst [c] x) y) // result: (LEAQ1 [c] x y) - for { - y := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v.reset(OpAMD64LEAQ1) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADDQ y (ADDQconst [c] x)) - // result: (LEAQ1 [c] x y) for { _ = v.Args[1] - y := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ADDQconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64ADDQconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + y := v.Args[1^_i0] + v.reset(OpAMD64LEAQ1) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true } - c := v_1.AuxInt - x := v_1.Args[0] - v.reset(OpAMD64LEAQ1) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (ADDQ x (LEAQ [c] {s} y)) // cond: x.Op != OpSB && y.Op != OpSB // result: (LEAQ1 [c] {s} x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64LEAQ { - break - } - c := v_1.AuxInt - s := v_1.Aux - y := v_1.Args[0] - if !(x.Op != OpSB && y.Op != OpSB) { - break - } - v.reset(OpAMD64LEAQ1) - v.AuxInt = c - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADDQ (LEAQ [c] {s} y) x) - // cond: x.Op != OpSB && y.Op != OpSB - // result: (LEAQ1 [c] {s} x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64LEAQ { - break - } - c := v_0.AuxInt - s := v_0.Aux - y := v_0.Args[0] - if !(x.Op != OpSB && y.Op != OpSB) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64LEAQ { + continue + } + c := v_1.AuxInt + s := v_1.Aux + y := v_1.Args[0] + if !(x.Op != OpSB && y.Op != OpSB) { + continue + } + v.reset(OpAMD64LEAQ1) + v.AuxInt = c + v.Aux = s + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpAMD64LEAQ1) - v.AuxInt = c - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true + break } - return false -} -func rewriteValueAMD64_OpAMD64ADDQ_20(v *Value) bool { // match: (ADDQ x (NEGQ y)) // result: (SUBQ x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64NEGQ { - break - } - y := v_1.Args[0] - v.reset(OpAMD64SUBQ) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADDQ (NEGQ y) x) - // result: (SUBQ x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64NEGQ { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64NEGQ { + continue + } + y := v_1.Args[0] + v.reset(OpAMD64SUBQ) + v.AddArg(x) + v.AddArg(y) + return true } - y := v_0.Args[0] - v.reset(OpAMD64SUBQ) - v.AddArg(x) - v.AddArg(y) - return true + break } + return false +} +func rewriteValueAMD64_OpAMD64ADDQ_10(v *Value) bool { // match: (ADDQ x l:(MOVQload [off] {sym} ptr mem)) // cond: canMergeLoadClobber(v, l, x) && clobber(l) // result: (ADDQload x [off] {sym} ptr mem) for { _ = v.Args[1] - x := v.Args[0] - l := v.Args[1] - if l.Op != OpAMD64MOVQload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break - } - v.reset(OpAMD64ADDQload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (ADDQ l:(MOVQload [off] {sym} ptr mem) x) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (ADDQload x [off] {sym} ptr mem) - for { - x := v.Args[1] - l := v.Args[0] - if l.Op != OpAMD64MOVQload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != OpAMD64MOVQload { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[1] + ptr := l.Args[0] + if !(canMergeLoadClobber(v, l, x) && clobber(l)) { + continue + } + v.reset(OpAMD64ADDQload) + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - v.reset(OpAMD64ADDQload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true + break } return false } @@ -2606,37 +2153,22 @@ func rewriteValueAMD64_OpAMD64ADDQcarry_0(v *Value) bool { // result: (ADDQconstcarry x [c]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVQconst { - break - } - c := v_1.AuxInt - if !(is32Bit(c)) { - break - } - v.reset(OpAMD64ADDQconstcarry) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ADDQcarry (MOVQconst [c]) x) - // cond: is32Bit(c) - // result: (ADDQconstcarry x [c]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVQconst { - break - } - c := v_0.AuxInt - if !(is32Bit(c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64MOVQconst { + continue + } + c := v_1.AuxInt + if !(is32Bit(c)) { + continue + } + v.reset(OpAMD64ADDQconstcarry) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpAMD64ADDQconstcarry) - v.AuxInt = c - v.AddArg(x) - return true + break } return false } @@ -3037,49 +2569,28 @@ func rewriteValueAMD64_OpAMD64ADDSD_0(v *Value) bool { // result: (ADDSDload x [off] {sym} ptr mem) for { _ = v.Args[1] - x := v.Args[0] - l := v.Args[1] - if l.Op != OpAMD64MOVSDload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break - } - v.reset(OpAMD64ADDSDload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (ADDSD l:(MOVSDload [off] {sym} ptr mem) x) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (ADDSDload x [off] {sym} ptr mem) - for { - x := v.Args[1] - l := v.Args[0] - if l.Op != OpAMD64MOVSDload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != OpAMD64MOVSDload { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[1] + ptr := l.Args[0] + if !(canMergeLoadClobber(v, l, x) && clobber(l)) { + continue + } + v.reset(OpAMD64ADDSDload) + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - v.reset(OpAMD64ADDSDload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true + break } return false } @@ -3169,49 +2680,28 @@ func rewriteValueAMD64_OpAMD64ADDSS_0(v *Value) bool { // result: (ADDSSload x [off] {sym} ptr mem) for { _ = v.Args[1] - x := v.Args[0] - l := v.Args[1] - if l.Op != OpAMD64MOVSSload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break - } - v.reset(OpAMD64ADDSSload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (ADDSS l:(MOVSSload [off] {sym} ptr mem) x) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (ADDSSload x [off] {sym} ptr mem) - for { - x := v.Args[1] - l := v.Args[0] - if l.Op != OpAMD64MOVSSload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != OpAMD64MOVSSload { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[1] + ptr := l.Args[0] + if !(canMergeLoadClobber(v, l, x) && clobber(l)) { + continue + } + v.reset(OpAMD64ADDSSload) + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - v.reset(OpAMD64ADDSSload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true + break } return false } @@ -3299,123 +2789,78 @@ func rewriteValueAMD64_OpAMD64ANDL_0(v *Value) bool { // match: (ANDL (NOTL (SHLL (MOVLconst [1]) y)) x) // result: (BTRL x y) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64NOTL { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SHLL { - break - } - y := v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64MOVLconst || v_0_0_0.AuxInt != 1 { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64NOTL { + continue + } + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpAMD64SHLL { + continue + } + y := v_0_0.Args[1] + v_0_0_0 := v_0_0.Args[0] + if v_0_0_0.Op != OpAMD64MOVLconst || v_0_0_0.AuxInt != 1 { + continue + } + x := v.Args[1^_i0] + v.reset(OpAMD64BTRL) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpAMD64BTRL) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (ANDL x (NOTL (SHLL (MOVLconst [1]) y))) - // result: (BTRL x y) + // match: (ANDL (MOVLconst [c]) x) + // cond: isUint32PowerOfTwo(^c) && uint64(^c) >= 128 + // result: (BTRLconst [log2uint32(^c)] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64NOTL { - break - } - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SHLL { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64MOVLconst { + continue + } + c := v_0.AuxInt + x := v.Args[1^_i0] + if !(isUint32PowerOfTwo(^c) && uint64(^c) >= 128) { + continue + } + v.reset(OpAMD64BTRLconst) + v.AuxInt = log2uint32(^c) + v.AddArg(x) + return true } - y := v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAMD64MOVLconst || v_1_0_0.AuxInt != 1 { - break + break + } + // match: (ANDL x (MOVLconst [c])) + // result: (ANDLconst [c] x) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64MOVLconst { + continue + } + c := v_1.AuxInt + v.reset(OpAMD64ANDLconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpAMD64BTRL) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (ANDL (MOVLconst [c]) x) - // cond: isUint32PowerOfTwo(^c) && uint64(^c) >= 128 - // result: (BTRLconst [log2uint32(^c)] x) + // match: (ANDL x x) + // result: x for { x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVLconst { - break - } - c := v_0.AuxInt - if !(isUint32PowerOfTwo(^c) && uint64(^c) >= 128) { + if x != v.Args[0] { break } - v.reset(OpAMD64BTRLconst) - v.AuxInt = log2uint32(^c) - v.AddArg(x) - return true - } - // match: (ANDL x (MOVLconst [c])) - // cond: isUint32PowerOfTwo(^c) && uint64(^c) >= 128 - // result: (BTRLconst [log2uint32(^c)] x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVLconst { - break - } - c := v_1.AuxInt - if !(isUint32PowerOfTwo(^c) && uint64(^c) >= 128) { - break - } - v.reset(OpAMD64BTRLconst) - v.AuxInt = log2uint32(^c) - v.AddArg(x) - return true - } - // match: (ANDL x (MOVLconst [c])) - // result: (ANDLconst [c] x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVLconst { - break - } - c := v_1.AuxInt - v.reset(OpAMD64ANDLconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ANDL (MOVLconst [c]) x) - // result: (ANDLconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVLconst { - break - } - c := v_0.AuxInt - v.reset(OpAMD64ANDLconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ANDL x x) - // result: x - for { - x := v.Args[1] - if x != v.Args[0] { - break - } - v.reset(OpCopy) - v.Type = x.Type + v.reset(OpCopy) + v.Type = x.Type v.AddArg(x) return true } @@ -3424,49 +2869,28 @@ func rewriteValueAMD64_OpAMD64ANDL_0(v *Value) bool { // result: (ANDLload x [off] {sym} ptr mem) for { _ = v.Args[1] - x := v.Args[0] - l := v.Args[1] - if l.Op != OpAMD64MOVLload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break - } - v.reset(OpAMD64ANDLload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (ANDL l:(MOVLload [off] {sym} ptr mem) x) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (ANDLload x [off] {sym} ptr mem) - for { - x := v.Args[1] - l := v.Args[0] - if l.Op != OpAMD64MOVLload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != OpAMD64MOVLload { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[1] + ptr := l.Args[0] + if !(canMergeLoadClobber(v, l, x) && clobber(l)) { + continue + } + v.reset(OpAMD64ANDLload) + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - v.reset(OpAMD64ANDLload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true + break } return false } @@ -3765,122 +3189,73 @@ func rewriteValueAMD64_OpAMD64ANDLmodify_0(v *Value) bool { func rewriteValueAMD64_OpAMD64ANDQ_0(v *Value) bool { // match: (ANDQ (NOTQ (SHLQ (MOVQconst [1]) y)) x) // result: (BTRQ x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64NOTQ { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SHLQ { - break - } - y := v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64MOVQconst || v_0_0_0.AuxInt != 1 { - break - } - v.reset(OpAMD64BTRQ) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ANDQ x (NOTQ (SHLQ (MOVQconst [1]) y))) - // result: (BTRQ x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64NOTQ { - break - } - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SHLQ { - break - } - y := v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAMD64MOVQconst || v_1_0_0.AuxInt != 1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64NOTQ { + continue + } + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpAMD64SHLQ { + continue + } + y := v_0_0.Args[1] + v_0_0_0 := v_0_0.Args[0] + if v_0_0_0.Op != OpAMD64MOVQconst || v_0_0_0.AuxInt != 1 { + continue + } + x := v.Args[1^_i0] + v.reset(OpAMD64BTRQ) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpAMD64BTRQ) - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (ANDQ (MOVQconst [c]) x) // cond: isUint64PowerOfTwo(^c) && uint64(^c) >= 128 // result: (BTRQconst [log2(^c)] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVQconst { - break - } - c := v_0.AuxInt - if !(isUint64PowerOfTwo(^c) && uint64(^c) >= 128) { - break - } - v.reset(OpAMD64BTRQconst) - v.AuxInt = log2(^c) - v.AddArg(x) - return true - } - // match: (ANDQ x (MOVQconst [c])) - // cond: isUint64PowerOfTwo(^c) && uint64(^c) >= 128 - // result: (BTRQconst [log2(^c)] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVQconst { - break - } - c := v_1.AuxInt - if !(isUint64PowerOfTwo(^c) && uint64(^c) >= 128) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64MOVQconst { + continue + } + c := v_0.AuxInt + x := v.Args[1^_i0] + if !(isUint64PowerOfTwo(^c) && uint64(^c) >= 128) { + continue + } + v.reset(OpAMD64BTRQconst) + v.AuxInt = log2(^c) + v.AddArg(x) + return true } - v.reset(OpAMD64BTRQconst) - v.AuxInt = log2(^c) - v.AddArg(x) - return true + break } // match: (ANDQ x (MOVQconst [c])) // cond: is32Bit(c) // result: (ANDQconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVQconst { - break - } - c := v_1.AuxInt - if !(is32Bit(c)) { - break - } - v.reset(OpAMD64ANDQconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ANDQ (MOVQconst [c]) x) - // cond: is32Bit(c) - // result: (ANDQconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVQconst { - break - } - c := v_0.AuxInt - if !(is32Bit(c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64MOVQconst { + continue + } + c := v_1.AuxInt + if !(is32Bit(c)) { + continue + } + v.reset(OpAMD64ANDQconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpAMD64ANDQconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (ANDQ x x) // result: x @@ -3899,49 +3274,28 @@ func rewriteValueAMD64_OpAMD64ANDQ_0(v *Value) bool { // result: (ANDQload x [off] {sym} ptr mem) for { _ = v.Args[1] - x := v.Args[0] - l := v.Args[1] - if l.Op != OpAMD64MOVQload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break - } - v.reset(OpAMD64ANDQload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (ANDQ l:(MOVQload [off] {sym} ptr mem) x) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (ANDQload x [off] {sym} ptr mem) - for { - x := v.Args[1] - l := v.Args[0] - if l.Op != OpAMD64MOVQload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != OpAMD64MOVQload { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[1] + ptr := l.Args[0] + if !(canMergeLoadClobber(v, l, x) && clobber(l)) { + continue + } + v.reset(OpAMD64ANDQload) + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - v.reset(OpAMD64ANDQload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true + break } return false } @@ -10208,39 +9562,21 @@ func rewriteValueAMD64_OpAMD64LEAL_0(v *Value) bool { if v_0.Op != OpAMD64ADDL { break } - y := v_0.Args[1] - x := v_0.Args[0] - if !(x.Op != OpSB && y.Op != OpSB) { - break - } - v.reset(OpAMD64LEAL1) - v.AuxInt = c - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (LEAL [c] {s} (ADDL y x)) - // cond: x.Op != OpSB && y.Op != OpSB - // result: (LEAL1 [c] {s} x y) - for { - c := v.AuxInt - s := v.Aux - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDL { - break - } - x := v_0.Args[1] - y := v_0.Args[0] - if !(x.Op != OpSB && y.Op != OpSB) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v_0.Args[_i0] + y := v_0.Args[1^_i0] + if !(x.Op != OpSB && y.Op != OpSB) { + continue + } + v.reset(OpAMD64LEAL1) + v.AuxInt = c + v.Aux = s + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpAMD64LEAL1) - v.AuxInt = c - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true + break } return false } @@ -10248,49 +9584,29 @@ func rewriteValueAMD64_OpAMD64LEAL1_0(v *Value) bool { // match: (LEAL1 [c] {s} (ADDLconst [d] x) y) // cond: is32Bit(c+d) && x.Op != OpSB // result: (LEAL1 [c+d] {s} x y) - for { - c := v.AuxInt - s := v.Aux - y := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDLconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - if !(is32Bit(c+d) && x.Op != OpSB) { - break - } - v.reset(OpAMD64LEAL1) - v.AuxInt = c + d - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (LEAL1 [c] {s} y (ADDLconst [d] x)) - // cond: is32Bit(c+d) && x.Op != OpSB - // result: (LEAL1 [c+d] {s} x y) for { c := v.AuxInt s := v.Aux _ = v.Args[1] - y := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ADDLconst { - break - } - d := v_1.AuxInt - x := v_1.Args[0] - if !(is32Bit(c+d) && x.Op != OpSB) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64ADDLconst { + continue + } + d := v_0.AuxInt + x := v_0.Args[0] + y := v.Args[1^_i0] + if !(is32Bit(c+d) && x.Op != OpSB) { + continue + } + v.reset(OpAMD64LEAL1) + v.AuxInt = c + d + v.Aux = s + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpAMD64LEAL1) - v.AuxInt = c + d - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (LEAL1 [c] {s} x (SHLLconst [1] y)) // result: (LEAL2 [c] {s} x y) @@ -10298,36 +9614,21 @@ func rewriteValueAMD64_OpAMD64LEAL1_0(v *Value) bool { c := v.AuxInt s := v.Aux _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLLconst || v_1.AuxInt != 1 { - break - } - y := v_1.Args[0] - v.reset(OpAMD64LEAL2) - v.AuxInt = c - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (LEAL1 [c] {s} (SHLLconst [1] y) x) - // result: (LEAL2 [c] {s} x y) - for { - c := v.AuxInt - s := v.Aux - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLLconst || v_0.AuxInt != 1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64SHLLconst || v_1.AuxInt != 1 { + continue + } + y := v_1.Args[0] + v.reset(OpAMD64LEAL2) + v.AuxInt = c + v.Aux = s + v.AddArg(x) + v.AddArg(y) + return true } - y := v_0.Args[0] - v.reset(OpAMD64LEAL2) - v.AuxInt = c - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (LEAL1 [c] {s} x (SHLLconst [2] y)) // result: (LEAL4 [c] {s} x y) @@ -10335,36 +9636,21 @@ func rewriteValueAMD64_OpAMD64LEAL1_0(v *Value) bool { c := v.AuxInt s := v.Aux _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLLconst || v_1.AuxInt != 2 { - break - } - y := v_1.Args[0] - v.reset(OpAMD64LEAL4) - v.AuxInt = c - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (LEAL1 [c] {s} (SHLLconst [2] y) x) - // result: (LEAL4 [c] {s} x y) - for { - c := v.AuxInt - s := v.Aux - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLLconst || v_0.AuxInt != 2 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64SHLLconst || v_1.AuxInt != 2 { + continue + } + y := v_1.Args[0] + v.reset(OpAMD64LEAL4) + v.AuxInt = c + v.Aux = s + v.AddArg(x) + v.AddArg(y) + return true } - y := v_0.Args[0] - v.reset(OpAMD64LEAL4) - v.AuxInt = c - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (LEAL1 [c] {s} x (SHLLconst [3] y)) // result: (LEAL8 [c] {s} x y) @@ -10372,36 +9658,21 @@ func rewriteValueAMD64_OpAMD64LEAL1_0(v *Value) bool { c := v.AuxInt s := v.Aux _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLLconst || v_1.AuxInt != 3 { - break - } - y := v_1.Args[0] - v.reset(OpAMD64LEAL8) - v.AuxInt = c - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (LEAL1 [c] {s} (SHLLconst [3] y) x) - // result: (LEAL8 [c] {s} x y) - for { - c := v.AuxInt - s := v.Aux - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLLconst || v_0.AuxInt != 3 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64SHLLconst || v_1.AuxInt != 3 { + continue + } + y := v_1.Args[0] + v.reset(OpAMD64LEAL8) + v.AuxInt = c + v.Aux = s + v.AddArg(x) + v.AddArg(y) + return true } - y := v_0.Args[0] - v.reset(OpAMD64LEAL8) - v.AuxInt = c - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true + break } return false } @@ -10644,39 +9915,21 @@ func rewriteValueAMD64_OpAMD64LEAQ_0(v *Value) bool { if v_0.Op != OpAMD64ADDQ { break } - y := v_0.Args[1] - x := v_0.Args[0] - if !(x.Op != OpSB && y.Op != OpSB) { - break - } - v.reset(OpAMD64LEAQ1) - v.AuxInt = c - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (LEAQ [c] {s} (ADDQ y x)) - // cond: x.Op != OpSB && y.Op != OpSB - // result: (LEAQ1 [c] {s} x y) - for { - c := v.AuxInt - s := v.Aux - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQ { - break - } - x := v_0.Args[1] - y := v_0.Args[0] - if !(x.Op != OpSB && y.Op != OpSB) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v_0.Args[_i0] + y := v_0.Args[1^_i0] + if !(x.Op != OpSB && y.Op != OpSB) { + continue + } + v.reset(OpAMD64LEAQ1) + v.AuxInt = c + v.Aux = s + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpAMD64LEAQ1) - v.AuxInt = c - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (LEAQ [off1] {sym1} (LEAQ [off2] {sym2} x)) // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) @@ -10802,49 +10055,29 @@ func rewriteValueAMD64_OpAMD64LEAQ1_0(v *Value) bool { // match: (LEAQ1 [c] {s} (ADDQconst [d] x) y) // cond: is32Bit(c+d) && x.Op != OpSB // result: (LEAQ1 [c+d] {s} x y) - for { - c := v.AuxInt - s := v.Aux - y := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - if !(is32Bit(c+d) && x.Op != OpSB) { - break - } - v.reset(OpAMD64LEAQ1) - v.AuxInt = c + d - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (LEAQ1 [c] {s} y (ADDQconst [d] x)) - // cond: is32Bit(c+d) && x.Op != OpSB - // result: (LEAQ1 [c+d] {s} x y) for { c := v.AuxInt s := v.Aux _ = v.Args[1] - y := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ADDQconst { - break - } - d := v_1.AuxInt - x := v_1.Args[0] - if !(is32Bit(c+d) && x.Op != OpSB) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64ADDQconst { + continue + } + d := v_0.AuxInt + x := v_0.Args[0] + y := v.Args[1^_i0] + if !(is32Bit(c+d) && x.Op != OpSB) { + continue + } + v.reset(OpAMD64LEAQ1) + v.AuxInt = c + d + v.Aux = s + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpAMD64LEAQ1) - v.AuxInt = c + d - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (LEAQ1 [c] {s} x (SHLQconst [1] y)) // result: (LEAQ2 [c] {s} x y) @@ -10852,36 +10085,21 @@ func rewriteValueAMD64_OpAMD64LEAQ1_0(v *Value) bool { c := v.AuxInt s := v.Aux _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLQconst || v_1.AuxInt != 1 { - break - } - y := v_1.Args[0] - v.reset(OpAMD64LEAQ2) - v.AuxInt = c - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (LEAQ1 [c] {s} (SHLQconst [1] y) x) - // result: (LEAQ2 [c] {s} x y) - for { - c := v.AuxInt - s := v.Aux - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLQconst || v_0.AuxInt != 1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64SHLQconst || v_1.AuxInt != 1 { + continue + } + y := v_1.Args[0] + v.reset(OpAMD64LEAQ2) + v.AuxInt = c + v.Aux = s + v.AddArg(x) + v.AddArg(y) + return true } - y := v_0.Args[0] - v.reset(OpAMD64LEAQ2) - v.AuxInt = c - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (LEAQ1 [c] {s} x (SHLQconst [2] y)) // result: (LEAQ4 [c] {s} x y) @@ -10889,36 +10107,21 @@ func rewriteValueAMD64_OpAMD64LEAQ1_0(v *Value) bool { c := v.AuxInt s := v.Aux _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLQconst || v_1.AuxInt != 2 { - break - } - y := v_1.Args[0] - v.reset(OpAMD64LEAQ4) - v.AuxInt = c - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (LEAQ1 [c] {s} (SHLQconst [2] y) x) - // result: (LEAQ4 [c] {s} x y) - for { - c := v.AuxInt - s := v.Aux - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLQconst || v_0.AuxInt != 2 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64SHLQconst || v_1.AuxInt != 2 { + continue + } + y := v_1.Args[0] + v.reset(OpAMD64LEAQ4) + v.AuxInt = c + v.Aux = s + v.AddArg(x) + v.AddArg(y) + return true } - y := v_0.Args[0] - v.reset(OpAMD64LEAQ4) - v.AuxInt = c - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (LEAQ1 [c] {s} x (SHLQconst [3] y)) // result: (LEAQ8 [c] {s} x y) @@ -10926,85 +10129,49 @@ func rewriteValueAMD64_OpAMD64LEAQ1_0(v *Value) bool { c := v.AuxInt s := v.Aux _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLQconst || v_1.AuxInt != 3 { - break - } - y := v_1.Args[0] - v.reset(OpAMD64LEAQ8) - v.AuxInt = c - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (LEAQ1 [c] {s} (SHLQconst [3] y) x) - // result: (LEAQ8 [c] {s} x y) - for { - c := v.AuxInt - s := v.Aux - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLQconst || v_0.AuxInt != 3 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64SHLQconst || v_1.AuxInt != 3 { + continue + } + y := v_1.Args[0] + v.reset(OpAMD64LEAQ8) + v.AuxInt = c + v.Aux = s + v.AddArg(x) + v.AddArg(y) + return true } - y := v_0.Args[0] - v.reset(OpAMD64LEAQ8) - v.AuxInt = c - v.Aux = s - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (LEAQ1 [off1] {sym1} (LEAQ [off2] {sym2} x) y) // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB // result: (LEAQ1 [off1+off2] {mergeSym(sym1,sym2)} x y) - for { - off1 := v.AuxInt - sym1 := v.Aux - y := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64LEAQ { - break - } - off2 := v_0.AuxInt - sym2 := v_0.Aux - x := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { - break - } - v.reset(OpAMD64LEAQ1) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (LEAQ1 [off1] {sym1} y (LEAQ [off2] {sym2} x)) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB - // result: (LEAQ1 [off1+off2] {mergeSym(sym1,sym2)} x y) for { off1 := v.AuxInt sym1 := v.Aux _ = v.Args[1] - y := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64LEAQ { - break - } - off2 := v_1.AuxInt - sym2 := v_1.Aux - x := v_1.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64LEAQ { + continue + } + off2 := v_0.AuxInt + sym2 := v_0.Aux + x := v_0.Args[0] + y := v.Args[1^_i0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { + continue + } + v.reset(OpAMD64LEAQ1) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpAMD64LEAQ1) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(x) - v.AddArg(y) - return true + break } return false } @@ -11801,42 +10968,22 @@ func rewriteValueAMD64_OpAMD64MOVBload_0(v *Value) bool { if v_0.Op != OpAMD64ADDQ { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(ptr.Op != OpSB) { - break - } - v.reset(OpAMD64MOVBloadidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVBload [off] {sym} (ADDQ idx ptr) mem) - // cond: ptr.Op != OpSB - // result: (MOVBloadidx1 [off] {sym} ptr idx mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQ { - break - } - ptr := v_0.Args[1] - idx := v_0.Args[0] - if !(ptr.Op != OpSB) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + if !(ptr.Op != OpSB) { + continue + } + v.reset(OpAMD64MOVBloadidx1) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpAMD64MOVBloadidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } // match: (MOVBload [off1] {sym1} (LEAL [off2] {sym2} base) mem) // cond: canMergeSym(sym1, sym2) && is32Bit(off1+off2) @@ -11910,48 +11057,26 @@ func rewriteValueAMD64_OpAMD64MOVBloadidx1_0(v *Value) bool { c := v.AuxInt sym := v.Aux mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQconst { - break - } - d := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - if !(is32Bit(c + d)) { - break - } - v.reset(OpAMD64MOVBloadidx1) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVBloadidx1 [c] {sym} idx (ADDQconst [d] ptr) mem) - // cond: is32Bit(c+d) - // result: (MOVBloadidx1 [c+d] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - idx := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ADDQconst { - break - } - d := v_1.AuxInt - ptr := v_1.Args[0] - if !(is32Bit(c + d)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64ADDQconst { + continue + } + d := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1^_i0] + if !(is32Bit(c + d)) { + continue + } + v.reset(OpAMD64MOVBloadidx1) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpAMD64MOVBloadidx1) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } // match: (MOVBloadidx1 [c] {sym} ptr (ADDQconst [d] idx) mem) // cond: is32Bit(c+d) @@ -11960,48 +11085,26 @@ func rewriteValueAMD64_OpAMD64MOVBloadidx1_0(v *Value) bool { c := v.AuxInt sym := v.Aux mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ADDQconst { - break - } - d := v_1.AuxInt - idx := v_1.Args[0] - if !(is32Bit(c + d)) { - break - } - v.reset(OpAMD64MOVBloadidx1) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVBloadidx1 [c] {sym} (ADDQconst [d] idx) ptr mem) - // cond: is32Bit(c+d) - // result: (MOVBloadidx1 [c+d] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQconst { - break - } - d := v_0.AuxInt - idx := v_0.Args[0] - ptr := v.Args[1] - if !(is32Bit(c + d)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64ADDQconst { + continue + } + d := v_1.AuxInt + idx := v_1.Args[0] + if !(is32Bit(c + d)) { + continue + } + v.reset(OpAMD64MOVBloadidx1) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpAMD64MOVBloadidx1) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } // match: (MOVBloadidx1 [i] {s} p (MOVQconst [c]) mem) // cond: is32Bit(i+c) @@ -12010,44 +11113,24 @@ func rewriteValueAMD64_OpAMD64MOVBloadidx1_0(v *Value) bool { i := v.AuxInt s := v.Aux mem := v.Args[2] - p := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVQconst { - break - } - c := v_1.AuxInt - if !(is32Bit(i + c)) { - break - } - v.reset(OpAMD64MOVBload) - v.AuxInt = i + c - v.Aux = s - v.AddArg(p) - v.AddArg(mem) - return true - } - // match: (MOVBloadidx1 [i] {s} (MOVQconst [c]) p mem) - // cond: is32Bit(i+c) - // result: (MOVBload [i+c] {s} p mem) - for { - i := v.AuxInt - s := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVQconst { - break - } - c := v_0.AuxInt - p := v.Args[1] - if !(is32Bit(i + c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64MOVQconst { + continue + } + c := v_1.AuxInt + if !(is32Bit(i + c)) { + continue + } + v.reset(OpAMD64MOVBload) + v.AuxInt = i + c + v.Aux = s + v.AddArg(p) + v.AddArg(mem) + return true } - v.reset(OpAMD64MOVBload) - v.AuxInt = i + c - v.Aux = s - v.AddArg(p) - v.AddArg(mem) - return true + break } return false } @@ -12472,46 +11555,24 @@ func rewriteValueAMD64_OpAMD64MOVBstore_10(v *Value) bool { if v_0.Op != OpAMD64ADDQ { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + val := v.Args[1] + if !(ptr.Op != OpSB) { + continue + } + v.reset(OpAMD64MOVBstoreidx1) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true } - v.reset(OpAMD64MOVBstoreidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVBstore [off] {sym} (ADDQ idx ptr) val mem) - // cond: ptr.Op != OpSB - // result: (MOVBstoreidx1 [off] {sym} ptr idx val mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQ { - break - } - ptr := v_0.Args[1] - idx := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { - break - } - v.reset(OpAMD64MOVBstoreidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true + break } // match: (MOVBstore [i] {s} p w x0:(MOVBstore [i-1] {s} p (SHRWconst [8] w) mem)) // cond: x0.Uses == 1 && clobber(x0) @@ -12545,10 +11606,6 @@ func rewriteValueAMD64_OpAMD64MOVBstore_10(v *Value) bool { v.AddArg(mem) return true } - return false -} -func rewriteValueAMD64_OpAMD64MOVBstore_20(v *Value) bool { - b := v.Block // match: (MOVBstore [i] {s} p w x2:(MOVBstore [i-1] {s} p (SHRLconst [8] w) x1:(MOVBstore [i-2] {s} p (SHRLconst [16] w) x0:(MOVBstore [i-3] {s} p (SHRLconst [24] w) mem)))) // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2) // result: (MOVLstore [i-3] {s} p (BSWAPL w) mem) @@ -12604,6 +11661,11 @@ func rewriteValueAMD64_OpAMD64MOVBstore_20(v *Value) bool { v.AddArg(mem) return true } + return false +} +func rewriteValueAMD64_OpAMD64MOVBstore_20(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types // match: (MOVBstore [i] {s} p w x6:(MOVBstore [i-1] {s} p (SHRQconst [8] w) x5:(MOVBstore [i-2] {s} p (SHRQconst [16] w) x4:(MOVBstore [i-3] {s} p (SHRQconst [24] w) x3:(MOVBstore [i-4] {s} p (SHRQconst [32] w) x2:(MOVBstore [i-5] {s} p (SHRQconst [40] w) x1:(MOVBstore [i-6] {s} p (SHRQconst [48] w) x0:(MOVBstore [i-7] {s} p (SHRQconst [56] w) mem)))))))) // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) // result: (MOVQstore [i-7] {s} p (BSWAPQ w) mem) @@ -12949,11 +12011,6 @@ func rewriteValueAMD64_OpAMD64MOVBstore_20(v *Value) bool { v.AddArg(mem) return true } - return false -} -func rewriteValueAMD64_OpAMD64MOVBstore_30(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types // match: (MOVBstore [i] {s} p x1:(MOVBload [j] {s2} p2 mem) mem2:(MOVBstore [i-1] {s} p x2:(MOVBload [j-1] {s2} p2 mem) mem)) // cond: x1.Uses == 1 && x2.Uses == 1 && mem2.Uses == 1 && clobber(x1) && clobber(x2) && clobber(mem2) // result: (MOVWstore [i-1] {s} p (MOVWload [j-1] {s2} p2 mem) mem) @@ -12999,6 +12056,9 @@ func rewriteValueAMD64_OpAMD64MOVBstore_30(v *Value) bool { v.AddArg(mem) return true } + return false +} +func rewriteValueAMD64_OpAMD64MOVBstore_30(v *Value) bool { // match: (MOVBstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) // cond: canMergeSym(sym1, sym2) && is32Bit(off1+off2) // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) @@ -14373,42 +13433,22 @@ func rewriteValueAMD64_OpAMD64MOVLload_0(v *Value) bool { if v_0.Op != OpAMD64ADDQ { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(ptr.Op != OpSB) { - break - } - v.reset(OpAMD64MOVLloadidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVLload [off] {sym} (ADDQ idx ptr) mem) - // cond: ptr.Op != OpSB - // result: (MOVLloadidx1 [off] {sym} ptr idx mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQ { - break - } - ptr := v_0.Args[1] - idx := v_0.Args[0] - if !(ptr.Op != OpSB) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + if !(ptr.Op != OpSB) { + continue + } + v.reset(OpAMD64MOVLloadidx1) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpAMD64MOVLloadidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } // match: (MOVLload [off1] {sym1} (LEAL [off2] {sym2} base) mem) // cond: canMergeSym(sym1, sym2) && is32Bit(off1+off2) @@ -14457,11 +13497,6 @@ func rewriteValueAMD64_OpAMD64MOVLload_0(v *Value) bool { v.AddArg(mem) return true } - return false -} -func rewriteValueAMD64_OpAMD64MOVLload_10(v *Value) bool { - b := v.Block - config := b.Func.Config // match: (MOVLload [off] {sym} ptr (MOVSSstore [off] {sym} ptr val _)) // result: (MOVLf2i val) for { @@ -14482,6 +13517,11 @@ func rewriteValueAMD64_OpAMD64MOVLload_10(v *Value) bool { v.AddArg(val) return true } + return false +} +func rewriteValueAMD64_OpAMD64MOVLload_10(v *Value) bool { + b := v.Block + config := b.Func.Config // match: (MOVLload [off] {sym} (SB) _) // cond: symIsRO(sym) // result: (MOVQconst [int64(read32(sym, off, config.BigEndian))]) @@ -14506,39 +13546,22 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx1_0(v *Value) bool { c := v.AuxInt sym := v.Aux mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLQconst || v_1.AuxInt != 2 { - break - } - idx := v_1.Args[0] - v.reset(OpAMD64MOVLloadidx4) - v.AuxInt = c - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVLloadidx1 [c] {sym} (SHLQconst [2] idx) ptr mem) - // result: (MOVLloadidx4 [c] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLQconst || v_0.AuxInt != 2 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64SHLQconst || v_1.AuxInt != 2 { + continue + } + idx := v_1.Args[0] + v.reset(OpAMD64MOVLloadidx4) + v.AuxInt = c + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - idx := v_0.Args[0] - ptr := v.Args[1] - v.reset(OpAMD64MOVLloadidx4) - v.AuxInt = c - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } // match: (MOVLloadidx1 [c] {sym} ptr (SHLQconst [3] idx) mem) // result: (MOVLloadidx8 [c] {sym} ptr idx mem) @@ -14546,39 +13569,22 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx1_0(v *Value) bool { c := v.AuxInt sym := v.Aux mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLQconst || v_1.AuxInt != 3 { - break - } - idx := v_1.Args[0] - v.reset(OpAMD64MOVLloadidx8) - v.AuxInt = c - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVLloadidx1 [c] {sym} (SHLQconst [3] idx) ptr mem) - // result: (MOVLloadidx8 [c] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLQconst || v_0.AuxInt != 3 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64SHLQconst || v_1.AuxInt != 3 { + continue + } + idx := v_1.Args[0] + v.reset(OpAMD64MOVLloadidx8) + v.AuxInt = c + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - idx := v_0.Args[0] - ptr := v.Args[1] - v.reset(OpAMD64MOVLloadidx8) - v.AuxInt = c - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } // match: (MOVLloadidx1 [c] {sym} (ADDQconst [d] ptr) idx mem) // cond: is32Bit(c+d) @@ -14587,48 +13593,26 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx1_0(v *Value) bool { c := v.AuxInt sym := v.Aux mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQconst { - break - } - d := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - if !(is32Bit(c + d)) { - break - } - v.reset(OpAMD64MOVLloadidx1) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVLloadidx1 [c] {sym} idx (ADDQconst [d] ptr) mem) - // cond: is32Bit(c+d) - // result: (MOVLloadidx1 [c+d] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - idx := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ADDQconst { - break - } - d := v_1.AuxInt - ptr := v_1.Args[0] - if !(is32Bit(c + d)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64ADDQconst { + continue + } + d := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1^_i0] + if !(is32Bit(c + d)) { + continue + } + v.reset(OpAMD64MOVLloadidx1) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpAMD64MOVLloadidx1) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } // match: (MOVLloadidx1 [c] {sym} ptr (ADDQconst [d] idx) mem) // cond: is32Bit(c+d) @@ -14637,48 +13621,26 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx1_0(v *Value) bool { c := v.AuxInt sym := v.Aux mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ADDQconst { - break - } - d := v_1.AuxInt - idx := v_1.Args[0] - if !(is32Bit(c + d)) { - break - } - v.reset(OpAMD64MOVLloadidx1) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVLloadidx1 [c] {sym} (ADDQconst [d] idx) ptr mem) - // cond: is32Bit(c+d) - // result: (MOVLloadidx1 [c+d] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQconst { - break - } - d := v_0.AuxInt - idx := v_0.Args[0] - ptr := v.Args[1] - if !(is32Bit(c + d)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64ADDQconst { + continue + } + d := v_1.AuxInt + idx := v_1.Args[0] + if !(is32Bit(c + d)) { + continue + } + v.reset(OpAMD64MOVLloadidx1) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpAMD64MOVLloadidx1) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } // match: (MOVLloadidx1 [i] {s} p (MOVQconst [c]) mem) // cond: is32Bit(i+c) @@ -14687,44 +13649,24 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx1_0(v *Value) bool { i := v.AuxInt s := v.Aux mem := v.Args[2] - p := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVQconst { - break - } - c := v_1.AuxInt - if !(is32Bit(i + c)) { - break - } - v.reset(OpAMD64MOVLload) - v.AuxInt = i + c - v.Aux = s - v.AddArg(p) - v.AddArg(mem) - return true - } - // match: (MOVLloadidx1 [i] {s} (MOVQconst [c]) p mem) - // cond: is32Bit(i+c) - // result: (MOVLload [i+c] {s} p mem) - for { - i := v.AuxInt - s := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVQconst { - break - } - c := v_0.AuxInt - p := v.Args[1] - if !(is32Bit(i + c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64MOVQconst { + continue + } + c := v_1.AuxInt + if !(is32Bit(i + c)) { + continue + } + v.reset(OpAMD64MOVLload) + v.AuxInt = i + c + v.Aux = s + v.AddArg(p) + v.AddArg(mem) + return true } - v.reset(OpAMD64MOVLload) - v.AuxInt = i + c - v.Aux = s - v.AddArg(p) - v.AddArg(mem) - return true + break } return false } @@ -15113,52 +14055,30 @@ func rewriteValueAMD64_OpAMD64MOVLstore_0(v *Value) bool { if v_0.Op != OpAMD64ADDQ { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + val := v.Args[1] + if !(ptr.Op != OpSB) { + continue + } + v.reset(OpAMD64MOVLstoreidx1) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true } - v.reset(OpAMD64MOVLstoreidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true + break } return false } func rewriteValueAMD64_OpAMD64MOVLstore_10(v *Value) bool { b := v.Block typ := &b.Func.Config.Types - // match: (MOVLstore [off] {sym} (ADDQ idx ptr) val mem) - // cond: ptr.Op != OpSB - // result: (MOVLstoreidx1 [off] {sym} ptr idx val mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQ { - break - } - ptr := v_0.Args[1] - idx := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { - break - } - v.reset(OpAMD64MOVLstoreidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } // match: (MOVLstore [i] {s} p (SHRQconst [32] w) x:(MOVLstore [i-4] {s} p w mem)) // cond: x.Uses == 1 && clobber(x) // result: (MOVQstore [i-4] {s} p w mem) @@ -15418,41 +14338,9 @@ func rewriteValueAMD64_OpAMD64MOVLstore_10(v *Value) bool { v.AddArg(mem) return true } - return false -} -func rewriteValueAMD64_OpAMD64MOVLstore_20(v *Value) bool { // match: (MOVLstore {sym} [off] ptr y:(ADDL l:(MOVLload [off] {sym} ptr mem) x) mem) // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) // result: (ADDLmodify [off] {sym} ptr x mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - y := v.Args[1] - if y.Op != OpAMD64ADDL { - break - } - x := y.Args[1] - l := y.Args[0] - if l.Op != OpAMD64MOVLload || l.AuxInt != off || l.Aux != sym { - break - } - _ = l.Args[1] - if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { - break - } - v.reset(OpAMD64ADDLmodify) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true - } - // match: (MOVLstore {sym} [off] ptr y:(ADDL x l:(MOVLload [off] {sym} ptr mem)) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) - // result: (ADDLmodify [off] {sym} ptr x mem) for { off := v.AuxInt sym := v.Aux @@ -15463,23 +14351,32 @@ func rewriteValueAMD64_OpAMD64MOVLstore_20(v *Value) bool { break } _ = y.Args[1] - x := y.Args[0] - l := y.Args[1] - if l.Op != OpAMD64MOVLload || l.AuxInt != off || l.Aux != sym { - break - } - _ = l.Args[1] - if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + l := y.Args[_i0] + if l.Op != OpAMD64MOVLload || l.AuxInt != off || l.Aux != sym { + continue + } + _ = l.Args[1] + if ptr != l.Args[0] || mem != l.Args[1] { + continue + } + x := y.Args[1^_i0] + if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + continue + } + v.reset(OpAMD64ADDLmodify) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(x) + v.AddArg(mem) + return true } - v.reset(OpAMD64ADDLmodify) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true + break } + return false +} +func rewriteValueAMD64_OpAMD64MOVLstore_20(v *Value) bool { // match: (MOVLstore {sym} [off] ptr y:(SUBL l:(MOVLload [off] {sym} ptr mem) x) mem) // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) // result: (SUBLmodify [off] {sym} ptr x mem) @@ -15512,35 +14409,6 @@ func rewriteValueAMD64_OpAMD64MOVLstore_20(v *Value) bool { // match: (MOVLstore {sym} [off] ptr y:(ANDL l:(MOVLload [off] {sym} ptr mem) x) mem) // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) // result: (ANDLmodify [off] {sym} ptr x mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - y := v.Args[1] - if y.Op != OpAMD64ANDL { - break - } - x := y.Args[1] - l := y.Args[0] - if l.Op != OpAMD64MOVLload || l.AuxInt != off || l.Aux != sym { - break - } - _ = l.Args[1] - if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { - break - } - v.reset(OpAMD64ANDLmodify) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true - } - // match: (MOVLstore {sym} [off] ptr y:(ANDL x l:(MOVLload [off] {sym} ptr mem)) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) - // result: (ANDLmodify [off] {sym} ptr x mem) for { off := v.AuxInt sym := v.Aux @@ -15551,55 +14419,32 @@ func rewriteValueAMD64_OpAMD64MOVLstore_20(v *Value) bool { break } _ = y.Args[1] - x := y.Args[0] - l := y.Args[1] - if l.Op != OpAMD64MOVLload || l.AuxInt != off || l.Aux != sym { - break - } - _ = l.Args[1] - if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + l := y.Args[_i0] + if l.Op != OpAMD64MOVLload || l.AuxInt != off || l.Aux != sym { + continue + } + _ = l.Args[1] + if ptr != l.Args[0] || mem != l.Args[1] { + continue + } + x := y.Args[1^_i0] + if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + continue + } + v.reset(OpAMD64ANDLmodify) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(x) + v.AddArg(mem) + return true } - v.reset(OpAMD64ANDLmodify) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true + break } // match: (MOVLstore {sym} [off] ptr y:(ORL l:(MOVLload [off] {sym} ptr mem) x) mem) // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) // result: (ORLmodify [off] {sym} ptr x mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - y := v.Args[1] - if y.Op != OpAMD64ORL { - break - } - x := y.Args[1] - l := y.Args[0] - if l.Op != OpAMD64MOVLload || l.AuxInt != off || l.Aux != sym { - break - } - _ = l.Args[1] - if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { - break - } - v.reset(OpAMD64ORLmodify) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true - } - // match: (MOVLstore {sym} [off] ptr y:(ORL x l:(MOVLload [off] {sym} ptr mem)) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) - // result: (ORLmodify [off] {sym} ptr x mem) for { off := v.AuxInt sym := v.Aux @@ -15610,55 +14455,32 @@ func rewriteValueAMD64_OpAMD64MOVLstore_20(v *Value) bool { break } _ = y.Args[1] - x := y.Args[0] - l := y.Args[1] - if l.Op != OpAMD64MOVLload || l.AuxInt != off || l.Aux != sym { - break - } - _ = l.Args[1] - if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + l := y.Args[_i0] + if l.Op != OpAMD64MOVLload || l.AuxInt != off || l.Aux != sym { + continue + } + _ = l.Args[1] + if ptr != l.Args[0] || mem != l.Args[1] { + continue + } + x := y.Args[1^_i0] + if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + continue + } + v.reset(OpAMD64ORLmodify) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(x) + v.AddArg(mem) + return true } - v.reset(OpAMD64ORLmodify) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true + break } // match: (MOVLstore {sym} [off] ptr y:(XORL l:(MOVLload [off] {sym} ptr mem) x) mem) // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) // result: (XORLmodify [off] {sym} ptr x mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - y := v.Args[1] - if y.Op != OpAMD64XORL { - break - } - x := y.Args[1] - l := y.Args[0] - if l.Op != OpAMD64MOVLload || l.AuxInt != off || l.Aux != sym { - break - } - _ = l.Args[1] - if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { - break - } - v.reset(OpAMD64XORLmodify) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true - } - // match: (MOVLstore {sym} [off] ptr y:(XORL x l:(MOVLload [off] {sym} ptr mem)) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) - // result: (XORLmodify [off] {sym} ptr x mem) for { off := v.AuxInt sym := v.Aux @@ -15669,22 +14491,28 @@ func rewriteValueAMD64_OpAMD64MOVLstore_20(v *Value) bool { break } _ = y.Args[1] - x := y.Args[0] - l := y.Args[1] - if l.Op != OpAMD64MOVLload || l.AuxInt != off || l.Aux != sym { - break - } - _ = l.Args[1] - if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + l := y.Args[_i0] + if l.Op != OpAMD64MOVLload || l.AuxInt != off || l.Aux != sym { + continue + } + _ = l.Args[1] + if ptr != l.Args[0] || mem != l.Args[1] { + continue + } + x := y.Args[1^_i0] + if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + continue + } + v.reset(OpAMD64XORLmodify) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(x) + v.AddArg(mem) + return true } - v.reset(OpAMD64XORLmodify) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true + break } // match: (MOVLstore {sym} [off] ptr y:(BTCL l:(MOVLload [off] {sym} ptr mem) x) mem) // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) @@ -15715,9 +14543,6 @@ func rewriteValueAMD64_OpAMD64MOVLstore_20(v *Value) bool { v.AddArg(mem) return true } - return false -} -func rewriteValueAMD64_OpAMD64MOVLstore_30(v *Value) bool { // match: (MOVLstore {sym} [off] ptr y:(BTRL l:(MOVLload [off] {sym} ptr mem) x) mem) // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) // result: (BTRLmodify [off] {sym} ptr x mem) @@ -15863,6 +14688,9 @@ func rewriteValueAMD64_OpAMD64MOVLstore_30(v *Value) bool { v.AddArg(mem) return true } + return false +} +func rewriteValueAMD64_OpAMD64MOVLstore_30(v *Value) bool { // match: (MOVLstore [off] {sym} ptr a:(XORLconst [c] l:(MOVLload [off] {sym} ptr2 mem)) mem) // cond: isSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && validValAndOff(c,off) && clobber(l) && clobber(a) // result: (XORLconstmodify {sym} [makeValAndOff(c,off)] ptr mem) @@ -17069,6 +15897,8 @@ func rewriteValueAMD64_OpAMD64MOVQi2f_0(v *Value) bool { return false } func rewriteValueAMD64_OpAMD64MOVQload_0(v *Value) bool { + b := v.Block + config := b.Func.Config // match: (MOVQload [off] {sym} ptr (MOVQstore [off2] {sym2} ptr2 x _)) // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) // result: x @@ -17204,42 +16034,22 @@ func rewriteValueAMD64_OpAMD64MOVQload_0(v *Value) bool { if v_0.Op != OpAMD64ADDQ { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(ptr.Op != OpSB) { - break - } - v.reset(OpAMD64MOVQloadidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVQload [off] {sym} (ADDQ idx ptr) mem) - // cond: ptr.Op != OpSB - // result: (MOVQloadidx1 [off] {sym} ptr idx mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQ { - break - } - ptr := v_0.Args[1] - idx := v_0.Args[0] - if !(ptr.Op != OpSB) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + if !(ptr.Op != OpSB) { + continue + } + v.reset(OpAMD64MOVQloadidx1) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpAMD64MOVQloadidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } // match: (MOVQload [off1] {sym1} (LEAL [off2] {sym2} base) mem) // cond: canMergeSym(sym1, sym2) && is32Bit(off1+off2) @@ -17308,11 +16118,6 @@ func rewriteValueAMD64_OpAMD64MOVQload_0(v *Value) bool { v.AddArg(val) return true } - return false -} -func rewriteValueAMD64_OpAMD64MOVQload_10(v *Value) bool { - b := v.Block - config := b.Func.Config // match: (MOVQload [off] {sym} (SB) _) // cond: symIsRO(sym) // result: (MOVQconst [int64(read64(sym, off, config.BigEndian))]) @@ -17337,39 +16142,22 @@ func rewriteValueAMD64_OpAMD64MOVQloadidx1_0(v *Value) bool { c := v.AuxInt sym := v.Aux mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLQconst || v_1.AuxInt != 3 { - break - } - idx := v_1.Args[0] - v.reset(OpAMD64MOVQloadidx8) - v.AuxInt = c - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVQloadidx1 [c] {sym} (SHLQconst [3] idx) ptr mem) - // result: (MOVQloadidx8 [c] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLQconst || v_0.AuxInt != 3 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64SHLQconst || v_1.AuxInt != 3 { + continue + } + idx := v_1.Args[0] + v.reset(OpAMD64MOVQloadidx8) + v.AuxInt = c + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - idx := v_0.Args[0] - ptr := v.Args[1] - v.reset(OpAMD64MOVQloadidx8) - v.AuxInt = c - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } // match: (MOVQloadidx1 [c] {sym} (ADDQconst [d] ptr) idx mem) // cond: is32Bit(c+d) @@ -17378,48 +16166,26 @@ func rewriteValueAMD64_OpAMD64MOVQloadidx1_0(v *Value) bool { c := v.AuxInt sym := v.Aux mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQconst { - break - } - d := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - if !(is32Bit(c + d)) { - break - } - v.reset(OpAMD64MOVQloadidx1) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVQloadidx1 [c] {sym} idx (ADDQconst [d] ptr) mem) - // cond: is32Bit(c+d) - // result: (MOVQloadidx1 [c+d] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - idx := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ADDQconst { - break - } - d := v_1.AuxInt - ptr := v_1.Args[0] - if !(is32Bit(c + d)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64ADDQconst { + continue + } + d := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1^_i0] + if !(is32Bit(c + d)) { + continue + } + v.reset(OpAMD64MOVQloadidx1) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpAMD64MOVQloadidx1) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } // match: (MOVQloadidx1 [c] {sym} ptr (ADDQconst [d] idx) mem) // cond: is32Bit(c+d) @@ -17428,48 +16194,26 @@ func rewriteValueAMD64_OpAMD64MOVQloadidx1_0(v *Value) bool { c := v.AuxInt sym := v.Aux mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ADDQconst { - break - } - d := v_1.AuxInt - idx := v_1.Args[0] - if !(is32Bit(c + d)) { - break - } - v.reset(OpAMD64MOVQloadidx1) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVQloadidx1 [c] {sym} (ADDQconst [d] idx) ptr mem) - // cond: is32Bit(c+d) - // result: (MOVQloadidx1 [c+d] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQconst { - break - } - d := v_0.AuxInt - idx := v_0.Args[0] - ptr := v.Args[1] - if !(is32Bit(c + d)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64ADDQconst { + continue + } + d := v_1.AuxInt + idx := v_1.Args[0] + if !(is32Bit(c + d)) { + continue + } + v.reset(OpAMD64MOVQloadidx1) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpAMD64MOVQloadidx1) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } // match: (MOVQloadidx1 [i] {s} p (MOVQconst [c]) mem) // cond: is32Bit(i+c) @@ -17478,44 +16222,24 @@ func rewriteValueAMD64_OpAMD64MOVQloadidx1_0(v *Value) bool { i := v.AuxInt s := v.Aux mem := v.Args[2] - p := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVQconst { - break - } - c := v_1.AuxInt - if !(is32Bit(i + c)) { - break - } - v.reset(OpAMD64MOVQload) - v.AuxInt = i + c - v.Aux = s - v.AddArg(p) - v.AddArg(mem) - return true - } - // match: (MOVQloadidx1 [i] {s} (MOVQconst [c]) p mem) - // cond: is32Bit(i+c) - // result: (MOVQload [i+c] {s} p mem) - for { - i := v.AuxInt - s := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVQconst { - break - } - c := v_0.AuxInt - p := v.Args[1] - if !(is32Bit(i + c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64MOVQconst { + continue + } + c := v_1.AuxInt + if !(is32Bit(i + c)) { + continue + } + v.reset(OpAMD64MOVQload) + v.AuxInt = i + c + v.Aux = s + v.AddArg(p) + v.AddArg(mem) + return true } - v.reset(OpAMD64MOVQload) - v.AuxInt = i + c - v.Aux = s - v.AddArg(p) - v.AddArg(mem) - return true + break } return false } @@ -17737,46 +16461,24 @@ func rewriteValueAMD64_OpAMD64MOVQstore_0(v *Value) bool { if v_0.Op != OpAMD64ADDQ { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { - break - } - v.reset(OpAMD64MOVQstoreidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVQstore [off] {sym} (ADDQ idx ptr) val mem) - // cond: ptr.Op != OpSB - // result: (MOVQstoreidx1 [off] {sym} ptr idx val mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQ { - break - } - ptr := v_0.Args[1] - idx := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + val := v.Args[1] + if !(ptr.Op != OpSB) { + continue + } + v.reset(OpAMD64MOVQstoreidx1) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true } - v.reset(OpAMD64MOVQstoreidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true + break } // match: (MOVQstore [off1] {sym1} (LEAL [off2] {sym2} base) val mem) // cond: canMergeSym(sym1, sym2) && is32Bit(off1+off2) @@ -17854,9 +16556,6 @@ func rewriteValueAMD64_OpAMD64MOVQstore_0(v *Value) bool { v.AddArg(mem) return true } - return false -} -func rewriteValueAMD64_OpAMD64MOVQstore_10(v *Value) bool { // match: (MOVQstore {sym} [off] ptr y:(ANDQload x [off] {sym} ptr mem) mem) // cond: y.Uses==1 && clobber(y) // result: (ANDQmodify [off] {sym} ptr x mem) @@ -17882,6 +16581,9 @@ func rewriteValueAMD64_OpAMD64MOVQstore_10(v *Value) bool { v.AddArg(mem) return true } + return false +} +func rewriteValueAMD64_OpAMD64MOVQstore_10(v *Value) bool { // match: (MOVQstore {sym} [off] ptr y:(ORQload x [off] {sym} ptr mem) mem) // cond: y.Uses==1 && clobber(y) // result: (ORQmodify [off] {sym} ptr x mem) @@ -17935,35 +16637,6 @@ func rewriteValueAMD64_OpAMD64MOVQstore_10(v *Value) bool { // match: (MOVQstore {sym} [off] ptr y:(ADDQ l:(MOVQload [off] {sym} ptr mem) x) mem) // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) // result: (ADDQmodify [off] {sym} ptr x mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - y := v.Args[1] - if y.Op != OpAMD64ADDQ { - break - } - x := y.Args[1] - l := y.Args[0] - if l.Op != OpAMD64MOVQload || l.AuxInt != off || l.Aux != sym { - break - } - _ = l.Args[1] - if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { - break - } - v.reset(OpAMD64ADDQmodify) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true - } - // match: (MOVQstore {sym} [off] ptr y:(ADDQ x l:(MOVQload [off] {sym} ptr mem)) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) - // result: (ADDQmodify [off] {sym} ptr x mem) for { off := v.AuxInt sym := v.Aux @@ -17974,22 +16647,28 @@ func rewriteValueAMD64_OpAMD64MOVQstore_10(v *Value) bool { break } _ = y.Args[1] - x := y.Args[0] - l := y.Args[1] - if l.Op != OpAMD64MOVQload || l.AuxInt != off || l.Aux != sym { - break - } - _ = l.Args[1] - if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + l := y.Args[_i0] + if l.Op != OpAMD64MOVQload || l.AuxInt != off || l.Aux != sym { + continue + } + _ = l.Args[1] + if ptr != l.Args[0] || mem != l.Args[1] { + continue + } + x := y.Args[1^_i0] + if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + continue + } + v.reset(OpAMD64ADDQmodify) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(x) + v.AddArg(mem) + return true } - v.reset(OpAMD64ADDQmodify) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true + break } // match: (MOVQstore {sym} [off] ptr y:(SUBQ l:(MOVQload [off] {sym} ptr mem) x) mem) // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) @@ -18023,35 +16702,6 @@ func rewriteValueAMD64_OpAMD64MOVQstore_10(v *Value) bool { // match: (MOVQstore {sym} [off] ptr y:(ANDQ l:(MOVQload [off] {sym} ptr mem) x) mem) // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) // result: (ANDQmodify [off] {sym} ptr x mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - y := v.Args[1] - if y.Op != OpAMD64ANDQ { - break - } - x := y.Args[1] - l := y.Args[0] - if l.Op != OpAMD64MOVQload || l.AuxInt != off || l.Aux != sym { - break - } - _ = l.Args[1] - if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { - break - } - v.reset(OpAMD64ANDQmodify) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true - } - // match: (MOVQstore {sym} [off] ptr y:(ANDQ x l:(MOVQload [off] {sym} ptr mem)) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) - // result: (ANDQmodify [off] {sym} ptr x mem) for { off := v.AuxInt sym := v.Aux @@ -18062,55 +16712,32 @@ func rewriteValueAMD64_OpAMD64MOVQstore_10(v *Value) bool { break } _ = y.Args[1] - x := y.Args[0] - l := y.Args[1] - if l.Op != OpAMD64MOVQload || l.AuxInt != off || l.Aux != sym { - break - } - _ = l.Args[1] - if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + l := y.Args[_i0] + if l.Op != OpAMD64MOVQload || l.AuxInt != off || l.Aux != sym { + continue + } + _ = l.Args[1] + if ptr != l.Args[0] || mem != l.Args[1] { + continue + } + x := y.Args[1^_i0] + if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + continue + } + v.reset(OpAMD64ANDQmodify) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(x) + v.AddArg(mem) + return true } - v.reset(OpAMD64ANDQmodify) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true + break } // match: (MOVQstore {sym} [off] ptr y:(ORQ l:(MOVQload [off] {sym} ptr mem) x) mem) // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) // result: (ORQmodify [off] {sym} ptr x mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - y := v.Args[1] - if y.Op != OpAMD64ORQ { - break - } - x := y.Args[1] - l := y.Args[0] - if l.Op != OpAMD64MOVQload || l.AuxInt != off || l.Aux != sym { - break - } - _ = l.Args[1] - if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { - break - } - v.reset(OpAMD64ORQmodify) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true - } - // match: (MOVQstore {sym} [off] ptr y:(ORQ x l:(MOVQload [off] {sym} ptr mem)) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) - // result: (ORQmodify [off] {sym} ptr x mem) for { off := v.AuxInt sym := v.Aux @@ -18121,58 +16748,32 @@ func rewriteValueAMD64_OpAMD64MOVQstore_10(v *Value) bool { break } _ = y.Args[1] - x := y.Args[0] - l := y.Args[1] - if l.Op != OpAMD64MOVQload || l.AuxInt != off || l.Aux != sym { - break - } - _ = l.Args[1] - if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + l := y.Args[_i0] + if l.Op != OpAMD64MOVQload || l.AuxInt != off || l.Aux != sym { + continue + } + _ = l.Args[1] + if ptr != l.Args[0] || mem != l.Args[1] { + continue + } + x := y.Args[1^_i0] + if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + continue + } + v.reset(OpAMD64ORQmodify) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(x) + v.AddArg(mem) + return true } - v.reset(OpAMD64ORQmodify) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true + break } - return false -} -func rewriteValueAMD64_OpAMD64MOVQstore_20(v *Value) bool { // match: (MOVQstore {sym} [off] ptr y:(XORQ l:(MOVQload [off] {sym} ptr mem) x) mem) // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) // result: (XORQmodify [off] {sym} ptr x mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - y := v.Args[1] - if y.Op != OpAMD64XORQ { - break - } - x := y.Args[1] - l := y.Args[0] - if l.Op != OpAMD64MOVQload || l.AuxInt != off || l.Aux != sym { - break - } - _ = l.Args[1] - if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { - break - } - v.reset(OpAMD64XORQmodify) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true - } - // match: (MOVQstore {sym} [off] ptr y:(XORQ x l:(MOVQload [off] {sym} ptr mem)) mem) - // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) - // result: (XORQmodify [off] {sym} ptr x mem) for { off := v.AuxInt sym := v.Aux @@ -18183,22 +16784,28 @@ func rewriteValueAMD64_OpAMD64MOVQstore_20(v *Value) bool { break } _ = y.Args[1] - x := y.Args[0] - l := y.Args[1] - if l.Op != OpAMD64MOVQload || l.AuxInt != off || l.Aux != sym { - break - } - _ = l.Args[1] - if ptr != l.Args[0] || mem != l.Args[1] || !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + l := y.Args[_i0] + if l.Op != OpAMD64MOVQload || l.AuxInt != off || l.Aux != sym { + continue + } + _ = l.Args[1] + if ptr != l.Args[0] || mem != l.Args[1] { + continue + } + x := y.Args[1^_i0] + if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { + continue + } + v.reset(OpAMD64XORQmodify) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(x) + v.AddArg(mem) + return true } - v.reset(OpAMD64XORQmodify) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true + break } // match: (MOVQstore {sym} [off] ptr y:(BTCQ l:(MOVQload [off] {sym} ptr mem) x) mem) // cond: y.Uses==1 && l.Uses==1 && clobber(y) && clobber(l) @@ -18287,6 +16894,9 @@ func rewriteValueAMD64_OpAMD64MOVQstore_20(v *Value) bool { v.AddArg(mem) return true } + return false +} +func rewriteValueAMD64_OpAMD64MOVQstore_20(v *Value) bool { // match: (MOVQstore [off] {sym} ptr a:(ADDQconst [c] l:(MOVQload [off] {sym} ptr2 mem)) mem) // cond: isSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && validValAndOff(c,off) && clobber(l) && clobber(a) // result: (ADDQconstmodify {sym} [makeValAndOff(c,off)] ptr mem) @@ -18432,9 +17042,6 @@ func rewriteValueAMD64_OpAMD64MOVQstore_20(v *Value) bool { v.AddArg(mem) return true } - return false -} -func rewriteValueAMD64_OpAMD64MOVQstore_30(v *Value) bool { // match: (MOVQstore [off] {sym} ptr a:(BTRQconst [c] l:(MOVQload [off] {sym} ptr2 mem)) mem) // cond: isSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && validValAndOff(c,off) && clobber(l) && clobber(a) // result: (BTRQconstmodify {sym} [makeValAndOff(c,off)] ptr mem) @@ -19139,42 +17746,22 @@ func rewriteValueAMD64_OpAMD64MOVSDload_0(v *Value) bool { if v_0.Op != OpAMD64ADDQ { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(ptr.Op != OpSB) { - break - } - v.reset(OpAMD64MOVSDloadidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVSDload [off] {sym} (ADDQ idx ptr) mem) - // cond: ptr.Op != OpSB - // result: (MOVSDloadidx1 [off] {sym} ptr idx mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQ { - break - } - ptr := v_0.Args[1] - idx := v_0.Args[0] - if !(ptr.Op != OpSB) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + if !(ptr.Op != OpSB) { + continue + } + v.reset(OpAMD64MOVSDloadidx1) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpAMD64MOVSDloadidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } // match: (MOVSDload [off] {sym} ptr (MOVQstore [off] {sym} ptr val _)) // result: (MOVQi2f val) @@ -19489,46 +18076,24 @@ func rewriteValueAMD64_OpAMD64MOVSDstore_0(v *Value) bool { if v_0.Op != OpAMD64ADDQ { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { - break - } - v.reset(OpAMD64MOVSDstoreidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVSDstore [off] {sym} (ADDQ idx ptr) val mem) - // cond: ptr.Op != OpSB - // result: (MOVSDstoreidx1 [off] {sym} ptr idx val mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQ { - break - } - ptr := v_0.Args[1] - idx := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + val := v.Args[1] + if !(ptr.Op != OpSB) { + continue + } + v.reset(OpAMD64MOVSDstoreidx1) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true } - v.reset(OpAMD64MOVSDstoreidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true + break } // match: (MOVSDstore [off] {sym} ptr (MOVQi2f val) mem) // result: (MOVQstore [off] {sym} ptr val mem) @@ -19849,42 +18414,22 @@ func rewriteValueAMD64_OpAMD64MOVSSload_0(v *Value) bool { if v_0.Op != OpAMD64ADDQ { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(ptr.Op != OpSB) { - break - } - v.reset(OpAMD64MOVSSloadidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVSSload [off] {sym} (ADDQ idx ptr) mem) - // cond: ptr.Op != OpSB - // result: (MOVSSloadidx1 [off] {sym} ptr idx mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQ { - break - } - ptr := v_0.Args[1] - idx := v_0.Args[0] - if !(ptr.Op != OpSB) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + if !(ptr.Op != OpSB) { + continue + } + v.reset(OpAMD64MOVSSloadidx1) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpAMD64MOVSSloadidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } // match: (MOVSSload [off] {sym} ptr (MOVLstore [off] {sym} ptr val _)) // result: (MOVLi2f val) @@ -20199,46 +18744,24 @@ func rewriteValueAMD64_OpAMD64MOVSSstore_0(v *Value) bool { if v_0.Op != OpAMD64ADDQ { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { - break - } - v.reset(OpAMD64MOVSSstoreidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVSSstore [off] {sym} (ADDQ idx ptr) val mem) - // cond: ptr.Op != OpSB - // result: (MOVSSstoreidx1 [off] {sym} ptr idx val mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQ { - break - } - ptr := v_0.Args[1] - idx := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + val := v.Args[1] + if !(ptr.Op != OpSB) { + continue + } + v.reset(OpAMD64MOVSSstoreidx1) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true } - v.reset(OpAMD64MOVSSstoreidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true + break } // match: (MOVSSstore [off] {sym} ptr (MOVLi2f val) mem) // result: (MOVLstore [off] {sym} ptr val mem) @@ -20941,42 +19464,22 @@ func rewriteValueAMD64_OpAMD64MOVWload_0(v *Value) bool { if v_0.Op != OpAMD64ADDQ { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(ptr.Op != OpSB) { - break - } - v.reset(OpAMD64MOVWloadidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWload [off] {sym} (ADDQ idx ptr) mem) - // cond: ptr.Op != OpSB - // result: (MOVWloadidx1 [off] {sym} ptr idx mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQ { - break - } - ptr := v_0.Args[1] - idx := v_0.Args[0] - if !(ptr.Op != OpSB) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + if !(ptr.Op != OpSB) { + continue + } + v.reset(OpAMD64MOVWloadidx1) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpAMD64MOVWloadidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } // match: (MOVWload [off1] {sym1} (LEAL [off2] {sym2} base) mem) // cond: canMergeSym(sym1, sym2) && is32Bit(off1+off2) @@ -21049,39 +19552,22 @@ func rewriteValueAMD64_OpAMD64MOVWloadidx1_0(v *Value) bool { c := v.AuxInt sym := v.Aux mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLQconst || v_1.AuxInt != 1 { - break - } - idx := v_1.Args[0] - v.reset(OpAMD64MOVWloadidx2) - v.AuxInt = c - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWloadidx1 [c] {sym} (SHLQconst [1] idx) ptr mem) - // result: (MOVWloadidx2 [c] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLQconst || v_0.AuxInt != 1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64SHLQconst || v_1.AuxInt != 1 { + continue + } + idx := v_1.Args[0] + v.reset(OpAMD64MOVWloadidx2) + v.AuxInt = c + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - idx := v_0.Args[0] - ptr := v.Args[1] - v.reset(OpAMD64MOVWloadidx2) - v.AuxInt = c - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } // match: (MOVWloadidx1 [c] {sym} (ADDQconst [d] ptr) idx mem) // cond: is32Bit(c+d) @@ -21090,48 +19576,26 @@ func rewriteValueAMD64_OpAMD64MOVWloadidx1_0(v *Value) bool { c := v.AuxInt sym := v.Aux mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQconst { - break - } - d := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - if !(is32Bit(c + d)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64ADDQconst { + continue + } + d := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1^_i0] + if !(is32Bit(c + d)) { + continue + } + v.reset(OpAMD64MOVWloadidx1) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpAMD64MOVWloadidx1) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWloadidx1 [c] {sym} idx (ADDQconst [d] ptr) mem) - // cond: is32Bit(c+d) - // result: (MOVWloadidx1 [c+d] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - idx := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ADDQconst { - break - } - d := v_1.AuxInt - ptr := v_1.Args[0] - if !(is32Bit(c + d)) { - break - } - v.reset(OpAMD64MOVWloadidx1) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } // match: (MOVWloadidx1 [c] {sym} ptr (ADDQconst [d] idx) mem) // cond: is32Bit(c+d) @@ -21140,48 +19604,26 @@ func rewriteValueAMD64_OpAMD64MOVWloadidx1_0(v *Value) bool { c := v.AuxInt sym := v.Aux mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ADDQconst { - break - } - d := v_1.AuxInt - idx := v_1.Args[0] - if !(is32Bit(c + d)) { - break - } - v.reset(OpAMD64MOVWloadidx1) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWloadidx1 [c] {sym} (ADDQconst [d] idx) ptr mem) - // cond: is32Bit(c+d) - // result: (MOVWloadidx1 [c+d] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQconst { - break - } - d := v_0.AuxInt - idx := v_0.Args[0] - ptr := v.Args[1] - if !(is32Bit(c + d)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64ADDQconst { + continue + } + d := v_1.AuxInt + idx := v_1.Args[0] + if !(is32Bit(c + d)) { + continue + } + v.reset(OpAMD64MOVWloadidx1) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpAMD64MOVWloadidx1) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } // match: (MOVWloadidx1 [i] {s} p (MOVQconst [c]) mem) // cond: is32Bit(i+c) @@ -21190,44 +19632,24 @@ func rewriteValueAMD64_OpAMD64MOVWloadidx1_0(v *Value) bool { i := v.AuxInt s := v.Aux mem := v.Args[2] - p := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVQconst { - break - } - c := v_1.AuxInt - if !(is32Bit(i + c)) { - break - } - v.reset(OpAMD64MOVWload) - v.AuxInt = i + c - v.Aux = s - v.AddArg(p) - v.AddArg(mem) - return true - } - // match: (MOVWloadidx1 [i] {s} (MOVQconst [c]) p mem) - // cond: is32Bit(i+c) - // result: (MOVWload [i+c] {s} p mem) - for { - i := v.AuxInt - s := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVQconst { - break - } - c := v_0.AuxInt - p := v.Args[1] - if !(is32Bit(i + c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64MOVQconst { + continue + } + c := v_1.AuxInt + if !(is32Bit(i + c)) { + continue + } + v.reset(OpAMD64MOVWload) + v.AuxInt = i + c + v.Aux = s + v.AddArg(p) + v.AddArg(mem) + return true } - v.reset(OpAMD64MOVWload) - v.AuxInt = i + c - v.Aux = s - v.AddArg(p) - v.AddArg(mem) - return true + break } return false } @@ -21512,52 +19934,25 @@ func rewriteValueAMD64_OpAMD64MOVWstore_0(v *Value) bool { if v_0.Op != OpAMD64ADDQ { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { - break - } - v.reset(OpAMD64MOVWstoreidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstore [off] {sym} (ADDQ idx ptr) val mem) - // cond: ptr.Op != OpSB - // result: (MOVWstoreidx1 [off] {sym} ptr idx val mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQ { - break - } - ptr := v_0.Args[1] - idx := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + val := v.Args[1] + if !(ptr.Op != OpSB) { + continue + } + v.reset(OpAMD64MOVWstoreidx1) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true } - v.reset(OpAMD64MOVWstoreidx1) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true + break } - return false -} -func rewriteValueAMD64_OpAMD64MOVWstore_10(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types // match: (MOVWstore [i] {s} p (SHRLconst [16] w) x:(MOVWstore [i-2] {s} p w mem)) // cond: x.Uses == 1 && clobber(x) // result: (MOVLstore [i-2] {s} p w mem) @@ -21587,6 +19982,11 @@ func rewriteValueAMD64_OpAMD64MOVWstore_10(v *Value) bool { v.AddArg(mem) return true } + return false +} +func rewriteValueAMD64_OpAMD64MOVWstore_10(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types // match: (MOVWstore [i] {s} p (SHRQconst [16] w) x:(MOVWstore [i-2] {s} p w mem)) // cond: x.Uses == 1 && clobber(x) // result: (MOVLstore [i-2] {s} p w mem) @@ -22626,30 +21026,19 @@ func rewriteValueAMD64_OpAMD64MULL_0(v *Value) bool { // result: (MULLconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVLconst { - break - } - c := v_1.AuxInt - v.reset(OpAMD64MULLconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (MULL (MOVLconst [c]) x) - // result: (MULLconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVLconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64MOVLconst { + continue + } + c := v_1.AuxInt + v.reset(OpAMD64MULLconst) + v.AuxInt = c + v.AddArg(x) + return true } - c := v_0.AuxInt - v.reset(OpAMD64MULLconst) - v.AuxInt = c - v.AddArg(x) - return true + break } return false } @@ -23138,37 +21527,22 @@ func rewriteValueAMD64_OpAMD64MULQ_0(v *Value) bool { // result: (MULQconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVQconst { - break - } - c := v_1.AuxInt - if !(is32Bit(c)) { - break - } - v.reset(OpAMD64MULQconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (MULQ (MOVQconst [c]) x) - // cond: is32Bit(c) - // result: (MULQconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVQconst { - break - } - c := v_0.AuxInt - if !(is32Bit(c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64MOVQconst { + continue + } + c := v_1.AuxInt + if !(is32Bit(c)) { + continue + } + v.reset(OpAMD64MULQconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpAMD64MULQconst) - v.AuxInt = c - v.AddArg(x) - return true + break } return false } @@ -23679,49 +22053,28 @@ func rewriteValueAMD64_OpAMD64MULSD_0(v *Value) bool { // result: (MULSDload x [off] {sym} ptr mem) for { _ = v.Args[1] - x := v.Args[0] - l := v.Args[1] - if l.Op != OpAMD64MOVSDload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break - } - v.reset(OpAMD64MULSDload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MULSD l:(MOVSDload [off] {sym} ptr mem) x) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (MULSDload x [off] {sym} ptr mem) - for { - x := v.Args[1] - l := v.Args[0] - if l.Op != OpAMD64MOVSDload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != OpAMD64MOVSDload { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[1] + ptr := l.Args[0] + if !(canMergeLoadClobber(v, l, x) && clobber(l)) { + continue + } + v.reset(OpAMD64MULSDload) + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - v.reset(OpAMD64MULSDload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true + break } return false } @@ -23811,49 +22164,28 @@ func rewriteValueAMD64_OpAMD64MULSS_0(v *Value) bool { // result: (MULSSload x [off] {sym} ptr mem) for { _ = v.Args[1] - x := v.Args[0] - l := v.Args[1] - if l.Op != OpAMD64MOVSSload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break - } - v.reset(OpAMD64MULSSload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MULSS l:(MOVSSload [off] {sym} ptr mem) x) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (MULSSload x [off] {sym} ptr mem) - for { - x := v.Args[1] - l := v.Args[0] - if l.Op != OpAMD64MOVSSload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != OpAMD64MOVSSload { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[1] + ptr := l.Args[0] + if !(canMergeLoadClobber(v, l, x) && clobber(l)) { + continue + } + v.reset(OpAMD64MULSSload) + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - v.reset(OpAMD64MULSSload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true + break } return false } @@ -24084,154 +22416,92 @@ func rewriteValueAMD64_OpAMD64NOTQ_0(v *Value) bool { func rewriteValueAMD64_OpAMD64ORL_0(v *Value) bool { // match: (ORL (SHLL (MOVLconst [1]) y) x) // result: (BTSL x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLL { - break - } - y := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64MOVLconst || v_0_0.AuxInt != 1 { - break - } - v.reset(OpAMD64BTSL) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL x (SHLL (MOVLconst [1]) y)) - // result: (BTSL x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLL { - break - } - y := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64MOVLconst || v_1_0.AuxInt != 1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64SHLL { + continue + } + y := v_0.Args[1] + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpAMD64MOVLconst || v_0_0.AuxInt != 1 { + continue + } + x := v.Args[1^_i0] + v.reset(OpAMD64BTSL) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpAMD64BTSL) - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (ORL (MOVLconst [c]) x) // cond: isUint32PowerOfTwo(c) && uint64(c) >= 128 // result: (BTSLconst [log2uint32(c)] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVLconst { - break - } - c := v_0.AuxInt - if !(isUint32PowerOfTwo(c) && uint64(c) >= 128) { - break - } - v.reset(OpAMD64BTSLconst) - v.AuxInt = log2uint32(c) - v.AddArg(x) - return true - } - // match: (ORL x (MOVLconst [c])) - // cond: isUint32PowerOfTwo(c) && uint64(c) >= 128 - // result: (BTSLconst [log2uint32(c)] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVLconst { - break - } - c := v_1.AuxInt - if !(isUint32PowerOfTwo(c) && uint64(c) >= 128) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64MOVLconst { + continue + } + c := v_0.AuxInt + x := v.Args[1^_i0] + if !(isUint32PowerOfTwo(c) && uint64(c) >= 128) { + continue + } + v.reset(OpAMD64BTSLconst) + v.AuxInt = log2uint32(c) + v.AddArg(x) + return true } - v.reset(OpAMD64BTSLconst) - v.AuxInt = log2uint32(c) - v.AddArg(x) - return true + break } // match: (ORL x (MOVLconst [c])) // result: (ORLconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVLconst { - break - } - c := v_1.AuxInt - v.reset(OpAMD64ORLconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ORL (MOVLconst [c]) x) - // result: (ORLconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVLconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64MOVLconst { + continue + } + c := v_1.AuxInt + v.reset(OpAMD64ORLconst) + v.AuxInt = c + v.AddArg(x) + return true } - c := v_0.AuxInt - v.reset(OpAMD64ORLconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (ORL (SHLLconst x [c]) (SHRLconst x [d])) // cond: d==32-c // result: (ROLLconst x [c]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLLconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHRLconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(d == 32-c) { - break - } - v.reset(OpAMD64ROLLconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ORL (SHRLconst x [d]) (SHLLconst x [c])) - // cond: d==32-c - // result: (ROLLconst x [c]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHRLconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLLconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(d == 32-c) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64SHLLconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64SHRLconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(d == 32-c) { + continue + } + v.reset(OpAMD64ROLLconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpAMD64ROLLconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (ORL (SHLLconst x [c]) (SHRWconst x [d])) // cond: d==16-c && c < 16 && t.Size() == 2 @@ -24239,17053 +22509,3313 @@ func rewriteValueAMD64_OpAMD64ORL_0(v *Value) bool { for { t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLLconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHRWconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(d == 16-c && c < 16 && t.Size() == 2) { - break - } - v.reset(OpAMD64ROLWconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ORL (SHRWconst x [d]) (SHLLconst x [c])) - // cond: d==16-c && c < 16 && t.Size() == 2 - // result: (ROLWconst x [c]) - for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHRWconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLLconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(d == 16-c && c < 16 && t.Size() == 2) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64SHLLconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64SHRWconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(d == 16-c && c < 16 && t.Size() == 2) { + continue + } + v.reset(OpAMD64ROLWconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpAMD64ROLWconst) - v.AuxInt = c - v.AddArg(x) - return true + break } - return false -} -func rewriteValueAMD64_OpAMD64ORL_10(v *Value) bool { // match: (ORL (SHLLconst x [c]) (SHRBconst x [d])) // cond: d==8-c && c < 8 && t.Size() == 1 // result: (ROLBconst x [c]) for { t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLLconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHRBconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(d == 8-c && c < 8 && t.Size() == 1) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64SHLLconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64SHRBconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(d == 8-c && c < 8 && t.Size() == 1) { + continue + } + v.reset(OpAMD64ROLBconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpAMD64ROLBconst) - v.AuxInt = c - v.AddArg(x) - return true + break } - // match: (ORL (SHRBconst x [d]) (SHLLconst x [c])) - // cond: d==8-c && c < 8 && t.Size() == 1 - // result: (ROLBconst x [c]) + // match: (ORL (SHLL x y) (ANDL (SHRL x (NEGQ y)) (SBBLcarrymask (CMPQconst (NEGQ (ADDQconst (ANDQconst y [31]) [-32])) [32])))) + // result: (ROLL x y) for { - t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHRBconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLLconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(d == 8-c && c < 8 && t.Size() == 1) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64SHLL { + continue + } + y := v_0.Args[1] + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64ANDL { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpAMD64SHRL { + continue + } + _ = v_1_0.Args[1] + if x != v_1_0.Args[0] { + continue + } + v_1_0_1 := v_1_0.Args[1] + if v_1_0_1.Op != OpAMD64NEGQ || y != v_1_0_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpAMD64SBBLcarrymask { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpAMD64CMPQconst || v_1_1_0.AuxInt != 32 { + continue + } + v_1_1_0_0 := v_1_1_0.Args[0] + if v_1_1_0_0.Op != OpAMD64NEGQ { + continue + } + v_1_1_0_0_0 := v_1_1_0_0.Args[0] + if v_1_1_0_0_0.Op != OpAMD64ADDQconst || v_1_1_0_0_0.AuxInt != -32 { + continue + } + v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] + if v_1_1_0_0_0_0.Op != OpAMD64ANDQconst || v_1_1_0_0_0_0.AuxInt != 31 || y != v_1_1_0_0_0_0.Args[0] { + continue + } + v.reset(OpAMD64ROLL) + v.AddArg(x) + v.AddArg(y) + return true + } } - v.reset(OpAMD64ROLBconst) - v.AuxInt = c - v.AddArg(x) - return true + break } - // match: (ORL (SHLL x y) (ANDL (SHRL x (NEGQ y)) (SBBLcarrymask (CMPQconst (NEGQ (ADDQconst (ANDQconst y [31]) [-32])) [32])))) + // match: (ORL (SHLL x y) (ANDL (SHRL x (NEGL y)) (SBBLcarrymask (CMPLconst (NEGL (ADDLconst (ANDLconst y [31]) [-32])) [32])))) // result: (ROLL x y) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLL { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ANDL { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SHRL { - break - } - _ = v_1_0.Args[1] - if x != v_1_0.Args[0] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpAMD64NEGQ || y != v_1_0_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64SBBLcarrymask { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64CMPQconst || v_1_1_0.AuxInt != 32 { - break - } - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAMD64NEGQ { - break - } - v_1_1_0_0_0 := v_1_1_0_0.Args[0] - if v_1_1_0_0_0.Op != OpAMD64ADDQconst || v_1_1_0_0_0.AuxInt != -32 { - break - } - v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] - if v_1_1_0_0_0_0.Op != OpAMD64ANDQconst || v_1_1_0_0_0_0.AuxInt != 31 || y != v_1_1_0_0_0_0.Args[0] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64SHLL { + continue + } + y := v_0.Args[1] + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64ANDL { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpAMD64SHRL { + continue + } + _ = v_1_0.Args[1] + if x != v_1_0.Args[0] { + continue + } + v_1_0_1 := v_1_0.Args[1] + if v_1_0_1.Op != OpAMD64NEGL || y != v_1_0_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpAMD64SBBLcarrymask { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpAMD64CMPLconst || v_1_1_0.AuxInt != 32 { + continue + } + v_1_1_0_0 := v_1_1_0.Args[0] + if v_1_1_0_0.Op != OpAMD64NEGL { + continue + } + v_1_1_0_0_0 := v_1_1_0_0.Args[0] + if v_1_1_0_0_0.Op != OpAMD64ADDLconst || v_1_1_0_0_0.AuxInt != -32 { + continue + } + v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] + if v_1_1_0_0_0_0.Op != OpAMD64ANDLconst || v_1_1_0_0_0_0.AuxInt != 31 || y != v_1_1_0_0_0_0.Args[0] { + continue + } + v.reset(OpAMD64ROLL) + v.AddArg(x) + v.AddArg(y) + return true + } } - v.reset(OpAMD64ROLL) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (ORL (SHLL x y) (ANDL (SBBLcarrymask (CMPQconst (NEGQ (ADDQconst (ANDQconst y [31]) [-32])) [32])) (SHRL x (NEGQ y)))) - // result: (ROLL x y) + // match: (ORL (SHRL x y) (ANDL (SHLL x (NEGQ y)) (SBBLcarrymask (CMPQconst (NEGQ (ADDQconst (ANDQconst y [31]) [-32])) [32])))) + // result: (RORL x y) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLL { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ANDL { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SBBLcarrymask { - break - } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAMD64CMPQconst || v_1_0_0.AuxInt != 32 { - break - } - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpAMD64NEGQ { - break - } - v_1_0_0_0_0 := v_1_0_0_0.Args[0] - if v_1_0_0_0_0.Op != OpAMD64ADDQconst || v_1_0_0_0_0.AuxInt != -32 { - break - } - v_1_0_0_0_0_0 := v_1_0_0_0_0.Args[0] - if v_1_0_0_0_0_0.Op != OpAMD64ANDQconst || v_1_0_0_0_0_0.AuxInt != 31 || y != v_1_0_0_0_0_0.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64SHRL { - break - } - _ = v_1_1.Args[1] - if x != v_1_1.Args[0] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64SHRL { + continue + } + y := v_0.Args[1] + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64ANDL { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpAMD64SHLL { + continue + } + _ = v_1_0.Args[1] + if x != v_1_0.Args[0] { + continue + } + v_1_0_1 := v_1_0.Args[1] + if v_1_0_1.Op != OpAMD64NEGQ || y != v_1_0_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpAMD64SBBLcarrymask { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpAMD64CMPQconst || v_1_1_0.AuxInt != 32 { + continue + } + v_1_1_0_0 := v_1_1_0.Args[0] + if v_1_1_0_0.Op != OpAMD64NEGQ { + continue + } + v_1_1_0_0_0 := v_1_1_0_0.Args[0] + if v_1_1_0_0_0.Op != OpAMD64ADDQconst || v_1_1_0_0_0.AuxInt != -32 { + continue + } + v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] + if v_1_1_0_0_0_0.Op != OpAMD64ANDQconst || v_1_1_0_0_0_0.AuxInt != 31 || y != v_1_1_0_0_0_0.Args[0] { + continue + } + v.reset(OpAMD64RORL) + v.AddArg(x) + v.AddArg(y) + return true + } } - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpAMD64NEGQ || y != v_1_1_1.Args[0] { - break + break + } + // match: (ORL (SHRL x y) (ANDL (SHLL x (NEGL y)) (SBBLcarrymask (CMPLconst (NEGL (ADDLconst (ANDLconst y [31]) [-32])) [32])))) + // result: (RORL x y) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64SHRL { + continue + } + y := v_0.Args[1] + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64ANDL { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpAMD64SHLL { + continue + } + _ = v_1_0.Args[1] + if x != v_1_0.Args[0] { + continue + } + v_1_0_1 := v_1_0.Args[1] + if v_1_0_1.Op != OpAMD64NEGL || y != v_1_0_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpAMD64SBBLcarrymask { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpAMD64CMPLconst || v_1_1_0.AuxInt != 32 { + continue + } + v_1_1_0_0 := v_1_1_0.Args[0] + if v_1_1_0_0.Op != OpAMD64NEGL { + continue + } + v_1_1_0_0_0 := v_1_1_0_0.Args[0] + if v_1_1_0_0_0.Op != OpAMD64ADDLconst || v_1_1_0_0_0.AuxInt != -32 { + continue + } + v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] + if v_1_1_0_0_0_0.Op != OpAMD64ANDLconst || v_1_1_0_0_0_0.AuxInt != 31 || y != v_1_1_0_0_0_0.Args[0] { + continue + } + v.reset(OpAMD64RORL) + v.AddArg(x) + v.AddArg(y) + return true + } } - v.reset(OpAMD64ROLL) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (ORL (ANDL (SHRL x (NEGQ y)) (SBBLcarrymask (CMPQconst (NEGQ (ADDQconst (ANDQconst y [31]) [-32])) [32]))) (SHLL x y)) - // result: (ROLL x y) + return false +} +func rewriteValueAMD64_OpAMD64ORL_10(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (ORL (SHLL x (ANDQconst y [15])) (ANDL (SHRW x (NEGQ (ADDQconst (ANDQconst y [15]) [-16]))) (SBBLcarrymask (CMPQconst (NEGQ (ADDQconst (ANDQconst y [15]) [-16])) [16])))) + // cond: v.Type.Size() == 2 + // result: (ROLW x y) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ANDL { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64SHLL { + continue + } + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpAMD64ANDQconst || v_0_1.AuxInt != 15 { + continue + } + y := v_0_1.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64ANDL { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpAMD64SHRW { + continue + } + _ = v_1_0.Args[1] + if x != v_1_0.Args[0] { + continue + } + v_1_0_1 := v_1_0.Args[1] + if v_1_0_1.Op != OpAMD64NEGQ { + continue + } + v_1_0_1_0 := v_1_0_1.Args[0] + if v_1_0_1_0.Op != OpAMD64ADDQconst || v_1_0_1_0.AuxInt != -16 { + continue + } + v_1_0_1_0_0 := v_1_0_1_0.Args[0] + if v_1_0_1_0_0.Op != OpAMD64ANDQconst || v_1_0_1_0_0.AuxInt != 15 || y != v_1_0_1_0_0.Args[0] { + continue + } + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpAMD64SBBLcarrymask { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpAMD64CMPQconst || v_1_1_0.AuxInt != 16 { + continue + } + v_1_1_0_0 := v_1_1_0.Args[0] + if v_1_1_0_0.Op != OpAMD64NEGQ { + continue + } + v_1_1_0_0_0 := v_1_1_0_0.Args[0] + if v_1_1_0_0_0.Op != OpAMD64ADDQconst || v_1_1_0_0_0.AuxInt != -16 { + continue + } + v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] + if v_1_1_0_0_0_0.Op != OpAMD64ANDQconst || v_1_1_0_0_0_0.AuxInt != 15 || y != v_1_1_0_0_0_0.Args[0] || !(v.Type.Size() == 2) { + continue + } + v.reset(OpAMD64ROLW) + v.AddArg(x) + v.AddArg(y) + return true + } } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SHRL { - break - } - _ = v_0_0.Args[1] - x := v_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpAMD64NEGQ { - break - } - y := v_0_0_1.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SBBLcarrymask { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpAMD64CMPQconst || v_0_1_0.AuxInt != 32 { - break - } - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpAMD64NEGQ { - break - } - v_0_1_0_0_0 := v_0_1_0_0.Args[0] - if v_0_1_0_0_0.Op != OpAMD64ADDQconst || v_0_1_0_0_0.AuxInt != -32 { - break - } - v_0_1_0_0_0_0 := v_0_1_0_0_0.Args[0] - if v_0_1_0_0_0_0.Op != OpAMD64ANDQconst || v_0_1_0_0_0_0.AuxInt != 31 || y != v_0_1_0_0_0_0.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLL { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] || y != v_1.Args[1] { - break - } - v.reset(OpAMD64ROLL) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (ANDL (SBBLcarrymask (CMPQconst (NEGQ (ADDQconst (ANDQconst y [31]) [-32])) [32])) (SHRL x (NEGQ y))) (SHLL x y)) - // result: (ROLL x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ANDL { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SBBLcarrymask { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64CMPQconst || v_0_0_0.AuxInt != 32 { - break - } - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpAMD64NEGQ { - break - } - v_0_0_0_0_0 := v_0_0_0_0.Args[0] - if v_0_0_0_0_0.Op != OpAMD64ADDQconst || v_0_0_0_0_0.AuxInt != -32 { - break - } - v_0_0_0_0_0_0 := v_0_0_0_0_0.Args[0] - if v_0_0_0_0_0_0.Op != OpAMD64ANDQconst || v_0_0_0_0_0_0.AuxInt != 31 { - break - } - y := v_0_0_0_0_0_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SHRL { - break - } - _ = v_0_1.Args[1] - x := v_0_1.Args[0] - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpAMD64NEGQ || y != v_0_1_1.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLL { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] || y != v_1.Args[1] { - break - } - v.reset(OpAMD64ROLL) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (SHLL x y) (ANDL (SHRL x (NEGL y)) (SBBLcarrymask (CMPLconst (NEGL (ADDLconst (ANDLconst y [31]) [-32])) [32])))) - // result: (ROLL x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLL { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ANDL { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SHRL { - break - } - _ = v_1_0.Args[1] - if x != v_1_0.Args[0] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpAMD64NEGL || y != v_1_0_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64SBBLcarrymask { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64CMPLconst || v_1_1_0.AuxInt != 32 { - break - } - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAMD64NEGL { - break - } - v_1_1_0_0_0 := v_1_1_0_0.Args[0] - if v_1_1_0_0_0.Op != OpAMD64ADDLconst || v_1_1_0_0_0.AuxInt != -32 { - break - } - v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] - if v_1_1_0_0_0_0.Op != OpAMD64ANDLconst || v_1_1_0_0_0_0.AuxInt != 31 || y != v_1_1_0_0_0_0.Args[0] { - break - } - v.reset(OpAMD64ROLL) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (SHLL x y) (ANDL (SBBLcarrymask (CMPLconst (NEGL (ADDLconst (ANDLconst y [31]) [-32])) [32])) (SHRL x (NEGL y)))) - // result: (ROLL x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLL { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ANDL { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SBBLcarrymask { - break - } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAMD64CMPLconst || v_1_0_0.AuxInt != 32 { - break - } - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpAMD64NEGL { - break - } - v_1_0_0_0_0 := v_1_0_0_0.Args[0] - if v_1_0_0_0_0.Op != OpAMD64ADDLconst || v_1_0_0_0_0.AuxInt != -32 { - break - } - v_1_0_0_0_0_0 := v_1_0_0_0_0.Args[0] - if v_1_0_0_0_0_0.Op != OpAMD64ANDLconst || v_1_0_0_0_0_0.AuxInt != 31 || y != v_1_0_0_0_0_0.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64SHRL { - break - } - _ = v_1_1.Args[1] - if x != v_1_1.Args[0] { - break - } - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpAMD64NEGL || y != v_1_1_1.Args[0] { - break - } - v.reset(OpAMD64ROLL) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (ANDL (SHRL x (NEGL y)) (SBBLcarrymask (CMPLconst (NEGL (ADDLconst (ANDLconst y [31]) [-32])) [32]))) (SHLL x y)) - // result: (ROLL x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ANDL { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SHRL { - break - } - _ = v_0_0.Args[1] - x := v_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpAMD64NEGL { - break - } - y := v_0_0_1.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SBBLcarrymask { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpAMD64CMPLconst || v_0_1_0.AuxInt != 32 { - break - } - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpAMD64NEGL { - break - } - v_0_1_0_0_0 := v_0_1_0_0.Args[0] - if v_0_1_0_0_0.Op != OpAMD64ADDLconst || v_0_1_0_0_0.AuxInt != -32 { - break - } - v_0_1_0_0_0_0 := v_0_1_0_0_0.Args[0] - if v_0_1_0_0_0_0.Op != OpAMD64ANDLconst || v_0_1_0_0_0_0.AuxInt != 31 || y != v_0_1_0_0_0_0.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLL { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] || y != v_1.Args[1] { - break - } - v.reset(OpAMD64ROLL) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (ANDL (SBBLcarrymask (CMPLconst (NEGL (ADDLconst (ANDLconst y [31]) [-32])) [32])) (SHRL x (NEGL y))) (SHLL x y)) - // result: (ROLL x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ANDL { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SBBLcarrymask { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64CMPLconst || v_0_0_0.AuxInt != 32 { - break - } - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpAMD64NEGL { - break - } - v_0_0_0_0_0 := v_0_0_0_0.Args[0] - if v_0_0_0_0_0.Op != OpAMD64ADDLconst || v_0_0_0_0_0.AuxInt != -32 { - break - } - v_0_0_0_0_0_0 := v_0_0_0_0_0.Args[0] - if v_0_0_0_0_0_0.Op != OpAMD64ANDLconst || v_0_0_0_0_0_0.AuxInt != 31 { - break - } - y := v_0_0_0_0_0_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SHRL { - break - } - _ = v_0_1.Args[1] - x := v_0_1.Args[0] - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpAMD64NEGL || y != v_0_1_1.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLL { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] || y != v_1.Args[1] { - break - } - v.reset(OpAMD64ROLL) - v.AddArg(x) - v.AddArg(y) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORL_20(v *Value) bool { - // match: (ORL (SHRL x y) (ANDL (SHLL x (NEGQ y)) (SBBLcarrymask (CMPQconst (NEGQ (ADDQconst (ANDQconst y [31]) [-32])) [32])))) - // result: (RORL x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHRL { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ANDL { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SHLL { - break - } - _ = v_1_0.Args[1] - if x != v_1_0.Args[0] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpAMD64NEGQ || y != v_1_0_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64SBBLcarrymask { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64CMPQconst || v_1_1_0.AuxInt != 32 { - break - } - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAMD64NEGQ { - break - } - v_1_1_0_0_0 := v_1_1_0_0.Args[0] - if v_1_1_0_0_0.Op != OpAMD64ADDQconst || v_1_1_0_0_0.AuxInt != -32 { - break - } - v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] - if v_1_1_0_0_0_0.Op != OpAMD64ANDQconst || v_1_1_0_0_0_0.AuxInt != 31 || y != v_1_1_0_0_0_0.Args[0] { - break - } - v.reset(OpAMD64RORL) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (SHRL x y) (ANDL (SBBLcarrymask (CMPQconst (NEGQ (ADDQconst (ANDQconst y [31]) [-32])) [32])) (SHLL x (NEGQ y)))) - // result: (RORL x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHRL { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ANDL { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SBBLcarrymask { - break - } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAMD64CMPQconst || v_1_0_0.AuxInt != 32 { - break - } - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpAMD64NEGQ { - break - } - v_1_0_0_0_0 := v_1_0_0_0.Args[0] - if v_1_0_0_0_0.Op != OpAMD64ADDQconst || v_1_0_0_0_0.AuxInt != -32 { - break - } - v_1_0_0_0_0_0 := v_1_0_0_0_0.Args[0] - if v_1_0_0_0_0_0.Op != OpAMD64ANDQconst || v_1_0_0_0_0_0.AuxInt != 31 || y != v_1_0_0_0_0_0.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64SHLL { - break - } - _ = v_1_1.Args[1] - if x != v_1_1.Args[0] { - break - } - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpAMD64NEGQ || y != v_1_1_1.Args[0] { - break - } - v.reset(OpAMD64RORL) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (ANDL (SHLL x (NEGQ y)) (SBBLcarrymask (CMPQconst (NEGQ (ADDQconst (ANDQconst y [31]) [-32])) [32]))) (SHRL x y)) - // result: (RORL x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ANDL { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SHLL { - break - } - _ = v_0_0.Args[1] - x := v_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpAMD64NEGQ { - break - } - y := v_0_0_1.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SBBLcarrymask { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpAMD64CMPQconst || v_0_1_0.AuxInt != 32 { - break - } - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpAMD64NEGQ { - break - } - v_0_1_0_0_0 := v_0_1_0_0.Args[0] - if v_0_1_0_0_0.Op != OpAMD64ADDQconst || v_0_1_0_0_0.AuxInt != -32 { - break - } - v_0_1_0_0_0_0 := v_0_1_0_0_0.Args[0] - if v_0_1_0_0_0_0.Op != OpAMD64ANDQconst || v_0_1_0_0_0_0.AuxInt != 31 || y != v_0_1_0_0_0_0.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHRL { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] || y != v_1.Args[1] { - break - } - v.reset(OpAMD64RORL) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (ANDL (SBBLcarrymask (CMPQconst (NEGQ (ADDQconst (ANDQconst y [31]) [-32])) [32])) (SHLL x (NEGQ y))) (SHRL x y)) - // result: (RORL x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ANDL { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SBBLcarrymask { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64CMPQconst || v_0_0_0.AuxInt != 32 { - break - } - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpAMD64NEGQ { - break - } - v_0_0_0_0_0 := v_0_0_0_0.Args[0] - if v_0_0_0_0_0.Op != OpAMD64ADDQconst || v_0_0_0_0_0.AuxInt != -32 { - break - } - v_0_0_0_0_0_0 := v_0_0_0_0_0.Args[0] - if v_0_0_0_0_0_0.Op != OpAMD64ANDQconst || v_0_0_0_0_0_0.AuxInt != 31 { - break - } - y := v_0_0_0_0_0_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SHLL { - break - } - _ = v_0_1.Args[1] - x := v_0_1.Args[0] - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpAMD64NEGQ || y != v_0_1_1.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHRL { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] || y != v_1.Args[1] { - break - } - v.reset(OpAMD64RORL) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (SHRL x y) (ANDL (SHLL x (NEGL y)) (SBBLcarrymask (CMPLconst (NEGL (ADDLconst (ANDLconst y [31]) [-32])) [32])))) - // result: (RORL x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHRL { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ANDL { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SHLL { - break - } - _ = v_1_0.Args[1] - if x != v_1_0.Args[0] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpAMD64NEGL || y != v_1_0_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64SBBLcarrymask { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64CMPLconst || v_1_1_0.AuxInt != 32 { - break - } - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAMD64NEGL { - break - } - v_1_1_0_0_0 := v_1_1_0_0.Args[0] - if v_1_1_0_0_0.Op != OpAMD64ADDLconst || v_1_1_0_0_0.AuxInt != -32 { - break - } - v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] - if v_1_1_0_0_0_0.Op != OpAMD64ANDLconst || v_1_1_0_0_0_0.AuxInt != 31 || y != v_1_1_0_0_0_0.Args[0] { - break - } - v.reset(OpAMD64RORL) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (SHRL x y) (ANDL (SBBLcarrymask (CMPLconst (NEGL (ADDLconst (ANDLconst y [31]) [-32])) [32])) (SHLL x (NEGL y)))) - // result: (RORL x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHRL { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ANDL { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SBBLcarrymask { - break - } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAMD64CMPLconst || v_1_0_0.AuxInt != 32 { - break - } - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpAMD64NEGL { - break - } - v_1_0_0_0_0 := v_1_0_0_0.Args[0] - if v_1_0_0_0_0.Op != OpAMD64ADDLconst || v_1_0_0_0_0.AuxInt != -32 { - break - } - v_1_0_0_0_0_0 := v_1_0_0_0_0.Args[0] - if v_1_0_0_0_0_0.Op != OpAMD64ANDLconst || v_1_0_0_0_0_0.AuxInt != 31 || y != v_1_0_0_0_0_0.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64SHLL { - break - } - _ = v_1_1.Args[1] - if x != v_1_1.Args[0] { - break - } - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpAMD64NEGL || y != v_1_1_1.Args[0] { - break - } - v.reset(OpAMD64RORL) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (ANDL (SHLL x (NEGL y)) (SBBLcarrymask (CMPLconst (NEGL (ADDLconst (ANDLconst y [31]) [-32])) [32]))) (SHRL x y)) - // result: (RORL x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ANDL { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SHLL { - break - } - _ = v_0_0.Args[1] - x := v_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpAMD64NEGL { - break - } - y := v_0_0_1.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SBBLcarrymask { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpAMD64CMPLconst || v_0_1_0.AuxInt != 32 { - break - } - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpAMD64NEGL { - break - } - v_0_1_0_0_0 := v_0_1_0_0.Args[0] - if v_0_1_0_0_0.Op != OpAMD64ADDLconst || v_0_1_0_0_0.AuxInt != -32 { - break - } - v_0_1_0_0_0_0 := v_0_1_0_0_0.Args[0] - if v_0_1_0_0_0_0.Op != OpAMD64ANDLconst || v_0_1_0_0_0_0.AuxInt != 31 || y != v_0_1_0_0_0_0.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHRL { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] || y != v_1.Args[1] { - break - } - v.reset(OpAMD64RORL) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (ANDL (SBBLcarrymask (CMPLconst (NEGL (ADDLconst (ANDLconst y [31]) [-32])) [32])) (SHLL x (NEGL y))) (SHRL x y)) - // result: (RORL x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ANDL { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SBBLcarrymask { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64CMPLconst || v_0_0_0.AuxInt != 32 { - break - } - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpAMD64NEGL { - break - } - v_0_0_0_0_0 := v_0_0_0_0.Args[0] - if v_0_0_0_0_0.Op != OpAMD64ADDLconst || v_0_0_0_0_0.AuxInt != -32 { - break - } - v_0_0_0_0_0_0 := v_0_0_0_0_0.Args[0] - if v_0_0_0_0_0_0.Op != OpAMD64ANDLconst || v_0_0_0_0_0_0.AuxInt != 31 { - break - } - y := v_0_0_0_0_0_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SHLL { - break - } - _ = v_0_1.Args[1] - x := v_0_1.Args[0] - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpAMD64NEGL || y != v_0_1_1.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHRL { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] || y != v_1.Args[1] { - break - } - v.reset(OpAMD64RORL) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (SHLL x (ANDQconst y [15])) (ANDL (SHRW x (NEGQ (ADDQconst (ANDQconst y [15]) [-16]))) (SBBLcarrymask (CMPQconst (NEGQ (ADDQconst (ANDQconst y [15]) [-16])) [16])))) - // cond: v.Type.Size() == 2 - // result: (ROLW x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLL { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64ANDQconst || v_0_1.AuxInt != 15 { - break - } - y := v_0_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ANDL { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SHRW { - break - } - _ = v_1_0.Args[1] - if x != v_1_0.Args[0] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpAMD64NEGQ { - break - } - v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpAMD64ADDQconst || v_1_0_1_0.AuxInt != -16 { - break - } - v_1_0_1_0_0 := v_1_0_1_0.Args[0] - if v_1_0_1_0_0.Op != OpAMD64ANDQconst || v_1_0_1_0_0.AuxInt != 15 || y != v_1_0_1_0_0.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64SBBLcarrymask { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64CMPQconst || v_1_1_0.AuxInt != 16 { - break - } - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAMD64NEGQ { - break - } - v_1_1_0_0_0 := v_1_1_0_0.Args[0] - if v_1_1_0_0_0.Op != OpAMD64ADDQconst || v_1_1_0_0_0.AuxInt != -16 { - break - } - v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] - if v_1_1_0_0_0_0.Op != OpAMD64ANDQconst || v_1_1_0_0_0_0.AuxInt != 15 || y != v_1_1_0_0_0_0.Args[0] || !(v.Type.Size() == 2) { - break - } - v.reset(OpAMD64ROLW) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (SHLL x (ANDQconst y [15])) (ANDL (SBBLcarrymask (CMPQconst (NEGQ (ADDQconst (ANDQconst y [15]) [-16])) [16])) (SHRW x (NEGQ (ADDQconst (ANDQconst y [15]) [-16]))))) - // cond: v.Type.Size() == 2 - // result: (ROLW x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLL { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64ANDQconst || v_0_1.AuxInt != 15 { - break - } - y := v_0_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ANDL { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SBBLcarrymask { - break - } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAMD64CMPQconst || v_1_0_0.AuxInt != 16 { - break - } - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpAMD64NEGQ { - break - } - v_1_0_0_0_0 := v_1_0_0_0.Args[0] - if v_1_0_0_0_0.Op != OpAMD64ADDQconst || v_1_0_0_0_0.AuxInt != -16 { - break - } - v_1_0_0_0_0_0 := v_1_0_0_0_0.Args[0] - if v_1_0_0_0_0_0.Op != OpAMD64ANDQconst || v_1_0_0_0_0_0.AuxInt != 15 || y != v_1_0_0_0_0_0.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64SHRW { - break - } - _ = v_1_1.Args[1] - if x != v_1_1.Args[0] { - break - } - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpAMD64NEGQ { - break - } - v_1_1_1_0 := v_1_1_1.Args[0] - if v_1_1_1_0.Op != OpAMD64ADDQconst || v_1_1_1_0.AuxInt != -16 { - break - } - v_1_1_1_0_0 := v_1_1_1_0.Args[0] - if v_1_1_1_0_0.Op != OpAMD64ANDQconst || v_1_1_1_0_0.AuxInt != 15 || y != v_1_1_1_0_0.Args[0] || !(v.Type.Size() == 2) { - break - } - v.reset(OpAMD64ROLW) - v.AddArg(x) - v.AddArg(y) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORL_30(v *Value) bool { - // match: (ORL (ANDL (SHRW x (NEGQ (ADDQconst (ANDQconst y [15]) [-16]))) (SBBLcarrymask (CMPQconst (NEGQ (ADDQconst (ANDQconst y [15]) [-16])) [16]))) (SHLL x (ANDQconst y [15]))) - // cond: v.Type.Size() == 2 - // result: (ROLW x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ANDL { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SHRW { - break - } - _ = v_0_0.Args[1] - x := v_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpAMD64NEGQ { - break - } - v_0_0_1_0 := v_0_0_1.Args[0] - if v_0_0_1_0.Op != OpAMD64ADDQconst || v_0_0_1_0.AuxInt != -16 { - break - } - v_0_0_1_0_0 := v_0_0_1_0.Args[0] - if v_0_0_1_0_0.Op != OpAMD64ANDQconst || v_0_0_1_0_0.AuxInt != 15 { - break - } - y := v_0_0_1_0_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SBBLcarrymask { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpAMD64CMPQconst || v_0_1_0.AuxInt != 16 { - break - } - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpAMD64NEGQ { - break - } - v_0_1_0_0_0 := v_0_1_0_0.Args[0] - if v_0_1_0_0_0.Op != OpAMD64ADDQconst || v_0_1_0_0_0.AuxInt != -16 { - break - } - v_0_1_0_0_0_0 := v_0_1_0_0_0.Args[0] - if v_0_1_0_0_0_0.Op != OpAMD64ANDQconst || v_0_1_0_0_0_0.AuxInt != 15 || y != v_0_1_0_0_0_0.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLL { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64ANDQconst || v_1_1.AuxInt != 15 || y != v_1_1.Args[0] || !(v.Type.Size() == 2) { - break - } - v.reset(OpAMD64ROLW) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (ANDL (SBBLcarrymask (CMPQconst (NEGQ (ADDQconst (ANDQconst y [15]) [-16])) [16])) (SHRW x (NEGQ (ADDQconst (ANDQconst y [15]) [-16])))) (SHLL x (ANDQconst y [15]))) - // cond: v.Type.Size() == 2 - // result: (ROLW x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ANDL { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SBBLcarrymask { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64CMPQconst || v_0_0_0.AuxInt != 16 { - break - } - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpAMD64NEGQ { - break - } - v_0_0_0_0_0 := v_0_0_0_0.Args[0] - if v_0_0_0_0_0.Op != OpAMD64ADDQconst || v_0_0_0_0_0.AuxInt != -16 { - break - } - v_0_0_0_0_0_0 := v_0_0_0_0_0.Args[0] - if v_0_0_0_0_0_0.Op != OpAMD64ANDQconst || v_0_0_0_0_0_0.AuxInt != 15 { - break - } - y := v_0_0_0_0_0_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SHRW { - break - } - _ = v_0_1.Args[1] - x := v_0_1.Args[0] - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpAMD64NEGQ { - break - } - v_0_1_1_0 := v_0_1_1.Args[0] - if v_0_1_1_0.Op != OpAMD64ADDQconst || v_0_1_1_0.AuxInt != -16 { - break - } - v_0_1_1_0_0 := v_0_1_1_0.Args[0] - if v_0_1_1_0_0.Op != OpAMD64ANDQconst || v_0_1_1_0_0.AuxInt != 15 || y != v_0_1_1_0_0.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLL { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64ANDQconst || v_1_1.AuxInt != 15 || y != v_1_1.Args[0] || !(v.Type.Size() == 2) { - break - } - v.reset(OpAMD64ROLW) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (SHLL x (ANDLconst y [15])) (ANDL (SHRW x (NEGL (ADDLconst (ANDLconst y [15]) [-16]))) (SBBLcarrymask (CMPLconst (NEGL (ADDLconst (ANDLconst y [15]) [-16])) [16])))) - // cond: v.Type.Size() == 2 - // result: (ROLW x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLL { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64ANDLconst || v_0_1.AuxInt != 15 { - break - } - y := v_0_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ANDL { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SHRW { - break - } - _ = v_1_0.Args[1] - if x != v_1_0.Args[0] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpAMD64NEGL { - break - } - v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpAMD64ADDLconst || v_1_0_1_0.AuxInt != -16 { - break - } - v_1_0_1_0_0 := v_1_0_1_0.Args[0] - if v_1_0_1_0_0.Op != OpAMD64ANDLconst || v_1_0_1_0_0.AuxInt != 15 || y != v_1_0_1_0_0.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64SBBLcarrymask { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64CMPLconst || v_1_1_0.AuxInt != 16 { - break - } - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAMD64NEGL { - break - } - v_1_1_0_0_0 := v_1_1_0_0.Args[0] - if v_1_1_0_0_0.Op != OpAMD64ADDLconst || v_1_1_0_0_0.AuxInt != -16 { - break - } - v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] - if v_1_1_0_0_0_0.Op != OpAMD64ANDLconst || v_1_1_0_0_0_0.AuxInt != 15 || y != v_1_1_0_0_0_0.Args[0] || !(v.Type.Size() == 2) { - break - } - v.reset(OpAMD64ROLW) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (SHLL x (ANDLconst y [15])) (ANDL (SBBLcarrymask (CMPLconst (NEGL (ADDLconst (ANDLconst y [15]) [-16])) [16])) (SHRW x (NEGL (ADDLconst (ANDLconst y [15]) [-16]))))) - // cond: v.Type.Size() == 2 - // result: (ROLW x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLL { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64ANDLconst || v_0_1.AuxInt != 15 { - break - } - y := v_0_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ANDL { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SBBLcarrymask { - break - } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAMD64CMPLconst || v_1_0_0.AuxInt != 16 { - break - } - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpAMD64NEGL { - break - } - v_1_0_0_0_0 := v_1_0_0_0.Args[0] - if v_1_0_0_0_0.Op != OpAMD64ADDLconst || v_1_0_0_0_0.AuxInt != -16 { - break - } - v_1_0_0_0_0_0 := v_1_0_0_0_0.Args[0] - if v_1_0_0_0_0_0.Op != OpAMD64ANDLconst || v_1_0_0_0_0_0.AuxInt != 15 || y != v_1_0_0_0_0_0.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64SHRW { - break - } - _ = v_1_1.Args[1] - if x != v_1_1.Args[0] { - break - } - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpAMD64NEGL { - break - } - v_1_1_1_0 := v_1_1_1.Args[0] - if v_1_1_1_0.Op != OpAMD64ADDLconst || v_1_1_1_0.AuxInt != -16 { - break - } - v_1_1_1_0_0 := v_1_1_1_0.Args[0] - if v_1_1_1_0_0.Op != OpAMD64ANDLconst || v_1_1_1_0_0.AuxInt != 15 || y != v_1_1_1_0_0.Args[0] || !(v.Type.Size() == 2) { - break - } - v.reset(OpAMD64ROLW) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (ANDL (SHRW x (NEGL (ADDLconst (ANDLconst y [15]) [-16]))) (SBBLcarrymask (CMPLconst (NEGL (ADDLconst (ANDLconst y [15]) [-16])) [16]))) (SHLL x (ANDLconst y [15]))) - // cond: v.Type.Size() == 2 - // result: (ROLW x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ANDL { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SHRW { - break - } - _ = v_0_0.Args[1] - x := v_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpAMD64NEGL { - break - } - v_0_0_1_0 := v_0_0_1.Args[0] - if v_0_0_1_0.Op != OpAMD64ADDLconst || v_0_0_1_0.AuxInt != -16 { - break - } - v_0_0_1_0_0 := v_0_0_1_0.Args[0] - if v_0_0_1_0_0.Op != OpAMD64ANDLconst || v_0_0_1_0_0.AuxInt != 15 { - break - } - y := v_0_0_1_0_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SBBLcarrymask { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpAMD64CMPLconst || v_0_1_0.AuxInt != 16 { - break - } - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpAMD64NEGL { - break - } - v_0_1_0_0_0 := v_0_1_0_0.Args[0] - if v_0_1_0_0_0.Op != OpAMD64ADDLconst || v_0_1_0_0_0.AuxInt != -16 { - break - } - v_0_1_0_0_0_0 := v_0_1_0_0_0.Args[0] - if v_0_1_0_0_0_0.Op != OpAMD64ANDLconst || v_0_1_0_0_0_0.AuxInt != 15 || y != v_0_1_0_0_0_0.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLL { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64ANDLconst || v_1_1.AuxInt != 15 || y != v_1_1.Args[0] || !(v.Type.Size() == 2) { - break - } - v.reset(OpAMD64ROLW) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (ANDL (SBBLcarrymask (CMPLconst (NEGL (ADDLconst (ANDLconst y [15]) [-16])) [16])) (SHRW x (NEGL (ADDLconst (ANDLconst y [15]) [-16])))) (SHLL x (ANDLconst y [15]))) - // cond: v.Type.Size() == 2 - // result: (ROLW x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ANDL { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SBBLcarrymask { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64CMPLconst || v_0_0_0.AuxInt != 16 { - break - } - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpAMD64NEGL { - break - } - v_0_0_0_0_0 := v_0_0_0_0.Args[0] - if v_0_0_0_0_0.Op != OpAMD64ADDLconst || v_0_0_0_0_0.AuxInt != -16 { - break - } - v_0_0_0_0_0_0 := v_0_0_0_0_0.Args[0] - if v_0_0_0_0_0_0.Op != OpAMD64ANDLconst || v_0_0_0_0_0_0.AuxInt != 15 { - break - } - y := v_0_0_0_0_0_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SHRW { - break - } - _ = v_0_1.Args[1] - x := v_0_1.Args[0] - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpAMD64NEGL { - break - } - v_0_1_1_0 := v_0_1_1.Args[0] - if v_0_1_1_0.Op != OpAMD64ADDLconst || v_0_1_1_0.AuxInt != -16 { - break - } - v_0_1_1_0_0 := v_0_1_1_0.Args[0] - if v_0_1_1_0_0.Op != OpAMD64ANDLconst || v_0_1_1_0_0.AuxInt != 15 || y != v_0_1_1_0_0.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLL { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64ANDLconst || v_1_1.AuxInt != 15 || y != v_1_1.Args[0] || !(v.Type.Size() == 2) { - break - } - v.reset(OpAMD64ROLW) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (SHRW x (ANDQconst y [15])) (SHLL x (NEGQ (ADDQconst (ANDQconst y [15]) [-16])))) - // cond: v.Type.Size() == 2 - // result: (RORW x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHRW { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64ANDQconst || v_0_1.AuxInt != 15 { - break - } - y := v_0_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLL { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64NEGQ { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64ADDQconst || v_1_1_0.AuxInt != -16 { - break - } - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAMD64ANDQconst || v_1_1_0_0.AuxInt != 15 || y != v_1_1_0_0.Args[0] || !(v.Type.Size() == 2) { - break - } - v.reset(OpAMD64RORW) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (SHLL x (NEGQ (ADDQconst (ANDQconst y [15]) [-16]))) (SHRW x (ANDQconst y [15]))) - // cond: v.Type.Size() == 2 - // result: (RORW x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLL { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64NEGQ { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpAMD64ADDQconst || v_0_1_0.AuxInt != -16 { - break - } - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpAMD64ANDQconst || v_0_1_0_0.AuxInt != 15 { - break - } - y := v_0_1_0_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHRW { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64ANDQconst || v_1_1.AuxInt != 15 || y != v_1_1.Args[0] || !(v.Type.Size() == 2) { - break - } - v.reset(OpAMD64RORW) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (SHRW x (ANDLconst y [15])) (SHLL x (NEGL (ADDLconst (ANDLconst y [15]) [-16])))) - // cond: v.Type.Size() == 2 - // result: (RORW x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHRW { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64ANDLconst || v_0_1.AuxInt != 15 { - break - } - y := v_0_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLL { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64NEGL { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64ADDLconst || v_1_1_0.AuxInt != -16 { - break - } - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAMD64ANDLconst || v_1_1_0_0.AuxInt != 15 || y != v_1_1_0_0.Args[0] || !(v.Type.Size() == 2) { - break - } - v.reset(OpAMD64RORW) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (SHLL x (NEGL (ADDLconst (ANDLconst y [15]) [-16]))) (SHRW x (ANDLconst y [15]))) - // cond: v.Type.Size() == 2 - // result: (RORW x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLL { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64NEGL { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpAMD64ADDLconst || v_0_1_0.AuxInt != -16 { - break - } - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpAMD64ANDLconst || v_0_1_0_0.AuxInt != 15 { - break - } - y := v_0_1_0_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHRW { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64ANDLconst || v_1_1.AuxInt != 15 || y != v_1_1.Args[0] || !(v.Type.Size() == 2) { - break - } - v.reset(OpAMD64RORW) - v.AddArg(x) - v.AddArg(y) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORL_40(v *Value) bool { - // match: (ORL (SHLL x (ANDQconst y [ 7])) (ANDL (SHRB x (NEGQ (ADDQconst (ANDQconst y [ 7]) [ -8]))) (SBBLcarrymask (CMPQconst (NEGQ (ADDQconst (ANDQconst y [ 7]) [ -8])) [ 8])))) - // cond: v.Type.Size() == 1 - // result: (ROLB x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLL { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64ANDQconst || v_0_1.AuxInt != 7 { - break - } - y := v_0_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ANDL { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SHRB { - break - } - _ = v_1_0.Args[1] - if x != v_1_0.Args[0] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpAMD64NEGQ { - break - } - v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpAMD64ADDQconst || v_1_0_1_0.AuxInt != -8 { - break - } - v_1_0_1_0_0 := v_1_0_1_0.Args[0] - if v_1_0_1_0_0.Op != OpAMD64ANDQconst || v_1_0_1_0_0.AuxInt != 7 || y != v_1_0_1_0_0.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64SBBLcarrymask { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64CMPQconst || v_1_1_0.AuxInt != 8 { - break - } - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAMD64NEGQ { - break - } - v_1_1_0_0_0 := v_1_1_0_0.Args[0] - if v_1_1_0_0_0.Op != OpAMD64ADDQconst || v_1_1_0_0_0.AuxInt != -8 { - break - } - v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] - if v_1_1_0_0_0_0.Op != OpAMD64ANDQconst || v_1_1_0_0_0_0.AuxInt != 7 || y != v_1_1_0_0_0_0.Args[0] || !(v.Type.Size() == 1) { - break - } - v.reset(OpAMD64ROLB) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (SHLL x (ANDQconst y [ 7])) (ANDL (SBBLcarrymask (CMPQconst (NEGQ (ADDQconst (ANDQconst y [ 7]) [ -8])) [ 8])) (SHRB x (NEGQ (ADDQconst (ANDQconst y [ 7]) [ -8]))))) - // cond: v.Type.Size() == 1 - // result: (ROLB x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLL { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64ANDQconst || v_0_1.AuxInt != 7 { - break - } - y := v_0_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ANDL { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SBBLcarrymask { - break - } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAMD64CMPQconst || v_1_0_0.AuxInt != 8 { - break - } - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpAMD64NEGQ { - break - } - v_1_0_0_0_0 := v_1_0_0_0.Args[0] - if v_1_0_0_0_0.Op != OpAMD64ADDQconst || v_1_0_0_0_0.AuxInt != -8 { - break - } - v_1_0_0_0_0_0 := v_1_0_0_0_0.Args[0] - if v_1_0_0_0_0_0.Op != OpAMD64ANDQconst || v_1_0_0_0_0_0.AuxInt != 7 || y != v_1_0_0_0_0_0.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64SHRB { - break - } - _ = v_1_1.Args[1] - if x != v_1_1.Args[0] { - break - } - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpAMD64NEGQ { - break - } - v_1_1_1_0 := v_1_1_1.Args[0] - if v_1_1_1_0.Op != OpAMD64ADDQconst || v_1_1_1_0.AuxInt != -8 { - break - } - v_1_1_1_0_0 := v_1_1_1_0.Args[0] - if v_1_1_1_0_0.Op != OpAMD64ANDQconst || v_1_1_1_0_0.AuxInt != 7 || y != v_1_1_1_0_0.Args[0] || !(v.Type.Size() == 1) { - break - } - v.reset(OpAMD64ROLB) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (ANDL (SHRB x (NEGQ (ADDQconst (ANDQconst y [ 7]) [ -8]))) (SBBLcarrymask (CMPQconst (NEGQ (ADDQconst (ANDQconst y [ 7]) [ -8])) [ 8]))) (SHLL x (ANDQconst y [ 7]))) - // cond: v.Type.Size() == 1 - // result: (ROLB x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ANDL { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SHRB { - break - } - _ = v_0_0.Args[1] - x := v_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpAMD64NEGQ { - break - } - v_0_0_1_0 := v_0_0_1.Args[0] - if v_0_0_1_0.Op != OpAMD64ADDQconst || v_0_0_1_0.AuxInt != -8 { - break - } - v_0_0_1_0_0 := v_0_0_1_0.Args[0] - if v_0_0_1_0_0.Op != OpAMD64ANDQconst || v_0_0_1_0_0.AuxInt != 7 { - break - } - y := v_0_0_1_0_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SBBLcarrymask { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpAMD64CMPQconst || v_0_1_0.AuxInt != 8 { - break - } - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpAMD64NEGQ { - break - } - v_0_1_0_0_0 := v_0_1_0_0.Args[0] - if v_0_1_0_0_0.Op != OpAMD64ADDQconst || v_0_1_0_0_0.AuxInt != -8 { - break - } - v_0_1_0_0_0_0 := v_0_1_0_0_0.Args[0] - if v_0_1_0_0_0_0.Op != OpAMD64ANDQconst || v_0_1_0_0_0_0.AuxInt != 7 || y != v_0_1_0_0_0_0.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLL { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64ANDQconst || v_1_1.AuxInt != 7 || y != v_1_1.Args[0] || !(v.Type.Size() == 1) { - break - } - v.reset(OpAMD64ROLB) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (ANDL (SBBLcarrymask (CMPQconst (NEGQ (ADDQconst (ANDQconst y [ 7]) [ -8])) [ 8])) (SHRB x (NEGQ (ADDQconst (ANDQconst y [ 7]) [ -8])))) (SHLL x (ANDQconst y [ 7]))) - // cond: v.Type.Size() == 1 - // result: (ROLB x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ANDL { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SBBLcarrymask { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64CMPQconst || v_0_0_0.AuxInt != 8 { - break - } - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpAMD64NEGQ { - break - } - v_0_0_0_0_0 := v_0_0_0_0.Args[0] - if v_0_0_0_0_0.Op != OpAMD64ADDQconst || v_0_0_0_0_0.AuxInt != -8 { - break - } - v_0_0_0_0_0_0 := v_0_0_0_0_0.Args[0] - if v_0_0_0_0_0_0.Op != OpAMD64ANDQconst || v_0_0_0_0_0_0.AuxInt != 7 { - break - } - y := v_0_0_0_0_0_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SHRB { - break - } - _ = v_0_1.Args[1] - x := v_0_1.Args[0] - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpAMD64NEGQ { - break - } - v_0_1_1_0 := v_0_1_1.Args[0] - if v_0_1_1_0.Op != OpAMD64ADDQconst || v_0_1_1_0.AuxInt != -8 { - break - } - v_0_1_1_0_0 := v_0_1_1_0.Args[0] - if v_0_1_1_0_0.Op != OpAMD64ANDQconst || v_0_1_1_0_0.AuxInt != 7 || y != v_0_1_1_0_0.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLL { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64ANDQconst || v_1_1.AuxInt != 7 || y != v_1_1.Args[0] || !(v.Type.Size() == 1) { - break - } - v.reset(OpAMD64ROLB) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (SHLL x (ANDLconst y [ 7])) (ANDL (SHRB x (NEGL (ADDLconst (ANDLconst y [ 7]) [ -8]))) (SBBLcarrymask (CMPLconst (NEGL (ADDLconst (ANDLconst y [ 7]) [ -8])) [ 8])))) - // cond: v.Type.Size() == 1 - // result: (ROLB x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLL { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64ANDLconst || v_0_1.AuxInt != 7 { - break - } - y := v_0_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ANDL { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SHRB { - break - } - _ = v_1_0.Args[1] - if x != v_1_0.Args[0] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpAMD64NEGL { - break - } - v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpAMD64ADDLconst || v_1_0_1_0.AuxInt != -8 { - break - } - v_1_0_1_0_0 := v_1_0_1_0.Args[0] - if v_1_0_1_0_0.Op != OpAMD64ANDLconst || v_1_0_1_0_0.AuxInt != 7 || y != v_1_0_1_0_0.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64SBBLcarrymask { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64CMPLconst || v_1_1_0.AuxInt != 8 { - break - } - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAMD64NEGL { - break - } - v_1_1_0_0_0 := v_1_1_0_0.Args[0] - if v_1_1_0_0_0.Op != OpAMD64ADDLconst || v_1_1_0_0_0.AuxInt != -8 { - break - } - v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] - if v_1_1_0_0_0_0.Op != OpAMD64ANDLconst || v_1_1_0_0_0_0.AuxInt != 7 || y != v_1_1_0_0_0_0.Args[0] || !(v.Type.Size() == 1) { - break - } - v.reset(OpAMD64ROLB) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (SHLL x (ANDLconst y [ 7])) (ANDL (SBBLcarrymask (CMPLconst (NEGL (ADDLconst (ANDLconst y [ 7]) [ -8])) [ 8])) (SHRB x (NEGL (ADDLconst (ANDLconst y [ 7]) [ -8]))))) - // cond: v.Type.Size() == 1 - // result: (ROLB x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLL { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64ANDLconst || v_0_1.AuxInt != 7 { - break - } - y := v_0_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ANDL { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SBBLcarrymask { - break - } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAMD64CMPLconst || v_1_0_0.AuxInt != 8 { - break - } - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpAMD64NEGL { - break - } - v_1_0_0_0_0 := v_1_0_0_0.Args[0] - if v_1_0_0_0_0.Op != OpAMD64ADDLconst || v_1_0_0_0_0.AuxInt != -8 { - break - } - v_1_0_0_0_0_0 := v_1_0_0_0_0.Args[0] - if v_1_0_0_0_0_0.Op != OpAMD64ANDLconst || v_1_0_0_0_0_0.AuxInt != 7 || y != v_1_0_0_0_0_0.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64SHRB { - break - } - _ = v_1_1.Args[1] - if x != v_1_1.Args[0] { - break - } - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpAMD64NEGL { - break - } - v_1_1_1_0 := v_1_1_1.Args[0] - if v_1_1_1_0.Op != OpAMD64ADDLconst || v_1_1_1_0.AuxInt != -8 { - break - } - v_1_1_1_0_0 := v_1_1_1_0.Args[0] - if v_1_1_1_0_0.Op != OpAMD64ANDLconst || v_1_1_1_0_0.AuxInt != 7 || y != v_1_1_1_0_0.Args[0] || !(v.Type.Size() == 1) { - break - } - v.reset(OpAMD64ROLB) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (ANDL (SHRB x (NEGL (ADDLconst (ANDLconst y [ 7]) [ -8]))) (SBBLcarrymask (CMPLconst (NEGL (ADDLconst (ANDLconst y [ 7]) [ -8])) [ 8]))) (SHLL x (ANDLconst y [ 7]))) - // cond: v.Type.Size() == 1 - // result: (ROLB x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ANDL { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SHRB { - break - } - _ = v_0_0.Args[1] - x := v_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpAMD64NEGL { - break - } - v_0_0_1_0 := v_0_0_1.Args[0] - if v_0_0_1_0.Op != OpAMD64ADDLconst || v_0_0_1_0.AuxInt != -8 { - break - } - v_0_0_1_0_0 := v_0_0_1_0.Args[0] - if v_0_0_1_0_0.Op != OpAMD64ANDLconst || v_0_0_1_0_0.AuxInt != 7 { - break - } - y := v_0_0_1_0_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SBBLcarrymask { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpAMD64CMPLconst || v_0_1_0.AuxInt != 8 { - break - } - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpAMD64NEGL { - break - } - v_0_1_0_0_0 := v_0_1_0_0.Args[0] - if v_0_1_0_0_0.Op != OpAMD64ADDLconst || v_0_1_0_0_0.AuxInt != -8 { - break - } - v_0_1_0_0_0_0 := v_0_1_0_0_0.Args[0] - if v_0_1_0_0_0_0.Op != OpAMD64ANDLconst || v_0_1_0_0_0_0.AuxInt != 7 || y != v_0_1_0_0_0_0.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLL { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64ANDLconst || v_1_1.AuxInt != 7 || y != v_1_1.Args[0] || !(v.Type.Size() == 1) { - break - } - v.reset(OpAMD64ROLB) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (ANDL (SBBLcarrymask (CMPLconst (NEGL (ADDLconst (ANDLconst y [ 7]) [ -8])) [ 8])) (SHRB x (NEGL (ADDLconst (ANDLconst y [ 7]) [ -8])))) (SHLL x (ANDLconst y [ 7]))) - // cond: v.Type.Size() == 1 - // result: (ROLB x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ANDL { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SBBLcarrymask { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64CMPLconst || v_0_0_0.AuxInt != 8 { - break - } - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpAMD64NEGL { - break - } - v_0_0_0_0_0 := v_0_0_0_0.Args[0] - if v_0_0_0_0_0.Op != OpAMD64ADDLconst || v_0_0_0_0_0.AuxInt != -8 { - break - } - v_0_0_0_0_0_0 := v_0_0_0_0_0.Args[0] - if v_0_0_0_0_0_0.Op != OpAMD64ANDLconst || v_0_0_0_0_0_0.AuxInt != 7 { - break - } - y := v_0_0_0_0_0_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SHRB { - break - } - _ = v_0_1.Args[1] - x := v_0_1.Args[0] - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpAMD64NEGL { - break - } - v_0_1_1_0 := v_0_1_1.Args[0] - if v_0_1_1_0.Op != OpAMD64ADDLconst || v_0_1_1_0.AuxInt != -8 { - break - } - v_0_1_1_0_0 := v_0_1_1_0.Args[0] - if v_0_1_1_0_0.Op != OpAMD64ANDLconst || v_0_1_1_0_0.AuxInt != 7 || y != v_0_1_1_0_0.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLL { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64ANDLconst || v_1_1.AuxInt != 7 || y != v_1_1.Args[0] || !(v.Type.Size() == 1) { - break - } - v.reset(OpAMD64ROLB) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (SHRB x (ANDQconst y [ 7])) (SHLL x (NEGQ (ADDQconst (ANDQconst y [ 7]) [ -8])))) - // cond: v.Type.Size() == 1 - // result: (RORB x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHRB { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64ANDQconst || v_0_1.AuxInt != 7 { - break - } - y := v_0_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLL { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64NEGQ { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64ADDQconst || v_1_1_0.AuxInt != -8 { - break - } - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAMD64ANDQconst || v_1_1_0_0.AuxInt != 7 || y != v_1_1_0_0.Args[0] || !(v.Type.Size() == 1) { - break - } - v.reset(OpAMD64RORB) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (SHLL x (NEGQ (ADDQconst (ANDQconst y [ 7]) [ -8]))) (SHRB x (ANDQconst y [ 7]))) - // cond: v.Type.Size() == 1 - // result: (RORB x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLL { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64NEGQ { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpAMD64ADDQconst || v_0_1_0.AuxInt != -8 { - break - } - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpAMD64ANDQconst || v_0_1_0_0.AuxInt != 7 { - break - } - y := v_0_1_0_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHRB { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64ANDQconst || v_1_1.AuxInt != 7 || y != v_1_1.Args[0] || !(v.Type.Size() == 1) { - break - } - v.reset(OpAMD64RORB) - v.AddArg(x) - v.AddArg(y) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORL_50(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORL (SHRB x (ANDLconst y [ 7])) (SHLL x (NEGL (ADDLconst (ANDLconst y [ 7]) [ -8])))) - // cond: v.Type.Size() == 1 - // result: (RORB x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHRB { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64ANDLconst || v_0_1.AuxInt != 7 { - break - } - y := v_0_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLL { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64NEGL { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64ADDLconst || v_1_1_0.AuxInt != -8 { - break - } - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAMD64ANDLconst || v_1_1_0_0.AuxInt != 7 || y != v_1_1_0_0.Args[0] || !(v.Type.Size() == 1) { - break - } - v.reset(OpAMD64RORB) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL (SHLL x (NEGL (ADDLconst (ANDLconst y [ 7]) [ -8]))) (SHRB x (ANDLconst y [ 7]))) - // cond: v.Type.Size() == 1 - // result: (RORB x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLL { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64NEGL { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpAMD64ADDLconst || v_0_1_0.AuxInt != -8 { - break - } - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpAMD64ANDLconst || v_0_1_0_0.AuxInt != 7 { - break - } - y := v_0_1_0_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHRB { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64ANDLconst || v_1_1.AuxInt != 7 || y != v_1_1.Args[0] || !(v.Type.Size() == 1) { - break - } - v.reset(OpAMD64RORB) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORL x x) - // result: x - for { - x := v.Args[1] - if x != v.Args[0] { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (ORL x0:(MOVBload [i0] {s} p mem) sh:(SHLLconst [8] x1:(MOVBload [i1] {s} p mem))) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWload [i0] {s} p mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpAMD64MOVBload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - sh := v.Args[1] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVBload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpAMD64MOVWload, typ.UInt16) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (ORL sh:(SHLLconst [8] x1:(MOVBload [i1] {s} p mem)) x0:(MOVBload [i0] {s} p mem)) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWload [i0] {s} p mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVBload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - x0 := v.Args[1] - if x0.Op != OpAMD64MOVBload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x0.Pos, OpAMD64MOVWload, typ.UInt16) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (ORL x0:(MOVWload [i0] {s} p mem) sh:(SHLLconst [16] x1:(MOVWload [i1] {s} p mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVLload [i0] {s} p mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpAMD64MOVWload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - sh := v.Args[1] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 16 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVWload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpAMD64MOVLload, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (ORL sh:(SHLLconst [16] x1:(MOVWload [i1] {s} p mem)) x0:(MOVWload [i0] {s} p mem)) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVLload [i0] {s} p mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 16 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVWload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - x0 := v.Args[1] - if x0.Op != OpAMD64MOVWload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x0.Pos, OpAMD64MOVLload, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (ORL s1:(SHLLconst [j1] x1:(MOVBload [i1] {s} p mem)) or:(ORL s0:(SHLLconst [j0] x0:(MOVBload [i0] {s} p mem)) y)) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j0] (MOVWload [i0] {s} p mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - or := v.Args[1] - if or.Op != OpAMD64ORL { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x0.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(x0.Pos, OpAMD64MOVWload, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL s1:(SHLLconst [j1] x1:(MOVBload [i1] {s} p mem)) or:(ORL y s0:(SHLLconst [j0] x0:(MOVBload [i0] {s} p mem)))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j0] (MOVWload [i0] {s} p mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - or := v.Args[1] - if or.Op != OpAMD64ORL { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x0.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(x0.Pos, OpAMD64MOVWload, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL or:(ORL s0:(SHLLconst [j0] x0:(MOVBload [i0] {s} p mem)) y) s1:(SHLLconst [j1] x1:(MOVBload [i1] {s} p mem))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j0] (MOVWload [i0] {s} p mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORL { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x1.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(x1.Pos, OpAMD64MOVWload, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORL_60(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORL or:(ORL y s0:(SHLLconst [j0] x0:(MOVBload [i0] {s} p mem))) s1:(SHLLconst [j1] x1:(MOVBload [i1] {s} p mem))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j0] (MOVWload [i0] {s} p mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORL { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x1.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(x1.Pos, OpAMD64MOVWload, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL x0:(MOVBloadidx1 [i0] {s} p idx mem) sh:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem))) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL x0:(MOVBloadidx1 [i0] {s} idx p mem) sh:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem))) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL x0:(MOVBloadidx1 [i0] {s} p idx mem) sh:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem))) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL x0:(MOVBloadidx1 [i0] {s} idx p mem) sh:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem))) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL sh:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem)) x0:(MOVBloadidx1 [i0] {s} p idx mem)) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - x0 := v.Args[1] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL sh:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem)) x0:(MOVBloadidx1 [i0] {s} p idx mem)) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - x0 := v.Args[1] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL sh:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem)) x0:(MOVBloadidx1 [i0] {s} idx p mem)) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - x0 := v.Args[1] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL sh:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem)) x0:(MOVBloadidx1 [i0] {s} idx p mem)) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - x0 := v.Args[1] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL x0:(MOVWloadidx1 [i0] {s} p idx mem) sh:(SHLLconst [16] x1:(MOVWloadidx1 [i1] {s} p idx mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 16 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORL_70(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORL x0:(MOVWloadidx1 [i0] {s} idx p mem) sh:(SHLLconst [16] x1:(MOVWloadidx1 [i1] {s} p idx mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 16 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL x0:(MOVWloadidx1 [i0] {s} p idx mem) sh:(SHLLconst [16] x1:(MOVWloadidx1 [i1] {s} idx p mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 16 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL x0:(MOVWloadidx1 [i0] {s} idx p mem) sh:(SHLLconst [16] x1:(MOVWloadidx1 [i1] {s} idx p mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 16 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL sh:(SHLLconst [16] x1:(MOVWloadidx1 [i1] {s} p idx mem)) x0:(MOVWloadidx1 [i0] {s} p idx mem)) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 16 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - x0 := v.Args[1] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL sh:(SHLLconst [16] x1:(MOVWloadidx1 [i1] {s} idx p mem)) x0:(MOVWloadidx1 [i0] {s} p idx mem)) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 16 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - x0 := v.Args[1] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL sh:(SHLLconst [16] x1:(MOVWloadidx1 [i1] {s} p idx mem)) x0:(MOVWloadidx1 [i0] {s} idx p mem)) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 16 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - x0 := v.Args[1] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL sh:(SHLLconst [16] x1:(MOVWloadidx1 [i1] {s} idx p mem)) x0:(MOVWloadidx1 [i0] {s} idx p mem)) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 16 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - x0 := v.Args[1] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORL s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem)) or:(ORL s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem)) y)) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORL { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem)) or:(ORL s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem)) y)) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORL { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem)) or:(ORL s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem)) y)) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORL { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORL_80(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORL s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem)) or:(ORL s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem)) y)) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORL { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem)) or:(ORL y s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem)))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORL { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem)) or:(ORL y s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem)))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORL { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem)) or:(ORL y s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem)))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORL { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem)) or:(ORL y s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem)))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORL { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL or:(ORL s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem)) y) s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORL { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL or:(ORL s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem)) y) s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORL { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL or:(ORL y s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem))) s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORL { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL or:(ORL y s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem))) s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORL { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL or:(ORL s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem)) y) s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORL { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORL_90(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORL or:(ORL s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem)) y) s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORL { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL or:(ORL y s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem))) s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORL { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL or:(ORL y s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem))) s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORL { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL x1:(MOVBload [i1] {s} p mem) sh:(SHLLconst [8] x0:(MOVBload [i0] {s} p mem))) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (ROLWconst [8] (MOVWload [i0] {s} p mem)) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpAMD64MOVBload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - sh := v.Args[1] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpAMD64MOVBload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x0.Pos, OpAMD64ROLWconst, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = 8 - v1 := b.NewValue0(x0.Pos, OpAMD64MOVWload, typ.UInt16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORL sh:(SHLLconst [8] x0:(MOVBload [i0] {s} p mem)) x1:(MOVBload [i1] {s} p mem)) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (ROLWconst [8] (MOVWload [i0] {s} p mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpAMD64MOVBload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - x1 := v.Args[1] - if x1.Op != OpAMD64MOVBload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpAMD64ROLWconst, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = 8 - v1 := b.NewValue0(x1.Pos, OpAMD64MOVWload, typ.UInt16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORL r1:(ROLWconst [8] x1:(MOVWload [i1] {s} p mem)) sh:(SHLLconst [16] r0:(ROLWconst [8] x0:(MOVWload [i0] {s} p mem)))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPL (MOVLload [i0] {s} p mem)) - for { - _ = v.Args[1] - r1 := v.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - sh := v.Args[1] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 16 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x0.Pos, OpAMD64BSWAPL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpAMD64MOVLload, typ.UInt32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORL sh:(SHLLconst [16] r0:(ROLWconst [8] x0:(MOVWload [i0] {s} p mem))) r1:(ROLWconst [8] x1:(MOVWload [i1] {s} p mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPL (MOVLload [i0] {s} p mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 16 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - r1 := v.Args[1] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpAMD64BSWAPL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpAMD64MOVLload, typ.UInt32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORL s0:(SHLLconst [j0] x0:(MOVBload [i0] {s} p mem)) or:(ORL s1:(SHLLconst [j1] x1:(MOVBload [i1] {s} p mem)) y)) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j1] (ROLWconst [8] (MOVWload [i0] {s} p mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - or := v.Args[1] - if or.Op != OpAMD64ORL { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x1.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(x1.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(x1.Pos, OpAMD64MOVWload, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL s0:(SHLLconst [j0] x0:(MOVBload [i0] {s} p mem)) or:(ORL y s1:(SHLLconst [j1] x1:(MOVBload [i1] {s} p mem)))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j1] (ROLWconst [8] (MOVWload [i0] {s} p mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - or := v.Args[1] - if or.Op != OpAMD64ORL { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x1.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(x1.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(x1.Pos, OpAMD64MOVWload, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL or:(ORL s1:(SHLLconst [j1] x1:(MOVBload [i1] {s} p mem)) y) s0:(SHLLconst [j0] x0:(MOVBload [i0] {s} p mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j1] (ROLWconst [8] (MOVWload [i0] {s} p mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORL { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x0.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(x0.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(x0.Pos, OpAMD64MOVWload, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORL_100(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORL or:(ORL y s1:(SHLLconst [j1] x1:(MOVBload [i1] {s} p mem))) s0:(SHLLconst [j0] x0:(MOVBload [i0] {s} p mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j1] (ROLWconst [8] (MOVWload [i0] {s} p mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORL { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x0.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(x0.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(x0.Pos, OpAMD64MOVWload, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL x1:(MOVBloadidx1 [i1] {s} p idx mem) sh:(SHLLconst [8] x0:(MOVBloadidx1 [i0] {s} p idx mem))) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64ROLWconst, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = 8 - v1 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORL x1:(MOVBloadidx1 [i1] {s} idx p mem) sh:(SHLLconst [8] x0:(MOVBloadidx1 [i0] {s} p idx mem))) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64ROLWconst, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = 8 - v1 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORL x1:(MOVBloadidx1 [i1] {s} p idx mem) sh:(SHLLconst [8] x0:(MOVBloadidx1 [i0] {s} idx p mem))) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64ROLWconst, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = 8 - v1 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORL x1:(MOVBloadidx1 [i1] {s} idx p mem) sh:(SHLLconst [8] x0:(MOVBloadidx1 [i0] {s} idx p mem))) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64ROLWconst, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = 8 - v1 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORL sh:(SHLLconst [8] x0:(MOVBloadidx1 [i0] {s} p idx mem)) x1:(MOVBloadidx1 [i1] {s} p idx mem)) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - x1 := v.Args[1] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64ROLWconst, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = 8 - v1 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORL sh:(SHLLconst [8] x0:(MOVBloadidx1 [i0] {s} idx p mem)) x1:(MOVBloadidx1 [i1] {s} p idx mem)) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - x1 := v.Args[1] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64ROLWconst, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = 8 - v1 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORL sh:(SHLLconst [8] x0:(MOVBloadidx1 [i0] {s} p idx mem)) x1:(MOVBloadidx1 [i1] {s} idx p mem)) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - x1 := v.Args[1] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64ROLWconst, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = 8 - v1 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORL sh:(SHLLconst [8] x0:(MOVBloadidx1 [i0] {s} idx p mem)) x1:(MOVBloadidx1 [i1] {s} idx p mem)) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - x1 := v.Args[1] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64ROLWconst, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = 8 - v1 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORL r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} p idx mem)) sh:(SHLLconst [16] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} p idx mem)))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - r1 := v.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 16 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64BSWAPL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORL_110(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORL r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} idx p mem)) sh:(SHLLconst [16] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} p idx mem)))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - r1 := v.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 16 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64BSWAPL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORL r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} p idx mem)) sh:(SHLLconst [16] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} idx p mem)))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - r1 := v.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 16 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64BSWAPL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORL r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} idx p mem)) sh:(SHLLconst [16] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} idx p mem)))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - r1 := v.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 16 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64BSWAPL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORL sh:(SHLLconst [16] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} p idx mem))) r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} p idx mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 16 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - r1 := v.Args[1] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64BSWAPL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORL sh:(SHLLconst [16] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} idx p mem))) r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} p idx mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 16 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - r1 := v.Args[1] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64BSWAPL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORL sh:(SHLLconst [16] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} p idx mem))) r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} idx p mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 16 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - r1 := v.Args[1] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64BSWAPL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORL sh:(SHLLconst [16] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} idx p mem))) r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} idx p mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 16 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - r1 := v.Args[1] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64BSWAPL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORL s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem)) or:(ORL s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem)) y)) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORL { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem)) or:(ORL s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem)) y)) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORL { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem)) or:(ORL s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem)) y)) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORL { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORL_120(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORL s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem)) or:(ORL s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem)) y)) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORL { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem)) or:(ORL y s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem)))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORL { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem)) or:(ORL y s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem)))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORL { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem)) or:(ORL y s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem)))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORL { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem)) or:(ORL y s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem)))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORL { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL or:(ORL s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem)) y) s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORL { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL or:(ORL s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem)) y) s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORL { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL or:(ORL y s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem))) s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORL { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL or:(ORL y s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem))) s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORL { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL or:(ORL s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem)) y) s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORL { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORL_130(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORL or:(ORL s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem)) y) s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORL { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL or:(ORL y s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem))) s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORL { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL or:(ORL y s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem))) s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORL { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLLconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLLconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORL x l:(MOVLload [off] {sym} ptr mem)) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (ORLload x [off] {sym} ptr mem) - for { - _ = v.Args[1] - x := v.Args[0] - l := v.Args[1] - if l.Op != OpAMD64MOVLload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break - } - v.reset(OpAMD64ORLload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (ORL l:(MOVLload [off] {sym} ptr mem) x) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (ORLload x [off] {sym} ptr mem) - for { - x := v.Args[1] - l := v.Args[0] - if l.Op != OpAMD64MOVLload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break - } - v.reset(OpAMD64ORLload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORLconst_0(v *Value) bool { - // match: (ORLconst [c] x) - // cond: isUint32PowerOfTwo(c) && uint64(c) >= 128 - // result: (BTSLconst [log2uint32(c)] x) - for { - c := v.AuxInt - x := v.Args[0] - if !(isUint32PowerOfTwo(c) && uint64(c) >= 128) { - break - } - v.reset(OpAMD64BTSLconst) - v.AuxInt = log2uint32(c) - v.AddArg(x) - return true - } - // match: (ORLconst [c] (ORLconst [d] x)) - // result: (ORLconst [c | d] x) - for { - c := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpAMD64ORLconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v.reset(OpAMD64ORLconst) - v.AuxInt = c | d - v.AddArg(x) - return true - } - // match: (ORLconst [c] (BTSLconst [d] x)) - // result: (ORLconst [c | 1<= 128 - // result: (BTSQconst [log2(c)] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVQconst { - break - } - c := v_0.AuxInt - if !(isUint64PowerOfTwo(c) && uint64(c) >= 128) { - break - } - v.reset(OpAMD64BTSQconst) - v.AuxInt = log2(c) - v.AddArg(x) - return true - } - // match: (ORQ x (MOVQconst [c])) - // cond: isUint64PowerOfTwo(c) && uint64(c) >= 128 - // result: (BTSQconst [log2(c)] x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVQconst { - break - } - c := v_1.AuxInt - if !(isUint64PowerOfTwo(c) && uint64(c) >= 128) { - break - } - v.reset(OpAMD64BTSQconst) - v.AuxInt = log2(c) - v.AddArg(x) - return true - } - // match: (ORQ x (MOVQconst [c])) - // cond: is32Bit(c) - // result: (ORQconst [c] x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVQconst { - break - } - c := v_1.AuxInt - if !(is32Bit(c)) { - break - } - v.reset(OpAMD64ORQconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ORQ (MOVQconst [c]) x) - // cond: is32Bit(c) - // result: (ORQconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVQconst { - break - } - c := v_0.AuxInt - if !(is32Bit(c)) { - break - } - v.reset(OpAMD64ORQconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ORQ (SHLQconst x [c]) (SHRQconst x [d])) - // cond: d==64-c - // result: (ROLQconst x [c]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLQconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHRQconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(d == 64-c) { - break - } - v.reset(OpAMD64ROLQconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ORQ (SHRQconst x [d]) (SHLQconst x [c])) - // cond: d==64-c - // result: (ROLQconst x [c]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHRQconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLQconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(d == 64-c) { - break - } - v.reset(OpAMD64ROLQconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ORQ (SHLQ x y) (ANDQ (SHRQ x (NEGQ y)) (SBBQcarrymask (CMPQconst (NEGQ (ADDQconst (ANDQconst y [63]) [-64])) [64])))) - // result: (ROLQ x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLQ { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ANDQ { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SHRQ { - break - } - _ = v_1_0.Args[1] - if x != v_1_0.Args[0] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpAMD64NEGQ || y != v_1_0_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64SBBQcarrymask { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64CMPQconst || v_1_1_0.AuxInt != 64 { - break - } - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAMD64NEGQ { - break - } - v_1_1_0_0_0 := v_1_1_0_0.Args[0] - if v_1_1_0_0_0.Op != OpAMD64ADDQconst || v_1_1_0_0_0.AuxInt != -64 { - break - } - v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] - if v_1_1_0_0_0_0.Op != OpAMD64ANDQconst || v_1_1_0_0_0_0.AuxInt != 63 || y != v_1_1_0_0_0_0.Args[0] { - break - } - v.reset(OpAMD64ROLQ) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORQ (SHLQ x y) (ANDQ (SBBQcarrymask (CMPQconst (NEGQ (ADDQconst (ANDQconst y [63]) [-64])) [64])) (SHRQ x (NEGQ y)))) - // result: (ROLQ x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLQ { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ANDQ { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SBBQcarrymask { - break - } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAMD64CMPQconst || v_1_0_0.AuxInt != 64 { - break - } - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpAMD64NEGQ { - break - } - v_1_0_0_0_0 := v_1_0_0_0.Args[0] - if v_1_0_0_0_0.Op != OpAMD64ADDQconst || v_1_0_0_0_0.AuxInt != -64 { - break - } - v_1_0_0_0_0_0 := v_1_0_0_0_0.Args[0] - if v_1_0_0_0_0_0.Op != OpAMD64ANDQconst || v_1_0_0_0_0_0.AuxInt != 63 || y != v_1_0_0_0_0_0.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64SHRQ { - break - } - _ = v_1_1.Args[1] - if x != v_1_1.Args[0] { - break - } - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpAMD64NEGQ || y != v_1_1_1.Args[0] { - break - } - v.reset(OpAMD64ROLQ) - v.AddArg(x) - v.AddArg(y) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORQ_10(v *Value) bool { - // match: (ORQ (ANDQ (SHRQ x (NEGQ y)) (SBBQcarrymask (CMPQconst (NEGQ (ADDQconst (ANDQconst y [63]) [-64])) [64]))) (SHLQ x y)) - // result: (ROLQ x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ANDQ { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SHRQ { - break - } - _ = v_0_0.Args[1] - x := v_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpAMD64NEGQ { - break - } - y := v_0_0_1.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SBBQcarrymask { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpAMD64CMPQconst || v_0_1_0.AuxInt != 64 { - break - } - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpAMD64NEGQ { - break - } - v_0_1_0_0_0 := v_0_1_0_0.Args[0] - if v_0_1_0_0_0.Op != OpAMD64ADDQconst || v_0_1_0_0_0.AuxInt != -64 { - break - } - v_0_1_0_0_0_0 := v_0_1_0_0_0.Args[0] - if v_0_1_0_0_0_0.Op != OpAMD64ANDQconst || v_0_1_0_0_0_0.AuxInt != 63 || y != v_0_1_0_0_0_0.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLQ { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] || y != v_1.Args[1] { - break - } - v.reset(OpAMD64ROLQ) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORQ (ANDQ (SBBQcarrymask (CMPQconst (NEGQ (ADDQconst (ANDQconst y [63]) [-64])) [64])) (SHRQ x (NEGQ y))) (SHLQ x y)) - // result: (ROLQ x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ANDQ { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SBBQcarrymask { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64CMPQconst || v_0_0_0.AuxInt != 64 { - break - } - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpAMD64NEGQ { - break - } - v_0_0_0_0_0 := v_0_0_0_0.Args[0] - if v_0_0_0_0_0.Op != OpAMD64ADDQconst || v_0_0_0_0_0.AuxInt != -64 { - break - } - v_0_0_0_0_0_0 := v_0_0_0_0_0.Args[0] - if v_0_0_0_0_0_0.Op != OpAMD64ANDQconst || v_0_0_0_0_0_0.AuxInt != 63 { - break - } - y := v_0_0_0_0_0_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SHRQ { - break - } - _ = v_0_1.Args[1] - x := v_0_1.Args[0] - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpAMD64NEGQ || y != v_0_1_1.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLQ { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] || y != v_1.Args[1] { - break - } - v.reset(OpAMD64ROLQ) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORQ (SHLQ x y) (ANDQ (SHRQ x (NEGL y)) (SBBQcarrymask (CMPLconst (NEGL (ADDLconst (ANDLconst y [63]) [-64])) [64])))) - // result: (ROLQ x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLQ { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ANDQ { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SHRQ { - break - } - _ = v_1_0.Args[1] - if x != v_1_0.Args[0] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpAMD64NEGL || y != v_1_0_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64SBBQcarrymask { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64CMPLconst || v_1_1_0.AuxInt != 64 { - break - } - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAMD64NEGL { - break - } - v_1_1_0_0_0 := v_1_1_0_0.Args[0] - if v_1_1_0_0_0.Op != OpAMD64ADDLconst || v_1_1_0_0_0.AuxInt != -64 { - break - } - v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] - if v_1_1_0_0_0_0.Op != OpAMD64ANDLconst || v_1_1_0_0_0_0.AuxInt != 63 || y != v_1_1_0_0_0_0.Args[0] { - break - } - v.reset(OpAMD64ROLQ) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORQ (SHLQ x y) (ANDQ (SBBQcarrymask (CMPLconst (NEGL (ADDLconst (ANDLconst y [63]) [-64])) [64])) (SHRQ x (NEGL y)))) - // result: (ROLQ x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLQ { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ANDQ { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SBBQcarrymask { - break - } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAMD64CMPLconst || v_1_0_0.AuxInt != 64 { - break - } - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpAMD64NEGL { - break - } - v_1_0_0_0_0 := v_1_0_0_0.Args[0] - if v_1_0_0_0_0.Op != OpAMD64ADDLconst || v_1_0_0_0_0.AuxInt != -64 { - break - } - v_1_0_0_0_0_0 := v_1_0_0_0_0.Args[0] - if v_1_0_0_0_0_0.Op != OpAMD64ANDLconst || v_1_0_0_0_0_0.AuxInt != 63 || y != v_1_0_0_0_0_0.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64SHRQ { - break - } - _ = v_1_1.Args[1] - if x != v_1_1.Args[0] { - break - } - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpAMD64NEGL || y != v_1_1_1.Args[0] { - break - } - v.reset(OpAMD64ROLQ) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORQ (ANDQ (SHRQ x (NEGL y)) (SBBQcarrymask (CMPLconst (NEGL (ADDLconst (ANDLconst y [63]) [-64])) [64]))) (SHLQ x y)) - // result: (ROLQ x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ANDQ { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SHRQ { - break - } - _ = v_0_0.Args[1] - x := v_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpAMD64NEGL { - break - } - y := v_0_0_1.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SBBQcarrymask { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpAMD64CMPLconst || v_0_1_0.AuxInt != 64 { - break - } - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpAMD64NEGL { - break - } - v_0_1_0_0_0 := v_0_1_0_0.Args[0] - if v_0_1_0_0_0.Op != OpAMD64ADDLconst || v_0_1_0_0_0.AuxInt != -64 { - break - } - v_0_1_0_0_0_0 := v_0_1_0_0_0.Args[0] - if v_0_1_0_0_0_0.Op != OpAMD64ANDLconst || v_0_1_0_0_0_0.AuxInt != 63 || y != v_0_1_0_0_0_0.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLQ { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] || y != v_1.Args[1] { - break - } - v.reset(OpAMD64ROLQ) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORQ (ANDQ (SBBQcarrymask (CMPLconst (NEGL (ADDLconst (ANDLconst y [63]) [-64])) [64])) (SHRQ x (NEGL y))) (SHLQ x y)) - // result: (ROLQ x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ANDQ { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SBBQcarrymask { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64CMPLconst || v_0_0_0.AuxInt != 64 { - break - } - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpAMD64NEGL { - break - } - v_0_0_0_0_0 := v_0_0_0_0.Args[0] - if v_0_0_0_0_0.Op != OpAMD64ADDLconst || v_0_0_0_0_0.AuxInt != -64 { - break - } - v_0_0_0_0_0_0 := v_0_0_0_0_0.Args[0] - if v_0_0_0_0_0_0.Op != OpAMD64ANDLconst || v_0_0_0_0_0_0.AuxInt != 63 { - break - } - y := v_0_0_0_0_0_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SHRQ { - break - } - _ = v_0_1.Args[1] - x := v_0_1.Args[0] - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpAMD64NEGL || y != v_0_1_1.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLQ { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] || y != v_1.Args[1] { - break - } - v.reset(OpAMD64ROLQ) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORQ (SHRQ x y) (ANDQ (SHLQ x (NEGQ y)) (SBBQcarrymask (CMPQconst (NEGQ (ADDQconst (ANDQconst y [63]) [-64])) [64])))) - // result: (RORQ x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHRQ { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ANDQ { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SHLQ { - break - } - _ = v_1_0.Args[1] - if x != v_1_0.Args[0] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpAMD64NEGQ || y != v_1_0_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64SBBQcarrymask { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64CMPQconst || v_1_1_0.AuxInt != 64 { - break - } - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAMD64NEGQ { - break - } - v_1_1_0_0_0 := v_1_1_0_0.Args[0] - if v_1_1_0_0_0.Op != OpAMD64ADDQconst || v_1_1_0_0_0.AuxInt != -64 { - break - } - v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] - if v_1_1_0_0_0_0.Op != OpAMD64ANDQconst || v_1_1_0_0_0_0.AuxInt != 63 || y != v_1_1_0_0_0_0.Args[0] { - break - } - v.reset(OpAMD64RORQ) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORQ (SHRQ x y) (ANDQ (SBBQcarrymask (CMPQconst (NEGQ (ADDQconst (ANDQconst y [63]) [-64])) [64])) (SHLQ x (NEGQ y)))) - // result: (RORQ x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHRQ { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ANDQ { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SBBQcarrymask { - break - } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAMD64CMPQconst || v_1_0_0.AuxInt != 64 { - break - } - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpAMD64NEGQ { - break - } - v_1_0_0_0_0 := v_1_0_0_0.Args[0] - if v_1_0_0_0_0.Op != OpAMD64ADDQconst || v_1_0_0_0_0.AuxInt != -64 { - break - } - v_1_0_0_0_0_0 := v_1_0_0_0_0.Args[0] - if v_1_0_0_0_0_0.Op != OpAMD64ANDQconst || v_1_0_0_0_0_0.AuxInt != 63 || y != v_1_0_0_0_0_0.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64SHLQ { - break - } - _ = v_1_1.Args[1] - if x != v_1_1.Args[0] { - break - } - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpAMD64NEGQ || y != v_1_1_1.Args[0] { - break - } - v.reset(OpAMD64RORQ) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORQ (ANDQ (SHLQ x (NEGQ y)) (SBBQcarrymask (CMPQconst (NEGQ (ADDQconst (ANDQconst y [63]) [-64])) [64]))) (SHRQ x y)) - // result: (RORQ x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ANDQ { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SHLQ { - break - } - _ = v_0_0.Args[1] - x := v_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpAMD64NEGQ { - break - } - y := v_0_0_1.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SBBQcarrymask { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpAMD64CMPQconst || v_0_1_0.AuxInt != 64 { - break - } - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpAMD64NEGQ { - break - } - v_0_1_0_0_0 := v_0_1_0_0.Args[0] - if v_0_1_0_0_0.Op != OpAMD64ADDQconst || v_0_1_0_0_0.AuxInt != -64 { - break - } - v_0_1_0_0_0_0 := v_0_1_0_0_0.Args[0] - if v_0_1_0_0_0_0.Op != OpAMD64ANDQconst || v_0_1_0_0_0_0.AuxInt != 63 || y != v_0_1_0_0_0_0.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHRQ { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] || y != v_1.Args[1] { - break - } - v.reset(OpAMD64RORQ) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORQ (ANDQ (SBBQcarrymask (CMPQconst (NEGQ (ADDQconst (ANDQconst y [63]) [-64])) [64])) (SHLQ x (NEGQ y))) (SHRQ x y)) - // result: (RORQ x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ANDQ { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SBBQcarrymask { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64CMPQconst || v_0_0_0.AuxInt != 64 { - break - } - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpAMD64NEGQ { - break - } - v_0_0_0_0_0 := v_0_0_0_0.Args[0] - if v_0_0_0_0_0.Op != OpAMD64ADDQconst || v_0_0_0_0_0.AuxInt != -64 { - break - } - v_0_0_0_0_0_0 := v_0_0_0_0_0.Args[0] - if v_0_0_0_0_0_0.Op != OpAMD64ANDQconst || v_0_0_0_0_0_0.AuxInt != 63 { - break - } - y := v_0_0_0_0_0_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SHLQ { - break - } - _ = v_0_1.Args[1] - x := v_0_1.Args[0] - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpAMD64NEGQ || y != v_0_1_1.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHRQ { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] || y != v_1.Args[1] { - break - } - v.reset(OpAMD64RORQ) - v.AddArg(x) - v.AddArg(y) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORQ_20(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORQ (SHRQ x y) (ANDQ (SHLQ x (NEGL y)) (SBBQcarrymask (CMPLconst (NEGL (ADDLconst (ANDLconst y [63]) [-64])) [64])))) - // result: (RORQ x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHRQ { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ANDQ { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SHLQ { - break - } - _ = v_1_0.Args[1] - if x != v_1_0.Args[0] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpAMD64NEGL || y != v_1_0_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64SBBQcarrymask { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64CMPLconst || v_1_1_0.AuxInt != 64 { - break - } - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAMD64NEGL { - break - } - v_1_1_0_0_0 := v_1_1_0_0.Args[0] - if v_1_1_0_0_0.Op != OpAMD64ADDLconst || v_1_1_0_0_0.AuxInt != -64 { - break - } - v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] - if v_1_1_0_0_0_0.Op != OpAMD64ANDLconst || v_1_1_0_0_0_0.AuxInt != 63 || y != v_1_1_0_0_0_0.Args[0] { - break - } - v.reset(OpAMD64RORQ) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORQ (SHRQ x y) (ANDQ (SBBQcarrymask (CMPLconst (NEGL (ADDLconst (ANDLconst y [63]) [-64])) [64])) (SHLQ x (NEGL y)))) - // result: (RORQ x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHRQ { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ANDQ { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SBBQcarrymask { - break - } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAMD64CMPLconst || v_1_0_0.AuxInt != 64 { - break - } - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpAMD64NEGL { - break - } - v_1_0_0_0_0 := v_1_0_0_0.Args[0] - if v_1_0_0_0_0.Op != OpAMD64ADDLconst || v_1_0_0_0_0.AuxInt != -64 { - break - } - v_1_0_0_0_0_0 := v_1_0_0_0_0.Args[0] - if v_1_0_0_0_0_0.Op != OpAMD64ANDLconst || v_1_0_0_0_0_0.AuxInt != 63 || y != v_1_0_0_0_0_0.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64SHLQ { - break - } - _ = v_1_1.Args[1] - if x != v_1_1.Args[0] { - break - } - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpAMD64NEGL || y != v_1_1_1.Args[0] { - break - } - v.reset(OpAMD64RORQ) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORQ (ANDQ (SHLQ x (NEGL y)) (SBBQcarrymask (CMPLconst (NEGL (ADDLconst (ANDLconst y [63]) [-64])) [64]))) (SHRQ x y)) - // result: (RORQ x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ANDQ { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SHLQ { - break - } - _ = v_0_0.Args[1] - x := v_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpAMD64NEGL { - break - } - y := v_0_0_1.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SBBQcarrymask { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpAMD64CMPLconst || v_0_1_0.AuxInt != 64 { - break - } - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpAMD64NEGL { - break - } - v_0_1_0_0_0 := v_0_1_0_0.Args[0] - if v_0_1_0_0_0.Op != OpAMD64ADDLconst || v_0_1_0_0_0.AuxInt != -64 { - break - } - v_0_1_0_0_0_0 := v_0_1_0_0_0.Args[0] - if v_0_1_0_0_0_0.Op != OpAMD64ANDLconst || v_0_1_0_0_0_0.AuxInt != 63 || y != v_0_1_0_0_0_0.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHRQ { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] || y != v_1.Args[1] { - break - } - v.reset(OpAMD64RORQ) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORQ (ANDQ (SBBQcarrymask (CMPLconst (NEGL (ADDLconst (ANDLconst y [63]) [-64])) [64])) (SHLQ x (NEGL y))) (SHRQ x y)) - // result: (RORQ x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ANDQ { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SBBQcarrymask { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64CMPLconst || v_0_0_0.AuxInt != 64 { - break - } - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpAMD64NEGL { - break - } - v_0_0_0_0_0 := v_0_0_0_0.Args[0] - if v_0_0_0_0_0.Op != OpAMD64ADDLconst || v_0_0_0_0_0.AuxInt != -64 { - break - } - v_0_0_0_0_0_0 := v_0_0_0_0_0.Args[0] - if v_0_0_0_0_0_0.Op != OpAMD64ANDLconst || v_0_0_0_0_0_0.AuxInt != 63 { - break - } - y := v_0_0_0_0_0_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SHLQ { - break - } - _ = v_0_1.Args[1] - x := v_0_1.Args[0] - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpAMD64NEGL || y != v_0_1_1.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHRQ { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] || y != v_1.Args[1] { - break - } - v.reset(OpAMD64RORQ) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ORQ x x) - // result: x - for { - x := v.Args[1] - if x != v.Args[0] { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (ORQ x0:(MOVBload [i0] {s} p mem) sh:(SHLQconst [8] x1:(MOVBload [i1] {s} p mem))) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWload [i0] {s} p mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpAMD64MOVBload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVBload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpAMD64MOVWload, typ.UInt16) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (ORQ sh:(SHLQconst [8] x1:(MOVBload [i1] {s} p mem)) x0:(MOVBload [i0] {s} p mem)) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWload [i0] {s} p mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVBload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - x0 := v.Args[1] - if x0.Op != OpAMD64MOVBload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x0.Pos, OpAMD64MOVWload, typ.UInt16) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (ORQ x0:(MOVWload [i0] {s} p mem) sh:(SHLQconst [16] x1:(MOVWload [i1] {s} p mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVLload [i0] {s} p mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpAMD64MOVWload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 16 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVWload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpAMD64MOVLload, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (ORQ sh:(SHLQconst [16] x1:(MOVWload [i1] {s} p mem)) x0:(MOVWload [i0] {s} p mem)) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVLload [i0] {s} p mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 16 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVWload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - x0 := v.Args[1] - if x0.Op != OpAMD64MOVWload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x0.Pos, OpAMD64MOVLload, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (ORQ x0:(MOVLload [i0] {s} p mem) sh:(SHLQconst [32] x1:(MOVLload [i1] {s} p mem))) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVQload [i0] {s} p mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpAMD64MOVLload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 32 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVLload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpAMD64MOVQload, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORQ_30(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORQ sh:(SHLQconst [32] x1:(MOVLload [i1] {s} p mem)) x0:(MOVLload [i0] {s} p mem)) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVQload [i0] {s} p mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 32 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVLload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - x0 := v.Args[1] - if x0.Op != OpAMD64MOVLload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x0.Pos, OpAMD64MOVQload, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (ORQ s1:(SHLQconst [j1] x1:(MOVBload [i1] {s} p mem)) or:(ORQ s0:(SHLQconst [j0] x0:(MOVBload [i0] {s} p mem)) y)) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVWload [i0] {s} p mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x0.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(x0.Pos, OpAMD64MOVWload, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s1:(SHLQconst [j1] x1:(MOVBload [i1] {s} p mem)) or:(ORQ y s0:(SHLQconst [j0] x0:(MOVBload [i0] {s} p mem)))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVWload [i0] {s} p mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x0.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(x0.Pos, OpAMD64MOVWload, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ s0:(SHLQconst [j0] x0:(MOVBload [i0] {s} p mem)) y) s1:(SHLQconst [j1] x1:(MOVBload [i1] {s} p mem))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVWload [i0] {s} p mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x1.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(x1.Pos, OpAMD64MOVWload, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ y s0:(SHLQconst [j0] x0:(MOVBload [i0] {s} p mem))) s1:(SHLQconst [j1] x1:(MOVBload [i1] {s} p mem))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVWload [i0] {s} p mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x1.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(x1.Pos, OpAMD64MOVWload, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s1:(SHLQconst [j1] x1:(MOVWload [i1] {s} p mem)) or:(ORQ s0:(SHLQconst [j0] x0:(MOVWload [i0] {s} p mem)) y)) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVLload [i0] {s} p mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVWload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVWload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x0.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(x0.Pos, OpAMD64MOVLload, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s1:(SHLQconst [j1] x1:(MOVWload [i1] {s} p mem)) or:(ORQ y s0:(SHLQconst [j0] x0:(MOVWload [i0] {s} p mem)))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVLload [i0] {s} p mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVWload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVWload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x0.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(x0.Pos, OpAMD64MOVLload, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ s0:(SHLQconst [j0] x0:(MOVWload [i0] {s} p mem)) y) s1:(SHLQconst [j1] x1:(MOVWload [i1] {s} p mem))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVLload [i0] {s} p mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVWload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVWload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x1.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(x1.Pos, OpAMD64MOVLload, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ y s0:(SHLQconst [j0] x0:(MOVWload [i0] {s} p mem))) s1:(SHLQconst [j1] x1:(MOVWload [i1] {s} p mem))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVLload [i0] {s} p mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVWload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVWload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x1.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(x1.Pos, OpAMD64MOVLload, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ x0:(MOVBloadidx1 [i0] {s} p idx mem) sh:(SHLQconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem))) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORQ_40(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORQ x0:(MOVBloadidx1 [i0] {s} idx p mem) sh:(SHLQconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem))) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORQ x0:(MOVBloadidx1 [i0] {s} p idx mem) sh:(SHLQconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem))) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORQ x0:(MOVBloadidx1 [i0] {s} idx p mem) sh:(SHLQconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem))) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORQ sh:(SHLQconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem)) x0:(MOVBloadidx1 [i0] {s} p idx mem)) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - x0 := v.Args[1] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORQ sh:(SHLQconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem)) x0:(MOVBloadidx1 [i0] {s} p idx mem)) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - x0 := v.Args[1] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORQ sh:(SHLQconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem)) x0:(MOVBloadidx1 [i0] {s} idx p mem)) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - x0 := v.Args[1] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORQ sh:(SHLQconst [8] x1:(MOVBloadidx1 [i1] {s} idx p mem)) x0:(MOVBloadidx1 [i0] {s} idx p mem)) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - x0 := v.Args[1] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORQ x0:(MOVWloadidx1 [i0] {s} p idx mem) sh:(SHLQconst [16] x1:(MOVWloadidx1 [i1] {s} p idx mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 16 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORQ x0:(MOVWloadidx1 [i0] {s} idx p mem) sh:(SHLQconst [16] x1:(MOVWloadidx1 [i1] {s} p idx mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 16 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORQ x0:(MOVWloadidx1 [i0] {s} p idx mem) sh:(SHLQconst [16] x1:(MOVWloadidx1 [i1] {s} idx p mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 16 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORQ_50(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORQ x0:(MOVWloadidx1 [i0] {s} idx p mem) sh:(SHLQconst [16] x1:(MOVWloadidx1 [i1] {s} idx p mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 16 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORQ sh:(SHLQconst [16] x1:(MOVWloadidx1 [i1] {s} p idx mem)) x0:(MOVWloadidx1 [i0] {s} p idx mem)) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 16 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - x0 := v.Args[1] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORQ sh:(SHLQconst [16] x1:(MOVWloadidx1 [i1] {s} idx p mem)) x0:(MOVWloadidx1 [i0] {s} p idx mem)) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 16 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - x0 := v.Args[1] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORQ sh:(SHLQconst [16] x1:(MOVWloadidx1 [i1] {s} p idx mem)) x0:(MOVWloadidx1 [i0] {s} idx p mem)) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 16 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - x0 := v.Args[1] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORQ sh:(SHLQconst [16] x1:(MOVWloadidx1 [i1] {s} idx p mem)) x0:(MOVWloadidx1 [i0] {s} idx p mem)) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVLloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 16 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - x0 := v.Args[1] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORQ x0:(MOVLloadidx1 [i0] {s} p idx mem) sh:(SHLQconst [32] x1:(MOVLloadidx1 [i1] {s} p idx mem))) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVQloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpAMD64MOVLloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 32 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVLloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVQloadidx1, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORQ x0:(MOVLloadidx1 [i0] {s} idx p mem) sh:(SHLQconst [32] x1:(MOVLloadidx1 [i1] {s} p idx mem))) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVQloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpAMD64MOVLloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 32 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVLloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVQloadidx1, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORQ x0:(MOVLloadidx1 [i0] {s} p idx mem) sh:(SHLQconst [32] x1:(MOVLloadidx1 [i1] {s} idx p mem))) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVQloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpAMD64MOVLloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 32 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVLloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVQloadidx1, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORQ x0:(MOVLloadidx1 [i0] {s} idx p mem) sh:(SHLQconst [32] x1:(MOVLloadidx1 [i1] {s} idx p mem))) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVQloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpAMD64MOVLloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 32 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVLloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVQloadidx1, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORQ sh:(SHLQconst [32] x1:(MOVLloadidx1 [i1] {s} p idx mem)) x0:(MOVLloadidx1 [i0] {s} p idx mem)) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVQloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 32 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVLloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - x0 := v.Args[1] - if x0.Op != OpAMD64MOVLloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVQloadidx1, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORQ_60(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORQ sh:(SHLQconst [32] x1:(MOVLloadidx1 [i1] {s} idx p mem)) x0:(MOVLloadidx1 [i0] {s} p idx mem)) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVQloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 32 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVLloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - x0 := v.Args[1] - if x0.Op != OpAMD64MOVLloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVQloadidx1, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORQ sh:(SHLQconst [32] x1:(MOVLloadidx1 [i1] {s} p idx mem)) x0:(MOVLloadidx1 [i0] {s} idx p mem)) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVQloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 32 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVLloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - x0 := v.Args[1] - if x0.Op != OpAMD64MOVLloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVQloadidx1, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORQ sh:(SHLQconst [32] x1:(MOVLloadidx1 [i1] {s} idx p mem)) x0:(MOVLloadidx1 [i0] {s} idx p mem)) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVQloadidx1 [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 32 { - break - } - x1 := sh.Args[0] - if x1.Op != OpAMD64MOVLloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - x0 := v.Args[1] - if x0.Op != OpAMD64MOVLloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64MOVQloadidx1, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORQ s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem)) or:(ORQ s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem)) y)) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem)) or:(ORQ s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem)) y)) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem)) or:(ORQ s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem)) y)) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem)) or:(ORQ s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem)) y)) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem)) or:(ORQ y s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem)))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem)) or:(ORQ y s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem)))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem)) or:(ORQ y s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem)))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORQ_70(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORQ s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem)) or:(ORQ y s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem)))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem)) y) s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem)) y) s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ y s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem))) s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ y s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem))) s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem)) y) s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem)) y) s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ y s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem))) s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ y s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem))) s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem))) - // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s1:(SHLQconst [j1] x1:(MOVWloadidx1 [i1] {s} p idx mem)) or:(ORQ s0:(SHLQconst [j0] x0:(MOVWloadidx1 [i0] {s} p idx mem)) y)) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVLloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORQ_80(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORQ s1:(SHLQconst [j1] x1:(MOVWloadidx1 [i1] {s} idx p mem)) or:(ORQ s0:(SHLQconst [j0] x0:(MOVWloadidx1 [i0] {s} p idx mem)) y)) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVLloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s1:(SHLQconst [j1] x1:(MOVWloadidx1 [i1] {s} p idx mem)) or:(ORQ s0:(SHLQconst [j0] x0:(MOVWloadidx1 [i0] {s} idx p mem)) y)) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVLloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s1:(SHLQconst [j1] x1:(MOVWloadidx1 [i1] {s} idx p mem)) or:(ORQ s0:(SHLQconst [j0] x0:(MOVWloadidx1 [i0] {s} idx p mem)) y)) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVLloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s1:(SHLQconst [j1] x1:(MOVWloadidx1 [i1] {s} p idx mem)) or:(ORQ y s0:(SHLQconst [j0] x0:(MOVWloadidx1 [i0] {s} p idx mem)))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVLloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s1:(SHLQconst [j1] x1:(MOVWloadidx1 [i1] {s} idx p mem)) or:(ORQ y s0:(SHLQconst [j0] x0:(MOVWloadidx1 [i0] {s} p idx mem)))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVLloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s1:(SHLQconst [j1] x1:(MOVWloadidx1 [i1] {s} p idx mem)) or:(ORQ y s0:(SHLQconst [j0] x0:(MOVWloadidx1 [i0] {s} idx p mem)))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVLloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s1:(SHLQconst [j1] x1:(MOVWloadidx1 [i1] {s} idx p mem)) or:(ORQ y s0:(SHLQconst [j0] x0:(MOVWloadidx1 [i0] {s} idx p mem)))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVLloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ s0:(SHLQconst [j0] x0:(MOVWloadidx1 [i0] {s} p idx mem)) y) s1:(SHLQconst [j1] x1:(MOVWloadidx1 [i1] {s} p idx mem))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVLloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ s0:(SHLQconst [j0] x0:(MOVWloadidx1 [i0] {s} idx p mem)) y) s1:(SHLQconst [j1] x1:(MOVWloadidx1 [i1] {s} p idx mem))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVLloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ y s0:(SHLQconst [j0] x0:(MOVWloadidx1 [i0] {s} p idx mem))) s1:(SHLQconst [j1] x1:(MOVWloadidx1 [i1] {s} p idx mem))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVLloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORQ_90(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORQ or:(ORQ y s0:(SHLQconst [j0] x0:(MOVWloadidx1 [i0] {s} idx p mem))) s1:(SHLQconst [j1] x1:(MOVWloadidx1 [i1] {s} p idx mem))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVLloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ s0:(SHLQconst [j0] x0:(MOVWloadidx1 [i0] {s} p idx mem)) y) s1:(SHLQconst [j1] x1:(MOVWloadidx1 [i1] {s} idx p mem))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVLloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ s0:(SHLQconst [j0] x0:(MOVWloadidx1 [i0] {s} idx p mem)) y) s1:(SHLQconst [j1] x1:(MOVWloadidx1 [i1] {s} idx p mem))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVLloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ y s0:(SHLQconst [j0] x0:(MOVWloadidx1 [i0] {s} p idx mem))) s1:(SHLQconst [j1] x1:(MOVWloadidx1 [i1] {s} idx p mem))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVLloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ y s0:(SHLQconst [j0] x0:(MOVWloadidx1 [i0] {s} idx p mem))) s1:(SHLQconst [j1] x1:(MOVWloadidx1 [i1] {s} idx p mem))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVLloadidx1 [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ x1:(MOVBload [i1] {s} p mem) sh:(SHLQconst [8] x0:(MOVBload [i0] {s} p mem))) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (ROLWconst [8] (MOVWload [i0] {s} p mem)) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpAMD64MOVBload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpAMD64MOVBload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x0.Pos, OpAMD64ROLWconst, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = 8 - v1 := b.NewValue0(x0.Pos, OpAMD64MOVWload, typ.UInt16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORQ sh:(SHLQconst [8] x0:(MOVBload [i0] {s} p mem)) x1:(MOVBload [i1] {s} p mem)) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (ROLWconst [8] (MOVWload [i0] {s} p mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpAMD64MOVBload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - x1 := v.Args[1] - if x1.Op != OpAMD64MOVBload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpAMD64ROLWconst, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = 8 - v1 := b.NewValue0(x1.Pos, OpAMD64MOVWload, typ.UInt16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORQ r1:(ROLWconst [8] x1:(MOVWload [i1] {s} p mem)) sh:(SHLQconst [16] r0:(ROLWconst [8] x0:(MOVWload [i0] {s} p mem)))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPL (MOVLload [i0] {s} p mem)) - for { - _ = v.Args[1] - r1 := v.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 16 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x0.Pos, OpAMD64BSWAPL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpAMD64MOVLload, typ.UInt32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORQ sh:(SHLQconst [16] r0:(ROLWconst [8] x0:(MOVWload [i0] {s} p mem))) r1:(ROLWconst [8] x1:(MOVWload [i1] {s} p mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPL (MOVLload [i0] {s} p mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 16 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - r1 := v.Args[1] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpAMD64BSWAPL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpAMD64MOVLload, typ.UInt32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORQ r1:(BSWAPL x1:(MOVLload [i1] {s} p mem)) sh:(SHLQconst [32] r0:(BSWAPL x0:(MOVLload [i0] {s} p mem)))) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPQ (MOVQload [i0] {s} p mem)) - for { - _ = v.Args[1] - r1 := v.Args[0] - if r1.Op != OpAMD64BSWAPL { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVLload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 32 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64BSWAPL { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVLload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x0.Pos, OpAMD64BSWAPQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpAMD64MOVQload, typ.UInt64) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORQ_100(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORQ sh:(SHLQconst [32] r0:(BSWAPL x0:(MOVLload [i0] {s} p mem))) r1:(BSWAPL x1:(MOVLload [i1] {s} p mem))) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPQ (MOVQload [i0] {s} p mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 32 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64BSWAPL { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVLload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - r1 := v.Args[1] - if r1.Op != OpAMD64BSWAPL { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVLload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpAMD64BSWAPQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpAMD64MOVQload, typ.UInt64) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORQ s0:(SHLQconst [j0] x0:(MOVBload [i0] {s} p mem)) or:(ORQ s1:(SHLQconst [j1] x1:(MOVBload [i1] {s} p mem)) y)) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (ROLWconst [8] (MOVWload [i0] {s} p mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x1.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(x1.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(x1.Pos, OpAMD64MOVWload, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s0:(SHLQconst [j0] x0:(MOVBload [i0] {s} p mem)) or:(ORQ y s1:(SHLQconst [j1] x1:(MOVBload [i1] {s} p mem)))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (ROLWconst [8] (MOVWload [i0] {s} p mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x1.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(x1.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(x1.Pos, OpAMD64MOVWload, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ s1:(SHLQconst [j1] x1:(MOVBload [i1] {s} p mem)) y) s0:(SHLQconst [j0] x0:(MOVBload [i0] {s} p mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (ROLWconst [8] (MOVWload [i0] {s} p mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x0.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(x0.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(x0.Pos, OpAMD64MOVWload, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ y s1:(SHLQconst [j1] x1:(MOVBload [i1] {s} p mem))) s0:(SHLQconst [j0] x0:(MOVBload [i0] {s} p mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (ROLWconst [8] (MOVWload [i0] {s} p mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x0.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(x0.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(x0.Pos, OpAMD64MOVWload, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWload [i0] {s} p mem))) or:(ORQ s1:(SHLQconst [j1] r1:(ROLWconst [8] x1:(MOVWload [i1] {s} p mem))) y)) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (BSWAPL (MOVLload [i0] {s} p mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x1.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(x1.Pos, OpAMD64BSWAPL, typ.UInt32) - v3 := b.NewValue0(x1.Pos, OpAMD64MOVLload, typ.UInt32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWload [i0] {s} p mem))) or:(ORQ y s1:(SHLQconst [j1] r1:(ROLWconst [8] x1:(MOVWload [i1] {s} p mem))))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (BSWAPL (MOVLload [i0] {s} p mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x1.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(x1.Pos, OpAMD64BSWAPL, typ.UInt32) - v3 := b.NewValue0(x1.Pos, OpAMD64MOVLload, typ.UInt32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ s1:(SHLQconst [j1] r1:(ROLWconst [8] x1:(MOVWload [i1] {s} p mem))) y) s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWload [i0] {s} p mem)))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (BSWAPL (MOVLload [i0] {s} p mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x0.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(x0.Pos, OpAMD64BSWAPL, typ.UInt32) - v3 := b.NewValue0(x0.Pos, OpAMD64MOVLload, typ.UInt32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ y s1:(SHLQconst [j1] r1:(ROLWconst [8] x1:(MOVWload [i1] {s} p mem)))) s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWload [i0] {s} p mem)))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (BSWAPL (MOVLload [i0] {s} p mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x0.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(x0.Pos, OpAMD64BSWAPL, typ.UInt32) - v3 := b.NewValue0(x0.Pos, OpAMD64MOVLload, typ.UInt32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ x1:(MOVBloadidx1 [i1] {s} p idx mem) sh:(SHLQconst [8] x0:(MOVBloadidx1 [i0] {s} p idx mem))) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64ROLWconst, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = 8 - v1 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORQ_110(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORQ x1:(MOVBloadidx1 [i1] {s} idx p mem) sh:(SHLQconst [8] x0:(MOVBloadidx1 [i0] {s} p idx mem))) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64ROLWconst, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = 8 - v1 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORQ x1:(MOVBloadidx1 [i1] {s} p idx mem) sh:(SHLQconst [8] x0:(MOVBloadidx1 [i0] {s} idx p mem))) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64ROLWconst, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = 8 - v1 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORQ x1:(MOVBloadidx1 [i1] {s} idx p mem) sh:(SHLQconst [8] x0:(MOVBloadidx1 [i0] {s} idx p mem))) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64ROLWconst, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = 8 - v1 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORQ sh:(SHLQconst [8] x0:(MOVBloadidx1 [i0] {s} p idx mem)) x1:(MOVBloadidx1 [i1] {s} p idx mem)) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - x1 := v.Args[1] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64ROLWconst, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = 8 - v1 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORQ sh:(SHLQconst [8] x0:(MOVBloadidx1 [i0] {s} idx p mem)) x1:(MOVBloadidx1 [i1] {s} p idx mem)) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - x1 := v.Args[1] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64ROLWconst, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = 8 - v1 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORQ sh:(SHLQconst [8] x0:(MOVBloadidx1 [i0] {s} p idx mem)) x1:(MOVBloadidx1 [i1] {s} idx p mem)) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - x1 := v.Args[1] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64ROLWconst, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = 8 - v1 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORQ sh:(SHLQconst [8] x0:(MOVBloadidx1 [i0] {s} idx p mem)) x1:(MOVBloadidx1 [i1] {s} idx p mem)) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - x1 := v.Args[1] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64ROLWconst, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = 8 - v1 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORQ r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} p idx mem)) sh:(SHLQconst [16] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} p idx mem)))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - r1 := v.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 16 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64BSWAPL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORQ r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} idx p mem)) sh:(SHLQconst [16] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} p idx mem)))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - r1 := v.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 16 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64BSWAPL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORQ r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} p idx mem)) sh:(SHLQconst [16] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} idx p mem)))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - r1 := v.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 16 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64BSWAPL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORQ_120(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORQ r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} idx p mem)) sh:(SHLQconst [16] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} idx p mem)))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - r1 := v.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 16 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64BSWAPL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORQ sh:(SHLQconst [16] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} p idx mem))) r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} p idx mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 16 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - r1 := v.Args[1] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64BSWAPL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORQ sh:(SHLQconst [16] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} idx p mem))) r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} p idx mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 16 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - r1 := v.Args[1] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64BSWAPL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORQ sh:(SHLQconst [16] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} p idx mem))) r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} idx p mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 16 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - r1 := v.Args[1] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64BSWAPL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORQ sh:(SHLQconst [16] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} idx p mem))) r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} idx p mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 16 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - r1 := v.Args[1] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64BSWAPL, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORQ r1:(BSWAPL x1:(MOVLloadidx1 [i1] {s} p idx mem)) sh:(SHLQconst [32] r0:(BSWAPL x0:(MOVLloadidx1 [i0] {s} p idx mem)))) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPQ (MOVQloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - r1 := v.Args[0] - if r1.Op != OpAMD64BSWAPL { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVLloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 32 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64BSWAPL { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVLloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64BSWAPQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64MOVQloadidx1, typ.UInt64) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORQ r1:(BSWAPL x1:(MOVLloadidx1 [i1] {s} idx p mem)) sh:(SHLQconst [32] r0:(BSWAPL x0:(MOVLloadidx1 [i0] {s} p idx mem)))) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPQ (MOVQloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - r1 := v.Args[0] - if r1.Op != OpAMD64BSWAPL { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVLloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 32 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64BSWAPL { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVLloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64BSWAPQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64MOVQloadidx1, typ.UInt64) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORQ r1:(BSWAPL x1:(MOVLloadidx1 [i1] {s} p idx mem)) sh:(SHLQconst [32] r0:(BSWAPL x0:(MOVLloadidx1 [i0] {s} idx p mem)))) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPQ (MOVQloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - r1 := v.Args[0] - if r1.Op != OpAMD64BSWAPL { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVLloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 32 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64BSWAPL { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVLloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64BSWAPQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64MOVQloadidx1, typ.UInt64) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORQ r1:(BSWAPL x1:(MOVLloadidx1 [i1] {s} idx p mem)) sh:(SHLQconst [32] r0:(BSWAPL x0:(MOVLloadidx1 [i0] {s} idx p mem)))) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPQ (MOVQloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - r1 := v.Args[0] - if r1.Op != OpAMD64BSWAPL { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVLloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 32 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64BSWAPL { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVLloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64BSWAPQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64MOVQloadidx1, typ.UInt64) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORQ sh:(SHLQconst [32] r0:(BSWAPL x0:(MOVLloadidx1 [i0] {s} p idx mem))) r1:(BSWAPL x1:(MOVLloadidx1 [i1] {s} p idx mem))) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPQ (MOVQloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 32 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64BSWAPL { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVLloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - r1 := v.Args[1] - if r1.Op != OpAMD64BSWAPL { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVLloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64BSWAPQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64MOVQloadidx1, typ.UInt64) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORQ_130(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORQ sh:(SHLQconst [32] r0:(BSWAPL x0:(MOVLloadidx1 [i0] {s} idx p mem))) r1:(BSWAPL x1:(MOVLloadidx1 [i1] {s} p idx mem))) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPQ (MOVQloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 32 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64BSWAPL { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVLloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - r1 := v.Args[1] - if r1.Op != OpAMD64BSWAPL { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVLloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64BSWAPQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64MOVQloadidx1, typ.UInt64) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORQ sh:(SHLQconst [32] r0:(BSWAPL x0:(MOVLloadidx1 [i0] {s} p idx mem))) r1:(BSWAPL x1:(MOVLloadidx1 [i1] {s} idx p mem))) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPQ (MOVQloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 32 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64BSWAPL { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVLloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - r1 := v.Args[1] - if r1.Op != OpAMD64BSWAPL { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVLloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64BSWAPQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64MOVQloadidx1, typ.UInt64) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORQ sh:(SHLQconst [32] r0:(BSWAPL x0:(MOVLloadidx1 [i0] {s} idx p mem))) r1:(BSWAPL x1:(MOVLloadidx1 [i1] {s} idx p mem))) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (BSWAPQ (MOVQloadidx1 [i0] {s} p idx mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 32 { - break - } - r0 := sh.Args[0] - if r0.Op != OpAMD64BSWAPL { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVLloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - r1 := v.Args[1] - if r1.Op != OpAMD64BSWAPL { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVLloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpAMD64BSWAPQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64MOVQloadidx1, typ.UInt64) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORQ s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem)) or:(ORQ s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem)) y)) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem)) or:(ORQ s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem)) y)) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem)) or:(ORQ s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem)) y)) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem)) or:(ORQ s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem)) y)) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem)) or:(ORQ y s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem)))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem)) or:(ORQ y s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem)))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem)) or:(ORQ y s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem)))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORQ_140(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORQ s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem)) or:(ORQ y s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem)))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem)) y) s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem)) y) s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ y s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem))) s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ y s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem))) s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem)) y) s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem)) y) s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ y s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem))) s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ y s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem))) s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpAMD64MOVBloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpAMD64MOVBloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) - v2.AuxInt = 8 - v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} p idx mem))) or:(ORQ s1:(SHLQconst [j1] r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} p idx mem))) y)) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64BSWAPL, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORQ_150(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORQ s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} idx p mem))) or:(ORQ s1:(SHLQconst [j1] r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} p idx mem))) y)) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64BSWAPL, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} p idx mem))) or:(ORQ s1:(SHLQconst [j1] r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} idx p mem))) y)) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64BSWAPL, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} idx p mem))) or:(ORQ s1:(SHLQconst [j1] r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} idx p mem))) y)) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64BSWAPL, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} p idx mem))) or:(ORQ y s1:(SHLQconst [j1] r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} p idx mem))))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64BSWAPL, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} idx p mem))) or:(ORQ y s1:(SHLQconst [j1] r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} p idx mem))))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64BSWAPL, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} p idx mem))) or:(ORQ y s1:(SHLQconst [j1] r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} idx p mem))))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64BSWAPL, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} idx p mem))) or:(ORQ y s1:(SHLQconst [j1] r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} idx p mem))))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - or := v.Args[1] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64BSWAPL, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ s1:(SHLQconst [j1] r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} p idx mem))) y) s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} p idx mem)))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64BSWAPL, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ s1:(SHLQconst [j1] r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} idx p mem))) y) s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} p idx mem)))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64BSWAPL, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ y s1:(SHLQconst [j1] r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} p idx mem)))) s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} p idx mem)))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64BSWAPL, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORQ_160(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORQ or:(ORQ y s1:(SHLQconst [j1] r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} idx p mem)))) s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} p idx mem)))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64BSWAPL, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ s1:(SHLQconst [j1] r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} p idx mem))) y) s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} idx p mem)))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64BSWAPL, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ s1:(SHLQconst [j1] r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} idx p mem))) y) s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} idx p mem)))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64BSWAPL, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ y s1:(SHLQconst [j1] r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} p idx mem)))) s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} idx p mem)))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64BSWAPL, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ or:(ORQ y s1:(SHLQconst [j1] r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} idx p mem)))) s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} idx p mem)))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpAMD64ORQ { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpAMD64SHLQconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { - break - } - x1 := r1.Args[0] - if x1.Op != OpAMD64MOVWloadidx1 { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpAMD64SHLQconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { - break - } - x0 := r0.Args[0] - if x0.Op != OpAMD64MOVWloadidx1 { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpAMD64BSWAPL, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORQ x l:(MOVQload [off] {sym} ptr mem)) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (ORQload x [off] {sym} ptr mem) - for { - _ = v.Args[1] - x := v.Args[0] - l := v.Args[1] - if l.Op != OpAMD64MOVQload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break - } - v.reset(OpAMD64ORQload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (ORQ l:(MOVQload [off] {sym} ptr mem) x) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (ORQload x [off] {sym} ptr mem) - for { - x := v.Args[1] - l := v.Args[0] - if l.Op != OpAMD64MOVQload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break - } - v.reset(OpAMD64ORQload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64ORQconst_0(v *Value) bool { - // match: (ORQconst [c] x) - // cond: isUint64PowerOfTwo(c) && uint64(c) >= 128 - // result: (BTSQconst [log2(c)] x) - for { - c := v.AuxInt - x := v.Args[0] - if !(isUint64PowerOfTwo(c) && uint64(c) >= 128) { - break - } - v.reset(OpAMD64BTSQconst) - v.AuxInt = log2(c) - v.AddArg(x) - return true - } - // match: (ORQconst [c] (ORQconst [d] x)) - // result: (ORQconst [c | d] x) - for { - c := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpAMD64ORQconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v.reset(OpAMD64ORQconst) - v.AuxInt = c | d - v.AddArg(x) - return true - } - // match: (ORQconst [c] (BTSQconst [d] x)) - // result: (ORQconst [c | 1< (SHLLconst [j0] (MOVWload [i0] {s} p mem)) y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64NEGL { - break + for _i0 := 0; _i0 <= 1; _i0++ { + s1 := v.Args[_i0] + if s1.Op != OpAMD64SHLLconst { + continue + } + j1 := s1.AuxInt + x1 := s1.Args[0] + if x1.Op != OpAMD64MOVBload { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[1] + p := x1.Args[0] + or := v.Args[1^_i0] + if or.Op != OpAMD64ORL { + continue + } + _ = or.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + s0 := or.Args[_i1] + if s0.Op != OpAMD64SHLLconst { + continue + } + j0 := s0.AuxInt + x0 := s0.Args[0] + if x0.Op != OpAMD64MOVBload { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[1] + if p != x0.Args[0] || mem != x0.Args[1] { + continue + } + y := or.Args[1^_i1] + if !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { + continue + } + b = mergePoint(b, x0, x1, y) + v0 := b.NewValue0(x0.Pos, OpAMD64ORL, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x0.Pos, OpAMD64SHLLconst, v.Type) + v1.AuxInt = j0 + v2 := b.NewValue0(x0.Pos, OpAMD64MOVWload, typ.UInt16) + v2.AuxInt = i0 + v2.Aux = s + v2.AddArg(p) + v2.AddArg(mem) + v1.AddArg(v2) + v0.AddArg(v1) + v0.AddArg(y) + return true + } } - y := v_1.Args[0] - v.reset(OpAMD64ROLB) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (RORB x (MOVQconst [c])) - // result: (ROLBconst [(-c)&7 ] x) + // match: (ORL x0:(MOVBloadidx1 [i0] {s} p idx mem) sh:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem))) + // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (MOVWloadidx1 [i0] {s} p idx mem) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVQconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + if x0.Op != OpAMD64MOVBloadidx1 { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x0.Args[_i1] + idx := x0.Args[1^_i1] + sh := v.Args[1^_i0] + if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 8 { + continue + } + x1 := sh.Args[0] + if x1.Op != OpAMD64MOVBloadidx1 { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[2] + for _i2 := 0; _i2 <= 1; _i2++ { + if p != x1.Args[_i2] || idx != x1.Args[1^_i2] || mem != x1.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(idx) + v0.AddArg(mem) + return true + } + } } - c := v_1.AuxInt - v.reset(OpAMD64ROLBconst) - v.AuxInt = (-c) & 7 - v.AddArg(x) - return true + break } - // match: (RORB x (MOVLconst [c])) - // result: (ROLBconst [(-c)&7 ] x) + // match: (ORL x0:(MOVWloadidx1 [i0] {s} p idx mem) sh:(SHLLconst [16] x1:(MOVWloadidx1 [i1] {s} p idx mem))) + // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (MOVLloadidx1 [i0] {s} p idx mem) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVLconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + if x0.Op != OpAMD64MOVWloadidx1 { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x0.Args[_i1] + idx := x0.Args[1^_i1] + sh := v.Args[1^_i0] + if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 16 { + continue + } + x1 := sh.Args[0] + if x1.Op != OpAMD64MOVWloadidx1 { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[2] + for _i2 := 0; _i2 <= 1; _i2++ { + if p != x1.Args[_i2] || idx != x1.Args[1^_i2] || mem != x1.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(idx) + v0.AddArg(mem) + return true + } + } } - c := v_1.AuxInt - v.reset(OpAMD64ROLBconst) - v.AuxInt = (-c) & 7 - v.AddArg(x) - return true + break } - return false -} -func rewriteValueAMD64_OpAMD64RORL_0(v *Value) bool { - // match: (RORL x (NEGQ y)) - // result: (ROLL x y) + // match: (ORL s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem)) or:(ORL s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem)) y)) + // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) + // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64NEGQ { - break + for _i0 := 0; _i0 <= 1; _i0++ { + s1 := v.Args[_i0] + if s1.Op != OpAMD64SHLLconst { + continue + } + j1 := s1.AuxInt + x1 := s1.Args[0] + if x1.Op != OpAMD64MOVBloadidx1 { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x1.Args[_i1] + idx := x1.Args[1^_i1] + or := v.Args[1^_i0] + if or.Op != OpAMD64ORL { + continue + } + _ = or.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + s0 := or.Args[_i2] + if s0.Op != OpAMD64SHLLconst { + continue + } + j0 := s0.AuxInt + x0 := s0.Args[0] + if x0.Op != OpAMD64MOVBloadidx1 { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[2] + for _i3 := 0; _i3 <= 1; _i3++ { + if p != x0.Args[_i3] || idx != x0.Args[1^_i3] || mem != x0.Args[2] { + continue + } + y := or.Args[1^_i2] + if !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { + continue + } + b = mergePoint(b, x0, x1, y) + v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) + v1.AuxInt = j0 + v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) + v2.AuxInt = i0 + v2.Aux = s + v2.AddArg(p) + v2.AddArg(idx) + v2.AddArg(mem) + v1.AddArg(v2) + v0.AddArg(v1) + v0.AddArg(y) + return true + } + } + } } - y := v_1.Args[0] - v.reset(OpAMD64ROLL) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (RORL x (NEGL y)) - // result: (ROLL x y) + // match: (ORL x1:(MOVBload [i1] {s} p mem) sh:(SHLLconst [8] x0:(MOVBload [i0] {s} p mem))) + // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (ROLWconst [8] (MOVWload [i0] {s} p mem)) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64NEGL { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x1 := v.Args[_i0] + if x1.Op != OpAMD64MOVBload { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[1] + p := x1.Args[0] + sh := v.Args[1^_i0] + if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 8 { + continue + } + x0 := sh.Args[0] + if x0.Op != OpAMD64MOVBload { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[1] + if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(x0.Pos, OpAMD64ROLWconst, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = 8 + v1 := b.NewValue0(x0.Pos, OpAMD64MOVWload, typ.UInt16) + v1.AuxInt = i0 + v1.Aux = s + v1.AddArg(p) + v1.AddArg(mem) + v0.AddArg(v1) + return true } - y := v_1.Args[0] - v.reset(OpAMD64ROLL) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (RORL x (MOVQconst [c])) - // result: (ROLLconst [(-c)&31] x) + // match: (ORL r1:(ROLWconst [8] x1:(MOVWload [i1] {s} p mem)) sh:(SHLLconst [16] r0:(ROLWconst [8] x0:(MOVWload [i0] {s} p mem)))) + // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (BSWAPL (MOVLload [i0] {s} p mem)) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVQconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + r1 := v.Args[_i0] + if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { + continue + } + x1 := r1.Args[0] + if x1.Op != OpAMD64MOVWload { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[1] + p := x1.Args[0] + sh := v.Args[1^_i0] + if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 16 { + continue + } + r0 := sh.Args[0] + if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { + continue + } + x0 := r0.Args[0] + if x0.Op != OpAMD64MOVWload { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[1] + if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(x0.Pos, OpAMD64BSWAPL, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x0.Pos, OpAMD64MOVLload, typ.UInt32) + v1.AuxInt = i0 + v1.Aux = s + v1.AddArg(p) + v1.AddArg(mem) + v0.AddArg(v1) + return true } - c := v_1.AuxInt - v.reset(OpAMD64ROLLconst) - v.AuxInt = (-c) & 31 - v.AddArg(x) - return true + break } - // match: (RORL x (MOVLconst [c])) - // result: (ROLLconst [(-c)&31] x) + // match: (ORL s0:(SHLLconst [j0] x0:(MOVBload [i0] {s} p mem)) or:(ORL s1:(SHLLconst [j1] x1:(MOVBload [i1] {s} p mem)) y)) + // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) + // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j1] (ROLWconst [8] (MOVWload [i0] {s} p mem))) y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVLconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + s0 := v.Args[_i0] + if s0.Op != OpAMD64SHLLconst { + continue + } + j0 := s0.AuxInt + x0 := s0.Args[0] + if x0.Op != OpAMD64MOVBload { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + or := v.Args[1^_i0] + if or.Op != OpAMD64ORL { + continue + } + _ = or.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + s1 := or.Args[_i1] + if s1.Op != OpAMD64SHLLconst { + continue + } + j1 := s1.AuxInt + x1 := s1.Args[0] + if x1.Op != OpAMD64MOVBload { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] { + continue + } + y := or.Args[1^_i1] + if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { + continue + } + b = mergePoint(b, x0, x1, y) + v0 := b.NewValue0(x1.Pos, OpAMD64ORL, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x1.Pos, OpAMD64SHLLconst, v.Type) + v1.AuxInt = j1 + v2 := b.NewValue0(x1.Pos, OpAMD64ROLWconst, typ.UInt16) + v2.AuxInt = 8 + v3 := b.NewValue0(x1.Pos, OpAMD64MOVWload, typ.UInt16) + v3.AuxInt = i0 + v3.Aux = s + v3.AddArg(p) + v3.AddArg(mem) + v2.AddArg(v3) + v1.AddArg(v2) + v0.AddArg(v1) + v0.AddArg(y) + return true + } } - c := v_1.AuxInt - v.reset(OpAMD64ROLLconst) - v.AuxInt = (-c) & 31 - v.AddArg(x) - return true + break } - return false -} -func rewriteValueAMD64_OpAMD64RORQ_0(v *Value) bool { - // match: (RORQ x (NEGQ y)) - // result: (ROLQ x y) + // match: (ORL x1:(MOVBloadidx1 [i1] {s} p idx mem) sh:(SHLLconst [8] x0:(MOVBloadidx1 [i0] {s} p idx mem))) + // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem)) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64NEGQ { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x1 := v.Args[_i0] + if x1.Op != OpAMD64MOVBloadidx1 { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x1.Args[_i1] + idx := x1.Args[1^_i1] + sh := v.Args[1^_i0] + if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 8 { + continue + } + x0 := sh.Args[0] + if x0.Op != OpAMD64MOVBloadidx1 { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[2] + for _i2 := 0; _i2 <= 1; _i2++ { + if p != x0.Args[_i2] || idx != x0.Args[1^_i2] || mem != x0.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(v.Pos, OpAMD64ROLWconst, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = 8 + v1 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) + v1.AuxInt = i0 + v1.Aux = s + v1.AddArg(p) + v1.AddArg(idx) + v1.AddArg(mem) + v0.AddArg(v1) + return true + } + } } - y := v_1.Args[0] - v.reset(OpAMD64ROLQ) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (RORQ x (NEGL y)) - // result: (ROLQ x y) + // match: (ORL r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} p idx mem)) sh:(SHLLconst [16] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} p idx mem)))) + // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem)) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64NEGL { - break + for _i0 := 0; _i0 <= 1; _i0++ { + r1 := v.Args[_i0] + if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { + continue + } + x1 := r1.Args[0] + if x1.Op != OpAMD64MOVWloadidx1 { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x1.Args[_i1] + idx := x1.Args[1^_i1] + sh := v.Args[1^_i0] + if sh.Op != OpAMD64SHLLconst || sh.AuxInt != 16 { + continue + } + r0 := sh.Args[0] + if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { + continue + } + x0 := r0.Args[0] + if x0.Op != OpAMD64MOVWloadidx1 { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[2] + for _i2 := 0; _i2 <= 1; _i2++ { + if p != x0.Args[_i2] || idx != x0.Args[1^_i2] || mem != x0.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(v.Pos, OpAMD64BSWAPL, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) + v1.AuxInt = i0 + v1.Aux = s + v1.AddArg(p) + v1.AddArg(idx) + v1.AddArg(mem) + v0.AddArg(v1) + return true + } + } } - y := v_1.Args[0] - v.reset(OpAMD64ROLQ) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (RORQ x (MOVQconst [c])) - // result: (ROLQconst [(-c)&63] x) + return false +} +func rewriteValueAMD64_OpAMD64ORL_30(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (ORL s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem)) or:(ORL s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem)) y)) + // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) + // result: @mergePoint(b,x0,x1,y) (ORL (SHLLconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVQconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + s0 := v.Args[_i0] + if s0.Op != OpAMD64SHLLconst { + continue + } + j0 := s0.AuxInt + x0 := s0.Args[0] + if x0.Op != OpAMD64MOVBloadidx1 { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x0.Args[_i1] + idx := x0.Args[1^_i1] + or := v.Args[1^_i0] + if or.Op != OpAMD64ORL { + continue + } + _ = or.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + s1 := or.Args[_i2] + if s1.Op != OpAMD64SHLLconst { + continue + } + j1 := s1.AuxInt + x1 := s1.Args[0] + if x1.Op != OpAMD64MOVBloadidx1 { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[2] + for _i3 := 0; _i3 <= 1; _i3++ { + if p != x1.Args[_i3] || idx != x1.Args[1^_i3] || mem != x1.Args[2] { + continue + } + y := or.Args[1^_i2] + if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { + continue + } + b = mergePoint(b, x0, x1, y) + v0 := b.NewValue0(v.Pos, OpAMD64ORL, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) + v1.AuxInt = j1 + v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) + v2.AuxInt = 8 + v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) + v3.AuxInt = i0 + v3.Aux = s + v3.AddArg(p) + v3.AddArg(idx) + v3.AddArg(mem) + v2.AddArg(v3) + v1.AddArg(v2) + v0.AddArg(v1) + v0.AddArg(y) + return true + } + } + } } - c := v_1.AuxInt - v.reset(OpAMD64ROLQconst) - v.AuxInt = (-c) & 63 - v.AddArg(x) - return true + break } - // match: (RORQ x (MOVLconst [c])) - // result: (ROLQconst [(-c)&63] x) + // match: (ORL x l:(MOVLload [off] {sym} ptr mem)) + // cond: canMergeLoadClobber(v, l, x) && clobber(l) + // result: (ORLload x [off] {sym} ptr mem) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVLconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != OpAMD64MOVLload { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[1] + ptr := l.Args[0] + if !(canMergeLoadClobber(v, l, x) && clobber(l)) { + continue + } + v.reset(OpAMD64ORLload) + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - c := v_1.AuxInt - v.reset(OpAMD64ROLQconst) - v.AuxInt = (-c) & 63 - v.AddArg(x) - return true + break } return false } -func rewriteValueAMD64_OpAMD64RORW_0(v *Value) bool { - // match: (RORW x (NEGQ y)) - // result: (ROLW x y) +func rewriteValueAMD64_OpAMD64ORLconst_0(v *Value) bool { + // match: (ORLconst [c] x) + // cond: isUint32PowerOfTwo(c) && uint64(c) >= 128 + // result: (BTSLconst [log2uint32(c)] x) for { - _ = v.Args[1] + c := v.AuxInt x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64NEGQ { + if !(isUint32PowerOfTwo(c) && uint64(c) >= 128) { break } - y := v_1.Args[0] - v.reset(OpAMD64ROLW) + v.reset(OpAMD64BTSLconst) + v.AuxInt = log2uint32(c) v.AddArg(x) - v.AddArg(y) return true } - // match: (RORW x (NEGL y)) - // result: (ROLW x y) + // match: (ORLconst [c] (ORLconst [d] x)) + // result: (ORLconst [c | d] x) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64NEGL { + c := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpAMD64ORLconst { break } - y := v_1.Args[0] - v.reset(OpAMD64ROLW) + d := v_0.AuxInt + x := v_0.Args[0] + v.reset(OpAMD64ORLconst) + v.AuxInt = c | d v.AddArg(x) - v.AddArg(y) return true } - // match: (RORW x (MOVQconst [c])) - // result: (ROLWconst [(-c)&15] x) + // match: (ORLconst [c] (BTSLconst [d] x)) + // result: (ORLconst [c | 1<>uint64(c)]) + // match: (ORLconstmodify [valoff1] {sym1} (LEAQ [off2] {sym2} base) mem) + // cond: ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) + // result: (ORLconstmodify [ValAndOff(valoff1).add(off2)] {mergeSym(sym1,sym2)} base mem) for { - c := v.AuxInt + valoff1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVQconst { + if v_0.Op != OpAMD64LEAQ { break } - d := v_0.AuxInt - v.reset(OpAMD64MOVQconst) - v.AuxInt = int64(int8(d)) >> uint64(c) + off2 := v_0.AuxInt + sym2 := v_0.Aux + base := v_0.Args[0] + if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2)) { + break + } + v.reset(OpAMD64ORLconstmodify) + v.AuxInt = ValAndOff(valoff1).add(off2) + v.Aux = mergeSym(sym1, sym2) + v.AddArg(base) + v.AddArg(mem) return true } return false } -func rewriteValueAMD64_OpAMD64SARL_0(v *Value) bool { +func rewriteValueAMD64_OpAMD64ORLload_0(v *Value) bool { b := v.Block - // match: (SARL x (MOVQconst [c])) - // result: (SARLconst [c&31] x) + typ := &b.Func.Config.Types + // match: (ORLload [off1] {sym} val (ADDQconst [off2] base) mem) + // cond: is32Bit(off1+off2) + // result: (ORLload [off1+off2] {sym} val base mem) for { - _ = v.Args[1] - x := v.Args[0] + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[2] + val := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVQconst { + if v_1.Op != OpAMD64ADDQconst { break } - c := v_1.AuxInt - v.reset(OpAMD64SARLconst) - v.AuxInt = c & 31 - v.AddArg(x) - return true - } - // match: (SARL x (MOVLconst [c])) - // result: (SARLconst [c&31] x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVLconst { + off2 := v_1.AuxInt + base := v_1.Args[0] + if !(is32Bit(off1 + off2)) { break } - c := v_1.AuxInt - v.reset(OpAMD64SARLconst) - v.AuxInt = c & 31 - v.AddArg(x) + v.reset(OpAMD64ORLload) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(val) + v.AddArg(base) + v.AddArg(mem) return true } - // match: (SARL x (ADDQconst [c] y)) - // cond: c & 31 == 0 - // result: (SARL x y) + // match: (ORLload [off1] {sym1} val (LEAQ [off2] {sym2} base) mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (ORLload [off1+off2] {mergeSym(sym1,sym2)} val base mem) for { - _ = v.Args[1] - x := v.Args[0] + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[2] + val := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64ADDQconst { + if v_1.Op != OpAMD64LEAQ { break } - c := v_1.AuxInt - y := v_1.Args[0] - if !(c&31 == 0) { + off2 := v_1.AuxInt + sym2 := v_1.Aux + base := v_1.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(OpAMD64SARL) - v.AddArg(x) - v.AddArg(y) + v.reset(OpAMD64ORLload) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(val) + v.AddArg(base) + v.AddArg(mem) return true } - // match: (SARL x (NEGQ (ADDQconst [c] y))) - // cond: c & 31 == 0 - // result: (SARL x (NEGQ y)) + // match: ( ORLload x [off] {sym} ptr (MOVSSstore [off] {sym} ptr y _)) + // result: ( ORL x (MOVLf2i y)) for { - _ = v.Args[1] + off := v.AuxInt + sym := v.Aux + _ = v.Args[2] x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64NEGQ { - break - } - t := v_1.Type - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64ADDQconst { + ptr := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpAMD64MOVSSstore || v_2.AuxInt != off || v_2.Aux != sym { break } - c := v_1_0.AuxInt - y := v_1_0.Args[0] - if !(c&31 == 0) { + _ = v_2.Args[2] + if ptr != v_2.Args[0] { break } - v.reset(OpAMD64SARL) + y := v_2.Args[1] + v.reset(OpAMD64ORL) v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAMD64NEGQ, t) + v0 := b.NewValue0(v_2.Pos, OpAMD64MOVLf2i, typ.UInt32) v0.AddArg(y) v.AddArg(v0) return true } - // match: (SARL x (ANDQconst [c] y)) - // cond: c & 31 == 31 - // result: (SARL x y) + return false +} +func rewriteValueAMD64_OpAMD64ORLmodify_0(v *Value) bool { + // match: (ORLmodify [off1] {sym} (ADDQconst [off2] base) val mem) + // cond: is32Bit(off1+off2) + // result: (ORLmodify [off1+off2] {sym} base val mem) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ANDQconst { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpAMD64ADDQconst { break } - c := v_1.AuxInt - y := v_1.Args[0] - if !(c&31 == 31) { + off2 := v_0.AuxInt + base := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1 + off2)) { break } - v.reset(OpAMD64SARL) - v.AddArg(x) - v.AddArg(y) + v.reset(OpAMD64ORLmodify) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(base) + v.AddArg(val) + v.AddArg(mem) return true } - // match: (SARL x (NEGQ (ANDQconst [c] y))) - // cond: c & 31 == 31 - // result: (SARL x (NEGQ y)) + // match: (ORLmodify [off1] {sym1} (LEAQ [off2] {sym2} base) val mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (ORLmodify [off1+off2] {mergeSym(sym1,sym2)} base val mem) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64NEGQ { - break - } - t := v_1.Type - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64ANDQconst { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpAMD64LEAQ { break } - c := v_1_0.AuxInt - y := v_1_0.Args[0] - if !(c&31 == 31) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + base := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(OpAMD64SARL) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAMD64NEGQ, t) - v0.AddArg(y) - v.AddArg(v0) + v.reset(OpAMD64ORLmodify) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(base) + v.AddArg(val) + v.AddArg(mem) return true } - // match: (SARL x (ADDLconst [c] y)) - // cond: c & 31 == 0 - // result: (SARL x y) + return false +} +func rewriteValueAMD64_OpAMD64ORQ_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (ORQ (SHLQ (MOVQconst [1]) y) x) + // result: (BTSQ x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ADDLconst { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - if !(c&31 == 0) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64SHLQ { + continue + } + y := v_0.Args[1] + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpAMD64MOVQconst || v_0_0.AuxInt != 1 { + continue + } + x := v.Args[1^_i0] + v.reset(OpAMD64BTSQ) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpAMD64SARL) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (SARL x (NEGL (ADDLconst [c] y))) - // cond: c & 31 == 0 - // result: (SARL x (NEGL y)) + // match: (ORQ (MOVQconst [c]) x) + // cond: isUint64PowerOfTwo(c) && uint64(c) >= 128 + // result: (BTSQconst [log2(c)] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64NEGL { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64MOVQconst { + continue + } + c := v_0.AuxInt + x := v.Args[1^_i0] + if !(isUint64PowerOfTwo(c) && uint64(c) >= 128) { + continue + } + v.reset(OpAMD64BTSQconst) + v.AuxInt = log2(c) + v.AddArg(x) + return true } - t := v_1.Type - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64ADDLconst { - break + break + } + // match: (ORQ x (MOVQconst [c])) + // cond: is32Bit(c) + // result: (ORQconst [c] x) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64MOVQconst { + continue + } + c := v_1.AuxInt + if !(is32Bit(c)) { + continue + } + v.reset(OpAMD64ORQconst) + v.AuxInt = c + v.AddArg(x) + return true } - c := v_1_0.AuxInt - y := v_1_0.Args[0] - if !(c&31 == 0) { - break + break + } + // match: (ORQ (SHLQconst x [c]) (SHRQconst x [d])) + // cond: d==64-c + // result: (ROLQconst x [c]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64SHLQconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64SHRQconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(d == 64-c) { + continue + } + v.reset(OpAMD64ROLQconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpAMD64SARL) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAMD64NEGL, t) - v0.AddArg(y) - v.AddArg(v0) - return true + break } - // match: (SARL x (ANDLconst [c] y)) - // cond: c & 31 == 31 - // result: (SARL x y) + // match: (ORQ (SHLQ x y) (ANDQ (SHRQ x (NEGQ y)) (SBBQcarrymask (CMPQconst (NEGQ (ADDQconst (ANDQconst y [63]) [-64])) [64])))) + // result: (ROLQ x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ANDLconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64SHLQ { + continue + } + y := v_0.Args[1] + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64ANDQ { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpAMD64SHRQ { + continue + } + _ = v_1_0.Args[1] + if x != v_1_0.Args[0] { + continue + } + v_1_0_1 := v_1_0.Args[1] + if v_1_0_1.Op != OpAMD64NEGQ || y != v_1_0_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpAMD64SBBQcarrymask { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpAMD64CMPQconst || v_1_1_0.AuxInt != 64 { + continue + } + v_1_1_0_0 := v_1_1_0.Args[0] + if v_1_1_0_0.Op != OpAMD64NEGQ { + continue + } + v_1_1_0_0_0 := v_1_1_0_0.Args[0] + if v_1_1_0_0_0.Op != OpAMD64ADDQconst || v_1_1_0_0_0.AuxInt != -64 { + continue + } + v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] + if v_1_1_0_0_0_0.Op != OpAMD64ANDQconst || v_1_1_0_0_0_0.AuxInt != 63 || y != v_1_1_0_0_0_0.Args[0] { + continue + } + v.reset(OpAMD64ROLQ) + v.AddArg(x) + v.AddArg(y) + return true + } } - c := v_1.AuxInt - y := v_1.Args[0] - if !(c&31 == 31) { - break + break + } + // match: (ORQ (SHLQ x y) (ANDQ (SHRQ x (NEGL y)) (SBBQcarrymask (CMPLconst (NEGL (ADDLconst (ANDLconst y [63]) [-64])) [64])))) + // result: (ROLQ x y) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64SHLQ { + continue + } + y := v_0.Args[1] + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64ANDQ { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpAMD64SHRQ { + continue + } + _ = v_1_0.Args[1] + if x != v_1_0.Args[0] { + continue + } + v_1_0_1 := v_1_0.Args[1] + if v_1_0_1.Op != OpAMD64NEGL || y != v_1_0_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpAMD64SBBQcarrymask { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpAMD64CMPLconst || v_1_1_0.AuxInt != 64 { + continue + } + v_1_1_0_0 := v_1_1_0.Args[0] + if v_1_1_0_0.Op != OpAMD64NEGL { + continue + } + v_1_1_0_0_0 := v_1_1_0_0.Args[0] + if v_1_1_0_0_0.Op != OpAMD64ADDLconst || v_1_1_0_0_0.AuxInt != -64 { + continue + } + v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] + if v_1_1_0_0_0_0.Op != OpAMD64ANDLconst || v_1_1_0_0_0_0.AuxInt != 63 || y != v_1_1_0_0_0_0.Args[0] { + continue + } + v.reset(OpAMD64ROLQ) + v.AddArg(x) + v.AddArg(y) + return true + } } - v.reset(OpAMD64SARL) - v.AddArg(x) - v.AddArg(y) - return true + break + } + // match: (ORQ (SHRQ x y) (ANDQ (SHLQ x (NEGQ y)) (SBBQcarrymask (CMPQconst (NEGQ (ADDQconst (ANDQconst y [63]) [-64])) [64])))) + // result: (RORQ x y) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64SHRQ { + continue + } + y := v_0.Args[1] + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64ANDQ { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpAMD64SHLQ { + continue + } + _ = v_1_0.Args[1] + if x != v_1_0.Args[0] { + continue + } + v_1_0_1 := v_1_0.Args[1] + if v_1_0_1.Op != OpAMD64NEGQ || y != v_1_0_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpAMD64SBBQcarrymask { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpAMD64CMPQconst || v_1_1_0.AuxInt != 64 { + continue + } + v_1_1_0_0 := v_1_1_0.Args[0] + if v_1_1_0_0.Op != OpAMD64NEGQ { + continue + } + v_1_1_0_0_0 := v_1_1_0_0.Args[0] + if v_1_1_0_0_0.Op != OpAMD64ADDQconst || v_1_1_0_0_0.AuxInt != -64 { + continue + } + v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] + if v_1_1_0_0_0_0.Op != OpAMD64ANDQconst || v_1_1_0_0_0_0.AuxInt != 63 || y != v_1_1_0_0_0_0.Args[0] { + continue + } + v.reset(OpAMD64RORQ) + v.AddArg(x) + v.AddArg(y) + return true + } + } + break } - // match: (SARL x (NEGL (ANDLconst [c] y))) - // cond: c & 31 == 31 - // result: (SARL x (NEGL y)) + // match: (ORQ (SHRQ x y) (ANDQ (SHLQ x (NEGL y)) (SBBQcarrymask (CMPLconst (NEGL (ADDLconst (ANDLconst y [63]) [-64])) [64])))) + // result: (RORQ x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64NEGL { - break - } - t := v_1.Type - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64ANDLconst { - break - } - c := v_1_0.AuxInt - y := v_1_0.Args[0] - if !(c&31 == 31) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64SHRQ { + continue + } + y := v_0.Args[1] + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64ANDQ { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpAMD64SHLQ { + continue + } + _ = v_1_0.Args[1] + if x != v_1_0.Args[0] { + continue + } + v_1_0_1 := v_1_0.Args[1] + if v_1_0_1.Op != OpAMD64NEGL || y != v_1_0_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpAMD64SBBQcarrymask { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpAMD64CMPLconst || v_1_1_0.AuxInt != 64 { + continue + } + v_1_1_0_0 := v_1_1_0.Args[0] + if v_1_1_0_0.Op != OpAMD64NEGL { + continue + } + v_1_1_0_0_0 := v_1_1_0_0.Args[0] + if v_1_1_0_0_0.Op != OpAMD64ADDLconst || v_1_1_0_0_0.AuxInt != -64 { + continue + } + v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] + if v_1_1_0_0_0_0.Op != OpAMD64ANDLconst || v_1_1_0_0_0_0.AuxInt != 63 || y != v_1_1_0_0_0_0.Args[0] { + continue + } + v.reset(OpAMD64RORQ) + v.AddArg(x) + v.AddArg(y) + return true + } } - v.reset(OpAMD64SARL) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAMD64NEGL, t) - v0.AddArg(y) - v.AddArg(v0) - return true + break } - return false -} -func rewriteValueAMD64_OpAMD64SARLconst_0(v *Value) bool { - // match: (SARLconst x [0]) + // match: (ORQ x x) // result: x for { - if v.AuxInt != 0 { + x := v.Args[1] + if x != v.Args[0] { break } - x := v.Args[0] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) return true } - // match: (SARLconst [c] (MOVQconst [d])) - // result: (MOVQconst [int64(int32(d))>>uint64(c)]) + // match: (ORQ x0:(MOVBload [i0] {s} p mem) sh:(SHLQconst [8] x1:(MOVBload [i1] {s} p mem))) + // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (MOVWload [i0] {s} p mem) for { - c := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVQconst { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + if x0.Op != OpAMD64MOVBload { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + sh := v.Args[1^_i0] + if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 8 { + continue + } + x1 := sh.Args[0] + if x1.Op != OpAMD64MOVBload { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(x1.Pos, OpAMD64MOVWload, typ.UInt16) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(mem) + return true } - d := v_0.AuxInt - v.reset(OpAMD64MOVQconst) - v.AuxInt = int64(int32(d)) >> uint64(c) - return true + break } return false } -func rewriteValueAMD64_OpAMD64SARQ_0(v *Value) bool { +func rewriteValueAMD64_OpAMD64ORQ_10(v *Value) bool { b := v.Block - // match: (SARQ x (MOVQconst [c])) - // result: (SARQconst [c&63] x) + typ := &b.Func.Config.Types + // match: (ORQ x0:(MOVWload [i0] {s} p mem) sh:(SHLQconst [16] x1:(MOVWload [i1] {s} p mem))) + // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (MOVLload [i0] {s} p mem) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVQconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + if x0.Op != OpAMD64MOVWload { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + sh := v.Args[1^_i0] + if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 16 { + continue + } + x1 := sh.Args[0] + if x1.Op != OpAMD64MOVWload { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(x1.Pos, OpAMD64MOVLload, typ.UInt32) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(mem) + return true } - c := v_1.AuxInt - v.reset(OpAMD64SARQconst) - v.AuxInt = c & 63 - v.AddArg(x) - return true + break } - // match: (SARQ x (MOVLconst [c])) - // result: (SARQconst [c&63] x) + // match: (ORQ x0:(MOVLload [i0] {s} p mem) sh:(SHLQconst [32] x1:(MOVLload [i1] {s} p mem))) + // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (MOVQload [i0] {s} p mem) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVLconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + if x0.Op != OpAMD64MOVLload { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + sh := v.Args[1^_i0] + if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 32 { + continue + } + x1 := sh.Args[0] + if x1.Op != OpAMD64MOVLload { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(x1.Pos, OpAMD64MOVQload, typ.UInt64) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(mem) + return true } - c := v_1.AuxInt - v.reset(OpAMD64SARQconst) - v.AuxInt = c & 63 - v.AddArg(x) - return true + break } - // match: (SARQ x (ADDQconst [c] y)) - // cond: c & 63 == 0 - // result: (SARQ x y) + // match: (ORQ s1:(SHLQconst [j1] x1:(MOVBload [i1] {s} p mem)) or:(ORQ s0:(SHLQconst [j0] x0:(MOVBload [i0] {s} p mem)) y)) + // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) + // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVWload [i0] {s} p mem)) y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ADDQconst { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - if !(c&63 == 0) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + s1 := v.Args[_i0] + if s1.Op != OpAMD64SHLQconst { + continue + } + j1 := s1.AuxInt + x1 := s1.Args[0] + if x1.Op != OpAMD64MOVBload { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[1] + p := x1.Args[0] + or := v.Args[1^_i0] + if or.Op != OpAMD64ORQ { + continue + } + _ = or.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + s0 := or.Args[_i1] + if s0.Op != OpAMD64SHLQconst { + continue + } + j0 := s0.AuxInt + x0 := s0.Args[0] + if x0.Op != OpAMD64MOVBload { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[1] + if p != x0.Args[0] || mem != x0.Args[1] { + continue + } + y := or.Args[1^_i1] + if !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { + continue + } + b = mergePoint(b, x0, x1, y) + v0 := b.NewValue0(x0.Pos, OpAMD64ORQ, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x0.Pos, OpAMD64SHLQconst, v.Type) + v1.AuxInt = j0 + v2 := b.NewValue0(x0.Pos, OpAMD64MOVWload, typ.UInt16) + v2.AuxInt = i0 + v2.Aux = s + v2.AddArg(p) + v2.AddArg(mem) + v1.AddArg(v2) + v0.AddArg(v1) + v0.AddArg(y) + return true + } } - v.reset(OpAMD64SARQ) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (SARQ x (NEGQ (ADDQconst [c] y))) - // cond: c & 63 == 0 - // result: (SARQ x (NEGQ y)) + // match: (ORQ s1:(SHLQconst [j1] x1:(MOVWload [i1] {s} p mem)) or:(ORQ s0:(SHLQconst [j0] x0:(MOVWload [i0] {s} p mem)) y)) + // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) + // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVLload [i0] {s} p mem)) y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64NEGQ { - break - } - t := v_1.Type - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64ADDQconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + s1 := v.Args[_i0] + if s1.Op != OpAMD64SHLQconst { + continue + } + j1 := s1.AuxInt + x1 := s1.Args[0] + if x1.Op != OpAMD64MOVWload { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[1] + p := x1.Args[0] + or := v.Args[1^_i0] + if or.Op != OpAMD64ORQ { + continue + } + _ = or.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + s0 := or.Args[_i1] + if s0.Op != OpAMD64SHLQconst { + continue + } + j0 := s0.AuxInt + x0 := s0.Args[0] + if x0.Op != OpAMD64MOVWload { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[1] + if p != x0.Args[0] || mem != x0.Args[1] { + continue + } + y := or.Args[1^_i1] + if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { + continue + } + b = mergePoint(b, x0, x1, y) + v0 := b.NewValue0(x0.Pos, OpAMD64ORQ, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x0.Pos, OpAMD64SHLQconst, v.Type) + v1.AuxInt = j0 + v2 := b.NewValue0(x0.Pos, OpAMD64MOVLload, typ.UInt32) + v2.AuxInt = i0 + v2.Aux = s + v2.AddArg(p) + v2.AddArg(mem) + v1.AddArg(v2) + v0.AddArg(v1) + v0.AddArg(y) + return true + } } - c := v_1_0.AuxInt - y := v_1_0.Args[0] - if !(c&63 == 0) { - break + break + } + // match: (ORQ x0:(MOVBloadidx1 [i0] {s} p idx mem) sh:(SHLQconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem))) + // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (MOVWloadidx1 [i0] {s} p idx mem) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + if x0.Op != OpAMD64MOVBloadidx1 { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x0.Args[_i1] + idx := x0.Args[1^_i1] + sh := v.Args[1^_i0] + if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 8 { + continue + } + x1 := sh.Args[0] + if x1.Op != OpAMD64MOVBloadidx1 { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[2] + for _i2 := 0; _i2 <= 1; _i2++ { + if p != x1.Args[_i2] || idx != x1.Args[1^_i2] || mem != x1.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(idx) + v0.AddArg(mem) + return true + } + } } - v.reset(OpAMD64SARQ) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAMD64NEGQ, t) - v0.AddArg(y) - v.AddArg(v0) - return true + break } - // match: (SARQ x (ANDQconst [c] y)) - // cond: c & 63 == 63 - // result: (SARQ x y) + // match: (ORQ x0:(MOVWloadidx1 [i0] {s} p idx mem) sh:(SHLQconst [16] x1:(MOVWloadidx1 [i1] {s} p idx mem))) + // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (MOVLloadidx1 [i0] {s} p idx mem) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ANDQconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + if x0.Op != OpAMD64MOVWloadidx1 { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x0.Args[_i1] + idx := x0.Args[1^_i1] + sh := v.Args[1^_i0] + if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 16 { + continue + } + x1 := sh.Args[0] + if x1.Op != OpAMD64MOVWloadidx1 { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[2] + for _i2 := 0; _i2 <= 1; _i2++ { + if p != x1.Args[_i2] || idx != x1.Args[1^_i2] || mem != x1.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(idx) + v0.AddArg(mem) + return true + } + } } - c := v_1.AuxInt - y := v_1.Args[0] - if !(c&63 == 63) { - break + break + } + // match: (ORQ x0:(MOVLloadidx1 [i0] {s} p idx mem) sh:(SHLQconst [32] x1:(MOVLloadidx1 [i1] {s} p idx mem))) + // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (MOVQloadidx1 [i0] {s} p idx mem) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + if x0.Op != OpAMD64MOVLloadidx1 { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x0.Args[_i1] + idx := x0.Args[1^_i1] + sh := v.Args[1^_i0] + if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 32 { + continue + } + x1 := sh.Args[0] + if x1.Op != OpAMD64MOVLloadidx1 { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[2] + for _i2 := 0; _i2 <= 1; _i2++ { + if p != x1.Args[_i2] || idx != x1.Args[1^_i2] || mem != x1.Args[2] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(v.Pos, OpAMD64MOVQloadidx1, typ.UInt64) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(idx) + v0.AddArg(mem) + return true + } + } } - v.reset(OpAMD64SARQ) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (SARQ x (NEGQ (ANDQconst [c] y))) - // cond: c & 63 == 63 - // result: (SARQ x (NEGQ y)) + // match: (ORQ s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem)) or:(ORQ s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem)) y)) + // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) + // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64NEGQ { - break + for _i0 := 0; _i0 <= 1; _i0++ { + s1 := v.Args[_i0] + if s1.Op != OpAMD64SHLQconst { + continue + } + j1 := s1.AuxInt + x1 := s1.Args[0] + if x1.Op != OpAMD64MOVBloadidx1 { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x1.Args[_i1] + idx := x1.Args[1^_i1] + or := v.Args[1^_i0] + if or.Op != OpAMD64ORQ { + continue + } + _ = or.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + s0 := or.Args[_i2] + if s0.Op != OpAMD64SHLQconst { + continue + } + j0 := s0.AuxInt + x0 := s0.Args[0] + if x0.Op != OpAMD64MOVBloadidx1 { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[2] + for _i3 := 0; _i3 <= 1; _i3++ { + if p != x0.Args[_i3] || idx != x0.Args[1^_i3] || mem != x0.Args[2] { + continue + } + y := or.Args[1^_i2] + if !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { + continue + } + b = mergePoint(b, x0, x1, y) + v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) + v1.AuxInt = j0 + v2 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) + v2.AuxInt = i0 + v2.Aux = s + v2.AddArg(p) + v2.AddArg(idx) + v2.AddArg(mem) + v1.AddArg(v2) + v0.AddArg(v1) + v0.AddArg(y) + return true + } + } + } } - t := v_1.Type - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64ANDQconst { - break + break + } + // match: (ORQ s1:(SHLQconst [j1] x1:(MOVWloadidx1 [i1] {s} p idx mem)) or:(ORQ s0:(SHLQconst [j0] x0:(MOVWloadidx1 [i0] {s} p idx mem)) y)) + // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) + // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j0] (MOVLloadidx1 [i0] {s} p idx mem)) y) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + s1 := v.Args[_i0] + if s1.Op != OpAMD64SHLQconst { + continue + } + j1 := s1.AuxInt + x1 := s1.Args[0] + if x1.Op != OpAMD64MOVWloadidx1 { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x1.Args[_i1] + idx := x1.Args[1^_i1] + or := v.Args[1^_i0] + if or.Op != OpAMD64ORQ { + continue + } + _ = or.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + s0 := or.Args[_i2] + if s0.Op != OpAMD64SHLQconst { + continue + } + j0 := s0.AuxInt + x0 := s0.Args[0] + if x0.Op != OpAMD64MOVWloadidx1 { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[2] + for _i3 := 0; _i3 <= 1; _i3++ { + if p != x0.Args[_i3] || idx != x0.Args[1^_i3] || mem != x0.Args[2] { + continue + } + y := or.Args[1^_i2] + if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { + continue + } + b = mergePoint(b, x0, x1, y) + v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) + v1.AuxInt = j0 + v2 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) + v2.AuxInt = i0 + v2.Aux = s + v2.AddArg(p) + v2.AddArg(idx) + v2.AddArg(mem) + v1.AddArg(v2) + v0.AddArg(v1) + v0.AddArg(y) + return true + } + } + } } - c := v_1_0.AuxInt - y := v_1_0.Args[0] - if !(c&63 == 63) { - break + break + } + // match: (ORQ x1:(MOVBload [i1] {s} p mem) sh:(SHLQconst [8] x0:(MOVBload [i0] {s} p mem))) + // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (ROLWconst [8] (MOVWload [i0] {s} p mem)) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x1 := v.Args[_i0] + if x1.Op != OpAMD64MOVBload { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[1] + p := x1.Args[0] + sh := v.Args[1^_i0] + if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 8 { + continue + } + x0 := sh.Args[0] + if x0.Op != OpAMD64MOVBload { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[1] + if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(x0.Pos, OpAMD64ROLWconst, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = 8 + v1 := b.NewValue0(x0.Pos, OpAMD64MOVWload, typ.UInt16) + v1.AuxInt = i0 + v1.Aux = s + v1.AddArg(p) + v1.AddArg(mem) + v0.AddArg(v1) + return true } - v.reset(OpAMD64SARQ) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAMD64NEGQ, t) - v0.AddArg(y) - v.AddArg(v0) - return true + break } - // match: (SARQ x (ADDLconst [c] y)) - // cond: c & 63 == 0 - // result: (SARQ x y) + return false +} +func rewriteValueAMD64_OpAMD64ORQ_20(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (ORQ r1:(ROLWconst [8] x1:(MOVWload [i1] {s} p mem)) sh:(SHLQconst [16] r0:(ROLWconst [8] x0:(MOVWload [i0] {s} p mem)))) + // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (BSWAPL (MOVLload [i0] {s} p mem)) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ADDLconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + r1 := v.Args[_i0] + if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { + continue + } + x1 := r1.Args[0] + if x1.Op != OpAMD64MOVWload { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[1] + p := x1.Args[0] + sh := v.Args[1^_i0] + if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 16 { + continue + } + r0 := sh.Args[0] + if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { + continue + } + x0 := r0.Args[0] + if x0.Op != OpAMD64MOVWload { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[1] + if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(x0.Pos, OpAMD64BSWAPL, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x0.Pos, OpAMD64MOVLload, typ.UInt32) + v1.AuxInt = i0 + v1.Aux = s + v1.AddArg(p) + v1.AddArg(mem) + v0.AddArg(v1) + return true } - c := v_1.AuxInt - y := v_1.Args[0] - if !(c&63 == 0) { - break + break + } + // match: (ORQ r1:(BSWAPL x1:(MOVLload [i1] {s} p mem)) sh:(SHLQconst [32] r0:(BSWAPL x0:(MOVLload [i0] {s} p mem)))) + // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (BSWAPQ (MOVQload [i0] {s} p mem)) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + r1 := v.Args[_i0] + if r1.Op != OpAMD64BSWAPL { + continue + } + x1 := r1.Args[0] + if x1.Op != OpAMD64MOVLload { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[1] + p := x1.Args[0] + sh := v.Args[1^_i0] + if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 32 { + continue + } + r0 := sh.Args[0] + if r0.Op != OpAMD64BSWAPL { + continue + } + x0 := r0.Args[0] + if x0.Op != OpAMD64MOVLload { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[1] + if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(x0.Pos, OpAMD64BSWAPQ, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x0.Pos, OpAMD64MOVQload, typ.UInt64) + v1.AuxInt = i0 + v1.Aux = s + v1.AddArg(p) + v1.AddArg(mem) + v0.AddArg(v1) + return true } - v.reset(OpAMD64SARQ) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (SARQ x (NEGL (ADDLconst [c] y))) - // cond: c & 63 == 0 - // result: (SARQ x (NEGL y)) + // match: (ORQ s0:(SHLQconst [j0] x0:(MOVBload [i0] {s} p mem)) or:(ORQ s1:(SHLQconst [j1] x1:(MOVBload [i1] {s} p mem)) y)) + // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) + // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (ROLWconst [8] (MOVWload [i0] {s} p mem))) y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64NEGL { - break + for _i0 := 0; _i0 <= 1; _i0++ { + s0 := v.Args[_i0] + if s0.Op != OpAMD64SHLQconst { + continue + } + j0 := s0.AuxInt + x0 := s0.Args[0] + if x0.Op != OpAMD64MOVBload { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + or := v.Args[1^_i0] + if or.Op != OpAMD64ORQ { + continue + } + _ = or.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + s1 := or.Args[_i1] + if s1.Op != OpAMD64SHLQconst { + continue + } + j1 := s1.AuxInt + x1 := s1.Args[0] + if x1.Op != OpAMD64MOVBload { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] { + continue + } + y := or.Args[1^_i1] + if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { + continue + } + b = mergePoint(b, x0, x1, y) + v0 := b.NewValue0(x1.Pos, OpAMD64ORQ, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x1.Pos, OpAMD64SHLQconst, v.Type) + v1.AuxInt = j1 + v2 := b.NewValue0(x1.Pos, OpAMD64ROLWconst, typ.UInt16) + v2.AuxInt = 8 + v3 := b.NewValue0(x1.Pos, OpAMD64MOVWload, typ.UInt16) + v3.AuxInt = i0 + v3.Aux = s + v3.AddArg(p) + v3.AddArg(mem) + v2.AddArg(v3) + v1.AddArg(v2) + v0.AddArg(v1) + v0.AddArg(y) + return true + } } - t := v_1.Type - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64ADDLconst { - break + break + } + // match: (ORQ s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWload [i0] {s} p mem))) or:(ORQ s1:(SHLQconst [j1] r1:(ROLWconst [8] x1:(MOVWload [i1] {s} p mem))) y)) + // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) + // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (BSWAPL (MOVLload [i0] {s} p mem))) y) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + s0 := v.Args[_i0] + if s0.Op != OpAMD64SHLQconst { + continue + } + j0 := s0.AuxInt + r0 := s0.Args[0] + if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { + continue + } + x0 := r0.Args[0] + if x0.Op != OpAMD64MOVWload { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + or := v.Args[1^_i0] + if or.Op != OpAMD64ORQ { + continue + } + _ = or.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + s1 := or.Args[_i1] + if s1.Op != OpAMD64SHLQconst { + continue + } + j1 := s1.AuxInt + r1 := s1.Args[0] + if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { + continue + } + x1 := r1.Args[0] + if x1.Op != OpAMD64MOVWload { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] { + continue + } + y := or.Args[1^_i1] + if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { + continue + } + b = mergePoint(b, x0, x1, y) + v0 := b.NewValue0(x1.Pos, OpAMD64ORQ, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x1.Pos, OpAMD64SHLQconst, v.Type) + v1.AuxInt = j1 + v2 := b.NewValue0(x1.Pos, OpAMD64BSWAPL, typ.UInt32) + v3 := b.NewValue0(x1.Pos, OpAMD64MOVLload, typ.UInt32) + v3.AuxInt = i0 + v3.Aux = s + v3.AddArg(p) + v3.AddArg(mem) + v2.AddArg(v3) + v1.AddArg(v2) + v0.AddArg(v1) + v0.AddArg(y) + return true + } } - c := v_1_0.AuxInt - y := v_1_0.Args[0] - if !(c&63 == 0) { - break + break + } + // match: (ORQ x1:(MOVBloadidx1 [i1] {s} p idx mem) sh:(SHLQconst [8] x0:(MOVBloadidx1 [i0] {s} p idx mem))) + // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem)) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x1 := v.Args[_i0] + if x1.Op != OpAMD64MOVBloadidx1 { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x1.Args[_i1] + idx := x1.Args[1^_i1] + sh := v.Args[1^_i0] + if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 8 { + continue + } + x0 := sh.Args[0] + if x0.Op != OpAMD64MOVBloadidx1 { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[2] + for _i2 := 0; _i2 <= 1; _i2++ { + if p != x0.Args[_i2] || idx != x0.Args[1^_i2] || mem != x0.Args[2] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(v.Pos, OpAMD64ROLWconst, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = 8 + v1 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) + v1.AuxInt = i0 + v1.Aux = s + v1.AddArg(p) + v1.AddArg(idx) + v1.AddArg(mem) + v0.AddArg(v1) + return true + } + } } - v.reset(OpAMD64SARQ) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAMD64NEGL, t) - v0.AddArg(y) - v.AddArg(v0) - return true + break } - // match: (SARQ x (ANDLconst [c] y)) - // cond: c & 63 == 63 - // result: (SARQ x y) + // match: (ORQ r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} p idx mem)) sh:(SHLQconst [16] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} p idx mem)))) + // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem)) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64ANDLconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + r1 := v.Args[_i0] + if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { + continue + } + x1 := r1.Args[0] + if x1.Op != OpAMD64MOVWloadidx1 { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x1.Args[_i1] + idx := x1.Args[1^_i1] + sh := v.Args[1^_i0] + if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 16 { + continue + } + r0 := sh.Args[0] + if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { + continue + } + x0 := r0.Args[0] + if x0.Op != OpAMD64MOVWloadidx1 { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[2] + for _i2 := 0; _i2 <= 1; _i2++ { + if p != x0.Args[_i2] || idx != x0.Args[1^_i2] || mem != x0.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(v.Pos, OpAMD64BSWAPL, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) + v1.AuxInt = i0 + v1.Aux = s + v1.AddArg(p) + v1.AddArg(idx) + v1.AddArg(mem) + v0.AddArg(v1) + return true + } + } } - c := v_1.AuxInt - y := v_1.Args[0] - if !(c&63 == 63) { - break + break + } + // match: (ORQ r1:(BSWAPL x1:(MOVLloadidx1 [i1] {s} p idx mem)) sh:(SHLQconst [32] r0:(BSWAPL x0:(MOVLloadidx1 [i0] {s} p idx mem)))) + // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (BSWAPQ (MOVQloadidx1 [i0] {s} p idx mem)) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + r1 := v.Args[_i0] + if r1.Op != OpAMD64BSWAPL { + continue + } + x1 := r1.Args[0] + if x1.Op != OpAMD64MOVLloadidx1 { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x1.Args[_i1] + idx := x1.Args[1^_i1] + sh := v.Args[1^_i0] + if sh.Op != OpAMD64SHLQconst || sh.AuxInt != 32 { + continue + } + r0 := sh.Args[0] + if r0.Op != OpAMD64BSWAPL { + continue + } + x0 := r0.Args[0] + if x0.Op != OpAMD64MOVLloadidx1 { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[2] + for _i2 := 0; _i2 <= 1; _i2++ { + if p != x0.Args[_i2] || idx != x0.Args[1^_i2] || mem != x0.Args[2] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(v.Pos, OpAMD64BSWAPQ, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpAMD64MOVQloadidx1, typ.UInt64) + v1.AuxInt = i0 + v1.Aux = s + v1.AddArg(p) + v1.AddArg(idx) + v1.AddArg(mem) + v0.AddArg(v1) + return true + } + } } - v.reset(OpAMD64SARQ) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (SARQ x (NEGL (ANDLconst [c] y))) - // cond: c & 63 == 63 - // result: (SARQ x (NEGL y)) + // match: (ORQ s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} p idx mem)) or:(ORQ s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} p idx mem)) y)) + // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) + // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64NEGL { - break + for _i0 := 0; _i0 <= 1; _i0++ { + s0 := v.Args[_i0] + if s0.Op != OpAMD64SHLQconst { + continue + } + j0 := s0.AuxInt + x0 := s0.Args[0] + if x0.Op != OpAMD64MOVBloadidx1 { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x0.Args[_i1] + idx := x0.Args[1^_i1] + or := v.Args[1^_i0] + if or.Op != OpAMD64ORQ { + continue + } + _ = or.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + s1 := or.Args[_i2] + if s1.Op != OpAMD64SHLQconst { + continue + } + j1 := s1.AuxInt + x1 := s1.Args[0] + if x1.Op != OpAMD64MOVBloadidx1 { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[2] + for _i3 := 0; _i3 <= 1; _i3++ { + if p != x1.Args[_i3] || idx != x1.Args[1^_i3] || mem != x1.Args[2] { + continue + } + y := or.Args[1^_i2] + if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { + continue + } + b = mergePoint(b, x0, x1, y) + v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) + v1.AuxInt = j1 + v2 := b.NewValue0(v.Pos, OpAMD64ROLWconst, typ.UInt16) + v2.AuxInt = 8 + v3 := b.NewValue0(v.Pos, OpAMD64MOVWloadidx1, typ.UInt16) + v3.AuxInt = i0 + v3.Aux = s + v3.AddArg(p) + v3.AddArg(idx) + v3.AddArg(mem) + v2.AddArg(v3) + v1.AddArg(v2) + v0.AddArg(v1) + v0.AddArg(y) + return true + } + } + } } - t := v_1.Type - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64ANDLconst { - break + break + } + // match: (ORQ s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} p idx mem))) or:(ORQ s1:(SHLQconst [j1] r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} p idx mem))) y)) + // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) + // result: @mergePoint(b,x0,x1,y) (ORQ (SHLQconst [j1] (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem))) y) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + s0 := v.Args[_i0] + if s0.Op != OpAMD64SHLQconst { + continue + } + j0 := s0.AuxInt + r0 := s0.Args[0] + if r0.Op != OpAMD64ROLWconst || r0.AuxInt != 8 { + continue + } + x0 := r0.Args[0] + if x0.Op != OpAMD64MOVWloadidx1 { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x0.Args[_i1] + idx := x0.Args[1^_i1] + or := v.Args[1^_i0] + if or.Op != OpAMD64ORQ { + continue + } + _ = or.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + s1 := or.Args[_i2] + if s1.Op != OpAMD64SHLQconst { + continue + } + j1 := s1.AuxInt + r1 := s1.Args[0] + if r1.Op != OpAMD64ROLWconst || r1.AuxInt != 8 { + continue + } + x1 := r1.Args[0] + if x1.Op != OpAMD64MOVWloadidx1 { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[2] + for _i3 := 0; _i3 <= 1; _i3++ { + if p != x1.Args[_i3] || idx != x1.Args[1^_i3] || mem != x1.Args[2] { + continue + } + y := or.Args[1^_i2] + if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { + continue + } + b = mergePoint(b, x0, x1, y) + v0 := b.NewValue0(v.Pos, OpAMD64ORQ, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) + v1.AuxInt = j1 + v2 := b.NewValue0(v.Pos, OpAMD64BSWAPL, typ.UInt32) + v3 := b.NewValue0(v.Pos, OpAMD64MOVLloadidx1, typ.UInt32) + v3.AuxInt = i0 + v3.Aux = s + v3.AddArg(p) + v3.AddArg(idx) + v3.AddArg(mem) + v2.AddArg(v3) + v1.AddArg(v2) + v0.AddArg(v1) + v0.AddArg(y) + return true + } + } + } } - c := v_1_0.AuxInt - y := v_1_0.Args[0] - if !(c&63 == 63) { - break + break + } + // match: (ORQ x l:(MOVQload [off] {sym} ptr mem)) + // cond: canMergeLoadClobber(v, l, x) && clobber(l) + // result: (ORQload x [off] {sym} ptr mem) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != OpAMD64MOVQload { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[1] + ptr := l.Args[0] + if !(canMergeLoadClobber(v, l, x) && clobber(l)) { + continue + } + v.reset(OpAMD64ORQload) + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - v.reset(OpAMD64SARQ) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAMD64NEGL, t) - v0.AddArg(y) - v.AddArg(v0) - return true + break } return false } -func rewriteValueAMD64_OpAMD64SARQconst_0(v *Value) bool { - // match: (SARQconst x [0]) - // result: x +func rewriteValueAMD64_OpAMD64ORQconst_0(v *Value) bool { + // match: (ORQconst [c] x) + // cond: isUint64PowerOfTwo(c) && uint64(c) >= 128 + // result: (BTSQconst [log2(c)] x) for { - if v.AuxInt != 0 { + c := v.AuxInt + x := v.Args[0] + if !(isUint64PowerOfTwo(c) && uint64(c) >= 128) { break } - x := v.Args[0] - v.reset(OpCopy) - v.Type = x.Type + v.reset(OpAMD64BTSQconst) + v.AuxInt = log2(c) v.AddArg(x) return true } - // match: (SARQconst [c] (MOVQconst [d])) - // result: (MOVQconst [d>>uint64(c)]) + // match: (ORQconst [c] (ORQconst [d] x)) + // result: (ORQconst [c | d] x) for { c := v.AuxInt v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVQconst { + if v_0.Op != OpAMD64ORQconst { break } d := v_0.AuxInt - v.reset(OpAMD64MOVQconst) - v.AuxInt = d >> uint64(c) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64SARW_0(v *Value) bool { - // match: (SARW x (MOVQconst [c])) - // result: (SARWconst [min(c&31,15)] x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVQconst { - break - } - c := v_1.AuxInt - v.reset(OpAMD64SARWconst) - v.AuxInt = min(c&31, 15) + x := v_0.Args[0] + v.reset(OpAMD64ORQconst) + v.AuxInt = c | d v.AddArg(x) return true } - // match: (SARW x (MOVLconst [c])) - // result: (SARWconst [min(c&31,15)] x) + // match: (ORQconst [c] (BTSQconst [d] x)) + // result: (ORQconst [c | 1<>uint64(c)]) + // match: (ORQconst [-1] _) + // result: (MOVQconst [-1]) for { - c := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVQconst { + if v.AuxInt != -1 { break } - d := v_0.AuxInt v.reset(OpAMD64MOVQconst) - v.AuxInt = int64(int16(d)) >> uint64(c) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64SBBLcarrymask_0(v *Value) bool { - // match: (SBBLcarrymask (FlagEQ)) - // result: (MOVLconst [0]) - for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagEQ { - break - } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 0 + v.AuxInt = -1 return true } - // match: (SBBLcarrymask (FlagLT_ULT)) - // result: (MOVLconst [-1]) + // match: (ORQconst [c] (MOVQconst [d])) + // result: (MOVQconst [c|d]) for { + c := v.AuxInt v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagLT_ULT { + if v_0.Op != OpAMD64MOVQconst { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = -1 + d := v_0.AuxInt + v.reset(OpAMD64MOVQconst) + v.AuxInt = c | d return true } - // match: (SBBLcarrymask (FlagLT_UGT)) - // result: (MOVLconst [0]) + return false +} +func rewriteValueAMD64_OpAMD64ORQconstmodify_0(v *Value) bool { + // match: (ORQconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem) + // cond: ValAndOff(valoff1).canAdd(off2) + // result: (ORQconstmodify [ValAndOff(valoff1).add(off2)] {sym} base mem) for { + valoff1 := v.AuxInt + sym := v.Aux + mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagLT_UGT { + if v_0.Op != OpAMD64ADDQconst { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 0 + off2 := v_0.AuxInt + base := v_0.Args[0] + if !(ValAndOff(valoff1).canAdd(off2)) { + break + } + v.reset(OpAMD64ORQconstmodify) + v.AuxInt = ValAndOff(valoff1).add(off2) + v.Aux = sym + v.AddArg(base) + v.AddArg(mem) return true } - // match: (SBBLcarrymask (FlagGT_ULT)) - // result: (MOVLconst [-1]) + // match: (ORQconstmodify [valoff1] {sym1} (LEAQ [off2] {sym2} base) mem) + // cond: ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) + // result: (ORQconstmodify [ValAndOff(valoff1).add(off2)] {mergeSym(sym1,sym2)} base mem) for { + valoff1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagGT_ULT { + if v_0.Op != OpAMD64LEAQ { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = -1 + off2 := v_0.AuxInt + sym2 := v_0.Aux + base := v_0.Args[0] + if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2)) { + break + } + v.reset(OpAMD64ORQconstmodify) + v.AuxInt = ValAndOff(valoff1).add(off2) + v.Aux = mergeSym(sym1, sym2) + v.AddArg(base) + v.AddArg(mem) return true } - // match: (SBBLcarrymask (FlagGT_UGT)) - // result: (MOVLconst [0]) + return false +} +func rewriteValueAMD64_OpAMD64ORQload_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (ORQload [off1] {sym} val (ADDQconst [off2] base) mem) + // cond: is32Bit(off1+off2) + // result: (ORQload [off1+off2] {sym} val base mem) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagGT_UGT { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[2] + val := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64ADDQconst { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 0 + off2 := v_1.AuxInt + base := v_1.Args[0] + if !(is32Bit(off1 + off2)) { + break + } + v.reset(OpAMD64ORQload) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(val) + v.AddArg(base) + v.AddArg(mem) return true } - return false -} -func rewriteValueAMD64_OpAMD64SBBQ_0(v *Value) bool { - // match: (SBBQ x (MOVQconst [c]) borrow) - // cond: is32Bit(c) - // result: (SBBQconst x [c] borrow) + // match: (ORQload [off1] {sym1} val (LEAQ [off2] {sym2} base) mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (ORQload [off1+off2] {mergeSym(sym1,sym2)} val base mem) for { - borrow := v.Args[2] - x := v.Args[0] + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[2] + val := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVQconst { + if v_1.Op != OpAMD64LEAQ { break } - c := v_1.AuxInt - if !(is32Bit(c)) { + off2 := v_1.AuxInt + sym2 := v_1.Aux + base := v_1.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(OpAMD64SBBQconst) - v.AuxInt = c - v.AddArg(x) - v.AddArg(borrow) + v.reset(OpAMD64ORQload) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(val) + v.AddArg(base) + v.AddArg(mem) return true } - // match: (SBBQ x y (FlagEQ)) - // result: (SUBQborrow x y) + // match: ( ORQload x [off] {sym} ptr (MOVSDstore [off] {sym} ptr y _)) + // result: ( ORQ x (MOVQf2i y)) for { + off := v.AuxInt + sym := v.Aux _ = v.Args[2] x := v.Args[0] - y := v.Args[1] + ptr := v.Args[1] v_2 := v.Args[2] - if v_2.Op != OpAMD64FlagEQ { + if v_2.Op != OpAMD64MOVSDstore || v_2.AuxInt != off || v_2.Aux != sym { break } - v.reset(OpAMD64SUBQborrow) + _ = v_2.Args[2] + if ptr != v_2.Args[0] { + break + } + y := v_2.Args[1] + v.reset(OpAMD64ORQ) v.AddArg(x) - v.AddArg(y) + v0 := b.NewValue0(v_2.Pos, OpAMD64MOVQf2i, typ.UInt64) + v0.AddArg(y) + v.AddArg(v0) return true } return false } -func rewriteValueAMD64_OpAMD64SBBQcarrymask_0(v *Value) bool { - // match: (SBBQcarrymask (FlagEQ)) - // result: (MOVQconst [0]) +func rewriteValueAMD64_OpAMD64ORQmodify_0(v *Value) bool { + // match: (ORQmodify [off1] {sym} (ADDQconst [off2] base) val mem) + // cond: is32Bit(off1+off2) + // result: (ORQmodify [off1+off2] {sym} base val mem) for { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagEQ { + if v_0.Op != OpAMD64ADDQconst { break } - v.reset(OpAMD64MOVQconst) - v.AuxInt = 0 + off2 := v_0.AuxInt + base := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1 + off2)) { + break + } + v.reset(OpAMD64ORQmodify) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(base) + v.AddArg(val) + v.AddArg(mem) return true } - // match: (SBBQcarrymask (FlagLT_ULT)) - // result: (MOVQconst [-1]) + // match: (ORQmodify [off1] {sym1} (LEAQ [off2] {sym2} base) val mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (ORQmodify [off1+off2] {mergeSym(sym1,sym2)} base val mem) for { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagLT_ULT { + if v_0.Op != OpAMD64LEAQ { break } - v.reset(OpAMD64MOVQconst) - v.AuxInt = -1 + off2 := v_0.AuxInt + sym2 := v_0.Aux + base := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + break + } + v.reset(OpAMD64ORQmodify) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(base) + v.AddArg(val) + v.AddArg(mem) return true } - // match: (SBBQcarrymask (FlagLT_UGT)) - // result: (MOVQconst [0]) + return false +} +func rewriteValueAMD64_OpAMD64ROLB_0(v *Value) bool { + // match: (ROLB x (NEGQ y)) + // result: (RORB x y) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagLT_UGT { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64NEGQ { break } - v.reset(OpAMD64MOVQconst) - v.AuxInt = 0 + y := v_1.Args[0] + v.reset(OpAMD64RORB) + v.AddArg(x) + v.AddArg(y) return true } - // match: (SBBQcarrymask (FlagGT_ULT)) - // result: (MOVQconst [-1]) + // match: (ROLB x (NEGL y)) + // result: (RORB x y) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagGT_ULT { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64NEGL { break } - v.reset(OpAMD64MOVQconst) - v.AuxInt = -1 + y := v_1.Args[0] + v.reset(OpAMD64RORB) + v.AddArg(x) + v.AddArg(y) return true } - // match: (SBBQcarrymask (FlagGT_UGT)) - // result: (MOVQconst [0]) + // match: (ROLB x (MOVQconst [c])) + // result: (ROLBconst [c&7 ] x) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagGT_UGT { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64MOVQconst { break } - v.reset(OpAMD64MOVQconst) - v.AuxInt = 0 + c := v_1.AuxInt + v.reset(OpAMD64ROLBconst) + v.AuxInt = c & 7 + v.AddArg(x) return true } - return false -} -func rewriteValueAMD64_OpAMD64SBBQconst_0(v *Value) bool { - // match: (SBBQconst x [c] (FlagEQ)) - // result: (SUBQconstborrow x [c]) + // match: (ROLB x (MOVLconst [c])) + // result: (ROLBconst [c&7 ] x) for { - c := v.AuxInt _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagEQ { + if v_1.Op != OpAMD64MOVLconst { break } - v.reset(OpAMD64SUBQconstborrow) - v.AuxInt = c + c := v_1.AuxInt + v.reset(OpAMD64ROLBconst) + v.AuxInt = c & 7 v.AddArg(x) return true } return false } -func rewriteValueAMD64_OpAMD64SETA_0(v *Value) bool { - // match: (SETA (InvertFlags x)) - // result: (SETB x) +func rewriteValueAMD64_OpAMD64ROLBconst_0(v *Value) bool { + // match: (ROLBconst [c] (ROLBconst [d] x)) + // result: (ROLBconst [(c+d)& 7] x) for { + c := v.AuxInt v_0 := v.Args[0] - if v_0.Op != OpAMD64InvertFlags { + if v_0.Op != OpAMD64ROLBconst { break } + d := v_0.AuxInt x := v_0.Args[0] - v.reset(OpAMD64SETB) + v.reset(OpAMD64ROLBconst) + v.AuxInt = (c + d) & 7 v.AddArg(x) return true } - // match: (SETA (FlagEQ)) - // result: (MOVLconst [0]) + // match: (ROLBconst x [0]) + // result: x for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagEQ { + if v.AuxInt != 0 { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 0 + x := v.Args[0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (SETA (FlagLT_ULT)) - // result: (MOVLconst [0]) + return false +} +func rewriteValueAMD64_OpAMD64ROLL_0(v *Value) bool { + // match: (ROLL x (NEGQ y)) + // result: (RORL x y) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagLT_ULT { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64NEGQ { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 0 + y := v_1.Args[0] + v.reset(OpAMD64RORL) + v.AddArg(x) + v.AddArg(y) return true } - // match: (SETA (FlagLT_UGT)) - // result: (MOVLconst [1]) + // match: (ROLL x (NEGL y)) + // result: (RORL x y) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagLT_UGT { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64NEGL { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 1 + y := v_1.Args[0] + v.reset(OpAMD64RORL) + v.AddArg(x) + v.AddArg(y) return true } - // match: (SETA (FlagGT_ULT)) - // result: (MOVLconst [0]) + // match: (ROLL x (MOVQconst [c])) + // result: (ROLLconst [c&31] x) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagGT_ULT { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64MOVQconst { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 0 + c := v_1.AuxInt + v.reset(OpAMD64ROLLconst) + v.AuxInt = c & 31 + v.AddArg(x) return true } - // match: (SETA (FlagGT_UGT)) - // result: (MOVLconst [1]) + // match: (ROLL x (MOVLconst [c])) + // result: (ROLLconst [c&31] x) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagGT_UGT { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64MOVLconst { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 1 + c := v_1.AuxInt + v.reset(OpAMD64ROLLconst) + v.AuxInt = c & 31 + v.AddArg(x) return true } return false } -func rewriteValueAMD64_OpAMD64SETAE_0(v *Value) bool { - // match: (SETAE (InvertFlags x)) - // result: (SETBE x) +func rewriteValueAMD64_OpAMD64ROLLconst_0(v *Value) bool { + // match: (ROLLconst [c] (ROLLconst [d] x)) + // result: (ROLLconst [(c+d)&31] x) for { + c := v.AuxInt v_0 := v.Args[0] - if v_0.Op != OpAMD64InvertFlags { + if v_0.Op != OpAMD64ROLLconst { break } + d := v_0.AuxInt x := v_0.Args[0] - v.reset(OpAMD64SETBE) + v.reset(OpAMD64ROLLconst) + v.AuxInt = (c + d) & 31 v.AddArg(x) return true } - // match: (SETAE (FlagEQ)) - // result: (MOVLconst [1]) - for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagEQ { - break - } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 1 - return true - } - // match: (SETAE (FlagLT_ULT)) - // result: (MOVLconst [0]) - for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagLT_ULT { - break - } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 0 - return true - } - // match: (SETAE (FlagLT_UGT)) - // result: (MOVLconst [1]) + // match: (ROLLconst x [0]) + // result: x for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagLT_UGT { + if v.AuxInt != 0 { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 1 + x := v.Args[0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (SETAE (FlagGT_ULT)) - // result: (MOVLconst [0]) + return false +} +func rewriteValueAMD64_OpAMD64ROLQ_0(v *Value) bool { + // match: (ROLQ x (NEGQ y)) + // result: (RORQ x y) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagGT_ULT { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64NEGQ { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 0 + y := v_1.Args[0] + v.reset(OpAMD64RORQ) + v.AddArg(x) + v.AddArg(y) return true } - // match: (SETAE (FlagGT_UGT)) - // result: (MOVLconst [1]) + // match: (ROLQ x (NEGL y)) + // result: (RORQ x y) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagGT_UGT { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64NEGL { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 1 + y := v_1.Args[0] + v.reset(OpAMD64RORQ) + v.AddArg(x) + v.AddArg(y) return true } - return false -} -func rewriteValueAMD64_OpAMD64SETAEstore_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (SETAEstore [off] {sym} ptr (InvertFlags x) mem) - // result: (SETBEstore [off] {sym} ptr x mem) + // match: (ROLQ x (MOVQconst [c])) + // result: (ROLQconst [c&63] x) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64InvertFlags { + if v_1.Op != OpAMD64MOVQconst { break } - x := v_1.Args[0] - v.reset(OpAMD64SETBEstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) + c := v_1.AuxInt + v.reset(OpAMD64ROLQconst) + v.AuxInt = c & 63 v.AddArg(x) - v.AddArg(mem) return true } - // match: (SETAEstore [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) - // result: (SETAEstore [off1+off2] {sym} base val mem) + // match: (ROLQ x (MOVLconst [c])) + // result: (ROLQconst [c&63] x) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQconst { - break - } - off2 := v_0.AuxInt - base := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1 + off2)) { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64MOVLconst { break } - v.reset(OpAMD64SETAEstore) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(base) - v.AddArg(val) - v.AddArg(mem) + c := v_1.AuxInt + v.reset(OpAMD64ROLQconst) + v.AuxInt = c & 63 + v.AddArg(x) return true } - // match: (SETAEstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (SETAEstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) + return false +} +func rewriteValueAMD64_OpAMD64ROLQconst_0(v *Value) bool { + // match: (ROLQconst [c] (ROLQconst [d] x)) + // result: (ROLQconst [(c+d)&63] x) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] + c := v.AuxInt v_0 := v.Args[0] - if v_0.Op != OpAMD64LEAQ { - break - } - off2 := v_0.AuxInt - sym2 := v_0.Aux - base := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + if v_0.Op != OpAMD64ROLQconst { break } - v.reset(OpAMD64SETAEstore) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(base) - v.AddArg(val) - v.AddArg(mem) + d := v_0.AuxInt + x := v_0.Args[0] + v.reset(OpAMD64ROLQconst) + v.AuxInt = (c + d) & 63 + v.AddArg(x) return true } - // match: (SETAEstore [off] {sym} ptr (FlagEQ) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) + // match: (ROLQconst x [0]) + // result: x for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagEQ { + if v.AuxInt != 0 { break } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 1 - v.AddArg(v0) - v.AddArg(mem) + x := v.Args[0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (SETAEstore [off] {sym} ptr (FlagLT_ULT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) + return false +} +func rewriteValueAMD64_OpAMD64ROLW_0(v *Value) bool { + // match: (ROLW x (NEGQ y)) + // result: (RORW x y) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagLT_ULT { + if v_1.Op != OpAMD64NEGQ { break } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 0 - v.AddArg(v0) - v.AddArg(mem) + y := v_1.Args[0] + v.reset(OpAMD64RORW) + v.AddArg(x) + v.AddArg(y) return true } - // match: (SETAEstore [off] {sym} ptr (FlagLT_UGT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) + // match: (ROLW x (NEGL y)) + // result: (RORW x y) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagLT_UGT { + if v_1.Op != OpAMD64NEGL { break } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 1 - v.AddArg(v0) - v.AddArg(mem) + y := v_1.Args[0] + v.reset(OpAMD64RORW) + v.AddArg(x) + v.AddArg(y) return true } - // match: (SETAEstore [off] {sym} ptr (FlagGT_ULT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) + // match: (ROLW x (MOVQconst [c])) + // result: (ROLWconst [c&15] x) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagGT_ULT { + if v_1.Op != OpAMD64MOVQconst { break } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 0 - v.AddArg(v0) - v.AddArg(mem) + c := v_1.AuxInt + v.reset(OpAMD64ROLWconst) + v.AuxInt = c & 15 + v.AddArg(x) return true } - // match: (SETAEstore [off] {sym} ptr (FlagGT_UGT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) + // match: (ROLW x (MOVLconst [c])) + // result: (ROLWconst [c&15] x) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagGT_UGT { + if v_1.Op != OpAMD64MOVLconst { break } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 1 - v.AddArg(v0) - v.AddArg(mem) + c := v_1.AuxInt + v.reset(OpAMD64ROLWconst) + v.AuxInt = c & 15 + v.AddArg(x) return true } return false } -func rewriteValueAMD64_OpAMD64SETAstore_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (SETAstore [off] {sym} ptr (InvertFlags x) mem) - // result: (SETBstore [off] {sym} ptr x mem) +func rewriteValueAMD64_OpAMD64ROLWconst_0(v *Value) bool { + // match: (ROLWconst [c] (ROLWconst [d] x)) + // result: (ROLWconst [(c+d)&15] x) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64InvertFlags { + c := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpAMD64ROLWconst { break } - x := v_1.Args[0] - v.reset(OpAMD64SETBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) + d := v_0.AuxInt + x := v_0.Args[0] + v.reset(OpAMD64ROLWconst) + v.AuxInt = (c + d) & 15 v.AddArg(x) - v.AddArg(mem) return true } - // match: (SETAstore [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) - // result: (SETAstore [off1+off2] {sym} base val mem) + // match: (ROLWconst x [0]) + // result: x for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQconst { + if v.AuxInt != 0 { break } - off2 := v_0.AuxInt - base := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1 + off2)) { + x := v.Args[0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + return false +} +func rewriteValueAMD64_OpAMD64RORB_0(v *Value) bool { + // match: (RORB x (NEGQ y)) + // result: (ROLB x y) + for { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64NEGQ { break } - v.reset(OpAMD64SETAstore) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(base) - v.AddArg(val) - v.AddArg(mem) + y := v_1.Args[0] + v.reset(OpAMD64ROLB) + v.AddArg(x) + v.AddArg(y) return true } - // match: (SETAstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (SETAstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) + // match: (RORB x (NEGL y)) + // result: (ROLB x y) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64LEAQ { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64NEGL { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - base := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + y := v_1.Args[0] + v.reset(OpAMD64ROLB) + v.AddArg(x) + v.AddArg(y) + return true + } + // match: (RORB x (MOVQconst [c])) + // result: (ROLBconst [(-c)&7 ] x) + for { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64MOVQconst { break } - v.reset(OpAMD64SETAstore) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(base) - v.AddArg(val) - v.AddArg(mem) + c := v_1.AuxInt + v.reset(OpAMD64ROLBconst) + v.AuxInt = (-c) & 7 + v.AddArg(x) return true } - // match: (SETAstore [off] {sym} ptr (FlagEQ) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) + // match: (RORB x (MOVLconst [c])) + // result: (ROLBconst [(-c)&7 ] x) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagEQ { + if v_1.Op != OpAMD64MOVLconst { break } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 0 - v.AddArg(v0) - v.AddArg(mem) + c := v_1.AuxInt + v.reset(OpAMD64ROLBconst) + v.AuxInt = (-c) & 7 + v.AddArg(x) return true } - // match: (SETAstore [off] {sym} ptr (FlagLT_ULT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) + return false +} +func rewriteValueAMD64_OpAMD64RORL_0(v *Value) bool { + // match: (RORL x (NEGQ y)) + // result: (ROLL x y) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagLT_ULT { + if v_1.Op != OpAMD64NEGQ { break } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 0 - v.AddArg(v0) - v.AddArg(mem) + y := v_1.Args[0] + v.reset(OpAMD64ROLL) + v.AddArg(x) + v.AddArg(y) return true } - // match: (SETAstore [off] {sym} ptr (FlagLT_UGT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) + // match: (RORL x (NEGL y)) + // result: (ROLL x y) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagLT_UGT { + if v_1.Op != OpAMD64NEGL { break } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 1 - v.AddArg(v0) - v.AddArg(mem) + y := v_1.Args[0] + v.reset(OpAMD64ROLL) + v.AddArg(x) + v.AddArg(y) return true } - // match: (SETAstore [off] {sym} ptr (FlagGT_ULT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) + // match: (RORL x (MOVQconst [c])) + // result: (ROLLconst [(-c)&31] x) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagGT_ULT { + if v_1.Op != OpAMD64MOVQconst { break } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 0 - v.AddArg(v0) - v.AddArg(mem) + c := v_1.AuxInt + v.reset(OpAMD64ROLLconst) + v.AuxInt = (-c) & 31 + v.AddArg(x) return true } - // match: (SETAstore [off] {sym} ptr (FlagGT_UGT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) + // match: (RORL x (MOVLconst [c])) + // result: (ROLLconst [(-c)&31] x) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagGT_UGT { + if v_1.Op != OpAMD64MOVLconst { break } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 1 - v.AddArg(v0) - v.AddArg(mem) + c := v_1.AuxInt + v.reset(OpAMD64ROLLconst) + v.AuxInt = (-c) & 31 + v.AddArg(x) return true } return false } -func rewriteValueAMD64_OpAMD64SETB_0(v *Value) bool { - // match: (SETB (InvertFlags x)) - // result: (SETA x) +func rewriteValueAMD64_OpAMD64RORQ_0(v *Value) bool { + // match: (RORQ x (NEGQ y)) + // result: (ROLQ x y) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64InvertFlags { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64NEGQ { break } - x := v_0.Args[0] - v.reset(OpAMD64SETA) + y := v_1.Args[0] + v.reset(OpAMD64ROLQ) v.AddArg(x) + v.AddArg(y) return true } - // match: (SETB (FlagEQ)) - // result: (MOVLconst [0]) + // match: (RORQ x (NEGL y)) + // result: (ROLQ x y) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagEQ { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64NEGL { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 0 + y := v_1.Args[0] + v.reset(OpAMD64ROLQ) + v.AddArg(x) + v.AddArg(y) return true } - // match: (SETB (FlagLT_ULT)) - // result: (MOVLconst [1]) + // match: (RORQ x (MOVQconst [c])) + // result: (ROLQconst [(-c)&63] x) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagLT_ULT { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64MOVQconst { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 1 + c := v_1.AuxInt + v.reset(OpAMD64ROLQconst) + v.AuxInt = (-c) & 63 + v.AddArg(x) return true } - // match: (SETB (FlagLT_UGT)) - // result: (MOVLconst [0]) + // match: (RORQ x (MOVLconst [c])) + // result: (ROLQconst [(-c)&63] x) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagLT_UGT { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64MOVLconst { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 0 + c := v_1.AuxInt + v.reset(OpAMD64ROLQconst) + v.AuxInt = (-c) & 63 + v.AddArg(x) return true } - // match: (SETB (FlagGT_ULT)) - // result: (MOVLconst [1]) + return false +} +func rewriteValueAMD64_OpAMD64RORW_0(v *Value) bool { + // match: (RORW x (NEGQ y)) + // result: (ROLW x y) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagGT_ULT { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64NEGQ { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 1 + y := v_1.Args[0] + v.reset(OpAMD64ROLW) + v.AddArg(x) + v.AddArg(y) return true } - // match: (SETB (FlagGT_UGT)) - // result: (MOVLconst [0]) + // match: (RORW x (NEGL y)) + // result: (ROLW x y) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagGT_UGT { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64NEGL { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 0 + y := v_1.Args[0] + v.reset(OpAMD64ROLW) + v.AddArg(x) + v.AddArg(y) return true } - return false -} -func rewriteValueAMD64_OpAMD64SETBE_0(v *Value) bool { - // match: (SETBE (InvertFlags x)) - // result: (SETAE x) + // match: (RORW x (MOVQconst [c])) + // result: (ROLWconst [(-c)&15] x) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64InvertFlags { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64MOVQconst { break } - x := v_0.Args[0] - v.reset(OpAMD64SETAE) + c := v_1.AuxInt + v.reset(OpAMD64ROLWconst) + v.AuxInt = (-c) & 15 v.AddArg(x) return true } - // match: (SETBE (FlagEQ)) - // result: (MOVLconst [1]) + // match: (RORW x (MOVLconst [c])) + // result: (ROLWconst [(-c)&15] x) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagEQ { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64MOVLconst { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 1 + c := v_1.AuxInt + v.reset(OpAMD64ROLWconst) + v.AuxInt = (-c) & 15 + v.AddArg(x) return true } - // match: (SETBE (FlagLT_ULT)) - // result: (MOVLconst [1]) + return false +} +func rewriteValueAMD64_OpAMD64SARB_0(v *Value) bool { + // match: (SARB x (MOVQconst [c])) + // result: (SARBconst [min(c&31,7)] x) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagLT_ULT { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64MOVQconst { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 1 + c := v_1.AuxInt + v.reset(OpAMD64SARBconst) + v.AuxInt = min(c&31, 7) + v.AddArg(x) return true - } - // match: (SETBE (FlagLT_UGT)) - // result: (MOVLconst [0]) + } + // match: (SARB x (MOVLconst [c])) + // result: (SARBconst [min(c&31,7)] x) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagLT_UGT { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64MOVLconst { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 0 + c := v_1.AuxInt + v.reset(OpAMD64SARBconst) + v.AuxInt = min(c&31, 7) + v.AddArg(x) return true } - // match: (SETBE (FlagGT_ULT)) - // result: (MOVLconst [1]) + return false +} +func rewriteValueAMD64_OpAMD64SARBconst_0(v *Value) bool { + // match: (SARBconst x [0]) + // result: x for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagGT_ULT { + if v.AuxInt != 0 { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 1 + x := v.Args[0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (SETBE (FlagGT_UGT)) - // result: (MOVLconst [0]) + // match: (SARBconst [c] (MOVQconst [d])) + // result: (MOVQconst [int64(int8(d))>>uint64(c)]) for { + c := v.AuxInt v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagGT_UGT { + if v_0.Op != OpAMD64MOVQconst { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 0 + d := v_0.AuxInt + v.reset(OpAMD64MOVQconst) + v.AuxInt = int64(int8(d)) >> uint64(c) return true } return false } -func rewriteValueAMD64_OpAMD64SETBEstore_0(v *Value) bool { +func rewriteValueAMD64_OpAMD64SARL_0(v *Value) bool { b := v.Block - typ := &b.Func.Config.Types - // match: (SETBEstore [off] {sym} ptr (InvertFlags x) mem) - // result: (SETAEstore [off] {sym} ptr x mem) + // match: (SARL x (MOVQconst [c])) + // result: (SARLconst [c&31] x) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64InvertFlags { + if v_1.Op != OpAMD64MOVQconst { break } - x := v_1.Args[0] - v.reset(OpAMD64SETAEstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) + c := v_1.AuxInt + v.reset(OpAMD64SARLconst) + v.AuxInt = c & 31 v.AddArg(x) - v.AddArg(mem) return true } - // match: (SETBEstore [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) - // result: (SETBEstore [off1+off2] {sym} base val mem) + // match: (SARL x (MOVLconst [c])) + // result: (SARLconst [c&31] x) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQconst { - break - } - off2 := v_0.AuxInt - base := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1 + off2)) { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64MOVLconst { break } - v.reset(OpAMD64SETBEstore) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(base) - v.AddArg(val) - v.AddArg(mem) + c := v_1.AuxInt + v.reset(OpAMD64SARLconst) + v.AuxInt = c & 31 + v.AddArg(x) return true } - // match: (SETBEstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (SETBEstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) + // match: (SARL x (ADDQconst [c] y)) + // cond: c & 31 == 0 + // result: (SARL x y) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64LEAQ { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - base := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + c := v_1.AuxInt + y := v_1.Args[0] + if !(c&31 == 0) { break } - v.reset(OpAMD64SETBEstore) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(base) - v.AddArg(val) - v.AddArg(mem) + v.reset(OpAMD64SARL) + v.AddArg(x) + v.AddArg(y) return true } - // match: (SETBEstore [off] {sym} ptr (FlagEQ) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) + // match: (SARL x (NEGQ (ADDQconst [c] y))) + // cond: c & 31 == 0 + // result: (SARL x (NEGQ y)) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagEQ { + if v_1.Op != OpAMD64NEGQ { break } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 1 - v.AddArg(v0) - v.AddArg(mem) - return true - } - // match: (SETBEstore [off] {sym} ptr (FlagLT_ULT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagLT_ULT { + t := v_1.Type + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpAMD64ADDQconst { break } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 1 - v.AddArg(v0) - v.AddArg(mem) - return true - } - // match: (SETBEstore [off] {sym} ptr (FlagLT_UGT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagLT_UGT { + c := v_1_0.AuxInt + y := v_1_0.Args[0] + if !(c&31 == 0) { break } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 0 + v.reset(OpAMD64SARL) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpAMD64NEGQ, t) + v0.AddArg(y) v.AddArg(v0) - v.AddArg(mem) return true } - // match: (SETBEstore [off] {sym} ptr (FlagGT_ULT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) + // match: (SARL x (ANDQconst [c] y)) + // cond: c & 31 == 31 + // result: (SARL x y) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagGT_ULT { + if v_1.Op != OpAMD64ANDQconst { break } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 1 - v.AddArg(v0) - v.AddArg(mem) + c := v_1.AuxInt + y := v_1.Args[0] + if !(c&31 == 31) { + break + } + v.reset(OpAMD64SARL) + v.AddArg(x) + v.AddArg(y) return true } - // match: (SETBEstore [off] {sym} ptr (FlagGT_UGT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) + // match: (SARL x (NEGQ (ANDQconst [c] y))) + // cond: c & 31 == 31 + // result: (SARL x (NEGQ y)) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagGT_UGT { + if v_1.Op != OpAMD64NEGQ { break } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 0 + t := v_1.Type + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpAMD64ANDQconst { + break + } + c := v_1_0.AuxInt + y := v_1_0.Args[0] + if !(c&31 == 31) { + break + } + v.reset(OpAMD64SARL) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpAMD64NEGQ, t) + v0.AddArg(y) v.AddArg(v0) - v.AddArg(mem) return true } - return false -} -func rewriteValueAMD64_OpAMD64SETBstore_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (SETBstore [off] {sym} ptr (InvertFlags x) mem) - // result: (SETAstore [off] {sym} ptr x mem) + // match: (SARL x (ADDLconst [c] y)) + // cond: c & 31 == 0 + // result: (SARL x y) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64InvertFlags { + if v_1.Op != OpAMD64ADDLconst { break } - x := v_1.Args[0] - v.reset(OpAMD64SETAstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) + c := v_1.AuxInt + y := v_1.Args[0] + if !(c&31 == 0) { + break + } + v.reset(OpAMD64SARL) v.AddArg(x) - v.AddArg(mem) + v.AddArg(y) return true } - // match: (SETBstore [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) - // result: (SETBstore [off1+off2] {sym} base val mem) + // match: (SARL x (NEGL (ADDLconst [c] y))) + // cond: c & 31 == 0 + // result: (SARL x (NEGL y)) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQconst { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64NEGL { break } - off2 := v_0.AuxInt - base := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1 + off2)) { + t := v_1.Type + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpAMD64ADDLconst { break } - v.reset(OpAMD64SETBstore) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(base) - v.AddArg(val) - v.AddArg(mem) + c := v_1_0.AuxInt + y := v_1_0.Args[0] + if !(c&31 == 0) { + break + } + v.reset(OpAMD64SARL) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpAMD64NEGL, t) + v0.AddArg(y) + v.AddArg(v0) return true } - // match: (SETBstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (SETBstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) + // match: (SARL x (ANDLconst [c] y)) + // cond: c & 31 == 31 + // result: (SARL x y) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64LEAQ { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64ANDLconst { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - base := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + c := v_1.AuxInt + y := v_1.Args[0] + if !(c&31 == 31) { break } - v.reset(OpAMD64SETBstore) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(base) - v.AddArg(val) - v.AddArg(mem) + v.reset(OpAMD64SARL) + v.AddArg(x) + v.AddArg(y) return true } - // match: (SETBstore [off] {sym} ptr (FlagEQ) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) + // match: (SARL x (NEGL (ANDLconst [c] y))) + // cond: c & 31 == 31 + // result: (SARL x (NEGL y)) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagEQ { + if v_1.Op != OpAMD64NEGL { break } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 0 + t := v_1.Type + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpAMD64ANDLconst { + break + } + c := v_1_0.AuxInt + y := v_1_0.Args[0] + if !(c&31 == 31) { + break + } + v.reset(OpAMD64SARL) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpAMD64NEGL, t) + v0.AddArg(y) v.AddArg(v0) - v.AddArg(mem) return true } - // match: (SETBstore [off] {sym} ptr (FlagLT_ULT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) + return false +} +func rewriteValueAMD64_OpAMD64SARLconst_0(v *Value) bool { + // match: (SARLconst x [0]) + // result: x for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagLT_ULT { + if v.AuxInt != 0 { break } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 1 - v.AddArg(v0) - v.AddArg(mem) + x := v.Args[0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (SETBstore [off] {sym} ptr (FlagLT_UGT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) + // match: (SARLconst [c] (MOVQconst [d])) + // result: (MOVQconst [int64(int32(d))>>uint64(c)]) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagLT_UGT { + c := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpAMD64MOVQconst { break } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 0 - v.AddArg(v0) - v.AddArg(mem) + d := v_0.AuxInt + v.reset(OpAMD64MOVQconst) + v.AuxInt = int64(int32(d)) >> uint64(c) return true } - // match: (SETBstore [off] {sym} ptr (FlagGT_ULT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) + return false +} +func rewriteValueAMD64_OpAMD64SARQ_0(v *Value) bool { + b := v.Block + // match: (SARQ x (MOVQconst [c])) + // result: (SARQconst [c&63] x) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagGT_ULT { + if v_1.Op != OpAMD64MOVQconst { break } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 1 - v.AddArg(v0) - v.AddArg(mem) + c := v_1.AuxInt + v.reset(OpAMD64SARQconst) + v.AuxInt = c & 63 + v.AddArg(x) return true } - // match: (SETBstore [off] {sym} ptr (FlagGT_UGT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) + // match: (SARQ x (MOVLconst [c])) + // result: (SARQconst [c&63] x) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagGT_UGT { + if v_1.Op != OpAMD64MOVLconst { break } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 0 - v.AddArg(v0) - v.AddArg(mem) + c := v_1.AuxInt + v.reset(OpAMD64SARQconst) + v.AuxInt = c & 63 + v.AddArg(x) return true } - return false -} -func rewriteValueAMD64_OpAMD64SETEQ_0(v *Value) bool { - b := v.Block - // match: (SETEQ (TESTL (SHLL (MOVLconst [1]) x) y)) - // result: (SETAE (BTL x y)) + // match: (SARQ x (ADDQconst [c] y)) + // cond: c & 63 == 0 + // result: (SARQ x y) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTL { - break - } - y := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SHLL { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64ADDQconst { break } - x := v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64MOVLconst || v_0_0_0.AuxInt != 1 { + c := v_1.AuxInt + y := v_1.Args[0] + if !(c&63 == 0) { break } - v.reset(OpAMD64SETAE) - v0 := b.NewValue0(v.Pos, OpAMD64BTL, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - v.AddArg(v0) + v.reset(OpAMD64SARQ) + v.AddArg(x) + v.AddArg(y) return true } - // match: (SETEQ (TESTL y (SHLL (MOVLconst [1]) x))) - // result: (SETAE (BTL x y)) + // match: (SARQ x (NEGQ (ADDQconst [c] y))) + // cond: c & 63 == 0 + // result: (SARQ x (NEGQ y)) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTL { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64NEGQ { break } - _ = v_0.Args[1] - y := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SHLL { + t := v_1.Type + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpAMD64ADDQconst { break } - x := v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpAMD64MOVLconst || v_0_1_0.AuxInt != 1 { + c := v_1_0.AuxInt + y := v_1_0.Args[0] + if !(c&63 == 0) { break } - v.reset(OpAMD64SETAE) - v0 := b.NewValue0(v.Pos, OpAMD64BTL, types.TypeFlags) - v0.AddArg(x) + v.reset(OpAMD64SARQ) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpAMD64NEGQ, t) v0.AddArg(y) v.AddArg(v0) return true } - // match: (SETEQ (TESTQ (SHLQ (MOVQconst [1]) x) y)) - // result: (SETAE (BTQ x y)) + // match: (SARQ x (ANDQconst [c] y)) + // cond: c & 63 == 63 + // result: (SARQ x y) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTQ { - break - } - y := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SHLQ { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64ANDQconst { break } - x := v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64MOVQconst || v_0_0_0.AuxInt != 1 { + c := v_1.AuxInt + y := v_1.Args[0] + if !(c&63 == 63) { break } - v.reset(OpAMD64SETAE) - v0 := b.NewValue0(v.Pos, OpAMD64BTQ, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - v.AddArg(v0) + v.reset(OpAMD64SARQ) + v.AddArg(x) + v.AddArg(y) return true } - // match: (SETEQ (TESTQ y (SHLQ (MOVQconst [1]) x))) - // result: (SETAE (BTQ x y)) + // match: (SARQ x (NEGQ (ANDQconst [c] y))) + // cond: c & 63 == 63 + // result: (SARQ x (NEGQ y)) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTQ { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64NEGQ { break } - _ = v_0.Args[1] - y := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SHLQ { + t := v_1.Type + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpAMD64ANDQconst { break } - x := v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpAMD64MOVQconst || v_0_1_0.AuxInt != 1 { + c := v_1_0.AuxInt + y := v_1_0.Args[0] + if !(c&63 == 63) { break } - v.reset(OpAMD64SETAE) - v0 := b.NewValue0(v.Pos, OpAMD64BTQ, types.TypeFlags) - v0.AddArg(x) + v.reset(OpAMD64SARQ) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpAMD64NEGQ, t) v0.AddArg(y) v.AddArg(v0) return true } - // match: (SETEQ (TESTLconst [c] x)) - // cond: isUint32PowerOfTwo(c) - // result: (SETAE (BTLconst [log2uint32(c)] x)) + // match: (SARQ x (ADDLconst [c] y)) + // cond: c & 63 == 0 + // result: (SARQ x y) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTLconst { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64ADDLconst { break } - c := v_0.AuxInt - x := v_0.Args[0] - if !(isUint32PowerOfTwo(c)) { + c := v_1.AuxInt + y := v_1.Args[0] + if !(c&63 == 0) { break } - v.reset(OpAMD64SETAE) - v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = log2uint32(c) - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpAMD64SARQ) + v.AddArg(x) + v.AddArg(y) return true } - // match: (SETEQ (TESTQconst [c] x)) - // cond: isUint64PowerOfTwo(c) - // result: (SETAE (BTQconst [log2(c)] x)) + // match: (SARQ x (NEGL (ADDLconst [c] y))) + // cond: c & 63 == 0 + // result: (SARQ x (NEGL y)) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTQconst { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64NEGL { break } - c := v_0.AuxInt - x := v_0.Args[0] - if !(isUint64PowerOfTwo(c)) { + t := v_1.Type + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpAMD64ADDLconst { break } - v.reset(OpAMD64SETAE) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = log2(c) - v0.AddArg(x) + c := v_1_0.AuxInt + y := v_1_0.Args[0] + if !(c&63 == 0) { + break + } + v.reset(OpAMD64SARQ) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpAMD64NEGL, t) + v0.AddArg(y) v.AddArg(v0) return true } - // match: (SETEQ (TESTQ (MOVQconst [c]) x)) - // cond: isUint64PowerOfTwo(c) - // result: (SETAE (BTQconst [log2(c)] x)) + // match: (SARQ x (ANDLconst [c] y)) + // cond: c & 63 == 63 + // result: (SARQ x y) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTQ { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64MOVQconst { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64ANDLconst { break } - c := v_0_0.AuxInt - if !(isUint64PowerOfTwo(c)) { + c := v_1.AuxInt + y := v_1.Args[0] + if !(c&63 == 63) { break } - v.reset(OpAMD64SETAE) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = log2(c) - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpAMD64SARQ) + v.AddArg(x) + v.AddArg(y) return true } - // match: (SETEQ (TESTQ x (MOVQconst [c]))) - // cond: isUint64PowerOfTwo(c) - // result: (SETAE (BTQconst [log2(c)] x)) + // match: (SARQ x (NEGL (ANDLconst [c] y))) + // cond: c & 63 == 63 + // result: (SARQ x (NEGL y)) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTQ { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64NEGL { break } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64MOVQconst { + t := v_1.Type + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpAMD64ANDLconst { break } - c := v_0_1.AuxInt - if !(isUint64PowerOfTwo(c)) { + c := v_1_0.AuxInt + y := v_1_0.Args[0] + if !(c&63 == 63) { break } - v.reset(OpAMD64SETAE) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = log2(c) - v0.AddArg(x) + v.reset(OpAMD64SARQ) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpAMD64NEGL, t) + v0.AddArg(y) v.AddArg(v0) return true } - // match: (SETEQ (CMPLconst [1] s:(ANDLconst [1] _))) - // result: (SETNE (CMPLconst [0] s)) + return false +} +func rewriteValueAMD64_OpAMD64SARQconst_0(v *Value) bool { + // match: (SARQconst x [0]) + // result: x for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64CMPLconst || v_0.AuxInt != 1 { - break - } - s := v_0.Args[0] - if s.Op != OpAMD64ANDLconst || s.AuxInt != 1 { + if v.AuxInt != 0 { break } - v.reset(OpAMD64SETNE) - v0 := b.NewValue0(v.Pos, OpAMD64CMPLconst, types.TypeFlags) - v0.AuxInt = 0 - v0.AddArg(s) - v.AddArg(v0) + x := v.Args[0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (SETEQ (CMPQconst [1] s:(ANDQconst [1] _))) - // result: (SETNE (CMPQconst [0] s)) + // match: (SARQconst [c] (MOVQconst [d])) + // result: (MOVQconst [d>>uint64(c)]) for { + c := v.AuxInt v_0 := v.Args[0] - if v_0.Op != OpAMD64CMPQconst || v_0.AuxInt != 1 { - break - } - s := v_0.Args[0] - if s.Op != OpAMD64ANDQconst || s.AuxInt != 1 { + if v_0.Op != OpAMD64MOVQconst { break } - v.reset(OpAMD64SETNE) - v0 := b.NewValue0(v.Pos, OpAMD64CMPQconst, types.TypeFlags) - v0.AuxInt = 0 - v0.AddArg(s) - v.AddArg(v0) + d := v_0.AuxInt + v.reset(OpAMD64MOVQconst) + v.AuxInt = d >> uint64(c) return true } return false } -func rewriteValueAMD64_OpAMD64SETEQ_10(v *Value) bool { - b := v.Block - // match: (SETEQ (TESTQ z1:(SHLQconst [63] (SHRQconst [63] x)) z2)) - // cond: z1==z2 - // result: (SETAE (BTQconst [63] x)) +func rewriteValueAMD64_OpAMD64SARW_0(v *Value) bool { + // match: (SARW x (MOVQconst [c])) + // result: (SARWconst [min(c&31,15)] x) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTQ { - break - } - z2 := v_0.Args[1] - z1 := v_0.Args[0] - if z1.Op != OpAMD64SHLQconst || z1.AuxInt != 63 { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64MOVQconst { break } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 63 { + c := v_1.AuxInt + v.reset(OpAMD64SARWconst) + v.AuxInt = min(c&31, 15) + v.AddArg(x) + return true + } + // match: (SARW x (MOVLconst [c])) + // result: (SARWconst [min(c&31,15)] x) + for { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64MOVLconst { break } - x := z1_0.Args[0] - if !(z1 == z2) { + c := v_1.AuxInt + v.reset(OpAMD64SARWconst) + v.AuxInt = min(c&31, 15) + v.AddArg(x) + return true + } + return false +} +func rewriteValueAMD64_OpAMD64SARWconst_0(v *Value) bool { + // match: (SARWconst x [0]) + // result: x + for { + if v.AuxInt != 0 { break } - v.reset(OpAMD64SETAE) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 - v0.AddArg(x) - v.AddArg(v0) + x := v.Args[0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (SETEQ (TESTQ z2 z1:(SHLQconst [63] (SHRQconst [63] x)))) - // cond: z1==z2 - // result: (SETAE (BTQconst [63] x)) + // match: (SARWconst [c] (MOVQconst [d])) + // result: (MOVQconst [int64(int16(d))>>uint64(c)]) for { + c := v.AuxInt v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTQ { - break - } - _ = v_0.Args[1] - z2 := v_0.Args[0] - z1 := v_0.Args[1] - if z1.Op != OpAMD64SHLQconst || z1.AuxInt != 63 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 63 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { + if v_0.Op != OpAMD64MOVQconst { break } - v.reset(OpAMD64SETAE) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 - v0.AddArg(x) - v.AddArg(v0) + d := v_0.AuxInt + v.reset(OpAMD64MOVQconst) + v.AuxInt = int64(int16(d)) >> uint64(c) return true } - // match: (SETEQ (TESTL z1:(SHLLconst [31] (SHRQconst [31] x)) z2)) - // cond: z1==z2 - // result: (SETAE (BTQconst [31] x)) + return false +} +func rewriteValueAMD64_OpAMD64SBBLcarrymask_0(v *Value) bool { + // match: (SBBLcarrymask (FlagEQ)) + // result: (MOVLconst [0]) for { v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTL { - break - } - z2 := v_0.Args[1] - z1 := v_0.Args[0] - if z1.Op != OpAMD64SHLLconst || z1.AuxInt != 31 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 31 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { + if v_0.Op != OpAMD64FlagEQ { break } - v.reset(OpAMD64SETAE) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 31 - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpAMD64MOVLconst) + v.AuxInt = 0 return true } - // match: (SETEQ (TESTL z2 z1:(SHLLconst [31] (SHRQconst [31] x)))) - // cond: z1==z2 - // result: (SETAE (BTQconst [31] x)) + // match: (SBBLcarrymask (FlagLT_ULT)) + // result: (MOVLconst [-1]) for { v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTL { - break - } - _ = v_0.Args[1] - z2 := v_0.Args[0] - z1 := v_0.Args[1] - if z1.Op != OpAMD64SHLLconst || z1.AuxInt != 31 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 31 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { + if v_0.Op != OpAMD64FlagLT_ULT { break } - v.reset(OpAMD64SETAE) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 31 - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpAMD64MOVLconst) + v.AuxInt = -1 return true } - // match: (SETEQ (TESTQ z1:(SHRQconst [63] (SHLQconst [63] x)) z2)) - // cond: z1==z2 - // result: (SETAE (BTQconst [0] x)) + // match: (SBBLcarrymask (FlagLT_UGT)) + // result: (MOVLconst [0]) for { v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTQ { - break - } - z2 := v_0.Args[1] - z1 := v_0.Args[0] - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLQconst || z1_0.AuxInt != 63 { + if v_0.Op != OpAMD64FlagLT_UGT { break } - x := z1_0.Args[0] - if !(z1 == z2) { + v.reset(OpAMD64MOVLconst) + v.AuxInt = 0 + return true + } + // match: (SBBLcarrymask (FlagGT_ULT)) + // result: (MOVLconst [-1]) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64FlagGT_ULT { break } - v.reset(OpAMD64SETAE) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 0 - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpAMD64MOVLconst) + v.AuxInt = -1 return true } - // match: (SETEQ (TESTQ z2 z1:(SHRQconst [63] (SHLQconst [63] x)))) - // cond: z1==z2 - // result: (SETAE (BTQconst [0] x)) + // match: (SBBLcarrymask (FlagGT_UGT)) + // result: (MOVLconst [0]) for { v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTQ { + if v_0.Op != OpAMD64FlagGT_UGT { break } - _ = v_0.Args[1] - z2 := v_0.Args[0] - z1 := v_0.Args[1] - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { + v.reset(OpAMD64MOVLconst) + v.AuxInt = 0 + return true + } + return false +} +func rewriteValueAMD64_OpAMD64SBBQ_0(v *Value) bool { + // match: (SBBQ x (MOVQconst [c]) borrow) + // cond: is32Bit(c) + // result: (SBBQconst x [c] borrow) + for { + borrow := v.Args[2] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64MOVQconst { break } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLQconst || z1_0.AuxInt != 63 { + c := v_1.AuxInt + if !(is32Bit(c)) { break } - x := z1_0.Args[0] - if !(z1 == z2) { + v.reset(OpAMD64SBBQconst) + v.AuxInt = c + v.AddArg(x) + v.AddArg(borrow) + return true + } + // match: (SBBQ x y (FlagEQ)) + // result: (SUBQborrow x y) + for { + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpAMD64FlagEQ { break } - v.reset(OpAMD64SETAE) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 0 - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpAMD64SUBQborrow) + v.AddArg(x) + v.AddArg(y) return true } - // match: (SETEQ (TESTL z1:(SHRLconst [31] (SHLLconst [31] x)) z2)) - // cond: z1==z2 - // result: (SETAE (BTLconst [0] x)) + return false +} +func rewriteValueAMD64_OpAMD64SBBQcarrymask_0(v *Value) bool { + // match: (SBBQcarrymask (FlagEQ)) + // result: (MOVQconst [0]) for { v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTL { - break - } - z2 := v_0.Args[1] - z1 := v_0.Args[0] - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { + if v_0.Op != OpAMD64FlagEQ { break } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLLconst || z1_0.AuxInt != 31 { + v.reset(OpAMD64MOVQconst) + v.AuxInt = 0 + return true + } + // match: (SBBQcarrymask (FlagLT_ULT)) + // result: (MOVQconst [-1]) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64FlagLT_ULT { break } - x := z1_0.Args[0] - if !(z1 == z2) { + v.reset(OpAMD64MOVQconst) + v.AuxInt = -1 + return true + } + // match: (SBBQcarrymask (FlagLT_UGT)) + // result: (MOVQconst [0]) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64FlagLT_UGT { break } - v.reset(OpAMD64SETAE) - v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 0 - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpAMD64MOVQconst) + v.AuxInt = 0 return true } - // match: (SETEQ (TESTL z2 z1:(SHRLconst [31] (SHLLconst [31] x)))) - // cond: z1==z2 - // result: (SETAE (BTLconst [0] x)) + // match: (SBBQcarrymask (FlagGT_ULT)) + // result: (MOVQconst [-1]) for { v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTL { + if v_0.Op != OpAMD64FlagGT_ULT { break } - _ = v_0.Args[1] - z2 := v_0.Args[0] - z1 := v_0.Args[1] - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { + v.reset(OpAMD64MOVQconst) + v.AuxInt = -1 + return true + } + // match: (SBBQcarrymask (FlagGT_UGT)) + // result: (MOVQconst [0]) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64FlagGT_UGT { break } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLLconst || z1_0.AuxInt != 31 { + v.reset(OpAMD64MOVQconst) + v.AuxInt = 0 + return true + } + return false +} +func rewriteValueAMD64_OpAMD64SBBQconst_0(v *Value) bool { + // match: (SBBQconst x [c] (FlagEQ)) + // result: (SUBQconstborrow x [c]) + for { + c := v.AuxInt + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64FlagEQ { break } - x := z1_0.Args[0] - if !(z1 == z2) { + v.reset(OpAMD64SUBQconstborrow) + v.AuxInt = c + v.AddArg(x) + return true + } + return false +} +func rewriteValueAMD64_OpAMD64SETA_0(v *Value) bool { + // match: (SETA (InvertFlags x)) + // result: (SETB x) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64InvertFlags { break } - v.reset(OpAMD64SETAE) - v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 0 - v0.AddArg(x) - v.AddArg(v0) + x := v_0.Args[0] + v.reset(OpAMD64SETB) + v.AddArg(x) return true } - // match: (SETEQ (TESTQ z1:(SHRQconst [63] x) z2)) - // cond: z1==z2 - // result: (SETAE (BTQconst [63] x)) + // match: (SETA (FlagEQ)) + // result: (MOVLconst [0]) for { v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTQ { - break - } - z2 := v_0.Args[1] - z1 := v_0.Args[0] - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { - break - } - x := z1.Args[0] - if !(z1 == z2) { + if v_0.Op != OpAMD64FlagEQ { break } - v.reset(OpAMD64SETAE) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpAMD64MOVLconst) + v.AuxInt = 0 return true } - // match: (SETEQ (TESTQ z2 z1:(SHRQconst [63] x))) - // cond: z1==z2 - // result: (SETAE (BTQconst [63] x)) + // match: (SETA (FlagLT_ULT)) + // result: (MOVLconst [0]) for { v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTQ { - break - } - _ = v_0.Args[1] - z2 := v_0.Args[0] - z1 := v_0.Args[1] - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { - break - } - x := z1.Args[0] - if !(z1 == z2) { + if v_0.Op != OpAMD64FlagLT_ULT { break } - v.reset(OpAMD64SETAE) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpAMD64MOVLconst) + v.AuxInt = 0 return true } - return false -} -func rewriteValueAMD64_OpAMD64SETEQ_20(v *Value) bool { - b := v.Block - // match: (SETEQ (TESTL z1:(SHRLconst [31] x) z2)) - // cond: z1==z2 - // result: (SETAE (BTLconst [31] x)) + // match: (SETA (FlagLT_UGT)) + // result: (MOVLconst [1]) for { v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTL { - break - } - z2 := v_0.Args[1] - z1 := v_0.Args[0] - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { - break - } - x := z1.Args[0] - if !(z1 == z2) { + if v_0.Op != OpAMD64FlagLT_UGT { break } - v.reset(OpAMD64SETAE) - v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 31 - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpAMD64MOVLconst) + v.AuxInt = 1 return true } - // match: (SETEQ (TESTL z2 z1:(SHRLconst [31] x))) - // cond: z1==z2 - // result: (SETAE (BTLconst [31] x)) + // match: (SETA (FlagGT_ULT)) + // result: (MOVLconst [0]) for { v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTL { - break - } - _ = v_0.Args[1] - z2 := v_0.Args[0] - z1 := v_0.Args[1] - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { + if v_0.Op != OpAMD64FlagGT_ULT { break } - x := z1.Args[0] - if !(z1 == z2) { + v.reset(OpAMD64MOVLconst) + v.AuxInt = 0 + return true + } + // match: (SETA (FlagGT_UGT)) + // result: (MOVLconst [1]) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64FlagGT_UGT { break } - v.reset(OpAMD64SETAE) - v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 31 - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpAMD64MOVLconst) + v.AuxInt = 1 return true } - // match: (SETEQ (InvertFlags x)) - // result: (SETEQ x) + return false +} +func rewriteValueAMD64_OpAMD64SETAE_0(v *Value) bool { + // match: (SETAE (InvertFlags x)) + // result: (SETBE x) for { v_0 := v.Args[0] if v_0.Op != OpAMD64InvertFlags { break } x := v_0.Args[0] - v.reset(OpAMD64SETEQ) + v.reset(OpAMD64SETBE) v.AddArg(x) return true } - // match: (SETEQ (FlagEQ)) + // match: (SETAE (FlagEQ)) // result: (MOVLconst [1]) for { v_0 := v.Args[0] @@ -43070,7 +27548,7 @@ func rewriteValueAMD64_OpAMD64SETEQ_20(v *Value) bool { v.AuxInt = 1 return true } - // match: (SETEQ (FlagLT_ULT)) + // match: (SETAE (FlagLT_ULT)) // result: (MOVLconst [0]) for { v_0 := v.Args[0] @@ -43081,18 +27559,18 @@ func rewriteValueAMD64_OpAMD64SETEQ_20(v *Value) bool { v.AuxInt = 0 return true } - // match: (SETEQ (FlagLT_UGT)) - // result: (MOVLconst [0]) + // match: (SETAE (FlagLT_UGT)) + // result: (MOVLconst [1]) for { v_0 := v.Args[0] if v_0.Op != OpAMD64FlagLT_UGT { break } v.reset(OpAMD64MOVLconst) - v.AuxInt = 0 + v.AuxInt = 1 return true } - // match: (SETEQ (FlagGT_ULT)) + // match: (SETAE (FlagGT_ULT)) // result: (MOVLconst [0]) for { v_0 := v.Args[0] @@ -43103,1017 +27581,1246 @@ func rewriteValueAMD64_OpAMD64SETEQ_20(v *Value) bool { v.AuxInt = 0 return true } - // match: (SETEQ (FlagGT_UGT)) - // result: (MOVLconst [0]) + // match: (SETAE (FlagGT_UGT)) + // result: (MOVLconst [1]) for { v_0 := v.Args[0] if v_0.Op != OpAMD64FlagGT_UGT { break } v.reset(OpAMD64MOVLconst) - v.AuxInt = 0 + v.AuxInt = 1 return true } return false } -func rewriteValueAMD64_OpAMD64SETEQstore_0(v *Value) bool { +func rewriteValueAMD64_OpAMD64SETAEstore_0(v *Value) bool { b := v.Block - // match: (SETEQstore [off] {sym} ptr (TESTL (SHLL (MOVLconst [1]) x) y) mem) - // result: (SETAEstore [off] {sym} ptr (BTL x y) mem) + typ := &b.Func.Config.Types + // match: (SETAEstore [off] {sym} ptr (InvertFlags x) mem) + // result: (SETBEstore [off] {sym} ptr x mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTL { + if v_1.Op != OpAMD64InvertFlags { break } - y := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SHLL { + x := v_1.Args[0] + v.reset(OpAMD64SETBEstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(x) + v.AddArg(mem) + return true + } + // match: (SETAEstore [off1] {sym} (ADDQconst [off2] base) val mem) + // cond: is32Bit(off1+off2) + // result: (SETAEstore [off1+off2] {sym} base val mem) + for { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpAMD64ADDQconst { + break + } + off2 := v_0.AuxInt + base := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1 + off2)) { + break + } + v.reset(OpAMD64SETAEstore) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(base) + v.AddArg(val) + v.AddArg(mem) + return true + } + // match: (SETAEstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (SETAEstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) + for { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpAMD64LEAQ { break } - x := v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAMD64MOVLconst || v_1_0_0.AuxInt != 1 { + off2 := v_0.AuxInt + sym2 := v_0.Aux + base := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } v.reset(OpAMD64SETAEstore) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(base) + v.AddArg(val) + v.AddArg(mem) + return true + } + // match: (SETAEstore [off] {sym} ptr (FlagEQ) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64FlagEQ { + break + } + v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTL, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 1 v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETEQstore [off] {sym} ptr (TESTL y (SHLL (MOVLconst [1]) x)) mem) - // result: (SETAEstore [off] {sym} ptr (BTL x y) mem) + // match: (SETAEstore [off] {sym} ptr (FlagLT_ULT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTL { - break - } - _ = v_1.Args[1] - y := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64SHLL { - break - } - x := v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64MOVLconst || v_1_1_0.AuxInt != 1 { + if v_1.Op != OpAMD64FlagLT_ULT { break } - v.reset(OpAMD64SETAEstore) + v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTL, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 0 v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETEQstore [off] {sym} ptr (TESTQ (SHLQ (MOVQconst [1]) x) y) mem) - // result: (SETAEstore [off] {sym} ptr (BTQ x y) mem) + // match: (SETAEstore [off] {sym} ptr (FlagLT_UGT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTQ { + if v_1.Op != OpAMD64FlagLT_UGT { break } - y := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SHLQ { + v.reset(OpAMD64MOVBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 1 + v.AddArg(v0) + v.AddArg(mem) + return true + } + // match: (SETAEstore [off] {sym} ptr (FlagGT_ULT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64FlagGT_ULT { break } - x := v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAMD64MOVQconst || v_1_0_0.AuxInt != 1 { + v.reset(OpAMD64MOVBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 0 + v.AddArg(v0) + v.AddArg(mem) + return true + } + // match: (SETAEstore [off] {sym} ptr (FlagGT_UGT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64FlagGT_UGT { break } - v.reset(OpAMD64SETAEstore) + v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTQ, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 1 v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETEQstore [off] {sym} ptr (TESTQ y (SHLQ (MOVQconst [1]) x)) mem) - // result: (SETAEstore [off] {sym} ptr (BTQ x y) mem) + return false +} +func rewriteValueAMD64_OpAMD64SETAstore_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (SETAstore [off] {sym} ptr (InvertFlags x) mem) + // result: (SETBstore [off] {sym} ptr x mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTQ { + if v_1.Op != OpAMD64InvertFlags { break } - _ = v_1.Args[1] - y := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64SHLQ { + x := v_1.Args[0] + v.reset(OpAMD64SETBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(x) + v.AddArg(mem) + return true + } + // match: (SETAstore [off1] {sym} (ADDQconst [off2] base) val mem) + // cond: is32Bit(off1+off2) + // result: (SETAstore [off1+off2] {sym} base val mem) + for { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpAMD64ADDQconst { + break + } + off2 := v_0.AuxInt + base := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1 + off2)) { + break + } + v.reset(OpAMD64SETAstore) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(base) + v.AddArg(val) + v.AddArg(mem) + return true + } + // match: (SETAstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (SETAstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) + for { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpAMD64LEAQ { break } - x := v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64MOVQconst || v_1_1_0.AuxInt != 1 { + off2 := v_0.AuxInt + sym2 := v_0.Aux + base := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(OpAMD64SETAEstore) + v.reset(OpAMD64SETAstore) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(base) + v.AddArg(val) + v.AddArg(mem) + return true + } + // match: (SETAstore [off] {sym} ptr (FlagEQ) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64FlagEQ { + break + } + v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTQ, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 0 v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETEQstore [off] {sym} ptr (TESTLconst [c] x) mem) - // cond: isUint32PowerOfTwo(c) - // result: (SETAEstore [off] {sym} ptr (BTLconst [log2uint32(c)] x) mem) + // match: (SETAstore [off] {sym} ptr (FlagLT_ULT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTLconst { + if v_1.Op != OpAMD64FlagLT_ULT { break } - c := v_1.AuxInt - x := v_1.Args[0] - if !(isUint32PowerOfTwo(c)) { + v.reset(OpAMD64MOVBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 0 + v.AddArg(v0) + v.AddArg(mem) + return true + } + // match: (SETAstore [off] {sym} ptr (FlagLT_UGT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64FlagLT_UGT { break } - v.reset(OpAMD64SETAEstore) + v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = log2uint32(c) - v0.AddArg(x) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 1 v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETEQstore [off] {sym} ptr (TESTQconst [c] x) mem) - // cond: isUint64PowerOfTwo(c) - // result: (SETAEstore [off] {sym} ptr (BTQconst [log2(c)] x) mem) + // match: (SETAstore [off] {sym} ptr (FlagGT_ULT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTQconst { + if v_1.Op != OpAMD64FlagGT_ULT { break } - c := v_1.AuxInt - x := v_1.Args[0] - if !(isUint64PowerOfTwo(c)) { + v.reset(OpAMD64MOVBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 0 + v.AddArg(v0) + v.AddArg(mem) + return true + } + // match: (SETAstore [off] {sym} ptr (FlagGT_UGT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64FlagGT_UGT { break } - v.reset(OpAMD64SETAEstore) + v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = log2(c) - v0.AddArg(x) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 1 v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETEQstore [off] {sym} ptr (TESTQ (MOVQconst [c]) x) mem) - // cond: isUint64PowerOfTwo(c) - // result: (SETAEstore [off] {sym} ptr (BTQconst [log2(c)] x) mem) + return false +} +func rewriteValueAMD64_OpAMD64SETB_0(v *Value) bool { + // match: (SETB (InvertFlags x)) + // result: (SETA x) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64InvertFlags { + break + } + x := v_0.Args[0] + v.reset(OpAMD64SETA) + v.AddArg(x) + return true + } + // match: (SETB (FlagEQ)) + // result: (MOVLconst [0]) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64FlagEQ { + break + } + v.reset(OpAMD64MOVLconst) + v.AuxInt = 0 + return true + } + // match: (SETB (FlagLT_ULT)) + // result: (MOVLconst [1]) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64FlagLT_ULT { + break + } + v.reset(OpAMD64MOVLconst) + v.AuxInt = 1 + return true + } + // match: (SETB (FlagLT_UGT)) + // result: (MOVLconst [0]) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64FlagLT_UGT { + break + } + v.reset(OpAMD64MOVLconst) + v.AuxInt = 0 + return true + } + // match: (SETB (FlagGT_ULT)) + // result: (MOVLconst [1]) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64FlagGT_ULT { + break + } + v.reset(OpAMD64MOVLconst) + v.AuxInt = 1 + return true + } + // match: (SETB (FlagGT_UGT)) + // result: (MOVLconst [0]) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64FlagGT_UGT { + break + } + v.reset(OpAMD64MOVLconst) + v.AuxInt = 0 + return true + } + return false +} +func rewriteValueAMD64_OpAMD64SETBE_0(v *Value) bool { + // match: (SETBE (InvertFlags x)) + // result: (SETAE x) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64InvertFlags { + break + } + x := v_0.Args[0] + v.reset(OpAMD64SETAE) + v.AddArg(x) + return true + } + // match: (SETBE (FlagEQ)) + // result: (MOVLconst [1]) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64FlagEQ { + break + } + v.reset(OpAMD64MOVLconst) + v.AuxInt = 1 + return true + } + // match: (SETBE (FlagLT_ULT)) + // result: (MOVLconst [1]) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64FlagLT_ULT { + break + } + v.reset(OpAMD64MOVLconst) + v.AuxInt = 1 + return true + } + // match: (SETBE (FlagLT_UGT)) + // result: (MOVLconst [0]) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTQ { + v_0 := v.Args[0] + if v_0.Op != OpAMD64FlagLT_UGT { break } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64MOVQconst { + v.reset(OpAMD64MOVLconst) + v.AuxInt = 0 + return true + } + // match: (SETBE (FlagGT_ULT)) + // result: (MOVLconst [1]) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64FlagGT_ULT { break } - c := v_1_0.AuxInt - if !(isUint64PowerOfTwo(c)) { + v.reset(OpAMD64MOVLconst) + v.AuxInt = 1 + return true + } + // match: (SETBE (FlagGT_UGT)) + // result: (MOVLconst [0]) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64FlagGT_UGT { break } - v.reset(OpAMD64SETAEstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = log2(c) - v0.AddArg(x) - v.AddArg(v0) - v.AddArg(mem) + v.reset(OpAMD64MOVLconst) + v.AuxInt = 0 return true } - // match: (SETEQstore [off] {sym} ptr (TESTQ x (MOVQconst [c])) mem) - // cond: isUint64PowerOfTwo(c) - // result: (SETAEstore [off] {sym} ptr (BTQconst [log2(c)] x) mem) + return false +} +func rewriteValueAMD64_OpAMD64SETBEstore_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (SETBEstore [off] {sym} ptr (InvertFlags x) mem) + // result: (SETAEstore [off] {sym} ptr x mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTQ { + if v_1.Op != OpAMD64InvertFlags { break } - _ = v_1.Args[1] x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64MOVQconst { - break - } - c := v_1_1.AuxInt - if !(isUint64PowerOfTwo(c)) { - break - } v.reset(OpAMD64SETAEstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = log2(c) - v0.AddArg(x) - v.AddArg(v0) + v.AddArg(x) v.AddArg(mem) return true } - // match: (SETEQstore [off] {sym} ptr (CMPLconst [1] s:(ANDLconst [1] _)) mem) - // result: (SETNEstore [off] {sym} ptr (CMPLconst [0] s) mem) + // match: (SETBEstore [off1] {sym} (ADDQconst [off2] base) val mem) + // cond: is32Bit(off1+off2) + // result: (SETBEstore [off1+off2] {sym} base val mem) for { - off := v.AuxInt + off1 := v.AuxInt sym := v.Aux mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64CMPLconst || v_1.AuxInt != 1 { + v_0 := v.Args[0] + if v_0.Op != OpAMD64ADDQconst { break } - s := v_1.Args[0] - if s.Op != OpAMD64ANDLconst || s.AuxInt != 1 { + off2 := v_0.AuxInt + base := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1 + off2)) { break } - v.reset(OpAMD64SETNEstore) - v.AuxInt = off + v.reset(OpAMD64SETBEstore) + v.AuxInt = off1 + off2 v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64CMPLconst, types.TypeFlags) - v0.AuxInt = 0 - v0.AddArg(s) - v.AddArg(v0) + v.AddArg(base) + v.AddArg(val) v.AddArg(mem) return true } - // match: (SETEQstore [off] {sym} ptr (CMPQconst [1] s:(ANDQconst [1] _)) mem) - // result: (SETNEstore [off] {sym} ptr (CMPQconst [0] s) mem) + // match: (SETBEstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (SETBEstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) for { - off := v.AuxInt - sym := v.Aux + off1 := v.AuxInt + sym1 := v.Aux mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64CMPQconst || v_1.AuxInt != 1 { + v_0 := v.Args[0] + if v_0.Op != OpAMD64LEAQ { break } - s := v_1.Args[0] - if s.Op != OpAMD64ANDQconst || s.AuxInt != 1 { + off2 := v_0.AuxInt + sym2 := v_0.Aux + base := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(OpAMD64SETNEstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64CMPQconst, types.TypeFlags) - v0.AuxInt = 0 - v0.AddArg(s) - v.AddArg(v0) + v.reset(OpAMD64SETBEstore) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(base) + v.AddArg(val) v.AddArg(mem) return true } - return false -} -func rewriteValueAMD64_OpAMD64SETEQstore_10(v *Value) bool { - b := v.Block - // match: (SETEQstore [off] {sym} ptr (TESTQ z1:(SHLQconst [63] (SHRQconst [63] x)) z2) mem) - // cond: z1==z2 - // result: (SETAEstore [off] {sym} ptr (BTQconst [63] x) mem) + // match: (SETBEstore [off] {sym} ptr (FlagEQ) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTQ { - break - } - z2 := v_1.Args[1] - z1 := v_1.Args[0] - if z1.Op != OpAMD64SHLQconst || z1.AuxInt != 63 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 63 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { + if v_1.Op != OpAMD64FlagEQ { break } - v.reset(OpAMD64SETAEstore) + v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 - v0.AddArg(x) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 1 v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETEQstore [off] {sym} ptr (TESTQ z2 z1:(SHLQconst [63] (SHRQconst [63] x))) mem) - // cond: z1==z2 - // result: (SETAEstore [off] {sym} ptr (BTQconst [63] x) mem) + // match: (SETBEstore [off] {sym} ptr (FlagLT_ULT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTQ { - break - } - _ = v_1.Args[1] - z2 := v_1.Args[0] - z1 := v_1.Args[1] - if z1.Op != OpAMD64SHLQconst || z1.AuxInt != 63 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 63 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { + if v_1.Op != OpAMD64FlagLT_ULT { break } - v.reset(OpAMD64SETAEstore) + v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 - v0.AddArg(x) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 1 v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETEQstore [off] {sym} ptr (TESTL z1:(SHLLconst [31] (SHRLconst [31] x)) z2) mem) - // cond: z1==z2 - // result: (SETAEstore [off] {sym} ptr (BTLconst [31] x) mem) + // match: (SETBEstore [off] {sym} ptr (FlagLT_UGT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTL { - break - } - z2 := v_1.Args[1] - z1 := v_1.Args[0] - if z1.Op != OpAMD64SHLLconst || z1.AuxInt != 31 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRLconst || z1_0.AuxInt != 31 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { + if v_1.Op != OpAMD64FlagLT_UGT { break } - v.reset(OpAMD64SETAEstore) + v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 31 - v0.AddArg(x) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 0 v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETEQstore [off] {sym} ptr (TESTL z2 z1:(SHLLconst [31] (SHRLconst [31] x))) mem) - // cond: z1==z2 - // result: (SETAEstore [off] {sym} ptr (BTLconst [31] x) mem) + // match: (SETBEstore [off] {sym} ptr (FlagGT_ULT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTL { - break - } - _ = v_1.Args[1] - z2 := v_1.Args[0] - z1 := v_1.Args[1] - if z1.Op != OpAMD64SHLLconst || z1.AuxInt != 31 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRLconst || z1_0.AuxInt != 31 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { + if v_1.Op != OpAMD64FlagGT_ULT { break } - v.reset(OpAMD64SETAEstore) + v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 31 - v0.AddArg(x) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 1 v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETEQstore [off] {sym} ptr (TESTQ z1:(SHRQconst [63] (SHLQconst [63] x)) z2) mem) - // cond: z1==z2 - // result: (SETAEstore [off] {sym} ptr (BTQconst [0] x) mem) + // match: (SETBEstore [off] {sym} ptr (FlagGT_UGT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTQ { - break - } - z2 := v_1.Args[1] - z1 := v_1.Args[0] - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLQconst || z1_0.AuxInt != 63 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { + if v_1.Op != OpAMD64FlagGT_UGT { break } - v.reset(OpAMD64SETAEstore) + v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) v0.AuxInt = 0 - v0.AddArg(x) v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETEQstore [off] {sym} ptr (TESTQ z2 z1:(SHRQconst [63] (SHLQconst [63] x))) mem) - // cond: z1==z2 - // result: (SETAEstore [off] {sym} ptr (BTQconst [0] x) mem) + return false +} +func rewriteValueAMD64_OpAMD64SETBstore_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (SETBstore [off] {sym} ptr (InvertFlags x) mem) + // result: (SETAstore [off] {sym} ptr x mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTQ { - break - } - _ = v_1.Args[1] - z2 := v_1.Args[0] - z1 := v_1.Args[1] - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLQconst || z1_0.AuxInt != 63 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { + if v_1.Op != OpAMD64InvertFlags { break } - v.reset(OpAMD64SETAEstore) + x := v_1.Args[0] + v.reset(OpAMD64SETAstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 0 - v0.AddArg(x) - v.AddArg(v0) + v.AddArg(x) v.AddArg(mem) return true } - // match: (SETEQstore [off] {sym} ptr (TESTL z1:(SHRLconst [31] (SHLLconst [31] x)) z2) mem) - // cond: z1==z2 - // result: (SETAEstore [off] {sym} ptr (BTLconst [0] x) mem) + // match: (SETBstore [off1] {sym} (ADDQconst [off2] base) val mem) + // cond: is32Bit(off1+off2) + // result: (SETBstore [off1+off2] {sym} base val mem) for { - off := v.AuxInt + off1 := v.AuxInt sym := v.Aux mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTL { - break - } - z2 := v_1.Args[1] - z1 := v_1.Args[0] - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLLconst || z1_0.AuxInt != 31 { + v_0 := v.Args[0] + if v_0.Op != OpAMD64ADDQconst { break } - x := z1_0.Args[0] - if !(z1 == z2) { + off2 := v_0.AuxInt + base := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1 + off2)) { break } - v.reset(OpAMD64SETAEstore) - v.AuxInt = off + v.reset(OpAMD64SETBstore) + v.AuxInt = off1 + off2 v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 0 - v0.AddArg(x) - v.AddArg(v0) + v.AddArg(base) + v.AddArg(val) v.AddArg(mem) return true } - // match: (SETEQstore [off] {sym} ptr (TESTL z2 z1:(SHRLconst [31] (SHLLconst [31] x))) mem) - // cond: z1==z2 - // result: (SETAEstore [off] {sym} ptr (BTLconst [0] x) mem) + // match: (SETBstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (SETBstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) for { - off := v.AuxInt - sym := v.Aux + off1 := v.AuxInt + sym1 := v.Aux mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTL { - break - } - _ = v_1.Args[1] - z2 := v_1.Args[0] - z1 := v_1.Args[1] - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLLconst || z1_0.AuxInt != 31 { + v_0 := v.Args[0] + if v_0.Op != OpAMD64LEAQ { break } - x := z1_0.Args[0] - if !(z1 == z2) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + base := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(OpAMD64SETAEstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 0 - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpAMD64SETBstore) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(base) + v.AddArg(val) v.AddArg(mem) return true } - // match: (SETEQstore [off] {sym} ptr (TESTQ z1:(SHRQconst [63] x) z2) mem) - // cond: z1==z2 - // result: (SETAEstore [off] {sym} ptr (BTQconst [63] x) mem) + // match: (SETBstore [off] {sym} ptr (FlagEQ) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTQ { - break - } - z2 := v_1.Args[1] - z1 := v_1.Args[0] - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { - break - } - x := z1.Args[0] - if !(z1 == z2) { + if v_1.Op != OpAMD64FlagEQ { break } - v.reset(OpAMD64SETAEstore) + v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 - v0.AddArg(x) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 0 v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETEQstore [off] {sym} ptr (TESTQ z2 z1:(SHRQconst [63] x)) mem) - // cond: z1==z2 - // result: (SETAEstore [off] {sym} ptr (BTQconst [63] x) mem) + // match: (SETBstore [off] {sym} ptr (FlagLT_ULT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTQ { - break - } - _ = v_1.Args[1] - z2 := v_1.Args[0] - z1 := v_1.Args[1] - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { - break - } - x := z1.Args[0] - if !(z1 == z2) { + if v_1.Op != OpAMD64FlagLT_ULT { break } - v.reset(OpAMD64SETAEstore) + v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 - v0.AddArg(x) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 1 v.AddArg(v0) v.AddArg(mem) return true } - return false -} -func rewriteValueAMD64_OpAMD64SETEQstore_20(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (SETEQstore [off] {sym} ptr (TESTL z1:(SHRLconst [31] x) z2) mem) - // cond: z1==z2 - // result: (SETAEstore [off] {sym} ptr (BTLconst [31] x) mem) + // match: (SETBstore [off] {sym} ptr (FlagLT_UGT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTL { - break - } - z2 := v_1.Args[1] - z1 := v_1.Args[0] - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { - break - } - x := z1.Args[0] - if !(z1 == z2) { + if v_1.Op != OpAMD64FlagLT_UGT { break } - v.reset(OpAMD64SETAEstore) + v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 31 - v0.AddArg(x) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 0 v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETEQstore [off] {sym} ptr (TESTL z2 z1:(SHRLconst [31] x)) mem) - // cond: z1==z2 - // result: (SETAEstore [off] {sym} ptr (BTLconst [31] x) mem) + // match: (SETBstore [off] {sym} ptr (FlagGT_ULT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTL { - break - } - _ = v_1.Args[1] - z2 := v_1.Args[0] - z1 := v_1.Args[1] - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { - break - } - x := z1.Args[0] - if !(z1 == z2) { + if v_1.Op != OpAMD64FlagGT_ULT { break } - v.reset(OpAMD64SETAEstore) + v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 31 - v0.AddArg(x) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 1 v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETEQstore [off] {sym} ptr (InvertFlags x) mem) - // result: (SETEQstore [off] {sym} ptr x mem) + // match: (SETBstore [off] {sym} ptr (FlagGT_UGT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64InvertFlags { + if v_1.Op != OpAMD64FlagGT_UGT { break } - x := v_1.Args[0] - v.reset(OpAMD64SETEQstore) + v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 0 + v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETEQstore [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) - // result: (SETEQstore [off1+off2] {sym} base val mem) + return false +} +func rewriteValueAMD64_OpAMD64SETEQ_0(v *Value) bool { + b := v.Block + // match: (SETEQ (TESTL (SHLL (MOVLconst [1]) x) y)) + // result: (SETAE (BTL x y)) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQconst { + if v_0.Op != OpAMD64TESTL { break } - off2 := v_0.AuxInt - base := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1 + off2)) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpAMD64SHLL { + continue + } + x := v_0_0.Args[1] + v_0_0_0 := v_0_0.Args[0] + if v_0_0_0.Op != OpAMD64MOVLconst || v_0_0_0.AuxInt != 1 { + continue + } + y := v_0.Args[1^_i0] + v.reset(OpAMD64SETAE) + v0 := b.NewValue0(v.Pos, OpAMD64BTL, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + v.AddArg(v0) + return true } - v.reset(OpAMD64SETEQstore) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(base) - v.AddArg(val) - v.AddArg(mem) - return true + break } - // match: (SETEQstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (SETEQstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) + // match: (SETEQ (TESTQ (SHLQ (MOVQconst [1]) x) y)) + // result: (SETAE (BTQ x y)) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpAMD64LEAQ { + if v_0.Op != OpAMD64TESTQ { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - base := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpAMD64SHLQ { + continue + } + x := v_0_0.Args[1] + v_0_0_0 := v_0_0.Args[0] + if v_0_0_0.Op != OpAMD64MOVQconst || v_0_0_0.AuxInt != 1 { + continue + } + y := v_0.Args[1^_i0] + v.reset(OpAMD64SETAE) + v0 := b.NewValue0(v.Pos, OpAMD64BTQ, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + v.AddArg(v0) + return true } - v.reset(OpAMD64SETEQstore) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(base) - v.AddArg(val) - v.AddArg(mem) - return true + break } - // match: (SETEQstore [off] {sym} ptr (FlagEQ) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) + // match: (SETEQ (TESTLconst [c] x)) + // cond: isUint32PowerOfTwo(c) + // result: (SETAE (BTLconst [log2uint32(c)] x)) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagEQ { + v_0 := v.Args[0] + if v_0.Op != OpAMD64TESTLconst { break } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 1 + c := v_0.AuxInt + x := v_0.Args[0] + if !(isUint32PowerOfTwo(c)) { + break + } + v.reset(OpAMD64SETAE) + v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) + v0.AuxInt = log2uint32(c) + v0.AddArg(x) v.AddArg(v0) - v.AddArg(mem) return true } - // match: (SETEQstore [off] {sym} ptr (FlagLT_ULT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) + // match: (SETEQ (TESTQconst [c] x)) + // cond: isUint64PowerOfTwo(c) + // result: (SETAE (BTQconst [log2(c)] x)) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagLT_ULT { + v_0 := v.Args[0] + if v_0.Op != OpAMD64TESTQconst { break } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 0 + c := v_0.AuxInt + x := v_0.Args[0] + if !(isUint64PowerOfTwo(c)) { + break + } + v.reset(OpAMD64SETAE) + v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = log2(c) + v0.AddArg(x) v.AddArg(v0) - v.AddArg(mem) return true } - // match: (SETEQstore [off] {sym} ptr (FlagLT_UGT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) + // match: (SETEQ (TESTQ (MOVQconst [c]) x)) + // cond: isUint64PowerOfTwo(c) + // result: (SETAE (BTQconst [log2(c)] x)) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagLT_UGT { + v_0 := v.Args[0] + if v_0.Op != OpAMD64TESTQ { break } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 0 - v.AddArg(v0) - v.AddArg(mem) - return true + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpAMD64MOVQconst { + continue + } + c := v_0_0.AuxInt + x := v_0.Args[1^_i0] + if !(isUint64PowerOfTwo(c)) { + continue + } + v.reset(OpAMD64SETAE) + v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = log2(c) + v0.AddArg(x) + v.AddArg(v0) + return true + } + break } - // match: (SETEQstore [off] {sym} ptr (FlagGT_ULT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) + // match: (SETEQ (CMPLconst [1] s:(ANDLconst [1] _))) + // result: (SETNE (CMPLconst [0] s)) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagGT_ULT { + v_0 := v.Args[0] + if v_0.Op != OpAMD64CMPLconst || v_0.AuxInt != 1 { break } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + s := v_0.Args[0] + if s.Op != OpAMD64ANDLconst || s.AuxInt != 1 { + break + } + v.reset(OpAMD64SETNE) + v0 := b.NewValue0(v.Pos, OpAMD64CMPLconst, types.TypeFlags) v0.AuxInt = 0 + v0.AddArg(s) v.AddArg(v0) - v.AddArg(mem) return true } - // match: (SETEQstore [off] {sym} ptr (FlagGT_UGT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) + // match: (SETEQ (CMPQconst [1] s:(ANDQconst [1] _))) + // result: (SETNE (CMPQconst [0] s)) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagGT_UGT { + v_0 := v.Args[0] + if v_0.Op != OpAMD64CMPQconst || v_0.AuxInt != 1 { break } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + s := v_0.Args[0] + if s.Op != OpAMD64ANDQconst || s.AuxInt != 1 { + break + } + v.reset(OpAMD64SETNE) + v0 := b.NewValue0(v.Pos, OpAMD64CMPQconst, types.TypeFlags) v0.AuxInt = 0 + v0.AddArg(s) v.AddArg(v0) - v.AddArg(mem) return true } - return false -} -func rewriteValueAMD64_OpAMD64SETG_0(v *Value) bool { - // match: (SETG (InvertFlags x)) - // result: (SETL x) + // match: (SETEQ (TESTQ z1:(SHLQconst [63] (SHRQconst [63] x)) z2)) + // cond: z1==z2 + // result: (SETAE (BTQconst [63] x)) for { v_0 := v.Args[0] - if v_0.Op != OpAMD64InvertFlags { + if v_0.Op != OpAMD64TESTQ { break } - x := v_0.Args[0] - v.reset(OpAMD64SETL) - v.AddArg(x) - return true + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_0.Args[_i0] + if z1.Op != OpAMD64SHLQconst || z1.AuxInt != 63 { + continue + } + z1_0 := z1.Args[0] + if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 63 { + continue + } + x := z1_0.Args[0] + z2 := v_0.Args[1^_i0] + if !(z1 == z2) { + continue + } + v.reset(OpAMD64SETAE) + v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = 63 + v0.AddArg(x) + v.AddArg(v0) + return true + } + break } - // match: (SETG (FlagEQ)) - // result: (MOVLconst [0]) + // match: (SETEQ (TESTL z1:(SHLLconst [31] (SHRQconst [31] x)) z2)) + // cond: z1==z2 + // result: (SETAE (BTQconst [31] x)) for { v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagEQ { + if v_0.Op != OpAMD64TESTL { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 0 - return true + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_0.Args[_i0] + if z1.Op != OpAMD64SHLLconst || z1.AuxInt != 31 { + continue + } + z1_0 := z1.Args[0] + if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 31 { + continue + } + x := z1_0.Args[0] + z2 := v_0.Args[1^_i0] + if !(z1 == z2) { + continue + } + v.reset(OpAMD64SETAE) + v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = 31 + v0.AddArg(x) + v.AddArg(v0) + return true + } + break } - // match: (SETG (FlagLT_ULT)) - // result: (MOVLconst [0]) + // match: (SETEQ (TESTQ z1:(SHRQconst [63] (SHLQconst [63] x)) z2)) + // cond: z1==z2 + // result: (SETAE (BTQconst [0] x)) for { v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagLT_ULT { + if v_0.Op != OpAMD64TESTQ { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 0 - return true + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_0.Args[_i0] + if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { + continue + } + z1_0 := z1.Args[0] + if z1_0.Op != OpAMD64SHLQconst || z1_0.AuxInt != 63 { + continue + } + x := z1_0.Args[0] + z2 := v_0.Args[1^_i0] + if !(z1 == z2) { + continue + } + v.reset(OpAMD64SETAE) + v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = 0 + v0.AddArg(x) + v.AddArg(v0) + return true + } + break } - // match: (SETG (FlagLT_UGT)) - // result: (MOVLconst [0]) + return false +} +func rewriteValueAMD64_OpAMD64SETEQ_10(v *Value) bool { + b := v.Block + // match: (SETEQ (TESTL z1:(SHRLconst [31] (SHLLconst [31] x)) z2)) + // cond: z1==z2 + // result: (SETAE (BTLconst [0] x)) for { v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagLT_UGT { + if v_0.Op != OpAMD64TESTL { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 0 - return true + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_0.Args[_i0] + if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { + continue + } + z1_0 := z1.Args[0] + if z1_0.Op != OpAMD64SHLLconst || z1_0.AuxInt != 31 { + continue + } + x := z1_0.Args[0] + z2 := v_0.Args[1^_i0] + if !(z1 == z2) { + continue + } + v.reset(OpAMD64SETAE) + v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) + v0.AuxInt = 0 + v0.AddArg(x) + v.AddArg(v0) + return true + } + break } - // match: (SETG (FlagGT_ULT)) - // result: (MOVLconst [1]) + // match: (SETEQ (TESTQ z1:(SHRQconst [63] x) z2)) + // cond: z1==z2 + // result: (SETAE (BTQconst [63] x)) for { v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagGT_ULT { + if v_0.Op != OpAMD64TESTQ { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 1 - return true + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_0.Args[_i0] + if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { + continue + } + x := z1.Args[0] + z2 := v_0.Args[1^_i0] + if !(z1 == z2) { + continue + } + v.reset(OpAMD64SETAE) + v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = 63 + v0.AddArg(x) + v.AddArg(v0) + return true + } + break } - // match: (SETG (FlagGT_UGT)) - // result: (MOVLconst [1]) + // match: (SETEQ (TESTL z1:(SHRLconst [31] x) z2)) + // cond: z1==z2 + // result: (SETAE (BTLconst [31] x)) for { v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagGT_UGT { + if v_0.Op != OpAMD64TESTL { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 1 - return true + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_0.Args[_i0] + if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { + continue + } + x := z1.Args[0] + z2 := v_0.Args[1^_i0] + if !(z1 == z2) { + continue + } + v.reset(OpAMD64SETAE) + v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) + v0.AuxInt = 31 + v0.AddArg(x) + v.AddArg(v0) + return true + } + break } - return false -} -func rewriteValueAMD64_OpAMD64SETGE_0(v *Value) bool { - // match: (SETGE (InvertFlags x)) - // result: (SETLE x) + // match: (SETEQ (InvertFlags x)) + // result: (SETEQ x) for { v_0 := v.Args[0] if v_0.Op != OpAMD64InvertFlags { break } x := v_0.Args[0] - v.reset(OpAMD64SETLE) + v.reset(OpAMD64SETEQ) v.AddArg(x) return true } - // match: (SETGE (FlagEQ)) + // match: (SETEQ (FlagEQ)) // result: (MOVLconst [1]) for { v_0 := v.Args[0] @@ -44124,7 +28831,7 @@ func rewriteValueAMD64_OpAMD64SETGE_0(v *Value) bool { v.AuxInt = 1 return true } - // match: (SETGE (FlagLT_ULT)) + // match: (SETEQ (FlagLT_ULT)) // result: (MOVLconst [0]) for { v_0 := v.Args[0] @@ -44135,7 +28842,7 @@ func rewriteValueAMD64_OpAMD64SETGE_0(v *Value) bool { v.AuxInt = 0 return true } - // match: (SETGE (FlagLT_UGT)) + // match: (SETEQ (FlagLT_UGT)) // result: (MOVLconst [0]) for { v_0 := v.Args[0] @@ -44146,216 +28853,487 @@ func rewriteValueAMD64_OpAMD64SETGE_0(v *Value) bool { v.AuxInt = 0 return true } - // match: (SETGE (FlagGT_ULT)) - // result: (MOVLconst [1]) + // match: (SETEQ (FlagGT_ULT)) + // result: (MOVLconst [0]) for { v_0 := v.Args[0] if v_0.Op != OpAMD64FlagGT_ULT { break } v.reset(OpAMD64MOVLconst) - v.AuxInt = 1 + v.AuxInt = 0 return true } - // match: (SETGE (FlagGT_UGT)) - // result: (MOVLconst [1]) + // match: (SETEQ (FlagGT_UGT)) + // result: (MOVLconst [0]) for { v_0 := v.Args[0] if v_0.Op != OpAMD64FlagGT_UGT { break } v.reset(OpAMD64MOVLconst) - v.AuxInt = 1 + v.AuxInt = 0 return true } return false } -func rewriteValueAMD64_OpAMD64SETGEstore_0(v *Value) bool { +func rewriteValueAMD64_OpAMD64SETEQstore_0(v *Value) bool { b := v.Block - typ := &b.Func.Config.Types - // match: (SETGEstore [off] {sym} ptr (InvertFlags x) mem) - // result: (SETLEstore [off] {sym} ptr x mem) + // match: (SETEQstore [off] {sym} ptr (TESTL (SHLL (MOVLconst [1]) x) y) mem) + // result: (SETAEstore [off] {sym} ptr (BTL x y) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64InvertFlags { + if v_1.Op != OpAMD64TESTL { + break + } + _ = v_1.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_1_0 := v_1.Args[_i0] + if v_1_0.Op != OpAMD64SHLL { + continue + } + x := v_1_0.Args[1] + v_1_0_0 := v_1_0.Args[0] + if v_1_0_0.Op != OpAMD64MOVLconst || v_1_0_0.AuxInt != 1 { + continue + } + y := v_1.Args[1^_i0] + v.reset(OpAMD64SETAEstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64BTL, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + v.AddArg(v0) + v.AddArg(mem) + return true + } + break + } + // match: (SETEQstore [off] {sym} ptr (TESTQ (SHLQ (MOVQconst [1]) x) y) mem) + // result: (SETAEstore [off] {sym} ptr (BTQ x y) mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64TESTQ { + break + } + _ = v_1.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_1_0 := v_1.Args[_i0] + if v_1_0.Op != OpAMD64SHLQ { + continue + } + x := v_1_0.Args[1] + v_1_0_0 := v_1_0.Args[0] + if v_1_0_0.Op != OpAMD64MOVQconst || v_1_0_0.AuxInt != 1 { + continue + } + y := v_1.Args[1^_i0] + v.reset(OpAMD64SETAEstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64BTQ, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + v.AddArg(v0) + v.AddArg(mem) + return true + } + break + } + // match: (SETEQstore [off] {sym} ptr (TESTLconst [c] x) mem) + // cond: isUint32PowerOfTwo(c) + // result: (SETAEstore [off] {sym} ptr (BTLconst [log2uint32(c)] x) mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64TESTLconst { break } + c := v_1.AuxInt x := v_1.Args[0] - v.reset(OpAMD64SETLEstore) + if !(isUint32PowerOfTwo(c)) { + break + } + v.reset(OpAMD64SETAEstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) + v0.AuxInt = log2uint32(c) + v0.AddArg(x) + v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETGEstore [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) - // result: (SETGEstore [off1+off2] {sym} base val mem) + // match: (SETEQstore [off] {sym} ptr (TESTQconst [c] x) mem) + // cond: isUint64PowerOfTwo(c) + // result: (SETAEstore [off] {sym} ptr (BTQconst [log2(c)] x) mem) for { - off1 := v.AuxInt + off := v.AuxInt sym := v.Aux mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64ADDQconst { + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64TESTQconst { break } - off2 := v_0.AuxInt - base := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1 + off2)) { + c := v_1.AuxInt + x := v_1.Args[0] + if !(isUint64PowerOfTwo(c)) { break } - v.reset(OpAMD64SETGEstore) - v.AuxInt = off1 + off2 + v.reset(OpAMD64SETAEstore) + v.AuxInt = off v.Aux = sym - v.AddArg(base) - v.AddArg(val) + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = log2(c) + v0.AddArg(x) + v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETGEstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (SETGEstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) + // match: (SETEQstore [off] {sym} ptr (TESTQ (MOVQconst [c]) x) mem) + // cond: isUint64PowerOfTwo(c) + // result: (SETAEstore [off] {sym} ptr (BTQconst [log2(c)] x) mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off := v.AuxInt + sym := v.Aux mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpAMD64LEAQ { + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64TESTQ { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - base := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + _ = v_1.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_1_0 := v_1.Args[_i0] + if v_1_0.Op != OpAMD64MOVQconst { + continue + } + c := v_1_0.AuxInt + x := v_1.Args[1^_i0] + if !(isUint64PowerOfTwo(c)) { + continue + } + v.reset(OpAMD64SETAEstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = log2(c) + v0.AddArg(x) + v.AddArg(v0) + v.AddArg(mem) + return true + } + break + } + // match: (SETEQstore [off] {sym} ptr (CMPLconst [1] s:(ANDLconst [1] _)) mem) + // result: (SETNEstore [off] {sym} ptr (CMPLconst [0] s) mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64CMPLconst || v_1.AuxInt != 1 { break } - v.reset(OpAMD64SETGEstore) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(base) - v.AddArg(val) + s := v_1.Args[0] + if s.Op != OpAMD64ANDLconst || s.AuxInt != 1 { + break + } + v.reset(OpAMD64SETNEstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64CMPLconst, types.TypeFlags) + v0.AuxInt = 0 + v0.AddArg(s) + v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETGEstore [off] {sym} ptr (FlagEQ) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) + // match: (SETEQstore [off] {sym} ptr (CMPQconst [1] s:(ANDQconst [1] _)) mem) + // result: (SETNEstore [off] {sym} ptr (CMPQconst [0] s) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagEQ { + if v_1.Op != OpAMD64CMPQconst || v_1.AuxInt != 1 { break } - v.reset(OpAMD64MOVBstore) + s := v_1.Args[0] + if s.Op != OpAMD64ANDQconst || s.AuxInt != 1 { + break + } + v.reset(OpAMD64SETNEstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 1 + v0 := b.NewValue0(v.Pos, OpAMD64CMPQconst, types.TypeFlags) + v0.AuxInt = 0 + v0.AddArg(s) v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETGEstore [off] {sym} ptr (FlagLT_ULT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) + // match: (SETEQstore [off] {sym} ptr (TESTQ z1:(SHLQconst [63] (SHRQconst [63] x)) z2) mem) + // cond: z1==z2 + // result: (SETAEstore [off] {sym} ptr (BTQconst [63] x) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagLT_ULT { + if v_1.Op != OpAMD64TESTQ { + break + } + _ = v_1.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_1.Args[_i0] + if z1.Op != OpAMD64SHLQconst || z1.AuxInt != 63 { + continue + } + z1_0 := z1.Args[0] + if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 63 { + continue + } + x := z1_0.Args[0] + z2 := v_1.Args[1^_i0] + if !(z1 == z2) { + continue + } + v.reset(OpAMD64SETAEstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = 63 + v0.AddArg(x) + v.AddArg(v0) + v.AddArg(mem) + return true + } + break + } + // match: (SETEQstore [off] {sym} ptr (TESTL z1:(SHLLconst [31] (SHRLconst [31] x)) z2) mem) + // cond: z1==z2 + // result: (SETAEstore [off] {sym} ptr (BTLconst [31] x) mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64TESTL { + break + } + _ = v_1.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_1.Args[_i0] + if z1.Op != OpAMD64SHLLconst || z1.AuxInt != 31 { + continue + } + z1_0 := z1.Args[0] + if z1_0.Op != OpAMD64SHRLconst || z1_0.AuxInt != 31 { + continue + } + x := z1_0.Args[0] + z2 := v_1.Args[1^_i0] + if !(z1 == z2) { + continue + } + v.reset(OpAMD64SETAEstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) + v0.AuxInt = 31 + v0.AddArg(x) + v.AddArg(v0) + v.AddArg(mem) + return true + } + break + } + // match: (SETEQstore [off] {sym} ptr (TESTQ z1:(SHRQconst [63] (SHLQconst [63] x)) z2) mem) + // cond: z1==z2 + // result: (SETAEstore [off] {sym} ptr (BTQconst [0] x) mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64TESTQ { break } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 0 - v.AddArg(v0) - v.AddArg(mem) - return true + _ = v_1.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_1.Args[_i0] + if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { + continue + } + z1_0 := z1.Args[0] + if z1_0.Op != OpAMD64SHLQconst || z1_0.AuxInt != 63 { + continue + } + x := z1_0.Args[0] + z2 := v_1.Args[1^_i0] + if !(z1 == z2) { + continue + } + v.reset(OpAMD64SETAEstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = 0 + v0.AddArg(x) + v.AddArg(v0) + v.AddArg(mem) + return true + } + break } - // match: (SETGEstore [off] {sym} ptr (FlagLT_UGT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) + return false +} +func rewriteValueAMD64_OpAMD64SETEQstore_10(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (SETEQstore [off] {sym} ptr (TESTL z1:(SHRLconst [31] (SHLLconst [31] x)) z2) mem) + // cond: z1==z2 + // result: (SETAEstore [off] {sym} ptr (BTLconst [0] x) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagLT_UGT { + if v_1.Op != OpAMD64TESTL { break } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 0 - v.AddArg(v0) - v.AddArg(mem) - return true + _ = v_1.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_1.Args[_i0] + if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { + continue + } + z1_0 := z1.Args[0] + if z1_0.Op != OpAMD64SHLLconst || z1_0.AuxInt != 31 { + continue + } + x := z1_0.Args[0] + z2 := v_1.Args[1^_i0] + if !(z1 == z2) { + continue + } + v.reset(OpAMD64SETAEstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) + v0.AuxInt = 0 + v0.AddArg(x) + v.AddArg(v0) + v.AddArg(mem) + return true + } + break } - // match: (SETGEstore [off] {sym} ptr (FlagGT_ULT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) + // match: (SETEQstore [off] {sym} ptr (TESTQ z1:(SHRQconst [63] x) z2) mem) + // cond: z1==z2 + // result: (SETAEstore [off] {sym} ptr (BTQconst [63] x) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagGT_ULT { + if v_1.Op != OpAMD64TESTQ { break } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 1 - v.AddArg(v0) - v.AddArg(mem) - return true + _ = v_1.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_1.Args[_i0] + if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { + continue + } + x := z1.Args[0] + z2 := v_1.Args[1^_i0] + if !(z1 == z2) { + continue + } + v.reset(OpAMD64SETAEstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = 63 + v0.AddArg(x) + v.AddArg(v0) + v.AddArg(mem) + return true + } + break } - // match: (SETGEstore [off] {sym} ptr (FlagGT_UGT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) + // match: (SETEQstore [off] {sym} ptr (TESTL z1:(SHRLconst [31] x) z2) mem) + // cond: z1==z2 + // result: (SETAEstore [off] {sym} ptr (BTLconst [31] x) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagGT_UGT { + if v_1.Op != OpAMD64TESTL { break } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 1 - v.AddArg(v0) - v.AddArg(mem) - return true + _ = v_1.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_1.Args[_i0] + if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { + continue + } + x := z1.Args[0] + z2 := v_1.Args[1^_i0] + if !(z1 == z2) { + continue + } + v.reset(OpAMD64SETAEstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) + v0.AuxInt = 31 + v0.AddArg(x) + v.AddArg(v0) + v.AddArg(mem) + return true + } + break } - return false -} -func rewriteValueAMD64_OpAMD64SETGstore_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (SETGstore [off] {sym} ptr (InvertFlags x) mem) - // result: (SETLstore [off] {sym} ptr x mem) + // match: (SETEQstore [off] {sym} ptr (InvertFlags x) mem) + // result: (SETEQstore [off] {sym} ptr x mem) for { off := v.AuxInt sym := v.Aux @@ -44366,7 +29344,7 @@ func rewriteValueAMD64_OpAMD64SETGstore_0(v *Value) bool { break } x := v_1.Args[0] - v.reset(OpAMD64SETLstore) + v.reset(OpAMD64SETEQstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) @@ -44374,9 +29352,9 @@ func rewriteValueAMD64_OpAMD64SETGstore_0(v *Value) bool { v.AddArg(mem) return true } - // match: (SETGstore [off1] {sym} (ADDQconst [off2] base) val mem) + // match: (SETEQstore [off1] {sym} (ADDQconst [off2] base) val mem) // cond: is32Bit(off1+off2) - // result: (SETGstore [off1+off2] {sym} base val mem) + // result: (SETEQstore [off1+off2] {sym} base val mem) for { off1 := v.AuxInt sym := v.Aux @@ -44391,7 +29369,7 @@ func rewriteValueAMD64_OpAMD64SETGstore_0(v *Value) bool { if !(is32Bit(off1 + off2)) { break } - v.reset(OpAMD64SETGstore) + v.reset(OpAMD64SETEQstore) v.AuxInt = off1 + off2 v.Aux = sym v.AddArg(base) @@ -44399,9 +29377,9 @@ func rewriteValueAMD64_OpAMD64SETGstore_0(v *Value) bool { v.AddArg(mem) return true } - // match: (SETGstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem) + // match: (SETEQstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem) // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (SETGstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) + // result: (SETEQstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) for { off1 := v.AuxInt sym1 := v.Aux @@ -44417,7 +29395,7 @@ func rewriteValueAMD64_OpAMD64SETGstore_0(v *Value) bool { if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(OpAMD64SETGstore) + v.reset(OpAMD64SETEQstore) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) v.AddArg(base) @@ -44425,8 +29403,8 @@ func rewriteValueAMD64_OpAMD64SETGstore_0(v *Value) bool { v.AddArg(mem) return true } - // match: (SETGstore [off] {sym} ptr (FlagEQ) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) + // match: (SETEQstore [off] {sym} ptr (FlagEQ) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) for { off := v.AuxInt sym := v.Aux @@ -44441,12 +29419,12 @@ func rewriteValueAMD64_OpAMD64SETGstore_0(v *Value) bool { v.Aux = sym v.AddArg(ptr) v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 0 + v0.AuxInt = 1 v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETGstore [off] {sym} ptr (FlagLT_ULT) mem) + // match: (SETEQstore [off] {sym} ptr (FlagLT_ULT) mem) // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) for { off := v.AuxInt @@ -44467,7 +29445,7 @@ func rewriteValueAMD64_OpAMD64SETGstore_0(v *Value) bool { v.AddArg(mem) return true } - // match: (SETGstore [off] {sym} ptr (FlagLT_UGT) mem) + // match: (SETEQstore [off] {sym} ptr (FlagLT_UGT) mem) // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) for { off := v.AuxInt @@ -44488,8 +29466,8 @@ func rewriteValueAMD64_OpAMD64SETGstore_0(v *Value) bool { v.AddArg(mem) return true } - // match: (SETGstore [off] {sym} ptr (FlagGT_ULT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) + // match: (SETEQstore [off] {sym} ptr (FlagGT_ULT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) for { off := v.AuxInt sym := v.Aux @@ -44504,13 +29482,18 @@ func rewriteValueAMD64_OpAMD64SETGstore_0(v *Value) bool { v.Aux = sym v.AddArg(ptr) v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 1 + v0.AuxInt = 0 v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETGstore [off] {sym} ptr (FlagGT_UGT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) + return false +} +func rewriteValueAMD64_OpAMD64SETEQstore_20(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (SETEQstore [off] {sym} ptr (FlagGT_UGT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) for { off := v.AuxInt sym := v.Aux @@ -44525,27 +29508,27 @@ func rewriteValueAMD64_OpAMD64SETGstore_0(v *Value) bool { v.Aux = sym v.AddArg(ptr) v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 1 + v0.AuxInt = 0 v.AddArg(v0) v.AddArg(mem) return true } return false } -func rewriteValueAMD64_OpAMD64SETL_0(v *Value) bool { - // match: (SETL (InvertFlags x)) - // result: (SETG x) +func rewriteValueAMD64_OpAMD64SETG_0(v *Value) bool { + // match: (SETG (InvertFlags x)) + // result: (SETL x) for { v_0 := v.Args[0] if v_0.Op != OpAMD64InvertFlags { break } x := v_0.Args[0] - v.reset(OpAMD64SETG) + v.reset(OpAMD64SETL) v.AddArg(x) return true } - // match: (SETL (FlagEQ)) + // match: (SETG (FlagEQ)) // result: (MOVLconst [0]) for { v_0 := v.Args[0] @@ -44556,66 +29539,66 @@ func rewriteValueAMD64_OpAMD64SETL_0(v *Value) bool { v.AuxInt = 0 return true } - // match: (SETL (FlagLT_ULT)) - // result: (MOVLconst [1]) + // match: (SETG (FlagLT_ULT)) + // result: (MOVLconst [0]) for { v_0 := v.Args[0] if v_0.Op != OpAMD64FlagLT_ULT { break } v.reset(OpAMD64MOVLconst) - v.AuxInt = 1 + v.AuxInt = 0 return true } - // match: (SETL (FlagLT_UGT)) - // result: (MOVLconst [1]) + // match: (SETG (FlagLT_UGT)) + // result: (MOVLconst [0]) for { v_0 := v.Args[0] if v_0.Op != OpAMD64FlagLT_UGT { break } v.reset(OpAMD64MOVLconst) - v.AuxInt = 1 + v.AuxInt = 0 return true } - // match: (SETL (FlagGT_ULT)) - // result: (MOVLconst [0]) + // match: (SETG (FlagGT_ULT)) + // result: (MOVLconst [1]) for { v_0 := v.Args[0] if v_0.Op != OpAMD64FlagGT_ULT { break } v.reset(OpAMD64MOVLconst) - v.AuxInt = 0 + v.AuxInt = 1 return true } - // match: (SETL (FlagGT_UGT)) - // result: (MOVLconst [0]) + // match: (SETG (FlagGT_UGT)) + // result: (MOVLconst [1]) for { v_0 := v.Args[0] if v_0.Op != OpAMD64FlagGT_UGT { break } v.reset(OpAMD64MOVLconst) - v.AuxInt = 0 + v.AuxInt = 1 return true } return false } -func rewriteValueAMD64_OpAMD64SETLE_0(v *Value) bool { - // match: (SETLE (InvertFlags x)) - // result: (SETGE x) +func rewriteValueAMD64_OpAMD64SETGE_0(v *Value) bool { + // match: (SETGE (InvertFlags x)) + // result: (SETLE x) for { v_0 := v.Args[0] if v_0.Op != OpAMD64InvertFlags { break } x := v_0.Args[0] - v.reset(OpAMD64SETGE) + v.reset(OpAMD64SETLE) v.AddArg(x) return true } - // match: (SETLE (FlagEQ)) + // match: (SETGE (FlagEQ)) // result: (MOVLconst [1]) for { v_0 := v.Args[0] @@ -44626,57 +29609,57 @@ func rewriteValueAMD64_OpAMD64SETLE_0(v *Value) bool { v.AuxInt = 1 return true } - // match: (SETLE (FlagLT_ULT)) - // result: (MOVLconst [1]) + // match: (SETGE (FlagLT_ULT)) + // result: (MOVLconst [0]) for { v_0 := v.Args[0] if v_0.Op != OpAMD64FlagLT_ULT { break } v.reset(OpAMD64MOVLconst) - v.AuxInt = 1 + v.AuxInt = 0 return true } - // match: (SETLE (FlagLT_UGT)) - // result: (MOVLconst [1]) + // match: (SETGE (FlagLT_UGT)) + // result: (MOVLconst [0]) for { v_0 := v.Args[0] if v_0.Op != OpAMD64FlagLT_UGT { break } v.reset(OpAMD64MOVLconst) - v.AuxInt = 1 + v.AuxInt = 0 return true } - // match: (SETLE (FlagGT_ULT)) - // result: (MOVLconst [0]) + // match: (SETGE (FlagGT_ULT)) + // result: (MOVLconst [1]) for { v_0 := v.Args[0] if v_0.Op != OpAMD64FlagGT_ULT { break } v.reset(OpAMD64MOVLconst) - v.AuxInt = 0 + v.AuxInt = 1 return true } - // match: (SETLE (FlagGT_UGT)) - // result: (MOVLconst [0]) + // match: (SETGE (FlagGT_UGT)) + // result: (MOVLconst [1]) for { v_0 := v.Args[0] if v_0.Op != OpAMD64FlagGT_UGT { break } v.reset(OpAMD64MOVLconst) - v.AuxInt = 0 + v.AuxInt = 1 return true } return false } -func rewriteValueAMD64_OpAMD64SETLEstore_0(v *Value) bool { +func rewriteValueAMD64_OpAMD64SETGEstore_0(v *Value) bool { b := v.Block typ := &b.Func.Config.Types - // match: (SETLEstore [off] {sym} ptr (InvertFlags x) mem) - // result: (SETGEstore [off] {sym} ptr x mem) + // match: (SETGEstore [off] {sym} ptr (InvertFlags x) mem) + // result: (SETLEstore [off] {sym} ptr x mem) for { off := v.AuxInt sym := v.Aux @@ -44687,7 +29670,7 @@ func rewriteValueAMD64_OpAMD64SETLEstore_0(v *Value) bool { break } x := v_1.Args[0] - v.reset(OpAMD64SETGEstore) + v.reset(OpAMD64SETLEstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) @@ -44695,9 +29678,9 @@ func rewriteValueAMD64_OpAMD64SETLEstore_0(v *Value) bool { v.AddArg(mem) return true } - // match: (SETLEstore [off1] {sym} (ADDQconst [off2] base) val mem) + // match: (SETGEstore [off1] {sym} (ADDQconst [off2] base) val mem) // cond: is32Bit(off1+off2) - // result: (SETLEstore [off1+off2] {sym} base val mem) + // result: (SETGEstore [off1+off2] {sym} base val mem) for { off1 := v.AuxInt sym := v.Aux @@ -44712,7 +29695,7 @@ func rewriteValueAMD64_OpAMD64SETLEstore_0(v *Value) bool { if !(is32Bit(off1 + off2)) { break } - v.reset(OpAMD64SETLEstore) + v.reset(OpAMD64SETGEstore) v.AuxInt = off1 + off2 v.Aux = sym v.AddArg(base) @@ -44720,9 +29703,9 @@ func rewriteValueAMD64_OpAMD64SETLEstore_0(v *Value) bool { v.AddArg(mem) return true } - // match: (SETLEstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem) + // match: (SETGEstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem) // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (SETLEstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) + // result: (SETGEstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) for { off1 := v.AuxInt sym1 := v.Aux @@ -44738,7 +29721,7 @@ func rewriteValueAMD64_OpAMD64SETLEstore_0(v *Value) bool { if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(OpAMD64SETLEstore) + v.reset(OpAMD64SETGEstore) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) v.AddArg(base) @@ -44746,7 +29729,7 @@ func rewriteValueAMD64_OpAMD64SETLEstore_0(v *Value) bool { v.AddArg(mem) return true } - // match: (SETLEstore [off] {sym} ptr (FlagEQ) mem) + // match: (SETGEstore [off] {sym} ptr (FlagEQ) mem) // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) for { off := v.AuxInt @@ -44767,8 +29750,8 @@ func rewriteValueAMD64_OpAMD64SETLEstore_0(v *Value) bool { v.AddArg(mem) return true } - // match: (SETLEstore [off] {sym} ptr (FlagLT_ULT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) + // match: (SETGEstore [off] {sym} ptr (FlagLT_ULT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) for { off := v.AuxInt sym := v.Aux @@ -44783,13 +29766,13 @@ func rewriteValueAMD64_OpAMD64SETLEstore_0(v *Value) bool { v.Aux = sym v.AddArg(ptr) v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 1 + v0.AuxInt = 0 v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETLEstore [off] {sym} ptr (FlagLT_UGT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) + // match: (SETGEstore [off] {sym} ptr (FlagLT_UGT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) for { off := v.AuxInt sym := v.Aux @@ -44804,13 +29787,13 @@ func rewriteValueAMD64_OpAMD64SETLEstore_0(v *Value) bool { v.Aux = sym v.AddArg(ptr) v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 1 + v0.AuxInt = 0 v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETLEstore [off] {sym} ptr (FlagGT_ULT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) + // match: (SETGEstore [off] {sym} ptr (FlagGT_ULT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) for { off := v.AuxInt sym := v.Aux @@ -44825,13 +29808,13 @@ func rewriteValueAMD64_OpAMD64SETLEstore_0(v *Value) bool { v.Aux = sym v.AddArg(ptr) v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 0 + v0.AuxInt = 1 v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETLEstore [off] {sym} ptr (FlagGT_UGT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) + // match: (SETGEstore [off] {sym} ptr (FlagGT_UGT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) for { off := v.AuxInt sym := v.Aux @@ -44846,18 +29829,18 @@ func rewriteValueAMD64_OpAMD64SETLEstore_0(v *Value) bool { v.Aux = sym v.AddArg(ptr) v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 0 + v0.AuxInt = 1 v.AddArg(v0) v.AddArg(mem) return true } return false } -func rewriteValueAMD64_OpAMD64SETLstore_0(v *Value) bool { +func rewriteValueAMD64_OpAMD64SETGstore_0(v *Value) bool { b := v.Block typ := &b.Func.Config.Types - // match: (SETLstore [off] {sym} ptr (InvertFlags x) mem) - // result: (SETGstore [off] {sym} ptr x mem) + // match: (SETGstore [off] {sym} ptr (InvertFlags x) mem) + // result: (SETLstore [off] {sym} ptr x mem) for { off := v.AuxInt sym := v.Aux @@ -44868,7 +29851,7 @@ func rewriteValueAMD64_OpAMD64SETLstore_0(v *Value) bool { break } x := v_1.Args[0] - v.reset(OpAMD64SETGstore) + v.reset(OpAMD64SETLstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) @@ -44876,9 +29859,9 @@ func rewriteValueAMD64_OpAMD64SETLstore_0(v *Value) bool { v.AddArg(mem) return true } - // match: (SETLstore [off1] {sym} (ADDQconst [off2] base) val mem) + // match: (SETGstore [off1] {sym} (ADDQconst [off2] base) val mem) // cond: is32Bit(off1+off2) - // result: (SETLstore [off1+off2] {sym} base val mem) + // result: (SETGstore [off1+off2] {sym} base val mem) for { off1 := v.AuxInt sym := v.Aux @@ -44893,7 +29876,7 @@ func rewriteValueAMD64_OpAMD64SETLstore_0(v *Value) bool { if !(is32Bit(off1 + off2)) { break } - v.reset(OpAMD64SETLstore) + v.reset(OpAMD64SETGstore) v.AuxInt = off1 + off2 v.Aux = sym v.AddArg(base) @@ -44901,9 +29884,9 @@ func rewriteValueAMD64_OpAMD64SETLstore_0(v *Value) bool { v.AddArg(mem) return true } - // match: (SETLstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem) + // match: (SETGstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem) // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (SETLstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) + // result: (SETGstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) for { off1 := v.AuxInt sym1 := v.Aux @@ -44919,7 +29902,7 @@ func rewriteValueAMD64_OpAMD64SETLstore_0(v *Value) bool { if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(OpAMD64SETLstore) + v.reset(OpAMD64SETGstore) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) v.AddArg(base) @@ -44927,1183 +29910,1123 @@ func rewriteValueAMD64_OpAMD64SETLstore_0(v *Value) bool { v.AddArg(mem) return true } - // match: (SETLstore [off] {sym} ptr (FlagEQ) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagEQ { - break - } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 0 - v.AddArg(v0) - v.AddArg(mem) - return true - } - // match: (SETLstore [off] {sym} ptr (FlagLT_ULT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagLT_ULT { - break - } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 1 - v.AddArg(v0) - v.AddArg(mem) - return true - } - // match: (SETLstore [off] {sym} ptr (FlagLT_UGT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagLT_UGT { - break - } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 1 - v.AddArg(v0) - v.AddArg(mem) - return true - } - // match: (SETLstore [off] {sym} ptr (FlagGT_ULT) mem) - // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagGT_ULT { - break - } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 0 - v.AddArg(v0) - v.AddArg(mem) - return true - } - // match: (SETLstore [off] {sym} ptr (FlagGT_UGT) mem) + // match: (SETGstore [off] {sym} ptr (FlagEQ) mem) // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64FlagGT_UGT { - break - } - v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) - v0.AuxInt = 0 - v.AddArg(v0) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64SETNE_0(v *Value) bool { - b := v.Block - // match: (SETNE (TESTL (SHLL (MOVLconst [1]) x) y)) - // result: (SETB (BTL x y)) - for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTL { - break - } - y := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SHLL { - break - } - x := v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64MOVLconst || v_0_0_0.AuxInt != 1 { - break - } - v.reset(OpAMD64SETB) - v0 := b.NewValue0(v.Pos, OpAMD64BTL, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - v.AddArg(v0) - return true - } - // match: (SETNE (TESTL y (SHLL (MOVLconst [1]) x))) - // result: (SETB (BTL x y)) - for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTL { - break - } - _ = v_0.Args[1] - y := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SHLL { - break - } - x := v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpAMD64MOVLconst || v_0_1_0.AuxInt != 1 { - break - } - v.reset(OpAMD64SETB) - v0 := b.NewValue0(v.Pos, OpAMD64BTL, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - v.AddArg(v0) - return true - } - // match: (SETNE (TESTQ (SHLQ (MOVQconst [1]) x) y)) - // result: (SETB (BTQ x y)) - for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTQ { - break - } - y := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SHLQ { - break - } - x := v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64MOVQconst || v_0_0_0.AuxInt != 1 { - break - } - v.reset(OpAMD64SETB) - v0 := b.NewValue0(v.Pos, OpAMD64BTQ, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - v.AddArg(v0) - return true - } - // match: (SETNE (TESTQ y (SHLQ (MOVQconst [1]) x))) - // result: (SETB (BTQ x y)) - for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTQ { - break - } - _ = v_0.Args[1] - y := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SHLQ { - break - } - x := v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpAMD64MOVQconst || v_0_1_0.AuxInt != 1 { - break - } - v.reset(OpAMD64SETB) - v0 := b.NewValue0(v.Pos, OpAMD64BTQ, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - v.AddArg(v0) - return true - } - // match: (SETNE (TESTLconst [c] x)) - // cond: isUint32PowerOfTwo(c) - // result: (SETB (BTLconst [log2uint32(c)] x)) - for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTLconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - if !(isUint32PowerOfTwo(c)) { - break - } - v.reset(OpAMD64SETB) - v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = log2uint32(c) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (SETNE (TESTQconst [c] x)) - // cond: isUint64PowerOfTwo(c) - // result: (SETB (BTQconst [log2(c)] x)) - for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTQconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - if !(isUint64PowerOfTwo(c)) { - break - } - v.reset(OpAMD64SETB) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = log2(c) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (SETNE (TESTQ (MOVQconst [c]) x)) - // cond: isUint64PowerOfTwo(c) - // result: (SETB (BTQconst [log2(c)] x)) - for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTQ { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64MOVQconst { - break - } - c := v_0_0.AuxInt - if !(isUint64PowerOfTwo(c)) { + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64FlagEQ { break } - v.reset(OpAMD64SETB) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = log2(c) - v0.AddArg(x) + v.reset(OpAMD64MOVBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 0 v.AddArg(v0) + v.AddArg(mem) return true } - // match: (SETNE (TESTQ x (MOVQconst [c]))) - // cond: isUint64PowerOfTwo(c) - // result: (SETB (BTQconst [log2(c)] x)) + // match: (SETGstore [off] {sym} ptr (FlagLT_ULT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTQ { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64MOVQconst { - break - } - c := v_0_1.AuxInt - if !(isUint64PowerOfTwo(c)) { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64FlagLT_ULT { break } - v.reset(OpAMD64SETB) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = log2(c) - v0.AddArg(x) + v.reset(OpAMD64MOVBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 0 v.AddArg(v0) + v.AddArg(mem) return true } - // match: (SETNE (CMPLconst [1] s:(ANDLconst [1] _))) - // result: (SETEQ (CMPLconst [0] s)) + // match: (SETGstore [off] {sym} ptr (FlagLT_UGT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64CMPLconst || v_0.AuxInt != 1 { - break - } - s := v_0.Args[0] - if s.Op != OpAMD64ANDLconst || s.AuxInt != 1 { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64FlagLT_UGT { break } - v.reset(OpAMD64SETEQ) - v0 := b.NewValue0(v.Pos, OpAMD64CMPLconst, types.TypeFlags) + v.reset(OpAMD64MOVBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) v0.AuxInt = 0 - v0.AddArg(s) v.AddArg(v0) + v.AddArg(mem) return true } - // match: (SETNE (CMPQconst [1] s:(ANDQconst [1] _))) - // result: (SETEQ (CMPQconst [0] s)) + // match: (SETGstore [off] {sym} ptr (FlagGT_ULT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64CMPQconst || v_0.AuxInt != 1 { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64FlagGT_ULT { break } - s := v_0.Args[0] - if s.Op != OpAMD64ANDQconst || s.AuxInt != 1 { + v.reset(OpAMD64MOVBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 1 + v.AddArg(v0) + v.AddArg(mem) + return true + } + // match: (SETGstore [off] {sym} ptr (FlagGT_UGT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64FlagGT_UGT { break } - v.reset(OpAMD64SETEQ) - v0 := b.NewValue0(v.Pos, OpAMD64CMPQconst, types.TypeFlags) - v0.AuxInt = 0 - v0.AddArg(s) + v.reset(OpAMD64MOVBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 1 v.AddArg(v0) + v.AddArg(mem) return true } return false } -func rewriteValueAMD64_OpAMD64SETNE_10(v *Value) bool { - b := v.Block - // match: (SETNE (TESTQ z1:(SHLQconst [63] (SHRQconst [63] x)) z2)) - // cond: z1==z2 - // result: (SETB (BTQconst [63] x)) +func rewriteValueAMD64_OpAMD64SETL_0(v *Value) bool { + // match: (SETL (InvertFlags x)) + // result: (SETG x) for { v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTQ { - break - } - z2 := v_0.Args[1] - z1 := v_0.Args[0] - if z1.Op != OpAMD64SHLQconst || z1.AuxInt != 63 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 63 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { + if v_0.Op != OpAMD64InvertFlags { break } - v.reset(OpAMD64SETB) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 - v0.AddArg(x) - v.AddArg(v0) + x := v_0.Args[0] + v.reset(OpAMD64SETG) + v.AddArg(x) return true } - // match: (SETNE (TESTQ z2 z1:(SHLQconst [63] (SHRQconst [63] x)))) - // cond: z1==z2 - // result: (SETB (BTQconst [63] x)) + // match: (SETL (FlagEQ)) + // result: (MOVLconst [0]) for { v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTQ { - break - } - _ = v_0.Args[1] - z2 := v_0.Args[0] - z1 := v_0.Args[1] - if z1.Op != OpAMD64SHLQconst || z1.AuxInt != 63 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 63 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { + if v_0.Op != OpAMD64FlagEQ { break } - v.reset(OpAMD64SETB) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpAMD64MOVLconst) + v.AuxInt = 0 return true } - // match: (SETNE (TESTL z1:(SHLLconst [31] (SHRQconst [31] x)) z2)) - // cond: z1==z2 - // result: (SETB (BTQconst [31] x)) + // match: (SETL (FlagLT_ULT)) + // result: (MOVLconst [1]) for { v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTL { - break - } - z2 := v_0.Args[1] - z1 := v_0.Args[0] - if z1.Op != OpAMD64SHLLconst || z1.AuxInt != 31 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 31 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { + if v_0.Op != OpAMD64FlagLT_ULT { break } - v.reset(OpAMD64SETB) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 31 - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpAMD64MOVLconst) + v.AuxInt = 1 return true } - // match: (SETNE (TESTL z2 z1:(SHLLconst [31] (SHRQconst [31] x)))) - // cond: z1==z2 - // result: (SETB (BTQconst [31] x)) + // match: (SETL (FlagLT_UGT)) + // result: (MOVLconst [1]) for { v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTL { - break - } - _ = v_0.Args[1] - z2 := v_0.Args[0] - z1 := v_0.Args[1] - if z1.Op != OpAMD64SHLLconst || z1.AuxInt != 31 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 31 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { + if v_0.Op != OpAMD64FlagLT_UGT { break } - v.reset(OpAMD64SETB) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 31 - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpAMD64MOVLconst) + v.AuxInt = 1 return true } - // match: (SETNE (TESTQ z1:(SHRQconst [63] (SHLQconst [63] x)) z2)) - // cond: z1==z2 - // result: (SETB (BTQconst [0] x)) + // match: (SETL (FlagGT_ULT)) + // result: (MOVLconst [0]) for { v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTQ { - break - } - z2 := v_0.Args[1] - z1 := v_0.Args[0] - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLQconst || z1_0.AuxInt != 63 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { + if v_0.Op != OpAMD64FlagGT_ULT { break } - v.reset(OpAMD64SETB) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 0 - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpAMD64MOVLconst) + v.AuxInt = 0 return true } - // match: (SETNE (TESTQ z2 z1:(SHRQconst [63] (SHLQconst [63] x)))) - // cond: z1==z2 - // result: (SETB (BTQconst [0] x)) + // match: (SETL (FlagGT_UGT)) + // result: (MOVLconst [0]) for { v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTQ { - break - } - _ = v_0.Args[1] - z2 := v_0.Args[0] - z1 := v_0.Args[1] - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLQconst || z1_0.AuxInt != 63 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { + if v_0.Op != OpAMD64FlagGT_UGT { break } - v.reset(OpAMD64SETB) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 0 - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpAMD64MOVLconst) + v.AuxInt = 0 return true } - // match: (SETNE (TESTL z1:(SHRLconst [31] (SHLLconst [31] x)) z2)) - // cond: z1==z2 - // result: (SETB (BTLconst [0] x)) + return false +} +func rewriteValueAMD64_OpAMD64SETLE_0(v *Value) bool { + // match: (SETLE (InvertFlags x)) + // result: (SETGE x) for { v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTL { - break - } - z2 := v_0.Args[1] - z1 := v_0.Args[0] - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLLconst || z1_0.AuxInt != 31 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { + if v_0.Op != OpAMD64InvertFlags { break } - v.reset(OpAMD64SETB) - v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 0 - v0.AddArg(x) - v.AddArg(v0) + x := v_0.Args[0] + v.reset(OpAMD64SETGE) + v.AddArg(x) return true } - // match: (SETNE (TESTL z2 z1:(SHRLconst [31] (SHLLconst [31] x)))) - // cond: z1==z2 - // result: (SETB (BTLconst [0] x)) + // match: (SETLE (FlagEQ)) + // result: (MOVLconst [1]) for { v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTL { - break - } - _ = v_0.Args[1] - z2 := v_0.Args[0] - z1 := v_0.Args[1] - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLLconst || z1_0.AuxInt != 31 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { + if v_0.Op != OpAMD64FlagEQ { break } - v.reset(OpAMD64SETB) - v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 0 - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpAMD64MOVLconst) + v.AuxInt = 1 return true } - // match: (SETNE (TESTQ z1:(SHRQconst [63] x) z2)) - // cond: z1==z2 - // result: (SETB (BTQconst [63] x)) + // match: (SETLE (FlagLT_ULT)) + // result: (MOVLconst [1]) for { v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTQ { - break - } - z2 := v_0.Args[1] - z1 := v_0.Args[0] - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { - break - } - x := z1.Args[0] - if !(z1 == z2) { + if v_0.Op != OpAMD64FlagLT_ULT { break } - v.reset(OpAMD64SETB) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpAMD64MOVLconst) + v.AuxInt = 1 return true } - // match: (SETNE (TESTQ z2 z1:(SHRQconst [63] x))) - // cond: z1==z2 - // result: (SETB (BTQconst [63] x)) + // match: (SETLE (FlagLT_UGT)) + // result: (MOVLconst [1]) for { v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTQ { + if v_0.Op != OpAMD64FlagLT_UGT { break } - _ = v_0.Args[1] - z2 := v_0.Args[0] - z1 := v_0.Args[1] - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { + v.reset(OpAMD64MOVLconst) + v.AuxInt = 1 + return true + } + // match: (SETLE (FlagGT_ULT)) + // result: (MOVLconst [0]) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64FlagGT_ULT { break } - x := z1.Args[0] - if !(z1 == z2) { + v.reset(OpAMD64MOVLconst) + v.AuxInt = 0 + return true + } + // match: (SETLE (FlagGT_UGT)) + // result: (MOVLconst [0]) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64FlagGT_UGT { break } - v.reset(OpAMD64SETB) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpAMD64MOVLconst) + v.AuxInt = 0 return true } return false } -func rewriteValueAMD64_OpAMD64SETNE_20(v *Value) bool { +func rewriteValueAMD64_OpAMD64SETLEstore_0(v *Value) bool { b := v.Block - // match: (SETNE (TESTL z1:(SHRLconst [31] x) z2)) - // cond: z1==z2 - // result: (SETB (BTLconst [31] x)) + typ := &b.Func.Config.Types + // match: (SETLEstore [off] {sym} ptr (InvertFlags x) mem) + // result: (SETGEstore [off] {sym} ptr x mem) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTL { - break - } - z2 := v_0.Args[1] - z1 := v_0.Args[0] - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { - break - } - x := z1.Args[0] - if !(z1 == z2) { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64InvertFlags { break } - v.reset(OpAMD64SETB) - v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 31 - v0.AddArg(x) - v.AddArg(v0) + x := v_1.Args[0] + v.reset(OpAMD64SETGEstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(x) + v.AddArg(mem) return true } - // match: (SETNE (TESTL z2 z1:(SHRLconst [31] x))) - // cond: z1==z2 - // result: (SETB (BTLconst [31] x)) + // match: (SETLEstore [off1] {sym} (ADDQconst [off2] base) val mem) + // cond: is32Bit(off1+off2) + // result: (SETLEstore [off1+off2] {sym} base val mem) for { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpAMD64TESTL { - break - } - _ = v_0.Args[1] - z2 := v_0.Args[0] - z1 := v_0.Args[1] - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { + if v_0.Op != OpAMD64ADDQconst { break } - x := z1.Args[0] - if !(z1 == z2) { + off2 := v_0.AuxInt + base := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1 + off2)) { break } - v.reset(OpAMD64SETB) - v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 31 - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpAMD64SETLEstore) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(base) + v.AddArg(val) + v.AddArg(mem) return true } - // match: (SETNE (InvertFlags x)) - // result: (SETNE x) + // match: (SETLEstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (SETLEstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) for { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpAMD64InvertFlags { + if v_0.Op != OpAMD64LEAQ { break } - x := v_0.Args[0] - v.reset(OpAMD64SETNE) - v.AddArg(x) + off2 := v_0.AuxInt + sym2 := v_0.Aux + base := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + break + } + v.reset(OpAMD64SETLEstore) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(base) + v.AddArg(val) + v.AddArg(mem) return true } - // match: (SETNE (FlagEQ)) - // result: (MOVLconst [0]) + // match: (SETLEstore [off] {sym} ptr (FlagEQ) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagEQ { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64FlagEQ { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 0 + v.reset(OpAMD64MOVBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 1 + v.AddArg(v0) + v.AddArg(mem) return true } - // match: (SETNE (FlagLT_ULT)) - // result: (MOVLconst [1]) + // match: (SETLEstore [off] {sym} ptr (FlagLT_ULT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagLT_ULT { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64FlagLT_ULT { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 1 + v.reset(OpAMD64MOVBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 1 + v.AddArg(v0) + v.AddArg(mem) return true } - // match: (SETNE (FlagLT_UGT)) - // result: (MOVLconst [1]) + // match: (SETLEstore [off] {sym} ptr (FlagLT_UGT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagLT_UGT { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64FlagLT_UGT { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 1 + v.reset(OpAMD64MOVBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 1 + v.AddArg(v0) + v.AddArg(mem) return true } - // match: (SETNE (FlagGT_ULT)) - // result: (MOVLconst [1]) + // match: (SETLEstore [off] {sym} ptr (FlagGT_ULT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagGT_ULT { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64FlagGT_ULT { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 1 + v.reset(OpAMD64MOVBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 0 + v.AddArg(v0) + v.AddArg(mem) return true } - // match: (SETNE (FlagGT_UGT)) - // result: (MOVLconst [1]) + // match: (SETLEstore [off] {sym} ptr (FlagGT_UGT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) for { - v_0 := v.Args[0] - if v_0.Op != OpAMD64FlagGT_UGT { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64FlagGT_UGT { break } - v.reset(OpAMD64MOVLconst) - v.AuxInt = 1 + v.reset(OpAMD64MOVBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 0 + v.AddArg(v0) + v.AddArg(mem) return true } return false } -func rewriteValueAMD64_OpAMD64SETNEstore_0(v *Value) bool { +func rewriteValueAMD64_OpAMD64SETLstore_0(v *Value) bool { b := v.Block - // match: (SETNEstore [off] {sym} ptr (TESTL (SHLL (MOVLconst [1]) x) y) mem) - // result: (SETBstore [off] {sym} ptr (BTL x y) mem) + typ := &b.Func.Config.Types + // match: (SETLstore [off] {sym} ptr (InvertFlags x) mem) + // result: (SETGstore [off] {sym} ptr x mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTL { - break - } - y := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SHLL { - break - } - x := v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAMD64MOVLconst || v_1_0_0.AuxInt != 1 { + if v_1.Op != OpAMD64InvertFlags { break } - v.reset(OpAMD64SETBstore) + x := v_1.Args[0] + v.reset(OpAMD64SETGstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTL, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - v.AddArg(v0) + v.AddArg(x) v.AddArg(mem) return true } - // match: (SETNEstore [off] {sym} ptr (TESTL y (SHLL (MOVLconst [1]) x)) mem) - // result: (SETBstore [off] {sym} ptr (BTL x y) mem) + // match: (SETLstore [off1] {sym} (ADDQconst [off2] base) val mem) + // cond: is32Bit(off1+off2) + // result: (SETLstore [off1+off2] {sym} base val mem) for { - off := v.AuxInt + off1 := v.AuxInt sym := v.Aux mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTL { + v_0 := v.Args[0] + if v_0.Op != OpAMD64ADDQconst { break } - _ = v_1.Args[1] - y := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64SHLL { + off2 := v_0.AuxInt + base := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1 + off2)) { break } - x := v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64MOVLconst || v_1_1_0.AuxInt != 1 { + v.reset(OpAMD64SETLstore) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(base) + v.AddArg(val) + v.AddArg(mem) + return true + } + // match: (SETLstore [off1] {sym1} (LEAQ [off2] {sym2} base) val mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (SETLstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) + for { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpAMD64LEAQ { break } - v.reset(OpAMD64SETBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTL, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - v.AddArg(v0) + off2 := v_0.AuxInt + sym2 := v_0.Aux + base := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + break + } + v.reset(OpAMD64SETLstore) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(base) + v.AddArg(val) v.AddArg(mem) return true } - // match: (SETNEstore [off] {sym} ptr (TESTQ (SHLQ (MOVQconst [1]) x) y) mem) - // result: (SETBstore [off] {sym} ptr (BTQ x y) mem) + // match: (SETLstore [off] {sym} ptr (FlagEQ) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTQ { - break - } - y := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64SHLQ { - break - } - x := v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAMD64MOVQconst || v_1_0_0.AuxInt != 1 { + if v_1.Op != OpAMD64FlagEQ { break } - v.reset(OpAMD64SETBstore) + v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTQ, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 0 v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETNEstore [off] {sym} ptr (TESTQ y (SHLQ (MOVQconst [1]) x)) mem) - // result: (SETBstore [off] {sym} ptr (BTQ x y) mem) + // match: (SETLstore [off] {sym} ptr (FlagLT_ULT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTQ { - break - } - _ = v_1.Args[1] - y := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64SHLQ { - break - } - x := v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64MOVQconst || v_1_1_0.AuxInt != 1 { + if v_1.Op != OpAMD64FlagLT_ULT { break } - v.reset(OpAMD64SETBstore) + v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTQ, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 1 v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETNEstore [off] {sym} ptr (TESTLconst [c] x) mem) - // cond: isUint32PowerOfTwo(c) - // result: (SETBstore [off] {sym} ptr (BTLconst [log2uint32(c)] x) mem) + // match: (SETLstore [off] {sym} ptr (FlagLT_UGT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTLconst { - break - } - c := v_1.AuxInt - x := v_1.Args[0] - if !(isUint32PowerOfTwo(c)) { + if v_1.Op != OpAMD64FlagLT_UGT { break } - v.reset(OpAMD64SETBstore) + v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = log2uint32(c) - v0.AddArg(x) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 1 v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETNEstore [off] {sym} ptr (TESTQconst [c] x) mem) - // cond: isUint64PowerOfTwo(c) - // result: (SETBstore [off] {sym} ptr (BTQconst [log2(c)] x) mem) + // match: (SETLstore [off] {sym} ptr (FlagGT_ULT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTQconst { - break - } - c := v_1.AuxInt - x := v_1.Args[0] - if !(isUint64PowerOfTwo(c)) { + if v_1.Op != OpAMD64FlagGT_ULT { break } - v.reset(OpAMD64SETBstore) + v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = log2(c) - v0.AddArg(x) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 0 v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETNEstore [off] {sym} ptr (TESTQ (MOVQconst [c]) x) mem) - // cond: isUint64PowerOfTwo(c) - // result: (SETBstore [off] {sym} ptr (BTQconst [log2(c)] x) mem) + // match: (SETLstore [off] {sym} ptr (FlagGT_UGT) mem) + // result: (MOVBstore [off] {sym} ptr (MOVLconst [0]) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTQ { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64MOVQconst { - break - } - c := v_1_0.AuxInt - if !(isUint64PowerOfTwo(c)) { + if v_1.Op != OpAMD64FlagGT_UGT { break } - v.reset(OpAMD64SETBstore) + v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = log2(c) - v0.AddArg(x) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLconst, typ.UInt8) + v0.AuxInt = 0 v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETNEstore [off] {sym} ptr (TESTQ x (MOVQconst [c])) mem) - // cond: isUint64PowerOfTwo(c) - // result: (SETBstore [off] {sym} ptr (BTQconst [log2(c)] x) mem) + return false +} +func rewriteValueAMD64_OpAMD64SETNE_0(v *Value) bool { + b := v.Block + // match: (SETNE (TESTL (SHLL (MOVLconst [1]) x) y)) + // result: (SETB (BTL x y)) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTQ { + v_0 := v.Args[0] + if v_0.Op != OpAMD64TESTL { break } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpAMD64MOVQconst { + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpAMD64SHLL { + continue + } + x := v_0_0.Args[1] + v_0_0_0 := v_0_0.Args[0] + if v_0_0_0.Op != OpAMD64MOVLconst || v_0_0_0.AuxInt != 1 { + continue + } + y := v_0.Args[1^_i0] + v.reset(OpAMD64SETB) + v0 := b.NewValue0(v.Pos, OpAMD64BTL, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + v.AddArg(v0) + return true + } + break + } + // match: (SETNE (TESTQ (SHLQ (MOVQconst [1]) x) y)) + // result: (SETB (BTQ x y)) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64TESTQ { + break + } + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpAMD64SHLQ { + continue + } + x := v_0_0.Args[1] + v_0_0_0 := v_0_0.Args[0] + if v_0_0_0.Op != OpAMD64MOVQconst || v_0_0_0.AuxInt != 1 { + continue + } + y := v_0.Args[1^_i0] + v.reset(OpAMD64SETB) + v0 := b.NewValue0(v.Pos, OpAMD64BTQ, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + v.AddArg(v0) + return true + } + break + } + // match: (SETNE (TESTLconst [c] x)) + // cond: isUint32PowerOfTwo(c) + // result: (SETB (BTLconst [log2uint32(c)] x)) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64TESTLconst { + break + } + c := v_0.AuxInt + x := v_0.Args[0] + if !(isUint32PowerOfTwo(c)) { + break + } + v.reset(OpAMD64SETB) + v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) + v0.AuxInt = log2uint32(c) + v0.AddArg(x) + v.AddArg(v0) + return true + } + // match: (SETNE (TESTQconst [c] x)) + // cond: isUint64PowerOfTwo(c) + // result: (SETB (BTQconst [log2(c)] x)) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64TESTQconst { break } - c := v_1_1.AuxInt + c := v_0.AuxInt + x := v_0.Args[0] if !(isUint64PowerOfTwo(c)) { break } - v.reset(OpAMD64SETBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) + v.reset(OpAMD64SETB) v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) v0.AuxInt = log2(c) v0.AddArg(x) v.AddArg(v0) - v.AddArg(mem) return true } - // match: (SETNEstore [off] {sym} ptr (CMPLconst [1] s:(ANDLconst [1] _)) mem) - // result: (SETEQstore [off] {sym} ptr (CMPLconst [0] s) mem) + // match: (SETNE (TESTQ (MOVQconst [c]) x)) + // cond: isUint64PowerOfTwo(c) + // result: (SETB (BTQconst [log2(c)] x)) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64CMPLconst || v_1.AuxInt != 1 { + v_0 := v.Args[0] + if v_0.Op != OpAMD64TESTQ { break } - s := v_1.Args[0] + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpAMD64MOVQconst { + continue + } + c := v_0_0.AuxInt + x := v_0.Args[1^_i0] + if !(isUint64PowerOfTwo(c)) { + continue + } + v.reset(OpAMD64SETB) + v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = log2(c) + v0.AddArg(x) + v.AddArg(v0) + return true + } + break + } + // match: (SETNE (CMPLconst [1] s:(ANDLconst [1] _))) + // result: (SETEQ (CMPLconst [0] s)) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64CMPLconst || v_0.AuxInt != 1 { + break + } + s := v_0.Args[0] if s.Op != OpAMD64ANDLconst || s.AuxInt != 1 { break } - v.reset(OpAMD64SETEQstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) + v.reset(OpAMD64SETEQ) v0 := b.NewValue0(v.Pos, OpAMD64CMPLconst, types.TypeFlags) v0.AuxInt = 0 v0.AddArg(s) v.AddArg(v0) - v.AddArg(mem) return true } - // match: (SETNEstore [off] {sym} ptr (CMPQconst [1] s:(ANDQconst [1] _)) mem) - // result: (SETEQstore [off] {sym} ptr (CMPQconst [0] s) mem) + // match: (SETNE (CMPQconst [1] s:(ANDQconst [1] _))) + // result: (SETEQ (CMPQconst [0] s)) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64CMPQconst || v_1.AuxInt != 1 { + v_0 := v.Args[0] + if v_0.Op != OpAMD64CMPQconst || v_0.AuxInt != 1 { break } - s := v_1.Args[0] + s := v_0.Args[0] if s.Op != OpAMD64ANDQconst || s.AuxInt != 1 { break } - v.reset(OpAMD64SETEQstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) + v.reset(OpAMD64SETEQ) v0 := b.NewValue0(v.Pos, OpAMD64CMPQconst, types.TypeFlags) v0.AuxInt = 0 v0.AddArg(s) v.AddArg(v0) - v.AddArg(mem) return true } + // match: (SETNE (TESTQ z1:(SHLQconst [63] (SHRQconst [63] x)) z2)) + // cond: z1==z2 + // result: (SETB (BTQconst [63] x)) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64TESTQ { + break + } + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_0.Args[_i0] + if z1.Op != OpAMD64SHLQconst || z1.AuxInt != 63 { + continue + } + z1_0 := z1.Args[0] + if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 63 { + continue + } + x := z1_0.Args[0] + z2 := v_0.Args[1^_i0] + if !(z1 == z2) { + continue + } + v.reset(OpAMD64SETB) + v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = 63 + v0.AddArg(x) + v.AddArg(v0) + return true + } + break + } + // match: (SETNE (TESTL z1:(SHLLconst [31] (SHRQconst [31] x)) z2)) + // cond: z1==z2 + // result: (SETB (BTQconst [31] x)) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64TESTL { + break + } + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_0.Args[_i0] + if z1.Op != OpAMD64SHLLconst || z1.AuxInt != 31 { + continue + } + z1_0 := z1.Args[0] + if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 31 { + continue + } + x := z1_0.Args[0] + z2 := v_0.Args[1^_i0] + if !(z1 == z2) { + continue + } + v.reset(OpAMD64SETB) + v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = 31 + v0.AddArg(x) + v.AddArg(v0) + return true + } + break + } + // match: (SETNE (TESTQ z1:(SHRQconst [63] (SHLQconst [63] x)) z2)) + // cond: z1==z2 + // result: (SETB (BTQconst [0] x)) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64TESTQ { + break + } + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_0.Args[_i0] + if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { + continue + } + z1_0 := z1.Args[0] + if z1_0.Op != OpAMD64SHLQconst || z1_0.AuxInt != 63 { + continue + } + x := z1_0.Args[0] + z2 := v_0.Args[1^_i0] + if !(z1 == z2) { + continue + } + v.reset(OpAMD64SETB) + v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = 0 + v0.AddArg(x) + v.AddArg(v0) + return true + } + break + } return false } -func rewriteValueAMD64_OpAMD64SETNEstore_10(v *Value) bool { +func rewriteValueAMD64_OpAMD64SETNE_10(v *Value) bool { b := v.Block - // match: (SETNEstore [off] {sym} ptr (TESTQ z1:(SHLQconst [63] (SHRQconst [63] x)) z2) mem) + // match: (SETNE (TESTL z1:(SHRLconst [31] (SHLLconst [31] x)) z2)) // cond: z1==z2 - // result: (SETBstore [off] {sym} ptr (BTQconst [63] x) mem) + // result: (SETB (BTLconst [0] x)) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTQ { + v_0 := v.Args[0] + if v_0.Op != OpAMD64TESTL { + break + } + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_0.Args[_i0] + if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { + continue + } + z1_0 := z1.Args[0] + if z1_0.Op != OpAMD64SHLLconst || z1_0.AuxInt != 31 { + continue + } + x := z1_0.Args[0] + z2 := v_0.Args[1^_i0] + if !(z1 == z2) { + continue + } + v.reset(OpAMD64SETB) + v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) + v0.AuxInt = 0 + v0.AddArg(x) + v.AddArg(v0) + return true + } + break + } + // match: (SETNE (TESTQ z1:(SHRQconst [63] x) z2)) + // cond: z1==z2 + // result: (SETB (BTQconst [63] x)) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64TESTQ { + break + } + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_0.Args[_i0] + if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { + continue + } + x := z1.Args[0] + z2 := v_0.Args[1^_i0] + if !(z1 == z2) { + continue + } + v.reset(OpAMD64SETB) + v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = 63 + v0.AddArg(x) + v.AddArg(v0) + return true + } + break + } + // match: (SETNE (TESTL z1:(SHRLconst [31] x) z2)) + // cond: z1==z2 + // result: (SETB (BTLconst [31] x)) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64TESTL { + break + } + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_0.Args[_i0] + if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { + continue + } + x := z1.Args[0] + z2 := v_0.Args[1^_i0] + if !(z1 == z2) { + continue + } + v.reset(OpAMD64SETB) + v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) + v0.AuxInt = 31 + v0.AddArg(x) + v.AddArg(v0) + return true + } + break + } + // match: (SETNE (InvertFlags x)) + // result: (SETNE x) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64InvertFlags { + break + } + x := v_0.Args[0] + v.reset(OpAMD64SETNE) + v.AddArg(x) + return true + } + // match: (SETNE (FlagEQ)) + // result: (MOVLconst [0]) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64FlagEQ { break } - z2 := v_1.Args[1] - z1 := v_1.Args[0] - if z1.Op != OpAMD64SHLQconst || z1.AuxInt != 63 { + v.reset(OpAMD64MOVLconst) + v.AuxInt = 0 + return true + } + // match: (SETNE (FlagLT_ULT)) + // result: (MOVLconst [1]) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64FlagLT_ULT { break } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 63 { + v.reset(OpAMD64MOVLconst) + v.AuxInt = 1 + return true + } + // match: (SETNE (FlagLT_UGT)) + // result: (MOVLconst [1]) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64FlagLT_UGT { break } - x := z1_0.Args[0] - if !(z1 == z2) { + v.reset(OpAMD64MOVLconst) + v.AuxInt = 1 + return true + } + // match: (SETNE (FlagGT_ULT)) + // result: (MOVLconst [1]) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64FlagGT_ULT { break } - v.reset(OpAMD64SETBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 - v0.AddArg(x) - v.AddArg(v0) - v.AddArg(mem) + v.reset(OpAMD64MOVLconst) + v.AuxInt = 1 + return true + } + // match: (SETNE (FlagGT_UGT)) + // result: (MOVLconst [1]) + for { + v_0 := v.Args[0] + if v_0.Op != OpAMD64FlagGT_UGT { + break + } + v.reset(OpAMD64MOVLconst) + v.AuxInt = 1 return true } - // match: (SETNEstore [off] {sym} ptr (TESTQ z2 z1:(SHLQconst [63] (SHRQconst [63] x))) mem) - // cond: z1==z2 - // result: (SETBstore [off] {sym} ptr (BTQconst [63] x) mem) + return false +} +func rewriteValueAMD64_OpAMD64SETNEstore_0(v *Value) bool { + b := v.Block + // match: (SETNEstore [off] {sym} ptr (TESTL (SHLL (MOVLconst [1]) x) y) mem) + // result: (SETBstore [off] {sym} ptr (BTL x y) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTQ { + if v_1.Op != OpAMD64TESTL { break } _ = v_1.Args[1] - z2 := v_1.Args[0] - z1 := v_1.Args[1] - if z1.Op != OpAMD64SHLQconst || z1.AuxInt != 63 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 63 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_1_0 := v_1.Args[_i0] + if v_1_0.Op != OpAMD64SHLL { + continue + } + x := v_1_0.Args[1] + v_1_0_0 := v_1_0.Args[0] + if v_1_0_0.Op != OpAMD64MOVLconst || v_1_0_0.AuxInt != 1 { + continue + } + y := v_1.Args[1^_i0] + v.reset(OpAMD64SETBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64BTL, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + v.AddArg(v0) + v.AddArg(mem) + return true } - v.reset(OpAMD64SETBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 - v0.AddArg(x) - v.AddArg(v0) - v.AddArg(mem) - return true + break } - // match: (SETNEstore [off] {sym} ptr (TESTL z1:(SHLLconst [31] (SHRLconst [31] x)) z2) mem) - // cond: z1==z2 - // result: (SETBstore [off] {sym} ptr (BTLconst [31] x) mem) + // match: (SETNEstore [off] {sym} ptr (TESTQ (SHLQ (MOVQconst [1]) x) y) mem) + // result: (SETBstore [off] {sym} ptr (BTQ x y) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTL { - break - } - z2 := v_1.Args[1] - z1 := v_1.Args[0] - if z1.Op != OpAMD64SHLLconst || z1.AuxInt != 31 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRLconst || z1_0.AuxInt != 31 { + if v_1.Op != OpAMD64TESTQ { break } - x := z1_0.Args[0] - if !(z1 == z2) { - break + _ = v_1.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_1_0 := v_1.Args[_i0] + if v_1_0.Op != OpAMD64SHLQ { + continue + } + x := v_1_0.Args[1] + v_1_0_0 := v_1_0.Args[0] + if v_1_0_0.Op != OpAMD64MOVQconst || v_1_0_0.AuxInt != 1 { + continue + } + y := v_1.Args[1^_i0] + v.reset(OpAMD64SETBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64BTQ, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + v.AddArg(v0) + v.AddArg(mem) + return true } - v.reset(OpAMD64SETBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 31 - v0.AddArg(x) - v.AddArg(v0) - v.AddArg(mem) - return true + break } - // match: (SETNEstore [off] {sym} ptr (TESTL z2 z1:(SHLLconst [31] (SHRLconst [31] x))) mem) - // cond: z1==z2 - // result: (SETBstore [off] {sym} ptr (BTLconst [31] x) mem) + // match: (SETNEstore [off] {sym} ptr (TESTLconst [c] x) mem) + // cond: isUint32PowerOfTwo(c) + // result: (SETBstore [off] {sym} ptr (BTLconst [log2uint32(c)] x) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTL { - break - } - _ = v_1.Args[1] - z2 := v_1.Args[0] - z1 := v_1.Args[1] - if z1.Op != OpAMD64SHLLconst || z1.AuxInt != 31 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRLconst || z1_0.AuxInt != 31 { + if v_1.Op != OpAMD64TESTLconst { break } - x := z1_0.Args[0] - if !(z1 == z2) { + c := v_1.AuxInt + x := v_1.Args[0] + if !(isUint32PowerOfTwo(c)) { break } v.reset(OpAMD64SETBstore) @@ -46111,35 +31034,27 @@ func rewriteValueAMD64_OpAMD64SETNEstore_10(v *Value) bool { v.Aux = sym v.AddArg(ptr) v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 31 + v0.AuxInt = log2uint32(c) v0.AddArg(x) v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETNEstore [off] {sym} ptr (TESTQ z1:(SHRQconst [63] (SHLQconst [63] x)) z2) mem) - // cond: z1==z2 - // result: (SETBstore [off] {sym} ptr (BTQconst [0] x) mem) + // match: (SETNEstore [off] {sym} ptr (TESTQconst [c] x) mem) + // cond: isUint64PowerOfTwo(c) + // result: (SETBstore [off] {sym} ptr (BTQconst [log2(c)] x) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTQ { - break - } - z2 := v_1.Args[1] - z1 := v_1.Args[0] - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLQconst || z1_0.AuxInt != 63 { + if v_1.Op != OpAMD64TESTQconst { break } - x := z1_0.Args[0] - if !(z1 == z2) { + c := v_1.AuxInt + x := v_1.Args[0] + if !(isUint64PowerOfTwo(c)) { break } v.reset(OpAMD64SETBstore) @@ -46147,15 +31062,15 @@ func rewriteValueAMD64_OpAMD64SETNEstore_10(v *Value) bool { v.Aux = sym v.AddArg(ptr) v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 0 + v0.AuxInt = log2(c) v0.AddArg(x) v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETNEstore [off] {sym} ptr (TESTQ z2 z1:(SHRQconst [63] (SHLQconst [63] x))) mem) - // cond: z1==z2 - // result: (SETBstore [off] {sym} ptr (BTQconst [0] x) mem) + // match: (SETNEstore [off] {sym} ptr (TESTQ (MOVQconst [c]) x) mem) + // cond: isUint64PowerOfTwo(c) + // result: (SETBstore [off] {sym} ptr (BTQconst [log2(c)] x) mem) for { off := v.AuxInt sym := v.Aux @@ -46166,138 +31081,164 @@ func rewriteValueAMD64_OpAMD64SETNEstore_10(v *Value) bool { break } _ = v_1.Args[1] - z2 := v_1.Args[0] - z1 := v_1.Args[1] - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_1_0 := v_1.Args[_i0] + if v_1_0.Op != OpAMD64MOVQconst { + continue + } + c := v_1_0.AuxInt + x := v_1.Args[1^_i0] + if !(isUint64PowerOfTwo(c)) { + continue + } + v.reset(OpAMD64SETBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = log2(c) + v0.AddArg(x) + v.AddArg(v0) + v.AddArg(mem) + return true } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLQconst || z1_0.AuxInt != 63 { + break + } + // match: (SETNEstore [off] {sym} ptr (CMPLconst [1] s:(ANDLconst [1] _)) mem) + // result: (SETEQstore [off] {sym} ptr (CMPLconst [0] s) mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64CMPLconst || v_1.AuxInt != 1 { break } - x := z1_0.Args[0] - if !(z1 == z2) { + s := v_1.Args[0] + if s.Op != OpAMD64ANDLconst || s.AuxInt != 1 { break } - v.reset(OpAMD64SETBstore) + v.reset(OpAMD64SETEQstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) + v0 := b.NewValue0(v.Pos, OpAMD64CMPLconst, types.TypeFlags) v0.AuxInt = 0 - v0.AddArg(x) + v0.AddArg(s) v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETNEstore [off] {sym} ptr (TESTL z1:(SHRLconst [31] (SHLLconst [31] x)) z2) mem) - // cond: z1==z2 - // result: (SETBstore [off] {sym} ptr (BTLconst [0] x) mem) + // match: (SETNEstore [off] {sym} ptr (CMPQconst [1] s:(ANDQconst [1] _)) mem) + // result: (SETEQstore [off] {sym} ptr (CMPQconst [0] s) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTL { - break - } - z2 := v_1.Args[1] - z1 := v_1.Args[0] - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLLconst || z1_0.AuxInt != 31 { + if v_1.Op != OpAMD64CMPQconst || v_1.AuxInt != 1 { break } - x := z1_0.Args[0] - if !(z1 == z2) { + s := v_1.Args[0] + if s.Op != OpAMD64ANDQconst || s.AuxInt != 1 { break } - v.reset(OpAMD64SETBstore) + v.reset(OpAMD64SETEQstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) + v0 := b.NewValue0(v.Pos, OpAMD64CMPQconst, types.TypeFlags) v0.AuxInt = 0 - v0.AddArg(x) + v0.AddArg(s) v.AddArg(v0) v.AddArg(mem) return true } - // match: (SETNEstore [off] {sym} ptr (TESTL z2 z1:(SHRLconst [31] (SHLLconst [31] x))) mem) + // match: (SETNEstore [off] {sym} ptr (TESTQ z1:(SHLQconst [63] (SHRQconst [63] x)) z2) mem) // cond: z1==z2 - // result: (SETBstore [off] {sym} ptr (BTLconst [0] x) mem) + // result: (SETBstore [off] {sym} ptr (BTQconst [63] x) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTL { + if v_1.Op != OpAMD64TESTQ { break } _ = v_1.Args[1] - z2 := v_1.Args[0] - z1 := v_1.Args[1] - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLLconst || z1_0.AuxInt != 31 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_1.Args[_i0] + if z1.Op != OpAMD64SHLQconst || z1.AuxInt != 63 { + continue + } + z1_0 := z1.Args[0] + if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 63 { + continue + } + x := z1_0.Args[0] + z2 := v_1.Args[1^_i0] + if !(z1 == z2) { + continue + } + v.reset(OpAMD64SETBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = 63 + v0.AddArg(x) + v.AddArg(v0) + v.AddArg(mem) + return true } - v.reset(OpAMD64SETBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 0 - v0.AddArg(x) - v.AddArg(v0) - v.AddArg(mem) - return true + break } - // match: (SETNEstore [off] {sym} ptr (TESTQ z1:(SHRQconst [63] x) z2) mem) + // match: (SETNEstore [off] {sym} ptr (TESTL z1:(SHLLconst [31] (SHRLconst [31] x)) z2) mem) // cond: z1==z2 - // result: (SETBstore [off] {sym} ptr (BTQconst [63] x) mem) + // result: (SETBstore [off] {sym} ptr (BTLconst [31] x) mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAMD64TESTQ { - break - } - z2 := v_1.Args[1] - z1 := v_1.Args[0] - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { + if v_1.Op != OpAMD64TESTL { break } - x := z1.Args[0] - if !(z1 == z2) { - break + _ = v_1.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_1.Args[_i0] + if z1.Op != OpAMD64SHLLconst || z1.AuxInt != 31 { + continue + } + z1_0 := z1.Args[0] + if z1_0.Op != OpAMD64SHRLconst || z1_0.AuxInt != 31 { + continue + } + x := z1_0.Args[0] + z2 := v_1.Args[1^_i0] + if !(z1 == z2) { + continue + } + v.reset(OpAMD64SETBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) + v0.AuxInt = 31 + v0.AddArg(x) + v.AddArg(v0) + v.AddArg(mem) + return true } - v.reset(OpAMD64SETBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 - v0.AddArg(x) - v.AddArg(v0) - v.AddArg(mem) - return true + break } - // match: (SETNEstore [off] {sym} ptr (TESTQ z2 z1:(SHRQconst [63] x)) mem) + // match: (SETNEstore [off] {sym} ptr (TESTQ z1:(SHRQconst [63] (SHLQconst [63] x)) z2) mem) // cond: z1==z2 - // result: (SETBstore [off] {sym} ptr (BTQconst [63] x) mem) + // result: (SETBstore [off] {sym} ptr (BTQconst [0] x) mem) for { off := v.AuxInt sym := v.Aux @@ -46308,34 +31249,41 @@ func rewriteValueAMD64_OpAMD64SETNEstore_10(v *Value) bool { break } _ = v_1.Args[1] - z2 := v_1.Args[0] - z1 := v_1.Args[1] - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { - break - } - x := z1.Args[0] - if !(z1 == z2) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_1.Args[_i0] + if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { + continue + } + z1_0 := z1.Args[0] + if z1_0.Op != OpAMD64SHLQconst || z1_0.AuxInt != 63 { + continue + } + x := z1_0.Args[0] + z2 := v_1.Args[1^_i0] + if !(z1 == z2) { + continue + } + v.reset(OpAMD64SETBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = 0 + v0.AddArg(x) + v.AddArg(v0) + v.AddArg(mem) + return true } - v.reset(OpAMD64SETBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 - v0.AddArg(x) - v.AddArg(v0) - v.AddArg(mem) - return true + break } return false } -func rewriteValueAMD64_OpAMD64SETNEstore_20(v *Value) bool { +func rewriteValueAMD64_OpAMD64SETNEstore_10(v *Value) bool { b := v.Block typ := &b.Func.Config.Types - // match: (SETNEstore [off] {sym} ptr (TESTL z1:(SHRLconst [31] x) z2) mem) + // match: (SETNEstore [off] {sym} ptr (TESTL z1:(SHRLconst [31] (SHLLconst [31] x)) z2) mem) // cond: z1==z2 - // result: (SETBstore [off] {sym} ptr (BTLconst [31] x) mem) + // result: (SETBstore [off] {sym} ptr (BTLconst [0] x) mem) for { off := v.AuxInt sym := v.Aux @@ -46345,27 +31293,71 @@ func rewriteValueAMD64_OpAMD64SETNEstore_20(v *Value) bool { if v_1.Op != OpAMD64TESTL { break } - z2 := v_1.Args[1] - z1 := v_1.Args[0] - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { - break + _ = v_1.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_1.Args[_i0] + if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { + continue + } + z1_0 := z1.Args[0] + if z1_0.Op != OpAMD64SHLLconst || z1_0.AuxInt != 31 { + continue + } + x := z1_0.Args[0] + z2 := v_1.Args[1^_i0] + if !(z1 == z2) { + continue + } + v.reset(OpAMD64SETBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) + v0.AuxInt = 0 + v0.AddArg(x) + v.AddArg(v0) + v.AddArg(mem) + return true } - x := z1.Args[0] - if !(z1 == z2) { + break + } + // match: (SETNEstore [off] {sym} ptr (TESTQ z1:(SHRQconst [63] x) z2) mem) + // cond: z1==z2 + // result: (SETBstore [off] {sym} ptr (BTQconst [63] x) mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpAMD64TESTQ { break } - v.reset(OpAMD64SETBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 31 - v0.AddArg(x) - v.AddArg(v0) - v.AddArg(mem) - return true + _ = v_1.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_1.Args[_i0] + if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { + continue + } + x := z1.Args[0] + z2 := v_1.Args[1^_i0] + if !(z1 == z2) { + continue + } + v.reset(OpAMD64SETBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = 63 + v0.AddArg(x) + v.AddArg(v0) + v.AddArg(mem) + return true + } + break } - // match: (SETNEstore [off] {sym} ptr (TESTL z2 z1:(SHRLconst [31] x)) mem) + // match: (SETNEstore [off] {sym} ptr (TESTL z1:(SHRLconst [31] x) z2) mem) // cond: z1==z2 // result: (SETBstore [off] {sym} ptr (BTLconst [31] x) mem) for { @@ -46378,25 +31370,28 @@ func rewriteValueAMD64_OpAMD64SETNEstore_20(v *Value) bool { break } _ = v_1.Args[1] - z2 := v_1.Args[0] - z1 := v_1.Args[1] - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { - break - } - x := z1.Args[0] - if !(z1 == z2) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_1.Args[_i0] + if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { + continue + } + x := z1.Args[0] + z2 := v_1.Args[1^_i0] + if !(z1 == z2) { + continue + } + v.reset(OpAMD64SETBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) + v0.AuxInt = 31 + v0.AddArg(x) + v.AddArg(v0) + v.AddArg(mem) + return true } - v.reset(OpAMD64SETBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 31 - v0.AddArg(x) - v.AddArg(v0) - v.AddArg(mem) - return true + break } // match: (SETNEstore [off] {sym} ptr (InvertFlags x) mem) // result: (SETNEstore [off] {sym} ptr x mem) @@ -46553,6 +31548,11 @@ func rewriteValueAMD64_OpAMD64SETNEstore_20(v *Value) bool { v.AddArg(mem) return true } + return false +} +func rewriteValueAMD64_OpAMD64SETNEstore_20(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types // match: (SETNEstore [off] {sym} ptr (FlagGT_UGT) mem) // result: (MOVBstore [off] {sym} ptr (MOVLconst [1]) mem) for { @@ -48515,85 +33515,51 @@ func rewriteValueAMD64_OpAMD64TESTB_0(v *Value) bool { b := v.Block // match: (TESTB (MOVLconst [c]) x) // result: (TESTBconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVLconst { - break - } - c := v_0.AuxInt - v.reset(OpAMD64TESTBconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (TESTB x (MOVLconst [c])) - // result: (TESTBconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVLconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64MOVLconst { + continue + } + c := v_0.AuxInt + x := v.Args[1^_i0] + v.reset(OpAMD64TESTBconst) + v.AuxInt = c + v.AddArg(x) + return true } - c := v_1.AuxInt - v.reset(OpAMD64TESTBconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (TESTB l:(MOVBload {sym} [off] ptr mem) l2) // cond: l == l2 && l.Uses == 2 && validValAndOff(0,off) && clobber(l) // result: @l.Block (CMPBconstload {sym} [makeValAndOff(0,off)] ptr mem) - for { - l2 := v.Args[1] - l := v.Args[0] - if l.Op != OpAMD64MOVBload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(l == l2 && l.Uses == 2 && validValAndOff(0, off) && clobber(l)) { - break - } - b = l.Block - v0 := b.NewValue0(l.Pos, OpAMD64CMPBconstload, types.TypeFlags) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = makeValAndOff(0, off) - v0.Aux = sym - v0.AddArg(ptr) - v0.AddArg(mem) - return true - } - // match: (TESTB l2 l:(MOVBload {sym} [off] ptr mem)) - // cond: l == l2 && l.Uses == 2 && validValAndOff(0,off) && clobber(l) - // result: @l.Block (CMPBconstload {sym} [makeValAndOff(0,off)] ptr mem) for { _ = v.Args[1] - l2 := v.Args[0] - l := v.Args[1] - if l.Op != OpAMD64MOVBload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(l == l2 && l.Uses == 2 && validValAndOff(0, off) && clobber(l)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + l := v.Args[_i0] + if l.Op != OpAMD64MOVBload { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[1] + ptr := l.Args[0] + l2 := v.Args[1^_i0] + if !(l == l2 && l.Uses == 2 && validValAndOff(0, off) && clobber(l)) { + continue + } + b = l.Block + v0 := b.NewValue0(l.Pos, OpAMD64CMPBconstload, types.TypeFlags) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = makeValAndOff(0, off) + v0.Aux = sym + v0.AddArg(ptr) + v0.AddArg(mem) + return true } - b = l.Block - v0 := b.NewValue0(l.Pos, OpAMD64CMPBconstload, types.TypeFlags) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = makeValAndOff(0, off) - v0.Aux = sym - v0.AddArg(ptr) - v0.AddArg(mem) - return true + break } return false } @@ -48620,85 +33586,51 @@ func rewriteValueAMD64_OpAMD64TESTL_0(v *Value) bool { b := v.Block // match: (TESTL (MOVLconst [c]) x) // result: (TESTLconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVLconst { - break - } - c := v_0.AuxInt - v.reset(OpAMD64TESTLconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (TESTL x (MOVLconst [c])) - // result: (TESTLconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVLconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64MOVLconst { + continue + } + c := v_0.AuxInt + x := v.Args[1^_i0] + v.reset(OpAMD64TESTLconst) + v.AuxInt = c + v.AddArg(x) + return true } - c := v_1.AuxInt - v.reset(OpAMD64TESTLconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (TESTL l:(MOVLload {sym} [off] ptr mem) l2) // cond: l == l2 && l.Uses == 2 && validValAndOff(0,off) && clobber(l) // result: @l.Block (CMPLconstload {sym} [makeValAndOff(0,off)] ptr mem) - for { - l2 := v.Args[1] - l := v.Args[0] - if l.Op != OpAMD64MOVLload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(l == l2 && l.Uses == 2 && validValAndOff(0, off) && clobber(l)) { - break - } - b = l.Block - v0 := b.NewValue0(l.Pos, OpAMD64CMPLconstload, types.TypeFlags) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = makeValAndOff(0, off) - v0.Aux = sym - v0.AddArg(ptr) - v0.AddArg(mem) - return true - } - // match: (TESTL l2 l:(MOVLload {sym} [off] ptr mem)) - // cond: l == l2 && l.Uses == 2 && validValAndOff(0,off) && clobber(l) - // result: @l.Block (CMPLconstload {sym} [makeValAndOff(0,off)] ptr mem) for { _ = v.Args[1] - l2 := v.Args[0] - l := v.Args[1] - if l.Op != OpAMD64MOVLload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(l == l2 && l.Uses == 2 && validValAndOff(0, off) && clobber(l)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + l := v.Args[_i0] + if l.Op != OpAMD64MOVLload { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[1] + ptr := l.Args[0] + l2 := v.Args[1^_i0] + if !(l == l2 && l.Uses == 2 && validValAndOff(0, off) && clobber(l)) { + continue + } + b = l.Block + v0 := b.NewValue0(l.Pos, OpAMD64CMPLconstload, types.TypeFlags) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = makeValAndOff(0, off) + v0.Aux = sym + v0.AddArg(ptr) + v0.AddArg(mem) + return true } - b = l.Block - v0 := b.NewValue0(l.Pos, OpAMD64CMPLconstload, types.TypeFlags) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = makeValAndOff(0, off) - v0.Aux = sym - v0.AddArg(ptr) - v0.AddArg(mem) - return true + break } return false } @@ -48726,92 +33658,54 @@ func rewriteValueAMD64_OpAMD64TESTQ_0(v *Value) bool { // match: (TESTQ (MOVQconst [c]) x) // cond: is32Bit(c) // result: (TESTQconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVQconst { - break - } - c := v_0.AuxInt - if !(is32Bit(c)) { - break - } - v.reset(OpAMD64TESTQconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (TESTQ x (MOVQconst [c])) - // cond: is32Bit(c) - // result: (TESTQconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVQconst { - break - } - c := v_1.AuxInt - if !(is32Bit(c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64MOVQconst { + continue + } + c := v_0.AuxInt + x := v.Args[1^_i0] + if !(is32Bit(c)) { + continue + } + v.reset(OpAMD64TESTQconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpAMD64TESTQconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (TESTQ l:(MOVQload {sym} [off] ptr mem) l2) // cond: l == l2 && l.Uses == 2 && validValAndOff(0,off) && clobber(l) // result: @l.Block (CMPQconstload {sym} [makeValAndOff(0,off)] ptr mem) - for { - l2 := v.Args[1] - l := v.Args[0] - if l.Op != OpAMD64MOVQload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(l == l2 && l.Uses == 2 && validValAndOff(0, off) && clobber(l)) { - break - } - b = l.Block - v0 := b.NewValue0(l.Pos, OpAMD64CMPQconstload, types.TypeFlags) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = makeValAndOff(0, off) - v0.Aux = sym - v0.AddArg(ptr) - v0.AddArg(mem) - return true - } - // match: (TESTQ l2 l:(MOVQload {sym} [off] ptr mem)) - // cond: l == l2 && l.Uses == 2 && validValAndOff(0,off) && clobber(l) - // result: @l.Block (CMPQconstload {sym} [makeValAndOff(0,off)] ptr mem) for { _ = v.Args[1] - l2 := v.Args[0] - l := v.Args[1] - if l.Op != OpAMD64MOVQload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(l == l2 && l.Uses == 2 && validValAndOff(0, off) && clobber(l)) { - break - } - b = l.Block - v0 := b.NewValue0(l.Pos, OpAMD64CMPQconstload, types.TypeFlags) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = makeValAndOff(0, off) - v0.Aux = sym - v0.AddArg(ptr) - v0.AddArg(mem) - return true + for _i0 := 0; _i0 <= 1; _i0++ { + l := v.Args[_i0] + if l.Op != OpAMD64MOVQload { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[1] + ptr := l.Args[0] + l2 := v.Args[1^_i0] + if !(l == l2 && l.Uses == 2 && validValAndOff(0, off) && clobber(l)) { + continue + } + b = l.Block + v0 := b.NewValue0(l.Pos, OpAMD64CMPQconstload, types.TypeFlags) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = makeValAndOff(0, off) + v0.Aux = sym + v0.AddArg(ptr) + v0.AddArg(mem) + return true + } + break } return false } @@ -48838,85 +33732,51 @@ func rewriteValueAMD64_OpAMD64TESTW_0(v *Value) bool { b := v.Block // match: (TESTW (MOVLconst [c]) x) // result: (TESTWconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVLconst { - break - } - c := v_0.AuxInt - v.reset(OpAMD64TESTWconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (TESTW x (MOVLconst [c])) - // result: (TESTWconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVLconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64MOVLconst { + continue + } + c := v_0.AuxInt + x := v.Args[1^_i0] + v.reset(OpAMD64TESTWconst) + v.AuxInt = c + v.AddArg(x) + return true } - c := v_1.AuxInt - v.reset(OpAMD64TESTWconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (TESTW l:(MOVWload {sym} [off] ptr mem) l2) // cond: l == l2 && l.Uses == 2 && validValAndOff(0,off) && clobber(l) // result: @l.Block (CMPWconstload {sym} [makeValAndOff(0,off)] ptr mem) - for { - l2 := v.Args[1] - l := v.Args[0] - if l.Op != OpAMD64MOVWload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(l == l2 && l.Uses == 2 && validValAndOff(0, off) && clobber(l)) { - break - } - b = l.Block - v0 := b.NewValue0(l.Pos, OpAMD64CMPWconstload, types.TypeFlags) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = makeValAndOff(0, off) - v0.Aux = sym - v0.AddArg(ptr) - v0.AddArg(mem) - return true - } - // match: (TESTW l2 l:(MOVWload {sym} [off] ptr mem)) - // cond: l == l2 && l.Uses == 2 && validValAndOff(0,off) && clobber(l) - // result: @l.Block (CMPWconstload {sym} [makeValAndOff(0,off)] ptr mem) for { _ = v.Args[1] - l2 := v.Args[0] - l := v.Args[1] - if l.Op != OpAMD64MOVWload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(l == l2 && l.Uses == 2 && validValAndOff(0, off) && clobber(l)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + l := v.Args[_i0] + if l.Op != OpAMD64MOVWload { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[1] + ptr := l.Args[0] + l2 := v.Args[1^_i0] + if !(l == l2 && l.Uses == 2 && validValAndOff(0, off) && clobber(l)) { + continue + } + b = l.Block + v0 := b.NewValue0(l.Pos, OpAMD64CMPWconstload, types.TypeFlags) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = makeValAndOff(0, off) + v0.Aux = sym + v0.AddArg(ptr) + v0.AddArg(mem) + return true } - b = l.Block - v0 := b.NewValue0(l.Pos, OpAMD64CMPWconstload, types.TypeFlags) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = makeValAndOff(0, off) - v0.Aux = sym - v0.AddArg(ptr) - v0.AddArg(mem) - return true + break } return false } @@ -49106,154 +33966,92 @@ func rewriteValueAMD64_OpAMD64XCHGQ_0(v *Value) bool { func rewriteValueAMD64_OpAMD64XORL_0(v *Value) bool { // match: (XORL (SHLL (MOVLconst [1]) y) x) // result: (BTCL x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLL { - break - } - y := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64MOVLconst || v_0_0.AuxInt != 1 { - break - } - v.reset(OpAMD64BTCL) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (XORL x (SHLL (MOVLconst [1]) y)) - // result: (BTCL x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLL { - break - } - y := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64MOVLconst || v_1_0.AuxInt != 1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64SHLL { + continue + } + y := v_0.Args[1] + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpAMD64MOVLconst || v_0_0.AuxInt != 1 { + continue + } + x := v.Args[1^_i0] + v.reset(OpAMD64BTCL) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpAMD64BTCL) - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (XORL (MOVLconst [c]) x) // cond: isUint32PowerOfTwo(c) && uint64(c) >= 128 // result: (BTCLconst [log2uint32(c)] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVLconst { - break - } - c := v_0.AuxInt - if !(isUint32PowerOfTwo(c) && uint64(c) >= 128) { - break - } - v.reset(OpAMD64BTCLconst) - v.AuxInt = log2uint32(c) - v.AddArg(x) - return true - } - // match: (XORL x (MOVLconst [c])) - // cond: isUint32PowerOfTwo(c) && uint64(c) >= 128 - // result: (BTCLconst [log2uint32(c)] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVLconst { - break - } - c := v_1.AuxInt - if !(isUint32PowerOfTwo(c) && uint64(c) >= 128) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64MOVLconst { + continue + } + c := v_0.AuxInt + x := v.Args[1^_i0] + if !(isUint32PowerOfTwo(c) && uint64(c) >= 128) { + continue + } + v.reset(OpAMD64BTCLconst) + v.AuxInt = log2uint32(c) + v.AddArg(x) + return true } - v.reset(OpAMD64BTCLconst) - v.AuxInt = log2uint32(c) - v.AddArg(x) - return true + break } // match: (XORL x (MOVLconst [c])) // result: (XORLconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVLconst { - break - } - c := v_1.AuxInt - v.reset(OpAMD64XORLconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (XORL (MOVLconst [c]) x) - // result: (XORLconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVLconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64MOVLconst { + continue + } + c := v_1.AuxInt + v.reset(OpAMD64XORLconst) + v.AuxInt = c + v.AddArg(x) + return true } - c := v_0.AuxInt - v.reset(OpAMD64XORLconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (XORL (SHLLconst x [c]) (SHRLconst x [d])) // cond: d==32-c // result: (ROLLconst x [c]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLLconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHRLconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(d == 32-c) { - break - } - v.reset(OpAMD64ROLLconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (XORL (SHRLconst x [d]) (SHLLconst x [c])) - // cond: d==32-c - // result: (ROLLconst x [c]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHRLconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLLconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(d == 32-c) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64SHLLconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64SHRLconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(d == 32-c) { + continue + } + v.reset(OpAMD64ROLLconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpAMD64ROLLconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (XORL (SHLLconst x [c]) (SHRWconst x [d])) // cond: d==16-c && c < 16 && t.Size() == 2 @@ -49261,102 +34059,55 @@ func rewriteValueAMD64_OpAMD64XORL_0(v *Value) bool { for { t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLLconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHRWconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(d == 16-c && c < 16 && t.Size() == 2) { - break - } - v.reset(OpAMD64ROLWconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (XORL (SHRWconst x [d]) (SHLLconst x [c])) - // cond: d==16-c && c < 16 && t.Size() == 2 - // result: (ROLWconst x [c]) - for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHRWconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLLconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(d == 16-c && c < 16 && t.Size() == 2) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64SHLLconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64SHRWconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(d == 16-c && c < 16 && t.Size() == 2) { + continue + } + v.reset(OpAMD64ROLWconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpAMD64ROLWconst) - v.AuxInt = c - v.AddArg(x) - return true + break } - return false -} -func rewriteValueAMD64_OpAMD64XORL_10(v *Value) bool { // match: (XORL (SHLLconst x [c]) (SHRBconst x [d])) // cond: d==8-c && c < 8 && t.Size() == 1 // result: (ROLBconst x [c]) for { t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLLconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHRBconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(d == 8-c && c < 8 && t.Size() == 1) { - break - } - v.reset(OpAMD64ROLBconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (XORL (SHRBconst x [d]) (SHLLconst x [c])) - // cond: d==8-c && c < 8 && t.Size() == 1 - // result: (ROLBconst x [c]) - for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHRBconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLLconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(d == 8-c && c < 8 && t.Size() == 1) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64SHLLconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64SHRBconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(d == 8-c && c < 8 && t.Size() == 1) { + continue + } + v.reset(OpAMD64ROLBconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpAMD64ROLBconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (XORL x x) // result: (MOVLconst [0]) @@ -49374,49 +34125,28 @@ func rewriteValueAMD64_OpAMD64XORL_10(v *Value) bool { // result: (XORLload x [off] {sym} ptr mem) for { _ = v.Args[1] - x := v.Args[0] - l := v.Args[1] - if l.Op != OpAMD64MOVLload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break - } - v.reset(OpAMD64XORLload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (XORL l:(MOVLload [off] {sym} ptr mem) x) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (XORLload x [off] {sym} ptr mem) - for { - x := v.Args[1] - l := v.Args[0] - if l.Op != OpAMD64MOVLload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != OpAMD64MOVLload { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[1] + ptr := l.Args[0] + if !(canMergeLoadClobber(v, l, x) && clobber(l)) { + continue + } + v.reset(OpAMD64XORLload) + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - v.reset(OpAMD64XORLload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true + break } return false } @@ -49834,162 +34564,96 @@ func rewriteValueAMD64_OpAMD64XORLmodify_0(v *Value) bool { func rewriteValueAMD64_OpAMD64XORQ_0(v *Value) bool { // match: (XORQ (SHLQ (MOVQconst [1]) y) x) // result: (BTCQ x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLQ { - break - } - y := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64MOVQconst || v_0_0.AuxInt != 1 { - break - } - v.reset(OpAMD64BTCQ) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (XORQ x (SHLQ (MOVQconst [1]) y)) - // result: (BTCQ x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLQ { - break - } - y := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAMD64MOVQconst || v_1_0.AuxInt != 1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64SHLQ { + continue + } + y := v_0.Args[1] + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpAMD64MOVQconst || v_0_0.AuxInt != 1 { + continue + } + x := v.Args[1^_i0] + v.reset(OpAMD64BTCQ) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpAMD64BTCQ) - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (XORQ (MOVQconst [c]) x) // cond: isUint64PowerOfTwo(c) && uint64(c) >= 128 // result: (BTCQconst [log2(c)] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVQconst { - break - } - c := v_0.AuxInt - if !(isUint64PowerOfTwo(c) && uint64(c) >= 128) { - break - } - v.reset(OpAMD64BTCQconst) - v.AuxInt = log2(c) - v.AddArg(x) - return true - } - // match: (XORQ x (MOVQconst [c])) - // cond: isUint64PowerOfTwo(c) && uint64(c) >= 128 - // result: (BTCQconst [log2(c)] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVQconst { - break - } - c := v_1.AuxInt - if !(isUint64PowerOfTwo(c) && uint64(c) >= 128) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64MOVQconst { + continue + } + c := v_0.AuxInt + x := v.Args[1^_i0] + if !(isUint64PowerOfTwo(c) && uint64(c) >= 128) { + continue + } + v.reset(OpAMD64BTCQconst) + v.AuxInt = log2(c) + v.AddArg(x) + return true } - v.reset(OpAMD64BTCQconst) - v.AuxInt = log2(c) - v.AddArg(x) - return true + break } // match: (XORQ x (MOVQconst [c])) // cond: is32Bit(c) // result: (XORQconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64MOVQconst { - break - } - c := v_1.AuxInt - if !(is32Bit(c)) { - break - } - v.reset(OpAMD64XORQconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (XORQ (MOVQconst [c]) x) - // cond: is32Bit(c) - // result: (XORQconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64MOVQconst { - break - } - c := v_0.AuxInt - if !(is32Bit(c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64MOVQconst { + continue + } + c := v_1.AuxInt + if !(is32Bit(c)) { + continue + } + v.reset(OpAMD64XORQconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpAMD64XORQconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (XORQ (SHLQconst x [c]) (SHRQconst x [d])) // cond: d==64-c // result: (ROLQconst x [c]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHLQconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHRQconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(d == 64-c) { - break - } - v.reset(OpAMD64ROLQconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (XORQ (SHRQconst x [d]) (SHLQconst x [c])) - // cond: d==64-c - // result: (ROLQconst x [c]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAMD64SHRQconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAMD64SHLQconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(d == 64-c) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAMD64SHLQconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAMD64SHRQconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(d == 64-c) { + continue + } + v.reset(OpAMD64ROLQconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpAMD64ROLQconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (XORQ x x) // result: (MOVQconst [0]) @@ -50007,52 +34671,28 @@ func rewriteValueAMD64_OpAMD64XORQ_0(v *Value) bool { // result: (XORQload x [off] {sym} ptr mem) for { _ = v.Args[1] - x := v.Args[0] - l := v.Args[1] - if l.Op != OpAMD64MOVQload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break - } - v.reset(OpAMD64XORQload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueAMD64_OpAMD64XORQ_10(v *Value) bool { - // match: (XORQ l:(MOVQload [off] {sym} ptr mem) x) - // cond: canMergeLoadClobber(v, l, x) && clobber(l) - // result: (XORQload x [off] {sym} ptr mem) - for { - x := v.Args[1] - l := v.Args[0] - if l.Op != OpAMD64MOVQload { - break - } - off := l.AuxInt - sym := l.Aux - mem := l.Args[1] - ptr := l.Args[0] - if !(canMergeLoadClobber(v, l, x) && clobber(l)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != OpAMD64MOVQload { + continue + } + off := l.AuxInt + sym := l.Aux + mem := l.Args[1] + ptr := l.Args[0] + if !(canMergeLoadClobber(v, l, x) && clobber(l)) { + continue + } + v.reset(OpAMD64XORQload) + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - v.reset(OpAMD64XORQload) - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true + break } return false } @@ -58029,89 +42669,53 @@ func rewriteBlockAMD64(b *Block) bool { case BlockAMD64EQ: // match: (EQ (TESTL (SHLL (MOVLconst [1]) x) y)) // result: (UGE (BTL x y)) - for b.Controls[0].Op == OpAMD64TESTL { - v_0 := b.Controls[0] - y := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SHLL { - break - } - x := v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64MOVLconst || v_0_0_0.AuxInt != 1 { - break - } - b.Reset(BlockAMD64UGE) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTL, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true - } - // match: (EQ (TESTL y (SHLL (MOVLconst [1]) x))) - // result: (UGE (BTL x y)) for b.Controls[0].Op == OpAMD64TESTL { v_0 := b.Controls[0] _ = v_0.Args[1] - y := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SHLL { - break - } - x := v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpAMD64MOVLconst || v_0_1_0.AuxInt != 1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpAMD64SHLL { + continue + } + x := v_0_0.Args[1] + v_0_0_0 := v_0_0.Args[0] + if v_0_0_0.Op != OpAMD64MOVLconst || v_0_0_0.AuxInt != 1 { + continue + } + y := v_0.Args[1^_i0] + b.Reset(BlockAMD64UGE) + v0 := b.NewValue0(v_0.Pos, OpAMD64BTL, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockAMD64UGE) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTL, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (EQ (TESTQ (SHLQ (MOVQconst [1]) x) y)) // result: (UGE (BTQ x y)) - for b.Controls[0].Op == OpAMD64TESTQ { - v_0 := b.Controls[0] - y := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SHLQ { - break - } - x := v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64MOVQconst || v_0_0_0.AuxInt != 1 { - break - } - b.Reset(BlockAMD64UGE) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTQ, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true - } - // match: (EQ (TESTQ y (SHLQ (MOVQconst [1]) x))) - // result: (UGE (BTQ x y)) for b.Controls[0].Op == OpAMD64TESTQ { v_0 := b.Controls[0] _ = v_0.Args[1] - y := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SHLQ { - break - } - x := v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpAMD64MOVQconst || v_0_1_0.AuxInt != 1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpAMD64SHLQ { + continue + } + x := v_0_0.Args[1] + v_0_0_0 := v_0_0.Args[0] + if v_0_0_0.Op != OpAMD64MOVQconst || v_0_0_0.AuxInt != 1 { + continue + } + y := v_0.Args[1^_i0] + b.Reset(BlockAMD64UGE) + v0 := b.NewValue0(v_0.Pos, OpAMD64BTQ, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockAMD64UGE) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTQ, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (EQ (TESTLconst [c] x)) // cond: isUint32PowerOfTwo(c) @@ -58150,335 +42754,193 @@ func rewriteBlockAMD64(b *Block) bool { // match: (EQ (TESTQ (MOVQconst [c]) x)) // cond: isUint64PowerOfTwo(c) // result: (UGE (BTQconst [log2(c)] x)) - for b.Controls[0].Op == OpAMD64TESTQ { - v_0 := b.Controls[0] - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64MOVQconst { - break - } - c := v_0_0.AuxInt - if !(isUint64PowerOfTwo(c)) { - break - } - b.Reset(BlockAMD64UGE) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = log2(c) - v0.AddArg(x) - b.AddControl(v0) - return true - } - // match: (EQ (TESTQ x (MOVQconst [c]))) - // cond: isUint64PowerOfTwo(c) - // result: (UGE (BTQconst [log2(c)] x)) for b.Controls[0].Op == OpAMD64TESTQ { v_0 := b.Controls[0] _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64MOVQconst { - break - } - c := v_0_1.AuxInt - if !(isUint64PowerOfTwo(c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpAMD64MOVQconst { + continue + } + c := v_0_0.AuxInt + x := v_0.Args[1^_i0] + if !(isUint64PowerOfTwo(c)) { + continue + } + b.Reset(BlockAMD64UGE) + v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = log2(c) + v0.AddArg(x) + b.AddControl(v0) + return true } - b.Reset(BlockAMD64UGE) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = log2(c) - v0.AddArg(x) - b.AddControl(v0) - return true + break } // match: (EQ (TESTQ z1:(SHLQconst [63] (SHRQconst [63] x)) z2)) // cond: z1==z2 // result: (UGE (BTQconst [63] x)) - for b.Controls[0].Op == OpAMD64TESTQ { - v_0 := b.Controls[0] - z2 := v_0.Args[1] - z1 := v_0.Args[0] - if z1.Op != OpAMD64SHLQconst || z1.AuxInt != 63 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 63 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { - break - } - b.Reset(BlockAMD64UGE) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 - v0.AddArg(x) - b.AddControl(v0) - return true - } - // match: (EQ (TESTQ z2 z1:(SHLQconst [63] (SHRQconst [63] x)))) - // cond: z1==z2 - // result: (UGE (BTQconst [63] x)) for b.Controls[0].Op == OpAMD64TESTQ { v_0 := b.Controls[0] _ = v_0.Args[1] - z2 := v_0.Args[0] - z1 := v_0.Args[1] - if z1.Op != OpAMD64SHLQconst || z1.AuxInt != 63 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_0.Args[_i0] + if z1.Op != OpAMD64SHLQconst || z1.AuxInt != 63 { + continue + } + z1_0 := z1.Args[0] + if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 63 { + continue + } + x := z1_0.Args[0] + z2 := v_0.Args[1^_i0] + if !(z1 == z2) { + continue + } + b.Reset(BlockAMD64UGE) + v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = 63 + v0.AddArg(x) + b.AddControl(v0) + return true } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 63 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { - break - } - b.Reset(BlockAMD64UGE) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 - v0.AddArg(x) - b.AddControl(v0) - return true + break } // match: (EQ (TESTL z1:(SHLLconst [31] (SHRQconst [31] x)) z2)) // cond: z1==z2 // result: (UGE (BTQconst [31] x)) - for b.Controls[0].Op == OpAMD64TESTL { - v_0 := b.Controls[0] - z2 := v_0.Args[1] - z1 := v_0.Args[0] - if z1.Op != OpAMD64SHLLconst || z1.AuxInt != 31 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 31 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { - break - } - b.Reset(BlockAMD64UGE) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 31 - v0.AddArg(x) - b.AddControl(v0) - return true - } - // match: (EQ (TESTL z2 z1:(SHLLconst [31] (SHRQconst [31] x)))) - // cond: z1==z2 - // result: (UGE (BTQconst [31] x)) for b.Controls[0].Op == OpAMD64TESTL { v_0 := b.Controls[0] _ = v_0.Args[1] - z2 := v_0.Args[0] - z1 := v_0.Args[1] - if z1.Op != OpAMD64SHLLconst || z1.AuxInt != 31 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 31 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_0.Args[_i0] + if z1.Op != OpAMD64SHLLconst || z1.AuxInt != 31 { + continue + } + z1_0 := z1.Args[0] + if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 31 { + continue + } + x := z1_0.Args[0] + z2 := v_0.Args[1^_i0] + if !(z1 == z2) { + continue + } + b.Reset(BlockAMD64UGE) + v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = 31 + v0.AddArg(x) + b.AddControl(v0) + return true } - b.Reset(BlockAMD64UGE) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 31 - v0.AddArg(x) - b.AddControl(v0) - return true + break } // match: (EQ (TESTQ z1:(SHRQconst [63] (SHLQconst [63] x)) z2)) // cond: z1==z2 // result: (UGE (BTQconst [0] x)) - for b.Controls[0].Op == OpAMD64TESTQ { - v_0 := b.Controls[0] - z2 := v_0.Args[1] - z1 := v_0.Args[0] - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLQconst || z1_0.AuxInt != 63 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { - break - } - b.Reset(BlockAMD64UGE) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 0 - v0.AddArg(x) - b.AddControl(v0) - return true - } - // match: (EQ (TESTQ z2 z1:(SHRQconst [63] (SHLQconst [63] x)))) - // cond: z1==z2 - // result: (UGE (BTQconst [0] x)) for b.Controls[0].Op == OpAMD64TESTQ { v_0 := b.Controls[0] _ = v_0.Args[1] - z2 := v_0.Args[0] - z1 := v_0.Args[1] - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_0.Args[_i0] + if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { + continue + } + z1_0 := z1.Args[0] + if z1_0.Op != OpAMD64SHLQconst || z1_0.AuxInt != 63 { + continue + } + x := z1_0.Args[0] + z2 := v_0.Args[1^_i0] + if !(z1 == z2) { + continue + } + b.Reset(BlockAMD64UGE) + v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = 0 + v0.AddArg(x) + b.AddControl(v0) + return true } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLQconst || z1_0.AuxInt != 63 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { - break - } - b.Reset(BlockAMD64UGE) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 0 - v0.AddArg(x) - b.AddControl(v0) - return true + break } // match: (EQ (TESTL z1:(SHRLconst [31] (SHLLconst [31] x)) z2)) // cond: z1==z2 // result: (UGE (BTLconst [0] x)) - for b.Controls[0].Op == OpAMD64TESTL { - v_0 := b.Controls[0] - z2 := v_0.Args[1] - z1 := v_0.Args[0] - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLLconst || z1_0.AuxInt != 31 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { - break - } - b.Reset(BlockAMD64UGE) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 0 - v0.AddArg(x) - b.AddControl(v0) - return true - } - // match: (EQ (TESTL z2 z1:(SHRLconst [31] (SHLLconst [31] x)))) - // cond: z1==z2 - // result: (UGE (BTLconst [0] x)) for b.Controls[0].Op == OpAMD64TESTL { v_0 := b.Controls[0] _ = v_0.Args[1] - z2 := v_0.Args[0] - z1 := v_0.Args[1] - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_0.Args[_i0] + if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { + continue + } + z1_0 := z1.Args[0] + if z1_0.Op != OpAMD64SHLLconst || z1_0.AuxInt != 31 { + continue + } + x := z1_0.Args[0] + z2 := v_0.Args[1^_i0] + if !(z1 == z2) { + continue + } + b.Reset(BlockAMD64UGE) + v0 := b.NewValue0(v_0.Pos, OpAMD64BTLconst, types.TypeFlags) + v0.AuxInt = 0 + v0.AddArg(x) + b.AddControl(v0) + return true } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLLconst || z1_0.AuxInt != 31 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { - break - } - b.Reset(BlockAMD64UGE) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 0 - v0.AddArg(x) - b.AddControl(v0) - return true + break } // match: (EQ (TESTQ z1:(SHRQconst [63] x) z2)) // cond: z1==z2 // result: (UGE (BTQconst [63] x)) - for b.Controls[0].Op == OpAMD64TESTQ { - v_0 := b.Controls[0] - z2 := v_0.Args[1] - z1 := v_0.Args[0] - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { - break - } - x := z1.Args[0] - if !(z1 == z2) { - break - } - b.Reset(BlockAMD64UGE) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 - v0.AddArg(x) - b.AddControl(v0) - return true - } - // match: (EQ (TESTQ z2 z1:(SHRQconst [63] x))) - // cond: z1==z2 - // result: (UGE (BTQconst [63] x)) for b.Controls[0].Op == OpAMD64TESTQ { v_0 := b.Controls[0] _ = v_0.Args[1] - z2 := v_0.Args[0] - z1 := v_0.Args[1] - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { - break - } - x := z1.Args[0] - if !(z1 == z2) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_0.Args[_i0] + if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { + continue + } + x := z1.Args[0] + z2 := v_0.Args[1^_i0] + if !(z1 == z2) { + continue + } + b.Reset(BlockAMD64UGE) + v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = 63 + v0.AddArg(x) + b.AddControl(v0) + return true } - b.Reset(BlockAMD64UGE) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 - v0.AddArg(x) - b.AddControl(v0) - return true + break } // match: (EQ (TESTL z1:(SHRLconst [31] x) z2)) // cond: z1==z2 // result: (UGE (BTLconst [31] x)) - for b.Controls[0].Op == OpAMD64TESTL { - v_0 := b.Controls[0] - z2 := v_0.Args[1] - z1 := v_0.Args[0] - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { - break - } - x := z1.Args[0] - if !(z1 == z2) { - break - } - b.Reset(BlockAMD64UGE) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 31 - v0.AddArg(x) - b.AddControl(v0) - return true - } - // match: (EQ (TESTL z2 z1:(SHRLconst [31] x))) - // cond: z1==z2 - // result: (UGE (BTLconst [31] x)) for b.Controls[0].Op == OpAMD64TESTL { v_0 := b.Controls[0] _ = v_0.Args[1] - z2 := v_0.Args[0] - z1 := v_0.Args[1] - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_0.Args[_i0] + if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { + continue + } + x := z1.Args[0] + z2 := v_0.Args[1^_i0] + if !(z1 == z2) { + continue + } + b.Reset(BlockAMD64UGE) + v0 := b.NewValue0(v_0.Pos, OpAMD64BTLconst, types.TypeFlags) + v0.AuxInt = 31 + v0.AddArg(x) + b.AddControl(v0) + return true } - x := z1.Args[0] - if !(z1 == z2) { - break - } - b.Reset(BlockAMD64UGE) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 31 - v0.AddArg(x) - b.AddControl(v0) - return true + break } // match: (EQ (InvertFlags cmp) yes no) // result: (EQ cmp yes no) @@ -59041,89 +43503,53 @@ func rewriteBlockAMD64(b *Block) bool { } // match: (NE (TESTL (SHLL (MOVLconst [1]) x) y)) // result: (ULT (BTL x y)) - for b.Controls[0].Op == OpAMD64TESTL { - v_0 := b.Controls[0] - y := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SHLL { - break - } - x := v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64MOVLconst || v_0_0_0.AuxInt != 1 { - break - } - b.Reset(BlockAMD64ULT) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTL, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true - } - // match: (NE (TESTL y (SHLL (MOVLconst [1]) x))) - // result: (ULT (BTL x y)) for b.Controls[0].Op == OpAMD64TESTL { v_0 := b.Controls[0] _ = v_0.Args[1] - y := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SHLL { - break - } - x := v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpAMD64MOVLconst || v_0_1_0.AuxInt != 1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpAMD64SHLL { + continue + } + x := v_0_0.Args[1] + v_0_0_0 := v_0_0.Args[0] + if v_0_0_0.Op != OpAMD64MOVLconst || v_0_0_0.AuxInt != 1 { + continue + } + y := v_0.Args[1^_i0] + b.Reset(BlockAMD64ULT) + v0 := b.NewValue0(v_0.Pos, OpAMD64BTL, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockAMD64ULT) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTL, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (NE (TESTQ (SHLQ (MOVQconst [1]) x) y)) // result: (ULT (BTQ x y)) - for b.Controls[0].Op == OpAMD64TESTQ { - v_0 := b.Controls[0] - y := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64SHLQ { - break - } - x := v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64MOVQconst || v_0_0_0.AuxInt != 1 { - break - } - b.Reset(BlockAMD64ULT) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTQ, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true - } - // match: (NE (TESTQ y (SHLQ (MOVQconst [1]) x))) - // result: (ULT (BTQ x y)) for b.Controls[0].Op == OpAMD64TESTQ { v_0 := b.Controls[0] _ = v_0.Args[1] - y := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64SHLQ { - break - } - x := v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpAMD64MOVQconst || v_0_1_0.AuxInt != 1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpAMD64SHLQ { + continue + } + x := v_0_0.Args[1] + v_0_0_0 := v_0_0.Args[0] + if v_0_0_0.Op != OpAMD64MOVQconst || v_0_0_0.AuxInt != 1 { + continue + } + y := v_0.Args[1^_i0] + b.Reset(BlockAMD64ULT) + v0 := b.NewValue0(v_0.Pos, OpAMD64BTQ, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockAMD64ULT) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTQ, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (NE (TESTLconst [c] x)) // cond: isUint32PowerOfTwo(c) @@ -59162,335 +43588,193 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTQ (MOVQconst [c]) x)) // cond: isUint64PowerOfTwo(c) // result: (ULT (BTQconst [log2(c)] x)) - for b.Controls[0].Op == OpAMD64TESTQ { - v_0 := b.Controls[0] - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64MOVQconst { - break - } - c := v_0_0.AuxInt - if !(isUint64PowerOfTwo(c)) { - break - } - b.Reset(BlockAMD64ULT) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = log2(c) - v0.AddArg(x) - b.AddControl(v0) - return true - } - // match: (NE (TESTQ x (MOVQconst [c]))) - // cond: isUint64PowerOfTwo(c) - // result: (ULT (BTQconst [log2(c)] x)) for b.Controls[0].Op == OpAMD64TESTQ { v_0 := b.Controls[0] _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64MOVQconst { - break - } - c := v_0_1.AuxInt - if !(isUint64PowerOfTwo(c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpAMD64MOVQconst { + continue + } + c := v_0_0.AuxInt + x := v_0.Args[1^_i0] + if !(isUint64PowerOfTwo(c)) { + continue + } + b.Reset(BlockAMD64ULT) + v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = log2(c) + v0.AddArg(x) + b.AddControl(v0) + return true } - b.Reset(BlockAMD64ULT) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = log2(c) - v0.AddArg(x) - b.AddControl(v0) - return true + break } // match: (NE (TESTQ z1:(SHLQconst [63] (SHRQconst [63] x)) z2)) // cond: z1==z2 // result: (ULT (BTQconst [63] x)) - for b.Controls[0].Op == OpAMD64TESTQ { - v_0 := b.Controls[0] - z2 := v_0.Args[1] - z1 := v_0.Args[0] - if z1.Op != OpAMD64SHLQconst || z1.AuxInt != 63 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 63 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { - break - } - b.Reset(BlockAMD64ULT) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 - v0.AddArg(x) - b.AddControl(v0) - return true - } - // match: (NE (TESTQ z2 z1:(SHLQconst [63] (SHRQconst [63] x)))) - // cond: z1==z2 - // result: (ULT (BTQconst [63] x)) for b.Controls[0].Op == OpAMD64TESTQ { v_0 := b.Controls[0] _ = v_0.Args[1] - z2 := v_0.Args[0] - z1 := v_0.Args[1] - if z1.Op != OpAMD64SHLQconst || z1.AuxInt != 63 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_0.Args[_i0] + if z1.Op != OpAMD64SHLQconst || z1.AuxInt != 63 { + continue + } + z1_0 := z1.Args[0] + if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 63 { + continue + } + x := z1_0.Args[0] + z2 := v_0.Args[1^_i0] + if !(z1 == z2) { + continue + } + b.Reset(BlockAMD64ULT) + v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = 63 + v0.AddArg(x) + b.AddControl(v0) + return true } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 63 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { - break - } - b.Reset(BlockAMD64ULT) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 - v0.AddArg(x) - b.AddControl(v0) - return true + break } // match: (NE (TESTL z1:(SHLLconst [31] (SHRQconst [31] x)) z2)) // cond: z1==z2 // result: (ULT (BTQconst [31] x)) - for b.Controls[0].Op == OpAMD64TESTL { - v_0 := b.Controls[0] - z2 := v_0.Args[1] - z1 := v_0.Args[0] - if z1.Op != OpAMD64SHLLconst || z1.AuxInt != 31 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 31 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { - break - } - b.Reset(BlockAMD64ULT) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 31 - v0.AddArg(x) - b.AddControl(v0) - return true - } - // match: (NE (TESTL z2 z1:(SHLLconst [31] (SHRQconst [31] x)))) - // cond: z1==z2 - // result: (ULT (BTQconst [31] x)) for b.Controls[0].Op == OpAMD64TESTL { v_0 := b.Controls[0] _ = v_0.Args[1] - z2 := v_0.Args[0] - z1 := v_0.Args[1] - if z1.Op != OpAMD64SHLLconst || z1.AuxInt != 31 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 31 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_0.Args[_i0] + if z1.Op != OpAMD64SHLLconst || z1.AuxInt != 31 { + continue + } + z1_0 := z1.Args[0] + if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 31 { + continue + } + x := z1_0.Args[0] + z2 := v_0.Args[1^_i0] + if !(z1 == z2) { + continue + } + b.Reset(BlockAMD64ULT) + v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = 31 + v0.AddArg(x) + b.AddControl(v0) + return true } - b.Reset(BlockAMD64ULT) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 31 - v0.AddArg(x) - b.AddControl(v0) - return true + break } // match: (NE (TESTQ z1:(SHRQconst [63] (SHLQconst [63] x)) z2)) // cond: z1==z2 // result: (ULT (BTQconst [0] x)) - for b.Controls[0].Op == OpAMD64TESTQ { - v_0 := b.Controls[0] - z2 := v_0.Args[1] - z1 := v_0.Args[0] - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLQconst || z1_0.AuxInt != 63 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { - break - } - b.Reset(BlockAMD64ULT) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 0 - v0.AddArg(x) - b.AddControl(v0) - return true - } - // match: (NE (TESTQ z2 z1:(SHRQconst [63] (SHLQconst [63] x)))) - // cond: z1==z2 - // result: (ULT (BTQconst [0] x)) for b.Controls[0].Op == OpAMD64TESTQ { v_0 := b.Controls[0] _ = v_0.Args[1] - z2 := v_0.Args[0] - z1 := v_0.Args[1] - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_0.Args[_i0] + if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { + continue + } + z1_0 := z1.Args[0] + if z1_0.Op != OpAMD64SHLQconst || z1_0.AuxInt != 63 { + continue + } + x := z1_0.Args[0] + z2 := v_0.Args[1^_i0] + if !(z1 == z2) { + continue + } + b.Reset(BlockAMD64ULT) + v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = 0 + v0.AddArg(x) + b.AddControl(v0) + return true } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLQconst || z1_0.AuxInt != 63 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { - break - } - b.Reset(BlockAMD64ULT) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 0 - v0.AddArg(x) - b.AddControl(v0) - return true + break } // match: (NE (TESTL z1:(SHRLconst [31] (SHLLconst [31] x)) z2)) // cond: z1==z2 // result: (ULT (BTLconst [0] x)) - for b.Controls[0].Op == OpAMD64TESTL { - v_0 := b.Controls[0] - z2 := v_0.Args[1] - z1 := v_0.Args[0] - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { - break - } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLLconst || z1_0.AuxInt != 31 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { - break - } - b.Reset(BlockAMD64ULT) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 0 - v0.AddArg(x) - b.AddControl(v0) - return true - } - // match: (NE (TESTL z2 z1:(SHRLconst [31] (SHLLconst [31] x)))) - // cond: z1==z2 - // result: (ULT (BTLconst [0] x)) for b.Controls[0].Op == OpAMD64TESTL { v_0 := b.Controls[0] _ = v_0.Args[1] - z2 := v_0.Args[0] - z1 := v_0.Args[1] - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_0.Args[_i0] + if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { + continue + } + z1_0 := z1.Args[0] + if z1_0.Op != OpAMD64SHLLconst || z1_0.AuxInt != 31 { + continue + } + x := z1_0.Args[0] + z2 := v_0.Args[1^_i0] + if !(z1 == z2) { + continue + } + b.Reset(BlockAMD64ULT) + v0 := b.NewValue0(v_0.Pos, OpAMD64BTLconst, types.TypeFlags) + v0.AuxInt = 0 + v0.AddArg(x) + b.AddControl(v0) + return true } - z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLLconst || z1_0.AuxInt != 31 { - break - } - x := z1_0.Args[0] - if !(z1 == z2) { - break - } - b.Reset(BlockAMD64ULT) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 0 - v0.AddArg(x) - b.AddControl(v0) - return true + break } // match: (NE (TESTQ z1:(SHRQconst [63] x) z2)) // cond: z1==z2 // result: (ULT (BTQconst [63] x)) - for b.Controls[0].Op == OpAMD64TESTQ { - v_0 := b.Controls[0] - z2 := v_0.Args[1] - z1 := v_0.Args[0] - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { - break - } - x := z1.Args[0] - if !(z1 == z2) { - break - } - b.Reset(BlockAMD64ULT) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 - v0.AddArg(x) - b.AddControl(v0) - return true - } - // match: (NE (TESTQ z2 z1:(SHRQconst [63] x))) - // cond: z1==z2 - // result: (ULT (BTQconst [63] x)) for b.Controls[0].Op == OpAMD64TESTQ { v_0 := b.Controls[0] _ = v_0.Args[1] - z2 := v_0.Args[0] - z1 := v_0.Args[1] - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { - break - } - x := z1.Args[0] - if !(z1 == z2) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_0.Args[_i0] + if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { + continue + } + x := z1.Args[0] + z2 := v_0.Args[1^_i0] + if !(z1 == z2) { + continue + } + b.Reset(BlockAMD64ULT) + v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) + v0.AuxInt = 63 + v0.AddArg(x) + b.AddControl(v0) + return true } - b.Reset(BlockAMD64ULT) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 - v0.AddArg(x) - b.AddControl(v0) - return true + break } // match: (NE (TESTL z1:(SHRLconst [31] x) z2)) // cond: z1==z2 // result: (ULT (BTLconst [31] x)) - for b.Controls[0].Op == OpAMD64TESTL { - v_0 := b.Controls[0] - z2 := v_0.Args[1] - z1 := v_0.Args[0] - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { - break - } - x := z1.Args[0] - if !(z1 == z2) { - break - } - b.Reset(BlockAMD64ULT) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 31 - v0.AddArg(x) - b.AddControl(v0) - return true - } - // match: (NE (TESTL z2 z1:(SHRLconst [31] x))) - // cond: z1==z2 - // result: (ULT (BTLconst [31] x)) for b.Controls[0].Op == OpAMD64TESTL { v_0 := b.Controls[0] _ = v_0.Args[1] - z2 := v_0.Args[0] - z1 := v_0.Args[1] - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + z1 := v_0.Args[_i0] + if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { + continue + } + x := z1.Args[0] + z2 := v_0.Args[1^_i0] + if !(z1 == z2) { + continue + } + b.Reset(BlockAMD64ULT) + v0 := b.NewValue0(v_0.Pos, OpAMD64BTLconst, types.TypeFlags) + v0.AuxInt = 31 + v0.AddArg(x) + b.AddControl(v0) + return true } - x := z1.Args[0] - if !(z1 == z2) { - break - } - b.Reset(BlockAMD64ULT) - v0 := b.NewValue0(v_0.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 31 - v0.AddArg(x) - b.AddControl(v0) - return true + break } // match: (NE (TESTB (SETGF cmp) (SETGF cmp)) yes no) // result: (UGT cmp yes no) diff --git a/src/cmd/compile/internal/ssa/rewriteARM.go b/src/cmd/compile/internal/ssa/rewriteARM.go index 7bd34106fc..b392bad1b1 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM.go +++ b/src/cmd/compile/internal/ssa/rewriteARM.go @@ -9,7 +9,7 @@ import "cmd/compile/internal/types" func rewriteValueARM(v *Value) bool { switch v.Op { case OpARMADC: - return rewriteValueARM_OpARMADC_0(v) || rewriteValueARM_OpARMADC_10(v) + return rewriteValueARM_OpARMADC_0(v) case OpARMADCconst: return rewriteValueARM_OpARMADCconst_0(v) case OpARMADCshiftLL: @@ -25,13 +25,13 @@ func rewriteValueARM(v *Value) bool { case OpARMADCshiftRLreg: return rewriteValueARM_OpARMADCshiftRLreg_0(v) case OpARMADD: - return rewriteValueARM_OpARMADD_0(v) || rewriteValueARM_OpARMADD_10(v) + return rewriteValueARM_OpARMADD_0(v) case OpARMADDD: return rewriteValueARM_OpARMADDD_0(v) case OpARMADDF: return rewriteValueARM_OpARMADDF_0(v) case OpARMADDS: - return rewriteValueARM_OpARMADDS_0(v) || rewriteValueARM_OpARMADDS_10(v) + return rewriteValueARM_OpARMADDS_0(v) case OpARMADDSshiftLL: return rewriteValueARM_OpARMADDSshiftLL_0(v) case OpARMADDSshiftLLreg: @@ -59,7 +59,7 @@ func rewriteValueARM(v *Value) bool { case OpARMADDshiftRLreg: return rewriteValueARM_OpARMADDshiftRLreg_0(v) case OpARMAND: - return rewriteValueARM_OpARMAND_0(v) || rewriteValueARM_OpARMAND_10(v) || rewriteValueARM_OpARMAND_20(v) + return rewriteValueARM_OpARMAND_0(v) || rewriteValueARM_OpARMAND_10(v) case OpARMANDconst: return rewriteValueARM_OpARMANDconst_0(v) case OpARMANDshiftLL: @@ -95,7 +95,7 @@ func rewriteValueARM(v *Value) bool { case OpARMBICshiftRLreg: return rewriteValueARM_OpARMBICshiftRLreg_0(v) case OpARMCMN: - return rewriteValueARM_OpARMCMN_0(v) || rewriteValueARM_OpARMCMN_10(v) + return rewriteValueARM_OpARMCMN_0(v) case OpARMCMNconst: return rewriteValueARM_OpARMCMNconst_0(v) case OpARMCMNshiftLL: @@ -215,7 +215,7 @@ func rewriteValueARM(v *Value) bool { case OpARMMOVWstoreshiftRL: return rewriteValueARM_OpARMMOVWstoreshiftRL_0(v) case OpARMMUL: - return rewriteValueARM_OpARMMUL_0(v) || rewriteValueARM_OpARMMUL_10(v) || rewriteValueARM_OpARMMUL_20(v) + return rewriteValueARM_OpARMMUL_0(v) || rewriteValueARM_OpARMMUL_10(v) case OpARMMULA: return rewriteValueARM_OpARMMULA_0(v) || rewriteValueARM_OpARMMULA_10(v) || rewriteValueARM_OpARMMULA_20(v) case OpARMMULD: @@ -249,7 +249,7 @@ func rewriteValueARM(v *Value) bool { case OpARMNotEqual: return rewriteValueARM_OpARMNotEqual_0(v) case OpARMOR: - return rewriteValueARM_OpARMOR_0(v) || rewriteValueARM_OpARMOR_10(v) + return rewriteValueARM_OpARMOR_0(v) case OpARMORconst: return rewriteValueARM_OpARMORconst_0(v) case OpARMORshiftLL: @@ -371,7 +371,7 @@ func rewriteValueARM(v *Value) bool { case OpARMSUBshiftRLreg: return rewriteValueARM_OpARMSUBshiftRLreg_0(v) case OpARMTEQ: - return rewriteValueARM_OpARMTEQ_0(v) || rewriteValueARM_OpARMTEQ_10(v) + return rewriteValueARM_OpARMTEQ_0(v) case OpARMTEQconst: return rewriteValueARM_OpARMTEQconst_0(v) case OpARMTEQshiftLL: @@ -387,7 +387,7 @@ func rewriteValueARM(v *Value) bool { case OpARMTEQshiftRLreg: return rewriteValueARM_OpARMTEQshiftRLreg_0(v) case OpARMTST: - return rewriteValueARM_OpARMTST_0(v) || rewriteValueARM_OpARMTST_10(v) + return rewriteValueARM_OpARMTST_0(v) case OpARMTSTconst: return rewriteValueARM_OpARMTSTconst_0(v) case OpARMTSTshiftLL: @@ -403,7 +403,7 @@ func rewriteValueARM(v *Value) bool { case OpARMTSTshiftRLreg: return rewriteValueARM_OpARMTSTshiftRLreg_0(v) case OpARMXOR: - return rewriteValueARM_OpARMXOR_0(v) || rewriteValueARM_OpARMXOR_10(v) + return rewriteValueARM_OpARMXOR_0(v) case OpARMXORconst: return rewriteValueARM_OpARMXORconst_0(v) case OpARMXORshiftLL: @@ -844,252 +844,146 @@ func rewriteValueARM_OpARMADC_0(v *Value) bool { // result: (ADCconst [c] x flags) for { flags := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARMMOVWconst { - break - } - c := v_0.AuxInt - x := v.Args[1] - v.reset(OpARMADCconst) - v.AuxInt = c - v.AddArg(x) - v.AddArg(flags) - return true - } - // match: (ADC x (MOVWconst [c]) flags) - // result: (ADCconst [c] x flags) - for { - flags := v.Args[2] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMMOVWconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARMMOVWconst { + continue + } + c := v_0.AuxInt + x := v.Args[1^_i0] + v.reset(OpARMADCconst) + v.AuxInt = c + v.AddArg(x) + v.AddArg(flags) + return true } - c := v_1.AuxInt - v.reset(OpARMADCconst) - v.AuxInt = c - v.AddArg(x) - v.AddArg(flags) - return true + break } // match: (ADC x (SLLconst [c] y) flags) // result: (ADCshiftLL x y [c] flags) for { flags := v.Args[2] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSLLconst { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMADCshiftLL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - v.AddArg(flags) - return true - } - // match: (ADC (SLLconst [c] y) x flags) - // result: (ADCshiftLL x y [c] flags) - for { - flags := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARMSLLconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSLLconst { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMADCshiftLL) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + v.AddArg(flags) + return true } - c := v_0.AuxInt - y := v_0.Args[0] - x := v.Args[1] - v.reset(OpARMADCshiftLL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - v.AddArg(flags) - return true + break } // match: (ADC x (SRLconst [c] y) flags) // result: (ADCshiftRL x y [c] flags) for { flags := v.Args[2] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRLconst { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMADCshiftRL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - v.AddArg(flags) - return true - } - // match: (ADC (SRLconst [c] y) x flags) - // result: (ADCshiftRL x y [c] flags) - for { - flags := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARMSRLconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRLconst { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMADCshiftRL) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + v.AddArg(flags) + return true } - c := v_0.AuxInt - y := v_0.Args[0] - x := v.Args[1] - v.reset(OpARMADCshiftRL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - v.AddArg(flags) - return true + break } // match: (ADC x (SRAconst [c] y) flags) // result: (ADCshiftRA x y [c] flags) for { flags := v.Args[2] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRAconst { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMADCshiftRA) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - v.AddArg(flags) - return true - } - // match: (ADC (SRAconst [c] y) x flags) - // result: (ADCshiftRA x y [c] flags) - for { - flags := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARMSRAconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRAconst { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMADCshiftRA) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + v.AddArg(flags) + return true } - c := v_0.AuxInt - y := v_0.Args[0] - x := v.Args[1] - v.reset(OpARMADCshiftRA) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - v.AddArg(flags) - return true + break } // match: (ADC x (SLL y z) flags) // result: (ADCshiftLLreg x y z flags) for { flags := v.Args[2] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSLL { - break - } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpARMADCshiftLLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - v.AddArg(flags) - return true - } - // match: (ADC (SLL y z) x flags) - // result: (ADCshiftLLreg x y z flags) - for { - flags := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARMSLL { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSLL { + continue + } + z := v_1.Args[1] + y := v_1.Args[0] + v.reset(OpARMADCshiftLLreg) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + v.AddArg(flags) + return true } - z := v_0.Args[1] - y := v_0.Args[0] - x := v.Args[1] - v.reset(OpARMADCshiftLLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - v.AddArg(flags) - return true + break } - return false -} -func rewriteValueARM_OpARMADC_10(v *Value) bool { // match: (ADC x (SRL y z) flags) // result: (ADCshiftRLreg x y z flags) for { flags := v.Args[2] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRL { - break - } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpARMADCshiftRLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - v.AddArg(flags) - return true - } - // match: (ADC (SRL y z) x flags) - // result: (ADCshiftRLreg x y z flags) - for { - flags := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARMSRL { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRL { + continue + } + z := v_1.Args[1] + y := v_1.Args[0] + v.reset(OpARMADCshiftRLreg) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + v.AddArg(flags) + return true } - z := v_0.Args[1] - y := v_0.Args[0] - x := v.Args[1] - v.reset(OpARMADCshiftRLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - v.AddArg(flags) - return true + break } // match: (ADC x (SRA y z) flags) // result: (ADCshiftRAreg x y z flags) for { flags := v.Args[2] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRA { - break - } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpARMADCshiftRAreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - v.AddArg(flags) - return true - } - // match: (ADC (SRA y z) x flags) - // result: (ADCshiftRAreg x y z flags) - for { - flags := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARMSRA { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRA { + continue + } + z := v_1.Args[1] + y := v_1.Args[0] + v.reset(OpARMADCshiftRAreg) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + v.AddArg(flags) + return true } - z := v_0.Args[1] - y := v_0.Args[0] - x := v.Args[1] - v.reset(OpARMADCshiftRAreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - v.AddArg(flags) - return true + break } return false } @@ -1380,433 +1274,261 @@ func rewriteValueARM_OpARMADCshiftRLreg_0(v *Value) bool { return false } func rewriteValueARM_OpARMADD_0(v *Value) bool { + b := v.Block // match: (ADD x (MOVWconst [c])) // result: (ADDconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMMOVWconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMMOVWconst { + continue + } + c := v_1.AuxInt + v.reset(OpARMADDconst) + v.AuxInt = c + v.AddArg(x) + return true } - c := v_1.AuxInt - v.reset(OpARMADDconst) - v.AuxInt = c - v.AddArg(x) - return true + break } - // match: (ADD (MOVWconst [c]) x) - // result: (ADDconst [c] x) + // match: (ADD x (SLLconst [c] y)) + // result: (ADDshiftLL x y [c]) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMMOVWconst { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSLLconst { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMADDshiftLL) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true } - c := v_0.AuxInt - v.reset(OpARMADDconst) - v.AuxInt = c - v.AddArg(x) - return true + break } - // match: (ADD x (SLLconst [c] y)) - // result: (ADDshiftLL x y [c]) + // match: (ADD x (SRLconst [c] y)) + // result: (ADDshiftRL x y [c]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSLLconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRLconst { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMADDshiftRL) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMADDshiftLL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (ADD (SLLconst [c] y) x) - // result: (ADDshiftLL x y [c]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSLLconst { - break - } - c := v_0.AuxInt - y := v_0.Args[0] - v.reset(OpARMADDshiftLL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADD x (SRLconst [c] y)) - // result: (ADDshiftRL x y [c]) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRLconst { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMADDshiftRL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADD (SRLconst [c] y) x) - // result: (ADDshiftRL x y [c]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRLconst { - break - } - c := v_0.AuxInt - y := v_0.Args[0] - v.reset(OpARMADDshiftRL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADD x (SRAconst [c] y)) - // result: (ADDshiftRA x y [c]) + // match: (ADD x (SRAconst [c] y)) + // result: (ADDshiftRA x y [c]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRAconst { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMADDshiftRA) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADD (SRAconst [c] y) x) - // result: (ADDshiftRA x y [c]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRAconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRAconst { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMADDshiftRA) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true } - c := v_0.AuxInt - y := v_0.Args[0] - v.reset(OpARMADDshiftRA) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (ADD x (SLL y z)) // result: (ADDshiftLLreg x y z) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSLL { - break - } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpARMADDshiftLLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true - } - // match: (ADD (SLL y z) x) - // result: (ADDshiftLLreg x y z) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSLL { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSLL { + continue + } + z := v_1.Args[1] + y := v_1.Args[0] + v.reset(OpARMADDshiftLLreg) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + return true } - z := v_0.Args[1] - y := v_0.Args[0] - v.reset(OpARMADDshiftLLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } - return false -} -func rewriteValueARM_OpARMADD_10(v *Value) bool { - b := v.Block // match: (ADD x (SRL y z)) // result: (ADDshiftRLreg x y z) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRL { - break - } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpARMADDshiftRLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true - } - // match: (ADD (SRL y z) x) - // result: (ADDshiftRLreg x y z) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRL { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRL { + continue + } + z := v_1.Args[1] + y := v_1.Args[0] + v.reset(OpARMADDshiftRLreg) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + return true } - z := v_0.Args[1] - y := v_0.Args[0] - v.reset(OpARMADDshiftRLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } // match: (ADD x (SRA y z)) // result: (ADDshiftRAreg x y z) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRA { - break - } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpARMADDshiftRAreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true - } - // match: (ADD (SRA y z) x) - // result: (ADDshiftRAreg x y z) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRA { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRA { + continue + } + z := v_1.Args[1] + y := v_1.Args[0] + v.reset(OpARMADDshiftRAreg) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + return true } - z := v_0.Args[1] - y := v_0.Args[0] - v.reset(OpARMADDshiftRAreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } // match: (ADD x (RSBconst [0] y)) // result: (SUB x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMRSBconst || v_1.AuxInt != 0 { - break - } - y := v_1.Args[0] - v.reset(OpARMSUB) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADD (RSBconst [0] y) x) - // result: (SUB x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMRSBconst || v_0.AuxInt != 0 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMRSBconst || v_1.AuxInt != 0 { + continue + } + y := v_1.Args[0] + v.reset(OpARMSUB) + v.AddArg(x) + v.AddArg(y) + return true } - y := v_0.Args[0] - v.reset(OpARMSUB) - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (ADD (RSBconst [c] x) (RSBconst [d] y)) // result: (RSBconst [c+d] (ADD x y)) for { t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMRSBconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMRSBconst { - break - } - d := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMRSBconst) - v.AuxInt = c + d - v0 := b.NewValue0(v.Pos, OpARMADD, t) - v0.AddArg(x) - v0.AddArg(y) - v.AddArg(v0) - return true - } - // match: (ADD (RSBconst [d] y) (RSBconst [c] x)) - // result: (RSBconst [c+d] (ADD x y)) - for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMRSBconst { - break - } - d := v_0.AuxInt - y := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMRSBconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARMRSBconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMRSBconst { + continue + } + d := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMRSBconst) + v.AuxInt = c + d + v0 := b.NewValue0(v.Pos, OpARMADD, t) + v0.AddArg(x) + v0.AddArg(y) + v.AddArg(v0) + return true } - c := v_1.AuxInt - x := v_1.Args[0] - v.reset(OpARMRSBconst) - v.AuxInt = c + d - v0 := b.NewValue0(v.Pos, OpARMADD, t) - v0.AddArg(x) - v0.AddArg(y) - v.AddArg(v0) - return true + break } // match: (ADD (MUL x y) a) // result: (MULA x y a) - for { - a := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMMUL { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpARMMULA) - v.AddArg(x) - v.AddArg(y) - v.AddArg(a) - return true - } - // match: (ADD a (MUL x y)) - // result: (MULA x y a) for { _ = v.Args[1] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMMUL { - break - } - y := v_1.Args[1] - x := v_1.Args[0] - v.reset(OpARMMULA) - v.AddArg(x) - v.AddArg(y) - v.AddArg(a) - return true - } - return false -} -func rewriteValueARM_OpARMADDD_0(v *Value) bool { - // match: (ADDD a (MULD x y)) - // cond: a.Uses == 1 && objabi.GOARM >= 6 - // result: (MULAD a x y) - for { - _ = v.Args[1] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMMULD { - break - } - y := v_1.Args[1] - x := v_1.Args[0] - if !(a.Uses == 1 && objabi.GOARM >= 6) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARMMUL { + continue + } + y := v_0.Args[1] + x := v_0.Args[0] + a := v.Args[1^_i0] + v.reset(OpARMMULA) + v.AddArg(x) + v.AddArg(y) + v.AddArg(a) + return true } - v.reset(OpARMMULAD) - v.AddArg(a) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (ADDD (MULD x y) a) + return false +} +func rewriteValueARM_OpARMADDD_0(v *Value) bool { + // match: (ADDD a (MULD x y)) // cond: a.Uses == 1 && objabi.GOARM >= 6 // result: (MULAD a x y) for { - a := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMMULD { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - if !(a.Uses == 1 && objabi.GOARM >= 6) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + a := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMMULD { + continue + } + y := v_1.Args[1] + x := v_1.Args[0] + if !(a.Uses == 1 && objabi.GOARM >= 6) { + continue + } + v.reset(OpARMMULAD) + v.AddArg(a) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpARMMULAD) - v.AddArg(a) - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (ADDD a (NMULD x y)) // cond: a.Uses == 1 && objabi.GOARM >= 6 // result: (MULSD a x y) for { _ = v.Args[1] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMNMULD { - break - } - y := v_1.Args[1] - x := v_1.Args[0] - if !(a.Uses == 1 && objabi.GOARM >= 6) { - break - } - v.reset(OpARMMULSD) - v.AddArg(a) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADDD (NMULD x y) a) - // cond: a.Uses == 1 && objabi.GOARM >= 6 - // result: (MULSD a x y) - for { - a := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMNMULD { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - if !(a.Uses == 1 && objabi.GOARM >= 6) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + a := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMNMULD { + continue + } + y := v_1.Args[1] + x := v_1.Args[0] + if !(a.Uses == 1 && objabi.GOARM >= 6) { + continue + } + v.reset(OpARMMULSD) + v.AddArg(a) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpARMMULSD) - v.AddArg(a) - v.AddArg(x) - v.AddArg(y) - return true + break } return false } @@ -1816,82 +1538,48 @@ func rewriteValueARM_OpARMADDF_0(v *Value) bool { // result: (MULAF a x y) for { _ = v.Args[1] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMMULF { - break - } - y := v_1.Args[1] - x := v_1.Args[0] - if !(a.Uses == 1 && objabi.GOARM >= 6) { - break - } - v.reset(OpARMMULAF) - v.AddArg(a) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADDF (MULF x y) a) - // cond: a.Uses == 1 && objabi.GOARM >= 6 - // result: (MULAF a x y) - for { - a := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMMULF { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - if !(a.Uses == 1 && objabi.GOARM >= 6) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + a := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMMULF { + continue + } + y := v_1.Args[1] + x := v_1.Args[0] + if !(a.Uses == 1 && objabi.GOARM >= 6) { + continue + } + v.reset(OpARMMULAF) + v.AddArg(a) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpARMMULAF) - v.AddArg(a) - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (ADDF a (NMULF x y)) // cond: a.Uses == 1 && objabi.GOARM >= 6 // result: (MULSF a x y) for { _ = v.Args[1] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMNMULF { - break - } - y := v_1.Args[1] - x := v_1.Args[0] - if !(a.Uses == 1 && objabi.GOARM >= 6) { - break - } - v.reset(OpARMMULSF) - v.AddArg(a) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADDF (NMULF x y) a) - // cond: a.Uses == 1 && objabi.GOARM >= 6 - // result: (MULSF a x y) - for { - a := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMNMULF { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - if !(a.Uses == 1 && objabi.GOARM >= 6) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + a := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMNMULF { + continue + } + y := v_1.Args[1] + x := v_1.Args[0] + if !(a.Uses == 1 && objabi.GOARM >= 6) { + continue + } + v.reset(OpARMMULSF) + v.AddArg(a) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpARMMULSF) - v.AddArg(a) - v.AddArg(x) - v.AddArg(y) - return true + break } return false } @@ -1900,231 +1588,139 @@ func rewriteValueARM_OpARMADDS_0(v *Value) bool { // result: (ADDSconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMMOVWconst { - break - } - c := v_1.AuxInt - v.reset(OpARMADDSconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ADDS (MOVWconst [c]) x) - // result: (ADDSconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMMOVWconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMMOVWconst { + continue + } + c := v_1.AuxInt + v.reset(OpARMADDSconst) + v.AuxInt = c + v.AddArg(x) + return true } - c := v_0.AuxInt - v.reset(OpARMADDSconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (ADDS x (SLLconst [c] y)) // result: (ADDSshiftLL x y [c]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSLLconst { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMADDSshiftLL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADDS (SLLconst [c] y) x) - // result: (ADDSshiftLL x y [c]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSLLconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSLLconst { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMADDSshiftLL) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true } - c := v_0.AuxInt - y := v_0.Args[0] - v.reset(OpARMADDSshiftLL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (ADDS x (SRLconst [c] y)) // result: (ADDSshiftRL x y [c]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRLconst { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMADDSshiftRL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADDS (SRLconst [c] y) x) - // result: (ADDSshiftRL x y [c]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRLconst { - break - } - c := v_0.AuxInt - y := v_0.Args[0] - v.reset(OpARMADDSshiftRL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADDS x (SRAconst [c] y)) - // result: (ADDSshiftRA x y [c]) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRAconst { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMADDSshiftRA) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADDS (SRAconst [c] y) x) - // result: (ADDSshiftRA x y [c]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRAconst { - break - } - c := v_0.AuxInt - y := v_0.Args[0] - v.reset(OpARMADDSshiftRA) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADDS x (SLL y z)) - // result: (ADDSshiftLLreg x y z) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSLL { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRLconst { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMADDSshiftRL) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpARMADDSshiftLLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } - // match: (ADDS (SLL y z) x) - // result: (ADDSshiftLLreg x y z) + // match: (ADDS x (SRAconst [c] y)) + // result: (ADDSshiftRA x y [c]) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSLL { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRAconst { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMADDSshiftRA) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true } - z := v_0.Args[1] - y := v_0.Args[0] - v.reset(OpARMADDSshiftLLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } - return false -} -func rewriteValueARM_OpARMADDS_10(v *Value) bool { - // match: (ADDS x (SRL y z)) - // result: (ADDSshiftRLreg x y z) + // match: (ADDS x (SLL y z)) + // result: (ADDSshiftLLreg x y z) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRL { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSLL { + continue + } + z := v_1.Args[1] + y := v_1.Args[0] + v.reset(OpARMADDSshiftLLreg) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + return true } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpARMADDSshiftRLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } - // match: (ADDS (SRL y z) x) + // match: (ADDS x (SRL y z)) // result: (ADDSshiftRLreg x y z) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRL { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRL { + continue + } + z := v_1.Args[1] + y := v_1.Args[0] + v.reset(OpARMADDSshiftRLreg) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + return true } - z := v_0.Args[1] - y := v_0.Args[0] - v.reset(OpARMADDSshiftRLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } // match: (ADDS x (SRA y z)) // result: (ADDSshiftRAreg x y z) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRA { - break - } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpARMADDSshiftRAreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true - } - // match: (ADDS (SRA y z) x) - // result: (ADDSshiftRAreg x y z) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRA { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRA { + continue + } + z := v_1.Args[1] + y := v_1.Args[0] + v.reset(OpARMADDSshiftRAreg) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + return true } - z := v_0.Args[1] - y := v_0.Args[0] - v.reset(OpARMADDSshiftRAreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } return false } @@ -2777,231 +2373,139 @@ func rewriteValueARM_OpARMAND_0(v *Value) bool { // result: (ANDconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMMOVWconst { - break - } - c := v_1.AuxInt - v.reset(OpARMANDconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (AND (MOVWconst [c]) x) - // result: (ANDconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMMOVWconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMMOVWconst { + continue + } + c := v_1.AuxInt + v.reset(OpARMANDconst) + v.AuxInt = c + v.AddArg(x) + return true } - c := v_0.AuxInt - v.reset(OpARMANDconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (AND x (SLLconst [c] y)) // result: (ANDshiftLL x y [c]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSLLconst { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMANDshiftLL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (AND (SLLconst [c] y) x) - // result: (ANDshiftLL x y [c]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSLLconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSLLconst { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMANDshiftLL) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true } - c := v_0.AuxInt - y := v_0.Args[0] - v.reset(OpARMANDshiftLL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (AND x (SRLconst [c] y)) // result: (ANDshiftRL x y [c]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRLconst { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMANDshiftRL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (AND (SRLconst [c] y) x) - // result: (ANDshiftRL x y [c]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRLconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRLconst { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMANDshiftRL) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true } - c := v_0.AuxInt - y := v_0.Args[0] - v.reset(OpARMANDshiftRL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (AND x (SRAconst [c] y)) // result: (ANDshiftRA x y [c]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRAconst { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMANDshiftRA) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (AND (SRAconst [c] y) x) - // result: (ANDshiftRA x y [c]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRAconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRAconst { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMANDshiftRA) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true } - c := v_0.AuxInt - y := v_0.Args[0] - v.reset(OpARMANDshiftRA) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (AND x (SLL y z)) // result: (ANDshiftLLreg x y z) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSLL { - break - } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpARMANDshiftLLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true - } - // match: (AND (SLL y z) x) - // result: (ANDshiftLLreg x y z) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSLL { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSLL { + continue + } + z := v_1.Args[1] + y := v_1.Args[0] + v.reset(OpARMANDshiftLLreg) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + return true } - z := v_0.Args[1] - y := v_0.Args[0] - v.reset(OpARMANDshiftLLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } - return false -} -func rewriteValueARM_OpARMAND_10(v *Value) bool { // match: (AND x (SRL y z)) // result: (ANDshiftRLreg x y z) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRL { - break - } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpARMANDshiftRLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true - } - // match: (AND (SRL y z) x) - // result: (ANDshiftRLreg x y z) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRL { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRL { + continue + } + z := v_1.Args[1] + y := v_1.Args[0] + v.reset(OpARMANDshiftRLreg) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + return true } - z := v_0.Args[1] - y := v_0.Args[0] - v.reset(OpARMANDshiftRLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } // match: (AND x (SRA y z)) // result: (ANDshiftRAreg x y z) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRA { - break - } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpARMANDshiftRAreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true - } - // match: (AND (SRA y z) x) - // result: (ANDshiftRAreg x y z) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRA { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRA { + continue + } + z := v_1.Args[1] + y := v_1.Args[0] + v.reset(OpARMANDshiftRAreg) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + return true } - z := v_0.Args[1] - y := v_0.Args[0] - v.reset(OpARMANDshiftRAreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } // match: (AND x x) // result: x @@ -3019,132 +2523,82 @@ func rewriteValueARM_OpARMAND_10(v *Value) bool { // result: (BIC x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMMVN { - break - } - y := v_1.Args[0] - v.reset(OpARMBIC) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (AND (MVN y) x) - // result: (BIC x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMMVN { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMMVN { + continue + } + y := v_1.Args[0] + v.reset(OpARMBIC) + v.AddArg(x) + v.AddArg(y) + return true } - y := v_0.Args[0] - v.reset(OpARMBIC) - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (AND x (MVNshiftLL y [c])) // result: (BICshiftLL x y [c]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMMVNshiftLL { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMBICshiftLL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (AND (MVNshiftLL y [c]) x) - // result: (BICshiftLL x y [c]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMMVNshiftLL { - break - } - c := v_0.AuxInt - y := v_0.Args[0] - v.reset(OpARMBICshiftLL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (AND x (MVNshiftRL y [c])) - // result: (BICshiftRL x y [c]) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMMVNshiftRL { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMMVNshiftLL { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMBICshiftLL) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMBICshiftRL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true + break } return false } -func rewriteValueARM_OpARMAND_20(v *Value) bool { - // match: (AND (MVNshiftRL y [c]) x) +func rewriteValueARM_OpARMAND_10(v *Value) bool { + // match: (AND x (MVNshiftRL y [c])) // result: (BICshiftRL x y [c]) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMMVNshiftRL { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMMVNshiftRL { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMBICshiftRL) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true } - c := v_0.AuxInt - y := v_0.Args[0] - v.reset(OpARMBICshiftRL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (AND x (MVNshiftRA y [c])) // result: (BICshiftRA x y [c]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMMVNshiftRA { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMBICshiftRA) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (AND (MVNshiftRA y [c]) x) - // result: (BICshiftRA x y [c]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMMVNshiftRA { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMMVNshiftRA { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMBICshiftRA) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true } - c := v_0.AuxInt - y := v_0.Args[0] - v.reset(OpARMBICshiftRA) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true + break } return false } @@ -3947,260 +3401,157 @@ func rewriteValueARM_OpARMCMN_0(v *Value) bool { // result: (CMNconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMMOVWconst { - break - } - c := v_1.AuxInt - v.reset(OpARMCMNconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (CMN (MOVWconst [c]) x) - // result: (CMNconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMMOVWconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMMOVWconst { + continue + } + c := v_1.AuxInt + v.reset(OpARMCMNconst) + v.AuxInt = c + v.AddArg(x) + return true } - c := v_0.AuxInt - v.reset(OpARMCMNconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (CMN x (SLLconst [c] y)) // result: (CMNshiftLL x y [c]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSLLconst { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMCMNshiftLL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (CMN (SLLconst [c] y) x) - // result: (CMNshiftLL x y [c]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSLLconst { - break - } - c := v_0.AuxInt - y := v_0.Args[0] - v.reset(OpARMCMNshiftLL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (CMN x (SRLconst [c] y)) - // result: (CMNshiftRL x y [c]) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRLconst { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMCMNshiftRL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (CMN (SRLconst [c] y) x) - // result: (CMNshiftRL x y [c]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRLconst { - break - } - c := v_0.AuxInt - y := v_0.Args[0] - v.reset(OpARMCMNshiftRL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (CMN x (SRAconst [c] y)) - // result: (CMNshiftRA x y [c]) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRAconst { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMCMNshiftRA) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (CMN (SRAconst [c] y) x) - // result: (CMNshiftRA x y [c]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRAconst { - break - } - c := v_0.AuxInt - y := v_0.Args[0] - v.reset(OpARMCMNshiftRA) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (CMN x (SLL y z)) - // result: (CMNshiftLLreg x y z) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSLL { - break - } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpARMCMNshiftLLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true - } - // match: (CMN (SLL y z) x) - // result: (CMNshiftLLreg x y z) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSLL { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSLLconst { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMCMNshiftLL) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true } - z := v_0.Args[1] - y := v_0.Args[0] - v.reset(OpARMCMNshiftLLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } - return false -} -func rewriteValueARM_OpARMCMN_10(v *Value) bool { - // match: (CMN x (SRL y z)) - // result: (CMNshiftRLreg x y z) + // match: (CMN x (SRLconst [c] y)) + // result: (CMNshiftRL x y [c]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRL { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRLconst { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMCMNshiftRL) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpARMCMNshiftRLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } - // match: (CMN (SRL y z) x) - // result: (CMNshiftRLreg x y z) + // match: (CMN x (SRAconst [c] y)) + // result: (CMNshiftRA x y [c]) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRL { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRAconst { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMCMNshiftRA) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true } - z := v_0.Args[1] - y := v_0.Args[0] - v.reset(OpARMCMNshiftRLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } - // match: (CMN x (SRA y z)) - // result: (CMNshiftRAreg x y z) + // match: (CMN x (SLL y z)) + // result: (CMNshiftLLreg x y z) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRA { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSLL { + continue + } + z := v_1.Args[1] + y := v_1.Args[0] + v.reset(OpARMCMNshiftLLreg) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + return true } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpARMCMNshiftRAreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } - // match: (CMN (SRA y z) x) - // result: (CMNshiftRAreg x y z) + // match: (CMN x (SRL y z)) + // result: (CMNshiftRLreg x y z) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRA { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRL { + continue + } + z := v_1.Args[1] + y := v_1.Args[0] + v.reset(OpARMCMNshiftRLreg) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + return true } - z := v_0.Args[1] - y := v_0.Args[0] - v.reset(OpARMCMNshiftRAreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } - // match: (CMN x (RSBconst [0] y)) - // result: (CMP x y) + // match: (CMN x (SRA y z)) + // result: (CMNshiftRAreg x y z) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMRSBconst || v_1.AuxInt != 0 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRA { + continue + } + z := v_1.Args[1] + y := v_1.Args[0] + v.reset(OpARMCMNshiftRAreg) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + return true } - y := v_1.Args[0] - v.reset(OpARMCMP) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (CMN (RSBconst [0] y) x) + // match: (CMN x (RSBconst [0] y)) // result: (CMP x y) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMRSBconst || v_0.AuxInt != 0 { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMRSBconst || v_1.AuxInt != 0 { + continue + } + y := v_1.Args[0] + v.reset(OpARMCMP) + v.AddArg(x) + v.AddArg(y) + return true } - y := v_0.Args[0] - v.reset(OpARMCMP) - v.AddArg(x) - v.AddArg(y) - return true + break } return false } @@ -8661,441 +8012,266 @@ func rewriteValueARM_OpARMMOVWstoreshiftRL_0(v *Value) bool { } c := v_1.AuxInt val := v.Args[2] - v.reset(OpARMMOVWstore) - v.AuxInt = int64(uint32(c) >> uint64(d)) - v.AddArg(ptr) - v.AddArg(val) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueARM_OpARMMUL_0(v *Value) bool { - // match: (MUL x (MOVWconst [c])) - // cond: int32(c) == -1 - // result: (RSBconst [0] x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMMOVWconst { - break - } - c := v_1.AuxInt - if !(int32(c) == -1) { - break - } - v.reset(OpARMRSBconst) - v.AuxInt = 0 - v.AddArg(x) - return true - } - // match: (MUL (MOVWconst [c]) x) - // cond: int32(c) == -1 - // result: (RSBconst [0] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMMOVWconst { - break - } - c := v_0.AuxInt - if !(int32(c) == -1) { - break - } - v.reset(OpARMRSBconst) - v.AuxInt = 0 - v.AddArg(x) - return true - } - // match: (MUL _ (MOVWconst [0])) - // result: (MOVWconst [0]) - for { - _ = v.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpARMMOVWconst || v_1.AuxInt != 0 { - break - } - v.reset(OpARMMOVWconst) - v.AuxInt = 0 - return true - } - // match: (MUL (MOVWconst [0]) _) - // result: (MOVWconst [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMMOVWconst || v_0.AuxInt != 0 { - break - } - v.reset(OpARMMOVWconst) - v.AuxInt = 0 - return true - } - // match: (MUL x (MOVWconst [1])) - // result: x - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMMOVWconst || v_1.AuxInt != 1 { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (MUL (MOVWconst [1]) x) - // result: x - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMMOVWconst || v_0.AuxInt != 1 { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (MUL x (MOVWconst [c])) - // cond: isPowerOfTwo(c) - // result: (SLLconst [log2(c)] x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMMOVWconst { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c)) { - break - } - v.reset(OpARMSLLconst) - v.AuxInt = log2(c) - v.AddArg(x) - return true - } - // match: (MUL (MOVWconst [c]) x) - // cond: isPowerOfTwo(c) - // result: (SLLconst [log2(c)] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMMOVWconst { - break - } - c := v_0.AuxInt - if !(isPowerOfTwo(c)) { - break - } - v.reset(OpARMSLLconst) - v.AuxInt = log2(c) - v.AddArg(x) - return true - } - // match: (MUL x (MOVWconst [c])) - // cond: isPowerOfTwo(c-1) && int32(c) >= 3 - // result: (ADDshiftLL x x [log2(c-1)]) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMMOVWconst { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c-1) && int32(c) >= 3) { - break - } - v.reset(OpARMADDshiftLL) - v.AuxInt = log2(c - 1) - v.AddArg(x) - v.AddArg(x) - return true - } - // match: (MUL (MOVWconst [c]) x) - // cond: isPowerOfTwo(c-1) && int32(c) >= 3 - // result: (ADDshiftLL x x [log2(c-1)]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMMOVWconst { - break - } - c := v_0.AuxInt - if !(isPowerOfTwo(c-1) && int32(c) >= 3) { - break - } - v.reset(OpARMADDshiftLL) - v.AuxInt = log2(c - 1) - v.AddArg(x) - v.AddArg(x) + v.reset(OpARMMOVWstore) + v.AuxInt = int64(uint32(c) >> uint64(d)) + v.AddArg(ptr) + v.AddArg(val) + v.AddArg(mem) return true } return false } -func rewriteValueARM_OpARMMUL_10(v *Value) bool { +func rewriteValueARM_OpARMMUL_0(v *Value) bool { b := v.Block // match: (MUL x (MOVWconst [c])) - // cond: isPowerOfTwo(c+1) && int32(c) >= 7 - // result: (RSBshiftLL x x [log2(c+1)]) + // cond: int32(c) == -1 + // result: (RSBconst [0] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMMOVWconst { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c+1) && int32(c) >= 7) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMMOVWconst { + continue + } + c := v_1.AuxInt + if !(int32(c) == -1) { + continue + } + v.reset(OpARMRSBconst) + v.AuxInt = 0 + v.AddArg(x) + return true } - v.reset(OpARMRSBshiftLL) - v.AuxInt = log2(c + 1) - v.AddArg(x) - v.AddArg(x) - return true + break } - // match: (MUL (MOVWconst [c]) x) - // cond: isPowerOfTwo(c+1) && int32(c) >= 7 - // result: (RSBshiftLL x x [log2(c+1)]) + // match: (MUL _ (MOVWconst [0])) + // result: (MOVWconst [0]) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMMOVWconst { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMMOVWconst || v_1.AuxInt != 0 { + continue + } + v.reset(OpARMMOVWconst) + v.AuxInt = 0 + return true } - c := v_0.AuxInt - if !(isPowerOfTwo(c+1) && int32(c) >= 7) { - break + break + } + // match: (MUL x (MOVWconst [1])) + // result: x + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMMOVWconst || v_1.AuxInt != 1 { + continue + } + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - v.reset(OpARMRSBshiftLL) - v.AuxInt = log2(c + 1) - v.AddArg(x) - v.AddArg(x) - return true + break } // match: (MUL x (MOVWconst [c])) - // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) - // result: (SLLconst [log2(c/3)] (ADDshiftLL x x [1])) + // cond: isPowerOfTwo(c) + // result: (SLLconst [log2(c)] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMMOVWconst { - break - } - c := v_1.AuxInt - if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMMOVWconst { + continue + } + c := v_1.AuxInt + if !(isPowerOfTwo(c)) { + continue + } + v.reset(OpARMSLLconst) + v.AuxInt = log2(c) + v.AddArg(x) + return true } - v.reset(OpARMSLLconst) - v.AuxInt = log2(c / 3) - v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) - v0.AuxInt = 1 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (MUL (MOVWconst [c]) x) - // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) - // result: (SLLconst [log2(c/3)] (ADDshiftLL x x [1])) + // match: (MUL x (MOVWconst [c])) + // cond: isPowerOfTwo(c-1) && int32(c) >= 3 + // result: (ADDshiftLL x x [log2(c-1)]) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMMOVWconst { - break - } - c := v_0.AuxInt - if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMMOVWconst { + continue + } + c := v_1.AuxInt + if !(isPowerOfTwo(c-1) && int32(c) >= 3) { + continue + } + v.reset(OpARMADDshiftLL) + v.AuxInt = log2(c - 1) + v.AddArg(x) + v.AddArg(x) + return true } - v.reset(OpARMSLLconst) - v.AuxInt = log2(c / 3) - v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) - v0.AuxInt = 1 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true + break } // match: (MUL x (MOVWconst [c])) - // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) - // result: (SLLconst [log2(c/5)] (ADDshiftLL x x [2])) + // cond: isPowerOfTwo(c+1) && int32(c) >= 7 + // result: (RSBshiftLL x x [log2(c+1)]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMMOVWconst { - break - } - c := v_1.AuxInt - if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMMOVWconst { + continue + } + c := v_1.AuxInt + if !(isPowerOfTwo(c+1) && int32(c) >= 7) { + continue + } + v.reset(OpARMRSBshiftLL) + v.AuxInt = log2(c + 1) + v.AddArg(x) + v.AddArg(x) + return true } - v.reset(OpARMSLLconst) - v.AuxInt = log2(c / 5) - v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) - v0.AuxInt = 2 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (MUL (MOVWconst [c]) x) - // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) - // result: (SLLconst [log2(c/5)] (ADDshiftLL x x [2])) + // match: (MUL x (MOVWconst [c])) + // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) + // result: (SLLconst [log2(c/3)] (ADDshiftLL x x [1])) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMMOVWconst { - break - } - c := v_0.AuxInt - if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMMOVWconst { + continue + } + c := v_1.AuxInt + if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { + continue + } + v.reset(OpARMSLLconst) + v.AuxInt = log2(c / 3) + v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) + v0.AuxInt = 1 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) + return true } - v.reset(OpARMSLLconst) - v.AuxInt = log2(c / 5) - v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) - v0.AuxInt = 2 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true + break } // match: (MUL x (MOVWconst [c])) - // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) - // result: (SLLconst [log2(c/7)] (RSBshiftLL x x [3])) + // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) + // result: (SLLconst [log2(c/5)] (ADDshiftLL x x [2])) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMMOVWconst { - break - } - c := v_1.AuxInt - if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMMOVWconst { + continue + } + c := v_1.AuxInt + if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { + continue + } + v.reset(OpARMSLLconst) + v.AuxInt = log2(c / 5) + v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) + v0.AuxInt = 2 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) + return true } - v.reset(OpARMSLLconst) - v.AuxInt = log2(c / 7) - v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) - v0.AuxInt = 3 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (MUL (MOVWconst [c]) x) + // match: (MUL x (MOVWconst [c])) // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) // result: (SLLconst [log2(c/7)] (RSBshiftLL x x [3])) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMMOVWconst { - break - } - c := v_0.AuxInt - if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMMOVWconst { + continue + } + c := v_1.AuxInt + if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { + continue + } + v.reset(OpARMSLLconst) + v.AuxInt = log2(c / 7) + v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) + v0.AuxInt = 3 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) + return true } - v.reset(OpARMSLLconst) - v.AuxInt = log2(c / 7) - v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) - v0.AuxInt = 3 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true + break } // match: (MUL x (MOVWconst [c])) // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) // result: (SLLconst [log2(c/9)] (ADDshiftLL x x [3])) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMMOVWconst { - break - } - c := v_1.AuxInt - if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { - break - } - v.reset(OpARMSLLconst) - v.AuxInt = log2(c / 9) - v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) - v0.AuxInt = 3 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MUL (MOVWconst [c]) x) - // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) - // result: (SLLconst [log2(c/9)] (ADDshiftLL x x [3])) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMMOVWconst { - break - } - c := v_0.AuxInt - if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMMOVWconst { + continue + } + c := v_1.AuxInt + if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { + continue + } + v.reset(OpARMSLLconst) + v.AuxInt = log2(c / 9) + v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) + v0.AuxInt = 3 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) + return true } - v.reset(OpARMSLLconst) - v.AuxInt = log2(c / 9) - v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) - v0.AuxInt = 3 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true + break } return false } -func rewriteValueARM_OpARMMUL_20(v *Value) bool { +func rewriteValueARM_OpARMMUL_10(v *Value) bool { // match: (MUL (MOVWconst [c]) (MOVWconst [d])) // result: (MOVWconst [int64(int32(c*d))]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMMOVWconst { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpARMMOVWconst { - break - } - d := v_1.AuxInt - v.reset(OpARMMOVWconst) - v.AuxInt = int64(int32(c * d)) - return true - } - // match: (MUL (MOVWconst [d]) (MOVWconst [c])) - // result: (MOVWconst [int64(int32(c*d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMMOVWconst { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpARMMOVWconst { - break - } - c := v_1.AuxInt - v.reset(OpARMMOVWconst) - v.AuxInt = int64(int32(c * d)) - return true + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARMMOVWconst { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMMOVWconst { + continue + } + d := v_1.AuxInt + v.reset(OpARMMOVWconst) + v.AuxInt = int64(int32(c * d)) + return true + } + break } return false } @@ -9569,39 +8745,24 @@ func rewriteValueARM_OpARMMULD_0(v *Value) bool { // match: (MULD (NEGD x) y) // cond: objabi.GOARM >= 6 // result: (NMULD x y) - for { - y := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMNEGD { - break - } - x := v_0.Args[0] - if !(objabi.GOARM >= 6) { - break - } - v.reset(OpARMNMULD) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (MULD y (NEGD x)) - // cond: objabi.GOARM >= 6 - // result: (NMULD x y) for { _ = v.Args[1] - y := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMNEGD { - break - } - x := v_1.Args[0] - if !(objabi.GOARM >= 6) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARMNEGD { + continue + } + x := v_0.Args[0] + y := v.Args[1^_i0] + if !(objabi.GOARM >= 6) { + continue + } + v.reset(OpARMNMULD) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpARMNMULD) - v.AddArg(x) - v.AddArg(y) - return true + break } return false } @@ -9609,39 +8770,24 @@ func rewriteValueARM_OpARMMULF_0(v *Value) bool { // match: (MULF (NEGF x) y) // cond: objabi.GOARM >= 6 // result: (NMULF x y) - for { - y := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMNEGF { - break - } - x := v_0.Args[0] - if !(objabi.GOARM >= 6) { - break - } - v.reset(OpARMNMULF) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (MULF y (NEGF x)) - // cond: objabi.GOARM >= 6 - // result: (NMULF x y) for { _ = v.Args[1] - y := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMNEGF { - break - } - x := v_1.Args[0] - if !(objabi.GOARM >= 6) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARMNEGF { + continue + } + x := v_0.Args[0] + y := v.Args[1^_i0] + if !(objabi.GOARM >= 6) { + continue + } + v.reset(OpARMNMULF) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpARMNMULF) - v.AddArg(x) - v.AddArg(y) - return true + break } return false } @@ -10357,64 +9503,42 @@ func rewriteValueARM_OpARMNEGF_0(v *Value) bool { func rewriteValueARM_OpARMNMULD_0(v *Value) bool { // match: (NMULD (NEGD x) y) // result: (MULD x y) - for { - y := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMNEGD { - break - } - x := v_0.Args[0] - v.reset(OpARMMULD) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (NMULD y (NEGD x)) - // result: (MULD x y) for { _ = v.Args[1] - y := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMNEGD { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARMNEGD { + continue + } + x := v_0.Args[0] + y := v.Args[1^_i0] + v.reset(OpARMMULD) + v.AddArg(x) + v.AddArg(y) + return true } - x := v_1.Args[0] - v.reset(OpARMMULD) - v.AddArg(x) - v.AddArg(y) - return true + break } return false } func rewriteValueARM_OpARMNMULF_0(v *Value) bool { // match: (NMULF (NEGF x) y) // result: (MULF x y) - for { - y := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMNEGF { - break - } - x := v_0.Args[0] - v.reset(OpARMMULF) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (NMULF y (NEGF x)) - // result: (MULF x y) for { _ = v.Args[1] - y := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMNEGF { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARMNEGF { + continue + } + x := v_0.Args[0] + y := v.Args[1^_i0] + v.reset(OpARMMULF) + v.AddArg(x) + v.AddArg(y) + return true } - x := v_1.Args[0] - v.reset(OpARMMULF) - v.AddArg(x) - v.AddArg(y) - return true + break } return false } @@ -10478,246 +9602,154 @@ func rewriteValueARM_OpARMNotEqual_0(v *Value) bool { // result: (NotEqual x) for { v_0 := v.Args[0] - if v_0.Op != OpARMInvertFlags { - break - } - x := v_0.Args[0] - v.reset(OpARMNotEqual) - v.AddArg(x) - return true - } - return false -} -func rewriteValueARM_OpARMOR_0(v *Value) bool { - // match: (OR x (MOVWconst [c])) - // result: (ORconst [c] x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMMOVWconst { - break - } - c := v_1.AuxInt - v.reset(OpARMORconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (OR (MOVWconst [c]) x) - // result: (ORconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMMOVWconst { - break - } - c := v_0.AuxInt - v.reset(OpARMORconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (OR x (SLLconst [c] y)) - // result: (ORshiftLL x y [c]) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSLLconst { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMORshiftLL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (OR (SLLconst [c] y) x) - // result: (ORshiftLL x y [c]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSLLconst { - break - } - c := v_0.AuxInt - y := v_0.Args[0] - v.reset(OpARMORshiftLL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (OR x (SRLconst [c] y)) - // result: (ORshiftRL x y [c]) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRLconst { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMORshiftRL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (OR (SRLconst [c] y) x) - // result: (ORshiftRL x y [c]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRLconst { - break - } - c := v_0.AuxInt - y := v_0.Args[0] - v.reset(OpARMORshiftRL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (OR x (SRAconst [c] y)) - // result: (ORshiftRA x y [c]) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRAconst { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMORshiftRA) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (OR (SRAconst [c] y) x) - // result: (ORshiftRA x y [c]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRAconst { - break - } - c := v_0.AuxInt - y := v_0.Args[0] - v.reset(OpARMORshiftRA) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (OR x (SLL y z)) - // result: (ORshiftLLreg x y z) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSLL { - break - } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpARMORshiftLLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true - } - // match: (OR (SLL y z) x) - // result: (ORshiftLLreg x y z) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSLL { + if v_0.Op != OpARMInvertFlags { break } - z := v_0.Args[1] - y := v_0.Args[0] - v.reset(OpARMORshiftLLreg) + x := v_0.Args[0] + v.reset(OpARMNotEqual) v.AddArg(x) - v.AddArg(y) - v.AddArg(z) return true } return false } -func rewriteValueARM_OpARMOR_10(v *Value) bool { - // match: (OR x (SRL y z)) - // result: (ORshiftRLreg x y z) +func rewriteValueARM_OpARMOR_0(v *Value) bool { + // match: (OR x (MOVWconst [c])) + // result: (ORconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRL { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMMOVWconst { + continue + } + c := v_1.AuxInt + v.reset(OpARMORconst) + v.AuxInt = c + v.AddArg(x) + return true } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpARMORshiftRLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } - // match: (OR (SRL y z) x) - // result: (ORshiftRLreg x y z) + // match: (OR x (SLLconst [c] y)) + // result: (ORshiftLL x y [c]) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRL { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSLLconst { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMORshiftLL) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true } - z := v_0.Args[1] - y := v_0.Args[0] - v.reset(OpARMORshiftRLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } - // match: (OR x (SRA y z)) - // result: (ORshiftRAreg x y z) + // match: (OR x (SRLconst [c] y)) + // result: (ORshiftRL x y [c]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRA { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRLconst { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMORshiftRL) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpARMORshiftRAreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break + } + // match: (OR x (SRAconst [c] y)) + // result: (ORshiftRA x y [c]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRAconst { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMORshiftRA) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true + } + break + } + // match: (OR x (SLL y z)) + // result: (ORshiftLLreg x y z) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSLL { + continue + } + z := v_1.Args[1] + y := v_1.Args[0] + v.reset(OpARMORshiftLLreg) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + return true + } + break + } + // match: (OR x (SRL y z)) + // result: (ORshiftRLreg x y z) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRL { + continue + } + z := v_1.Args[1] + y := v_1.Args[0] + v.reset(OpARMORshiftRLreg) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + return true + } + break } - // match: (OR (SRA y z) x) + // match: (OR x (SRA y z)) // result: (ORshiftRAreg x y z) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRA { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRA { + continue + } + z := v_1.Args[1] + y := v_1.Args[0] + v.reset(OpARMORshiftRAreg) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + return true } - z := v_0.Args[1] - y := v_0.Args[0] - v.reset(OpARMORshiftRAreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } // match: (OR x x) // result: x @@ -10825,7 +9857,7 @@ func rewriteValueARM_OpARMORshiftLL_0(v *Value) bool { v.AddArg(x) return true } - // match: (ORshiftLL [c] (SRLconst x [32-c]) x) + // match: ( ORshiftLL [c] (SRLconst x [32-c]) x) // result: (SRRconst [32-c] x) for { c := v.AuxInt @@ -11068,7 +10100,7 @@ func rewriteValueARM_OpARMORshiftRL_0(v *Value) bool { v.AddArg(x) return true } - // match: (ORshiftRL [c] (SLLconst x [32-c]) x) + // match: ( ORshiftRL [c] (SLLconst x [32-c]) x) // result: (SRRconst [ c] x) for { c := v.AuxInt @@ -14225,250 +13257,158 @@ func rewriteValueARM_OpARMSUBshiftRLreg_0(v *Value) bool { for { _ = v.Args[2] x := v.Args[0] - y := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARMMOVWconst { - break - } - c := v_2.AuxInt - v.reset(OpARMSUBshiftRL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - return false -} -func rewriteValueARM_OpARMTEQ_0(v *Value) bool { - // match: (TEQ x (MOVWconst [c])) - // result: (TEQconst [c] x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMMOVWconst { - break - } - c := v_1.AuxInt - v.reset(OpARMTEQconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (TEQ (MOVWconst [c]) x) - // result: (TEQconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMMOVWconst { - break - } - c := v_0.AuxInt - v.reset(OpARMTEQconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (TEQ x (SLLconst [c] y)) - // result: (TEQshiftLL x y [c]) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSLLconst { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMTEQshiftLL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (TEQ (SLLconst [c] y) x) - // result: (TEQshiftLL x y [c]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSLLconst { - break - } - c := v_0.AuxInt - y := v_0.Args[0] - v.reset(OpARMTEQshiftLL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (TEQ x (SRLconst [c] y)) - // result: (TEQshiftRL x y [c]) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRLconst { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMTEQshiftRL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (TEQ (SRLconst [c] y) x) - // result: (TEQshiftRL x y [c]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRLconst { - break - } - c := v_0.AuxInt - y := v_0.Args[0] - v.reset(OpARMTEQshiftRL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (TEQ x (SRAconst [c] y)) - // result: (TEQshiftRA x y [c]) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRAconst { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMTEQshiftRA) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (TEQ (SRAconst [c] y) x) - // result: (TEQshiftRA x y [c]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRAconst { - break - } - c := v_0.AuxInt - y := v_0.Args[0] - v.reset(OpARMTEQshiftRA) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (TEQ x (SLL y z)) - // result: (TEQshiftLLreg x y z) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSLL { - break - } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpARMTEQshiftLLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true - } - // match: (TEQ (SLL y z) x) - // result: (TEQshiftLLreg x y z) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSLL { + y := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARMMOVWconst { break } - z := v_0.Args[1] - y := v_0.Args[0] - v.reset(OpARMTEQshiftLLreg) + c := v_2.AuxInt + v.reset(OpARMSUBshiftRL) + v.AuxInt = c v.AddArg(x) v.AddArg(y) - v.AddArg(z) return true } return false } -func rewriteValueARM_OpARMTEQ_10(v *Value) bool { - // match: (TEQ x (SRL y z)) - // result: (TEQshiftRLreg x y z) +func rewriteValueARM_OpARMTEQ_0(v *Value) bool { + // match: (TEQ x (MOVWconst [c])) + // result: (TEQconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRL { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMMOVWconst { + continue + } + c := v_1.AuxInt + v.reset(OpARMTEQconst) + v.AuxInt = c + v.AddArg(x) + return true } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpARMTEQshiftRLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } - // match: (TEQ (SRL y z) x) - // result: (TEQshiftRLreg x y z) + // match: (TEQ x (SLLconst [c] y)) + // result: (TEQshiftLL x y [c]) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRL { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSLLconst { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMTEQshiftLL) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true } - z := v_0.Args[1] - y := v_0.Args[0] - v.reset(OpARMTEQshiftRLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } - // match: (TEQ x (SRA y z)) - // result: (TEQshiftRAreg x y z) + // match: (TEQ x (SRLconst [c] y)) + // result: (TEQshiftRL x y [c]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRA { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRLconst { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMTEQshiftRL) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpARMTEQshiftRAreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break + } + // match: (TEQ x (SRAconst [c] y)) + // result: (TEQshiftRA x y [c]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRAconst { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMTEQshiftRA) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true + } + break + } + // match: (TEQ x (SLL y z)) + // result: (TEQshiftLLreg x y z) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSLL { + continue + } + z := v_1.Args[1] + y := v_1.Args[0] + v.reset(OpARMTEQshiftLLreg) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + return true + } + break + } + // match: (TEQ x (SRL y z)) + // result: (TEQshiftRLreg x y z) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRL { + continue + } + z := v_1.Args[1] + y := v_1.Args[0] + v.reset(OpARMTEQshiftRLreg) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + return true + } + break } - // match: (TEQ (SRA y z) x) + // match: (TEQ x (SRA y z)) // result: (TEQshiftRAreg x y z) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRA { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRA { + continue + } + z := v_1.Args[1] + y := v_1.Args[0] + v.reset(OpARMTEQshiftRAreg) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + return true } - z := v_0.Args[1] - y := v_0.Args[0] - v.reset(OpARMTEQshiftRAreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } return false } @@ -14740,250 +13680,158 @@ func rewriteValueARM_OpARMTEQshiftRLreg_0(v *Value) bool { for { _ = v.Args[2] x := v.Args[0] - y := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARMMOVWconst { - break - } - c := v_2.AuxInt - v.reset(OpARMTEQshiftRL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - return false -} -func rewriteValueARM_OpARMTST_0(v *Value) bool { - // match: (TST x (MOVWconst [c])) - // result: (TSTconst [c] x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMMOVWconst { - break - } - c := v_1.AuxInt - v.reset(OpARMTSTconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (TST (MOVWconst [c]) x) - // result: (TSTconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMMOVWconst { - break - } - c := v_0.AuxInt - v.reset(OpARMTSTconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (TST x (SLLconst [c] y)) - // result: (TSTshiftLL x y [c]) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSLLconst { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMTSTshiftLL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (TST (SLLconst [c] y) x) - // result: (TSTshiftLL x y [c]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSLLconst { - break - } - c := v_0.AuxInt - y := v_0.Args[0] - v.reset(OpARMTSTshiftLL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (TST x (SRLconst [c] y)) - // result: (TSTshiftRL x y [c]) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRLconst { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMTSTshiftRL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (TST (SRLconst [c] y) x) - // result: (TSTshiftRL x y [c]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRLconst { - break - } - c := v_0.AuxInt - y := v_0.Args[0] - v.reset(OpARMTSTshiftRL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (TST x (SRAconst [c] y)) - // result: (TSTshiftRA x y [c]) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRAconst { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMTSTshiftRA) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (TST (SRAconst [c] y) x) - // result: (TSTshiftRA x y [c]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRAconst { - break - } - c := v_0.AuxInt - y := v_0.Args[0] - v.reset(OpARMTSTshiftRA) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (TST x (SLL y z)) - // result: (TSTshiftLLreg x y z) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSLL { - break - } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpARMTSTshiftLLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true - } - // match: (TST (SLL y z) x) - // result: (TSTshiftLLreg x y z) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSLL { + y := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARMMOVWconst { break } - z := v_0.Args[1] - y := v_0.Args[0] - v.reset(OpARMTSTshiftLLreg) + c := v_2.AuxInt + v.reset(OpARMTEQshiftRL) + v.AuxInt = c v.AddArg(x) v.AddArg(y) - v.AddArg(z) return true } return false } -func rewriteValueARM_OpARMTST_10(v *Value) bool { - // match: (TST x (SRL y z)) - // result: (TSTshiftRLreg x y z) +func rewriteValueARM_OpARMTST_0(v *Value) bool { + // match: (TST x (MOVWconst [c])) + // result: (TSTconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRL { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMMOVWconst { + continue + } + c := v_1.AuxInt + v.reset(OpARMTSTconst) + v.AuxInt = c + v.AddArg(x) + return true } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpARMTSTshiftRLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } - // match: (TST (SRL y z) x) - // result: (TSTshiftRLreg x y z) + // match: (TST x (SLLconst [c] y)) + // result: (TSTshiftLL x y [c]) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRL { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSLLconst { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMTSTshiftLL) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true } - z := v_0.Args[1] - y := v_0.Args[0] - v.reset(OpARMTSTshiftRLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } - // match: (TST x (SRA y z)) - // result: (TSTshiftRAreg x y z) + // match: (TST x (SRLconst [c] y)) + // result: (TSTshiftRL x y [c]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRA { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRLconst { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMTSTshiftRL) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpARMTSTshiftRAreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break + } + // match: (TST x (SRAconst [c] y)) + // result: (TSTshiftRA x y [c]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRAconst { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMTSTshiftRA) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true + } + break + } + // match: (TST x (SLL y z)) + // result: (TSTshiftLLreg x y z) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSLL { + continue + } + z := v_1.Args[1] + y := v_1.Args[0] + v.reset(OpARMTSTshiftLLreg) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + return true + } + break + } + // match: (TST x (SRL y z)) + // result: (TSTshiftRLreg x y z) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRL { + continue + } + z := v_1.Args[1] + y := v_1.Args[0] + v.reset(OpARMTSTshiftRLreg) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + return true + } + break } - // match: (TST (SRA y z) x) + // match: (TST x (SRA y z)) // result: (TSTshiftRAreg x y z) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRA { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRA { + continue + } + z := v_1.Args[1] + y := v_1.Args[0] + v.reset(OpARMTSTshiftRAreg) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + return true } - z := v_0.Args[1] - y := v_0.Args[0] - v.reset(OpARMTSTshiftRAreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } return false } @@ -15274,264 +14122,159 @@ func rewriteValueARM_OpARMXOR_0(v *Value) bool { // result: (XORconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMMOVWconst { - break - } - c := v_1.AuxInt - v.reset(OpARMXORconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (XOR (MOVWconst [c]) x) - // result: (XORconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMMOVWconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMMOVWconst { + continue + } + c := v_1.AuxInt + v.reset(OpARMXORconst) + v.AuxInt = c + v.AddArg(x) + return true } - c := v_0.AuxInt - v.reset(OpARMXORconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (XOR x (SLLconst [c] y)) // result: (XORshiftLL x y [c]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSLLconst { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMXORshiftLL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (XOR (SLLconst [c] y) x) - // result: (XORshiftLL x y [c]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSLLconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSLLconst { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMXORshiftLL) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true } - c := v_0.AuxInt - y := v_0.Args[0] - v.reset(OpARMXORshiftLL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (XOR x (SRLconst [c] y)) // result: (XORshiftRL x y [c]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRLconst { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMXORshiftRL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (XOR (SRLconst [c] y) x) - // result: (XORshiftRL x y [c]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRLconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRLconst { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMXORshiftRL) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true } - c := v_0.AuxInt - y := v_0.Args[0] - v.reset(OpARMXORshiftRL) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (XOR x (SRAconst [c] y)) // result: (XORshiftRA x y [c]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRAconst { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMXORshiftRA) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (XOR (SRAconst [c] y) x) - // result: (XORshiftRA x y [c]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRAconst { - break - } - c := v_0.AuxInt - y := v_0.Args[0] - v.reset(OpARMXORshiftRA) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (XOR x (SRRconst [c] y)) - // result: (XORshiftRR x y [c]) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRRconst { - break - } - c := v_1.AuxInt - y := v_1.Args[0] - v.reset(OpARMXORshiftRR) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (XOR (SRRconst [c] y) x) - // result: (XORshiftRR x y [c]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRRconst { - break - } - c := v_0.AuxInt - y := v_0.Args[0] - v.reset(OpARMXORshiftRR) - v.AuxInt = c - v.AddArg(x) - v.AddArg(y) - return true - } - return false -} -func rewriteValueARM_OpARMXOR_10(v *Value) bool { - // match: (XOR x (SLL y z)) - // result: (XORshiftLLreg x y z) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSLL { - break - } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpARMXORshiftLLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true - } - // match: (XOR (SLL y z) x) - // result: (XORshiftLLreg x y z) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSLL { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRAconst { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMXORshiftRA) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true } - z := v_0.Args[1] - y := v_0.Args[0] - v.reset(OpARMXORshiftLLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } - // match: (XOR x (SRL y z)) - // result: (XORshiftRLreg x y z) + // match: (XOR x (SRRconst [c] y)) + // result: (XORshiftRR x y [c]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRL { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRRconst { + continue + } + c := v_1.AuxInt + y := v_1.Args[0] + v.reset(OpARMXORshiftRR) + v.AuxInt = c + v.AddArg(x) + v.AddArg(y) + return true } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpARMXORshiftRLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } - // match: (XOR (SRL y z) x) - // result: (XORshiftRLreg x y z) + // match: (XOR x (SLL y z)) + // result: (XORshiftLLreg x y z) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRL { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSLL { + continue + } + z := v_1.Args[1] + y := v_1.Args[0] + v.reset(OpARMXORshiftLLreg) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + return true } - z := v_0.Args[1] - y := v_0.Args[0] - v.reset(OpARMXORshiftRLreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } - // match: (XOR x (SRA y z)) - // result: (XORshiftRAreg x y z) + // match: (XOR x (SRL y z)) + // result: (XORshiftRLreg x y z) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARMSRA { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRL { + continue + } + z := v_1.Args[1] + y := v_1.Args[0] + v.reset(OpARMXORshiftRLreg) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + return true } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpARMXORshiftRAreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } - // match: (XOR (SRA y z) x) + // match: (XOR x (SRA y z)) // result: (XORshiftRAreg x y z) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARMSRA { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARMSRA { + continue + } + z := v_1.Args[1] + y := v_1.Args[0] + v.reset(OpARMXORshiftRAreg) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + return true } - z := v_0.Args[1] - y := v_0.Args[0] - v.reset(OpARMXORshiftRAreg) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } // match: (XOR x x) // result: (MOVWconst [0]) @@ -20696,17 +19439,21 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADD { break } - y := l.Args[1] - x := l.Args[0] - if !(l.Uses == 1) { - break + _ = l.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := l.Args[_i0] + y := l.Args[1^_i0] + if !(l.Uses == 1) { + continue + } + b.Reset(BlockARMEQ) + v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARMEQ) - v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (EQ (CMPconst [0] l:(MULA x y a)) yes no) // cond: l.Uses==1 @@ -20928,17 +19675,21 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMAND { break } - y := l.Args[1] - x := l.Args[0] - if !(l.Uses == 1) { - break + _ = l.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := l.Args[_i0] + y := l.Args[1^_i0] + if !(l.Uses == 1) { + continue + } + b.Reset(BlockARMEQ) + v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARMEQ) - v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (EQ (CMPconst [0] l:(ANDconst [c] x)) yes no) // cond: l.Uses==1 @@ -21132,17 +19883,21 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXOR { break } - y := l.Args[1] - x := l.Args[0] - if !(l.Uses == 1) { - break + _ = l.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := l.Args[_i0] + y := l.Args[1^_i0] + if !(l.Uses == 1) { + continue + } + b.Reset(BlockARMEQ) + v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARMEQ) - v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (EQ (CMPconst [0] l:(XORconst [c] x)) yes no) // cond: l.Uses==1 @@ -21610,17 +20365,21 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADD { break } - y := l.Args[1] - x := l.Args[0] - if !(l.Uses == 1) { - break + _ = l.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := l.Args[_i0] + y := l.Args[1^_i0] + if !(l.Uses == 1) { + continue + } + b.Reset(BlockARMGE) + v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARMGE) - v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (GE (CMPconst [0] l:(MULA x y a)) yes no) // cond: l.Uses==1 @@ -21842,17 +20601,21 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMAND { break } - y := l.Args[1] - x := l.Args[0] - if !(l.Uses == 1) { - break + _ = l.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := l.Args[_i0] + y := l.Args[1^_i0] + if !(l.Uses == 1) { + continue + } + b.Reset(BlockARMGE) + v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARMGE) - v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (GE (CMPconst [0] l:(ANDconst [c] x)) yes no) // cond: l.Uses==1 @@ -22046,17 +20809,21 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXOR { break } - y := l.Args[1] - x := l.Args[0] - if !(l.Uses == 1) { - break + _ = l.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := l.Args[_i0] + y := l.Args[1^_i0] + if !(l.Uses == 1) { + continue + } + b.Reset(BlockARMGE) + v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARMGE) - v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (GE (CMPconst [0] l:(XORconst [c] x)) yes no) // cond: l.Uses==1 @@ -22525,17 +21292,21 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADD { break } - y := l.Args[1] - x := l.Args[0] - if !(l.Uses == 1) { - break + _ = l.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := l.Args[_i0] + y := l.Args[1^_i0] + if !(l.Uses == 1) { + continue + } + b.Reset(BlockARMGT) + v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARMGT) - v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (GT (CMPconst [0] l:(ADDconst [c] x)) yes no) // cond: l.Uses==1 @@ -22729,17 +21500,21 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMAND { break } - y := l.Args[1] - x := l.Args[0] - if !(l.Uses == 1) { - break + _ = l.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := l.Args[_i0] + y := l.Args[1^_i0] + if !(l.Uses == 1) { + continue + } + b.Reset(BlockARMGT) + v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARMGT) - v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (GT (CMPconst [0] l:(MULA x y a)) yes no) // cond: l.Uses==1 @@ -22961,17 +21736,21 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXOR { break } - y := l.Args[1] - x := l.Args[0] - if !(l.Uses == 1) { - break + _ = l.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := l.Args[_i0] + y := l.Args[1^_i0] + if !(l.Uses == 1) { + continue + } + b.Reset(BlockARMGT) + v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARMGT) - v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (GT (CMPconst [0] l:(XORconst [c] x)) yes no) // cond: l.Uses==1 @@ -23541,17 +22320,21 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADD { break } - y := l.Args[1] - x := l.Args[0] - if !(l.Uses == 1) { - break + _ = l.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := l.Args[_i0] + y := l.Args[1^_i0] + if !(l.Uses == 1) { + continue + } + b.Reset(BlockARMLE) + v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARMLE) - v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (LE (CMPconst [0] l:(MULA x y a)) yes no) // cond: l.Uses==1 @@ -23773,17 +22556,21 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMAND { break } - y := l.Args[1] - x := l.Args[0] - if !(l.Uses == 1) { - break + _ = l.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := l.Args[_i0] + y := l.Args[1^_i0] + if !(l.Uses == 1) { + continue + } + b.Reset(BlockARMLE) + v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARMLE) - v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (LE (CMPconst [0] l:(ANDconst [c] x)) yes no) // cond: l.Uses==1 @@ -23977,17 +22764,21 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXOR { break } - y := l.Args[1] - x := l.Args[0] - if !(l.Uses == 1) { - break + _ = l.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := l.Args[_i0] + y := l.Args[1^_i0] + if !(l.Uses == 1) { + continue + } + b.Reset(BlockARMLE) + v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARMLE) - v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (LE (CMPconst [0] l:(XORconst [c] x)) yes no) // cond: l.Uses==1 @@ -24456,17 +23247,21 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADD { break } - y := l.Args[1] - x := l.Args[0] - if !(l.Uses == 1) { - break + _ = l.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := l.Args[_i0] + y := l.Args[1^_i0] + if !(l.Uses == 1) { + continue + } + b.Reset(BlockARMLT) + v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARMLT) - v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (LT (CMPconst [0] l:(MULA x y a)) yes no) // cond: l.Uses==1 @@ -24688,17 +23483,21 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMAND { break } - y := l.Args[1] - x := l.Args[0] - if !(l.Uses == 1) { - break + _ = l.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := l.Args[_i0] + y := l.Args[1^_i0] + if !(l.Uses == 1) { + continue + } + b.Reset(BlockARMLT) + v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARMLT) - v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (LT (CMPconst [0] l:(ANDconst [c] x)) yes no) // cond: l.Uses==1 @@ -24892,17 +23691,21 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXOR { break } - y := l.Args[1] - x := l.Args[0] - if !(l.Uses == 1) { - break + _ = l.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := l.Args[_i0] + y := l.Args[1^_i0] + if !(l.Uses == 1) { + continue + } + b.Reset(BlockARMLT) + v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARMLT) - v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (LT (CMPconst [0] l:(XORconst [c] x)) yes no) // cond: l.Uses==1 @@ -25529,17 +24332,21 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADD { break } - y := l.Args[1] - x := l.Args[0] - if !(l.Uses == 1) { - break + _ = l.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := l.Args[_i0] + y := l.Args[1^_i0] + if !(l.Uses == 1) { + continue + } + b.Reset(BlockARMNE) + v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARMNE) - v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (NE (CMPconst [0] l:(MULA x y a)) yes no) // cond: l.Uses==1 @@ -25761,17 +24568,21 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMAND { break } - y := l.Args[1] - x := l.Args[0] - if !(l.Uses == 1) { - break + _ = l.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := l.Args[_i0] + y := l.Args[1^_i0] + if !(l.Uses == 1) { + continue + } + b.Reset(BlockARMNE) + v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARMNE) - v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (NE (CMPconst [0] l:(ANDconst [c] x)) yes no) // cond: l.Uses==1 @@ -25965,17 +24776,21 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXOR { break } - y := l.Args[1] - x := l.Args[0] - if !(l.Uses == 1) { - break + _ = l.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := l.Args[_i0] + y := l.Args[1^_i0] + if !(l.Uses == 1) { + continue + } + b.Reset(BlockARMNE) + v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARMNE) - v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (NE (CMPconst [0] l:(XORconst [c] x)) yes no) // cond: l.Uses==1 diff --git a/src/cmd/compile/internal/ssa/rewriteARM64.go b/src/cmd/compile/internal/ssa/rewriteARM64.go index 485aee546a..7fab25a579 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM64.go +++ b/src/cmd/compile/internal/ssa/rewriteARM64.go @@ -10,7 +10,7 @@ func rewriteValueARM64(v *Value) bool { case OpARM64ADCSflags: return rewriteValueARM64_OpARM64ADCSflags_0(v) case OpARM64ADD: - return rewriteValueARM64_OpARM64ADD_0(v) || rewriteValueARM64_OpARM64ADD_10(v) || rewriteValueARM64_OpARM64ADD_20(v) + return rewriteValueARM64_OpARM64ADD_0(v) || rewriteValueARM64_OpARM64ADD_10(v) case OpARM64ADDconst: return rewriteValueARM64_OpARM64ADDconst_0(v) case OpARM64ADDshiftLL: @@ -20,7 +20,7 @@ func rewriteValueARM64(v *Value) bool { case OpARM64ADDshiftRL: return rewriteValueARM64_OpARM64ADDshiftRL_0(v) case OpARM64AND: - return rewriteValueARM64_OpARM64AND_0(v) || rewriteValueARM64_OpARM64AND_10(v) + return rewriteValueARM64_OpARM64AND_0(v) case OpARM64ANDconst: return rewriteValueARM64_OpARM64ANDconst_0(v) case OpARM64ANDshiftLL: @@ -156,9 +156,9 @@ func rewriteValueARM64(v *Value) bool { case OpARM64MADDW: return rewriteValueARM64_OpARM64MADDW_0(v) || rewriteValueARM64_OpARM64MADDW_10(v) || rewriteValueARM64_OpARM64MADDW_20(v) case OpARM64MNEG: - return rewriteValueARM64_OpARM64MNEG_0(v) || rewriteValueARM64_OpARM64MNEG_10(v) || rewriteValueARM64_OpARM64MNEG_20(v) + return rewriteValueARM64_OpARM64MNEG_0(v) || rewriteValueARM64_OpARM64MNEG_10(v) case OpARM64MNEGW: - return rewriteValueARM64_OpARM64MNEGW_0(v) || rewriteValueARM64_OpARM64MNEGW_10(v) || rewriteValueARM64_OpARM64MNEGW_20(v) + return rewriteValueARM64_OpARM64MNEGW_0(v) || rewriteValueARM64_OpARM64MNEGW_10(v) case OpARM64MOD: return rewriteValueARM64_OpARM64MOD_0(v) case OpARM64MODW: @@ -176,7 +176,7 @@ func rewriteValueARM64(v *Value) bool { case OpARM64MOVBreg: return rewriteValueARM64_OpARM64MOVBreg_0(v) case OpARM64MOVBstore: - return rewriteValueARM64_OpARM64MOVBstore_0(v) || rewriteValueARM64_OpARM64MOVBstore_10(v) || rewriteValueARM64_OpARM64MOVBstore_20(v) || rewriteValueARM64_OpARM64MOVBstore_30(v) || rewriteValueARM64_OpARM64MOVBstore_40(v) || rewriteValueARM64_OpARM64MOVBstore_50(v) + return rewriteValueARM64_OpARM64MOVBstore_0(v) || rewriteValueARM64_OpARM64MOVBstore_10(v) || rewriteValueARM64_OpARM64MOVBstore_20(v) || rewriteValueARM64_OpARM64MOVBstore_30(v) case OpARM64MOVBstoreidx: return rewriteValueARM64_OpARM64MOVBstoreidx_0(v) || rewriteValueARM64_OpARM64MOVBstoreidx_10(v) case OpARM64MOVBstorezero: @@ -266,9 +266,9 @@ func rewriteValueARM64(v *Value) bool { case OpARM64MSUBW: return rewriteValueARM64_OpARM64MSUBW_0(v) || rewriteValueARM64_OpARM64MSUBW_10(v) || rewriteValueARM64_OpARM64MSUBW_20(v) case OpARM64MUL: - return rewriteValueARM64_OpARM64MUL_0(v) || rewriteValueARM64_OpARM64MUL_10(v) || rewriteValueARM64_OpARM64MUL_20(v) + return rewriteValueARM64_OpARM64MUL_0(v) || rewriteValueARM64_OpARM64MUL_10(v) case OpARM64MULW: - return rewriteValueARM64_OpARM64MULW_0(v) || rewriteValueARM64_OpARM64MULW_10(v) || rewriteValueARM64_OpARM64MULW_20(v) + return rewriteValueARM64_OpARM64MULW_0(v) || rewriteValueARM64_OpARM64MULW_10(v) case OpARM64MVN: return rewriteValueARM64_OpARM64MVN_0(v) case OpARM64MVNshiftLL: @@ -288,7 +288,7 @@ func rewriteValueARM64(v *Value) bool { case OpARM64NotEqual: return rewriteValueARM64_OpARM64NotEqual_0(v) case OpARM64OR: - return rewriteValueARM64_OpARM64OR_0(v) || rewriteValueARM64_OpARM64OR_10(v) || rewriteValueARM64_OpARM64OR_20(v) || rewriteValueARM64_OpARM64OR_30(v) || rewriteValueARM64_OpARM64OR_40(v) || rewriteValueARM64_OpARM64OR_50(v) + return rewriteValueARM64_OpARM64OR_0(v) || rewriteValueARM64_OpARM64OR_10(v) || rewriteValueARM64_OpARM64OR_20(v) case OpARM64ORN: return rewriteValueARM64_OpARM64ORN_0(v) case OpARM64ORNshiftLL: @@ -300,7 +300,7 @@ func rewriteValueARM64(v *Value) bool { case OpARM64ORconst: return rewriteValueARM64_OpARM64ORconst_0(v) case OpARM64ORshiftLL: - return rewriteValueARM64_OpARM64ORshiftLL_0(v) || rewriteValueARM64_OpARM64ORshiftLL_10(v) || rewriteValueARM64_OpARM64ORshiftLL_20(v) || rewriteValueARM64_OpARM64ORshiftLL_30(v) + return rewriteValueARM64_OpARM64ORshiftLL_0(v) || rewriteValueARM64_OpARM64ORshiftLL_10(v) || rewriteValueARM64_OpARM64ORshiftLL_20(v) case OpARM64ORshiftRA: return rewriteValueARM64_OpARM64ORshiftRA_0(v) case OpARM64ORshiftRL: @@ -362,7 +362,7 @@ func rewriteValueARM64(v *Value) bool { case OpARM64UMODW: return rewriteValueARM64_OpARM64UMODW_0(v) case OpARM64XOR: - return rewriteValueARM64_OpARM64XOR_0(v) || rewriteValueARM64_OpARM64XOR_10(v) + return rewriteValueARM64_OpARM64XOR_0(v) case OpARM64XORconst: return rewriteValueARM64_OpARM64XORconst_0(v) case OpARM64XORshiftLL: @@ -1010,1001 +1010,1088 @@ func rewriteValueARM64_OpARM64ADCSflags_0(v *Value) bool { return false } func rewriteValueARM64_OpARM64ADD_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types // match: (ADD x (MOVDconst [c])) // result: (ADDconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - v.reset(OpARM64ADDconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ADD (MOVDconst [c]) x) - // result: (ADDconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + v.reset(OpARM64ADDconst) + v.AuxInt = c + v.AddArg(x) + return true } - c := v_0.AuxInt - v.reset(OpARM64ADDconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (ADD a l:(MUL x y)) // cond: l.Uses==1 && clobber(l) // result: (MADD a x y) for { _ = v.Args[1] - a := v.Args[0] - l := v.Args[1] - if l.Op != OpARM64MUL { - break - } - y := l.Args[1] - x := l.Args[0] - if !(l.Uses == 1 && clobber(l)) { - break - } - v.reset(OpARM64MADD) - v.AddArg(a) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADD l:(MUL x y) a) - // cond: l.Uses==1 && clobber(l) - // result: (MADD a x y) - for { - a := v.Args[1] - l := v.Args[0] - if l.Op != OpARM64MUL { - break - } - y := l.Args[1] - x := l.Args[0] - if !(l.Uses == 1 && clobber(l)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + a := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != OpARM64MUL { + continue + } + y := l.Args[1] + x := l.Args[0] + if !(l.Uses == 1 && clobber(l)) { + continue + } + v.reset(OpARM64MADD) + v.AddArg(a) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpARM64MADD) - v.AddArg(a) - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (ADD a l:(MNEG x y)) // cond: l.Uses==1 && clobber(l) // result: (MSUB a x y) for { _ = v.Args[1] - a := v.Args[0] - l := v.Args[1] - if l.Op != OpARM64MNEG { - break - } - y := l.Args[1] - x := l.Args[0] - if !(l.Uses == 1 && clobber(l)) { - break - } - v.reset(OpARM64MSUB) - v.AddArg(a) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADD l:(MNEG x y) a) - // cond: l.Uses==1 && clobber(l) - // result: (MSUB a x y) - for { - a := v.Args[1] - l := v.Args[0] - if l.Op != OpARM64MNEG { - break - } - y := l.Args[1] - x := l.Args[0] - if !(l.Uses == 1 && clobber(l)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + a := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != OpARM64MNEG { + continue + } + y := l.Args[1] + x := l.Args[0] + if !(l.Uses == 1 && clobber(l)) { + continue + } + v.reset(OpARM64MSUB) + v.AddArg(a) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpARM64MSUB) - v.AddArg(a) - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (ADD a l:(MULW x y)) // cond: a.Type.Size() != 8 && l.Uses==1 && clobber(l) // result: (MADDW a x y) for { _ = v.Args[1] - a := v.Args[0] - l := v.Args[1] - if l.Op != OpARM64MULW { - break - } - y := l.Args[1] - x := l.Args[0] - if !(a.Type.Size() != 8 && l.Uses == 1 && clobber(l)) { - break - } - v.reset(OpARM64MADDW) - v.AddArg(a) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADD l:(MULW x y) a) - // cond: a.Type.Size() != 8 && l.Uses==1 && clobber(l) - // result: (MADDW a x y) - for { - a := v.Args[1] - l := v.Args[0] - if l.Op != OpARM64MULW { - break - } - y := l.Args[1] - x := l.Args[0] - if !(a.Type.Size() != 8 && l.Uses == 1 && clobber(l)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + a := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != OpARM64MULW { + continue + } + y := l.Args[1] + x := l.Args[0] + if !(a.Type.Size() != 8 && l.Uses == 1 && clobber(l)) { + continue + } + v.reset(OpARM64MADDW) + v.AddArg(a) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpARM64MADDW) - v.AddArg(a) - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (ADD a l:(MNEGW x y)) // cond: a.Type.Size() != 8 && l.Uses==1 && clobber(l) // result: (MSUBW a x y) for { _ = v.Args[1] - a := v.Args[0] - l := v.Args[1] - if l.Op != OpARM64MNEGW { - break - } - y := l.Args[1] - x := l.Args[0] - if !(a.Type.Size() != 8 && l.Uses == 1 && clobber(l)) { - break - } - v.reset(OpARM64MSUBW) - v.AddArg(a) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADD l:(MNEGW x y) a) - // cond: a.Type.Size() != 8 && l.Uses==1 && clobber(l) - // result: (MSUBW a x y) - for { - a := v.Args[1] - l := v.Args[0] - if l.Op != OpARM64MNEGW { - break - } - y := l.Args[1] - x := l.Args[0] - if !(a.Type.Size() != 8 && l.Uses == 1 && clobber(l)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + a := v.Args[_i0] + l := v.Args[1^_i0] + if l.Op != OpARM64MNEGW { + continue + } + y := l.Args[1] + x := l.Args[0] + if !(a.Type.Size() != 8 && l.Uses == 1 && clobber(l)) { + continue + } + v.reset(OpARM64MSUBW) + v.AddArg(a) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpARM64MSUBW) - v.AddArg(a) - v.AddArg(x) - v.AddArg(y) - return true + break } - return false -} -func rewriteValueARM64_OpARM64ADD_10(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types // match: (ADD x (NEG y)) // result: (SUB x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64NEG { - break - } - y := v_1.Args[0] - v.reset(OpARM64SUB) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADD (NEG y) x) - // result: (SUB x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64NEG { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64NEG { + continue + } + y := v_1.Args[0] + v.reset(OpARM64SUB) + v.AddArg(x) + v.AddArg(y) + return true } - y := v_0.Args[0] - v.reset(OpARM64SUB) - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (ADD x0 x1:(SLLconst [c] y)) // cond: clobberIfDead(x1) // result: (ADDshiftLL x0 y [c]) for { _ = v.Args[1] - x0 := v.Args[0] - x1 := v.Args[1] - if x1.Op != OpARM64SLLconst { - break - } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { - break - } - v.reset(OpARM64ADDshiftLL) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) - return true - } - // match: (ADD x1:(SLLconst [c] y) x0) - // cond: clobberIfDead(x1) - // result: (ADDshiftLL x0 y [c]) - for { - x0 := v.Args[1] - x1 := v.Args[0] - if x1.Op != OpARM64SLLconst { - break - } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + x1 := v.Args[1^_i0] + if x1.Op != OpARM64SLLconst { + continue + } + c := x1.AuxInt + y := x1.Args[0] + if !(clobberIfDead(x1)) { + continue + } + v.reset(OpARM64ADDshiftLL) + v.AuxInt = c + v.AddArg(x0) + v.AddArg(y) + return true } - v.reset(OpARM64ADDshiftLL) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) - return true + break } // match: (ADD x0 x1:(SRLconst [c] y)) // cond: clobberIfDead(x1) // result: (ADDshiftRL x0 y [c]) for { _ = v.Args[1] - x0 := v.Args[0] - x1 := v.Args[1] - if x1.Op != OpARM64SRLconst { - break - } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + x1 := v.Args[1^_i0] + if x1.Op != OpARM64SRLconst { + continue + } + c := x1.AuxInt + y := x1.Args[0] + if !(clobberIfDead(x1)) { + continue + } + v.reset(OpARM64ADDshiftRL) + v.AuxInt = c + v.AddArg(x0) + v.AddArg(y) + return true } - v.reset(OpARM64ADDshiftRL) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) - return true + break } - // match: (ADD x1:(SRLconst [c] y) x0) + // match: (ADD x0 x1:(SRAconst [c] y)) // cond: clobberIfDead(x1) - // result: (ADDshiftRL x0 y [c]) + // result: (ADDshiftRA x0 y [c]) for { - x0 := v.Args[1] - x1 := v.Args[0] - if x1.Op != OpARM64SRLconst { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + x1 := v.Args[1^_i0] + if x1.Op != OpARM64SRAconst { + continue + } + c := x1.AuxInt + y := x1.Args[0] + if !(clobberIfDead(x1)) { + continue + } + v.reset(OpARM64ADDshiftRA) + v.AuxInt = c + v.AddArg(x0) + v.AddArg(y) + return true } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { - break + break + } + // match: (ADD (SLL x (ANDconst [63] y)) (CSEL0 {cc} (SRL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) + // cond: cc.(Op) == OpARM64LessThanU + // result: (ROR x (NEG y)) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARM64SLL { + continue + } + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpARM64ANDconst { + continue + } + t := v_0_1.Type + if v_0_1.AuxInt != 63 { + continue + } + y := v_0_1.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt64 { + continue + } + cc := v_1.Aux + _ = v_1.Args[1] + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpARM64SRL || v_1_0.Type != typ.UInt64 { + continue + } + _ = v_1_0.Args[1] + if x != v_1_0.Args[0] { + continue + } + v_1_0_1 := v_1_0.Args[1] + if v_1_0_1.Op != OpARM64SUB || v_1_0_1.Type != t { + continue + } + _ = v_1_0_1.Args[1] + v_1_0_1_0 := v_1_0_1.Args[0] + if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 64 { + continue + } + v_1_0_1_1 := v_1_0_1.Args[1] + if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 63 || y != v_1_0_1_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpARM64SUB || v_1_1_0.Type != t { + continue + } + _ = v_1_1_0.Args[1] + v_1_1_0_0 := v_1_1_0.Args[0] + if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 64 { + continue + } + v_1_1_0_1 := v_1_1_0.Args[1] + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + continue + } + v.reset(OpARM64ROR) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpARM64NEG, t) + v0.AddArg(y) + v.AddArg(v0) + return true } - v.reset(OpARM64ADDshiftRL) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) - return true + break } - // match: (ADD x0 x1:(SRAconst [c] y)) - // cond: clobberIfDead(x1) - // result: (ADDshiftRA x0 y [c]) + return false +} +func rewriteValueARM64_OpARM64ADD_10(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (ADD (SRL x (ANDconst [63] y)) (CSEL0 {cc} (SLL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) + // cond: cc.(Op) == OpARM64LessThanU + // result: (ROR x y) for { _ = v.Args[1] - x0 := v.Args[0] - x1 := v.Args[1] - if x1.Op != OpARM64SRAconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARM64SRL || v_0.Type != typ.UInt64 { + continue + } + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpARM64ANDconst { + continue + } + t := v_0_1.Type + if v_0_1.AuxInt != 63 { + continue + } + y := v_0_1.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt64 { + continue + } + cc := v_1.Aux + _ = v_1.Args[1] + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpARM64SLL { + continue + } + _ = v_1_0.Args[1] + if x != v_1_0.Args[0] { + continue + } + v_1_0_1 := v_1_0.Args[1] + if v_1_0_1.Op != OpARM64SUB || v_1_0_1.Type != t { + continue + } + _ = v_1_0_1.Args[1] + v_1_0_1_0 := v_1_0_1.Args[0] + if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 64 { + continue + } + v_1_0_1_1 := v_1_0_1.Args[1] + if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 63 || y != v_1_0_1_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpARM64SUB || v_1_1_0.Type != t { + continue + } + _ = v_1_1_0.Args[1] + v_1_1_0_0 := v_1_1_0.Args[0] + if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 64 { + continue + } + v_1_1_0_1 := v_1_1_0.Args[1] + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + continue + } + v.reset(OpARM64ROR) + v.AddArg(x) + v.AddArg(y) + return true } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { + break + } + // match: (ADD (SLL x (ANDconst [31] y)) (CSEL0 {cc} (SRL (MOVWUreg x) (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) + // cond: cc.(Op) == OpARM64LessThanU + // result: (RORW x (NEG y)) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARM64SLL { + continue + } + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpARM64ANDconst { + continue + } + t := v_0_1.Type + if v_0_1.AuxInt != 31 { + continue + } + y := v_0_1.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt32 { + continue + } + cc := v_1.Aux + _ = v_1.Args[1] + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpARM64SRL || v_1_0.Type != typ.UInt32 { + continue + } + _ = v_1_0.Args[1] + v_1_0_0 := v_1_0.Args[0] + if v_1_0_0.Op != OpARM64MOVWUreg || x != v_1_0_0.Args[0] { + continue + } + v_1_0_1 := v_1_0.Args[1] + if v_1_0_1.Op != OpARM64SUB || v_1_0_1.Type != t { + continue + } + _ = v_1_0_1.Args[1] + v_1_0_1_0 := v_1_0_1.Args[0] + if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 32 { + continue + } + v_1_0_1_1 := v_1_0_1.Args[1] + if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 31 || y != v_1_0_1_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpARM64SUB || v_1_1_0.Type != t { + continue + } + _ = v_1_1_0.Args[1] + v_1_1_0_0 := v_1_1_0.Args[0] + if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 32 { + continue + } + v_1_1_0_1 := v_1_1_0.Args[1] + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + continue + } + v.reset(OpARM64RORW) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpARM64NEG, t) + v0.AddArg(y) + v.AddArg(v0) + return true + } + break + } + // match: (ADD (SRL (MOVWUreg x) (ANDconst [31] y)) (CSEL0 {cc} (SLL x (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) + // cond: cc.(Op) == OpARM64LessThanU + // result: (RORW x y) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARM64SRL || v_0.Type != typ.UInt32 { + continue + } + _ = v_0.Args[1] + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpARM64MOVWUreg { + continue + } + x := v_0_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpARM64ANDconst { + continue + } + t := v_0_1.Type + if v_0_1.AuxInt != 31 { + continue + } + y := v_0_1.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt32 { + continue + } + cc := v_1.Aux + _ = v_1.Args[1] + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpARM64SLL { + continue + } + _ = v_1_0.Args[1] + if x != v_1_0.Args[0] { + continue + } + v_1_0_1 := v_1_0.Args[1] + if v_1_0_1.Op != OpARM64SUB || v_1_0_1.Type != t { + continue + } + _ = v_1_0_1.Args[1] + v_1_0_1_0 := v_1_0_1.Args[0] + if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 32 { + continue + } + v_1_0_1_1 := v_1_0_1.Args[1] + if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 31 || y != v_1_0_1_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpARM64SUB || v_1_1_0.Type != t { + continue + } + _ = v_1_1_0.Args[1] + v_1_1_0_0 := v_1_1_0.Args[0] + if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 32 { + continue + } + v_1_1_0_1 := v_1_1_0.Args[1] + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + continue + } + v.reset(OpARM64RORW) + v.AddArg(x) + v.AddArg(y) + return true + } + break + } + return false +} +func rewriteValueARM64_OpARM64ADDconst_0(v *Value) bool { + // match: (ADDconst [off1] (MOVDaddr [off2] {sym} ptr)) + // result: (MOVDaddr [off1+off2] {sym} ptr) + for { + off1 := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDaddr { break } - v.reset(OpARM64ADDshiftRA) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) + off2 := v_0.AuxInt + sym := v_0.Aux + ptr := v_0.Args[0] + v.reset(OpARM64MOVDaddr) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(ptr) return true } - // match: (ADD x1:(SRAconst [c] y) x0) - // cond: clobberIfDead(x1) - // result: (ADDshiftRA x0 y [c]) + // match: (ADDconst [0] x) + // result: x for { - x0 := v.Args[1] - x1 := v.Args[0] - if x1.Op != OpARM64SRAconst { + if v.AuxInt != 0 { break } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { + x := v.Args[0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + // match: (ADDconst [c] (MOVDconst [d])) + // result: (MOVDconst [c+d]) + for { + c := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - v.reset(OpARM64ADDshiftRA) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) + d := v_0.AuxInt + v.reset(OpARM64MOVDconst) + v.AuxInt = c + d return true } - // match: (ADD (SLL x (ANDconst [63] y)) (CSEL0 {cc} (SRL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) - // cond: cc.(Op) == OpARM64LessThanU - // result: (ROR x (NEG y)) + // match: (ADDconst [c] (ADDconst [d] x)) + // result: (ADDconst [c+d] x) for { - _ = v.Args[1] + c := v.AuxInt v_0 := v.Args[0] - if v_0.Op != OpARM64SLL { + if v_0.Op != OpARM64ADDconst { break } - _ = v_0.Args[1] + d := v_0.AuxInt x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpARM64ANDconst { + v.reset(OpARM64ADDconst) + v.AuxInt = c + d + v.AddArg(x) + return true + } + // match: (ADDconst [c] (SUBconst [d] x)) + // result: (ADDconst [c-d] x) + for { + c := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64SUBconst { break } - t := v_0_1.Type - if v_0_1.AuxInt != 63 { + d := v_0.AuxInt + x := v_0.Args[0] + v.reset(OpARM64ADDconst) + v.AuxInt = c - d + v.AddArg(x) + return true + } + return false +} +func rewriteValueARM64_OpARM64ADDshiftLL_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (ADDshiftLL (MOVDconst [c]) x [d]) + // result: (ADDconst [c] (SLLconst x [d])) + for { + d := v.AuxInt + x := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - y := v_0_1.Args[0] + c := v_0.AuxInt + v.reset(OpARM64ADDconst) + v.AuxInt = c + v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) + v0.AuxInt = d + v0.AddArg(x) + v.AddArg(v0) + return true + } + // match: (ADDshiftLL x (MOVDconst [c]) [d]) + // result: (ADDconst x [int64(uint64(c)< [c] (UBFX [bfc] x) x) + // cond: c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c) + // result: (RORWconst [32-c] x) + for { + t := v.Type + c := v.AuxInt + x := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64UBFX { break } - _ = v_1_0_1.Args[1] - v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 64 { + bfc := v_0.AuxInt + if x != v_0.Args[0] || !(c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c)) { break } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 63 || y != v_1_0_1_1.Args[0] { + v.reset(OpARM64RORWconst) + v.AuxInt = 32 - c + v.AddArg(x) + return true + } + // match: (ADDshiftLL [8] (UBFX [armBFAuxInt(8, 8)] x) x) + // result: (REV16W x) + for { + if v.Type != typ.UInt16 || v.AuxInt != 8 { break } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { + x := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64UBFX || v_0.Type != typ.UInt16 || v_0.AuxInt != armBFAuxInt(8, 8) || x != v_0.Args[0] { break } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpARM64SUB || v_1_1_0.Type != t { + v.reset(OpARM64REV16W) + v.AddArg(x) + return true + } + // match: (ADDshiftLL [c] (SRLconst x [64-c]) x2) + // result: (EXTRconst [64-c] x2 x) + for { + c := v.AuxInt + x2 := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64SRLconst || v_0.AuxInt != 64-c { break } - _ = v_1_1_0.Args[1] - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 64 { + x := v_0.Args[0] + v.reset(OpARM64EXTRconst) + v.AuxInt = 64 - c + v.AddArg(x2) + v.AddArg(x) + return true + } + // match: (ADDshiftLL [c] (UBFX [bfc] x) x2) + // cond: c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c) + // result: (EXTRWconst [32-c] x2 x) + for { + t := v.Type + c := v.AuxInt + x2 := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64UBFX { break } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + bfc := v_0.AuxInt + x := v_0.Args[0] + if !(c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c)) { break } - v.reset(OpARM64ROR) + v.reset(OpARM64EXTRWconst) + v.AuxInt = 32 - c + v.AddArg(x2) v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpARM64NEG, t) - v0.AddArg(y) - v.AddArg(v0) return true } - // match: (ADD (CSEL0 {cc} (SRL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y)))) (SLL x (ANDconst [63] y))) - // cond: cc.(Op) == OpARM64LessThanU - // result: (ROR x (NEG y)) + return false +} +func rewriteValueARM64_OpARM64ADDshiftRA_0(v *Value) bool { + b := v.Block + // match: (ADDshiftRA (MOVDconst [c]) x [d]) + // result: (ADDconst [c] (SRAconst x [d])) for { - _ = v.Args[1] + d := v.AuxInt + x := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64CSEL0 || v_0.Type != typ.UInt64 { - break - } - cc := v_0.Aux - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpARM64SRL || v_0_0.Type != typ.UInt64 { - break - } - _ = v_0_0.Args[1] - x := v_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpARM64SUB { - break - } - t := v_0_0_1.Type - _ = v_0_0_1.Args[1] - v_0_0_1_0 := v_0_0_1.Args[0] - if v_0_0_1_0.Op != OpARM64MOVDconst || v_0_0_1_0.AuxInt != 64 { - break - } - v_0_0_1_1 := v_0_0_1.Args[1] - if v_0_0_1_1.Op != OpARM64ANDconst || v_0_0_1_1.Type != t || v_0_0_1_1.AuxInt != 63 { - break - } - y := v_0_0_1_1.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpARM64CMPconst || v_0_1.AuxInt != 64 { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpARM64SUB || v_0_1_0.Type != t { - break - } - _ = v_0_1_0.Args[1] - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpARM64MOVDconst || v_0_1_0_0.AuxInt != 64 { - break - } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpARM64ANDconst || v_0_1_0_1.Type != t || v_0_1_0_1.AuxInt != 63 || y != v_0_1_0_1.Args[0] { + if v_0.Op != OpARM64MOVDconst { break } + c := v_0.AuxInt + v.reset(OpARM64ADDconst) + v.AuxInt = c + v0 := b.NewValue0(v.Pos, OpARM64SRAconst, x.Type) + v0.AuxInt = d + v0.AddArg(x) + v.AddArg(v0) + return true + } + // match: (ADDshiftRA x (MOVDconst [c]) [d]) + // result: (ADDconst x [c>>uint64(d)]) + for { + d := v.AuxInt + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64SLL { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64ANDconst || v_1_1.Type != t || v_1_1.AuxInt != 63 || y != v_1_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + if v_1.Op != OpARM64MOVDconst { break } - v.reset(OpARM64ROR) + c := v_1.AuxInt + v.reset(OpARM64ADDconst) + v.AuxInt = c >> uint64(d) v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpARM64NEG, t) - v0.AddArg(y) - v.AddArg(v0) return true } return false } -func rewriteValueARM64_OpARM64ADD_20(v *Value) bool { +func rewriteValueARM64_OpARM64ADDshiftRL_0(v *Value) bool { b := v.Block - typ := &b.Func.Config.Types - // match: (ADD (SRL x (ANDconst [63] y)) (CSEL0 {cc} (SLL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) - // cond: cc.(Op) == OpARM64LessThanU - // result: (ROR x y) + // match: (ADDshiftRL (MOVDconst [c]) x [d]) + // result: (ADDconst [c] (SRLconst x [d])) for { - _ = v.Args[1] + d := v.AuxInt + x := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64SRL || v_0.Type != typ.UInt64 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpARM64ANDconst { - break - } - t := v_0_1.Type - if v_0_1.AuxInt != 63 { + if v_0.Op != OpARM64MOVDconst { break } - y := v_0_1.Args[0] + c := v_0.AuxInt + v.reset(OpARM64ADDconst) + v.AuxInt = c + v0 := b.NewValue0(v.Pos, OpARM64SRLconst, x.Type) + v0.AuxInt = d + v0.AddArg(x) + v.AddArg(v0) + return true + } + // match: (ADDshiftRL x (MOVDconst [c]) [d]) + // result: (ADDconst x [int64(uint64(c)>>uint64(d))]) + for { + d := v.AuxInt + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt64 { - break - } - cc := v_1.Aux - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpARM64SLL { - break - } - _ = v_1_0.Args[1] - if x != v_1_0.Args[0] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpARM64SUB || v_1_0_1.Type != t { - break - } - _ = v_1_0_1.Args[1] - v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 64 { - break - } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 63 || y != v_1_0_1_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpARM64SUB || v_1_1_0.Type != t { - break - } - _ = v_1_1_0.Args[1] - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 64 { - break - } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + if v_1.Op != OpARM64MOVDconst { break } - v.reset(OpARM64ROR) + c := v_1.AuxInt + v.reset(OpARM64ADDconst) + v.AuxInt = int64(uint64(c) >> uint64(d)) v.AddArg(x) - v.AddArg(y) return true } - // match: (ADD (CSEL0 {cc} (SLL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y)))) (SRL x (ANDconst [63] y))) - // cond: cc.(Op) == OpARM64LessThanU - // result: (ROR x y) + // match: (ADDshiftRL [c] (SLLconst x [64-c]) x) + // result: (RORconst [ c] x) for { - _ = v.Args[1] + c := v.AuxInt + x := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64CSEL0 || v_0.Type != typ.UInt64 { - break - } - cc := v_0.Aux - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpARM64SLL { - break - } - _ = v_0_0.Args[1] - x := v_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpARM64SUB { - break - } - t := v_0_0_1.Type - _ = v_0_0_1.Args[1] - v_0_0_1_0 := v_0_0_1.Args[0] - if v_0_0_1_0.Op != OpARM64MOVDconst || v_0_0_1_0.AuxInt != 64 { - break - } - v_0_0_1_1 := v_0_0_1.Args[1] - if v_0_0_1_1.Op != OpARM64ANDconst || v_0_0_1_1.Type != t || v_0_0_1_1.AuxInt != 63 { - break - } - y := v_0_0_1_1.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpARM64CMPconst || v_0_1.AuxInt != 64 { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpARM64SUB || v_0_1_0.Type != t { - break - } - _ = v_0_1_0.Args[1] - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpARM64MOVDconst || v_0_1_0_0.AuxInt != 64 { - break - } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpARM64ANDconst || v_0_1_0_1.Type != t || v_0_1_0_1.AuxInt != 63 || y != v_0_1_0_1.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpARM64SRL || v_1.Type != typ.UInt64 { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64ANDconst || v_1_1.Type != t || v_1_1.AuxInt != 63 || y != v_1_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 64-c || x != v_0.Args[0] { break } - v.reset(OpARM64ROR) + v.reset(OpARM64RORconst) + v.AuxInt = c v.AddArg(x) - v.AddArg(y) return true } - // match: (ADD (SLL x (ANDconst [31] y)) (CSEL0 {cc} (SRL (MOVWUreg x) (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) - // cond: cc.(Op) == OpARM64LessThanU - // result: (RORW x (NEG y)) + // match: (ADDshiftRL [c] (SLLconst x [32-c]) (MOVWUreg x)) + // cond: c < 32 && t.Size() == 4 + // result: (RORWconst [c] x) for { + t := v.Type + c := v.AuxInt _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64SLL { + if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 32-c { break } - _ = v_0.Args[1] x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpARM64ANDconst { - break - } - t := v_0_1.Type - if v_0_1.AuxInt != 31 { - break - } - y := v_0_1.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt32 { - break - } - cc := v_1.Aux - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpARM64SRL || v_1_0.Type != typ.UInt32 { + if v_1.Op != OpARM64MOVWUreg || x != v_1.Args[0] || !(c < 32 && t.Size() == 4) { break } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpARM64MOVWUreg || x != v_1_0_0.Args[0] { - break + v.reset(OpARM64RORWconst) + v.AuxInt = c + v.AddArg(x) + return true + } + return false +} +func rewriteValueARM64_OpARM64AND_0(v *Value) bool { + // match: (AND x (MOVDconst [c])) + // result: (ANDconst [c] x) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + v.reset(OpARM64ANDconst) + v.AuxInt = c + v.AddArg(x) + return true } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpARM64SUB || v_1_0_1.Type != t { + break + } + // match: (AND x x) + // result: x + for { + x := v.Args[1] + if x != v.Args[0] { break } - _ = v_1_0_1.Args[1] - v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 32 { - break + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + // match: (AND x (MVN y)) + // result: (BIC x y) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MVN { + continue + } + y := v_1.Args[0] + v.reset(OpARM64BIC) + v.AddArg(x) + v.AddArg(y) + return true } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 31 || y != v_1_0_1_1.Args[0] { - break + break + } + // match: (AND x0 x1:(SLLconst [c] y)) + // cond: clobberIfDead(x1) + // result: (ANDshiftLL x0 y [c]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + x1 := v.Args[1^_i0] + if x1.Op != OpARM64SLLconst { + continue + } + c := x1.AuxInt + y := x1.Args[0] + if !(clobberIfDead(x1)) { + continue + } + v.reset(OpARM64ANDshiftLL) + v.AuxInt = c + v.AddArg(x0) + v.AddArg(y) + return true } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { - break + break + } + // match: (AND x0 x1:(SRLconst [c] y)) + // cond: clobberIfDead(x1) + // result: (ANDshiftRL x0 y [c]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + x1 := v.Args[1^_i0] + if x1.Op != OpARM64SRLconst { + continue + } + c := x1.AuxInt + y := x1.Args[0] + if !(clobberIfDead(x1)) { + continue + } + v.reset(OpARM64ANDshiftRL) + v.AuxInt = c + v.AddArg(x0) + v.AddArg(y) + return true } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpARM64SUB || v_1_1_0.Type != t { - break + break + } + // match: (AND x0 x1:(SRAconst [c] y)) + // cond: clobberIfDead(x1) + // result: (ANDshiftRA x0 y [c]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + x1 := v.Args[1^_i0] + if x1.Op != OpARM64SRAconst { + continue + } + c := x1.AuxInt + y := x1.Args[0] + if !(clobberIfDead(x1)) { + continue + } + v.reset(OpARM64ANDshiftRA) + v.AuxInt = c + v.AddArg(x0) + v.AddArg(y) + return true } - _ = v_1_1_0.Args[1] - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 32 { + break + } + return false +} +func rewriteValueARM64_OpARM64ANDconst_0(v *Value) bool { + // match: (ANDconst [0] _) + // result: (MOVDconst [0]) + for { + if v.AuxInt != 0 { break } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 + return true + } + // match: (ANDconst [-1] x) + // result: x + for { + if v.AuxInt != -1 { break } - v.reset(OpARM64RORW) + x := v.Args[0] + v.reset(OpCopy) + v.Type = x.Type v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpARM64NEG, t) - v0.AddArg(y) - v.AddArg(v0) return true } - // match: (ADD (CSEL0 {cc} (SRL (MOVWUreg x) (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y)))) (SLL x (ANDconst [31] y))) - // cond: cc.(Op) == OpARM64LessThanU - // result: (RORW x (NEG y)) + // match: (ANDconst [c] (MOVDconst [d])) + // result: (MOVDconst [c&d]) for { - _ = v.Args[1] + c := v.AuxInt v_0 := v.Args[0] - if v_0.Op != OpARM64CSEL0 || v_0.Type != typ.UInt32 { - break - } - cc := v_0.Aux - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpARM64SRL || v_0_0.Type != typ.UInt32 { + if v_0.Op != OpARM64MOVDconst { break } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpARM64MOVWUreg { - break - } - x := v_0_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpARM64SUB { - break - } - t := v_0_0_1.Type - _ = v_0_0_1.Args[1] - v_0_0_1_0 := v_0_0_1.Args[0] - if v_0_0_1_0.Op != OpARM64MOVDconst || v_0_0_1_0.AuxInt != 32 { - break - } - v_0_0_1_1 := v_0_0_1.Args[1] - if v_0_0_1_1.Op != OpARM64ANDconst || v_0_0_1_1.Type != t || v_0_0_1_1.AuxInt != 31 { - break - } - y := v_0_0_1_1.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpARM64CMPconst || v_0_1.AuxInt != 64 { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpARM64SUB || v_0_1_0.Type != t { - break - } - _ = v_0_1_0.Args[1] - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpARM64MOVDconst || v_0_1_0_0.AuxInt != 32 { - break - } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpARM64ANDconst || v_0_1_0_1.Type != t || v_0_1_0_1.AuxInt != 31 || y != v_0_1_0_1.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpARM64SLL { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64ANDconst || v_1_1.Type != t || v_1_1.AuxInt != 31 || y != v_1_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { - break - } - v.reset(OpARM64RORW) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpARM64NEG, t) - v0.AddArg(y) - v.AddArg(v0) + d := v_0.AuxInt + v.reset(OpARM64MOVDconst) + v.AuxInt = c & d return true } - // match: (ADD (SRL (MOVWUreg x) (ANDconst [31] y)) (CSEL0 {cc} (SLL x (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) - // cond: cc.(Op) == OpARM64LessThanU - // result: (RORW x y) + // match: (ANDconst [c] (ANDconst [d] x)) + // result: (ANDconst [c&d] x) for { - _ = v.Args[1] + c := v.AuxInt v_0 := v.Args[0] - if v_0.Op != OpARM64SRL || v_0.Type != typ.UInt32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpARM64MOVWUreg { - break - } - x := v_0_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpARM64ANDconst { - break - } - t := v_0_1.Type - if v_0_1.AuxInt != 31 { - break - } - y := v_0_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt32 { - break - } - cc := v_1.Aux - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpARM64SLL { - break - } - _ = v_1_0.Args[1] - if x != v_1_0.Args[0] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpARM64SUB || v_1_0_1.Type != t { - break - } - _ = v_1_0_1.Args[1] - v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 32 { - break - } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 31 || y != v_1_0_1_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpARM64SUB || v_1_1_0.Type != t { - break - } - _ = v_1_1_0.Args[1] - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 32 { - break - } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + if v_0.Op != OpARM64ANDconst { break } - v.reset(OpARM64RORW) + d := v_0.AuxInt + x := v_0.Args[0] + v.reset(OpARM64ANDconst) + v.AuxInt = c & d v.AddArg(x) - v.AddArg(y) return true } - // match: (ADD (CSEL0 {cc} (SLL x (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y)))) (SRL (MOVWUreg x) (ANDconst [31] y))) - // cond: cc.(Op) == OpARM64LessThanU - // result: (RORW x y) + // match: (ANDconst [c] (MOVWUreg x)) + // result: (ANDconst [c&(1<<32-1)] x) for { - _ = v.Args[1] + c := v.AuxInt v_0 := v.Args[0] - if v_0.Op != OpARM64CSEL0 || v_0.Type != typ.UInt32 { - break - } - cc := v_0.Aux - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpARM64SLL { - break - } - _ = v_0_0.Args[1] - x := v_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpARM64SUB { - break - } - t := v_0_0_1.Type - _ = v_0_0_1.Args[1] - v_0_0_1_0 := v_0_0_1.Args[0] - if v_0_0_1_0.Op != OpARM64MOVDconst || v_0_0_1_0.AuxInt != 32 { - break - } - v_0_0_1_1 := v_0_0_1.Args[1] - if v_0_0_1_1.Op != OpARM64ANDconst || v_0_0_1_1.Type != t || v_0_0_1_1.AuxInt != 31 { - break - } - y := v_0_0_1_1.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpARM64CMPconst || v_0_1.AuxInt != 64 { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpARM64SUB || v_0_1_0.Type != t { - break - } - _ = v_0_1_0.Args[1] - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpARM64MOVDconst || v_0_1_0_0.AuxInt != 32 { - break - } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpARM64ANDconst || v_0_1_0_1.Type != t || v_0_1_0_1.AuxInt != 31 || y != v_0_1_0_1.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpARM64SRL || v_1.Type != typ.UInt32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpARM64MOVWUreg || x != v_1_0.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64ANDconst || v_1_1.Type != t || v_1_1.AuxInt != 31 || y != v_1_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + if v_0.Op != OpARM64MOVWUreg { break } - v.reset(OpARM64RORW) + x := v_0.Args[0] + v.reset(OpARM64ANDconst) + v.AuxInt = c & (1<<32 - 1) v.AddArg(x) - v.AddArg(y) return true } - return false -} -func rewriteValueARM64_OpARM64ADDconst_0(v *Value) bool { - // match: (ADDconst [off1] (MOVDaddr [off2] {sym} ptr)) - // result: (MOVDaddr [off1+off2] {sym} ptr) + // match: (ANDconst [c] (MOVHUreg x)) + // result: (ANDconst [c&(1<<16-1)] x) for { - off1 := v.AuxInt + c := v.AuxInt v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDaddr { - break - } - off2 := v_0.AuxInt - sym := v_0.Aux - ptr := v_0.Args[0] - v.reset(OpARM64MOVDaddr) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(ptr) - return true - } - // match: (ADDconst [0] x) - // result: x - for { - if v.AuxInt != 0 { + if v_0.Op != OpARM64MOVHUreg { break } - x := v.Args[0] - v.reset(OpCopy) - v.Type = x.Type + x := v_0.Args[0] + v.reset(OpARM64ANDconst) + v.AuxInt = c & (1<<16 - 1) v.AddArg(x) return true } - // match: (ADDconst [c] (MOVDconst [d])) - // result: (MOVDconst [c+d]) + // match: (ANDconst [c] (MOVBUreg x)) + // result: (ANDconst [c&(1<<8-1)] x) for { c := v.AuxInt v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + if v_0.Op != OpARM64MOVBUreg { break } - d := v_0.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = c + d + x := v_0.Args[0] + v.reset(OpARM64ANDconst) + v.AuxInt = c & (1<<8 - 1) + v.AddArg(x) return true } - // match: (ADDconst [c] (ADDconst [d] x)) - // result: (ADDconst [c+d] x) + // match: (ANDconst [ac] (SLLconst [sc] x)) + // cond: isARM64BFMask(sc, ac, sc) + // result: (UBFIZ [armBFAuxInt(sc, arm64BFWidth(ac, sc))] x) for { - c := v.AuxInt + ac := v.AuxInt v_0 := v.Args[0] - if v_0.Op != OpARM64ADDconst { + if v_0.Op != OpARM64SLLconst { break } - d := v_0.AuxInt + sc := v_0.AuxInt x := v_0.Args[0] - v.reset(OpARM64ADDconst) - v.AuxInt = c + d + if !(isARM64BFMask(sc, ac, sc)) { + break + } + v.reset(OpARM64UBFIZ) + v.AuxInt = armBFAuxInt(sc, arm64BFWidth(ac, sc)) v.AddArg(x) return true } - // match: (ADDconst [c] (SUBconst [d] x)) - // result: (ADDconst [c-d] x) + // match: (ANDconst [ac] (SRLconst [sc] x)) + // cond: isARM64BFMask(sc, ac, 0) + // result: (UBFX [armBFAuxInt(sc, arm64BFWidth(ac, 0))] x) for { - c := v.AuxInt + ac := v.AuxInt v_0 := v.Args[0] - if v_0.Op != OpARM64SUBconst { + if v_0.Op != OpARM64SRLconst { break } - d := v_0.AuxInt + sc := v_0.AuxInt x := v_0.Args[0] - v.reset(OpARM64ADDconst) - v.AuxInt = c - d + if !(isARM64BFMask(sc, ac, 0)) { + break + } + v.reset(OpARM64UBFX) + v.AuxInt = armBFAuxInt(sc, arm64BFWidth(ac, 0)) v.AddArg(x) return true } return false } -func rewriteValueARM64_OpARM64ADDshiftLL_0(v *Value) bool { +func rewriteValueARM64_OpARM64ANDshiftLL_0(v *Value) bool { b := v.Block - typ := &b.Func.Config.Types - // match: (ADDshiftLL (MOVDconst [c]) x [d]) - // result: (ADDconst [c] (SLLconst x [d])) + // match: (ANDshiftLL (MOVDconst [c]) x [d]) + // result: (ANDconst [c] (SLLconst x [d])) for { d := v.AuxInt x := v.Args[1] @@ -2013,7 +2100,7 @@ func rewriteValueARM64_OpARM64ADDshiftLL_0(v *Value) bool { break } c := v_0.AuxInt - v.reset(OpARM64ADDconst) + v.reset(OpARM64ANDconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) v0.AuxInt = d @@ -2021,8 +2108,8 @@ func rewriteValueARM64_OpARM64ADDshiftLL_0(v *Value) bool { v.AddArg(v0) return true } - // match: (ADDshiftLL x (MOVDconst [c]) [d]) - // result: (ADDconst x [int64(uint64(c)< [c] (UBFX [bfc] x) x) - // cond: c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c) - // result: (RORWconst [32-c] x) + return false +} +func rewriteValueARM64_OpARM64ANDshiftRA_0(v *Value) bool { + b := v.Block + // match: (ANDshiftRA (MOVDconst [c]) x [d]) + // result: (ANDconst [c] (SRAconst x [d])) for { - t := v.Type - c := v.AuxInt + d := v.AuxInt x := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64UBFX { - break - } - bfc := v_0.AuxInt - if x != v_0.Args[0] || !(c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c)) { - break - } - v.reset(OpARM64RORWconst) - v.AuxInt = 32 - c - v.AddArg(x) - return true - } - // match: (ADDshiftLL [8] (UBFX [armBFAuxInt(8, 8)] x) x) - // result: (REV16W x) - for { - if v.Type != typ.UInt16 || v.AuxInt != 8 { - break - } - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64UBFX || v_0.Type != typ.UInt16 || v_0.AuxInt != armBFAuxInt(8, 8) || x != v_0.Args[0] { - break - } - v.reset(OpARM64REV16W) - v.AddArg(x) - return true - } - // match: (ADDshiftLL [c] (SRLconst x [64-c]) x2) - // result: (EXTRconst [64-c] x2 x) - for { - c := v.AuxInt - x2 := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64SRLconst || v_0.AuxInt != 64-c { - break - } - x := v_0.Args[0] - v.reset(OpARM64EXTRconst) - v.AuxInt = 64 - c - v.AddArg(x2) - v.AddArg(x) - return true - } - // match: (ADDshiftLL [c] (UBFX [bfc] x) x2) - // cond: c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c) - // result: (EXTRWconst [32-c] x2 x) - for { - t := v.Type - c := v.AuxInt - x2 := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64UBFX { - break - } - bfc := v_0.AuxInt - x := v_0.Args[0] - if !(c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c)) { - break - } - v.reset(OpARM64EXTRWconst) - v.AuxInt = 32 - c - v.AddArg(x2) - v.AddArg(x) - return true - } - return false -} -func rewriteValueARM64_OpARM64ADDshiftRA_0(v *Value) bool { - b := v.Block - // match: (ADDshiftRA (MOVDconst [c]) x [d]) - // result: (ADDconst [c] (SRAconst x [d])) - for { - d := v.AuxInt - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - v.reset(OpARM64ADDconst) + v.reset(OpARM64ANDconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARM64SRAconst, x.Type) v0.AuxInt = d @@ -2146,8 +2166,8 @@ func rewriteValueARM64_OpARM64ADDshiftRA_0(v *Value) bool { v.AddArg(v0) return true } - // match: (ADDshiftRA x (MOVDconst [c]) [d]) - // result: (ADDconst x [c>>uint64(d)]) + // match: (ANDshiftRA x (MOVDconst [c]) [d]) + // result: (ANDconst x [c>>uint64(d)]) for { d := v.AuxInt _ = v.Args[1] @@ -2157,17 +2177,37 @@ func rewriteValueARM64_OpARM64ADDshiftRA_0(v *Value) bool { break } c := v_1.AuxInt - v.reset(OpARM64ADDconst) + v.reset(OpARM64ANDconst) v.AuxInt = c >> uint64(d) v.AddArg(x) return true } + // match: (ANDshiftRA x y:(SRAconst x [c]) [d]) + // cond: c==d + // result: y + for { + d := v.AuxInt + _ = v.Args[1] + x := v.Args[0] + y := v.Args[1] + if y.Op != OpARM64SRAconst { + break + } + c := y.AuxInt + if x != y.Args[0] || !(c == d) { + break + } + v.reset(OpCopy) + v.Type = y.Type + v.AddArg(y) + return true + } return false } -func rewriteValueARM64_OpARM64ADDshiftRL_0(v *Value) bool { +func rewriteValueARM64_OpARM64ANDshiftRL_0(v *Value) bool { b := v.Block - // match: (ADDshiftRL (MOVDconst [c]) x [d]) - // result: (ADDconst [c] (SRLconst x [d])) + // match: (ANDshiftRL (MOVDconst [c]) x [d]) + // result: (ANDconst [c] (SRLconst x [d])) for { d := v.AuxInt x := v.Args[1] @@ -2176,7 +2216,7 @@ func rewriteValueARM64_OpARM64ADDshiftRL_0(v *Value) bool { break } c := v_0.AuxInt - v.reset(OpARM64ADDconst) + v.reset(OpARM64ANDconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARM64SRLconst, x.Type) v0.AuxInt = d @@ -2184,8 +2224,8 @@ func rewriteValueARM64_OpARM64ADDshiftRL_0(v *Value) bool { v.AddArg(v0) return true } - // match: (ADDshiftRL x (MOVDconst [c]) [d]) - // result: (ADDconst x [int64(uint64(c)>>uint64(d))]) + // match: (ANDshiftRL x (MOVDconst [c]) [d]) + // result: (ANDconst x [int64(uint64(c)>>uint64(d))]) for { d := v.AuxInt _ = v.Args[1] @@ -2195,51 +2235,36 @@ func rewriteValueARM64_OpARM64ADDshiftRL_0(v *Value) bool { break } c := v_1.AuxInt - v.reset(OpARM64ADDconst) + v.reset(OpARM64ANDconst) v.AuxInt = int64(uint64(c) >> uint64(d)) v.AddArg(x) return true } - // match: (ADDshiftRL [c] (SLLconst x [64-c]) x) - // result: (RORconst [ c] x) - for { - c := v.AuxInt - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 64-c || x != v_0.Args[0] { - break - } - v.reset(OpARM64RORconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ADDshiftRL [c] (SLLconst x [32-c]) (MOVWUreg x)) - // cond: c < 32 && t.Size() == 4 - // result: (RORWconst [c] x) + // match: (ANDshiftRL x y:(SRLconst x [c]) [d]) + // cond: c==d + // result: y for { - t := v.Type - c := v.AuxInt + d := v.AuxInt _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 32-c { + x := v.Args[0] + y := v.Args[1] + if y.Op != OpARM64SRLconst { break } - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVWUreg || x != v_1.Args[0] || !(c < 32 && t.Size() == 4) { + c := y.AuxInt + if x != y.Args[0] || !(c == d) { break } - v.reset(OpARM64RORWconst) - v.AuxInt = c - v.AddArg(x) + v.reset(OpCopy) + v.Type = y.Type + v.AddArg(y) return true } return false } -func rewriteValueARM64_OpARM64AND_0(v *Value) bool { - // match: (AND x (MOVDconst [c])) - // result: (ANDconst [c] x) +func rewriteValueARM64_OpARM64BIC_0(v *Value) bool { + // match: (BIC x (MOVDconst [c])) + // result: (ANDconst [^c] x) for { _ = v.Args[1] x := v.Args[0] @@ -2249,68 +2274,24 @@ func rewriteValueARM64_OpARM64AND_0(v *Value) bool { } c := v_1.AuxInt v.reset(OpARM64ANDconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (AND (MOVDconst [c]) x) - // result: (ANDconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - v.reset(OpARM64ANDconst) - v.AuxInt = c + v.AuxInt = ^c v.AddArg(x) return true } - // match: (AND x x) - // result: x + // match: (BIC x x) + // result: (MOVDconst [0]) for { x := v.Args[1] if x != v.Args[0] { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (AND x (MVN y)) - // result: (BIC x y) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MVN { - break - } - y := v_1.Args[0] - v.reset(OpARM64BIC) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (AND (MVN y) x) - // result: (BIC x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MVN { - break - } - y := v_0.Args[0] - v.reset(OpARM64BIC) - v.AddArg(x) - v.AddArg(y) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } - // match: (AND x0 x1:(SLLconst [c] y)) + // match: (BIC x0 x1:(SLLconst [c] y)) // cond: clobberIfDead(x1) - // result: (ANDshiftLL x0 y [c]) + // result: (BICshiftLL x0 y [c]) for { _ = v.Args[1] x0 := v.Args[0] @@ -2323,35 +2304,15 @@ func rewriteValueARM64_OpARM64AND_0(v *Value) bool { if !(clobberIfDead(x1)) { break } - v.reset(OpARM64ANDshiftLL) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) - return true - } - // match: (AND x1:(SLLconst [c] y) x0) - // cond: clobberIfDead(x1) - // result: (ANDshiftLL x0 y [c]) - for { - x0 := v.Args[1] - x1 := v.Args[0] - if x1.Op != OpARM64SLLconst { - break - } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { - break - } - v.reset(OpARM64ANDshiftLL) + v.reset(OpARM64BICshiftLL) v.AuxInt = c v.AddArg(x0) v.AddArg(y) return true } - // match: (AND x0 x1:(SRLconst [c] y)) + // match: (BIC x0 x1:(SRLconst [c] y)) // cond: clobberIfDead(x1) - // result: (ANDshiftRL x0 y [c]) + // result: (BICshiftRL x0 y [c]) for { _ = v.Args[1] x0 := v.Args[0] @@ -2364,35 +2325,15 @@ func rewriteValueARM64_OpARM64AND_0(v *Value) bool { if !(clobberIfDead(x1)) { break } - v.reset(OpARM64ANDshiftRL) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) - return true - } - // match: (AND x1:(SRLconst [c] y) x0) - // cond: clobberIfDead(x1) - // result: (ANDshiftRL x0 y [c]) - for { - x0 := v.Args[1] - x1 := v.Args[0] - if x1.Op != OpARM64SRLconst { - break - } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { - break - } - v.reset(OpARM64ANDshiftRL) + v.reset(OpARM64BICshiftRL) v.AuxInt = c v.AddArg(x0) v.AddArg(y) return true } - // match: (AND x0 x1:(SRAconst [c] y)) + // match: (BIC x0 x1:(SRAconst [c] y)) // cond: clobberIfDead(x1) - // result: (ANDshiftRA x0 y [c]) + // result: (BICshiftRA x0 y [c]) for { _ = v.Args[1] x0 := v.Args[0] @@ -2405,7 +2346,7 @@ func rewriteValueARM64_OpARM64AND_0(v *Value) bool { if !(clobberIfDead(x1)) { break } - v.reset(OpARM64ANDshiftRA) + v.reset(OpARM64BICshiftRA) v.AuxInt = c v.AddArg(x0) v.AddArg(y) @@ -2413,184 +2354,47 @@ func rewriteValueARM64_OpARM64AND_0(v *Value) bool { } return false } -func rewriteValueARM64_OpARM64AND_10(v *Value) bool { - // match: (AND x1:(SRAconst [c] y) x0) - // cond: clobberIfDead(x1) - // result: (ANDshiftRA x0 y [c]) +func rewriteValueARM64_OpARM64BICshiftLL_0(v *Value) bool { + // match: (BICshiftLL x (MOVDconst [c]) [d]) + // result: (ANDconst x [^int64(uint64(c)< x [d])) - for { - d := v.AuxInt - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - v.reset(OpARM64ANDconst) - v.AuxInt = c - v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v0.AuxInt = d - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (ANDshiftLL x (MOVDconst [c]) [d]) - // result: (ANDconst x [int64(uint64(c)<>uint64(d))]) for { d := v.AuxInt _ = v.Args[1] @@ -2601,54 +2405,34 @@ func rewriteValueARM64_OpARM64ANDshiftLL_0(v *Value) bool { } c := v_1.AuxInt v.reset(OpARM64ANDconst) - v.AuxInt = int64(uint64(c) << uint64(d)) + v.AuxInt = ^(c >> uint64(d)) v.AddArg(x) return true } - // match: (ANDshiftLL x y:(SLLconst x [c]) [d]) + // match: (BICshiftRA x (SRAconst x [c]) [d]) // cond: c==d - // result: y + // result: (MOVDconst [0]) for { d := v.AuxInt _ = v.Args[1] x := v.Args[0] - y := v.Args[1] - if y.Op != OpARM64SLLconst { + v_1 := v.Args[1] + if v_1.Op != OpARM64SRAconst { break } - c := y.AuxInt - if x != y.Args[0] || !(c == d) { + c := v_1.AuxInt + if x != v_1.Args[0] || !(c == d) { break } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } return false } -func rewriteValueARM64_OpARM64ANDshiftRA_0(v *Value) bool { - b := v.Block - // match: (ANDshiftRA (MOVDconst [c]) x [d]) - // result: (ANDconst [c] (SRAconst x [d])) - for { - d := v.AuxInt - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - v.reset(OpARM64ANDconst) - v.AuxInt = c - v0 := b.NewValue0(v.Pos, OpARM64SRAconst, x.Type) - v0.AuxInt = d - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (ANDshiftRA x (MOVDconst [c]) [d]) - // result: (ANDconst x [c>>uint64(d)]) +func rewriteValueARM64_OpARM64BICshiftRL_0(v *Value) bool { + // match: (BICshiftRL x (MOVDconst [c]) [d]) + // result: (ANDconst x [^int64(uint64(c)>>uint64(d))]) for { d := v.AuxInt _ = v.Args[1] @@ -2659,261 +2443,333 @@ func rewriteValueARM64_OpARM64ANDshiftRA_0(v *Value) bool { } c := v_1.AuxInt v.reset(OpARM64ANDconst) - v.AuxInt = c >> uint64(d) + v.AuxInt = ^int64(uint64(c) >> uint64(d)) v.AddArg(x) return true } - // match: (ANDshiftRA x y:(SRAconst x [c]) [d]) + // match: (BICshiftRL x (SRLconst x [c]) [d]) // cond: c==d - // result: y + // result: (MOVDconst [0]) for { d := v.AuxInt _ = v.Args[1] x := v.Args[0] - y := v.Args[1] - if y.Op != OpARM64SRAconst { + v_1 := v.Args[1] + if v_1.Op != OpARM64SRLconst { break } - c := y.AuxInt - if x != y.Args[0] || !(c == d) { + c := v_1.AuxInt + if x != v_1.Args[0] || !(c == d) { break } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } return false } -func rewriteValueARM64_OpARM64ANDshiftRL_0(v *Value) bool { - b := v.Block - // match: (ANDshiftRL (MOVDconst [c]) x [d]) - // result: (ANDconst [c] (SRLconst x [d])) +func rewriteValueARM64_OpARM64CMN_0(v *Value) bool { + // match: (CMN x (MOVDconst [c])) + // result: (CMNconst [c] x) for { - d := v.AuxInt - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + v.reset(OpARM64CMNconst) + v.AuxInt = c + v.AddArg(x) + return true } - c := v_0.AuxInt - v.reset(OpARM64ANDconst) - v.AuxInt = c - v0 := b.NewValue0(v.Pos, OpARM64SRLconst, x.Type) - v0.AuxInt = d - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (ANDshiftRL x (MOVDconst [c]) [d]) - // result: (ANDconst x [int64(uint64(c)>>uint64(d))]) + // match: (CMN x0 x1:(SLLconst [c] y)) + // cond: clobberIfDead(x1) + // result: (CMNshiftLL x0 y [c]) for { - d := v.AuxInt _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + x1 := v.Args[1^_i0] + if x1.Op != OpARM64SLLconst { + continue + } + c := x1.AuxInt + y := x1.Args[0] + if !(clobberIfDead(x1)) { + continue + } + v.reset(OpARM64CMNshiftLL) + v.AuxInt = c + v.AddArg(x0) + v.AddArg(y) + return true } - c := v_1.AuxInt - v.reset(OpARM64ANDconst) - v.AuxInt = int64(uint64(c) >> uint64(d)) - v.AddArg(x) - return true + break } - // match: (ANDshiftRL x y:(SRLconst x [c]) [d]) - // cond: c==d - // result: y + // match: (CMN x0 x1:(SRLconst [c] y)) + // cond: clobberIfDead(x1) + // result: (CMNshiftRL x0 y [c]) for { - d := v.AuxInt _ = v.Args[1] - x := v.Args[0] - y := v.Args[1] - if y.Op != OpARM64SRLconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + x1 := v.Args[1^_i0] + if x1.Op != OpARM64SRLconst { + continue + } + c := x1.AuxInt + y := x1.Args[0] + if !(clobberIfDead(x1)) { + continue + } + v.reset(OpARM64CMNshiftRL) + v.AuxInt = c + v.AddArg(x0) + v.AddArg(y) + return true } - c := y.AuxInt - if x != y.Args[0] || !(c == d) { - break + break + } + // match: (CMN x0 x1:(SRAconst [c] y)) + // cond: clobberIfDead(x1) + // result: (CMNshiftRA x0 y [c]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + x1 := v.Args[1^_i0] + if x1.Op != OpARM64SRAconst { + continue + } + c := x1.AuxInt + y := x1.Args[0] + if !(clobberIfDead(x1)) { + continue + } + v.reset(OpARM64CMNshiftRA) + v.AuxInt = c + v.AddArg(x0) + v.AddArg(y) + return true } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) - return true + break } return false } -func rewriteValueARM64_OpARM64BIC_0(v *Value) bool { - // match: (BIC x (MOVDconst [c])) - // result: (ANDconst [^c] x) +func rewriteValueARM64_OpARM64CMNW_0(v *Value) bool { + // match: (CMNW x (MOVDconst [c])) + // result: (CMNWconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + v.reset(OpARM64CMNWconst) + v.AuxInt = c + v.AddArg(x) + return true + } + break + } + return false +} +func rewriteValueARM64_OpARM64CMNWconst_0(v *Value) bool { + // match: (CMNWconst (MOVDconst [x]) [y]) + // cond: int32(x)==int32(-y) + // result: (FlagEQ) + for { + y := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt - v.reset(OpARM64ANDconst) - v.AuxInt = ^c - v.AddArg(x) + x := v_0.AuxInt + if !(int32(x) == int32(-y)) { + break + } + v.reset(OpARM64FlagEQ) return true } - // match: (BIC x x) - // result: (MOVDconst [0]) + // match: (CMNWconst (MOVDconst [x]) [y]) + // cond: int32(x)uint32(-y) + // result: (FlagLT_UGT) for { - _ = v.Args[1] - x0 := v.Args[0] - x1 := v.Args[1] - if x1.Op != OpARM64SLLconst { + y := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { + x := v_0.AuxInt + if !(int32(x) < int32(-y) && uint32(x) > uint32(-y)) { break } - v.reset(OpARM64BICshiftLL) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) + v.reset(OpARM64FlagLT_UGT) return true } - // match: (BIC x0 x1:(SRLconst [c] y)) - // cond: clobberIfDead(x1) - // result: (BICshiftRL x0 y [c]) + // match: (CMNWconst (MOVDconst [x]) [y]) + // cond: int32(x)>int32(-y) && uint32(x) int32(-y) && uint32(x) < uint32(-y)) { break } - v.reset(OpARM64BICshiftRL) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) + v.reset(OpARM64FlagGT_ULT) return true } - // match: (BIC x0 x1:(SRAconst [c] y)) - // cond: clobberIfDead(x1) - // result: (BICshiftRA x0 y [c]) + // match: (CMNWconst (MOVDconst [x]) [y]) + // cond: int32(x)>int32(-y) && uint32(x)>uint32(-y) + // result: (FlagGT_UGT) for { - _ = v.Args[1] - x0 := v.Args[0] - x1 := v.Args[1] - if x1.Op != OpARM64SRAconst { + y := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { + x := v_0.AuxInt + if !(int32(x) > int32(-y) && uint32(x) > uint32(-y)) { break } - v.reset(OpARM64BICshiftRA) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) + v.reset(OpARM64FlagGT_UGT) return true } return false } -func rewriteValueARM64_OpARM64BICshiftLL_0(v *Value) bool { - // match: (BICshiftLL x (MOVDconst [c]) [d]) - // result: (ANDconst x [^int64(uint64(c)<>uint64(d))]) + // match: (CMNconst (MOVDconst [x]) [y]) + // cond: int64(x)uint64(-y) + // result: (FlagLT_UGT) for { - d := v.AuxInt - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + y := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt - v.reset(OpARM64ANDconst) - v.AuxInt = ^(c >> uint64(d)) - v.AddArg(x) + x := v_0.AuxInt + if !(int64(x) < int64(-y) && uint64(x) > uint64(-y)) { + break + } + v.reset(OpARM64FlagLT_UGT) return true } - // match: (BICshiftRA x (SRAconst x [c]) [d]) - // cond: c==d - // result: (MOVDconst [0]) + // match: (CMNconst (MOVDconst [x]) [y]) + // cond: int64(x)>int64(-y) && uint64(x) int64(-y) && uint64(x) < uint64(-y)) { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.reset(OpARM64FlagGT_ULT) + return true + } + // match: (CMNconst (MOVDconst [x]) [y]) + // cond: int64(x)>int64(-y) && uint64(x)>uint64(-y) + // result: (FlagGT_UGT) + for { + y := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { + break + } + x := v_0.AuxInt + if !(int64(x) > int64(-y) && uint64(x) > uint64(-y)) { + break + } + v.reset(OpARM64FlagGT_UGT) return true } return false } -func rewriteValueARM64_OpARM64BICshiftRL_0(v *Value) bool { - // match: (BICshiftRL x (MOVDconst [c]) [d]) - // result: (ANDconst x [^int64(uint64(c)>>uint64(d))]) +func rewriteValueARM64_OpARM64CMNshiftLL_0(v *Value) bool { + b := v.Block + // match: (CMNshiftLL (MOVDconst [c]) x [d]) + // result: (CMNconst [c] (SLLconst x [d])) + for { + d := v.AuxInt + x := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { + break + } + c := v_0.AuxInt + v.reset(OpARM64CMNconst) + v.AuxInt = c + v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) + v0.AuxInt = d + v0.AddArg(x) + v.AddArg(v0) + return true + } + // match: (CMNshiftLL x (MOVDconst [c]) [d]) + // result: (CMNconst x [int64(uint64(c)<> uint64(d)) + v.reset(OpARM64CMNconst) + v.AuxInt = int64(uint64(c) << uint64(d)) v.AddArg(x) return true } - // match: (BICshiftRL x (SRLconst x [c]) [d]) - // cond: c==d - // result: (MOVDconst [0]) + return false +} +func rewriteValueARM64_OpARM64CMNshiftRA_0(v *Value) bool { + b := v.Block + // match: (CMNshiftRA (MOVDconst [c]) x [d]) + // result: (CMNconst [c] (SRAconst x [d])) + for { + d := v.AuxInt + x := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { + break + } + c := v_0.AuxInt + v.reset(OpARM64CMNconst) + v.AuxInt = c + v0 := b.NewValue0(v.Pos, OpARM64SRAconst, x.Type) + v0.AuxInt = d + v0.AddArg(x) + v.AddArg(v0) + return true + } + // match: (CMNshiftRA x (MOVDconst [c]) [d]) + // result: (CMNconst x [c>>uint64(d)]) for { d := v.AuxInt _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst { + if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - if x != v_1.Args[0] || !(c == d) { + v.reset(OpARM64CMNconst) + v.AuxInt = c >> uint64(d) + v.AddArg(x) + return true + } + return false +} +func rewriteValueARM64_OpARM64CMNshiftRL_0(v *Value) bool { + b := v.Block + // match: (CMNshiftRL (MOVDconst [c]) x [d]) + // result: (CMNconst [c] (SRLconst x [d])) + for { + d := v.AuxInt + x := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + c := v_0.AuxInt + v.reset(OpARM64CMNconst) + v.AuxInt = c + v0 := b.NewValue0(v.Pos, OpARM64SRLconst, x.Type) + v0.AuxInt = d + v0.AddArg(x) + v.AddArg(v0) + return true + } + // match: (CMNshiftRL x (MOVDconst [c]) [d]) + // result: (CMNconst x [int64(uint64(c)>>uint64(d))]) + for { + d := v.AuxInt + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { + break + } + c := v_1.AuxInt + v.reset(OpARM64CMNconst) + v.AuxInt = int64(uint64(c) >> uint64(d)) + v.AddArg(x) return true } return false } -func rewriteValueARM64_OpARM64CMN_0(v *Value) bool { - // match: (CMN x (MOVDconst [c])) - // result: (CMNconst [c] x) +func rewriteValueARM64_OpARM64CMP_0(v *Value) bool { + b := v.Block + // match: (CMP x (MOVDconst [c])) + // result: (CMPconst [c] x) for { _ = v.Args[1] x := v.Args[0] @@ -2960,13 +2874,13 @@ func rewriteValueARM64_OpARM64CMN_0(v *Value) bool { break } c := v_1.AuxInt - v.reset(OpARM64CMNconst) + v.reset(OpARM64CMPconst) v.AuxInt = c v.AddArg(x) return true } - // match: (CMN (MOVDconst [c]) x) - // result: (CMNconst [c] x) + // match: (CMP (MOVDconst [c]) x) + // result: (InvertFlags (CMPconst [c] x)) for { x := v.Args[1] v_0 := v.Args[0] @@ -2974,14 +2888,16 @@ func rewriteValueARM64_OpARM64CMN_0(v *Value) bool { break } c := v_0.AuxInt - v.reset(OpARM64CMNconst) - v.AuxInt = c - v.AddArg(x) + v.reset(OpARM64InvertFlags) + v0 := b.NewValue0(v.Pos, OpARM64CMPconst, types.TypeFlags) + v0.AuxInt = c + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (CMN x0 x1:(SLLconst [c] y)) + // match: (CMP x0 x1:(SLLconst [c] y)) // cond: clobberIfDead(x1) - // result: (CMNshiftLL x0 y [c]) + // result: (CMPshiftLL x0 y [c]) for { _ = v.Args[1] x0 := v.Args[0] @@ -2994,35 +2910,37 @@ func rewriteValueARM64_OpARM64CMN_0(v *Value) bool { if !(clobberIfDead(x1)) { break } - v.reset(OpARM64CMNshiftLL) + v.reset(OpARM64CMPshiftLL) v.AuxInt = c v.AddArg(x0) v.AddArg(y) return true } - // match: (CMN x1:(SLLconst [c] y) x0) - // cond: clobberIfDead(x1) - // result: (CMNshiftLL x0 y [c]) + // match: (CMP x0:(SLLconst [c] y) x1) + // cond: clobberIfDead(x0) + // result: (InvertFlags (CMPshiftLL x1 y [c])) for { - x0 := v.Args[1] - x1 := v.Args[0] - if x1.Op != OpARM64SLLconst { + x1 := v.Args[1] + x0 := v.Args[0] + if x0.Op != OpARM64SLLconst { break } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { + c := x0.AuxInt + y := x0.Args[0] + if !(clobberIfDead(x0)) { break } - v.reset(OpARM64CMNshiftLL) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) + v.reset(OpARM64InvertFlags) + v0 := b.NewValue0(v.Pos, OpARM64CMPshiftLL, types.TypeFlags) + v0.AuxInt = c + v0.AddArg(x1) + v0.AddArg(y) + v.AddArg(v0) return true } - // match: (CMN x0 x1:(SRLconst [c] y)) + // match: (CMP x0 x1:(SRLconst [c] y)) // cond: clobberIfDead(x1) - // result: (CMNshiftRL x0 y [c]) + // result: (CMPshiftRL x0 y [c]) for { _ = v.Args[1] x0 := v.Args[0] @@ -3035,35 +2953,37 @@ func rewriteValueARM64_OpARM64CMN_0(v *Value) bool { if !(clobberIfDead(x1)) { break } - v.reset(OpARM64CMNshiftRL) + v.reset(OpARM64CMPshiftRL) v.AuxInt = c v.AddArg(x0) v.AddArg(y) return true } - // match: (CMN x1:(SRLconst [c] y) x0) - // cond: clobberIfDead(x1) - // result: (CMNshiftRL x0 y [c]) + // match: (CMP x0:(SRLconst [c] y) x1) + // cond: clobberIfDead(x0) + // result: (InvertFlags (CMPshiftRL x1 y [c])) for { - x0 := v.Args[1] - x1 := v.Args[0] - if x1.Op != OpARM64SRLconst { + x1 := v.Args[1] + x0 := v.Args[0] + if x0.Op != OpARM64SRLconst { break } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { + c := x0.AuxInt + y := x0.Args[0] + if !(clobberIfDead(x0)) { break } - v.reset(OpARM64CMNshiftRL) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) + v.reset(OpARM64InvertFlags) + v0 := b.NewValue0(v.Pos, OpARM64CMPshiftRL, types.TypeFlags) + v0.AuxInt = c + v0.AddArg(x1) + v0.AddArg(y) + v.AddArg(v0) return true } - // match: (CMN x0 x1:(SRAconst [c] y)) + // match: (CMP x0 x1:(SRAconst [c] y)) // cond: clobberIfDead(x1) - // result: (CMNshiftRA x0 y [c]) + // result: (CMPshiftRA x0 y [c]) for { _ = v.Args[1] x0 := v.Args[0] @@ -3076,37 +2996,40 @@ func rewriteValueARM64_OpARM64CMN_0(v *Value) bool { if !(clobberIfDead(x1)) { break } - v.reset(OpARM64CMNshiftRA) + v.reset(OpARM64CMPshiftRA) v.AuxInt = c v.AddArg(x0) v.AddArg(y) return true } - // match: (CMN x1:(SRAconst [c] y) x0) - // cond: clobberIfDead(x1) - // result: (CMNshiftRA x0 y [c]) + // match: (CMP x0:(SRAconst [c] y) x1) + // cond: clobberIfDead(x0) + // result: (InvertFlags (CMPshiftRA x1 y [c])) for { - x0 := v.Args[1] - x1 := v.Args[0] - if x1.Op != OpARM64SRAconst { + x1 := v.Args[1] + x0 := v.Args[0] + if x0.Op != OpARM64SRAconst { break } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { + c := x0.AuxInt + y := x0.Args[0] + if !(clobberIfDead(x0)) { break } - v.reset(OpARM64CMNshiftRA) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) + v.reset(OpARM64InvertFlags) + v0 := b.NewValue0(v.Pos, OpARM64CMPshiftRA, types.TypeFlags) + v0.AuxInt = c + v0.AddArg(x1) + v0.AddArg(y) + v.AddArg(v0) return true } return false } -func rewriteValueARM64_OpARM64CMNW_0(v *Value) bool { - // match: (CMNW x (MOVDconst [c])) - // result: (CMNWconst [c] x) +func rewriteValueARM64_OpARM64CMPW_0(v *Value) bool { + b := v.Block + // match: (CMPW x (MOVDconst [c])) + // result: (CMPWconst [int64(int32(c))] x) for { _ = v.Args[1] x := v.Args[0] @@ -3115,13 +3038,13 @@ func rewriteValueARM64_OpARM64CMNW_0(v *Value) bool { break } c := v_1.AuxInt - v.reset(OpARM64CMNWconst) - v.AuxInt = c + v.reset(OpARM64CMPWconst) + v.AuxInt = int64(int32(c)) v.AddArg(x) return true } - // match: (CMNW (MOVDconst [c]) x) - // result: (CMNWconst [c] x) + // match: (CMPW (MOVDconst [c]) x) + // result: (InvertFlags (CMPWconst [int64(int32(c))] x)) for { x := v.Args[1] v_0 := v.Args[0] @@ -3129,16 +3052,18 @@ func rewriteValueARM64_OpARM64CMNW_0(v *Value) bool { break } c := v_0.AuxInt - v.reset(OpARM64CMNWconst) - v.AuxInt = c - v.AddArg(x) + v.reset(OpARM64InvertFlags) + v0 := b.NewValue0(v.Pos, OpARM64CMPWconst, types.TypeFlags) + v0.AuxInt = int64(int32(c)) + v0.AddArg(x) + v.AddArg(v0) return true } return false } -func rewriteValueARM64_OpARM64CMNWconst_0(v *Value) bool { - // match: (CMNWconst (MOVDconst [x]) [y]) - // cond: int32(x)==int32(-y) +func rewriteValueARM64_OpARM64CMPWconst_0(v *Value) bool { + // match: (CMPWconst (MOVDconst [x]) [y]) + // cond: int32(x)==int32(y) // result: (FlagEQ) for { y := v.AuxInt @@ -3147,14 +3072,14 @@ func rewriteValueARM64_OpARM64CMNWconst_0(v *Value) bool { break } x := v_0.AuxInt - if !(int32(x) == int32(-y)) { + if !(int32(x) == int32(y)) { break } v.reset(OpARM64FlagEQ) return true } - // match: (CMNWconst (MOVDconst [x]) [y]) - // cond: int32(x)uint32(-y) + // match: (CMPWconst (MOVDconst [x]) [y]) + // cond: int32(x)uint32(y) // result: (FlagLT_UGT) for { y := v.AuxInt @@ -3179,14 +3104,14 @@ func rewriteValueARM64_OpARM64CMNWconst_0(v *Value) bool { break } x := v_0.AuxInt - if !(int32(x) < int32(-y) && uint32(x) > uint32(-y)) { + if !(int32(x) < int32(y) && uint32(x) > uint32(y)) { break } v.reset(OpARM64FlagLT_UGT) return true } - // match: (CMNWconst (MOVDconst [x]) [y]) - // cond: int32(x)>int32(-y) && uint32(x)int32(y) && uint32(x) int32(-y) && uint32(x) < uint32(-y)) { + if !(int32(x) > int32(y) && uint32(x) < uint32(y)) { break } v.reset(OpARM64FlagGT_ULT) return true } - // match: (CMNWconst (MOVDconst [x]) [y]) - // cond: int32(x)>int32(-y) && uint32(x)>uint32(-y) + // match: (CMPWconst (MOVDconst [x]) [y]) + // cond: int32(x)>int32(y) && uint32(x)>uint32(y) // result: (FlagGT_UGT) for { y := v.AuxInt @@ -3211,17 +3136,41 @@ func rewriteValueARM64_OpARM64CMNWconst_0(v *Value) bool { break } x := v_0.AuxInt - if !(int32(x) > int32(-y) && uint32(x) > uint32(-y)) { + if !(int32(x) > int32(y) && uint32(x) > uint32(y)) { break } v.reset(OpARM64FlagGT_UGT) return true } + // match: (CMPWconst (MOVBUreg _) [c]) + // cond: 0xff < int32(c) + // result: (FlagLT_ULT) + for { + c := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVBUreg || !(0xff < int32(c)) { + break + } + v.reset(OpARM64FlagLT_ULT) + return true + } + // match: (CMPWconst (MOVHUreg _) [c]) + // cond: 0xffff < int32(c) + // result: (FlagLT_ULT) + for { + c := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVHUreg || !(0xffff < int32(c)) { + break + } + v.reset(OpARM64FlagLT_ULT) + return true + } return false } -func rewriteValueARM64_OpARM64CMNconst_0(v *Value) bool { - // match: (CMNconst (MOVDconst [x]) [y]) - // cond: int64(x)==int64(-y) +func rewriteValueARM64_OpARM64CMPconst_0(v *Value) bool { + // match: (CMPconst (MOVDconst [x]) [y]) + // cond: x==y // result: (FlagEQ) for { y := v.AuxInt @@ -3230,14 +3179,14 @@ func rewriteValueARM64_OpARM64CMNconst_0(v *Value) bool { break } x := v_0.AuxInt - if !(int64(x) == int64(-y)) { + if !(x == y) { break } v.reset(OpARM64FlagEQ) return true } - // match: (CMNconst (MOVDconst [x]) [y]) - // cond: int64(x)uint64(-y) + // match: (CMPconst (MOVDconst [x]) [y]) + // cond: xuint64(y) // result: (FlagLT_UGT) for { y := v.AuxInt @@ -3262,14 +3211,14 @@ func rewriteValueARM64_OpARM64CMNconst_0(v *Value) bool { break } x := v_0.AuxInt - if !(int64(x) < int64(-y) && uint64(x) > uint64(-y)) { + if !(x < y && uint64(x) > uint64(y)) { break } v.reset(OpARM64FlagLT_UGT) return true } - // match: (CMNconst (MOVDconst [x]) [y]) - // cond: int64(x)>int64(-y) && uint64(x)y && uint64(x) int64(-y) && uint64(x) < uint64(-y)) { + if !(x > y && uint64(x) < uint64(y)) { break } v.reset(OpARM64FlagGT_ULT) return true } - // match: (CMNconst (MOVDconst [x]) [y]) - // cond: int64(x)>int64(-y) && uint64(x)>uint64(-y) + // match: (CMPconst (MOVDconst [x]) [y]) + // cond: x>y && uint64(x)>uint64(y) // result: (FlagGT_UGT) for { y := v.AuxInt @@ -3294,18 +3243,86 @@ func rewriteValueARM64_OpARM64CMNconst_0(v *Value) bool { break } x := v_0.AuxInt - if !(int64(x) > int64(-y) && uint64(x) > uint64(-y)) { + if !(x > y && uint64(x) > uint64(y)) { break } v.reset(OpARM64FlagGT_UGT) return true } + // match: (CMPconst (MOVBUreg _) [c]) + // cond: 0xff < c + // result: (FlagLT_ULT) + for { + c := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVBUreg || !(0xff < c) { + break + } + v.reset(OpARM64FlagLT_ULT) + return true + } + // match: (CMPconst (MOVHUreg _) [c]) + // cond: 0xffff < c + // result: (FlagLT_ULT) + for { + c := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVHUreg || !(0xffff < c) { + break + } + v.reset(OpARM64FlagLT_ULT) + return true + } + // match: (CMPconst (MOVWUreg _) [c]) + // cond: 0xffffffff < c + // result: (FlagLT_ULT) + for { + c := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVWUreg || !(0xffffffff < c) { + break + } + v.reset(OpARM64FlagLT_ULT) + return true + } + // match: (CMPconst (ANDconst _ [m]) [n]) + // cond: 0 <= m && m < n + // result: (FlagLT_ULT) + for { + n := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64ANDconst { + break + } + m := v_0.AuxInt + if !(0 <= m && m < n) { + break + } + v.reset(OpARM64FlagLT_ULT) + return true + } + // match: (CMPconst (SRLconst _ [c]) [n]) + // cond: 0 <= n && 0 < c && c <= 63 && (1< x [d])) + // match: (CMPshiftLL (MOVDconst [c]) x [d]) + // result: (InvertFlags (CMPconst [c] (SLLconst x [d]))) for { d := v.AuxInt x := v.Args[1] @@ -3314,16 +3331,18 @@ func rewriteValueARM64_OpARM64CMNshiftLL_0(v *Value) bool { break } c := v_0.AuxInt - v.reset(OpARM64CMNconst) - v.AuxInt = c - v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v0.AuxInt = d - v0.AddArg(x) + v.reset(OpARM64InvertFlags) + v0 := b.NewValue0(v.Pos, OpARM64CMPconst, types.TypeFlags) + v0.AuxInt = c + v1 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) + v1.AuxInt = d + v1.AddArg(x) + v0.AddArg(v1) v.AddArg(v0) return true } - // match: (CMNshiftLL x (MOVDconst [c]) [d]) - // result: (CMNconst x [int64(uint64(c)< x [d])) + // match: (CMPshiftRA (MOVDconst [c]) x [d]) + // result: (InvertFlags (CMPconst [c] (SRAconst x [d]))) for { d := v.AuxInt x := v.Args[1] @@ -3352,16 +3371,18 @@ func rewriteValueARM64_OpARM64CMNshiftRA_0(v *Value) bool { break } c := v_0.AuxInt - v.reset(OpARM64CMNconst) - v.AuxInt = c - v0 := b.NewValue0(v.Pos, OpARM64SRAconst, x.Type) - v0.AuxInt = d - v0.AddArg(x) + v.reset(OpARM64InvertFlags) + v0 := b.NewValue0(v.Pos, OpARM64CMPconst, types.TypeFlags) + v0.AuxInt = c + v1 := b.NewValue0(v.Pos, OpARM64SRAconst, x.Type) + v1.AuxInt = d + v1.AddArg(x) + v0.AddArg(v1) v.AddArg(v0) return true } - // match: (CMNshiftRA x (MOVDconst [c]) [d]) - // result: (CMNconst x [c>>uint64(d)]) + // match: (CMPshiftRA x (MOVDconst [c]) [d]) + // result: (CMPconst x [c>>uint64(d)]) for { d := v.AuxInt _ = v.Args[1] @@ -3371,17 +3392,17 @@ func rewriteValueARM64_OpARM64CMNshiftRA_0(v *Value) bool { break } c := v_1.AuxInt - v.reset(OpARM64CMNconst) + v.reset(OpARM64CMPconst) v.AuxInt = c >> uint64(d) v.AddArg(x) return true } return false } -func rewriteValueARM64_OpARM64CMNshiftRL_0(v *Value) bool { +func rewriteValueARM64_OpARM64CMPshiftRL_0(v *Value) bool { b := v.Block - // match: (CMNshiftRL (MOVDconst [c]) x [d]) - // result: (CMNconst [c] (SRLconst x [d])) + // match: (CMPshiftRL (MOVDconst [c]) x [d]) + // result: (InvertFlags (CMPconst [c] (SRLconst x [d]))) for { d := v.AuxInt x := v.Args[1] @@ -3390,16 +3411,18 @@ func rewriteValueARM64_OpARM64CMNshiftRL_0(v *Value) bool { break } c := v_0.AuxInt - v.reset(OpARM64CMNconst) - v.AuxInt = c - v0 := b.NewValue0(v.Pos, OpARM64SRLconst, x.Type) - v0.AuxInt = d - v0.AddArg(x) + v.reset(OpARM64InvertFlags) + v0 := b.NewValue0(v.Pos, OpARM64CMPconst, types.TypeFlags) + v0.AuxInt = c + v1 := b.NewValue0(v.Pos, OpARM64SRLconst, x.Type) + v1.AuxInt = d + v1.AddArg(x) + v0.AddArg(v1) v.AddArg(v0) return true } - // match: (CMNshiftRL x (MOVDconst [c]) [d]) - // result: (CMNconst x [int64(uint64(c)>>uint64(d))]) + // match: (CMPshiftRL x (MOVDconst [c]) [d]) + // result: (CMPconst x [int64(uint64(c)>>uint64(d))]) for { d := v.AuxInt _ = v.Args[1] @@ -3409,1148 +3432,1445 @@ func rewriteValueARM64_OpARM64CMNshiftRL_0(v *Value) bool { break } c := v_1.AuxInt - v.reset(OpARM64CMNconst) + v.reset(OpARM64CMPconst) v.AuxInt = int64(uint64(c) >> uint64(d)) v.AddArg(x) return true } return false } -func rewriteValueARM64_OpARM64CMP_0(v *Value) bool { - b := v.Block - // match: (CMP x (MOVDconst [c])) - // result: (CMPconst [c] x) +func rewriteValueARM64_OpARM64CSEL_0(v *Value) bool { + // match: (CSEL {cc} x (MOVDconst [0]) flag) + // result: (CSEL0 {cc} x flag) for { - _ = v.Args[1] + cc := v.Aux + flag := v.Args[2] x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 0 { break } - c := v_1.AuxInt - v.reset(OpARM64CMPconst) - v.AuxInt = c + v.reset(OpARM64CSEL0) + v.Aux = cc v.AddArg(x) + v.AddArg(flag) return true } - // match: (CMP (MOVDconst [c]) x) - // result: (InvertFlags (CMPconst [c] x)) + // match: (CSEL {cc} (MOVDconst [0]) y flag) + // result: (CSEL0 {arm64Negate(cc.(Op))} y flag) for { - x := v.Args[1] + cc := v.Aux + flag := v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + if v_0.Op != OpARM64MOVDconst || v_0.AuxInt != 0 { break } - c := v_0.AuxInt - v.reset(OpARM64InvertFlags) - v0 := b.NewValue0(v.Pos, OpARM64CMPconst, types.TypeFlags) - v0.AuxInt = c - v0.AddArg(x) - v.AddArg(v0) + y := v.Args[1] + v.reset(OpARM64CSEL0) + v.Aux = arm64Negate(cc.(Op)) + v.AddArg(y) + v.AddArg(flag) return true } - // match: (CMP x0 x1:(SLLconst [c] y)) - // cond: clobberIfDead(x1) - // result: (CMPshiftLL x0 y [c]) + // match: (CSEL {cc} x y (InvertFlags cmp)) + // result: (CSEL {arm64Invert(cc.(Op))} x y cmp) for { - _ = v.Args[1] - x0 := v.Args[0] - x1 := v.Args[1] - if x1.Op != OpARM64SLLconst { - break - } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { + cc := v.Aux + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64InvertFlags { break } - v.reset(OpARM64CMPshiftLL) - v.AuxInt = c - v.AddArg(x0) + cmp := v_2.Args[0] + v.reset(OpARM64CSEL) + v.Aux = arm64Invert(cc.(Op)) + v.AddArg(x) v.AddArg(y) + v.AddArg(cmp) return true } - // match: (CMP x0:(SLLconst [c] y) x1) - // cond: clobberIfDead(x0) - // result: (InvertFlags (CMPshiftLL x1 y [c])) + // match: (CSEL {cc} x _ flag) + // cond: ccARM64Eval(cc, flag) > 0 + // result: x for { - x1 := v.Args[1] - x0 := v.Args[0] - if x0.Op != OpARM64SLLconst { + cc := v.Aux + flag := v.Args[2] + x := v.Args[0] + if !(ccARM64Eval(cc, flag) > 0) { break } - c := x0.AuxInt - y := x0.Args[0] - if !(clobberIfDead(x0)) { + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + // match: (CSEL {cc} _ y flag) + // cond: ccARM64Eval(cc, flag) < 0 + // result: y + for { + cc := v.Aux + flag := v.Args[2] + y := v.Args[1] + if !(ccARM64Eval(cc, flag) < 0) { break } - v.reset(OpARM64InvertFlags) - v0 := b.NewValue0(v.Pos, OpARM64CMPshiftLL, types.TypeFlags) - v0.AuxInt = c - v0.AddArg(x1) - v0.AddArg(y) - v.AddArg(v0) + v.reset(OpCopy) + v.Type = y.Type + v.AddArg(y) return true } - // match: (CMP x0 x1:(SRLconst [c] y)) - // cond: clobberIfDead(x1) - // result: (CMPshiftRL x0 y [c]) + // match: (CSEL {cc} x y (CMPWconst [0] boolval)) + // cond: cc.(Op) == OpARM64NotEqual && flagArg(boolval) != nil + // result: (CSEL {boolval.Op} x y flagArg(boolval)) for { - _ = v.Args[1] - x0 := v.Args[0] - x1 := v.Args[1] - if x1.Op != OpARM64SRLconst { + cc := v.Aux + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64CMPWconst || v_2.AuxInt != 0 { break } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { + boolval := v_2.Args[0] + if !(cc.(Op) == OpARM64NotEqual && flagArg(boolval) != nil) { break } - v.reset(OpARM64CMPshiftRL) - v.AuxInt = c - v.AddArg(x0) + v.reset(OpARM64CSEL) + v.Aux = boolval.Op + v.AddArg(x) v.AddArg(y) + v.AddArg(flagArg(boolval)) return true } - // match: (CMP x0:(SRLconst [c] y) x1) - // cond: clobberIfDead(x0) - // result: (InvertFlags (CMPshiftRL x1 y [c])) + // match: (CSEL {cc} x y (CMPWconst [0] boolval)) + // cond: cc.(Op) == OpARM64Equal && flagArg(boolval) != nil + // result: (CSEL {arm64Negate(boolval.Op)} x y flagArg(boolval)) for { - x1 := v.Args[1] - x0 := v.Args[0] - if x0.Op != OpARM64SRLconst { + cc := v.Aux + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64CMPWconst || v_2.AuxInt != 0 { break } - c := x0.AuxInt - y := x0.Args[0] - if !(clobberIfDead(x0)) { + boolval := v_2.Args[0] + if !(cc.(Op) == OpARM64Equal && flagArg(boolval) != nil) { break } - v.reset(OpARM64InvertFlags) - v0 := b.NewValue0(v.Pos, OpARM64CMPshiftRL, types.TypeFlags) - v0.AuxInt = c - v0.AddArg(x1) - v0.AddArg(y) - v.AddArg(v0) + v.reset(OpARM64CSEL) + v.Aux = arm64Negate(boolval.Op) + v.AddArg(x) + v.AddArg(y) + v.AddArg(flagArg(boolval)) return true } - // match: (CMP x0 x1:(SRAconst [c] y)) - // cond: clobberIfDead(x1) - // result: (CMPshiftRA x0 y [c]) + return false +} +func rewriteValueARM64_OpARM64CSEL0_0(v *Value) bool { + // match: (CSEL0 {cc} x (InvertFlags cmp)) + // result: (CSEL0 {arm64Invert(cc.(Op))} x cmp) for { + cc := v.Aux _ = v.Args[1] - x0 := v.Args[0] - x1 := v.Args[1] - if x1.Op != OpARM64SRAconst { - break - } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64InvertFlags { break } - v.reset(OpARM64CMPshiftRA) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) + cmp := v_1.Args[0] + v.reset(OpARM64CSEL0) + v.Aux = arm64Invert(cc.(Op)) + v.AddArg(x) + v.AddArg(cmp) return true } - // match: (CMP x0:(SRAconst [c] y) x1) - // cond: clobberIfDead(x0) - // result: (InvertFlags (CMPshiftRA x1 y [c])) + // match: (CSEL0 {cc} x flag) + // cond: ccARM64Eval(cc, flag) > 0 + // result: x for { - x1 := v.Args[1] - x0 := v.Args[0] - if x0.Op != OpARM64SRAconst { + cc := v.Aux + flag := v.Args[1] + x := v.Args[0] + if !(ccARM64Eval(cc, flag) > 0) { break } - c := x0.AuxInt - y := x0.Args[0] - if !(clobberIfDead(x0)) { + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + // match: (CSEL0 {cc} _ flag) + // cond: ccARM64Eval(cc, flag) < 0 + // result: (MOVDconst [0]) + for { + cc := v.Aux + flag := v.Args[1] + if !(ccARM64Eval(cc, flag) < 0) { break } - v.reset(OpARM64InvertFlags) - v0 := b.NewValue0(v.Pos, OpARM64CMPshiftRA, types.TypeFlags) - v0.AuxInt = c - v0.AddArg(x1) - v0.AddArg(y) - v.AddArg(v0) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } - return false -} -func rewriteValueARM64_OpARM64CMPW_0(v *Value) bool { - b := v.Block - // match: (CMPW x (MOVDconst [c])) - // result: (CMPWconst [int64(int32(c))] x) + // match: (CSEL0 {cc} x (CMPWconst [0] boolval)) + // cond: cc.(Op) == OpARM64NotEqual && flagArg(boolval) != nil + // result: (CSEL0 {boolval.Op} x flagArg(boolval)) for { + cc := v.Aux _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + if v_1.Op != OpARM64CMPWconst || v_1.AuxInt != 0 { break } - c := v_1.AuxInt - v.reset(OpARM64CMPWconst) - v.AuxInt = int64(int32(c)) + boolval := v_1.Args[0] + if !(cc.(Op) == OpARM64NotEqual && flagArg(boolval) != nil) { + break + } + v.reset(OpARM64CSEL0) + v.Aux = boolval.Op v.AddArg(x) + v.AddArg(flagArg(boolval)) return true } - // match: (CMPW (MOVDconst [c]) x) - // result: (InvertFlags (CMPWconst [int64(int32(c))] x)) + // match: (CSEL0 {cc} x (CMPWconst [0] boolval)) + // cond: cc.(Op) == OpARM64Equal && flagArg(boolval) != nil + // result: (CSEL0 {arm64Negate(boolval.Op)} x flagArg(boolval)) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + cc := v.Aux + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64CMPWconst || v_1.AuxInt != 0 { break } - c := v_0.AuxInt - v.reset(OpARM64InvertFlags) - v0 := b.NewValue0(v.Pos, OpARM64CMPWconst, types.TypeFlags) - v0.AuxInt = int64(int32(c)) - v0.AddArg(x) - v.AddArg(v0) + boolval := v_1.Args[0] + if !(cc.(Op) == OpARM64Equal && flagArg(boolval) != nil) { + break + } + v.reset(OpARM64CSEL0) + v.Aux = arm64Negate(boolval.Op) + v.AddArg(x) + v.AddArg(flagArg(boolval)) return true } return false } -func rewriteValueARM64_OpARM64CMPWconst_0(v *Value) bool { - // match: (CMPWconst (MOVDconst [x]) [y]) - // cond: int32(x)==int32(y) - // result: (FlagEQ) +func rewriteValueARM64_OpARM64DIV_0(v *Value) bool { + // match: (DIV (MOVDconst [c]) (MOVDconst [d])) + // result: (MOVDconst [c/d]) for { - y := v.AuxInt + _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } - x := v_0.AuxInt - if !(int32(x) == int32(y)) { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - v.reset(OpARM64FlagEQ) - return true - } - // match: (CMPWconst (MOVDconst [x]) [y]) - // cond: int32(x)uint32(y) - // result: (FlagLT_UGT) + return false +} +func rewriteValueARM64_OpARM64EON_0(v *Value) bool { + // match: (EON x (MOVDconst [c])) + // result: (XORconst [^c] x) for { - y := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - x := v_0.AuxInt - if !(int32(x) < int32(y) && uint32(x) > uint32(y)) { + c := v_1.AuxInt + v.reset(OpARM64XORconst) + v.AuxInt = ^c + v.AddArg(x) + return true + } + // match: (EON x x) + // result: (MOVDconst [-1]) + for { + x := v.Args[1] + if x != v.Args[0] { break } - v.reset(OpARM64FlagLT_UGT) + v.reset(OpARM64MOVDconst) + v.AuxInt = -1 return true } - // match: (CMPWconst (MOVDconst [x]) [y]) - // cond: int32(x)>int32(y) && uint32(x) int32(y) && uint32(x) < uint32(y)) { + c := x1.AuxInt + y := x1.Args[0] + if !(clobberIfDead(x1)) { break } - v.reset(OpARM64FlagGT_ULT) + v.reset(OpARM64EONshiftLL) + v.AuxInt = c + v.AddArg(x0) + v.AddArg(y) return true } - // match: (CMPWconst (MOVDconst [x]) [y]) - // cond: int32(x)>int32(y) && uint32(x)>uint32(y) - // result: (FlagGT_UGT) + // match: (EON x0 x1:(SRLconst [c] y)) + // cond: clobberIfDead(x1) + // result: (EONshiftRL x0 y [c]) for { - y := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + _ = v.Args[1] + x0 := v.Args[0] + x1 := v.Args[1] + if x1.Op != OpARM64SRLconst { break } - x := v_0.AuxInt - if !(int32(x) > int32(y) && uint32(x) > uint32(y)) { + c := x1.AuxInt + y := x1.Args[0] + if !(clobberIfDead(x1)) { break } - v.reset(OpARM64FlagGT_UGT) + v.reset(OpARM64EONshiftRL) + v.AuxInt = c + v.AddArg(x0) + v.AddArg(y) return true } - // match: (CMPWconst (MOVBUreg _) [c]) - // cond: 0xff < int32(c) - // result: (FlagLT_ULT) + // match: (EON x0 x1:(SRAconst [c] y)) + // cond: clobberIfDead(x1) + // result: (EONshiftRA x0 y [c]) for { - c := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVBUreg || !(0xff < int32(c)) { + _ = v.Args[1] + x0 := v.Args[0] + x1 := v.Args[1] + if x1.Op != OpARM64SRAconst { break } - v.reset(OpARM64FlagLT_ULT) - return true - } - // match: (CMPWconst (MOVHUreg _) [c]) - // cond: 0xffff < int32(c) - // result: (FlagLT_ULT) - for { - c := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVHUreg || !(0xffff < int32(c)) { + c := x1.AuxInt + y := x1.Args[0] + if !(clobberIfDead(x1)) { break } - v.reset(OpARM64FlagLT_ULT) + v.reset(OpARM64EONshiftRA) + v.AuxInt = c + v.AddArg(x0) + v.AddArg(y) return true } return false } -func rewriteValueARM64_OpARM64CMPconst_0(v *Value) bool { - // match: (CMPconst (MOVDconst [x]) [y]) - // cond: x==y - // result: (FlagEQ) +func rewriteValueARM64_OpARM64EONshiftLL_0(v *Value) bool { + // match: (EONshiftLL x (MOVDconst [c]) [d]) + // result: (XORconst x [^int64(uint64(c)<uint64(y) - // result: (FlagLT_UGT) + return false +} +func rewriteValueARM64_OpARM64EONshiftRA_0(v *Value) bool { + // match: (EONshiftRA x (MOVDconst [c]) [d]) + // result: (XORconst x [^(c>>uint64(d))]) for { - y := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - x := v_0.AuxInt - if !(x < y && uint64(x) > uint64(y)) { + d := v.AuxInt + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - v.reset(OpARM64FlagLT_UGT) + c := v_1.AuxInt + v.reset(OpARM64XORconst) + v.AuxInt = ^(c >> uint64(d)) + v.AddArg(x) return true } - // match: (CMPconst (MOVDconst [x]) [y]) - // cond: x>y && uint64(x) y && uint64(x) < uint64(y)) { + c := v_1.AuxInt + if x != v_1.Args[0] || !(c == d) { break } - v.reset(OpARM64FlagGT_ULT) + v.reset(OpARM64MOVDconst) + v.AuxInt = -1 return true } - // match: (CMPconst (MOVDconst [x]) [y]) - // cond: x>y && uint64(x)>uint64(y) - // result: (FlagGT_UGT) + return false +} +func rewriteValueARM64_OpARM64EONshiftRL_0(v *Value) bool { + // match: (EONshiftRL x (MOVDconst [c]) [d]) + // result: (XORconst x [^int64(uint64(c)>>uint64(d))]) for { - y := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - x := v_0.AuxInt - if !(x > y && uint64(x) > uint64(y)) { + d := v.AuxInt + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - v.reset(OpARM64FlagGT_UGT) + c := v_1.AuxInt + v.reset(OpARM64XORconst) + v.AuxInt = ^int64(uint64(c) >> uint64(d)) + v.AddArg(x) return true } - // match: (CMPconst (MOVBUreg _) [c]) - // cond: 0xff < c - // result: (FlagLT_ULT) + // match: (EONshiftRL x (SRLconst x [c]) [d]) + // cond: c==d + // result: (MOVDconst [-1]) for { - c := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVBUreg || !(0xff < c) { + d := v.AuxInt + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64SRLconst { break } - v.reset(OpARM64FlagLT_ULT) + c := v_1.AuxInt + if x != v_1.Args[0] || !(c == d) { + break + } + v.reset(OpARM64MOVDconst) + v.AuxInt = -1 return true } - // match: (CMPconst (MOVHUreg _) [c]) - // cond: 0xffff < c - // result: (FlagLT_ULT) + return false +} +func rewriteValueARM64_OpARM64Equal_0(v *Value) bool { + // match: (Equal (FlagEQ)) + // result: (MOVDconst [1]) for { - c := v.AuxInt v_0 := v.Args[0] - if v_0.Op != OpARM64MOVHUreg || !(0xffff < c) { + if v_0.Op != OpARM64FlagEQ { break } - v.reset(OpARM64FlagLT_ULT) + v.reset(OpARM64MOVDconst) + v.AuxInt = 1 return true } - // match: (CMPconst (MOVWUreg _) [c]) - // cond: 0xffffffff < c - // result: (FlagLT_ULT) + // match: (Equal (FlagLT_ULT)) + // result: (MOVDconst [0]) for { - c := v.AuxInt v_0 := v.Args[0] - if v_0.Op != OpARM64MOVWUreg || !(0xffffffff < c) { + if v_0.Op != OpARM64FlagLT_ULT { break } - v.reset(OpARM64FlagLT_ULT) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } - // match: (CMPconst (ANDconst _ [m]) [n]) - // cond: 0 <= m && m < n - // result: (FlagLT_ULT) + // match: (Equal (FlagLT_UGT)) + // result: (MOVDconst [0]) for { - n := v.AuxInt v_0 := v.Args[0] - if v_0.Op != OpARM64ANDconst { + if v_0.Op != OpARM64FlagLT_UGT { break } - m := v_0.AuxInt - if !(0 <= m && m < n) { + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 + return true + } + // match: (Equal (FlagGT_ULT)) + // result: (MOVDconst [0]) + for { + v_0 := v.Args[0] + if v_0.Op != OpARM64FlagGT_ULT { break } - v.reset(OpARM64FlagLT_ULT) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } - // match: (CMPconst (SRLconst _ [c]) [n]) - // cond: 0 <= n && 0 < c && c <= 63 && (1< x [d]))) +func rewriteValueARM64_OpARM64FADDD_0(v *Value) bool { + // match: (FADDD a (FMULD x y)) + // result: (FMADDD a x y) for { - d := v.AuxInt - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + a := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64FMULD { + continue + } + y := v_1.Args[1] + x := v_1.Args[0] + v.reset(OpARM64FMADDD) + v.AddArg(a) + v.AddArg(x) + v.AddArg(y) + return true } - c := v_0.AuxInt - v.reset(OpARM64InvertFlags) - v0 := b.NewValue0(v.Pos, OpARM64CMPconst, types.TypeFlags) - v0.AuxInt = c - v1 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v1.AuxInt = d - v1.AddArg(x) - v0.AddArg(v1) - v.AddArg(v0) - return true + break } - // match: (CMPshiftLL x (MOVDconst [c]) [d]) - // result: (CMPconst x [int64(uint64(c)< x [d]))) +func rewriteValueARM64_OpARM64FADDS_0(v *Value) bool { + // match: (FADDS a (FMULS x y)) + // result: (FMADDS a x y) for { - d := v.AuxInt - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + a := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64FMULS { + continue + } + y := v_1.Args[1] + x := v_1.Args[0] + v.reset(OpARM64FMADDS) + v.AddArg(a) + v.AddArg(x) + v.AddArg(y) + return true } - c := v_0.AuxInt - v.reset(OpARM64InvertFlags) - v0 := b.NewValue0(v.Pos, OpARM64CMPconst, types.TypeFlags) - v0.AuxInt = c - v1 := b.NewValue0(v.Pos, OpARM64SRAconst, x.Type) - v1.AuxInt = d - v1.AddArg(x) - v0.AddArg(v1) - v.AddArg(v0) - return true + break } - // match: (CMPshiftRA x (MOVDconst [c]) [d]) - // result: (CMPconst x [c>>uint64(d)]) + // match: (FADDS a (FNMULS x y)) + // result: (FMSUBS a x y) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + a := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64FNMULS { + continue + } + y := v_1.Args[1] + x := v_1.Args[0] + v.reset(OpARM64FMSUBS) + v.AddArg(a) + v.AddArg(x) + v.AddArg(y) + return true + } + break + } + return false +} +func rewriteValueARM64_OpARM64FCMPD_0(v *Value) bool { + b := v.Block + // match: (FCMPD x (FMOVDconst [0])) + // result: (FCMPD0 x) for { - d := v.AuxInt _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + if v_1.Op != OpARM64FMOVDconst || v_1.AuxInt != 0 { break } - c := v_1.AuxInt - v.reset(OpARM64CMPconst) - v.AuxInt = c >> uint64(d) + v.reset(OpARM64FCMPD0) v.AddArg(x) return true } - return false -} -func rewriteValueARM64_OpARM64CMPshiftRL_0(v *Value) bool { - b := v.Block - // match: (CMPshiftRL (MOVDconst [c]) x [d]) - // result: (InvertFlags (CMPconst [c] (SRLconst x [d]))) + // match: (FCMPD (FMOVDconst [0]) x) + // result: (InvertFlags (FCMPD0 x)) for { - d := v.AuxInt x := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + if v_0.Op != OpARM64FMOVDconst || v_0.AuxInt != 0 { break } - c := v_0.AuxInt v.reset(OpARM64InvertFlags) - v0 := b.NewValue0(v.Pos, OpARM64CMPconst, types.TypeFlags) - v0.AuxInt = c - v1 := b.NewValue0(v.Pos, OpARM64SRLconst, x.Type) - v1.AuxInt = d - v1.AddArg(x) - v0.AddArg(v1) + v0 := b.NewValue0(v.Pos, OpARM64FCMPD0, types.TypeFlags) + v0.AddArg(x) v.AddArg(v0) return true } - // match: (CMPshiftRL x (MOVDconst [c]) [d]) - // result: (CMPconst x [int64(uint64(c)>>uint64(d))]) + return false +} +func rewriteValueARM64_OpARM64FCMPS_0(v *Value) bool { + b := v.Block + // match: (FCMPS x (FMOVSconst [0])) + // result: (FCMPS0 x) for { - d := v.AuxInt _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + if v_1.Op != OpARM64FMOVSconst || v_1.AuxInt != 0 { break } - c := v_1.AuxInt - v.reset(OpARM64CMPconst) - v.AuxInt = int64(uint64(c) >> uint64(d)) + v.reset(OpARM64FCMPS0) v.AddArg(x) return true } - return false -} -func rewriteValueARM64_OpARM64CSEL_0(v *Value) bool { - // match: (CSEL {cc} x (MOVDconst [0]) flag) - // result: (CSEL0 {cc} x flag) + // match: (FCMPS (FMOVSconst [0]) x) + // result: (InvertFlags (FCMPS0 x)) for { - cc := v.Aux - flag := v.Args[2] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 0 { + x := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64FMOVSconst || v_0.AuxInt != 0 { break } - v.reset(OpARM64CSEL0) - v.Aux = cc - v.AddArg(x) - v.AddArg(flag) + v.reset(OpARM64InvertFlags) + v0 := b.NewValue0(v.Pos, OpARM64FCMPS0, types.TypeFlags) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (CSEL {cc} (MOVDconst [0]) y flag) - // result: (CSEL0 {arm64Negate(cc.(Op))} y flag) + return false +} +func rewriteValueARM64_OpARM64FMOVDfpgp_0(v *Value) bool { + b := v.Block + // match: (FMOVDfpgp (Arg [off] {sym})) + // result: @b.Func.Entry (Arg [off] {sym}) for { - cc := v.Aux - flag := v.Args[2] + t := v.Type v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst || v_0.AuxInt != 0 { + if v_0.Op != OpArg { break } - y := v.Args[1] - v.reset(OpARM64CSEL0) - v.Aux = arm64Negate(cc.(Op)) - v.AddArg(y) - v.AddArg(flag) + off := v_0.AuxInt + sym := v_0.Aux + b = b.Func.Entry + v0 := b.NewValue0(v.Pos, OpArg, t) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = off + v0.Aux = sym return true } - // match: (CSEL {cc} x y (InvertFlags cmp)) - // result: (CSEL {arm64Invert(cc.(Op))} x y cmp) + return false +} +func rewriteValueARM64_OpARM64FMOVDgpfp_0(v *Value) bool { + b := v.Block + // match: (FMOVDgpfp (Arg [off] {sym})) + // result: @b.Func.Entry (Arg [off] {sym}) for { - cc := v.Aux - _ = v.Args[2] - x := v.Args[0] - y := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64InvertFlags { + t := v.Type + v_0 := v.Args[0] + if v_0.Op != OpArg { break } - cmp := v_2.Args[0] - v.reset(OpARM64CSEL) - v.Aux = arm64Invert(cc.(Op)) - v.AddArg(x) - v.AddArg(y) - v.AddArg(cmp) + off := v_0.AuxInt + sym := v_0.Aux + b = b.Func.Entry + v0 := b.NewValue0(v.Pos, OpArg, t) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = off + v0.Aux = sym return true } - // match: (CSEL {cc} x _ flag) - // cond: ccARM64Eval(cc, flag) > 0 - // result: x + return false +} +func rewriteValueARM64_OpARM64FMOVDload_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (FMOVDload [off] {sym} ptr (MOVDstore [off] {sym} ptr val _)) + // result: (FMOVDgpfp val) for { - cc := v.Aux - flag := v.Args[2] - x := v.Args[0] - if !(ccARM64Eval(cc, flag) > 0) { + off := v.AuxInt + sym := v.Aux + _ = v.Args[1] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDstore || v_1.AuxInt != off || v_1.Aux != sym { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + _ = v_1.Args[2] + if ptr != v_1.Args[0] { + break + } + val := v_1.Args[1] + v.reset(OpARM64FMOVDgpfp) + v.AddArg(val) return true } - // match: (CSEL {cc} _ y flag) - // cond: ccARM64Eval(cc, flag) < 0 - // result: y + // match: (FMOVDload [off1] {sym} (ADDconst [off2] ptr) mem) + // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (FMOVDload [off1+off2] {sym} ptr mem) for { - cc := v.Aux - flag := v.Args[2] - y := v.Args[1] - if !(ccARM64Eval(cc, flag) < 0) { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADDconst { break } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) + off2 := v_0.AuxInt + ptr := v_0.Args[0] + if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + break + } + v.reset(OpARM64FMOVDload) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(ptr) + v.AddArg(mem) return true } - // match: (CSEL {cc} x y (CMPWconst [0] boolval)) - // cond: cc.(Op) == OpARM64NotEqual && flagArg(boolval) != nil - // result: (CSEL {boolval.Op} x y flagArg(boolval)) + // match: (FMOVDload [off] {sym} (ADD ptr idx) mem) + // cond: off == 0 && sym == nil + // result: (FMOVDloadidx ptr idx mem) for { - cc := v.Aux - _ = v.Args[2] - x := v.Args[0] - y := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64CMPWconst || v_2.AuxInt != 0 { + off := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADD { break } - boolval := v_2.Args[0] - if !(cc.(Op) == OpARM64NotEqual && flagArg(boolval) != nil) { + idx := v_0.Args[1] + ptr := v_0.Args[0] + if !(off == 0 && sym == nil) { break } - v.reset(OpARM64CSEL) - v.Aux = boolval.Op - v.AddArg(x) - v.AddArg(y) - v.AddArg(flagArg(boolval)) + v.reset(OpARM64FMOVDloadidx) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) return true } - // match: (CSEL {cc} x y (CMPWconst [0] boolval)) - // cond: cc.(Op) == OpARM64Equal && flagArg(boolval) != nil - // result: (CSEL {arm64Negate(boolval.Op)} x y flagArg(boolval)) + // match: (FMOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (FMOVDload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) for { - cc := v.Aux - _ = v.Args[2] - x := v.Args[0] - y := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64CMPWconst || v_2.AuxInt != 0 { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDaddr { break } - boolval := v_2.Args[0] - if !(cc.(Op) == OpARM64Equal && flagArg(boolval) != nil) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + ptr := v_0.Args[0] + if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(OpARM64CSEL) - v.Aux = arm64Negate(boolval.Op) - v.AddArg(x) - v.AddArg(y) - v.AddArg(flagArg(boolval)) + v.reset(OpARM64FMOVDload) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(ptr) + v.AddArg(mem) return true } return false } -func rewriteValueARM64_OpARM64CSEL0_0(v *Value) bool { - // match: (CSEL0 {cc} x (InvertFlags cmp)) - // result: (CSEL0 {arm64Invert(cc.(Op))} x cmp) +func rewriteValueARM64_OpARM64FMOVDloadidx_0(v *Value) bool { + // match: (FMOVDloadidx ptr (MOVDconst [c]) mem) + // result: (FMOVDload [c] ptr mem) for { - cc := v.Aux - _ = v.Args[1] - x := v.Args[0] + mem := v.Args[2] + ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64InvertFlags { + if v_1.Op != OpARM64MOVDconst { break } - cmp := v_1.Args[0] - v.reset(OpARM64CSEL0) - v.Aux = arm64Invert(cc.(Op)) - v.AddArg(x) - v.AddArg(cmp) + c := v_1.AuxInt + v.reset(OpARM64FMOVDload) + v.AuxInt = c + v.AddArg(ptr) + v.AddArg(mem) return true } - // match: (CSEL0 {cc} x flag) - // cond: ccARM64Eval(cc, flag) > 0 - // result: x + // match: (FMOVDloadidx (MOVDconst [c]) ptr mem) + // result: (FMOVDload [c] ptr mem) for { - cc := v.Aux - flag := v.Args[1] - x := v.Args[0] - if !(ccARM64Eval(cc, flag) > 0) { + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + c := v_0.AuxInt + ptr := v.Args[1] + v.reset(OpARM64FMOVDload) + v.AuxInt = c + v.AddArg(ptr) + v.AddArg(mem) return true } - // match: (CSEL0 {cc} _ flag) - // cond: ccARM64Eval(cc, flag) < 0 - // result: (MOVDconst [0]) + return false +} +func rewriteValueARM64_OpARM64FMOVDstore_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (FMOVDstore [off] {sym} ptr (FMOVDgpfp val) mem) + // result: (MOVDstore [off] {sym} ptr val mem) for { - cc := v.Aux - flag := v.Args[1] - if !(ccARM64Eval(cc, flag) < 0) { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64FMOVDgpfp { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + val := v_1.Args[0] + v.reset(OpARM64MOVDstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(val) + v.AddArg(mem) return true } - // match: (CSEL0 {cc} x (CMPWconst [0] boolval)) - // cond: cc.(Op) == OpARM64NotEqual && flagArg(boolval) != nil - // result: (CSEL0 {boolval.Op} x flagArg(boolval)) + // match: (FMOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) + // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (FMOVDstore [off1+off2] {sym} ptr val mem) for { - cc := v.Aux - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64CMPWconst || v_1.AuxInt != 0 { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADDconst { break } - boolval := v_1.Args[0] - if !(cc.(Op) == OpARM64NotEqual && flagArg(boolval) != nil) { + off2 := v_0.AuxInt + ptr := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(OpARM64CSEL0) - v.Aux = boolval.Op - v.AddArg(x) - v.AddArg(flagArg(boolval)) - return true - } - // match: (CSEL0 {cc} x (CMPWconst [0] boolval)) - // cond: cc.(Op) == OpARM64Equal && flagArg(boolval) != nil - // result: (CSEL0 {arm64Negate(boolval.Op)} x flagArg(boolval)) + v.reset(OpARM64FMOVDstore) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(ptr) + v.AddArg(val) + v.AddArg(mem) + return true + } + // match: (FMOVDstore [off] {sym} (ADD ptr idx) val mem) + // cond: off == 0 && sym == nil + // result: (FMOVDstoreidx ptr idx val mem) for { - cc := v.Aux - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64CMPWconst || v_1.AuxInt != 0 { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADD { break } - boolval := v_1.Args[0] - if !(cc.(Op) == OpARM64Equal && flagArg(boolval) != nil) { + idx := v_0.Args[1] + ptr := v_0.Args[0] + val := v.Args[1] + if !(off == 0 && sym == nil) { break } - v.reset(OpARM64CSEL0) - v.Aux = arm64Negate(boolval.Op) - v.AddArg(x) - v.AddArg(flagArg(boolval)) + v.reset(OpARM64FMOVDstoreidx) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) return true } - return false -} -func rewriteValueARM64_OpARM64DIV_0(v *Value) bool { - // match: (DIV (MOVDconst [c]) (MOVDconst [d])) - // result: (MOVDconst [c/d]) + // match: (FMOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (FMOVDstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) for { - _ = v.Args[1] + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + if v_0.Op != OpARM64MOVDaddr { break } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + off2 := v_0.AuxInt + sym2 := v_0.Aux + ptr := v_0.Args[0] + val := v.Args[1] + if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - d := v_1.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = c / d + v.reset(OpARM64FMOVDstore) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(ptr) + v.AddArg(val) + v.AddArg(mem) return true } return false } -func rewriteValueARM64_OpARM64DIVW_0(v *Value) bool { - // match: (DIVW (MOVDconst [c]) (MOVDconst [d])) - // result: (MOVDconst [int64(int32(c)/int32(d))]) +func rewriteValueARM64_OpARM64FMOVDstoreidx_0(v *Value) bool { + // match: (FMOVDstoreidx ptr (MOVDconst [c]) val mem) + // result: (FMOVDstore [c] ptr val mem) for { - _ = v.Args[1] + mem := v.Args[3] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { + break + } + c := v_1.AuxInt + val := v.Args[2] + v.reset(OpARM64FMOVDstore) + v.AuxInt = c + v.AddArg(ptr) + v.AddArg(val) + v.AddArg(mem) + return true + } + // match: (FMOVDstoreidx (MOVDconst [c]) idx val mem) + // result: (FMOVDstore [c] idx val mem) + for { + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - d := v_1.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = int64(int32(c) / int32(d)) + idx := v.Args[1] + val := v.Args[2] + v.reset(OpARM64FMOVDstore) + v.AuxInt = c + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) return true } return false } -func rewriteValueARM64_OpARM64EON_0(v *Value) bool { - // match: (EON x (MOVDconst [c])) - // result: (XORconst [^c] x) +func rewriteValueARM64_OpARM64FMOVSload_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (FMOVSload [off] {sym} ptr (MOVWstore [off] {sym} ptr val _)) + // result: (FMOVSgpfp val) for { + off := v.AuxInt + sym := v.Aux _ = v.Args[1] - x := v.Args[0] + ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + if v_1.Op != OpARM64MOVWstore || v_1.AuxInt != off || v_1.Aux != sym { break } - c := v_1.AuxInt - v.reset(OpARM64XORconst) - v.AuxInt = ^c - v.AddArg(x) - return true - } - // match: (EON x x) - // result: (MOVDconst [-1]) - for { - x := v.Args[1] - if x != v.Args[0] { + _ = v_1.Args[2] + if ptr != v_1.Args[0] { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = -1 + val := v_1.Args[1] + v.reset(OpARM64FMOVSgpfp) + v.AddArg(val) return true } - // match: (EON x0 x1:(SLLconst [c] y)) - // cond: clobberIfDead(x1) - // result: (EONshiftLL x0 y [c]) + // match: (FMOVSload [off1] {sym} (ADDconst [off2] ptr) mem) + // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (FMOVSload [off1+off2] {sym} ptr mem) for { - _ = v.Args[1] - x0 := v.Args[0] - x1 := v.Args[1] - if x1.Op != OpARM64SLLconst { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADDconst { break } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { + off2 := v_0.AuxInt + ptr := v_0.Args[0] + if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(OpARM64EONshiftLL) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) + v.reset(OpARM64FMOVSload) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(ptr) + v.AddArg(mem) return true } - // match: (EON x0 x1:(SRLconst [c] y)) - // cond: clobberIfDead(x1) - // result: (EONshiftRL x0 y [c]) + // match: (FMOVSload [off] {sym} (ADD ptr idx) mem) + // cond: off == 0 && sym == nil + // result: (FMOVSloadidx ptr idx mem) for { - _ = v.Args[1] - x0 := v.Args[0] - x1 := v.Args[1] - if x1.Op != OpARM64SRLconst { + off := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADD { break } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { + idx := v_0.Args[1] + ptr := v_0.Args[0] + if !(off == 0 && sym == nil) { break } - v.reset(OpARM64EONshiftRL) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) + v.reset(OpARM64FMOVSloadidx) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) return true } - // match: (EON x0 x1:(SRAconst [c] y)) - // cond: clobberIfDead(x1) - // result: (EONshiftRA x0 y [c]) + // match: (FMOVSload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (FMOVSload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) for { - _ = v.Args[1] - x0 := v.Args[0] - x1 := v.Args[1] - if x1.Op != OpARM64SRAconst { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDaddr { break } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + ptr := v_0.Args[0] + if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(OpARM64EONshiftRA) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) + v.reset(OpARM64FMOVSload) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(ptr) + v.AddArg(mem) return true } return false } -func rewriteValueARM64_OpARM64EONshiftLL_0(v *Value) bool { - // match: (EONshiftLL x (MOVDconst [c]) [d]) - // result: (XORconst x [^int64(uint64(c)<>uint64(d))]) +func rewriteValueARM64_OpARM64FMOVSstore_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (FMOVSstore [off] {sym} ptr (FMOVSgpfp val) mem) + // result: (MOVWstore [off] {sym} ptr val mem) for { - d := v.AuxInt - _ = v.Args[1] - x := v.Args[0] + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + if v_1.Op != OpARM64FMOVSgpfp { break } - c := v_1.AuxInt - v.reset(OpARM64XORconst) - v.AuxInt = ^(c >> uint64(d)) - v.AddArg(x) + val := v_1.Args[0] + v.reset(OpARM64MOVWstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(val) + v.AddArg(mem) return true } - // match: (EONshiftRA x (SRAconst x [c]) [d]) - // cond: c==d - // result: (MOVDconst [-1]) + // match: (FMOVSstore [off1] {sym} (ADDconst [off2] ptr) val mem) + // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (FMOVSstore [off1+off2] {sym} ptr val mem) for { - d := v.AuxInt - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SRAconst { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADDconst { break } - c := v_1.AuxInt - if x != v_1.Args[0] || !(c == d) { + off2 := v_0.AuxInt + ptr := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = -1 + v.reset(OpARM64FMOVSstore) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(ptr) + v.AddArg(val) + v.AddArg(mem) return true } - return false -} -func rewriteValueARM64_OpARM64EONshiftRL_0(v *Value) bool { - // match: (EONshiftRL x (MOVDconst [c]) [d]) - // result: (XORconst x [^int64(uint64(c)>>uint64(d))]) + // match: (FMOVSstore [off] {sym} (ADD ptr idx) val mem) + // cond: off == 0 && sym == nil + // result: (FMOVSstoreidx ptr idx val mem) for { - d := v.AuxInt - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADD { break } - c := v_1.AuxInt - v.reset(OpARM64XORconst) - v.AuxInt = ^int64(uint64(c) >> uint64(d)) - v.AddArg(x) + idx := v_0.Args[1] + ptr := v_0.Args[0] + val := v.Args[1] + if !(off == 0 && sym == nil) { + break + } + v.reset(OpARM64FMOVSstoreidx) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) return true } - // match: (EONshiftRL x (SRLconst x [c]) [d]) - // cond: c==d - // result: (MOVDconst [-1]) + // match: (FMOVSstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (FMOVSstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) for { - d := v.AuxInt - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDaddr { break } - c := v_1.AuxInt - if x != v_1.Args[0] || !(c == d) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + ptr := v_0.Args[0] + val := v.Args[1] + if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = -1 + v.reset(OpARM64FMOVSstore) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(ptr) + v.AddArg(val) + v.AddArg(mem) return true } return false } -func rewriteValueARM64_OpARM64Equal_0(v *Value) bool { - // match: (Equal (FlagEQ)) - // result: (MOVDconst [1]) +func rewriteValueARM64_OpARM64FMOVSstoreidx_0(v *Value) bool { + // match: (FMOVSstoreidx ptr (MOVDconst [c]) val mem) + // result: (FMOVSstore [c] ptr val mem) for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagEQ { + mem := v.Args[3] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 1 + c := v_1.AuxInt + val := v.Args[2] + v.reset(OpARM64FMOVSstore) + v.AuxInt = c + v.AddArg(ptr) + v.AddArg(val) + v.AddArg(mem) return true } - // match: (Equal (FlagLT_ULT)) - // result: (MOVDconst [0]) + // match: (FMOVSstoreidx (MOVDconst [c]) idx val mem) + // result: (FMOVSstore [c] idx val mem) for { + mem := v.Args[3] v_0 := v.Args[0] - if v_0.Op != OpARM64FlagLT_ULT { + if v_0.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + c := v_0.AuxInt + idx := v.Args[1] + val := v.Args[2] + v.reset(OpARM64FMOVSstore) + v.AuxInt = c + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) return true } - // match: (Equal (FlagLT_UGT)) - // result: (MOVDconst [0]) + return false +} +func rewriteValueARM64_OpARM64FMULD_0(v *Value) bool { + // match: (FMULD (FNEGD x) y) + // result: (FNMULD x y) for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagLT_UGT { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARM64FNEGD { + continue + } + x := v_0.Args[0] + y := v.Args[1^_i0] + v.reset(OpARM64FNMULD) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 - return true + break } - // match: (Equal (FlagGT_ULT)) - // result: (MOVDconst [0]) + return false +} +func rewriteValueARM64_OpARM64FMULS_0(v *Value) bool { + // match: (FMULS (FNEGS x) y) + // result: (FNMULS x y) for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagGT_ULT { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARM64FNEGS { + continue + } + x := v_0.Args[0] + y := v.Args[1^_i0] + v.reset(OpARM64FNMULS) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 - return true + break } - // match: (Equal (FlagGT_UGT)) - // result: (MOVDconst [0]) + return false +} +func rewriteValueARM64_OpARM64FNEGD_0(v *Value) bool { + // match: (FNEGD (FMULD x y)) + // result: (FNMULD x y) for { v_0 := v.Args[0] - if v_0.Op != OpARM64FlagGT_UGT { + if v_0.Op != OpARM64FMULD { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpARM64FNMULD) + v.AddArg(x) + v.AddArg(y) return true } - // match: (Equal (InvertFlags x)) - // result: (Equal x) + // match: (FNEGD (FNMULD x y)) + // result: (FMULD x y) for { v_0 := v.Args[0] - if v_0.Op != OpARM64InvertFlags { + if v_0.Op != OpARM64FNMULD { break } + y := v_0.Args[1] x := v_0.Args[0] - v.reset(OpARM64Equal) + v.reset(OpARM64FMULD) v.AddArg(x) + v.AddArg(y) return true } return false } -func rewriteValueARM64_OpARM64FADDD_0(v *Value) bool { - // match: (FADDD a (FMULD x y)) - // result: (FMADDD a x y) +func rewriteValueARM64_OpARM64FNEGS_0(v *Value) bool { + // match: (FNEGS (FMULS x y)) + // result: (FNMULS x y) for { - _ = v.Args[1] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64FMULD { + v_0 := v.Args[0] + if v_0.Op != OpARM64FMULS { break } - y := v_1.Args[1] - x := v_1.Args[0] - v.reset(OpARM64FMADDD) - v.AddArg(a) + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpARM64FNMULS) v.AddArg(x) v.AddArg(y) return true } - // match: (FADDD (FMULD x y) a) - // result: (FMADDD a x y) + // match: (FNEGS (FNMULS x y)) + // result: (FMULS x y) + for { + v_0 := v.Args[0] + if v_0.Op != OpARM64FNMULS { + break + } + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpARM64FMULS) + v.AddArg(x) + v.AddArg(y) + return true + } + return false +} +func rewriteValueARM64_OpARM64FNMULD_0(v *Value) bool { + // match: (FNMULD (FNEGD x) y) + // result: (FMULD x y) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARM64FNEGD { + continue + } + x := v_0.Args[0] + y := v.Args[1^_i0] + v.reset(OpARM64FMULD) + v.AddArg(x) + v.AddArg(y) + return true + } + break + } + return false +} +func rewriteValueARM64_OpARM64FNMULS_0(v *Value) bool { + // match: (FNMULS (FNEGS x) y) + // result: (FMULS x y) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARM64FNEGS { + continue + } + x := v_0.Args[0] + y := v.Args[1^_i0] + v.reset(OpARM64FMULS) + v.AddArg(x) + v.AddArg(y) + return true + } + break + } + return false +} +func rewriteValueARM64_OpARM64FSUBD_0(v *Value) bool { + // match: (FSUBD a (FMULD x y)) + // result: (FMSUBD a x y) + for { + _ = v.Args[1] + a := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64FMULD { + break + } + y := v_1.Args[1] + x := v_1.Args[0] + v.reset(OpARM64FMSUBD) + v.AddArg(a) + v.AddArg(x) + v.AddArg(y) + return true + } + // match: (FSUBD (FMULD x y) a) + // result: (FNMSUBD a x y) for { a := v.Args[1] v_0 := v.Args[0] @@ -4559,14 +4879,14 @@ func rewriteValueARM64_OpARM64FADDD_0(v *Value) bool { } y := v_0.Args[1] x := v_0.Args[0] - v.reset(OpARM64FMADDD) + v.reset(OpARM64FNMSUBD) v.AddArg(a) v.AddArg(x) v.AddArg(y) return true } - // match: (FADDD a (FNMULD x y)) - // result: (FMSUBD a x y) + // match: (FSUBD a (FNMULD x y)) + // result: (FMADDD a x y) for { _ = v.Args[1] a := v.Args[0] @@ -4576,14 +4896,14 @@ func rewriteValueARM64_OpARM64FADDD_0(v *Value) bool { } y := v_1.Args[1] x := v_1.Args[0] - v.reset(OpARM64FMSUBD) + v.reset(OpARM64FMADDD) v.AddArg(a) v.AddArg(x) v.AddArg(y) return true } - // match: (FADDD (FNMULD x y) a) - // result: (FMSUBD a x y) + // match: (FSUBD (FNMULD x y) a) + // result: (FNMADDD a x y) for { a := v.Args[1] v_0 := v.Args[0] @@ -4592,7 +4912,7 @@ func rewriteValueARM64_OpARM64FADDD_0(v *Value) bool { } y := v_0.Args[1] x := v_0.Args[0] - v.reset(OpARM64FMSUBD) + v.reset(OpARM64FNMADDD) v.AddArg(a) v.AddArg(x) v.AddArg(y) @@ -4600,9 +4920,9 @@ func rewriteValueARM64_OpARM64FADDD_0(v *Value) bool { } return false } -func rewriteValueARM64_OpARM64FADDS_0(v *Value) bool { - // match: (FADDS a (FMULS x y)) - // result: (FMADDS a x y) +func rewriteValueARM64_OpARM64FSUBS_0(v *Value) bool { + // match: (FSUBS a (FMULS x y)) + // result: (FMSUBS a x y) for { _ = v.Args[1] a := v.Args[0] @@ -4612,14 +4932,14 @@ func rewriteValueARM64_OpARM64FADDS_0(v *Value) bool { } y := v_1.Args[1] x := v_1.Args[0] - v.reset(OpARM64FMADDS) + v.reset(OpARM64FMSUBS) v.AddArg(a) v.AddArg(x) v.AddArg(y) return true } - // match: (FADDS (FMULS x y) a) - // result: (FMADDS a x y) + // match: (FSUBS (FMULS x y) a) + // result: (FNMSUBS a x y) for { a := v.Args[1] v_0 := v.Args[0] @@ -4628,14 +4948,14 @@ func rewriteValueARM64_OpARM64FADDS_0(v *Value) bool { } y := v_0.Args[1] x := v_0.Args[0] - v.reset(OpARM64FMADDS) + v.reset(OpARM64FNMSUBS) v.AddArg(a) v.AddArg(x) v.AddArg(y) return true } - // match: (FADDS a (FNMULS x y)) - // result: (FMSUBS a x y) + // match: (FSUBS a (FNMULS x y)) + // result: (FMADDS a x y) for { _ = v.Args[1] a := v.Args[0] @@ -4645,14 +4965,14 @@ func rewriteValueARM64_OpARM64FADDS_0(v *Value) bool { } y := v_1.Args[1] x := v_1.Args[0] - v.reset(OpARM64FMSUBS) + v.reset(OpARM64FMADDS) v.AddArg(a) v.AddArg(x) v.AddArg(y) return true } - // match: (FADDS (FNMULS x y) a) - // result: (FMSUBS a x y) + // match: (FSUBS (FNMULS x y) a) + // result: (FNMADDS a x y) for { a := v.Args[1] v_0 := v.Args[0] @@ -4661,7 +4981,7 @@ func rewriteValueARM64_OpARM64FADDS_0(v *Value) bool { } y := v_0.Args[1] x := v_0.Args[0] - v.reset(OpARM64FMSUBS) + v.reset(OpARM64FNMADDS) v.AddArg(a) v.AddArg(x) v.AddArg(y) @@ -4669,1651 +4989,1163 @@ func rewriteValueARM64_OpARM64FADDS_0(v *Value) bool { } return false } -func rewriteValueARM64_OpARM64FCMPD_0(v *Value) bool { - b := v.Block - // match: (FCMPD x (FMOVDconst [0])) - // result: (FCMPD0 x) +func rewriteValueARM64_OpARM64GreaterEqual_0(v *Value) bool { + // match: (GreaterEqual (FlagEQ)) + // result: (MOVDconst [1]) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64FMOVDconst || v_1.AuxInt != 0 { + v_0 := v.Args[0] + if v_0.Op != OpARM64FlagEQ { break } - v.reset(OpARM64FCMPD0) - v.AddArg(x) + v.reset(OpARM64MOVDconst) + v.AuxInt = 1 return true } - // match: (FCMPD (FMOVDconst [0]) x) - // result: (InvertFlags (FCMPD0 x)) + // match: (GreaterEqual (FlagLT_ULT)) + // result: (MOVDconst [0]) for { - x := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64FMOVDconst || v_0.AuxInt != 0 { + if v_0.Op != OpARM64FlagLT_ULT { break } - v.reset(OpARM64InvertFlags) - v0 := b.NewValue0(v.Pos, OpARM64FCMPD0, types.TypeFlags) - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } - return false -} -func rewriteValueARM64_OpARM64FCMPS_0(v *Value) bool { - b := v.Block - // match: (FCMPS x (FMOVSconst [0])) - // result: (FCMPS0 x) + // match: (GreaterEqual (FlagLT_UGT)) + // result: (MOVDconst [0]) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64FMOVSconst || v_1.AuxInt != 0 { + v_0 := v.Args[0] + if v_0.Op != OpARM64FlagLT_UGT { break } - v.reset(OpARM64FCMPS0) - v.AddArg(x) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } - // match: (FCMPS (FMOVSconst [0]) x) - // result: (InvertFlags (FCMPS0 x)) + // match: (GreaterEqual (FlagGT_ULT)) + // result: (MOVDconst [1]) for { - x := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64FMOVSconst || v_0.AuxInt != 0 { + if v_0.Op != OpARM64FlagGT_ULT { break } - v.reset(OpARM64InvertFlags) - v0 := b.NewValue0(v.Pos, OpARM64FCMPS0, types.TypeFlags) - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpARM64MOVDconst) + v.AuxInt = 1 return true } - return false -} -func rewriteValueARM64_OpARM64FMOVDfpgp_0(v *Value) bool { - b := v.Block - // match: (FMOVDfpgp (Arg [off] {sym})) - // result: @b.Func.Entry (Arg [off] {sym}) + // match: (GreaterEqual (FlagGT_UGT)) + // result: (MOVDconst [1]) for { - t := v.Type v_0 := v.Args[0] - if v_0.Op != OpArg { + if v_0.Op != OpARM64FlagGT_UGT { break } - off := v_0.AuxInt - sym := v_0.Aux - b = b.Func.Entry - v0 := b.NewValue0(v.Pos, OpArg, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = off - v0.Aux = sym + v.reset(OpARM64MOVDconst) + v.AuxInt = 1 + return true + } + // match: (GreaterEqual (InvertFlags x)) + // result: (LessEqual x) + for { + v_0 := v.Args[0] + if v_0.Op != OpARM64InvertFlags { + break + } + x := v_0.Args[0] + v.reset(OpARM64LessEqual) + v.AddArg(x) return true } return false } -func rewriteValueARM64_OpARM64FMOVDgpfp_0(v *Value) bool { - b := v.Block - // match: (FMOVDgpfp (Arg [off] {sym})) - // result: @b.Func.Entry (Arg [off] {sym}) +func rewriteValueARM64_OpARM64GreaterEqualF_0(v *Value) bool { + // match: (GreaterEqualF (InvertFlags x)) + // result: (LessEqualF x) for { - t := v.Type v_0 := v.Args[0] - if v_0.Op != OpArg { + if v_0.Op != OpARM64InvertFlags { break } - off := v_0.AuxInt - sym := v_0.Aux - b = b.Func.Entry - v0 := b.NewValue0(v.Pos, OpArg, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = off - v0.Aux = sym + x := v_0.Args[0] + v.reset(OpARM64LessEqualF) + v.AddArg(x) return true } return false } -func rewriteValueARM64_OpARM64FMOVDload_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (FMOVDload [off] {sym} ptr (MOVDstore [off] {sym} ptr val _)) - // result: (FMOVDgpfp val) +func rewriteValueARM64_OpARM64GreaterEqualU_0(v *Value) bool { + // match: (GreaterEqualU (FlagEQ)) + // result: (MOVDconst [1]) for { - off := v.AuxInt - sym := v.Aux - _ = v.Args[1] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDstore || v_1.AuxInt != off || v_1.Aux != sym { + v_0 := v.Args[0] + if v_0.Op != OpARM64FlagEQ { break } - _ = v_1.Args[2] - if ptr != v_1.Args[0] { + v.reset(OpARM64MOVDconst) + v.AuxInt = 1 + return true + } + // match: (GreaterEqualU (FlagLT_ULT)) + // result: (MOVDconst [0]) + for { + v_0 := v.Args[0] + if v_0.Op != OpARM64FlagLT_ULT { break } - val := v_1.Args[1] - v.reset(OpARM64FMOVDgpfp) - v.AddArg(val) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } - // match: (FMOVDload [off1] {sym} (ADDconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (FMOVDload [off1+off2] {sym} ptr mem) + // match: (GreaterEqualU (FlagLT_UGT)) + // result: (MOVDconst [1]) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64ADDconst { + if v_0.Op != OpARM64FlagLT_UGT { break } - off2 := v_0.AuxInt - ptr := v_0.Args[0] - if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { - break - } - v.reset(OpARM64FMOVDload) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(ptr) - v.AddArg(mem) + v.reset(OpARM64MOVDconst) + v.AuxInt = 1 return true } - // match: (FMOVDload [off] {sym} (ADD ptr idx) mem) - // cond: off == 0 && sym == nil - // result: (FMOVDloadidx ptr idx mem) + // match: (GreaterEqualU (FlagGT_ULT)) + // result: (MOVDconst [0]) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { - break - } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(off == 0 && sym == nil) { + if v_0.Op != OpARM64FlagGT_ULT { break } - v.reset(OpARM64FMOVDloadidx) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } - // match: (FMOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (FMOVDload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) + // match: (GreaterEqualU (FlagGT_UGT)) + // result: (MOVDconst [1]) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDaddr { + if v_0.Op != OpARM64FlagGT_UGT { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - ptr := v_0.Args[0] - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + v.reset(OpARM64MOVDconst) + v.AuxInt = 1 + return true + } + // match: (GreaterEqualU (InvertFlags x)) + // result: (LessEqualU x) + for { + v_0 := v.Args[0] + if v_0.Op != OpARM64InvertFlags { break } - v.reset(OpARM64FMOVDload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(mem) + x := v_0.Args[0] + v.reset(OpARM64LessEqualU) + v.AddArg(x) return true } return false } -func rewriteValueARM64_OpARM64FMOVDloadidx_0(v *Value) bool { - // match: (FMOVDloadidx ptr (MOVDconst [c]) mem) - // result: (FMOVDload [c] ptr mem) +func rewriteValueARM64_OpARM64GreaterThan_0(v *Value) bool { + // match: (GreaterThan (FlagEQ)) + // result: (MOVDconst [0]) for { - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + v_0 := v.Args[0] + if v_0.Op != OpARM64FlagEQ { break } - c := v_1.AuxInt - v.reset(OpARM64FMOVDload) - v.AuxInt = c - v.AddArg(ptr) - v.AddArg(mem) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } - // match: (FMOVDloadidx (MOVDconst [c]) ptr mem) - // result: (FMOVDload [c] ptr mem) + // match: (GreaterThan (FlagLT_ULT)) + // result: (MOVDconst [0]) for { - mem := v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + if v_0.Op != OpARM64FlagLT_ULT { break } - c := v_0.AuxInt - ptr := v.Args[1] - v.reset(OpARM64FMOVDload) - v.AuxInt = c - v.AddArg(ptr) - v.AddArg(mem) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } - return false -} -func rewriteValueARM64_OpARM64FMOVDstore_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (FMOVDstore [off] {sym} ptr (FMOVDgpfp val) mem) - // result: (MOVDstore [off] {sym} ptr val mem) + // match: (GreaterThan (FlagLT_UGT)) + // result: (MOVDconst [0]) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64FMOVDgpfp { + v_0 := v.Args[0] + if v_0.Op != OpARM64FlagLT_UGT { break } - val := v_1.Args[0] - v.reset(OpARM64MOVDstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(val) - v.AddArg(mem) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } - // match: (FMOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) - // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (FMOVDstore [off1+off2] {sym} ptr val mem) + // match: (GreaterThan (FlagGT_ULT)) + // result: (MOVDconst [1]) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpARM64ADDconst { - break - } - off2 := v_0.AuxInt - ptr := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + if v_0.Op != OpARM64FlagGT_ULT { break } - v.reset(OpARM64FMOVDstore) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(ptr) - v.AddArg(val) - v.AddArg(mem) + v.reset(OpARM64MOVDconst) + v.AuxInt = 1 return true } - // match: (FMOVDstore [off] {sym} (ADD ptr idx) val mem) - // cond: off == 0 && sym == nil - // result: (FMOVDstoreidx ptr idx val mem) + // match: (GreaterThan (FlagGT_UGT)) + // result: (MOVDconst [1]) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { - break - } - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v.Args[1] - if !(off == 0 && sym == nil) { + if v_0.Op != OpARM64FlagGT_UGT { break } - v.reset(OpARM64FMOVDstoreidx) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) + v.reset(OpARM64MOVDconst) + v.AuxInt = 1 return true } - // match: (FMOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (FMOVDstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) + // match: (GreaterThan (InvertFlags x)) + // result: (LessThan x) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDaddr { - break - } - off2 := v_0.AuxInt - sym2 := v_0.Aux - ptr := v_0.Args[0] - val := v.Args[1] - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + if v_0.Op != OpARM64InvertFlags { break } - v.reset(OpARM64FMOVDstore) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(val) - v.AddArg(mem) + x := v_0.Args[0] + v.reset(OpARM64LessThan) + v.AddArg(x) return true } return false } -func rewriteValueARM64_OpARM64FMOVDstoreidx_0(v *Value) bool { - // match: (FMOVDstoreidx ptr (MOVDconst [c]) val mem) - // result: (FMOVDstore [c] ptr val mem) +func rewriteValueARM64_OpARM64GreaterThanF_0(v *Value) bool { + // match: (GreaterThanF (InvertFlags x)) + // result: (LessThanF x) for { - mem := v.Args[3] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + v_0 := v.Args[0] + if v_0.Op != OpARM64InvertFlags { break } - c := v_1.AuxInt - val := v.Args[2] - v.reset(OpARM64FMOVDstore) - v.AuxInt = c - v.AddArg(ptr) - v.AddArg(val) - v.AddArg(mem) + x := v_0.Args[0] + v.reset(OpARM64LessThanF) + v.AddArg(x) return true } - // match: (FMOVDstoreidx (MOVDconst [c]) idx val mem) - // result: (FMOVDstore [c] idx val mem) + return false +} +func rewriteValueARM64_OpARM64GreaterThanU_0(v *Value) bool { + // match: (GreaterThanU (FlagEQ)) + // result: (MOVDconst [0]) for { - mem := v.Args[3] v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + if v_0.Op != OpARM64FlagEQ { break } - c := v_0.AuxInt - idx := v.Args[1] - val := v.Args[2] - v.reset(OpARM64FMOVDstore) - v.AuxInt = c - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } - return false -} -func rewriteValueARM64_OpARM64FMOVSload_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (FMOVSload [off] {sym} ptr (MOVWstore [off] {sym} ptr val _)) - // result: (FMOVSgpfp val) + // match: (GreaterThanU (FlagLT_ULT)) + // result: (MOVDconst [0]) for { - off := v.AuxInt - sym := v.Aux - _ = v.Args[1] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVWstore || v_1.AuxInt != off || v_1.Aux != sym { + v_0 := v.Args[0] + if v_0.Op != OpARM64FlagLT_ULT { break } - _ = v_1.Args[2] - if ptr != v_1.Args[0] { - break - } - val := v_1.Args[1] - v.reset(OpARM64FMOVSgpfp) - v.AddArg(val) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } - // match: (FMOVSload [off1] {sym} (ADDconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (FMOVSload [off1+off2] {sym} ptr mem) + // match: (GreaterThanU (FlagLT_UGT)) + // result: (MOVDconst [1]) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64ADDconst { - break - } - off2 := v_0.AuxInt - ptr := v_0.Args[0] - if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + if v_0.Op != OpARM64FlagLT_UGT { break } - v.reset(OpARM64FMOVSload) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(ptr) - v.AddArg(mem) + v.reset(OpARM64MOVDconst) + v.AuxInt = 1 return true } - // match: (FMOVSload [off] {sym} (ADD ptr idx) mem) - // cond: off == 0 && sym == nil - // result: (FMOVSloadidx ptr idx mem) + // match: (GreaterThanU (FlagGT_ULT)) + // result: (MOVDconst [0]) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { - break - } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(off == 0 && sym == nil) { + if v_0.Op != OpARM64FlagGT_ULT { break } - v.reset(OpARM64FMOVSloadidx) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } - // match: (FMOVSload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (FMOVSload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) + // match: (GreaterThanU (FlagGT_UGT)) + // result: (MOVDconst [1]) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDaddr { - break - } - off2 := v_0.AuxInt - sym2 := v_0.Aux - ptr := v_0.Args[0] - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { - break - } - v.reset(OpARM64FMOVSload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueARM64_OpARM64FMOVSloadidx_0(v *Value) bool { - // match: (FMOVSloadidx ptr (MOVDconst [c]) mem) - // result: (FMOVSload [c] ptr mem) - for { - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + if v_0.Op != OpARM64FlagGT_UGT { break } - c := v_1.AuxInt - v.reset(OpARM64FMOVSload) - v.AuxInt = c - v.AddArg(ptr) - v.AddArg(mem) + v.reset(OpARM64MOVDconst) + v.AuxInt = 1 return true } - // match: (FMOVSloadidx (MOVDconst [c]) ptr mem) - // result: (FMOVSload [c] ptr mem) + // match: (GreaterThanU (InvertFlags x)) + // result: (LessThanU x) for { - mem := v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + if v_0.Op != OpARM64InvertFlags { break } - c := v_0.AuxInt - ptr := v.Args[1] - v.reset(OpARM64FMOVSload) - v.AuxInt = c - v.AddArg(ptr) - v.AddArg(mem) + x := v_0.Args[0] + v.reset(OpARM64LessThanU) + v.AddArg(x) return true } return false } -func rewriteValueARM64_OpARM64FMOVSstore_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (FMOVSstore [off] {sym} ptr (FMOVSgpfp val) mem) - // result: (MOVWstore [off] {sym} ptr val mem) +func rewriteValueARM64_OpARM64LessEqual_0(v *Value) bool { + // match: (LessEqual (FlagEQ)) + // result: (MOVDconst [1]) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64FMOVSgpfp { + v_0 := v.Args[0] + if v_0.Op != OpARM64FlagEQ { break } - val := v_1.Args[0] - v.reset(OpARM64MOVWstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(val) - v.AddArg(mem) + v.reset(OpARM64MOVDconst) + v.AuxInt = 1 return true } - // match: (FMOVSstore [off1] {sym} (ADDconst [off2] ptr) val mem) - // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (FMOVSstore [off1+off2] {sym} ptr val mem) + // match: (LessEqual (FlagLT_ULT)) + // result: (MOVDconst [1]) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpARM64ADDconst { - break - } - off2 := v_0.AuxInt - ptr := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + if v_0.Op != OpARM64FlagLT_ULT { break } - v.reset(OpARM64FMOVSstore) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(ptr) - v.AddArg(val) - v.AddArg(mem) + v.reset(OpARM64MOVDconst) + v.AuxInt = 1 return true } - // match: (FMOVSstore [off] {sym} (ADD ptr idx) val mem) - // cond: off == 0 && sym == nil - // result: (FMOVSstoreidx ptr idx val mem) + // match: (LessEqual (FlagLT_UGT)) + // result: (MOVDconst [1]) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { - break - } - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v.Args[1] - if !(off == 0 && sym == nil) { + if v_0.Op != OpARM64FlagLT_UGT { break } - v.reset(OpARM64FMOVSstoreidx) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) + v.reset(OpARM64MOVDconst) + v.AuxInt = 1 return true } - // match: (FMOVSstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (FMOVSstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) + // match: (LessEqual (FlagGT_ULT)) + // result: (MOVDconst [0]) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDaddr { - break - } - off2 := v_0.AuxInt - sym2 := v_0.Aux - ptr := v_0.Args[0] - val := v.Args[1] - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + if v_0.Op != OpARM64FlagGT_ULT { break } - v.reset(OpARM64FMOVSstore) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(val) - v.AddArg(mem) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } - return false -} -func rewriteValueARM64_OpARM64FMOVSstoreidx_0(v *Value) bool { - // match: (FMOVSstoreidx ptr (MOVDconst [c]) val mem) - // result: (FMOVSstore [c] ptr val mem) + // match: (LessEqual (FlagGT_UGT)) + // result: (MOVDconst [0]) for { - mem := v.Args[3] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + v_0 := v.Args[0] + if v_0.Op != OpARM64FlagGT_UGT { break } - c := v_1.AuxInt - val := v.Args[2] - v.reset(OpARM64FMOVSstore) - v.AuxInt = c - v.AddArg(ptr) - v.AddArg(val) - v.AddArg(mem) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } - // match: (FMOVSstoreidx (MOVDconst [c]) idx val mem) - // result: (FMOVSstore [c] idx val mem) + // match: (LessEqual (InvertFlags x)) + // result: (GreaterEqual x) for { - mem := v.Args[3] v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + if v_0.Op != OpARM64InvertFlags { break } - c := v_0.AuxInt - idx := v.Args[1] - val := v.Args[2] - v.reset(OpARM64FMOVSstore) - v.AuxInt = c - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) + x := v_0.Args[0] + v.reset(OpARM64GreaterEqual) + v.AddArg(x) return true } return false } -func rewriteValueARM64_OpARM64FMULD_0(v *Value) bool { - // match: (FMULD (FNEGD x) y) - // result: (FNMULD x y) +func rewriteValueARM64_OpARM64LessEqualF_0(v *Value) bool { + // match: (LessEqualF (InvertFlags x)) + // result: (GreaterEqualF x) for { - y := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64FNEGD { + if v_0.Op != OpARM64InvertFlags { break } x := v_0.Args[0] - v.reset(OpARM64FNMULD) + v.reset(OpARM64GreaterEqualF) v.AddArg(x) - v.AddArg(y) - return true - } - // match: (FMULD y (FNEGD x)) - // result: (FNMULD x y) - for { - _ = v.Args[1] - y := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64FNEGD { - break - } - x := v_1.Args[0] - v.reset(OpARM64FNMULD) - v.AddArg(x) - v.AddArg(y) return true } return false } -func rewriteValueARM64_OpARM64FMULS_0(v *Value) bool { - // match: (FMULS (FNEGS x) y) - // result: (FNMULS x y) +func rewriteValueARM64_OpARM64LessEqualU_0(v *Value) bool { + // match: (LessEqualU (FlagEQ)) + // result: (MOVDconst [1]) for { - y := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64FNEGS { + if v_0.Op != OpARM64FlagEQ { break } - x := v_0.Args[0] - v.reset(OpARM64FNMULS) - v.AddArg(x) - v.AddArg(y) + v.reset(OpARM64MOVDconst) + v.AuxInt = 1 return true } - // match: (FMULS y (FNEGS x)) - // result: (FNMULS x y) + // match: (LessEqualU (FlagLT_ULT)) + // result: (MOVDconst [1]) for { - _ = v.Args[1] - y := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64FNEGS { + v_0 := v.Args[0] + if v_0.Op != OpARM64FlagLT_ULT { break } - x := v_1.Args[0] - v.reset(OpARM64FNMULS) - v.AddArg(x) - v.AddArg(y) + v.reset(OpARM64MOVDconst) + v.AuxInt = 1 return true } - return false -} -func rewriteValueARM64_OpARM64FNEGD_0(v *Value) bool { - // match: (FNEGD (FMULD x y)) - // result: (FNMULD x y) + // match: (LessEqualU (FlagLT_UGT)) + // result: (MOVDconst [0]) for { v_0 := v.Args[0] - if v_0.Op != OpARM64FMULD { + if v_0.Op != OpARM64FlagLT_UGT { break } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpARM64FNMULD) - v.AddArg(x) - v.AddArg(y) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } - // match: (FNEGD (FNMULD x y)) - // result: (FMULD x y) + // match: (LessEqualU (FlagGT_ULT)) + // result: (MOVDconst [1]) for { v_0 := v.Args[0] - if v_0.Op != OpARM64FNMULD { + if v_0.Op != OpARM64FlagGT_ULT { break } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpARM64FMULD) - v.AddArg(x) - v.AddArg(y) + v.reset(OpARM64MOVDconst) + v.AuxInt = 1 return true } - return false -} -func rewriteValueARM64_OpARM64FNEGS_0(v *Value) bool { - // match: (FNEGS (FMULS x y)) - // result: (FNMULS x y) + // match: (LessEqualU (FlagGT_UGT)) + // result: (MOVDconst [0]) for { v_0 := v.Args[0] - if v_0.Op != OpARM64FMULS { + if v_0.Op != OpARM64FlagGT_UGT { break } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpARM64FNMULS) - v.AddArg(x) - v.AddArg(y) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } - // match: (FNEGS (FNMULS x y)) - // result: (FMULS x y) + // match: (LessEqualU (InvertFlags x)) + // result: (GreaterEqualU x) for { v_0 := v.Args[0] - if v_0.Op != OpARM64FNMULS { + if v_0.Op != OpARM64InvertFlags { break } - y := v_0.Args[1] x := v_0.Args[0] - v.reset(OpARM64FMULS) + v.reset(OpARM64GreaterEqualU) v.AddArg(x) - v.AddArg(y) return true } return false } -func rewriteValueARM64_OpARM64FNMULD_0(v *Value) bool { - // match: (FNMULD (FNEGD x) y) - // result: (FMULD x y) +func rewriteValueARM64_OpARM64LessThan_0(v *Value) bool { + // match: (LessThan (FlagEQ)) + // result: (MOVDconst [0]) for { - y := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64FNEGD { + if v_0.Op != OpARM64FlagEQ { break } - x := v_0.Args[0] - v.reset(OpARM64FMULD) - v.AddArg(x) - v.AddArg(y) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } - // match: (FNMULD y (FNEGD x)) - // result: (FMULD x y) + // match: (LessThan (FlagLT_ULT)) + // result: (MOVDconst [1]) for { - _ = v.Args[1] - y := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64FNEGD { + v_0 := v.Args[0] + if v_0.Op != OpARM64FlagLT_ULT { break } - x := v_1.Args[0] - v.reset(OpARM64FMULD) - v.AddArg(x) - v.AddArg(y) + v.reset(OpARM64MOVDconst) + v.AuxInt = 1 return true } - return false -} -func rewriteValueARM64_OpARM64FNMULS_0(v *Value) bool { - // match: (FNMULS (FNEGS x) y) - // result: (FMULS x y) + // match: (LessThan (FlagLT_UGT)) + // result: (MOVDconst [1]) for { - y := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64FNEGS { + if v_0.Op != OpARM64FlagLT_UGT { break } - x := v_0.Args[0] - v.reset(OpARM64FMULS) - v.AddArg(x) - v.AddArg(y) + v.reset(OpARM64MOVDconst) + v.AuxInt = 1 return true } - // match: (FNMULS y (FNEGS x)) - // result: (FMULS x y) + // match: (LessThan (FlagGT_ULT)) + // result: (MOVDconst [0]) for { - _ = v.Args[1] - y := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64FNEGS { + v_0 := v.Args[0] + if v_0.Op != OpARM64FlagGT_ULT { break } - x := v_1.Args[0] - v.reset(OpARM64FMULS) - v.AddArg(x) - v.AddArg(y) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } - return false -} -func rewriteValueARM64_OpARM64FSUBD_0(v *Value) bool { - // match: (FSUBD a (FMULD x y)) - // result: (FMSUBD a x y) + // match: (LessThan (FlagGT_UGT)) + // result: (MOVDconst [0]) for { - _ = v.Args[1] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64FMULD { + v_0 := v.Args[0] + if v_0.Op != OpARM64FlagGT_UGT { break } - y := v_1.Args[1] - x := v_1.Args[0] - v.reset(OpARM64FMSUBD) - v.AddArg(a) - v.AddArg(x) - v.AddArg(y) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } - // match: (FSUBD (FMULD x y) a) - // result: (FNMSUBD a x y) + // match: (LessThan (InvertFlags x)) + // result: (GreaterThan x) for { - a := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64FMULD { + if v_0.Op != OpARM64InvertFlags { break } - y := v_0.Args[1] x := v_0.Args[0] - v.reset(OpARM64FNMSUBD) - v.AddArg(a) + v.reset(OpARM64GreaterThan) v.AddArg(x) - v.AddArg(y) return true } - // match: (FSUBD a (FNMULD x y)) - // result: (FMADDD a x y) + return false +} +func rewriteValueARM64_OpARM64LessThanF_0(v *Value) bool { + // match: (LessThanF (InvertFlags x)) + // result: (GreaterThanF x) for { - _ = v.Args[1] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64FNMULD { + v_0 := v.Args[0] + if v_0.Op != OpARM64InvertFlags { break } - y := v_1.Args[1] - x := v_1.Args[0] - v.reset(OpARM64FMADDD) - v.AddArg(a) + x := v_0.Args[0] + v.reset(OpARM64GreaterThanF) v.AddArg(x) - v.AddArg(y) return true } - // match: (FSUBD (FNMULD x y) a) - // result: (FNMADDD a x y) + return false +} +func rewriteValueARM64_OpARM64LessThanU_0(v *Value) bool { + // match: (LessThanU (FlagEQ)) + // result: (MOVDconst [0]) for { - a := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64FNMULD { + if v_0.Op != OpARM64FlagEQ { break } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpARM64FNMADDD) - v.AddArg(a) - v.AddArg(x) - v.AddArg(y) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } - return false -} -func rewriteValueARM64_OpARM64FSUBS_0(v *Value) bool { - // match: (FSUBS a (FMULS x y)) - // result: (FMSUBS a x y) + // match: (LessThanU (FlagLT_ULT)) + // result: (MOVDconst [1]) for { - _ = v.Args[1] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64FMULS { + v_0 := v.Args[0] + if v_0.Op != OpARM64FlagLT_ULT { break } - y := v_1.Args[1] - x := v_1.Args[0] - v.reset(OpARM64FMSUBS) - v.AddArg(a) - v.AddArg(x) - v.AddArg(y) + v.reset(OpARM64MOVDconst) + v.AuxInt = 1 return true } - // match: (FSUBS (FMULS x y) a) - // result: (FNMSUBS a x y) + // match: (LessThanU (FlagLT_UGT)) + // result: (MOVDconst [0]) for { - a := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64FMULS { + if v_0.Op != OpARM64FlagLT_UGT { break } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpARM64FNMSUBS) - v.AddArg(a) - v.AddArg(x) - v.AddArg(y) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } - // match: (FSUBS a (FNMULS x y)) - // result: (FMADDS a x y) - for { - _ = v.Args[1] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64FNMULS { - break - } - y := v_1.Args[1] - x := v_1.Args[0] - v.reset(OpARM64FMADDS) - v.AddArg(a) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (FSUBS (FNMULS x y) a) - // result: (FNMADDS a x y) - for { - a := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64FNMULS { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpARM64FNMADDS) - v.AddArg(a) - v.AddArg(x) - v.AddArg(y) - return true - } - return false -} -func rewriteValueARM64_OpARM64GreaterEqual_0(v *Value) bool { - // match: (GreaterEqual (FlagEQ)) + // match: (LessThanU (FlagGT_ULT)) // result: (MOVDconst [1]) for { v_0 := v.Args[0] - if v_0.Op != OpARM64FlagEQ { + if v_0.Op != OpARM64FlagGT_ULT { break } v.reset(OpARM64MOVDconst) v.AuxInt = 1 return true } - // match: (GreaterEqual (FlagLT_ULT)) + // match: (LessThanU (FlagGT_UGT)) // result: (MOVDconst [0]) for { v_0 := v.Args[0] - if v_0.Op != OpARM64FlagLT_ULT { + if v_0.Op != OpARM64FlagGT_UGT { break } v.reset(OpARM64MOVDconst) v.AuxInt = 0 return true } - // match: (GreaterEqual (FlagLT_UGT)) - // result: (MOVDconst [0]) + // match: (LessThanU (InvertFlags x)) + // result: (GreaterThanU x) for { v_0 := v.Args[0] - if v_0.Op != OpARM64FlagLT_UGT { + if v_0.Op != OpARM64InvertFlags { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + x := v_0.Args[0] + v.reset(OpARM64GreaterThanU) + v.AddArg(x) return true } - // match: (GreaterEqual (FlagGT_ULT)) - // result: (MOVDconst [1]) + return false +} +func rewriteValueARM64_OpARM64MADD_0(v *Value) bool { + b := v.Block + // match: (MADD a x (MOVDconst [-1])) + // result: (SUB a x) for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagGT_ULT { + _ = v.Args[2] + a := v.Args[0] + x := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != -1 { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 1 + v.reset(OpARM64SUB) + v.AddArg(a) + v.AddArg(x) return true } - // match: (GreaterEqual (FlagGT_UGT)) - // result: (MOVDconst [1]) + // match: (MADD a _ (MOVDconst [0])) + // result: a for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagGT_UGT { + _ = v.Args[2] + a := v.Args[0] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 0 { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 1 + v.reset(OpCopy) + v.Type = a.Type + v.AddArg(a) return true } - // match: (GreaterEqual (InvertFlags x)) - // result: (LessEqual x) + // match: (MADD a x (MOVDconst [1])) + // result: (ADD a x) for { - v_0 := v.Args[0] - if v_0.Op != OpARM64InvertFlags { + _ = v.Args[2] + a := v.Args[0] + x := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 1 { break } - x := v_0.Args[0] - v.reset(OpARM64LessEqual) + v.reset(OpARM64ADD) + v.AddArg(a) v.AddArg(x) return true } - return false -} -func rewriteValueARM64_OpARM64GreaterEqualF_0(v *Value) bool { - // match: (GreaterEqualF (InvertFlags x)) - // result: (LessEqualF x) + // match: (MADD a x (MOVDconst [c])) + // cond: isPowerOfTwo(c) + // result: (ADDshiftLL a x [log2(c)]) for { - v_0 := v.Args[0] - if v_0.Op != OpARM64InvertFlags { + _ = v.Args[2] + a := v.Args[0] + x := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst { break } - x := v_0.Args[0] - v.reset(OpARM64LessEqualF) + c := v_2.AuxInt + if !(isPowerOfTwo(c)) { + break + } + v.reset(OpARM64ADDshiftLL) + v.AuxInt = log2(c) + v.AddArg(a) v.AddArg(x) return true } - return false -} -func rewriteValueARM64_OpARM64GreaterEqualU_0(v *Value) bool { - // match: (GreaterEqualU (FlagEQ)) - // result: (MOVDconst [1]) + // match: (MADD a x (MOVDconst [c])) + // cond: isPowerOfTwo(c-1) && c>=3 + // result: (ADD a (ADDshiftLL x x [log2(c-1)])) for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagEQ { + _ = v.Args[2] + a := v.Args[0] + x := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 1 - return true - } - // match: (GreaterEqualU (FlagLT_ULT)) - // result: (MOVDconst [0]) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagLT_ULT { + c := v_2.AuxInt + if !(isPowerOfTwo(c-1) && c >= 3) { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.reset(OpARM64ADD) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = log2(c - 1) + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (GreaterEqualU (FlagLT_UGT)) - // result: (MOVDconst [1]) + // match: (MADD a x (MOVDconst [c])) + // cond: isPowerOfTwo(c+1) && c>=7 + // result: (SUB a (SUBshiftLL x x [log2(c+1)])) for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagLT_UGT { + _ = v.Args[2] + a := v.Args[0] + x := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 1 - return true - } - // match: (GreaterEqualU (FlagGT_ULT)) - // result: (MOVDconst [0]) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagGT_ULT { + c := v_2.AuxInt + if !(isPowerOfTwo(c+1) && c >= 7) { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.reset(OpARM64SUB) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) + v0.AuxInt = log2(c + 1) + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (GreaterEqualU (FlagGT_UGT)) - // result: (MOVDconst [1]) + // match: (MADD a x (MOVDconst [c])) + // cond: c%3 == 0 && isPowerOfTwo(c/3) + // result: (SUBshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagGT_UGT { + _ = v.Args[2] + a := v.Args[0] + x := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 1 - return true - } - // match: (GreaterEqualU (InvertFlags x)) - // result: (LessEqualU x) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64InvertFlags { + c := v_2.AuxInt + if !(c%3 == 0 && isPowerOfTwo(c/3)) { break } - x := v_0.Args[0] - v.reset(OpARM64LessEqualU) - v.AddArg(x) + v.reset(OpARM64SUBshiftLL) + v.AuxInt = log2(c / 3) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) + v0.AuxInt = 2 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - return false -} -func rewriteValueARM64_OpARM64GreaterThan_0(v *Value) bool { - // match: (GreaterThan (FlagEQ)) - // result: (MOVDconst [0]) + // match: (MADD a x (MOVDconst [c])) + // cond: c%5 == 0 && isPowerOfTwo(c/5) + // result: (ADDshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagEQ { + _ = v.Args[2] + a := v.Args[0] + x := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 - return true - } - // match: (GreaterThan (FlagLT_ULT)) - // result: (MOVDconst [0]) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagLT_ULT { + c := v_2.AuxInt + if !(c%5 == 0 && isPowerOfTwo(c/5)) { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.reset(OpARM64ADDshiftLL) + v.AuxInt = log2(c / 5) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = 2 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (GreaterThan (FlagLT_UGT)) - // result: (MOVDconst [0]) + // match: (MADD a x (MOVDconst [c])) + // cond: c%7 == 0 && isPowerOfTwo(c/7) + // result: (SUBshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagLT_UGT { + _ = v.Args[2] + a := v.Args[0] + x := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 - return true - } - // match: (GreaterThan (FlagGT_ULT)) - // result: (MOVDconst [1]) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagGT_ULT { + c := v_2.AuxInt + if !(c%7 == 0 && isPowerOfTwo(c/7)) { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 1 + v.reset(OpARM64SUBshiftLL) + v.AuxInt = log2(c / 7) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) + v0.AuxInt = 3 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (GreaterThan (FlagGT_UGT)) - // result: (MOVDconst [1]) + // match: (MADD a x (MOVDconst [c])) + // cond: c%9 == 0 && isPowerOfTwo(c/9) + // result: (ADDshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagGT_UGT { + _ = v.Args[2] + a := v.Args[0] + x := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 1 - return true - } - // match: (GreaterThan (InvertFlags x)) - // result: (LessThan x) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64InvertFlags { + c := v_2.AuxInt + if !(c%9 == 0 && isPowerOfTwo(c/9)) { break } - x := v_0.Args[0] - v.reset(OpARM64LessThan) - v.AddArg(x) + v.reset(OpARM64ADDshiftLL) + v.AuxInt = log2(c / 9) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = 3 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } return false } -func rewriteValueARM64_OpARM64GreaterThanF_0(v *Value) bool { - // match: (GreaterThanF (InvertFlags x)) - // result: (LessThanF x) +func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { + b := v.Block + // match: (MADD a (MOVDconst [-1]) x) + // result: (SUB a x) for { - v_0 := v.Args[0] - if v_0.Op != OpARM64InvertFlags { + x := v.Args[2] + a := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != -1 { break } - x := v_0.Args[0] - v.reset(OpARM64LessThanF) + v.reset(OpARM64SUB) + v.AddArg(a) v.AddArg(x) return true } - return false -} -func rewriteValueARM64_OpARM64GreaterThanU_0(v *Value) bool { - // match: (GreaterThanU (FlagEQ)) - // result: (MOVDconst [0]) + // match: (MADD a (MOVDconst [0]) _) + // result: a for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagEQ { + _ = v.Args[2] + a := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 0 { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.reset(OpCopy) + v.Type = a.Type + v.AddArg(a) return true } - // match: (GreaterThanU (FlagLT_ULT)) - // result: (MOVDconst [0]) + // match: (MADD a (MOVDconst [1]) x) + // result: (ADD a x) for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagLT_ULT { + x := v.Args[2] + a := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 1 { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.reset(OpARM64ADD) + v.AddArg(a) + v.AddArg(x) return true } - // match: (GreaterThanU (FlagLT_UGT)) - // result: (MOVDconst [1]) + // match: (MADD a (MOVDconst [c]) x) + // cond: isPowerOfTwo(c) + // result: (ADDshiftLL a x [log2(c)]) for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagLT_UGT { + x := v.Args[2] + a := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 1 - return true - } - // match: (GreaterThanU (FlagGT_ULT)) - // result: (MOVDconst [0]) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagGT_ULT { + c := v_1.AuxInt + if !(isPowerOfTwo(c)) { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.reset(OpARM64ADDshiftLL) + v.AuxInt = log2(c) + v.AddArg(a) + v.AddArg(x) return true } - // match: (GreaterThanU (FlagGT_UGT)) - // result: (MOVDconst [1]) + // match: (MADD a (MOVDconst [c]) x) + // cond: isPowerOfTwo(c-1) && c>=3 + // result: (ADD a (ADDshiftLL x x [log2(c-1)])) for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagGT_UGT { + x := v.Args[2] + a := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 1 - return true - } - // match: (GreaterThanU (InvertFlags x)) - // result: (LessThanU x) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64InvertFlags { + c := v_1.AuxInt + if !(isPowerOfTwo(c-1) && c >= 3) { break } - x := v_0.Args[0] - v.reset(OpARM64LessThanU) - v.AddArg(x) + v.reset(OpARM64ADD) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = log2(c - 1) + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - return false -} -func rewriteValueARM64_OpARM64LessEqual_0(v *Value) bool { - // match: (LessEqual (FlagEQ)) - // result: (MOVDconst [1]) + // match: (MADD a (MOVDconst [c]) x) + // cond: isPowerOfTwo(c+1) && c>=7 + // result: (SUB a (SUBshiftLL x x [log2(c+1)])) for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagEQ { + x := v.Args[2] + a := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 1 - return true - } - // match: (LessEqual (FlagLT_ULT)) - // result: (MOVDconst [1]) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagLT_ULT { + c := v_1.AuxInt + if !(isPowerOfTwo(c+1) && c >= 7) { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 1 + v.reset(OpARM64SUB) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) + v0.AuxInt = log2(c + 1) + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (LessEqual (FlagLT_UGT)) - // result: (MOVDconst [1]) + // match: (MADD a (MOVDconst [c]) x) + // cond: c%3 == 0 && isPowerOfTwo(c/3) + // result: (SUBshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagLT_UGT { + x := v.Args[2] + a := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 1 - return true - } - // match: (LessEqual (FlagGT_ULT)) - // result: (MOVDconst [0]) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagGT_ULT { + c := v_1.AuxInt + if !(c%3 == 0 && isPowerOfTwo(c/3)) { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.reset(OpARM64SUBshiftLL) + v.AuxInt = log2(c / 3) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) + v0.AuxInt = 2 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (LessEqual (FlagGT_UGT)) - // result: (MOVDconst [0]) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagGT_UGT { + // match: (MADD a (MOVDconst [c]) x) + // cond: c%5 == 0 && isPowerOfTwo(c/5) + // result: (ADDshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) + for { + x := v.Args[2] + a := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 - return true - } - // match: (LessEqual (InvertFlags x)) - // result: (GreaterEqual x) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64InvertFlags { + c := v_1.AuxInt + if !(c%5 == 0 && isPowerOfTwo(c/5)) { break } - x := v_0.Args[0] - v.reset(OpARM64GreaterEqual) - v.AddArg(x) + v.reset(OpARM64ADDshiftLL) + v.AuxInt = log2(c / 5) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = 2 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - return false -} -func rewriteValueARM64_OpARM64LessEqualF_0(v *Value) bool { - // match: (LessEqualF (InvertFlags x)) - // result: (GreaterEqualF x) + // match: (MADD a (MOVDconst [c]) x) + // cond: c%7 == 0 && isPowerOfTwo(c/7) + // result: (SUBshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) for { - v_0 := v.Args[0] - if v_0.Op != OpARM64InvertFlags { + x := v.Args[2] + a := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - x := v_0.Args[0] - v.reset(OpARM64GreaterEqualF) - v.AddArg(x) - return true - } - return false -} -func rewriteValueARM64_OpARM64LessEqualU_0(v *Value) bool { - // match: (LessEqualU (FlagEQ)) - // result: (MOVDconst [1]) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagEQ { + c := v_1.AuxInt + if !(c%7 == 0 && isPowerOfTwo(c/7)) { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 1 + v.reset(OpARM64SUBshiftLL) + v.AuxInt = log2(c / 7) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) + v0.AuxInt = 3 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (LessEqualU (FlagLT_ULT)) - // result: (MOVDconst [1]) + // match: (MADD a (MOVDconst [c]) x) + // cond: c%9 == 0 && isPowerOfTwo(c/9) + // result: (ADDshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagLT_ULT { + x := v.Args[2] + a := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 1 - return true - } - // match: (LessEqualU (FlagLT_UGT)) - // result: (MOVDconst [0]) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagLT_UGT { + c := v_1.AuxInt + if !(c%9 == 0 && isPowerOfTwo(c/9)) { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.reset(OpARM64ADDshiftLL) + v.AuxInt = log2(c / 9) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = 3 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (LessEqualU (FlagGT_ULT)) - // result: (MOVDconst [1]) + return false +} +func rewriteValueARM64_OpARM64MADD_20(v *Value) bool { + b := v.Block + // match: (MADD (MOVDconst [c]) x y) + // result: (ADDconst [c] (MUL x y)) for { + y := v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpARM64FlagGT_ULT { + if v_0.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 1 + c := v_0.AuxInt + x := v.Args[1] + v.reset(OpARM64ADDconst) + v.AuxInt = c + v0 := b.NewValue0(v.Pos, OpARM64MUL, x.Type) + v0.AddArg(x) + v0.AddArg(y) + v.AddArg(v0) return true } - // match: (LessEqualU (FlagGT_UGT)) - // result: (MOVDconst [0]) + // match: (MADD a (MOVDconst [c]) (MOVDconst [d])) + // result: (ADDconst [c*d] a) for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagGT_UGT { + _ = v.Args[2] + a := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 - return true - } - // match: (LessEqualU (InvertFlags x)) - // result: (GreaterEqualU x) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64InvertFlags { + c := v_1.AuxInt + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst { break } - x := v_0.Args[0] - v.reset(OpARM64GreaterEqualU) - v.AddArg(x) + d := v_2.AuxInt + v.reset(OpARM64ADDconst) + v.AuxInt = c * d + v.AddArg(a) return true } return false } -func rewriteValueARM64_OpARM64LessThan_0(v *Value) bool { - // match: (LessThan (FlagEQ)) - // result: (MOVDconst [0]) +func rewriteValueARM64_OpARM64MADDW_0(v *Value) bool { + b := v.Block + // match: (MADDW a x (MOVDconst [c])) + // cond: int32(c)==-1 + // result: (SUB a x) for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagEQ { + _ = v.Args[2] + a := v.Args[0] + x := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 - return true - } - // match: (LessThan (FlagLT_ULT)) - // result: (MOVDconst [1]) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagLT_ULT { + c := v_2.AuxInt + if !(int32(c) == -1) { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 1 + v.reset(OpARM64SUB) + v.AddArg(a) + v.AddArg(x) return true } - // match: (LessThan (FlagLT_UGT)) - // result: (MOVDconst [1]) + // match: (MADDW a _ (MOVDconst [c])) + // cond: int32(c)==0 + // result: a for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagLT_UGT { + _ = v.Args[2] + a := v.Args[0] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 1 - return true - } - // match: (LessThan (FlagGT_ULT)) - // result: (MOVDconst [0]) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagGT_ULT { + c := v_2.AuxInt + if !(int32(c) == 0) { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.reset(OpCopy) + v.Type = a.Type + v.AddArg(a) return true } - // match: (LessThan (FlagGT_UGT)) - // result: (MOVDconst [0]) + // match: (MADDW a x (MOVDconst [c])) + // cond: int32(c)==1 + // result: (ADD a x) for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagGT_UGT { + _ = v.Args[2] + a := v.Args[0] + x := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 - return true - } - // match: (LessThan (InvertFlags x)) - // result: (GreaterThan x) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64InvertFlags { + c := v_2.AuxInt + if !(int32(c) == 1) { break } - x := v_0.Args[0] - v.reset(OpARM64GreaterThan) + v.reset(OpARM64ADD) + v.AddArg(a) v.AddArg(x) return true } - return false -} -func rewriteValueARM64_OpARM64LessThanF_0(v *Value) bool { - // match: (LessThanF (InvertFlags x)) - // result: (GreaterThanF x) + // match: (MADDW a x (MOVDconst [c])) + // cond: isPowerOfTwo(c) + // result: (ADDshiftLL a x [log2(c)]) for { - v_0 := v.Args[0] - if v_0.Op != OpARM64InvertFlags { - break - } - x := v_0.Args[0] - v.reset(OpARM64GreaterThanF) - v.AddArg(x) - return true - } - return false -} -func rewriteValueARM64_OpARM64LessThanU_0(v *Value) bool { - // match: (LessThanU (FlagEQ)) - // result: (MOVDconst [0]) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagEQ { - break - } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 - return true - } - // match: (LessThanU (FlagLT_ULT)) - // result: (MOVDconst [1]) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagLT_ULT { - break - } - v.reset(OpARM64MOVDconst) - v.AuxInt = 1 - return true - } - // match: (LessThanU (FlagLT_UGT)) - // result: (MOVDconst [0]) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagLT_UGT { - break - } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 - return true - } - // match: (LessThanU (FlagGT_ULT)) - // result: (MOVDconst [1]) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagGT_ULT { - break - } - v.reset(OpARM64MOVDconst) - v.AuxInt = 1 - return true - } - // match: (LessThanU (FlagGT_UGT)) - // result: (MOVDconst [0]) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagGT_UGT { - break - } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 - return true - } - // match: (LessThanU (InvertFlags x)) - // result: (GreaterThanU x) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64InvertFlags { - break - } - x := v_0.Args[0] - v.reset(OpARM64GreaterThanU) - v.AddArg(x) - return true - } - return false -} -func rewriteValueARM64_OpARM64MADD_0(v *Value) bool { - b := v.Block - // match: (MADD a x (MOVDconst [-1])) - // result: (SUB a x) - for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != -1 { - break - } - v.reset(OpARM64SUB) - v.AddArg(a) - v.AddArg(x) - return true - } - // match: (MADD a _ (MOVDconst [0])) - // result: a - for { - _ = v.Args[2] - a := v.Args[0] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 0 { - break - } - v.reset(OpCopy) - v.Type = a.Type - v.AddArg(a) - return true - } - // match: (MADD a x (MOVDconst [1])) - // result: (ADD a x) - for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 1 { - break - } - v.reset(OpARM64ADD) - v.AddArg(a) - v.AddArg(x) - return true - } - // match: (MADD a x (MOVDconst [c])) - // cond: isPowerOfTwo(c) - // result: (ADDshiftLL a x [log2(c)]) - for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { + _ = v.Args[2] + a := v.Args[0] + x := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst { break } c := v_2.AuxInt @@ -6326,8 +6158,8 @@ func rewriteValueARM64_OpARM64MADD_0(v *Value) bool { v.AddArg(x) return true } - // match: (MADD a x (MOVDconst [c])) - // cond: isPowerOfTwo(c-1) && c>=3 + // match: (MADDW a x (MOVDconst [c])) + // cond: isPowerOfTwo(c-1) && int32(c)>=3 // result: (ADD a (ADDshiftLL x x [log2(c-1)])) for { _ = v.Args[2] @@ -6338,7 +6170,7 @@ func rewriteValueARM64_OpARM64MADD_0(v *Value) bool { break } c := v_2.AuxInt - if !(isPowerOfTwo(c-1) && c >= 3) { + if !(isPowerOfTwo(c-1) && int32(c) >= 3) { break } v.reset(OpARM64ADD) @@ -6350,8 +6182,8 @@ func rewriteValueARM64_OpARM64MADD_0(v *Value) bool { v.AddArg(v0) return true } - // match: (MADD a x (MOVDconst [c])) - // cond: isPowerOfTwo(c+1) && c>=7 + // match: (MADDW a x (MOVDconst [c])) + // cond: isPowerOfTwo(c+1) && int32(c)>=7 // result: (SUB a (SUBshiftLL x x [log2(c+1)])) for { _ = v.Args[2] @@ -6362,7 +6194,7 @@ func rewriteValueARM64_OpARM64MADD_0(v *Value) bool { break } c := v_2.AuxInt - if !(isPowerOfTwo(c+1) && c >= 7) { + if !(isPowerOfTwo(c+1) && int32(c) >= 7) { break } v.reset(OpARM64SUB) @@ -6374,8 +6206,8 @@ func rewriteValueARM64_OpARM64MADD_0(v *Value) bool { v.AddArg(v0) return true } - // match: (MADD a x (MOVDconst [c])) - // cond: c%3 == 0 && isPowerOfTwo(c/3) + // match: (MADDW a x (MOVDconst [c])) + // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) // result: (SUBshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) for { _ = v.Args[2] @@ -6386,7 +6218,7 @@ func rewriteValueARM64_OpARM64MADD_0(v *Value) bool { break } c := v_2.AuxInt - if !(c%3 == 0 && isPowerOfTwo(c/3)) { + if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { break } v.reset(OpARM64SUBshiftLL) @@ -6399,8 +6231,8 @@ func rewriteValueARM64_OpARM64MADD_0(v *Value) bool { v.AddArg(v0) return true } - // match: (MADD a x (MOVDconst [c])) - // cond: c%5 == 0 && isPowerOfTwo(c/5) + // match: (MADDW a x (MOVDconst [c])) + // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) // result: (ADDshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) for { _ = v.Args[2] @@ -6411,7 +6243,7 @@ func rewriteValueARM64_OpARM64MADD_0(v *Value) bool { break } c := v_2.AuxInt - if !(c%5 == 0 && isPowerOfTwo(c/5)) { + if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { break } v.reset(OpARM64ADDshiftLL) @@ -6424,8 +6256,8 @@ func rewriteValueARM64_OpARM64MADD_0(v *Value) bool { v.AddArg(v0) return true } - // match: (MADD a x (MOVDconst [c])) - // cond: c%7 == 0 && isPowerOfTwo(c/7) + // match: (MADDW a x (MOVDconst [c])) + // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) // result: (SUBshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) for { _ = v.Args[2] @@ -6436,7 +6268,7 @@ func rewriteValueARM64_OpARM64MADD_0(v *Value) bool { break } c := v_2.AuxInt - if !(c%7 == 0 && isPowerOfTwo(c/7)) { + if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { break } v.reset(OpARM64SUBshiftLL) @@ -6449,8 +6281,8 @@ func rewriteValueARM64_OpARM64MADD_0(v *Value) bool { v.AddArg(v0) return true } - // match: (MADD a x (MOVDconst [c])) - // cond: c%9 == 0 && isPowerOfTwo(c/9) + // match: (MADDW a x (MOVDconst [c])) + // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) // result: (ADDshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) for { _ = v.Args[2] @@ -6461,7 +6293,7 @@ func rewriteValueARM64_OpARM64MADD_0(v *Value) bool { break } c := v_2.AuxInt - if !(c%9 == 0 && isPowerOfTwo(c/9)) { + if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { break } v.reset(OpARM64ADDshiftLL) @@ -6476,15 +6308,20 @@ func rewriteValueARM64_OpARM64MADD_0(v *Value) bool { } return false } -func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { +func rewriteValueARM64_OpARM64MADDW_10(v *Value) bool { b := v.Block - // match: (MADD a (MOVDconst [-1]) x) + // match: (MADDW a (MOVDconst [c]) x) + // cond: int32(c)==-1 // result: (SUB a x) for { x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != -1 { + if v_1.Op != OpARM64MOVDconst { + break + } + c := v_1.AuxInt + if !(int32(c) == -1) { break } v.reset(OpARM64SUB) @@ -6492,13 +6329,18 @@ func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { v.AddArg(x) return true } - // match: (MADD a (MOVDconst [0]) _) + // match: (MADDW a (MOVDconst [c]) _) + // cond: int32(c)==0 // result: a for { _ = v.Args[2] a := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 0 { + if v_1.Op != OpARM64MOVDconst { + break + } + c := v_1.AuxInt + if !(int32(c) == 0) { break } v.reset(OpCopy) @@ -6506,13 +6348,18 @@ func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { v.AddArg(a) return true } - // match: (MADD a (MOVDconst [1]) x) + // match: (MADDW a (MOVDconst [c]) x) + // cond: int32(c)==1 // result: (ADD a x) for { x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 1 { + if v_1.Op != OpARM64MOVDconst { + break + } + c := v_1.AuxInt + if !(int32(c) == 1) { break } v.reset(OpARM64ADD) @@ -6520,7 +6367,7 @@ func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { v.AddArg(x) return true } - // match: (MADD a (MOVDconst [c]) x) + // match: (MADDW a (MOVDconst [c]) x) // cond: isPowerOfTwo(c) // result: (ADDshiftLL a x [log2(c)]) for { @@ -6540,8 +6387,8 @@ func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { v.AddArg(x) return true } - // match: (MADD a (MOVDconst [c]) x) - // cond: isPowerOfTwo(c-1) && c>=3 + // match: (MADDW a (MOVDconst [c]) x) + // cond: isPowerOfTwo(c-1) && int32(c)>=3 // result: (ADD a (ADDshiftLL x x [log2(c-1)])) for { x := v.Args[2] @@ -6551,7 +6398,7 @@ func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { break } c := v_1.AuxInt - if !(isPowerOfTwo(c-1) && c >= 3) { + if !(isPowerOfTwo(c-1) && int32(c) >= 3) { break } v.reset(OpARM64ADD) @@ -6563,8 +6410,8 @@ func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { v.AddArg(v0) return true } - // match: (MADD a (MOVDconst [c]) x) - // cond: isPowerOfTwo(c+1) && c>=7 + // match: (MADDW a (MOVDconst [c]) x) + // cond: isPowerOfTwo(c+1) && int32(c)>=7 // result: (SUB a (SUBshiftLL x x [log2(c+1)])) for { x := v.Args[2] @@ -6574,7 +6421,7 @@ func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { break } c := v_1.AuxInt - if !(isPowerOfTwo(c+1) && c >= 7) { + if !(isPowerOfTwo(c+1) && int32(c) >= 7) { break } v.reset(OpARM64SUB) @@ -6586,8 +6433,8 @@ func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { v.AddArg(v0) return true } - // match: (MADD a (MOVDconst [c]) x) - // cond: c%3 == 0 && isPowerOfTwo(c/3) + // match: (MADDW a (MOVDconst [c]) x) + // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) // result: (SUBshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) for { x := v.Args[2] @@ -6597,7 +6444,7 @@ func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { break } c := v_1.AuxInt - if !(c%3 == 0 && isPowerOfTwo(c/3)) { + if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { break } v.reset(OpARM64SUBshiftLL) @@ -6610,8 +6457,8 @@ func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { v.AddArg(v0) return true } - // match: (MADD a (MOVDconst [c]) x) - // cond: c%5 == 0 && isPowerOfTwo(c/5) + // match: (MADDW a (MOVDconst [c]) x) + // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) // result: (ADDshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) for { x := v.Args[2] @@ -6621,7 +6468,7 @@ func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { break } c := v_1.AuxInt - if !(c%5 == 0 && isPowerOfTwo(c/5)) { + if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { break } v.reset(OpARM64ADDshiftLL) @@ -6634,8 +6481,8 @@ func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { v.AddArg(v0) return true } - // match: (MADD a (MOVDconst [c]) x) - // cond: c%7 == 0 && isPowerOfTwo(c/7) + // match: (MADDW a (MOVDconst [c]) x) + // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) // result: (SUBshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) for { x := v.Args[2] @@ -6645,7 +6492,7 @@ func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { break } c := v_1.AuxInt - if !(c%7 == 0 && isPowerOfTwo(c/7)) { + if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { break } v.reset(OpARM64SUBshiftLL) @@ -6658,8 +6505,8 @@ func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { v.AddArg(v0) return true } - // match: (MADD a (MOVDconst [c]) x) - // cond: c%9 == 0 && isPowerOfTwo(c/9) + // match: (MADDW a (MOVDconst [c]) x) + // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) // result: (ADDshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) for { x := v.Args[2] @@ -6669,7 +6516,7 @@ func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { break } c := v_1.AuxInt - if !(c%9 == 0 && isPowerOfTwo(c/9)) { + if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { break } v.reset(OpARM64ADDshiftLL) @@ -6684,10 +6531,10 @@ func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { } return false } -func rewriteValueARM64_OpARM64MADD_20(v *Value) bool { +func rewriteValueARM64_OpARM64MADDW_20(v *Value) bool { b := v.Block - // match: (MADD (MOVDconst [c]) x y) - // result: (ADDconst [c] (MUL x y)) + // match: (MADDW (MOVDconst [c]) x y) + // result: (ADDconst [c] (MULW x y)) for { y := v.Args[2] v_0 := v.Args[0] @@ -6698,14 +6545,14 @@ func rewriteValueARM64_OpARM64MADD_20(v *Value) bool { x := v.Args[1] v.reset(OpARM64ADDconst) v.AuxInt = c - v0 := b.NewValue0(v.Pos, OpARM64MUL, x.Type) + v0 := b.NewValue0(v.Pos, OpARM64MULW, x.Type) v0.AddArg(x) v0.AddArg(y) v.AddArg(v0) return true } - // match: (MADD a (MOVDconst [c]) (MOVDconst [d])) - // result: (ADDconst [c*d] a) + // match: (MADDW a (MOVDconst [c]) (MOVDconst [d])) + // result: (ADDconst [int64(int32(c)*int32(d))] a) for { _ = v.Args[2] a := v.Args[0] @@ -6720,2434 +6567,2484 @@ func rewriteValueARM64_OpARM64MADD_20(v *Value) bool { } d := v_2.AuxInt v.reset(OpARM64ADDconst) - v.AuxInt = c * d + v.AuxInt = int64(int32(c) * int32(d)) v.AddArg(a) return true } return false } -func rewriteValueARM64_OpARM64MADDW_0(v *Value) bool { +func rewriteValueARM64_OpARM64MNEG_0(v *Value) bool { b := v.Block - // match: (MADDW a x (MOVDconst [c])) - // cond: int32(c)==-1 - // result: (SUB a x) + // match: (MNEG x (MOVDconst [-1])) + // result: x for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - c := v_2.AuxInt - if !(int32(c) == -1) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != -1 { + continue + } + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - v.reset(OpARM64SUB) - v.AddArg(a) - v.AddArg(x) - return true + break } - // match: (MADDW a _ (MOVDconst [c])) - // cond: int32(c)==0 - // result: a + // match: (MNEG _ (MOVDconst [0])) + // result: (MOVDconst [0]) for { - _ = v.Args[2] - a := v.Args[0] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - c := v_2.AuxInt - if !(int32(c) == 0) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 0 { + continue + } + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 + return true } - v.reset(OpCopy) - v.Type = a.Type - v.AddArg(a) - return true + break } - // match: (MADDW a x (MOVDconst [c])) - // cond: int32(c)==1 - // result: (ADD a x) + // match: (MNEG x (MOVDconst [1])) + // result: (NEG x) for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - c := v_2.AuxInt - if !(int32(c) == 1) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 1 { + continue + } + v.reset(OpARM64NEG) + v.AddArg(x) + return true } - v.reset(OpARM64ADD) - v.AddArg(a) - v.AddArg(x) - return true + break } - // match: (MADDW a x (MOVDconst [c])) + // match: (MNEG x (MOVDconst [c])) // cond: isPowerOfTwo(c) - // result: (ADDshiftLL a x [log2(c)]) + // result: (NEG (SLLconst [log2(c)] x)) for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - c := v_2.AuxInt - if !(isPowerOfTwo(c)) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(isPowerOfTwo(c)) { + continue + } + v.reset(OpARM64NEG) + v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) + v0.AuxInt = log2(c) + v0.AddArg(x) + v.AddArg(v0) + return true } - v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c) - v.AddArg(a) - v.AddArg(x) - return true + break } - // match: (MADDW a x (MOVDconst [c])) - // cond: isPowerOfTwo(c-1) && int32(c)>=3 - // result: (ADD a (ADDshiftLL x x [log2(c-1)])) + // match: (MNEG x (MOVDconst [c])) + // cond: isPowerOfTwo(c-1) && c >= 3 + // result: (NEG (ADDshiftLL x x [log2(c-1)])) for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - c := v_2.AuxInt - if !(isPowerOfTwo(c-1) && int32(c) >= 3) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(isPowerOfTwo(c-1) && c >= 3) { + continue + } + v.reset(OpARM64NEG) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = log2(c - 1) + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) + return true } - v.reset(OpARM64ADD) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = log2(c - 1) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (MADDW a x (MOVDconst [c])) - // cond: isPowerOfTwo(c+1) && int32(c)>=7 - // result: (SUB a (SUBshiftLL x x [log2(c+1)])) + // match: (MNEG x (MOVDconst [c])) + // cond: isPowerOfTwo(c+1) && c >= 7 + // result: (NEG (ADDshiftLL (NEG x) x [log2(c+1)])) for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - c := v_2.AuxInt - if !(isPowerOfTwo(c+1) && int32(c) >= 7) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(isPowerOfTwo(c+1) && c >= 7) { + continue + } + v.reset(OpARM64NEG) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = log2(c + 1) + v1 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) + v1.AddArg(x) + v0.AddArg(v1) + v0.AddArg(x) + v.AddArg(v0) + return true } - v.reset(OpARM64SUB) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = log2(c + 1) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (MADDW a x (MOVDconst [c])) - // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) - // result: (SUBshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) + // match: (MNEG x (MOVDconst [c])) + // cond: c%3 == 0 && isPowerOfTwo(c/3) + // result: (SLLconst [log2(c/3)] (SUBshiftLL x x [2])) for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - c := v_2.AuxInt - if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(c%3 == 0 && isPowerOfTwo(c/3)) { + continue + } + v.reset(OpARM64SLLconst) + v.Type = x.Type + v.AuxInt = log2(c / 3) + v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) + v0.AuxInt = 2 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) + return true } - v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c / 3) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 2 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (MADDW a x (MOVDconst [c])) - // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) - // result: (ADDshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) + // match: (MNEG x (MOVDconst [c])) + // cond: c%5 == 0 && isPowerOfTwo(c/5) + // result: (NEG (SLLconst [log2(c/5)] (ADDshiftLL x x [2]))) for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - c := v_2.AuxInt - if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(c%5 == 0 && isPowerOfTwo(c/5)) { + continue + } + v.reset(OpARM64NEG) + v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) + v0.AuxInt = log2(c / 5) + v1 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v1.AuxInt = 2 + v1.AddArg(x) + v1.AddArg(x) + v0.AddArg(v1) + v.AddArg(v0) + return true } - v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c / 5) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 2 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (MADDW a x (MOVDconst [c])) - // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) - // result: (SUBshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) + // match: (MNEG x (MOVDconst [c])) + // cond: c%7 == 0 && isPowerOfTwo(c/7) + // result: (SLLconst [log2(c/7)] (SUBshiftLL x x [3])) for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - c := v_2.AuxInt - if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(c%7 == 0 && isPowerOfTwo(c/7)) { + continue + } + v.reset(OpARM64SLLconst) + v.Type = x.Type + v.AuxInt = log2(c / 7) + v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) + v0.AuxInt = 3 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) + return true } - v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c / 7) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 3 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (MADDW a x (MOVDconst [c])) - // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) - // result: (ADDshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) + // match: (MNEG x (MOVDconst [c])) + // cond: c%9 == 0 && isPowerOfTwo(c/9) + // result: (NEG (SLLconst [log2(c/9)] (ADDshiftLL x x [3]))) for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - c := v_2.AuxInt - if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { - break - } - v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c / 9) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 3 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(c%9 == 0 && isPowerOfTwo(c/9)) { + continue + } + v.reset(OpARM64NEG) + v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) + v0.AuxInt = log2(c / 9) + v1 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v1.AuxInt = 3 + v1.AddArg(x) + v1.AddArg(x) + v0.AddArg(v1) + v.AddArg(v0) + return true + } + break } return false } -func rewriteValueARM64_OpARM64MADDW_10(v *Value) bool { +func rewriteValueARM64_OpARM64MNEG_10(v *Value) bool { + // match: (MNEG (MOVDconst [c]) (MOVDconst [d])) + // result: (MOVDconst [-c*d]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARM64MOVDconst { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + d := v_1.AuxInt + v.reset(OpARM64MOVDconst) + v.AuxInt = -c * d + return true + } + break + } + return false +} +func rewriteValueARM64_OpARM64MNEGW_0(v *Value) bool { b := v.Block - // match: (MADDW a (MOVDconst [c]) x) + // match: (MNEGW x (MOVDconst [c])) // cond: int32(c)==-1 - // result: (SUB a x) + // result: x for { - x := v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(int32(c) == -1) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(int32(c) == -1) { + continue + } + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - v.reset(OpARM64SUB) - v.AddArg(a) - v.AddArg(x) - return true + break } - // match: (MADDW a (MOVDconst [c]) _) + // match: (MNEGW _ (MOVDconst [c])) // cond: int32(c)==0 - // result: a + // result: (MOVDconst [0]) for { - _ = v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(int32(c) == 0) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(int32(c) == 0) { + continue + } + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 + return true } - v.reset(OpCopy) - v.Type = a.Type - v.AddArg(a) - return true + break } - // match: (MADDW a (MOVDconst [c]) x) + // match: (MNEGW x (MOVDconst [c])) // cond: int32(c)==1 - // result: (ADD a x) + // result: (NEG x) for { - x := v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(int32(c) == 1) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(int32(c) == 1) { + continue + } + v.reset(OpARM64NEG) + v.AddArg(x) + return true } - v.reset(OpARM64ADD) - v.AddArg(a) - v.AddArg(x) - return true + break } - // match: (MADDW a (MOVDconst [c]) x) + // match: (MNEGW x (MOVDconst [c])) // cond: isPowerOfTwo(c) - // result: (ADDshiftLL a x [log2(c)]) + // result: (NEG (SLLconst [log2(c)] x)) for { - x := v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c)) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(isPowerOfTwo(c)) { + continue + } + v.reset(OpARM64NEG) + v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) + v0.AuxInt = log2(c) + v0.AddArg(x) + v.AddArg(v0) + return true } - v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c) - v.AddArg(a) - v.AddArg(x) - return true + break } - // match: (MADDW a (MOVDconst [c]) x) - // cond: isPowerOfTwo(c-1) && int32(c)>=3 - // result: (ADD a (ADDshiftLL x x [log2(c-1)])) + // match: (MNEGW x (MOVDconst [c])) + // cond: isPowerOfTwo(c-1) && int32(c) >= 3 + // result: (NEG (ADDshiftLL x x [log2(c-1)])) for { - x := v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c-1) && int32(c) >= 3) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(isPowerOfTwo(c-1) && int32(c) >= 3) { + continue + } + v.reset(OpARM64NEG) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = log2(c - 1) + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) + return true } - v.reset(OpARM64ADD) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = log2(c - 1) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (MADDW a (MOVDconst [c]) x) - // cond: isPowerOfTwo(c+1) && int32(c)>=7 - // result: (SUB a (SUBshiftLL x x [log2(c+1)])) + // match: (MNEGW x (MOVDconst [c])) + // cond: isPowerOfTwo(c+1) && int32(c) >= 7 + // result: (NEG (ADDshiftLL (NEG x) x [log2(c+1)])) for { - x := v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c+1) && int32(c) >= 7) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(isPowerOfTwo(c+1) && int32(c) >= 7) { + continue + } + v.reset(OpARM64NEG) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = log2(c + 1) + v1 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) + v1.AddArg(x) + v0.AddArg(v1) + v0.AddArg(x) + v.AddArg(v0) + return true } - v.reset(OpARM64SUB) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = log2(c + 1) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (MADDW a (MOVDconst [c]) x) + // match: (MNEGW x (MOVDconst [c])) // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) - // result: (SUBshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) + // result: (SLLconst [log2(c/3)] (SUBshiftLL x x [2])) for { - x := v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { + continue + } + v.reset(OpARM64SLLconst) + v.Type = x.Type + v.AuxInt = log2(c / 3) + v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) + v0.AuxInt = 2 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) + return true } - v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c / 3) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 2 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (MADDW a (MOVDconst [c]) x) + // match: (MNEGW x (MOVDconst [c])) // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) - // result: (ADDshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) + // result: (NEG (SLLconst [log2(c/5)] (ADDshiftLL x x [2]))) for { - x := v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { + continue + } + v.reset(OpARM64NEG) + v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) + v0.AuxInt = log2(c / 5) + v1 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v1.AuxInt = 2 + v1.AddArg(x) + v1.AddArg(x) + v0.AddArg(v1) + v.AddArg(v0) + return true } - v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c / 5) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 2 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (MADDW a (MOVDconst [c]) x) + // match: (MNEGW x (MOVDconst [c])) // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) - // result: (SUBshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) + // result: (SLLconst [log2(c/7)] (SUBshiftLL x x [3])) for { - x := v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { + continue + } + v.reset(OpARM64SLLconst) + v.Type = x.Type + v.AuxInt = log2(c / 7) + v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) + v0.AuxInt = 3 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) + return true } - v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c / 7) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 3 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (MADDW a (MOVDconst [c]) x) + // match: (MNEGW x (MOVDconst [c])) // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) - // result: (ADDshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) + // result: (NEG (SLLconst [log2(c/9)] (ADDshiftLL x x [3]))) for { - x := v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { + continue + } + v.reset(OpARM64NEG) + v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) + v0.AuxInt = log2(c / 9) + v1 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v1.AuxInt = 3 + v1.AddArg(x) + v1.AddArg(x) + v0.AddArg(v1) + v.AddArg(v0) + return true } - c := v_1.AuxInt - if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { - break + break + } + return false +} +func rewriteValueARM64_OpARM64MNEGW_10(v *Value) bool { + // match: (MNEGW (MOVDconst [c]) (MOVDconst [d])) + // result: (MOVDconst [-int64(int32(c)*int32(d))]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARM64MOVDconst { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + d := v_1.AuxInt + v.reset(OpARM64MOVDconst) + v.AuxInt = -int64(int32(c) * int32(d)) + return true } - v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c / 9) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 3 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true + break } return false } -func rewriteValueARM64_OpARM64MADDW_20(v *Value) bool { - b := v.Block - // match: (MADDW (MOVDconst [c]) x y) - // result: (ADDconst [c] (MULW x y)) +func rewriteValueARM64_OpARM64MOD_0(v *Value) bool { + // match: (MOD (MOVDconst [c]) (MOVDconst [d])) + // result: (MOVDconst [c%d]) for { - y := v.Args[2] + _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] - v.reset(OpARM64ADDconst) - v.AuxInt = c - v0 := b.NewValue0(v.Pos, OpARM64MULW, x.Type) - v0.AddArg(x) - v0.AddArg(y) - v.AddArg(v0) - return true - } - // match: (MADDW a (MOVDconst [c]) (MOVDconst [d])) - // result: (ADDconst [int64(int32(c)*int32(d))] a) - for { - _ = v.Args[2] - a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - d := v_2.AuxInt - v.reset(OpARM64ADDconst) - v.AuxInt = int64(int32(c) * int32(d)) - v.AddArg(a) + d := v_1.AuxInt + v.reset(OpARM64MOVDconst) + v.AuxInt = c % d return true } return false } -func rewriteValueARM64_OpARM64MNEG_0(v *Value) bool { - b := v.Block - // match: (MNEG x (MOVDconst [-1])) - // result: x +func rewriteValueARM64_OpARM64MODW_0(v *Value) bool { + // match: (MODW (MOVDconst [c]) (MOVDconst [d])) + // result: (MOVDconst [int64(int32(c)%int32(d))]) for { _ = v.Args[1] - x := v.Args[0] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { + break + } + c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != -1 { + if v_1.Op != OpARM64MOVDconst { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + d := v_1.AuxInt + v.reset(OpARM64MOVDconst) + v.AuxInt = int64(int32(c) % int32(d)) return true } - // match: (MNEG (MOVDconst [-1]) x) - // result: x + return false +} +func rewriteValueARM64_OpARM64MOVBUload_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (MOVBUload [off1] {sym} (ADDconst [off2] ptr) mem) + // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVBUload [off1+off2] {sym} ptr mem) for { - x := v.Args[1] + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst || v_0.AuxInt != -1 { + if v_0.Op != OpARM64ADDconst { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + off2 := v_0.AuxInt + ptr := v_0.Args[0] + if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + break + } + v.reset(OpARM64MOVBUload) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(ptr) + v.AddArg(mem) return true } - // match: (MNEG _ (MOVDconst [0])) - // result: (MOVDconst [0]) + // match: (MOVBUload [off] {sym} (ADD ptr idx) mem) + // cond: off == 0 && sym == nil + // result: (MOVBUloadidx ptr idx mem) for { - _ = v.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 0 { + off := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADD { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + idx := v_0.Args[1] + ptr := v_0.Args[0] + if !(off == 0 && sym == nil) { + break + } + v.reset(OpARM64MOVBUloadidx) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) return true } - // match: (MNEG (MOVDconst [0]) _) - // result: (MOVDconst [0]) + // match: (MOVBUload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVBUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) for { - _ = v.Args[1] + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst || v_0.AuxInt != 0 { + if v_0.Op != OpARM64MOVDaddr { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + off2 := v_0.AuxInt + sym2 := v_0.Aux + ptr := v_0.Args[0] + if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + break + } + v.reset(OpARM64MOVBUload) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(ptr) + v.AddArg(mem) return true } - // match: (MNEG x (MOVDconst [1])) - // result: (NEG x) + // match: (MOVBUload [off] {sym} ptr (MOVBstorezero [off2] {sym2} ptr2 _)) + // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) + // result: (MOVDconst [0]) for { + off := v.AuxInt + sym := v.Aux _ = v.Args[1] - x := v.Args[0] + ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 1 { + if v_1.Op != OpARM64MOVBstorezero { break } - v.reset(OpARM64NEG) - v.AddArg(x) + off2 := v_1.AuxInt + sym2 := v_1.Aux + _ = v_1.Args[1] + ptr2 := v_1.Args[0] + if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { + break + } + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } - // match: (MNEG (MOVDconst [1]) x) - // result: (NEG x) + // match: (MOVBUload [off] {sym} (SB) _) + // cond: symIsRO(sym) + // result: (MOVDconst [int64(read8(sym, off))]) for { - x := v.Args[1] + off := v.AuxInt + sym := v.Aux + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst || v_0.AuxInt != 1 { + if v_0.Op != OpSB || !(symIsRO(sym)) { break } - v.reset(OpARM64NEG) - v.AddArg(x) + v.reset(OpARM64MOVDconst) + v.AuxInt = int64(read8(sym, off)) return true } - // match: (MNEG x (MOVDconst [c])) - // cond: isPowerOfTwo(c) - // result: (NEG (SLLconst [log2(c)] x)) + return false +} +func rewriteValueARM64_OpARM64MOVBUloadidx_0(v *Value) bool { + // match: (MOVBUloadidx ptr (MOVDconst [c]) mem) + // result: (MOVBUload [c] ptr mem) for { - _ = v.Args[1] - x := v.Args[0] + mem := v.Args[2] + ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - if !(isPowerOfTwo(c)) { - break - } - v.reset(OpARM64NEG) - v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v0.AuxInt = log2(c) - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpARM64MOVBUload) + v.AuxInt = c + v.AddArg(ptr) + v.AddArg(mem) return true } - // match: (MNEG (MOVDconst [c]) x) - // cond: isPowerOfTwo(c) - // result: (NEG (SLLconst [log2(c)] x)) + // match: (MOVBUloadidx (MOVDconst [c]) ptr mem) + // result: (MOVBUload [c] ptr mem) for { - x := v.Args[1] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - if !(isPowerOfTwo(c)) { - break - } - v.reset(OpARM64NEG) - v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v0.AuxInt = log2(c) - v0.AddArg(x) - v.AddArg(v0) + ptr := v.Args[1] + v.reset(OpARM64MOVBUload) + v.AuxInt = c + v.AddArg(ptr) + v.AddArg(mem) return true } - // match: (MNEG x (MOVDconst [c])) - // cond: isPowerOfTwo(c-1) && c >= 3 - // result: (NEG (ADDshiftLL x x [log2(c-1)])) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c-1) && c >= 3) { - break - } - v.reset(OpARM64NEG) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = log2(c - 1) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MNEG (MOVDconst [c]) x) - // cond: isPowerOfTwo(c-1) && c >= 3 - // result: (NEG (ADDshiftLL x x [log2(c-1)])) + // match: (MOVBUloadidx ptr idx (MOVBstorezeroidx ptr2 idx2 _)) + // cond: (isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) + // result: (MOVDconst [0]) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + _ = v.Args[2] + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVBstorezeroidx { break } - c := v_0.AuxInt - if !(isPowerOfTwo(c-1) && c >= 3) { + _ = v_2.Args[2] + ptr2 := v_2.Args[0] + idx2 := v_2.Args[1] + if !(isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) { break } - v.reset(OpARM64NEG) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = log2(c - 1) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } return false } -func rewriteValueARM64_OpARM64MNEG_10(v *Value) bool { - b := v.Block - // match: (MNEG x (MOVDconst [c])) - // cond: isPowerOfTwo(c+1) && c >= 7 - // result: (NEG (ADDshiftLL (NEG x) x [log2(c+1)])) +func rewriteValueARM64_OpARM64MOVBUreg_0(v *Value) bool { + // match: (MOVBUreg x:(MOVBUload _ _)) + // result: (MOVDreg x) for { - _ = v.Args[1] x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c+1) && c >= 7) { + if x.Op != OpARM64MOVBUload { break } - v.reset(OpARM64NEG) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = log2(c + 1) - v1 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) - v1.AddArg(x) - v0.AddArg(v1) - v0.AddArg(x) - v.AddArg(v0) + _ = x.Args[1] + v.reset(OpARM64MOVDreg) + v.AddArg(x) return true } - // match: (MNEG (MOVDconst [c]) x) - // cond: isPowerOfTwo(c+1) && c >= 7 - // result: (NEG (ADDshiftLL (NEG x) x [log2(c+1)])) + // match: (MOVBUreg x:(MOVBUloadidx _ _ _)) + // result: (MOVDreg x) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - if !(isPowerOfTwo(c+1) && c >= 7) { + x := v.Args[0] + if x.Op != OpARM64MOVBUloadidx { break } - v.reset(OpARM64NEG) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = log2(c + 1) - v1 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) - v1.AddArg(x) - v0.AddArg(v1) - v0.AddArg(x) - v.AddArg(v0) + _ = x.Args[2] + v.reset(OpARM64MOVDreg) + v.AddArg(x) return true } - // match: (MNEG x (MOVDconst [c])) - // cond: c%3 == 0 && isPowerOfTwo(c/3) - // result: (SLLconst [log2(c/3)] (SUBshiftLL x x [2])) + // match: (MOVBUreg x:(MOVBUreg _)) + // result: (MOVDreg x) for { - _ = v.Args[1] x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + if x.Op != OpARM64MOVBUreg { break } - c := v_1.AuxInt - if !(c%3 == 0 && isPowerOfTwo(c/3)) { + v.reset(OpARM64MOVDreg) + v.AddArg(x) + return true + } + // match: (MOVBUreg (ANDconst [c] x)) + // result: (ANDconst [c&(1<<8-1)] x) + for { + v_0 := v.Args[0] + if v_0.Op != OpARM64ANDconst { break } - v.reset(OpARM64SLLconst) - v.Type = x.Type - v.AuxInt = log2(c / 3) - v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 2 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) + c := v_0.AuxInt + x := v_0.Args[0] + v.reset(OpARM64ANDconst) + v.AuxInt = c & (1<<8 - 1) + v.AddArg(x) return true } - // match: (MNEG (MOVDconst [c]) x) - // cond: c%3 == 0 && isPowerOfTwo(c/3) - // result: (SLLconst [log2(c/3)] (SUBshiftLL x x [2])) + // match: (MOVBUreg (MOVDconst [c])) + // result: (MOVDconst [int64(uint8(c))]) for { - x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - if !(c%3 == 0 && isPowerOfTwo(c/3)) { - break - } - v.reset(OpARM64SLLconst) - v.Type = x.Type - v.AuxInt = log2(c / 3) - v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 2 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpARM64MOVDconst) + v.AuxInt = int64(uint8(c)) return true } - // match: (MNEG x (MOVDconst [c])) - // cond: c%5 == 0 && isPowerOfTwo(c/5) - // result: (NEG (SLLconst [log2(c/5)] (ADDshiftLL x x [2]))) + // match: (MOVBUreg x) + // cond: x.Type.IsBoolean() + // result: (MOVDreg x) for { - _ = v.Args[1] x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(c%5 == 0 && isPowerOfTwo(c/5)) { + if !(x.Type.IsBoolean()) { break } - v.reset(OpARM64NEG) - v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v0.AuxInt = log2(c / 5) - v1 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v1.AuxInt = 2 - v1.AddArg(x) - v1.AddArg(x) - v0.AddArg(v1) - v.AddArg(v0) + v.reset(OpARM64MOVDreg) + v.AddArg(x) return true } - // match: (MNEG (MOVDconst [c]) x) - // cond: c%5 == 0 && isPowerOfTwo(c/5) - // result: (NEG (SLLconst [log2(c/5)] (ADDshiftLL x x [2]))) + // match: (MOVBUreg (SLLconst [sc] x)) + // cond: isARM64BFMask(sc, 1<<8-1, sc) + // result: (UBFIZ [armBFAuxInt(sc, arm64BFWidth(1<<8-1, sc))] x) for { - x := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + if v_0.Op != OpARM64SLLconst { break } - c := v_0.AuxInt - if !(c%5 == 0 && isPowerOfTwo(c/5)) { + sc := v_0.AuxInt + x := v_0.Args[0] + if !(isARM64BFMask(sc, 1<<8-1, sc)) { break } - v.reset(OpARM64NEG) - v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v0.AuxInt = log2(c / 5) - v1 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v1.AuxInt = 2 - v1.AddArg(x) - v1.AddArg(x) - v0.AddArg(v1) - v.AddArg(v0) + v.reset(OpARM64UBFIZ) + v.AuxInt = armBFAuxInt(sc, arm64BFWidth(1<<8-1, sc)) + v.AddArg(x) return true } - // match: (MNEG x (MOVDconst [c])) - // cond: c%7 == 0 && isPowerOfTwo(c/7) - // result: (SLLconst [log2(c/7)] (SUBshiftLL x x [3])) + // match: (MOVBUreg (SRLconst [sc] x)) + // cond: isARM64BFMask(sc, 1<<8-1, 0) + // result: (UBFX [armBFAuxInt(sc, 8)] x) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + v_0 := v.Args[0] + if v_0.Op != OpARM64SRLconst { break } - c := v_1.AuxInt - if !(c%7 == 0 && isPowerOfTwo(c/7)) { + sc := v_0.AuxInt + x := v_0.Args[0] + if !(isARM64BFMask(sc, 1<<8-1, 0)) { break } - v.reset(OpARM64SLLconst) - v.Type = x.Type - v.AuxInt = log2(c / 7) - v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 3 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpARM64UBFX) + v.AuxInt = armBFAuxInt(sc, 8) + v.AddArg(x) return true } - // match: (MNEG (MOVDconst [c]) x) - // cond: c%7 == 0 && isPowerOfTwo(c/7) - // result: (SLLconst [log2(c/7)] (SUBshiftLL x x [3])) + return false +} +func rewriteValueARM64_OpARM64MOVBload_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) + // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVBload [off1+off2] {sym} ptr mem) for { - x := v.Args[1] + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + if v_0.Op != OpARM64ADDconst { break } - c := v_0.AuxInt - if !(c%7 == 0 && isPowerOfTwo(c/7)) { + off2 := v_0.AuxInt + ptr := v_0.Args[0] + if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(OpARM64SLLconst) - v.Type = x.Type - v.AuxInt = log2(c / 7) - v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 3 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpARM64MOVBload) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(ptr) + v.AddArg(mem) return true } - // match: (MNEG x (MOVDconst [c])) - // cond: c%9 == 0 && isPowerOfTwo(c/9) - // result: (NEG (SLLconst [log2(c/9)] (ADDshiftLL x x [3]))) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(c%9 == 0 && isPowerOfTwo(c/9)) { - break - } - v.reset(OpARM64NEG) - v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v0.AuxInt = log2(c / 9) - v1 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v1.AuxInt = 3 - v1.AddArg(x) - v1.AddArg(x) - v0.AddArg(v1) - v.AddArg(v0) - return true - } - // match: (MNEG (MOVDconst [c]) x) - // cond: c%9 == 0 && isPowerOfTwo(c/9) - // result: (NEG (SLLconst [log2(c/9)] (ADDshiftLL x x [3]))) + // match: (MOVBload [off] {sym} (ADD ptr idx) mem) + // cond: off == 0 && sym == nil + // result: (MOVBloadidx ptr idx mem) for { - x := v.Args[1] + off := v.AuxInt + sym := v.Aux + mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + if v_0.Op != OpARM64ADD { break } - c := v_0.AuxInt - if !(c%9 == 0 && isPowerOfTwo(c/9)) { + idx := v_0.Args[1] + ptr := v_0.Args[0] + if !(off == 0 && sym == nil) { break } - v.reset(OpARM64NEG) - v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v0.AuxInt = log2(c / 9) - v1 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v1.AuxInt = 3 - v1.AddArg(x) - v1.AddArg(x) - v0.AddArg(v1) - v.AddArg(v0) + v.reset(OpARM64MOVBloadidx) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) return true } - return false -} -func rewriteValueARM64_OpARM64MNEG_20(v *Value) bool { - // match: (MNEG (MOVDconst [c]) (MOVDconst [d])) - // result: (MOVDconst [-c*d]) + // match: (MOVBload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) for { - _ = v.Args[1] + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + if v_0.Op != OpARM64MOVDaddr { break } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + off2 := v_0.AuxInt + sym2 := v_0.Aux + ptr := v_0.Args[0] + if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - d := v_1.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = -c * d + v.reset(OpARM64MOVBload) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(ptr) + v.AddArg(mem) return true } - // match: (MNEG (MOVDconst [d]) (MOVDconst [c])) - // result: (MOVDconst [-c*d]) + // match: (MOVBload [off] {sym} ptr (MOVBstorezero [off2] {sym2} ptr2 _)) + // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) + // result: (MOVDconst [0]) for { + off := v.AuxInt + sym := v.Aux _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVBstorezero { break } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + off2 := v_1.AuxInt + sym2 := v_1.Aux + _ = v_1.Args[1] + ptr2 := v_1.Args[0] + if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { break } - c := v_1.AuxInt v.reset(OpARM64MOVDconst) - v.AuxInt = -c * d + v.AuxInt = 0 return true } return false } -func rewriteValueARM64_OpARM64MNEGW_0(v *Value) bool { - b := v.Block - // match: (MNEGW x (MOVDconst [c])) - // cond: int32(c)==-1 - // result: x +func rewriteValueARM64_OpARM64MOVBloadidx_0(v *Value) bool { + // match: (MOVBloadidx ptr (MOVDconst [c]) mem) + // result: (MOVBload [c] ptr mem) for { - _ = v.Args[1] - x := v.Args[0] + mem := v.Args[2] + ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - if !(int32(c) == -1) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + v.reset(OpARM64MOVBload) + v.AuxInt = c + v.AddArg(ptr) + v.AddArg(mem) return true } - // match: (MNEGW (MOVDconst [c]) x) - // cond: int32(c)==-1 - // result: x + // match: (MOVBloadidx (MOVDconst [c]) ptr mem) + // result: (MOVBload [c] ptr mem) for { - x := v.Args[1] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - if !(int32(c) == -1) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + ptr := v.Args[1] + v.reset(OpARM64MOVBload) + v.AuxInt = c + v.AddArg(ptr) + v.AddArg(mem) return true } - // match: (MNEGW _ (MOVDconst [c])) - // cond: int32(c)==0 + // match: (MOVBloadidx ptr idx (MOVBstorezeroidx ptr2 idx2 _)) + // cond: (isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) // result: (MOVDconst [0]) for { - _ = v.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + _ = v.Args[2] + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVBstorezeroidx { break } - c := v_1.AuxInt - if !(int32(c) == 0) { + _ = v_2.Args[2] + ptr2 := v_2.Args[0] + idx2 := v_2.Args[1] + if !(isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) { break } v.reset(OpARM64MOVDconst) v.AuxInt = 0 return true } - // match: (MNEGW (MOVDconst [c]) _) - // cond: int32(c)==0 - // result: (MOVDconst [0]) + return false +} +func rewriteValueARM64_OpARM64MOVBreg_0(v *Value) bool { + // match: (MOVBreg x:(MOVBload _ _)) + // result: (MOVDreg x) for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - if !(int32(c) == 0) { + x := v.Args[0] + if x.Op != OpARM64MOVBload { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + _ = x.Args[1] + v.reset(OpARM64MOVDreg) + v.AddArg(x) return true } - // match: (MNEGW x (MOVDconst [c])) - // cond: int32(c)==1 - // result: (NEG x) + // match: (MOVBreg x:(MOVBloadidx _ _ _)) + // result: (MOVDreg x) for { - _ = v.Args[1] x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + if x.Op != OpARM64MOVBloadidx { break } - c := v_1.AuxInt - if !(int32(c) == 1) { + _ = x.Args[2] + v.reset(OpARM64MOVDreg) + v.AddArg(x) + return true + } + // match: (MOVBreg x:(MOVBreg _)) + // result: (MOVDreg x) + for { + x := v.Args[0] + if x.Op != OpARM64MOVBreg { break } - v.reset(OpARM64NEG) + v.reset(OpARM64MOVDreg) v.AddArg(x) return true } - // match: (MNEGW (MOVDconst [c]) x) - // cond: int32(c)==1 - // result: (NEG x) + // match: (MOVBreg (MOVDconst [c])) + // result: (MOVDconst [int64(int8(c))]) for { - x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - if !(int32(c) == 1) { - break - } - v.reset(OpARM64NEG) - v.AddArg(x) + v.reset(OpARM64MOVDconst) + v.AuxInt = int64(int8(c)) return true } - // match: (MNEGW x (MOVDconst [c])) - // cond: isPowerOfTwo(c) - // result: (NEG (SLLconst [log2(c)] x)) + // match: (MOVBreg (SLLconst [lc] x)) + // cond: lc < 8 + // result: (SBFIZ [armBFAuxInt(lc, 8-lc)] x) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + v_0 := v.Args[0] + if v_0.Op != OpARM64SLLconst { break } - c := v_1.AuxInt - if !(isPowerOfTwo(c)) { + lc := v_0.AuxInt + x := v_0.Args[0] + if !(lc < 8) { break } - v.reset(OpARM64NEG) - v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v0.AuxInt = log2(c) - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpARM64SBFIZ) + v.AuxInt = armBFAuxInt(lc, 8-lc) + v.AddArg(x) return true } - // match: (MNEGW (MOVDconst [c]) x) - // cond: isPowerOfTwo(c) - // result: (NEG (SLLconst [log2(c)] x)) + return false +} +func rewriteValueARM64_OpARM64MOVBstore_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) + // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVBstore [off1+off2] {sym} ptr val mem) for { - x := v.Args[1] + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + if v_0.Op != OpARM64ADDconst { break } - c := v_0.AuxInt - if !(isPowerOfTwo(c)) { + off2 := v_0.AuxInt + ptr := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(OpARM64NEG) - v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v0.AuxInt = log2(c) - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpARM64MOVBstore) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(ptr) + v.AddArg(val) + v.AddArg(mem) return true } - // match: (MNEGW x (MOVDconst [c])) - // cond: isPowerOfTwo(c-1) && int32(c) >= 3 - // result: (NEG (ADDshiftLL x x [log2(c-1)])) + // match: (MOVBstore [off] {sym} (ADD ptr idx) val mem) + // cond: off == 0 && sym == nil + // result: (MOVBstoreidx ptr idx val mem) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADD { break } - c := v_1.AuxInt - if !(isPowerOfTwo(c-1) && int32(c) >= 3) { + idx := v_0.Args[1] + ptr := v_0.Args[0] + val := v.Args[1] + if !(off == 0 && sym == nil) { break } - v.reset(OpARM64NEG) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = log2(c - 1) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpARM64MOVBstoreidx) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) return true } - // match: (MNEGW (MOVDconst [c]) x) - // cond: isPowerOfTwo(c-1) && int32(c) >= 3 - // result: (NEG (ADDshiftLL x x [log2(c-1)])) + // match: (MOVBstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) for { - x := v.Args[1] + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + if v_0.Op != OpARM64MOVDaddr { break } - c := v_0.AuxInt - if !(isPowerOfTwo(c-1) && int32(c) >= 3) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + ptr := v_0.Args[0] + val := v.Args[1] + if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(OpARM64NEG) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = log2(c - 1) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpARM64MOVBstore) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(ptr) + v.AddArg(val) + v.AddArg(mem) return true } - return false -} -func rewriteValueARM64_OpARM64MNEGW_10(v *Value) bool { - b := v.Block - // match: (MNEGW x (MOVDconst [c])) - // cond: isPowerOfTwo(c+1) && int32(c) >= 7 - // result: (NEG (ADDshiftLL (NEG x) x [log2(c+1)])) + // match: (MOVBstore [off] {sym} ptr (MOVDconst [0]) mem) + // result: (MOVBstorezero [off] {sym} ptr mem) for { - _ = v.Args[1] - x := v.Args[0] + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c+1) && int32(c) >= 7) { + if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 0 { break } - v.reset(OpARM64NEG) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = log2(c + 1) - v1 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) - v1.AddArg(x) - v0.AddArg(v1) - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpARM64MOVBstorezero) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(mem) return true } - // match: (MNEGW (MOVDconst [c]) x) - // cond: isPowerOfTwo(c+1) && int32(c) >= 7 - // result: (NEG (ADDshiftLL (NEG x) x [log2(c+1)])) + // match: (MOVBstore [off] {sym} ptr (MOVBreg x) mem) + // result: (MOVBstore [off] {sym} ptr x mem) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - if !(isPowerOfTwo(c+1) && int32(c) >= 7) { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVBreg { break } - v.reset(OpARM64NEG) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = log2(c + 1) - v1 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) - v1.AddArg(x) - v0.AddArg(v1) - v0.AddArg(x) - v.AddArg(v0) + x := v_1.Args[0] + v.reset(OpARM64MOVBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(x) + v.AddArg(mem) return true } - // match: (MNEGW x (MOVDconst [c])) - // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) - // result: (SLLconst [log2(c/3)] (SUBshiftLL x x [2])) + // match: (MOVBstore [off] {sym} ptr (MOVBUreg x) mem) + // result: (MOVBstore [off] {sym} ptr x mem) for { - _ = v.Args[1] - x := v.Args[0] + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { + if v_1.Op != OpARM64MOVBUreg { break } - v.reset(OpARM64SLLconst) - v.Type = x.Type - v.AuxInt = log2(c / 3) - v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 2 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) + x := v_1.Args[0] + v.reset(OpARM64MOVBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(x) + v.AddArg(mem) return true } - // match: (MNEGW (MOVDconst [c]) x) - // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) - // result: (SLLconst [log2(c/3)] (SUBshiftLL x x [2])) + // match: (MOVBstore [off] {sym} ptr (MOVHreg x) mem) + // result: (MOVBstore [off] {sym} ptr x mem) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVHreg { break } - v.reset(OpARM64SLLconst) - v.Type = x.Type - v.AuxInt = log2(c / 3) - v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 2 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) + x := v_1.Args[0] + v.reset(OpARM64MOVBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(x) + v.AddArg(mem) return true } - // match: (MNEGW x (MOVDconst [c])) - // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) - // result: (NEG (SLLconst [log2(c/5)] (ADDshiftLL x x [2]))) + // match: (MOVBstore [off] {sym} ptr (MOVHUreg x) mem) + // result: (MOVBstore [off] {sym} ptr x mem) for { - _ = v.Args[1] - x := v.Args[0] + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + if v_1.Op != OpARM64MOVHUreg { break } - c := v_1.AuxInt - if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { + x := v_1.Args[0] + v.reset(OpARM64MOVBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(x) + v.AddArg(mem) + return true + } + // match: (MOVBstore [off] {sym} ptr (MOVWreg x) mem) + // result: (MOVBstore [off] {sym} ptr x mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVWreg { break } - v.reset(OpARM64NEG) - v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v0.AuxInt = log2(c / 5) - v1 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v1.AuxInt = 2 - v1.AddArg(x) - v1.AddArg(x) - v0.AddArg(v1) - v.AddArg(v0) + x := v_1.Args[0] + v.reset(OpARM64MOVBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(x) + v.AddArg(mem) return true } - // match: (MNEGW (MOVDconst [c]) x) - // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) - // result: (NEG (SLLconst [log2(c/5)] (ADDshiftLL x x [2]))) + // match: (MOVBstore [off] {sym} ptr (MOVWUreg x) mem) + // result: (MOVBstore [off] {sym} ptr x mem) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVWUreg { break } - c := v_0.AuxInt - if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { - break - } - v.reset(OpARM64NEG) - v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v0.AuxInt = log2(c / 5) - v1 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v1.AuxInt = 2 - v1.AddArg(x) - v1.AddArg(x) - v0.AddArg(v1) - v.AddArg(v0) + x := v_1.Args[0] + v.reset(OpARM64MOVBstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(x) + v.AddArg(mem) return true } - // match: (MNEGW x (MOVDconst [c])) - // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) - // result: (SLLconst [log2(c/7)] (SUBshiftLL x x [3])) + return false +} +func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { + // match: (MOVBstore [i] {s} ptr0 (SRLconst [8] w) x:(MOVBstore [i-1] {s} ptr1 w mem)) + // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) + // result: (MOVHstore [i-1] {s} ptr0 w mem) for { - _ = v.Args[1] - x := v.Args[0] + i := v.AuxInt + s := v.Aux + _ = v.Args[2] + ptr0 := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 8 { break } - c := v_1.AuxInt - if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { + w := v_1.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVBstore || x.AuxInt != i-1 || x.Aux != s { break } - v.reset(OpARM64SLLconst) - v.Type = x.Type - v.AuxInt = log2(c / 7) - v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 3 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) + mem := x.Args[2] + ptr1 := x.Args[0] + if w != x.Args[1] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { + break + } + v.reset(OpARM64MOVHstore) + v.AuxInt = i - 1 + v.Aux = s + v.AddArg(ptr0) + v.AddArg(w) + v.AddArg(mem) return true } - // match: (MNEGW (MOVDconst [c]) x) - // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) - // result: (SLLconst [log2(c/7)] (SUBshiftLL x x [3])) + // match: (MOVBstore [1] {s} (ADD ptr0 idx0) (SRLconst [8] w) x:(MOVBstoreidx ptr1 idx1 w mem)) + // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) + // result: (MOVHstoreidx ptr1 idx1 w mem) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + if v.AuxInt != 1 { break } - c := v_0.AuxInt - if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { + s := v.Aux + _ = v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADD { break } - v.reset(OpARM64SLLconst) - v.Type = x.Type - v.AuxInt = log2(c / 7) - v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 3 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr0 := v_0.Args[_i0] + idx0 := v_0.Args[1^_i0] + v_1 := v.Args[1] + if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 8 { + continue + } + w := v_1.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVBstoreidx { + continue + } + mem := x.Args[3] + ptr1 := x.Args[0] + idx1 := x.Args[1] + if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + continue + } + v.reset(OpARM64MOVHstoreidx) + v.AddArg(ptr1) + v.AddArg(idx1) + v.AddArg(w) + v.AddArg(mem) + return true + } + break } - // match: (MNEGW x (MOVDconst [c])) - // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) - // result: (NEG (SLLconst [log2(c/9)] (ADDshiftLL x x [3]))) + // match: (MOVBstore [i] {s} ptr0 (UBFX [armBFAuxInt(8, 8)] w) x:(MOVBstore [i-1] {s} ptr1 w mem)) + // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) + // result: (MOVHstore [i-1] {s} ptr0 w mem) for { - _ = v.Args[1] - x := v.Args[0] + i := v.AuxInt + s := v.Aux + _ = v.Args[2] + ptr0 := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + if v_1.Op != OpARM64UBFX || v_1.AuxInt != armBFAuxInt(8, 8) { break } - c := v_1.AuxInt - if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { + w := v_1.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVBstore || x.AuxInt != i-1 || x.Aux != s { break } - v.reset(OpARM64NEG) - v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v0.AuxInt = log2(c / 9) - v1 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v1.AuxInt = 3 - v1.AddArg(x) - v1.AddArg(x) - v0.AddArg(v1) - v.AddArg(v0) + mem := x.Args[2] + ptr1 := x.Args[0] + if w != x.Args[1] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { + break + } + v.reset(OpARM64MOVHstore) + v.AuxInt = i - 1 + v.Aux = s + v.AddArg(ptr0) + v.AddArg(w) + v.AddArg(mem) return true } - // match: (MNEGW (MOVDconst [c]) x) - // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) - // result: (NEG (SLLconst [log2(c/9)] (ADDshiftLL x x [3]))) + // match: (MOVBstore [1] {s} (ADD ptr0 idx0) (UBFX [armBFAuxInt(8, 8)] w) x:(MOVBstoreidx ptr1 idx1 w mem)) + // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) + // result: (MOVHstoreidx ptr1 idx1 w mem) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + if v.AuxInt != 1 { break } - c := v_0.AuxInt - if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { + s := v.Aux + _ = v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADD { break } - v.reset(OpARM64NEG) - v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v0.AuxInt = log2(c / 9) - v1 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v1.AuxInt = 3 - v1.AddArg(x) - v1.AddArg(x) - v0.AddArg(v1) - v.AddArg(v0) - return true + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr0 := v_0.Args[_i0] + idx0 := v_0.Args[1^_i0] + v_1 := v.Args[1] + if v_1.Op != OpARM64UBFX || v_1.AuxInt != armBFAuxInt(8, 8) { + continue + } + w := v_1.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVBstoreidx { + continue + } + mem := x.Args[3] + ptr1 := x.Args[0] + idx1 := x.Args[1] + if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + continue + } + v.reset(OpARM64MOVHstoreidx) + v.AddArg(ptr1) + v.AddArg(idx1) + v.AddArg(w) + v.AddArg(mem) + return true + } + break } - return false -} -func rewriteValueARM64_OpARM64MNEGW_20(v *Value) bool { - // match: (MNEGW (MOVDconst [c]) (MOVDconst [d])) - // result: (MOVDconst [-int64(int32(c)*int32(d))]) + // match: (MOVBstore [i] {s} ptr0 (UBFX [armBFAuxInt(8, 24)] w) x:(MOVBstore [i-1] {s} ptr1 w mem)) + // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) + // result: (MOVHstore [i-1] {s} ptr0 w mem) for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + i := v.AuxInt + s := v.Aux + _ = v.Args[2] + ptr0 := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64UBFX || v_1.AuxInt != armBFAuxInt(8, 24) { break } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + w := v_1.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVBstore || x.AuxInt != i-1 || x.Aux != s { break } - d := v_1.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = -int64(int32(c) * int32(d)) + mem := x.Args[2] + ptr1 := x.Args[0] + if w != x.Args[1] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { + break + } + v.reset(OpARM64MOVHstore) + v.AuxInt = i - 1 + v.Aux = s + v.AddArg(ptr0) + v.AddArg(w) + v.AddArg(mem) return true } - // match: (MNEGW (MOVDconst [d]) (MOVDconst [c])) - // result: (MOVDconst [-int64(int32(c)*int32(d))]) + // match: (MOVBstore [1] {s} (ADD ptr0 idx0) (UBFX [armBFAuxInt(8, 24)] w) x:(MOVBstoreidx ptr1 idx1 w mem)) + // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) + // result: (MOVHstoreidx ptr1 idx1 w mem) for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + if v.AuxInt != 1 { break } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + s := v.Aux + _ = v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADD { break } - c := v_1.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = -int64(int32(c) * int32(d)) - return true + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr0 := v_0.Args[_i0] + idx0 := v_0.Args[1^_i0] + v_1 := v.Args[1] + if v_1.Op != OpARM64UBFX || v_1.AuxInt != armBFAuxInt(8, 24) { + continue + } + w := v_1.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVBstoreidx { + continue + } + mem := x.Args[3] + ptr1 := x.Args[0] + idx1 := x.Args[1] + if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + continue + } + v.reset(OpARM64MOVHstoreidx) + v.AddArg(ptr1) + v.AddArg(idx1) + v.AddArg(w) + v.AddArg(mem) + return true + } + break } - return false -} -func rewriteValueARM64_OpARM64MOD_0(v *Value) bool { - // match: (MOD (MOVDconst [c]) (MOVDconst [d])) - // result: (MOVDconst [c%d]) + // match: (MOVBstore [i] {s} ptr0 (SRLconst [8] (MOVDreg w)) x:(MOVBstore [i-1] {s} ptr1 w mem)) + // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) + // result: (MOVHstore [i-1] {s} ptr0 w mem) for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + i := v.AuxInt + s := v.Aux + _ = v.Args[2] + ptr0 := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 8 { break } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpARM64MOVDreg { break } - d := v_1.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = c % d + w := v_1_0.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVBstore || x.AuxInt != i-1 || x.Aux != s { + break + } + mem := x.Args[2] + ptr1 := x.Args[0] + if w != x.Args[1] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { + break + } + v.reset(OpARM64MOVHstore) + v.AuxInt = i - 1 + v.Aux = s + v.AddArg(ptr0) + v.AddArg(w) + v.AddArg(mem) return true } - return false -} -func rewriteValueARM64_OpARM64MODW_0(v *Value) bool { - // match: (MODW (MOVDconst [c]) (MOVDconst [d])) - // result: (MOVDconst [int64(int32(c)%int32(d))]) + // match: (MOVBstore [1] {s} (ADD ptr0 idx0) (SRLconst [8] (MOVDreg w)) x:(MOVBstoreidx ptr1 idx1 w mem)) + // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) + // result: (MOVHstoreidx ptr1 idx1 w mem) for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + if v.AuxInt != 1 { break } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + s := v.Aux + _ = v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADD { break } - d := v_1.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = int64(int32(c) % int32(d)) - return true + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr0 := v_0.Args[_i0] + idx0 := v_0.Args[1^_i0] + v_1 := v.Args[1] + if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 8 { + continue + } + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpARM64MOVDreg { + continue + } + w := v_1_0.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVBstoreidx { + continue + } + mem := x.Args[3] + ptr1 := x.Args[0] + idx1 := x.Args[1] + if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + continue + } + v.reset(OpARM64MOVHstoreidx) + v.AddArg(ptr1) + v.AddArg(idx1) + v.AddArg(w) + v.AddArg(mem) + return true + } + break } - return false -} -func rewriteValueARM64_OpARM64MOVBUload_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (MOVBUload [off1] {sym} (ADDconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVBUload [off1+off2] {sym} ptr mem) + // match: (MOVBstore [i] {s} ptr0 (SRLconst [j] w) x:(MOVBstore [i-1] {s} ptr1 w0:(SRLconst [j-8] w) mem)) + // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) + // result: (MOVHstore [i-1] {s} ptr0 w0 mem) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADDconst { + i := v.AuxInt + s := v.Aux + _ = v.Args[2] + ptr0 := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64SRLconst { break } - off2 := v_0.AuxInt - ptr := v_0.Args[0] - if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + j := v_1.AuxInt + w := v_1.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVBstore || x.AuxInt != i-1 || x.Aux != s { break } - v.reset(OpARM64MOVBUload) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(ptr) + mem := x.Args[2] + ptr1 := x.Args[0] + w0 := x.Args[1] + if w0.Op != OpARM64SRLconst || w0.AuxInt != j-8 || w != w0.Args[0] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { + break + } + v.reset(OpARM64MOVHstore) + v.AuxInt = i - 1 + v.Aux = s + v.AddArg(ptr0) + v.AddArg(w0) v.AddArg(mem) return true } - // match: (MOVBUload [off] {sym} (ADD ptr idx) mem) - // cond: off == 0 && sym == nil - // result: (MOVBUloadidx ptr idx mem) + // match: (MOVBstore [1] {s} (ADD ptr0 idx0) (SRLconst [j] w) x:(MOVBstoreidx ptr1 idx1 w0:(SRLconst [j-8] w) mem)) + // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) + // result: (MOVHstoreidx ptr1 idx1 w0 mem) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] + if v.AuxInt != 1 { + break + } + s := v.Aux + _ = v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(off == 0 && sym == nil) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr0 := v_0.Args[_i0] + idx0 := v_0.Args[1^_i0] + v_1 := v.Args[1] + if v_1.Op != OpARM64SRLconst { + continue + } + j := v_1.AuxInt + w := v_1.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVBstoreidx { + continue + } + mem := x.Args[3] + ptr1 := x.Args[0] + idx1 := x.Args[1] + w0 := x.Args[2] + if w0.Op != OpARM64SRLconst || w0.AuxInt != j-8 || w != w0.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + continue + } + v.reset(OpARM64MOVHstoreidx) + v.AddArg(ptr1) + v.AddArg(idx1) + v.AddArg(w0) + v.AddArg(mem) + return true } - v.reset(OpARM64MOVBUloadidx) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } - // match: (MOVBUload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVBUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) + return false +} +func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { + b := v.Block + // match: (MOVBstore [i] {s} ptr0 (UBFX [bfc] w) x:(MOVBstore [i-1] {s} ptr1 w0:(UBFX [bfc2] w) mem)) + // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && getARM64BFwidth(bfc) == 32 - getARM64BFlsb(bfc) && getARM64BFwidth(bfc2) == 32 - getARM64BFlsb(bfc2) && getARM64BFlsb(bfc2) == getARM64BFlsb(bfc) - 8 && clobber(x) + // result: (MOVHstore [i-1] {s} ptr0 w0 mem) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDaddr { + i := v.AuxInt + s := v.Aux + _ = v.Args[2] + ptr0 := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64UBFX { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - ptr := v_0.Args[0] - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + bfc := v_1.AuxInt + w := v_1.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVBstore || x.AuxInt != i-1 || x.Aux != s { break } - v.reset(OpARM64MOVBUload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MOVBUload [off] {sym} ptr (MOVBstorezero [off2] {sym2} ptr2 _)) - // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) - // result: (MOVDconst [0]) - for { - off := v.AuxInt - sym := v.Aux - _ = v.Args[1] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVBstorezero { + mem := x.Args[2] + ptr1 := x.Args[0] + w0 := x.Args[1] + if w0.Op != OpARM64UBFX { break } - off2 := v_1.AuxInt - sym2 := v_1.Aux - _ = v_1.Args[1] - ptr2 := v_1.Args[0] - if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { + bfc2 := w0.AuxInt + if w != w0.Args[0] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && getARM64BFwidth(bfc) == 32-getARM64BFlsb(bfc) && getARM64BFwidth(bfc2) == 32-getARM64BFlsb(bfc2) && getARM64BFlsb(bfc2) == getARM64BFlsb(bfc)-8 && clobber(x)) { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.reset(OpARM64MOVHstore) + v.AuxInt = i - 1 + v.Aux = s + v.AddArg(ptr0) + v.AddArg(w0) + v.AddArg(mem) return true } - // match: (MOVBUload [off] {sym} (SB) _) - // cond: symIsRO(sym) - // result: (MOVDconst [int64(read8(sym, off))]) + // match: (MOVBstore [1] {s} (ADD ptr0 idx0) (UBFX [bfc] w) x:(MOVBstoreidx ptr1 idx1 w0:(UBFX [bfc2] w) mem)) + // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && getARM64BFwidth(bfc) == 32 - getARM64BFlsb(bfc) && getARM64BFwidth(bfc2) == 32 - getARM64BFlsb(bfc2) && getARM64BFlsb(bfc2) == getARM64BFlsb(bfc) - 8 && clobber(x) + // result: (MOVHstoreidx ptr1 idx1 w0 mem) for { - off := v.AuxInt - sym := v.Aux - _ = v.Args[1] + if v.AuxInt != 1 { + break + } + s := v.Aux + _ = v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpSB || !(symIsRO(sym)) { + if v_0.Op != OpARM64ADD { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = int64(read8(sym, off)) - return true + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr0 := v_0.Args[_i0] + idx0 := v_0.Args[1^_i0] + v_1 := v.Args[1] + if v_1.Op != OpARM64UBFX { + continue + } + bfc := v_1.AuxInt + w := v_1.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVBstoreidx { + continue + } + mem := x.Args[3] + ptr1 := x.Args[0] + idx1 := x.Args[1] + w0 := x.Args[2] + if w0.Op != OpARM64UBFX { + continue + } + bfc2 := w0.AuxInt + if w != w0.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && getARM64BFwidth(bfc) == 32-getARM64BFlsb(bfc) && getARM64BFwidth(bfc2) == 32-getARM64BFlsb(bfc2) && getARM64BFlsb(bfc2) == getARM64BFlsb(bfc)-8 && clobber(x)) { + continue + } + v.reset(OpARM64MOVHstoreidx) + v.AddArg(ptr1) + v.AddArg(idx1) + v.AddArg(w0) + v.AddArg(mem) + return true + } + break } - return false -} -func rewriteValueARM64_OpARM64MOVBUloadidx_0(v *Value) bool { - // match: (MOVBUloadidx ptr (MOVDconst [c]) mem) - // result: (MOVBUload [c] ptr mem) + // match: (MOVBstore [i] {s} ptr0 (SRLconst [j] (MOVDreg w)) x:(MOVBstore [i-1] {s} ptr1 w0:(SRLconst [j-8] (MOVDreg w)) mem)) + // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) + // result: (MOVHstore [i-1] {s} ptr0 w0 mem) for { - mem := v.Args[2] - ptr := v.Args[0] + i := v.AuxInt + s := v.Aux + _ = v.Args[2] + ptr0 := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + if v_1.Op != OpARM64SRLconst { break } - c := v_1.AuxInt - v.reset(OpARM64MOVBUload) - v.AuxInt = c - v.AddArg(ptr) + j := v_1.AuxInt + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpARM64MOVDreg { + break + } + w := v_1_0.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVBstore || x.AuxInt != i-1 || x.Aux != s { + break + } + mem := x.Args[2] + ptr1 := x.Args[0] + w0 := x.Args[1] + if w0.Op != OpARM64SRLconst || w0.AuxInt != j-8 { + break + } + w0_0 := w0.Args[0] + if w0_0.Op != OpARM64MOVDreg || w != w0_0.Args[0] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { + break + } + v.reset(OpARM64MOVHstore) + v.AuxInt = i - 1 + v.Aux = s + v.AddArg(ptr0) + v.AddArg(w0) v.AddArg(mem) return true } - // match: (MOVBUloadidx (MOVDconst [c]) ptr mem) - // result: (MOVBUload [c] ptr mem) + // match: (MOVBstore [1] {s} (ADD ptr0 idx0) (SRLconst [j] (MOVDreg w)) x:(MOVBstoreidx ptr1 idx1 w0:(SRLconst [j-8] (MOVDreg w)) mem)) + // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) + // result: (MOVHstoreidx ptr1 idx1 w0 mem) for { - mem := v.Args[2] + if v.AuxInt != 1 { + break + } + s := v.Aux + _ = v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + if v_0.Op != OpARM64ADD { break } - c := v_0.AuxInt - ptr := v.Args[1] - v.reset(OpARM64MOVBUload) - v.AuxInt = c - v.AddArg(ptr) - v.AddArg(mem) - return true + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr0 := v_0.Args[_i0] + idx0 := v_0.Args[1^_i0] + v_1 := v.Args[1] + if v_1.Op != OpARM64SRLconst { + continue + } + j := v_1.AuxInt + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpARM64MOVDreg { + continue + } + w := v_1_0.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVBstoreidx { + continue + } + mem := x.Args[3] + ptr1 := x.Args[0] + idx1 := x.Args[1] + w0 := x.Args[2] + if w0.Op != OpARM64SRLconst || w0.AuxInt != j-8 { + continue + } + w0_0 := w0.Args[0] + if w0_0.Op != OpARM64MOVDreg || w != w0_0.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + continue + } + v.reset(OpARM64MOVHstoreidx) + v.AddArg(ptr1) + v.AddArg(idx1) + v.AddArg(w0) + v.AddArg(mem) + return true + } + break } - // match: (MOVBUloadidx ptr idx (MOVBstorezeroidx ptr2 idx2 _)) - // cond: (isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) - // result: (MOVDconst [0]) + // match: (MOVBstore [i] {s} ptr w x0:(MOVBstore [i-1] {s} ptr (SRLconst [8] w) x1:(MOVBstore [i-2] {s} ptr (SRLconst [16] w) x2:(MOVBstore [i-3] {s} ptr (SRLconst [24] w) x3:(MOVBstore [i-4] {s} ptr (SRLconst [32] w) x4:(MOVBstore [i-5] {s} ptr (SRLconst [40] w) x5:(MOVBstore [i-6] {s} ptr (SRLconst [48] w) x6:(MOVBstore [i-7] {s} ptr (SRLconst [56] w) mem)))))))) + // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) + // result: (MOVDstore [i-7] {s} ptr (REV w) mem) for { + i := v.AuxInt + s := v.Aux _ = v.Args[2] ptr := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVBstorezeroidx { + w := v.Args[1] + x0 := v.Args[2] + if x0.Op != OpARM64MOVBstore || x0.AuxInt != i-1 || x0.Aux != s { break } - _ = v_2.Args[2] - ptr2 := v_2.Args[0] - idx2 := v_2.Args[1] - if !(isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) { + _ = x0.Args[2] + if ptr != x0.Args[0] { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 - return true - } - return false -} -func rewriteValueARM64_OpARM64MOVBUreg_0(v *Value) bool { - // match: (MOVBUreg x:(MOVBUload _ _)) - // result: (MOVDreg x) - for { - x := v.Args[0] - if x.Op != OpARM64MOVBUload { + x0_1 := x0.Args[1] + if x0_1.Op != OpARM64SRLconst || x0_1.AuxInt != 8 || w != x0_1.Args[0] { break } - _ = x.Args[1] - v.reset(OpARM64MOVDreg) - v.AddArg(x) - return true - } - // match: (MOVBUreg x:(MOVBUloadidx _ _ _)) - // result: (MOVDreg x) - for { - x := v.Args[0] - if x.Op != OpARM64MOVBUloadidx { + x1 := x0.Args[2] + if x1.Op != OpARM64MOVBstore || x1.AuxInt != i-2 || x1.Aux != s { break } - _ = x.Args[2] - v.reset(OpARM64MOVDreg) - v.AddArg(x) - return true - } - // match: (MOVBUreg x:(MOVBUreg _)) - // result: (MOVDreg x) - for { - x := v.Args[0] - if x.Op != OpARM64MOVBUreg { + _ = x1.Args[2] + if ptr != x1.Args[0] { break } - v.reset(OpARM64MOVDreg) - v.AddArg(x) - return true - } - // match: (MOVBUreg (ANDconst [c] x)) - // result: (ANDconst [c&(1<<8-1)] x) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64ANDconst { + x1_1 := x1.Args[1] + if x1_1.Op != OpARM64SRLconst || x1_1.AuxInt != 16 || w != x1_1.Args[0] { break } - c := v_0.AuxInt - x := v_0.Args[0] - v.reset(OpARM64ANDconst) - v.AuxInt = c & (1<<8 - 1) - v.AddArg(x) - return true - } - // match: (MOVBUreg (MOVDconst [c])) - // result: (MOVDconst [int64(uint8(c))]) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + x2 := x1.Args[2] + if x2.Op != OpARM64MOVBstore || x2.AuxInt != i-3 || x2.Aux != s { break } - c := v_0.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = int64(uint8(c)) - return true - } - // match: (MOVBUreg x) - // cond: x.Type.IsBoolean() - // result: (MOVDreg x) - for { - x := v.Args[0] - if !(x.Type.IsBoolean()) { + _ = x2.Args[2] + if ptr != x2.Args[0] { break } - v.reset(OpARM64MOVDreg) - v.AddArg(x) - return true - } - // match: (MOVBUreg (SLLconst [sc] x)) - // cond: isARM64BFMask(sc, 1<<8-1, sc) - // result: (UBFIZ [armBFAuxInt(sc, arm64BFWidth(1<<8-1, sc))] x) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64SLLconst { + x2_1 := x2.Args[1] + if x2_1.Op != OpARM64SRLconst || x2_1.AuxInt != 24 || w != x2_1.Args[0] { break } - sc := v_0.AuxInt - x := v_0.Args[0] - if !(isARM64BFMask(sc, 1<<8-1, sc)) { + x3 := x2.Args[2] + if x3.Op != OpARM64MOVBstore || x3.AuxInt != i-4 || x3.Aux != s { break } - v.reset(OpARM64UBFIZ) - v.AuxInt = armBFAuxInt(sc, arm64BFWidth(1<<8-1, sc)) - v.AddArg(x) - return true - } - // match: (MOVBUreg (SRLconst [sc] x)) - // cond: isARM64BFMask(sc, 1<<8-1, 0) - // result: (UBFX [armBFAuxInt(sc, 8)] x) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64SRLconst { + _ = x3.Args[2] + if ptr != x3.Args[0] { break } - sc := v_0.AuxInt - x := v_0.Args[0] - if !(isARM64BFMask(sc, 1<<8-1, 0)) { + x3_1 := x3.Args[1] + if x3_1.Op != OpARM64SRLconst || x3_1.AuxInt != 32 || w != x3_1.Args[0] { break } - v.reset(OpARM64UBFX) - v.AuxInt = armBFAuxInt(sc, 8) - v.AddArg(x) - return true - } - return false -} -func rewriteValueARM64_OpARM64MOVBload_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVBload [off1+off2] {sym} ptr mem) - for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADDconst { + x4 := x3.Args[2] + if x4.Op != OpARM64MOVBstore || x4.AuxInt != i-5 || x4.Aux != s { break } - off2 := v_0.AuxInt - ptr := v_0.Args[0] - if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + _ = x4.Args[2] + if ptr != x4.Args[0] { break } - v.reset(OpARM64MOVBload) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MOVBload [off] {sym} (ADD ptr idx) mem) - // cond: off == 0 && sym == nil - // result: (MOVBloadidx ptr idx mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { + x4_1 := x4.Args[1] + if x4_1.Op != OpARM64SRLconst || x4_1.AuxInt != 40 || w != x4_1.Args[0] { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(off == 0 && sym == nil) { + x5 := x4.Args[2] + if x5.Op != OpARM64MOVBstore || x5.AuxInt != i-6 || x5.Aux != s { break } - v.reset(OpARM64MOVBloadidx) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVBload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) - for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDaddr { + _ = x5.Args[2] + if ptr != x5.Args[0] { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - ptr := v_0.Args[0] - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + x5_1 := x5.Args[1] + if x5_1.Op != OpARM64SRLconst || x5_1.AuxInt != 48 || w != x5_1.Args[0] { break } - v.reset(OpARM64MOVBload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MOVBload [off] {sym} ptr (MOVBstorezero [off2] {sym2} ptr2 _)) - // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) - // result: (MOVDconst [0]) - for { - off := v.AuxInt - sym := v.Aux - _ = v.Args[1] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVBstorezero { + x6 := x5.Args[2] + if x6.Op != OpARM64MOVBstore || x6.AuxInt != i-7 || x6.Aux != s { break } - off2 := v_1.AuxInt - sym2 := v_1.Aux - _ = v_1.Args[1] - ptr2 := v_1.Args[0] - if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { + mem := x6.Args[2] + if ptr != x6.Args[0] { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 - return true - } - return false -} -func rewriteValueARM64_OpARM64MOVBloadidx_0(v *Value) bool { - // match: (MOVBloadidx ptr (MOVDconst [c]) mem) - // result: (MOVBload [c] ptr mem) - for { - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + x6_1 := x6.Args[1] + if x6_1.Op != OpARM64SRLconst || x6_1.AuxInt != 56 || w != x6_1.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6)) { break } - c := v_1.AuxInt - v.reset(OpARM64MOVBload) - v.AuxInt = c + v.reset(OpARM64MOVDstore) + v.AuxInt = i - 7 + v.Aux = s v.AddArg(ptr) + v0 := b.NewValue0(x6.Pos, OpARM64REV, w.Type) + v0.AddArg(w) + v.AddArg(v0) v.AddArg(mem) return true } - // match: (MOVBloadidx (MOVDconst [c]) ptr mem) - // result: (MOVBload [c] ptr mem) + // match: (MOVBstore [7] {s} p w x0:(MOVBstore [6] {s} p (SRLconst [8] w) x1:(MOVBstore [5] {s} p (SRLconst [16] w) x2:(MOVBstore [4] {s} p (SRLconst [24] w) x3:(MOVBstore [3] {s} p (SRLconst [32] w) x4:(MOVBstore [2] {s} p (SRLconst [40] w) x5:(MOVBstore [1] {s} p1:(ADD ptr1 idx1) (SRLconst [48] w) x6:(MOVBstoreidx ptr0 idx0 (SRLconst [56] w) mem)))))))) + // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) + // result: (MOVDstoreidx ptr0 idx0 (REV w) mem) for { - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + if v.AuxInt != 7 { break } - c := v_0.AuxInt - ptr := v.Args[1] - v.reset(OpARM64MOVBload) - v.AuxInt = c - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MOVBloadidx ptr idx (MOVBstorezeroidx ptr2 idx2 _)) - // cond: (isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) - // result: (MOVDconst [0]) - for { + s := v.Aux _ = v.Args[2] - ptr := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVBstorezeroidx { + p := v.Args[0] + w := v.Args[1] + x0 := v.Args[2] + if x0.Op != OpARM64MOVBstore || x0.AuxInt != 6 || x0.Aux != s { break } - _ = v_2.Args[2] - ptr2 := v_2.Args[0] - idx2 := v_2.Args[1] - if !(isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) { + _ = x0.Args[2] + if p != x0.Args[0] { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 - return true - } - return false -} -func rewriteValueARM64_OpARM64MOVBreg_0(v *Value) bool { - // match: (MOVBreg x:(MOVBload _ _)) - // result: (MOVDreg x) - for { - x := v.Args[0] - if x.Op != OpARM64MOVBload { + x0_1 := x0.Args[1] + if x0_1.Op != OpARM64SRLconst || x0_1.AuxInt != 8 || w != x0_1.Args[0] { break } - _ = x.Args[1] - v.reset(OpARM64MOVDreg) - v.AddArg(x) - return true - } - // match: (MOVBreg x:(MOVBloadidx _ _ _)) - // result: (MOVDreg x) - for { - x := v.Args[0] - if x.Op != OpARM64MOVBloadidx { + x1 := x0.Args[2] + if x1.Op != OpARM64MOVBstore || x1.AuxInt != 5 || x1.Aux != s { break } - _ = x.Args[2] - v.reset(OpARM64MOVDreg) - v.AddArg(x) - return true - } - // match: (MOVBreg x:(MOVBreg _)) - // result: (MOVDreg x) - for { - x := v.Args[0] - if x.Op != OpARM64MOVBreg { + _ = x1.Args[2] + if p != x1.Args[0] { break } - v.reset(OpARM64MOVDreg) - v.AddArg(x) - return true - } - // match: (MOVBreg (MOVDconst [c])) - // result: (MOVDconst [int64(int8(c))]) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + x1_1 := x1.Args[1] + if x1_1.Op != OpARM64SRLconst || x1_1.AuxInt != 16 || w != x1_1.Args[0] { break } - c := v_0.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = int64(int8(c)) - return true - } - // match: (MOVBreg (SLLconst [lc] x)) - // cond: lc < 8 - // result: (SBFIZ [armBFAuxInt(lc, 8-lc)] x) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64SLLconst { + x2 := x1.Args[2] + if x2.Op != OpARM64MOVBstore || x2.AuxInt != 4 || x2.Aux != s { break } - lc := v_0.AuxInt - x := v_0.Args[0] - if !(lc < 8) { + _ = x2.Args[2] + if p != x2.Args[0] { break } - v.reset(OpARM64SBFIZ) - v.AuxInt = armBFAuxInt(lc, 8-lc) - v.AddArg(x) - return true - } - return false -} -func rewriteValueARM64_OpARM64MOVBstore_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) - // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVBstore [off1+off2] {sym} ptr val mem) - for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADDconst { + x2_1 := x2.Args[1] + if x2_1.Op != OpARM64SRLconst || x2_1.AuxInt != 24 || w != x2_1.Args[0] { break } - off2 := v_0.AuxInt - ptr := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + x3 := x2.Args[2] + if x3.Op != OpARM64MOVBstore || x3.AuxInt != 3 || x3.Aux != s { break } - v.reset(OpARM64MOVBstore) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(ptr) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVBstore [off] {sym} (ADD ptr idx) val mem) - // cond: off == 0 && sym == nil - // result: (MOVBstoreidx ptr idx val mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { + _ = x3.Args[2] + if p != x3.Args[0] { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v.Args[1] - if !(off == 0 && sym == nil) { + x3_1 := x3.Args[1] + if x3_1.Op != OpARM64SRLconst || x3_1.AuxInt != 32 || w != x3_1.Args[0] { break } - v.reset(OpARM64MOVBstoreidx) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVBstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) - for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDaddr { + x4 := x3.Args[2] + if x4.Op != OpARM64MOVBstore || x4.AuxInt != 2 || x4.Aux != s { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - ptr := v_0.Args[0] - val := v.Args[1] - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + _ = x4.Args[2] + if p != x4.Args[0] { break } - v.reset(OpARM64MOVBstore) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(val) - v.AddArg(mem) - return true + x4_1 := x4.Args[1] + if x4_1.Op != OpARM64SRLconst || x4_1.AuxInt != 40 || w != x4_1.Args[0] { + break + } + x5 := x4.Args[2] + if x5.Op != OpARM64MOVBstore || x5.AuxInt != 1 || x5.Aux != s { + break + } + _ = x5.Args[2] + p1 := x5.Args[0] + if p1.Op != OpARM64ADD { + break + } + _ = p1.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr1 := p1.Args[_i0] + idx1 := p1.Args[1^_i0] + x5_1 := x5.Args[1] + if x5_1.Op != OpARM64SRLconst || x5_1.AuxInt != 48 || w != x5_1.Args[0] { + continue + } + x6 := x5.Args[2] + if x6.Op != OpARM64MOVBstoreidx { + continue + } + mem := x6.Args[3] + ptr0 := x6.Args[0] + idx0 := x6.Args[1] + x6_2 := x6.Args[2] + if x6_2.Op != OpARM64SRLconst || x6_2.AuxInt != 56 || w != x6_2.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6)) { + continue + } + v.reset(OpARM64MOVDstoreidx) + v.AddArg(ptr0) + v.AddArg(idx0) + v0 := b.NewValue0(x5.Pos, OpARM64REV, w.Type) + v0.AddArg(w) + v.AddArg(v0) + v.AddArg(mem) + return true + } + break } - // match: (MOVBstore [off] {sym} ptr (MOVDconst [0]) mem) - // result: (MOVBstorezero [off] {sym} ptr mem) + // match: (MOVBstore [i] {s} ptr w x0:(MOVBstore [i-1] {s} ptr (UBFX [armBFAuxInt(8, 24)] w) x1:(MOVBstore [i-2] {s} ptr (UBFX [armBFAuxInt(16, 16)] w) x2:(MOVBstore [i-3] {s} ptr (UBFX [armBFAuxInt(24, 8)] w) mem)))) + // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2) + // result: (MOVWstore [i-3] {s} ptr (REVW w) mem) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] + i := v.AuxInt + s := v.Aux + _ = v.Args[2] ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 0 { + w := v.Args[1] + x0 := v.Args[2] + if x0.Op != OpARM64MOVBstore || x0.AuxInt != i-1 || x0.Aux != s { break } - v.reset(OpARM64MOVBstorezero) - v.AuxInt = off - v.Aux = sym + _ = x0.Args[2] + if ptr != x0.Args[0] { + break + } + x0_1 := x0.Args[1] + if x0_1.Op != OpARM64UBFX || x0_1.AuxInt != armBFAuxInt(8, 24) || w != x0_1.Args[0] { + break + } + x1 := x0.Args[2] + if x1.Op != OpARM64MOVBstore || x1.AuxInt != i-2 || x1.Aux != s { + break + } + _ = x1.Args[2] + if ptr != x1.Args[0] { + break + } + x1_1 := x1.Args[1] + if x1_1.Op != OpARM64UBFX || x1_1.AuxInt != armBFAuxInt(16, 16) || w != x1_1.Args[0] { + break + } + x2 := x1.Args[2] + if x2.Op != OpARM64MOVBstore || x2.AuxInt != i-3 || x2.Aux != s { + break + } + mem := x2.Args[2] + if ptr != x2.Args[0] { + break + } + x2_1 := x2.Args[1] + if x2_1.Op != OpARM64UBFX || x2_1.AuxInt != armBFAuxInt(24, 8) || w != x2_1.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2)) { + break + } + v.reset(OpARM64MOVWstore) + v.AuxInt = i - 3 + v.Aux = s v.AddArg(ptr) + v0 := b.NewValue0(x2.Pos, OpARM64REVW, w.Type) + v0.AddArg(w) + v.AddArg(v0) v.AddArg(mem) return true } - // match: (MOVBstore [off] {sym} ptr (MOVBreg x) mem) - // result: (MOVBstore [off] {sym} ptr x mem) + // match: (MOVBstore [3] {s} p w x0:(MOVBstore [2] {s} p (UBFX [armBFAuxInt(8, 24)] w) x1:(MOVBstore [1] {s} p1:(ADD ptr1 idx1) (UBFX [armBFAuxInt(16, 16)] w) x2:(MOVBstoreidx ptr0 idx0 (UBFX [armBFAuxInt(24, 8)] w) mem)))) + // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) + // result: (MOVWstoreidx ptr0 idx0 (REVW w) mem) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVBreg { + if v.AuxInt != 3 { break } - x := v_1.Args[0] - v.reset(OpARM64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true - } - // match: (MOVBstore [off] {sym} ptr (MOVBUreg x) mem) - // result: (MOVBstore [off] {sym} ptr x mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVBUreg { + s := v.Aux + _ = v.Args[2] + p := v.Args[0] + w := v.Args[1] + x0 := v.Args[2] + if x0.Op != OpARM64MOVBstore || x0.AuxInt != 2 || x0.Aux != s { break } - x := v_1.Args[0] - v.reset(OpARM64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true - } - // match: (MOVBstore [off] {sym} ptr (MOVHreg x) mem) - // result: (MOVBstore [off] {sym} ptr x mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVHreg { + _ = x0.Args[2] + if p != x0.Args[0] { break } - x := v_1.Args[0] - v.reset(OpARM64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true - } - // match: (MOVBstore [off] {sym} ptr (MOVHUreg x) mem) - // result: (MOVBstore [off] {sym} ptr x mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVHUreg { + x0_1 := x0.Args[1] + if x0_1.Op != OpARM64UBFX || x0_1.AuxInt != armBFAuxInt(8, 24) || w != x0_1.Args[0] { break } - x := v_1.Args[0] - v.reset(OpARM64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true - } - // match: (MOVBstore [off] {sym} ptr (MOVWreg x) mem) - // result: (MOVBstore [off] {sym} ptr x mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVWreg { + x1 := x0.Args[2] + if x1.Op != OpARM64MOVBstore || x1.AuxInt != 1 || x1.Aux != s { break } - x := v_1.Args[0] - v.reset(OpARM64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true - } - // match: (MOVBstore [off] {sym} ptr (MOVWUreg x) mem) - // result: (MOVBstore [off] {sym} ptr x mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVWUreg { + _ = x1.Args[2] + p1 := x1.Args[0] + if p1.Op != OpARM64ADD { break } - x := v_1.Args[0] - v.reset(OpARM64MOVBstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true + _ = p1.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr1 := p1.Args[_i0] + idx1 := p1.Args[1^_i0] + x1_1 := x1.Args[1] + if x1_1.Op != OpARM64UBFX || x1_1.AuxInt != armBFAuxInt(16, 16) || w != x1_1.Args[0] { + continue + } + x2 := x1.Args[2] + if x2.Op != OpARM64MOVBstoreidx { + continue + } + mem := x2.Args[3] + ptr0 := x2.Args[0] + idx0 := x2.Args[1] + x2_2 := x2.Args[2] + if x2_2.Op != OpARM64UBFX || x2_2.AuxInt != armBFAuxInt(24, 8) || w != x2_2.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2)) { + continue + } + v.reset(OpARM64MOVWstoreidx) + v.AddArg(ptr0) + v.AddArg(idx0) + v0 := b.NewValue0(x1.Pos, OpARM64REVW, w.Type) + v0.AddArg(w) + v.AddArg(v0) + v.AddArg(mem) + return true + } + break } - return false -} -func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { - // match: (MOVBstore [i] {s} ptr0 (SRLconst [8] w) x:(MOVBstore [i-1] {s} ptr1 w mem)) - // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) - // result: (MOVHstore [i-1] {s} ptr0 w mem) + // match: (MOVBstore [i] {s} ptr w x0:(MOVBstore [i-1] {s} ptr (SRLconst [8] (MOVDreg w)) x1:(MOVBstore [i-2] {s} ptr (SRLconst [16] (MOVDreg w)) x2:(MOVBstore [i-3] {s} ptr (SRLconst [24] (MOVDreg w)) mem)))) + // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2) + // result: (MOVWstore [i-3] {s} ptr (REVW w) mem) for { i := v.AuxInt s := v.Aux _ = v.Args[2] - ptr0 := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 8 { + ptr := v.Args[0] + w := v.Args[1] + x0 := v.Args[2] + if x0.Op != OpARM64MOVBstore || x0.AuxInt != i-1 || x0.Aux != s { break } - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVBstore || x.AuxInt != i-1 || x.Aux != s { + _ = x0.Args[2] + if ptr != x0.Args[0] { break } - mem := x.Args[2] - ptr1 := x.Args[0] - if w != x.Args[1] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { + x0_1 := x0.Args[1] + if x0_1.Op != OpARM64SRLconst || x0_1.AuxInt != 8 { break } - v.reset(OpARM64MOVHstore) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(ptr0) - v.AddArg(w) - v.AddArg(mem) - return true - } - // match: (MOVBstore [1] {s} (ADD ptr0 idx0) (SRLconst [8] w) x:(MOVBstoreidx ptr1 idx1 w mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVHstoreidx ptr1 idx1 w mem) - for { - if v.AuxInt != 1 { + x0_1_0 := x0_1.Args[0] + if x0_1_0.Op != OpARM64MOVDreg || w != x0_1_0.Args[0] { break } - s := v.Aux - _ = v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { + x1 := x0.Args[2] + if x1.Op != OpARM64MOVBstore || x1.AuxInt != i-2 || x1.Aux != s { break } - idx0 := v_0.Args[1] - ptr0 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 8 { + _ = x1.Args[2] + if ptr != x1.Args[0] { break } - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVBstoreidx { + x1_1 := x1.Args[1] + if x1_1.Op != OpARM64SRLconst || x1_1.AuxInt != 16 { break } - mem := x.Args[3] - ptr1 := x.Args[0] - idx1 := x.Args[1] - if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + x1_1_0 := x1_1.Args[0] + if x1_1_0.Op != OpARM64MOVDreg || w != x1_1_0.Args[0] { break } - v.reset(OpARM64MOVHstoreidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(w) + x2 := x1.Args[2] + if x2.Op != OpARM64MOVBstore || x2.AuxInt != i-3 || x2.Aux != s { + break + } + mem := x2.Args[2] + if ptr != x2.Args[0] { + break + } + x2_1 := x2.Args[1] + if x2_1.Op != OpARM64SRLconst || x2_1.AuxInt != 24 { + break + } + x2_1_0 := x2_1.Args[0] + if x2_1_0.Op != OpARM64MOVDreg || w != x2_1_0.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2)) { + break + } + v.reset(OpARM64MOVWstore) + v.AuxInt = i - 3 + v.Aux = s + v.AddArg(ptr) + v0 := b.NewValue0(x2.Pos, OpARM64REVW, w.Type) + v0.AddArg(w) + v.AddArg(v0) v.AddArg(mem) return true } - // match: (MOVBstore [1] {s} (ADD idx0 ptr0) (SRLconst [8] w) x:(MOVBstoreidx ptr1 idx1 w mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVHstoreidx ptr1 idx1 w mem) + // match: (MOVBstore [3] {s} p w x0:(MOVBstore [2] {s} p (SRLconst [8] (MOVDreg w)) x1:(MOVBstore [1] {s} p1:(ADD ptr1 idx1) (SRLconst [16] (MOVDreg w)) x2:(MOVBstoreidx ptr0 idx0 (SRLconst [24] (MOVDreg w)) mem)))) + // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) + // result: (MOVWstoreidx ptr0 idx0 (REVW w) mem) for { - if v.AuxInt != 1 { + if v.AuxInt != 3 { break } s := v.Aux _ = v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { + p := v.Args[0] + w := v.Args[1] + x0 := v.Args[2] + if x0.Op != OpARM64MOVBstore || x0.AuxInt != 2 || x0.Aux != s { break } - ptr0 := v_0.Args[1] - idx0 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 8 { + _ = x0.Args[2] + if p != x0.Args[0] { break } - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVBstoreidx { + x0_1 := x0.Args[1] + if x0_1.Op != OpARM64SRLconst || x0_1.AuxInt != 8 { break } - mem := x.Args[3] - ptr1 := x.Args[0] - idx1 := x.Args[1] - if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + x0_1_0 := x0_1.Args[0] + if x0_1_0.Op != OpARM64MOVDreg || w != x0_1_0.Args[0] { break } - v.reset(OpARM64MOVHstoreidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(w) - v.AddArg(mem) - return true - } - // match: (MOVBstore [i] {s} ptr0 (UBFX [armBFAuxInt(8, 8)] w) x:(MOVBstore [i-1] {s} ptr1 w mem)) - // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) - // result: (MOVHstore [i-1] {s} ptr0 w mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - ptr0 := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64UBFX || v_1.AuxInt != armBFAuxInt(8, 8) { + x1 := x0.Args[2] + if x1.Op != OpARM64MOVBstore || x1.AuxInt != 1 || x1.Aux != s { break } - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVBstore || x.AuxInt != i-1 || x.Aux != s { + _ = x1.Args[2] + p1 := x1.Args[0] + if p1.Op != OpARM64ADD { break } - mem := x.Args[2] - ptr1 := x.Args[0] - if w != x.Args[1] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { - break + _ = p1.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr1 := p1.Args[_i0] + idx1 := p1.Args[1^_i0] + x1_1 := x1.Args[1] + if x1_1.Op != OpARM64SRLconst || x1_1.AuxInt != 16 { + continue + } + x1_1_0 := x1_1.Args[0] + if x1_1_0.Op != OpARM64MOVDreg || w != x1_1_0.Args[0] { + continue + } + x2 := x1.Args[2] + if x2.Op != OpARM64MOVBstoreidx { + continue + } + mem := x2.Args[3] + ptr0 := x2.Args[0] + idx0 := x2.Args[1] + x2_2 := x2.Args[2] + if x2_2.Op != OpARM64SRLconst || x2_2.AuxInt != 24 { + continue + } + x2_2_0 := x2_2.Args[0] + if x2_2_0.Op != OpARM64MOVDreg || w != x2_2_0.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2)) { + continue + } + v.reset(OpARM64MOVWstoreidx) + v.AddArg(ptr0) + v.AddArg(idx0) + v0 := b.NewValue0(x1.Pos, OpARM64REVW, w.Type) + v0.AddArg(w) + v.AddArg(v0) + v.AddArg(mem) + return true } - v.reset(OpARM64MOVHstore) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(ptr0) - v.AddArg(w) - v.AddArg(mem) - return true + break } - // match: (MOVBstore [1] {s} (ADD ptr0 idx0) (UBFX [armBFAuxInt(8, 8)] w) x:(MOVBstoreidx ptr1 idx1 w mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVHstoreidx ptr1 idx1 w mem) + return false +} +func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { + b := v.Block + // match: (MOVBstore [i] {s} ptr w x0:(MOVBstore [i-1] {s} ptr (SRLconst [8] w) x1:(MOVBstore [i-2] {s} ptr (SRLconst [16] w) x2:(MOVBstore [i-3] {s} ptr (SRLconst [24] w) mem)))) + // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2) + // result: (MOVWstore [i-3] {s} ptr (REVW w) mem) for { - if v.AuxInt != 1 { - break - } + i := v.AuxInt s := v.Aux _ = v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { + ptr := v.Args[0] + w := v.Args[1] + x0 := v.Args[2] + if x0.Op != OpARM64MOVBstore || x0.AuxInt != i-1 || x0.Aux != s { break } - idx0 := v_0.Args[1] - ptr0 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64UBFX || v_1.AuxInt != armBFAuxInt(8, 8) { + _ = x0.Args[2] + if ptr != x0.Args[0] { break } - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVBstoreidx { + x0_1 := x0.Args[1] + if x0_1.Op != OpARM64SRLconst || x0_1.AuxInt != 8 || w != x0_1.Args[0] { break } - mem := x.Args[3] - ptr1 := x.Args[0] - idx1 := x.Args[1] - if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + x1 := x0.Args[2] + if x1.Op != OpARM64MOVBstore || x1.AuxInt != i-2 || x1.Aux != s { break } - v.reset(OpARM64MOVHstoreidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(w) + _ = x1.Args[2] + if ptr != x1.Args[0] { + break + } + x1_1 := x1.Args[1] + if x1_1.Op != OpARM64SRLconst || x1_1.AuxInt != 16 || w != x1_1.Args[0] { + break + } + x2 := x1.Args[2] + if x2.Op != OpARM64MOVBstore || x2.AuxInt != i-3 || x2.Aux != s { + break + } + mem := x2.Args[2] + if ptr != x2.Args[0] { + break + } + x2_1 := x2.Args[1] + if x2_1.Op != OpARM64SRLconst || x2_1.AuxInt != 24 || w != x2_1.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2)) { + break + } + v.reset(OpARM64MOVWstore) + v.AuxInt = i - 3 + v.Aux = s + v.AddArg(ptr) + v0 := b.NewValue0(x2.Pos, OpARM64REVW, w.Type) + v0.AddArg(w) + v.AddArg(v0) v.AddArg(mem) return true } - // match: (MOVBstore [1] {s} (ADD idx0 ptr0) (UBFX [armBFAuxInt(8, 8)] w) x:(MOVBstoreidx ptr1 idx1 w mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVHstoreidx ptr1 idx1 w mem) + // match: (MOVBstore [3] {s} p w x0:(MOVBstore [2] {s} p (SRLconst [8] w) x1:(MOVBstore [1] {s} p1:(ADD ptr1 idx1) (SRLconst [16] w) x2:(MOVBstoreidx ptr0 idx0 (SRLconst [24] w) mem)))) + // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) + // result: (MOVWstoreidx ptr0 idx0 (REVW w) mem) for { - if v.AuxInt != 1 { + if v.AuxInt != 3 { break } s := v.Aux _ = v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { + p := v.Args[0] + w := v.Args[1] + x0 := v.Args[2] + if x0.Op != OpARM64MOVBstore || x0.AuxInt != 2 || x0.Aux != s { break } - ptr0 := v_0.Args[1] - idx0 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64UBFX || v_1.AuxInt != armBFAuxInt(8, 8) { + _ = x0.Args[2] + if p != x0.Args[0] { break } - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVBstoreidx { + x0_1 := x0.Args[1] + if x0_1.Op != OpARM64SRLconst || x0_1.AuxInt != 8 || w != x0_1.Args[0] { break } - mem := x.Args[3] - ptr1 := x.Args[0] - idx1 := x.Args[1] - if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + x1 := x0.Args[2] + if x1.Op != OpARM64MOVBstore || x1.AuxInt != 1 || x1.Aux != s { break } - v.reset(OpARM64MOVHstoreidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(w) - v.AddArg(mem) - return true + _ = x1.Args[2] + p1 := x1.Args[0] + if p1.Op != OpARM64ADD { + break + } + _ = p1.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr1 := p1.Args[_i0] + idx1 := p1.Args[1^_i0] + x1_1 := x1.Args[1] + if x1_1.Op != OpARM64SRLconst || x1_1.AuxInt != 16 || w != x1_1.Args[0] { + continue + } + x2 := x1.Args[2] + if x2.Op != OpARM64MOVBstoreidx { + continue + } + mem := x2.Args[3] + ptr0 := x2.Args[0] + idx0 := x2.Args[1] + x2_2 := x2.Args[2] + if x2_2.Op != OpARM64SRLconst || x2_2.AuxInt != 24 || w != x2_2.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2)) { + continue + } + v.reset(OpARM64MOVWstoreidx) + v.AddArg(ptr0) + v.AddArg(idx0) + v0 := b.NewValue0(x1.Pos, OpARM64REVW, w.Type) + v0.AddArg(w) + v.AddArg(v0) + v.AddArg(mem) + return true + } + break } - // match: (MOVBstore [i] {s} ptr0 (UBFX [armBFAuxInt(8, 24)] w) x:(MOVBstore [i-1] {s} ptr1 w mem)) - // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) - // result: (MOVHstore [i-1] {s} ptr0 w mem) + // match: (MOVBstore [i] {s} ptr w x:(MOVBstore [i-1] {s} ptr (SRLconst [8] w) mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVHstore [i-1] {s} ptr (REV16W w) mem) for { i := v.AuxInt s := v.Aux _ = v.Args[2] - ptr0 := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64UBFX || v_1.AuxInt != armBFAuxInt(8, 24) { - break - } - w := v_1.Args[0] + ptr := v.Args[0] + w := v.Args[1] x := v.Args[2] if x.Op != OpARM64MOVBstore || x.AuxInt != i-1 || x.Aux != s { break } mem := x.Args[2] - ptr1 := x.Args[0] - if w != x.Args[1] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { + if ptr != x.Args[0] { + break + } + x_1 := x.Args[1] + if x_1.Op != OpARM64SRLconst || x_1.AuxInt != 8 || w != x_1.Args[0] || !(x.Uses == 1 && clobber(x)) { break } v.reset(OpARM64MOVHstore) v.AuxInt = i - 1 v.Aux = s - v.AddArg(ptr0) - v.AddArg(w) + v.AddArg(ptr) + v0 := b.NewValue0(x.Pos, OpARM64REV16W, w.Type) + v0.AddArg(w) + v.AddArg(v0) v.AddArg(mem) return true } - // match: (MOVBstore [1] {s} (ADD ptr0 idx0) (UBFX [armBFAuxInt(8, 24)] w) x:(MOVBstoreidx ptr1 idx1 w mem)) + // match: (MOVBstore [1] {s} (ADD ptr1 idx1) w x:(MOVBstoreidx ptr0 idx0 (SRLconst [8] w) mem)) // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVHstoreidx ptr1 idx1 w mem) + // result: (MOVHstoreidx ptr0 idx0 (REV16W w) mem) for { if v.AuxInt != 1 { break @@ -9158,33 +9055,67 @@ func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { if v_0.Op != OpARM64ADD { break } - idx0 := v_0.Args[1] - ptr0 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64UBFX || v_1.AuxInt != armBFAuxInt(8, 24) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr1 := v_0.Args[_i0] + idx1 := v_0.Args[1^_i0] + w := v.Args[1] + x := v.Args[2] + if x.Op != OpARM64MOVBstoreidx { + continue + } + mem := x.Args[3] + ptr0 := x.Args[0] + idx0 := x.Args[1] + x_2 := x.Args[2] + if x_2.Op != OpARM64SRLconst || x_2.AuxInt != 8 || w != x_2.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + continue + } + v.reset(OpARM64MOVHstoreidx) + v.AddArg(ptr0) + v.AddArg(idx0) + v0 := b.NewValue0(v.Pos, OpARM64REV16W, w.Type) + v0.AddArg(w) + v.AddArg(v0) + v.AddArg(mem) + return true } - w := v_1.Args[0] + break + } + // match: (MOVBstore [i] {s} ptr w x:(MOVBstore [i-1] {s} ptr (UBFX [armBFAuxInt(8, 8)] w) mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVHstore [i-1] {s} ptr (REV16W w) mem) + for { + i := v.AuxInt + s := v.Aux + _ = v.Args[2] + ptr := v.Args[0] + w := v.Args[1] x := v.Args[2] - if x.Op != OpARM64MOVBstoreidx { + if x.Op != OpARM64MOVBstore || x.AuxInt != i-1 || x.Aux != s { break } - mem := x.Args[3] - ptr1 := x.Args[0] - idx1 := x.Args[1] - if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + mem := x.Args[2] + if ptr != x.Args[0] { break } - v.reset(OpARM64MOVHstoreidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(w) + x_1 := x.Args[1] + if x_1.Op != OpARM64UBFX || x_1.AuxInt != armBFAuxInt(8, 8) || w != x_1.Args[0] || !(x.Uses == 1 && clobber(x)) { + break + } + v.reset(OpARM64MOVHstore) + v.AuxInt = i - 1 + v.Aux = s + v.AddArg(ptr) + v0 := b.NewValue0(x.Pos, OpARM64REV16W, w.Type) + v0.AddArg(w) + v.AddArg(v0) v.AddArg(mem) return true } - // match: (MOVBstore [1] {s} (ADD idx0 ptr0) (UBFX [armBFAuxInt(8, 24)] w) x:(MOVBstoreidx ptr1 idx1 w mem)) + // match: (MOVBstore [1] {s} (ADD ptr1 idx1) w x:(MOVBstoreidx ptr0 idx0 (UBFX [armBFAuxInt(8, 8)] w) mem)) // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVHstoreidx ptr1 idx1 w mem) + // result: (MOVHstoreidx ptr0 idx0 (REV16W w) mem) for { if v.AuxInt != 1 { break @@ -9195,70 +9126,71 @@ func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { if v_0.Op != OpARM64ADD { break } - ptr0 := v_0.Args[1] - idx0 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64UBFX || v_1.AuxInt != armBFAuxInt(8, 24) { - break - } - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVBstoreidx { - break - } - mem := x.Args[3] - ptr1 := x.Args[0] - idx1 := x.Args[1] - if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr1 := v_0.Args[_i0] + idx1 := v_0.Args[1^_i0] + w := v.Args[1] + x := v.Args[2] + if x.Op != OpARM64MOVBstoreidx { + continue + } + mem := x.Args[3] + ptr0 := x.Args[0] + idx0 := x.Args[1] + x_2 := x.Args[2] + if x_2.Op != OpARM64UBFX || x_2.AuxInt != armBFAuxInt(8, 8) || w != x_2.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + continue + } + v.reset(OpARM64MOVHstoreidx) + v.AddArg(ptr0) + v.AddArg(idx0) + v0 := b.NewValue0(v.Pos, OpARM64REV16W, w.Type) + v0.AddArg(w) + v.AddArg(v0) + v.AddArg(mem) + return true } - v.reset(OpARM64MOVHstoreidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(w) - v.AddArg(mem) - return true + break } - // match: (MOVBstore [i] {s} ptr0 (SRLconst [8] (MOVDreg w)) x:(MOVBstore [i-1] {s} ptr1 w mem)) - // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) - // result: (MOVHstore [i-1] {s} ptr0 w mem) + // match: (MOVBstore [i] {s} ptr w x:(MOVBstore [i-1] {s} ptr (SRLconst [8] (MOVDreg w)) mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVHstore [i-1] {s} ptr (REV16W w) mem) for { i := v.AuxInt s := v.Aux _ = v.Args[2] - ptr0 := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 8 { + ptr := v.Args[0] + w := v.Args[1] + x := v.Args[2] + if x.Op != OpARM64MOVBstore || x.AuxInt != i-1 || x.Aux != s { break } - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpARM64MOVDreg { + mem := x.Args[2] + if ptr != x.Args[0] { break } - w := v_1_0.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVBstore || x.AuxInt != i-1 || x.Aux != s { + x_1 := x.Args[1] + if x_1.Op != OpARM64SRLconst || x_1.AuxInt != 8 { break } - mem := x.Args[2] - ptr1 := x.Args[0] - if w != x.Args[1] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { + x_1_0 := x_1.Args[0] + if x_1_0.Op != OpARM64MOVDreg || w != x_1_0.Args[0] || !(x.Uses == 1 && clobber(x)) { break } v.reset(OpARM64MOVHstore) v.AuxInt = i - 1 v.Aux = s - v.AddArg(ptr0) - v.AddArg(w) + v.AddArg(ptr) + v0 := b.NewValue0(x.Pos, OpARM64REV16W, w.Type) + v0.AddArg(w) + v.AddArg(v0) v.AddArg(mem) return true } - return false -} -func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { - // match: (MOVBstore [1] {s} (ADD ptr0 idx0) (SRLconst [8] (MOVDreg w)) x:(MOVBstoreidx ptr1 idx1 w mem)) + // match: (MOVBstore [1] {s} (ADD ptr1 idx1) w x:(MOVBstoreidx ptr0 idx0 (SRLconst [8] (MOVDreg w)) mem)) // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVHstoreidx ptr1 idx1 w mem) + // result: (MOVHstoreidx ptr0 idx0 (REV16W w) mem) for { if v.AuxInt != 1 { break @@ -9269,37 +9201,71 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if v_0.Op != OpARM64ADD { break } - idx0 := v_0.Args[1] - ptr0 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 8 { - break - } - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpARM64MOVDreg { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr1 := v_0.Args[_i0] + idx1 := v_0.Args[1^_i0] + w := v.Args[1] + x := v.Args[2] + if x.Op != OpARM64MOVBstoreidx { + continue + } + mem := x.Args[3] + ptr0 := x.Args[0] + idx0 := x.Args[1] + x_2 := x.Args[2] + if x_2.Op != OpARM64SRLconst || x_2.AuxInt != 8 { + continue + } + x_2_0 := x_2.Args[0] + if x_2_0.Op != OpARM64MOVDreg || w != x_2_0.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + continue + } + v.reset(OpARM64MOVHstoreidx) + v.AddArg(ptr0) + v.AddArg(idx0) + v0 := b.NewValue0(v.Pos, OpARM64REV16W, w.Type) + v0.AddArg(w) + v.AddArg(v0) + v.AddArg(mem) + return true } - w := v_1_0.Args[0] + break + } + // match: (MOVBstore [i] {s} ptr w x:(MOVBstore [i-1] {s} ptr (UBFX [armBFAuxInt(8, 24)] w) mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVHstore [i-1] {s} ptr (REV16W w) mem) + for { + i := v.AuxInt + s := v.Aux + _ = v.Args[2] + ptr := v.Args[0] + w := v.Args[1] x := v.Args[2] - if x.Op != OpARM64MOVBstoreidx { + if x.Op != OpARM64MOVBstore || x.AuxInt != i-1 || x.Aux != s { break } - mem := x.Args[3] - ptr1 := x.Args[0] - idx1 := x.Args[1] - if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + mem := x.Args[2] + if ptr != x.Args[0] { break } - v.reset(OpARM64MOVHstoreidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(w) + x_1 := x.Args[1] + if x_1.Op != OpARM64UBFX || x_1.AuxInt != armBFAuxInt(8, 24) || w != x_1.Args[0] || !(x.Uses == 1 && clobber(x)) { + break + } + v.reset(OpARM64MOVHstore) + v.AuxInt = i - 1 + v.Aux = s + v.AddArg(ptr) + v0 := b.NewValue0(x.Pos, OpARM64REV16W, w.Type) + v0.AddArg(w) + v.AddArg(v0) v.AddArg(mem) return true } - // match: (MOVBstore [1] {s} (ADD idx0 ptr0) (SRLconst [8] (MOVDreg w)) x:(MOVBstoreidx ptr1 idx1 w mem)) + // match: (MOVBstore [1] {s} (ADD ptr1 idx1) w x:(MOVBstoreidx ptr0 idx0 (UBFX [armBFAuxInt(8, 24)] w) mem)) // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVHstoreidx ptr1 idx1 w mem) + // result: (MOVHstoreidx ptr0 idx0 (REV16W w) mem) for { if v.AuxInt != 1 { break @@ -9310,2901 +9276,3703 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if v_0.Op != OpARM64ADD { break } - ptr0 := v_0.Args[1] - idx0 := v_0.Args[0] + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr1 := v_0.Args[_i0] + idx1 := v_0.Args[1^_i0] + w := v.Args[1] + x := v.Args[2] + if x.Op != OpARM64MOVBstoreidx { + continue + } + mem := x.Args[3] + ptr0 := x.Args[0] + idx0 := x.Args[1] + x_2 := x.Args[2] + if x_2.Op != OpARM64UBFX || x_2.AuxInt != armBFAuxInt(8, 24) || w != x_2.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + continue + } + v.reset(OpARM64MOVHstoreidx) + v.AddArg(ptr0) + v.AddArg(idx0) + v0 := b.NewValue0(v.Pos, OpARM64REV16W, w.Type) + v0.AddArg(w) + v.AddArg(v0) + v.AddArg(mem) + return true + } + break + } + return false +} +func rewriteValueARM64_OpARM64MOVBstoreidx_0(v *Value) bool { + // match: (MOVBstoreidx ptr (MOVDconst [c]) val mem) + // result: (MOVBstore [c] ptr val mem) + for { + mem := v.Args[3] + ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 8 { + if v_1.Op != OpARM64MOVDconst { break } - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpARM64MOVDreg { + c := v_1.AuxInt + val := v.Args[2] + v.reset(OpARM64MOVBstore) + v.AuxInt = c + v.AddArg(ptr) + v.AddArg(val) + v.AddArg(mem) + return true + } + // match: (MOVBstoreidx (MOVDconst [c]) idx val mem) + // result: (MOVBstore [c] idx val mem) + for { + mem := v.Args[3] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - w := v_1_0.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVBstoreidx { + c := v_0.AuxInt + idx := v.Args[1] + val := v.Args[2] + v.reset(OpARM64MOVBstore) + v.AuxInt = c + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true + } + // match: (MOVBstoreidx ptr idx (MOVDconst [0]) mem) + // result: (MOVBstorezeroidx ptr idx mem) + for { + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 0 { break } - mem := x.Args[3] - ptr1 := x.Args[0] - idx1 := x.Args[1] - if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + v.reset(OpARM64MOVBstorezeroidx) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + // match: (MOVBstoreidx ptr idx (MOVBreg x) mem) + // result: (MOVBstoreidx ptr idx x mem) + for { + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVBreg { break } - v.reset(OpARM64MOVHstoreidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(w) + x := v_2.Args[0] + v.reset(OpARM64MOVBstoreidx) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(x) v.AddArg(mem) return true } - // match: (MOVBstore [i] {s} ptr0 (SRLconst [j] w) x:(MOVBstore [i-1] {s} ptr1 w0:(SRLconst [j-8] w) mem)) - // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) - // result: (MOVHstore [i-1] {s} ptr0 w0 mem) + // match: (MOVBstoreidx ptr idx (MOVBUreg x) mem) + // result: (MOVBstoreidx ptr idx x mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - ptr0 := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst { + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVBUreg { break } - j := v_1.AuxInt - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVBstore || x.AuxInt != i-1 || x.Aux != s { + x := v_2.Args[0] + v.reset(OpARM64MOVBstoreidx) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(x) + v.AddArg(mem) + return true + } + // match: (MOVBstoreidx ptr idx (MOVHreg x) mem) + // result: (MOVBstoreidx ptr idx x mem) + for { + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVHreg { break } - mem := x.Args[2] - ptr1 := x.Args[0] - w0 := x.Args[1] - if w0.Op != OpARM64SRLconst || w0.AuxInt != j-8 || w != w0.Args[0] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { + x := v_2.Args[0] + v.reset(OpARM64MOVBstoreidx) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(x) + v.AddArg(mem) + return true + } + // match: (MOVBstoreidx ptr idx (MOVHUreg x) mem) + // result: (MOVBstoreidx ptr idx x mem) + for { + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVHUreg { break } - v.reset(OpARM64MOVHstore) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(ptr0) - v.AddArg(w0) + x := v_2.Args[0] + v.reset(OpARM64MOVBstoreidx) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(x) v.AddArg(mem) return true } - // match: (MOVBstore [1] {s} (ADD ptr0 idx0) (SRLconst [j] w) x:(MOVBstoreidx ptr1 idx1 w0:(SRLconst [j-8] w) mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVHstoreidx ptr1 idx1 w0 mem) + // match: (MOVBstoreidx ptr idx (MOVWreg x) mem) + // result: (MOVBstoreidx ptr idx x mem) for { - if v.AuxInt != 1 { + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVWreg { break } - s := v.Aux - _ = v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { + x := v_2.Args[0] + v.reset(OpARM64MOVBstoreidx) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(x) + v.AddArg(mem) + return true + } + // match: (MOVBstoreidx ptr idx (MOVWUreg x) mem) + // result: (MOVBstoreidx ptr idx x mem) + for { + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVWUreg { break } - idx0 := v_0.Args[1] - ptr0 := v_0.Args[0] + x := v_2.Args[0] + v.reset(OpARM64MOVBstoreidx) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(x) + v.AddArg(mem) + return true + } + // match: (MOVBstoreidx ptr (ADDconst [1] idx) (SRLconst [8] w) x:(MOVBstoreidx ptr idx w mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVHstoreidx ptr idx w mem) + for { + _ = v.Args[3] + ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst { + if v_1.Op != OpARM64ADDconst || v_1.AuxInt != 1 { break } - j := v_1.AuxInt - w := v_1.Args[0] - x := v.Args[2] + idx := v_1.Args[0] + v_2 := v.Args[2] + if v_2.Op != OpARM64SRLconst || v_2.AuxInt != 8 { + break + } + w := v_2.Args[0] + x := v.Args[3] if x.Op != OpARM64MOVBstoreidx { break } mem := x.Args[3] - ptr1 := x.Args[0] - idx1 := x.Args[1] - w0 := x.Args[2] - if w0.Op != OpARM64SRLconst || w0.AuxInt != j-8 || w != w0.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + if ptr != x.Args[0] || idx != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { break } v.reset(OpARM64MOVHstoreidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(w0) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(w) v.AddArg(mem) return true } - // match: (MOVBstore [1] {s} (ADD idx0 ptr0) (SRLconst [j] w) x:(MOVBstoreidx ptr1 idx1 w0:(SRLconst [j-8] w) mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVHstoreidx ptr1 idx1 w0 mem) + return false +} +func rewriteValueARM64_OpARM64MOVBstoreidx_10(v *Value) bool { + b := v.Block + // match: (MOVBstoreidx ptr (ADDconst [3] idx) w x0:(MOVBstoreidx ptr (ADDconst [2] idx) (UBFX [armBFAuxInt(8, 24)] w) x1:(MOVBstoreidx ptr (ADDconst [1] idx) (UBFX [armBFAuxInt(16, 16)] w) x2:(MOVBstoreidx ptr idx (UBFX [armBFAuxInt(24, 8)] w) mem)))) + // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2) + // result: (MOVWstoreidx ptr idx (REVW w) mem) for { - if v.AuxInt != 1 { - break - } - s := v.Aux - _ = v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { - break - } - ptr0 := v_0.Args[1] - idx0 := v_0.Args[0] + _ = v.Args[3] + ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst { - break - } - j := v_1.AuxInt - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVBstoreidx { + if v_1.Op != OpARM64ADDconst || v_1.AuxInt != 3 { break } - mem := x.Args[3] - ptr1 := x.Args[0] - idx1 := x.Args[1] - w0 := x.Args[2] - if w0.Op != OpARM64SRLconst || w0.AuxInt != j-8 || w != w0.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + idx := v_1.Args[0] + w := v.Args[2] + x0 := v.Args[3] + if x0.Op != OpARM64MOVBstoreidx { break } - v.reset(OpARM64MOVHstoreidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(w0) - v.AddArg(mem) - return true - } - // match: (MOVBstore [i] {s} ptr0 (UBFX [bfc] w) x:(MOVBstore [i-1] {s} ptr1 w0:(UBFX [bfc2] w) mem)) - // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && getARM64BFwidth(bfc) == 32 - getARM64BFlsb(bfc) && getARM64BFwidth(bfc2) == 32 - getARM64BFlsb(bfc2) && getARM64BFlsb(bfc2) == getARM64BFlsb(bfc) - 8 && clobber(x) - // result: (MOVHstore [i-1] {s} ptr0 w0 mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - ptr0 := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64UBFX { + _ = x0.Args[3] + if ptr != x0.Args[0] { break } - bfc := v_1.AuxInt - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVBstore || x.AuxInt != i-1 || x.Aux != s { + x0_1 := x0.Args[1] + if x0_1.Op != OpARM64ADDconst || x0_1.AuxInt != 2 || idx != x0_1.Args[0] { break } - mem := x.Args[2] - ptr1 := x.Args[0] - w0 := x.Args[1] - if w0.Op != OpARM64UBFX { + x0_2 := x0.Args[2] + if x0_2.Op != OpARM64UBFX || x0_2.AuxInt != armBFAuxInt(8, 24) || w != x0_2.Args[0] { break } - bfc2 := w0.AuxInt - if w != w0.Args[0] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && getARM64BFwidth(bfc) == 32-getARM64BFlsb(bfc) && getARM64BFwidth(bfc2) == 32-getARM64BFlsb(bfc2) && getARM64BFlsb(bfc2) == getARM64BFlsb(bfc)-8 && clobber(x)) { + x1 := x0.Args[3] + if x1.Op != OpARM64MOVBstoreidx { break } - v.reset(OpARM64MOVHstore) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(ptr0) - v.AddArg(w0) - v.AddArg(mem) - return true - } - // match: (MOVBstore [1] {s} (ADD ptr0 idx0) (UBFX [bfc] w) x:(MOVBstoreidx ptr1 idx1 w0:(UBFX [bfc2] w) mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && getARM64BFwidth(bfc) == 32 - getARM64BFlsb(bfc) && getARM64BFwidth(bfc2) == 32 - getARM64BFlsb(bfc2) && getARM64BFlsb(bfc2) == getARM64BFlsb(bfc) - 8 && clobber(x) - // result: (MOVHstoreidx ptr1 idx1 w0 mem) - for { - if v.AuxInt != 1 { + _ = x1.Args[3] + if ptr != x1.Args[0] { break } - s := v.Aux - _ = v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { + x1_1 := x1.Args[1] + if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 1 || idx != x1_1.Args[0] { break } - idx0 := v_0.Args[1] - ptr0 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64UBFX { + x1_2 := x1.Args[2] + if x1_2.Op != OpARM64UBFX || x1_2.AuxInt != armBFAuxInt(16, 16) || w != x1_2.Args[0] { break } - bfc := v_1.AuxInt - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVBstoreidx { + x2 := x1.Args[3] + if x2.Op != OpARM64MOVBstoreidx { break } - mem := x.Args[3] - ptr1 := x.Args[0] - idx1 := x.Args[1] - w0 := x.Args[2] - if w0.Op != OpARM64UBFX { + mem := x2.Args[3] + if ptr != x2.Args[0] || idx != x2.Args[1] { break } - bfc2 := w0.AuxInt - if w != w0.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && getARM64BFwidth(bfc) == 32-getARM64BFlsb(bfc) && getARM64BFwidth(bfc2) == 32-getARM64BFlsb(bfc2) && getARM64BFlsb(bfc2) == getARM64BFlsb(bfc)-8 && clobber(x)) { + x2_2 := x2.Args[2] + if x2_2.Op != OpARM64UBFX || x2_2.AuxInt != armBFAuxInt(24, 8) || w != x2_2.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2)) { break } - v.reset(OpARM64MOVHstoreidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(w0) + v.reset(OpARM64MOVWstoreidx) + v.AddArg(ptr) + v.AddArg(idx) + v0 := b.NewValue0(v.Pos, OpARM64REVW, w.Type) + v0.AddArg(w) + v.AddArg(v0) v.AddArg(mem) return true } - // match: (MOVBstore [1] {s} (ADD idx0 ptr0) (UBFX [bfc] w) x:(MOVBstoreidx ptr1 idx1 w0:(UBFX [bfc2] w) mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && getARM64BFwidth(bfc) == 32 - getARM64BFlsb(bfc) && getARM64BFwidth(bfc2) == 32 - getARM64BFlsb(bfc2) && getARM64BFlsb(bfc2) == getARM64BFlsb(bfc) - 8 && clobber(x) - // result: (MOVHstoreidx ptr1 idx1 w0 mem) + // match: (MOVBstoreidx ptr idx w x0:(MOVBstoreidx ptr (ADDconst [1] idx) (UBFX [armBFAuxInt(8, 24)] w) x1:(MOVBstoreidx ptr (ADDconst [2] idx) (UBFX [armBFAuxInt(16, 16)] w) x2:(MOVBstoreidx ptr (ADDconst [3] idx) (UBFX [armBFAuxInt(24, 8)] w) mem)))) + // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2) + // result: (MOVWstoreidx ptr idx w mem) for { - if v.AuxInt != 1 { + _ = v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + w := v.Args[2] + x0 := v.Args[3] + if x0.Op != OpARM64MOVBstoreidx { break } - s := v.Aux - _ = v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { + _ = x0.Args[3] + if ptr != x0.Args[0] { break } - ptr0 := v_0.Args[1] - idx0 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64UBFX { + x0_1 := x0.Args[1] + if x0_1.Op != OpARM64ADDconst || x0_1.AuxInt != 1 || idx != x0_1.Args[0] { break } - bfc := v_1.AuxInt - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVBstoreidx { + x0_2 := x0.Args[2] + if x0_2.Op != OpARM64UBFX || x0_2.AuxInt != armBFAuxInt(8, 24) || w != x0_2.Args[0] { break } - mem := x.Args[3] - ptr1 := x.Args[0] - idx1 := x.Args[1] - w0 := x.Args[2] - if w0.Op != OpARM64UBFX { + x1 := x0.Args[3] + if x1.Op != OpARM64MOVBstoreidx { break } - bfc2 := w0.AuxInt - if w != w0.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && getARM64BFwidth(bfc) == 32-getARM64BFlsb(bfc) && getARM64BFwidth(bfc2) == 32-getARM64BFlsb(bfc2) && getARM64BFlsb(bfc2) == getARM64BFlsb(bfc)-8 && clobber(x)) { + _ = x1.Args[3] + if ptr != x1.Args[0] { break } - v.reset(OpARM64MOVHstoreidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(w0) - v.AddArg(mem) - return true - } - // match: (MOVBstore [i] {s} ptr0 (SRLconst [j] (MOVDreg w)) x:(MOVBstore [i-1] {s} ptr1 w0:(SRLconst [j-8] (MOVDreg w)) mem)) - // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) - // result: (MOVHstore [i-1] {s} ptr0 w0 mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - ptr0 := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst { + x1_1 := x1.Args[1] + if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 2 || idx != x1_1.Args[0] { break } - j := v_1.AuxInt - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpARM64MOVDreg { + x1_2 := x1.Args[2] + if x1_2.Op != OpARM64UBFX || x1_2.AuxInt != armBFAuxInt(16, 16) || w != x1_2.Args[0] { break } - w := v_1_0.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVBstore || x.AuxInt != i-1 || x.Aux != s { + x2 := x1.Args[3] + if x2.Op != OpARM64MOVBstoreidx { break } - mem := x.Args[2] - ptr1 := x.Args[0] - w0 := x.Args[1] - if w0.Op != OpARM64SRLconst || w0.AuxInt != j-8 { + mem := x2.Args[3] + if ptr != x2.Args[0] { break } - w0_0 := w0.Args[0] - if w0_0.Op != OpARM64MOVDreg || w != w0_0.Args[0] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { + x2_1 := x2.Args[1] + if x2_1.Op != OpARM64ADDconst || x2_1.AuxInt != 3 || idx != x2_1.Args[0] { break } - v.reset(OpARM64MOVHstore) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(ptr0) - v.AddArg(w0) + x2_2 := x2.Args[2] + if x2_2.Op != OpARM64UBFX || x2_2.AuxInt != armBFAuxInt(24, 8) || w != x2_2.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2)) { + break + } + v.reset(OpARM64MOVWstoreidx) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(w) v.AddArg(mem) return true } - // match: (MOVBstore [1] {s} (ADD ptr0 idx0) (SRLconst [j] (MOVDreg w)) x:(MOVBstoreidx ptr1 idx1 w0:(SRLconst [j-8] (MOVDreg w)) mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVHstoreidx ptr1 idx1 w0 mem) + // match: (MOVBstoreidx ptr (ADDconst [1] idx) w x:(MOVBstoreidx ptr idx (UBFX [armBFAuxInt(8, 8)] w) mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVHstoreidx ptr idx (REV16W w) mem) for { - if v.AuxInt != 1 { - break - } - s := v.Aux - _ = v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { - break - } - idx0 := v_0.Args[1] - ptr0 := v_0.Args[0] + _ = v.Args[3] + ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst { - break - } - j := v_1.AuxInt - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpARM64MOVDreg { + if v_1.Op != OpARM64ADDconst || v_1.AuxInt != 1 { break } - w := v_1_0.Args[0] - x := v.Args[2] + idx := v_1.Args[0] + w := v.Args[2] + x := v.Args[3] if x.Op != OpARM64MOVBstoreidx { break } mem := x.Args[3] - ptr1 := x.Args[0] - idx1 := x.Args[1] - w0 := x.Args[2] - if w0.Op != OpARM64SRLconst || w0.AuxInt != j-8 { + if ptr != x.Args[0] || idx != x.Args[1] { break } - w0_0 := w0.Args[0] - if w0_0.Op != OpARM64MOVDreg || w != w0_0.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + x_2 := x.Args[2] + if x_2.Op != OpARM64UBFX || x_2.AuxInt != armBFAuxInt(8, 8) || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { break } v.reset(OpARM64MOVHstoreidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(w0) + v.AddArg(ptr) + v.AddArg(idx) + v0 := b.NewValue0(v.Pos, OpARM64REV16W, w.Type) + v0.AddArg(w) + v.AddArg(v0) v.AddArg(mem) return true } - return false -} -func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { - b := v.Block - // match: (MOVBstore [1] {s} (ADD idx0 ptr0) (SRLconst [j] (MOVDreg w)) x:(MOVBstoreidx ptr1 idx1 w0:(SRLconst [j-8] (MOVDreg w)) mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVHstoreidx ptr1 idx1 w0 mem) + // match: (MOVBstoreidx ptr idx w x:(MOVBstoreidx ptr (ADDconst [1] idx) (UBFX [armBFAuxInt(8, 8)] w) mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVHstoreidx ptr idx w mem) for { - if v.AuxInt != 1 { - break - } - s := v.Aux - _ = v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { - break - } - ptr0 := v_0.Args[1] - idx0 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst { - break - } - j := v_1.AuxInt - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpARM64MOVDreg { - break - } - w := v_1_0.Args[0] - x := v.Args[2] + _ = v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + w := v.Args[2] + x := v.Args[3] if x.Op != OpARM64MOVBstoreidx { break } mem := x.Args[3] - ptr1 := x.Args[0] - idx1 := x.Args[1] - w0 := x.Args[2] - if w0.Op != OpARM64SRLconst || w0.AuxInt != j-8 { + if ptr != x.Args[0] { break } - w0_0 := w0.Args[0] - if w0_0.Op != OpARM64MOVDreg || w != w0_0.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + x_1 := x.Args[1] + if x_1.Op != OpARM64ADDconst || x_1.AuxInt != 1 || idx != x_1.Args[0] { + break + } + x_2 := x.Args[2] + if x_2.Op != OpARM64UBFX || x_2.AuxInt != armBFAuxInt(8, 8) || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { break } v.reset(OpARM64MOVHstoreidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(w0) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(w) v.AddArg(mem) return true } - // match: (MOVBstore [i] {s} ptr w x0:(MOVBstore [i-1] {s} ptr (SRLconst [8] w) x1:(MOVBstore [i-2] {s} ptr (SRLconst [16] w) x2:(MOVBstore [i-3] {s} ptr (SRLconst [24] w) x3:(MOVBstore [i-4] {s} ptr (SRLconst [32] w) x4:(MOVBstore [i-5] {s} ptr (SRLconst [40] w) x5:(MOVBstore [i-6] {s} ptr (SRLconst [48] w) x6:(MOVBstore [i-7] {s} ptr (SRLconst [56] w) mem)))))))) - // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) - // result: (MOVDstore [i-7] {s} ptr (REV w) mem) + return false +} +func rewriteValueARM64_OpARM64MOVBstorezero_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (MOVBstorezero [off1] {sym} (ADDconst [off2] ptr) mem) + // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVBstorezero [off1+off2] {sym} ptr mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - ptr := v.Args[0] - w := v.Args[1] - x0 := v.Args[2] - if x0.Op != OpARM64MOVBstore || x0.AuxInt != i-1 || x0.Aux != s { - break - } - _ = x0.Args[2] - if ptr != x0.Args[0] { - break - } - x0_1 := x0.Args[1] - if x0_1.Op != OpARM64SRLconst || x0_1.AuxInt != 8 || w != x0_1.Args[0] { - break - } - x1 := x0.Args[2] - if x1.Op != OpARM64MOVBstore || x1.AuxInt != i-2 || x1.Aux != s { - break - } - _ = x1.Args[2] - if ptr != x1.Args[0] { - break - } - x1_1 := x1.Args[1] - if x1_1.Op != OpARM64SRLconst || x1_1.AuxInt != 16 || w != x1_1.Args[0] { - break - } - x2 := x1.Args[2] - if x2.Op != OpARM64MOVBstore || x2.AuxInt != i-3 || x2.Aux != s { - break - } - _ = x2.Args[2] - if ptr != x2.Args[0] { - break - } - x2_1 := x2.Args[1] - if x2_1.Op != OpARM64SRLconst || x2_1.AuxInt != 24 || w != x2_1.Args[0] { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADDconst { break } - x3 := x2.Args[2] - if x3.Op != OpARM64MOVBstore || x3.AuxInt != i-4 || x3.Aux != s { + off2 := v_0.AuxInt + ptr := v_0.Args[0] + if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - _ = x3.Args[2] - if ptr != x3.Args[0] { + v.reset(OpARM64MOVBstorezero) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(ptr) + v.AddArg(mem) + return true + } + // match: (MOVBstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVBstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) + for { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDaddr { break } - x3_1 := x3.Args[1] - if x3_1.Op != OpARM64SRLconst || x3_1.AuxInt != 32 || w != x3_1.Args[0] { + off2 := v_0.AuxInt + sym2 := v_0.Aux + ptr := v_0.Args[0] + if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - x4 := x3.Args[2] - if x4.Op != OpARM64MOVBstore || x4.AuxInt != i-5 || x4.Aux != s { + v.reset(OpARM64MOVBstorezero) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(ptr) + v.AddArg(mem) + return true + } + // match: (MOVBstorezero [off] {sym} (ADD ptr idx) mem) + // cond: off == 0 && sym == nil + // result: (MOVBstorezeroidx ptr idx mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADD { break } - _ = x4.Args[2] - if ptr != x4.Args[0] { + idx := v_0.Args[1] + ptr := v_0.Args[0] + if !(off == 0 && sym == nil) { break } - x4_1 := x4.Args[1] - if x4_1.Op != OpARM64SRLconst || x4_1.AuxInt != 40 || w != x4_1.Args[0] { + v.reset(OpARM64MOVBstorezeroidx) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + // match: (MOVBstorezero [i] {s} ptr0 x:(MOVBstorezero [j] {s} ptr1 mem)) + // cond: x.Uses == 1 && areAdjacentOffsets(i,j,1) && is32Bit(min(i,j)) && isSamePtr(ptr0, ptr1) && clobber(x) + // result: (MOVHstorezero [min(i,j)] {s} ptr0 mem) + for { + i := v.AuxInt + s := v.Aux + _ = v.Args[1] + ptr0 := v.Args[0] + x := v.Args[1] + if x.Op != OpARM64MOVBstorezero { break } - x5 := x4.Args[2] - if x5.Op != OpARM64MOVBstore || x5.AuxInt != i-6 || x5.Aux != s { + j := x.AuxInt + if x.Aux != s { break } - _ = x5.Args[2] - if ptr != x5.Args[0] { + mem := x.Args[1] + ptr1 := x.Args[0] + if !(x.Uses == 1 && areAdjacentOffsets(i, j, 1) && is32Bit(min(i, j)) && isSamePtr(ptr0, ptr1) && clobber(x)) { break } - x5_1 := x5.Args[1] - if x5_1.Op != OpARM64SRLconst || x5_1.AuxInt != 48 || w != x5_1.Args[0] { + v.reset(OpARM64MOVHstorezero) + v.AuxInt = min(i, j) + v.Aux = s + v.AddArg(ptr0) + v.AddArg(mem) + return true + } + // match: (MOVBstorezero [1] {s} (ADD ptr0 idx0) x:(MOVBstorezeroidx ptr1 idx1 mem)) + // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) + // result: (MOVHstorezeroidx ptr1 idx1 mem) + for { + if v.AuxInt != 1 { break } - x6 := x5.Args[2] - if x6.Op != OpARM64MOVBstore || x6.AuxInt != i-7 || x6.Aux != s { + s := v.Aux + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADD { break } - mem := x6.Args[2] - if ptr != x6.Args[0] { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr0 := v_0.Args[_i0] + idx0 := v_0.Args[1^_i0] + x := v.Args[1] + if x.Op != OpARM64MOVBstorezeroidx { + continue + } + mem := x.Args[2] + ptr1 := x.Args[0] + idx1 := x.Args[1] + if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + continue + } + v.reset(OpARM64MOVHstorezeroidx) + v.AddArg(ptr1) + v.AddArg(idx1) + v.AddArg(mem) + return true } - x6_1 := x6.Args[1] - if x6_1.Op != OpARM64SRLconst || x6_1.AuxInt != 56 || w != x6_1.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6)) { + break + } + return false +} +func rewriteValueARM64_OpARM64MOVBstorezeroidx_0(v *Value) bool { + // match: (MOVBstorezeroidx ptr (MOVDconst [c]) mem) + // result: (MOVBstorezero [c] ptr mem) + for { + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVDstore) - v.AuxInt = i - 7 - v.Aux = s + c := v_1.AuxInt + v.reset(OpARM64MOVBstorezero) + v.AuxInt = c v.AddArg(ptr) - v0 := b.NewValue0(x6.Pos, OpARM64REV, w.Type) - v0.AddArg(w) - v.AddArg(v0) v.AddArg(mem) return true } - // match: (MOVBstore [7] {s} p w x0:(MOVBstore [6] {s} p (SRLconst [8] w) x1:(MOVBstore [5] {s} p (SRLconst [16] w) x2:(MOVBstore [4] {s} p (SRLconst [24] w) x3:(MOVBstore [3] {s} p (SRLconst [32] w) x4:(MOVBstore [2] {s} p (SRLconst [40] w) x5:(MOVBstore [1] {s} p1:(ADD ptr1 idx1) (SRLconst [48] w) x6:(MOVBstoreidx ptr0 idx0 (SRLconst [56] w) mem)))))))) - // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) - // result: (MOVDstoreidx ptr0 idx0 (REV w) mem) + // match: (MOVBstorezeroidx (MOVDconst [c]) idx mem) + // result: (MOVBstorezero [c] idx mem) for { - if v.AuxInt != 7 { + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - s := v.Aux + c := v_0.AuxInt + idx := v.Args[1] + v.reset(OpARM64MOVBstorezero) + v.AuxInt = c + v.AddArg(idx) + v.AddArg(mem) + return true + } + // match: (MOVBstorezeroidx ptr (ADDconst [1] idx) x:(MOVBstorezeroidx ptr idx mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVHstorezeroidx ptr idx mem) + for { _ = v.Args[2] - p := v.Args[0] - w := v.Args[1] - x0 := v.Args[2] - if x0.Op != OpARM64MOVBstore || x0.AuxInt != 6 || x0.Aux != s { + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64ADDconst || v_1.AuxInt != 1 { break } - _ = x0.Args[2] - if p != x0.Args[0] { + idx := v_1.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVBstorezeroidx { break } - x0_1 := x0.Args[1] - if x0_1.Op != OpARM64SRLconst || x0_1.AuxInt != 8 || w != x0_1.Args[0] { - break - } - x1 := x0.Args[2] - if x1.Op != OpARM64MOVBstore || x1.AuxInt != 5 || x1.Aux != s { + mem := x.Args[2] + if ptr != x.Args[0] || idx != x.Args[1] || !(x.Uses == 1 && clobber(x)) { break } - _ = x1.Args[2] - if p != x1.Args[0] { + v.reset(OpARM64MOVHstorezeroidx) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + return false +} +func rewriteValueARM64_OpARM64MOVDload_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (MOVDload [off] {sym} ptr (FMOVDstore [off] {sym} ptr val _)) + // result: (FMOVDfpgp val) + for { + off := v.AuxInt + sym := v.Aux + _ = v.Args[1] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64FMOVDstore || v_1.AuxInt != off || v_1.Aux != sym { break } - x1_1 := x1.Args[1] - if x1_1.Op != OpARM64SRLconst || x1_1.AuxInt != 16 || w != x1_1.Args[0] { + _ = v_1.Args[2] + if ptr != v_1.Args[0] { break } - x2 := x1.Args[2] - if x2.Op != OpARM64MOVBstore || x2.AuxInt != 4 || x2.Aux != s { + val := v_1.Args[1] + v.reset(OpARM64FMOVDfpgp) + v.AddArg(val) + return true + } + // match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) + // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVDload [off1+off2] {sym} ptr mem) + for { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADDconst { break } - _ = x2.Args[2] - if p != x2.Args[0] { + off2 := v_0.AuxInt + ptr := v_0.Args[0] + if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - x2_1 := x2.Args[1] - if x2_1.Op != OpARM64SRLconst || x2_1.AuxInt != 24 || w != x2_1.Args[0] { + v.reset(OpARM64MOVDload) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(ptr) + v.AddArg(mem) + return true + } + // match: (MOVDload [off] {sym} (ADD ptr idx) mem) + // cond: off == 0 && sym == nil + // result: (MOVDloadidx ptr idx mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADD { break } - x3 := x2.Args[2] - if x3.Op != OpARM64MOVBstore || x3.AuxInt != 3 || x3.Aux != s { + idx := v_0.Args[1] + ptr := v_0.Args[0] + if !(off == 0 && sym == nil) { break } - _ = x3.Args[2] - if p != x3.Args[0] { + v.reset(OpARM64MOVDloadidx) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + // match: (MOVDload [off] {sym} (ADDshiftLL [3] ptr idx) mem) + // cond: off == 0 && sym == nil + // result: (MOVDloadidx8 ptr idx mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 3 { break } - x3_1 := x3.Args[1] - if x3_1.Op != OpARM64SRLconst || x3_1.AuxInt != 32 || w != x3_1.Args[0] { + idx := v_0.Args[1] + ptr := v_0.Args[0] + if !(off == 0 && sym == nil) { break } - x4 := x3.Args[2] - if x4.Op != OpARM64MOVBstore || x4.AuxInt != 2 || x4.Aux != s { + v.reset(OpARM64MOVDloadidx8) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + // match: (MOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) + for { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDaddr { break } - _ = x4.Args[2] - if p != x4.Args[0] { + off2 := v_0.AuxInt + sym2 := v_0.Aux + ptr := v_0.Args[0] + if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - x4_1 := x4.Args[1] - if x4_1.Op != OpARM64SRLconst || x4_1.AuxInt != 40 || w != x4_1.Args[0] { + v.reset(OpARM64MOVDload) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(ptr) + v.AddArg(mem) + return true + } + // match: (MOVDload [off] {sym} ptr (MOVDstorezero [off2] {sym2} ptr2 _)) + // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) + // result: (MOVDconst [0]) + for { + off := v.AuxInt + sym := v.Aux + _ = v.Args[1] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDstorezero { break } - x5 := x4.Args[2] - if x5.Op != OpARM64MOVBstore || x5.AuxInt != 1 || x5.Aux != s { + off2 := v_1.AuxInt + sym2 := v_1.Aux + _ = v_1.Args[1] + ptr2 := v_1.Args[0] + if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { break } - _ = x5.Args[2] - p1 := x5.Args[0] - if p1.Op != OpARM64ADD { + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 + return true + } + // match: (MOVDload [off] {sym} (SB) _) + // cond: symIsRO(sym) + // result: (MOVDconst [int64(read64(sym, off, config.BigEndian))]) + for { + off := v.AuxInt + sym := v.Aux + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpSB || !(symIsRO(sym)) { break } - idx1 := p1.Args[1] - ptr1 := p1.Args[0] - x5_1 := x5.Args[1] - if x5_1.Op != OpARM64SRLconst || x5_1.AuxInt != 48 || w != x5_1.Args[0] { + v.reset(OpARM64MOVDconst) + v.AuxInt = int64(read64(sym, off, config.BigEndian)) + return true + } + return false +} +func rewriteValueARM64_OpARM64MOVDloadidx_0(v *Value) bool { + // match: (MOVDloadidx ptr (MOVDconst [c]) mem) + // result: (MOVDload [c] ptr mem) + for { + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - x6 := x5.Args[2] - if x6.Op != OpARM64MOVBstoreidx { + c := v_1.AuxInt + v.reset(OpARM64MOVDload) + v.AuxInt = c + v.AddArg(ptr) + v.AddArg(mem) + return true + } + // match: (MOVDloadidx (MOVDconst [c]) ptr mem) + // result: (MOVDload [c] ptr mem) + for { + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - mem := x6.Args[3] - ptr0 := x6.Args[0] - idx0 := x6.Args[1] - x6_2 := x6.Args[2] - if x6_2.Op != OpARM64SRLconst || x6_2.AuxInt != 56 || w != x6_2.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6)) { + c := v_0.AuxInt + ptr := v.Args[1] + v.reset(OpARM64MOVDload) + v.AuxInt = c + v.AddArg(ptr) + v.AddArg(mem) + return true + } + // match: (MOVDloadidx ptr (SLLconst [3] idx) mem) + // result: (MOVDloadidx8 ptr idx mem) + for { + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64SLLconst || v_1.AuxInt != 3 { break } - v.reset(OpARM64MOVDstoreidx) - v.AddArg(ptr0) - v.AddArg(idx0) - v0 := b.NewValue0(x5.Pos, OpARM64REV, w.Type) - v0.AddArg(w) - v.AddArg(v0) + idx := v_1.Args[0] + v.reset(OpARM64MOVDloadidx8) + v.AddArg(ptr) + v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVBstore [7] {s} p w x0:(MOVBstore [6] {s} p (SRLconst [8] w) x1:(MOVBstore [5] {s} p (SRLconst [16] w) x2:(MOVBstore [4] {s} p (SRLconst [24] w) x3:(MOVBstore [3] {s} p (SRLconst [32] w) x4:(MOVBstore [2] {s} p (SRLconst [40] w) x5:(MOVBstore [1] {s} p1:(ADD idx1 ptr1) (SRLconst [48] w) x6:(MOVBstoreidx ptr0 idx0 (SRLconst [56] w) mem)))))))) - // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) - // result: (MOVDstoreidx ptr0 idx0 (REV w) mem) + // match: (MOVDloadidx (SLLconst [3] idx) ptr mem) + // result: (MOVDloadidx8 ptr idx mem) for { - if v.AuxInt != 7 { + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 3 { break } - s := v.Aux + idx := v_0.Args[0] + ptr := v.Args[1] + v.reset(OpARM64MOVDloadidx8) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + // match: (MOVDloadidx ptr idx (MOVDstorezeroidx ptr2 idx2 _)) + // cond: (isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) + // result: (MOVDconst [0]) + for { _ = v.Args[2] - p := v.Args[0] - w := v.Args[1] - x0 := v.Args[2] - if x0.Op != OpARM64MOVBstore || x0.AuxInt != 6 || x0.Aux != s { + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDstorezeroidx { break } - _ = x0.Args[2] - if p != x0.Args[0] { + _ = v_2.Args[2] + ptr2 := v_2.Args[0] + idx2 := v_2.Args[1] + if !(isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) { break } - x0_1 := x0.Args[1] - if x0_1.Op != OpARM64SRLconst || x0_1.AuxInt != 8 || w != x0_1.Args[0] { - break - } - x1 := x0.Args[2] - if x1.Op != OpARM64MOVBstore || x1.AuxInt != 5 || x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] { + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 + return true + } + return false +} +func rewriteValueARM64_OpARM64MOVDloadidx8_0(v *Value) bool { + // match: (MOVDloadidx8 ptr (MOVDconst [c]) mem) + // result: (MOVDload [c<<3] ptr mem) + for { + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - x1_1 := x1.Args[1] - if x1_1.Op != OpARM64SRLconst || x1_1.AuxInt != 16 || w != x1_1.Args[0] { + c := v_1.AuxInt + v.reset(OpARM64MOVDload) + v.AuxInt = c << 3 + v.AddArg(ptr) + v.AddArg(mem) + return true + } + // match: (MOVDloadidx8 ptr idx (MOVDstorezeroidx8 ptr2 idx2 _)) + // cond: isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) + // result: (MOVDconst [0]) + for { + _ = v.Args[2] + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDstorezeroidx8 { break } - x2 := x1.Args[2] - if x2.Op != OpARM64MOVBstore || x2.AuxInt != 4 || x2.Aux != s { + _ = v_2.Args[2] + ptr2 := v_2.Args[0] + idx2 := v_2.Args[1] + if !(isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2)) { break } - _ = x2.Args[2] - if p != x2.Args[0] { + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 + return true + } + return false +} +func rewriteValueARM64_OpARM64MOVDreg_0(v *Value) bool { + // match: (MOVDreg x) + // cond: x.Uses == 1 + // result: (MOVDnop x) + for { + x := v.Args[0] + if !(x.Uses == 1) { break } - x2_1 := x2.Args[1] - if x2_1.Op != OpARM64SRLconst || x2_1.AuxInt != 24 || w != x2_1.Args[0] { + v.reset(OpARM64MOVDnop) + v.AddArg(x) + return true + } + // match: (MOVDreg (MOVDconst [c])) + // result: (MOVDconst [c]) + for { + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - x3 := x2.Args[2] - if x3.Op != OpARM64MOVBstore || x3.AuxInt != 3 || x3.Aux != s { + c := v_0.AuxInt + v.reset(OpARM64MOVDconst) + v.AuxInt = c + return true + } + return false +} +func rewriteValueARM64_OpARM64MOVDstore_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (MOVDstore [off] {sym} ptr (FMOVDfpgp val) mem) + // result: (FMOVDstore [off] {sym} ptr val mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64FMOVDfpgp { break } - _ = x3.Args[2] - if p != x3.Args[0] { + val := v_1.Args[0] + v.reset(OpARM64FMOVDstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(val) + v.AddArg(mem) + return true + } + // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) + // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVDstore [off1+off2] {sym} ptr val mem) + for { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADDconst { break } - x3_1 := x3.Args[1] - if x3_1.Op != OpARM64SRLconst || x3_1.AuxInt != 32 || w != x3_1.Args[0] { + off2 := v_0.AuxInt + ptr := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - x4 := x3.Args[2] - if x4.Op != OpARM64MOVBstore || x4.AuxInt != 2 || x4.Aux != s { + v.reset(OpARM64MOVDstore) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(ptr) + v.AddArg(val) + v.AddArg(mem) + return true + } + // match: (MOVDstore [off] {sym} (ADD ptr idx) val mem) + // cond: off == 0 && sym == nil + // result: (MOVDstoreidx ptr idx val mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADD { break } - _ = x4.Args[2] - if p != x4.Args[0] { + idx := v_0.Args[1] + ptr := v_0.Args[0] + val := v.Args[1] + if !(off == 0 && sym == nil) { break } - x4_1 := x4.Args[1] - if x4_1.Op != OpARM64SRLconst || x4_1.AuxInt != 40 || w != x4_1.Args[0] { + v.reset(OpARM64MOVDstoreidx) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true + } + // match: (MOVDstore [off] {sym} (ADDshiftLL [3] ptr idx) val mem) + // cond: off == 0 && sym == nil + // result: (MOVDstoreidx8 ptr idx val mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 3 { break } - x5 := x4.Args[2] - if x5.Op != OpARM64MOVBstore || x5.AuxInt != 1 || x5.Aux != s { + idx := v_0.Args[1] + ptr := v_0.Args[0] + val := v.Args[1] + if !(off == 0 && sym == nil) { break } - _ = x5.Args[2] - p1 := x5.Args[0] - if p1.Op != OpARM64ADD { + v.reset(OpARM64MOVDstoreidx8) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true + } + // match: (MOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) + for { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDaddr { break } - ptr1 := p1.Args[1] - idx1 := p1.Args[0] - x5_1 := x5.Args[1] - if x5_1.Op != OpARM64SRLconst || x5_1.AuxInt != 48 || w != x5_1.Args[0] { + off2 := v_0.AuxInt + sym2 := v_0.Aux + ptr := v_0.Args[0] + val := v.Args[1] + if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - x6 := x5.Args[2] - if x6.Op != OpARM64MOVBstoreidx { + v.reset(OpARM64MOVDstore) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(ptr) + v.AddArg(val) + v.AddArg(mem) + return true + } + // match: (MOVDstore [off] {sym} ptr (MOVDconst [0]) mem) + // result: (MOVDstorezero [off] {sym} ptr mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 0 { break } - mem := x6.Args[3] - ptr0 := x6.Args[0] - idx0 := x6.Args[1] - x6_2 := x6.Args[2] - if x6_2.Op != OpARM64SRLconst || x6_2.AuxInt != 56 || w != x6_2.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6)) { + v.reset(OpARM64MOVDstorezero) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(mem) + return true + } + return false +} +func rewriteValueARM64_OpARM64MOVDstoreidx_0(v *Value) bool { + // match: (MOVDstoreidx ptr (MOVDconst [c]) val mem) + // result: (MOVDstore [c] ptr val mem) + for { + mem := v.Args[3] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVDstoreidx) - v.AddArg(ptr0) - v.AddArg(idx0) - v0 := b.NewValue0(x5.Pos, OpARM64REV, w.Type) - v0.AddArg(w) - v.AddArg(v0) + c := v_1.AuxInt + val := v.Args[2] + v.reset(OpARM64MOVDstore) + v.AuxInt = c + v.AddArg(ptr) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVBstore [i] {s} ptr w x0:(MOVBstore [i-1] {s} ptr (UBFX [armBFAuxInt(8, 24)] w) x1:(MOVBstore [i-2] {s} ptr (UBFX [armBFAuxInt(16, 16)] w) x2:(MOVBstore [i-3] {s} ptr (UBFX [armBFAuxInt(24, 8)] w) mem)))) - // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2) - // result: (MOVWstore [i-3] {s} ptr (REVW w) mem) + // match: (MOVDstoreidx (MOVDconst [c]) idx val mem) + // result: (MOVDstore [c] idx val mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - ptr := v.Args[0] - w := v.Args[1] - x0 := v.Args[2] - if x0.Op != OpARM64MOVBstore || x0.AuxInt != i-1 || x0.Aux != s { + mem := v.Args[3] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - _ = x0.Args[2] - if ptr != x0.Args[0] { - break - } - x0_1 := x0.Args[1] - if x0_1.Op != OpARM64UBFX || x0_1.AuxInt != armBFAuxInt(8, 24) || w != x0_1.Args[0] { + c := v_0.AuxInt + idx := v.Args[1] + val := v.Args[2] + v.reset(OpARM64MOVDstore) + v.AuxInt = c + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true + } + // match: (MOVDstoreidx ptr (SLLconst [3] idx) val mem) + // result: (MOVDstoreidx8 ptr idx val mem) + for { + mem := v.Args[3] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64SLLconst || v_1.AuxInt != 3 { break } - x1 := x0.Args[2] - if x1.Op != OpARM64MOVBstore || x1.AuxInt != i-2 || x1.Aux != s { + idx := v_1.Args[0] + val := v.Args[2] + v.reset(OpARM64MOVDstoreidx8) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true + } + // match: (MOVDstoreidx (SLLconst [3] idx) ptr val mem) + // result: (MOVDstoreidx8 ptr idx val mem) + for { + mem := v.Args[3] + v_0 := v.Args[0] + if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 3 { break } - _ = x1.Args[2] - if ptr != x1.Args[0] { + idx := v_0.Args[0] + ptr := v.Args[1] + val := v.Args[2] + v.reset(OpARM64MOVDstoreidx8) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true + } + // match: (MOVDstoreidx ptr idx (MOVDconst [0]) mem) + // result: (MOVDstorezeroidx ptr idx mem) + for { + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 0 { break } - x1_1 := x1.Args[1] - if x1_1.Op != OpARM64UBFX || x1_1.AuxInt != armBFAuxInt(16, 16) || w != x1_1.Args[0] { + v.reset(OpARM64MOVDstorezeroidx) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + return false +} +func rewriteValueARM64_OpARM64MOVDstoreidx8_0(v *Value) bool { + // match: (MOVDstoreidx8 ptr (MOVDconst [c]) val mem) + // result: (MOVDstore [c<<3] ptr val mem) + for { + mem := v.Args[3] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - x2 := x1.Args[2] - if x2.Op != OpARM64MOVBstore || x2.AuxInt != i-3 || x2.Aux != s { + c := v_1.AuxInt + val := v.Args[2] + v.reset(OpARM64MOVDstore) + v.AuxInt = c << 3 + v.AddArg(ptr) + v.AddArg(val) + v.AddArg(mem) + return true + } + // match: (MOVDstoreidx8 ptr idx (MOVDconst [0]) mem) + // result: (MOVDstorezeroidx8 ptr idx mem) + for { + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 0 { break } - mem := x2.Args[2] - if ptr != x2.Args[0] { + v.reset(OpARM64MOVDstorezeroidx8) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + return false +} +func rewriteValueARM64_OpARM64MOVDstorezero_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (MOVDstorezero [off1] {sym} (ADDconst [off2] ptr) mem) + // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVDstorezero [off1+off2] {sym} ptr mem) + for { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADDconst { break } - x2_1 := x2.Args[1] - if x2_1.Op != OpARM64UBFX || x2_1.AuxInt != armBFAuxInt(24, 8) || w != x2_1.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2)) { + off2 := v_0.AuxInt + ptr := v_0.Args[0] + if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(OpARM64MOVWstore) - v.AuxInt = i - 3 - v.Aux = s + v.reset(OpARM64MOVDstorezero) + v.AuxInt = off1 + off2 + v.Aux = sym v.AddArg(ptr) - v0 := b.NewValue0(x2.Pos, OpARM64REVW, w.Type) - v0.AddArg(w) - v.AddArg(v0) v.AddArg(mem) return true } - // match: (MOVBstore [3] {s} p w x0:(MOVBstore [2] {s} p (UBFX [armBFAuxInt(8, 24)] w) x1:(MOVBstore [1] {s} p1:(ADD ptr1 idx1) (UBFX [armBFAuxInt(16, 16)] w) x2:(MOVBstoreidx ptr0 idx0 (UBFX [armBFAuxInt(24, 8)] w) mem)))) - // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) - // result: (MOVWstoreidx ptr0 idx0 (REVW w) mem) + // match: (MOVDstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVDstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) for { - if v.AuxInt != 3 { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDaddr { break } - s := v.Aux - _ = v.Args[2] - p := v.Args[0] - w := v.Args[1] - x0 := v.Args[2] - if x0.Op != OpARM64MOVBstore || x0.AuxInt != 2 || x0.Aux != s { + off2 := v_0.AuxInt + sym2 := v_0.Aux + ptr := v_0.Args[0] + if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - _ = x0.Args[2] - if p != x0.Args[0] { + v.reset(OpARM64MOVDstorezero) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(ptr) + v.AddArg(mem) + return true + } + // match: (MOVDstorezero [off] {sym} (ADD ptr idx) mem) + // cond: off == 0 && sym == nil + // result: (MOVDstorezeroidx ptr idx mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADD { break } - x0_1 := x0.Args[1] - if x0_1.Op != OpARM64UBFX || x0_1.AuxInt != armBFAuxInt(8, 24) || w != x0_1.Args[0] { + idx := v_0.Args[1] + ptr := v_0.Args[0] + if !(off == 0 && sym == nil) { break } - x1 := x0.Args[2] - if x1.Op != OpARM64MOVBstore || x1.AuxInt != 1 || x1.Aux != s { + v.reset(OpARM64MOVDstorezeroidx) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + // match: (MOVDstorezero [off] {sym} (ADDshiftLL [3] ptr idx) mem) + // cond: off == 0 && sym == nil + // result: (MOVDstorezeroidx8 ptr idx mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 3 { break } - _ = x1.Args[2] - p1 := x1.Args[0] - if p1.Op != OpARM64ADD { + idx := v_0.Args[1] + ptr := v_0.Args[0] + if !(off == 0 && sym == nil) { break } - idx1 := p1.Args[1] - ptr1 := p1.Args[0] - x1_1 := x1.Args[1] - if x1_1.Op != OpARM64UBFX || x1_1.AuxInt != armBFAuxInt(16, 16) || w != x1_1.Args[0] { + v.reset(OpARM64MOVDstorezeroidx8) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + // match: (MOVDstorezero [i] {s} ptr0 x:(MOVDstorezero [j] {s} ptr1 mem)) + // cond: x.Uses == 1 && areAdjacentOffsets(i,j,8) && is32Bit(min(i,j)) && isSamePtr(ptr0, ptr1) && clobber(x) + // result: (MOVQstorezero [min(i,j)] {s} ptr0 mem) + for { + i := v.AuxInt + s := v.Aux + _ = v.Args[1] + ptr0 := v.Args[0] + x := v.Args[1] + if x.Op != OpARM64MOVDstorezero { break } - x2 := x1.Args[2] - if x2.Op != OpARM64MOVBstoreidx { + j := x.AuxInt + if x.Aux != s { break } - mem := x2.Args[3] - ptr0 := x2.Args[0] - idx0 := x2.Args[1] - x2_2 := x2.Args[2] - if x2_2.Op != OpARM64UBFX || x2_2.AuxInt != armBFAuxInt(24, 8) || w != x2_2.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2)) { + mem := x.Args[1] + ptr1 := x.Args[0] + if !(x.Uses == 1 && areAdjacentOffsets(i, j, 8) && is32Bit(min(i, j)) && isSamePtr(ptr0, ptr1) && clobber(x)) { break } - v.reset(OpARM64MOVWstoreidx) + v.reset(OpARM64MOVQstorezero) + v.AuxInt = min(i, j) + v.Aux = s v.AddArg(ptr0) - v.AddArg(idx0) - v0 := b.NewValue0(x1.Pos, OpARM64REVW, w.Type) - v0.AddArg(w) - v.AddArg(v0) v.AddArg(mem) return true } - // match: (MOVBstore [3] {s} p w x0:(MOVBstore [2] {s} p (UBFX [armBFAuxInt(8, 24)] w) x1:(MOVBstore [1] {s} p1:(ADD idx1 ptr1) (UBFX [armBFAuxInt(16, 16)] w) x2:(MOVBstoreidx ptr0 idx0 (UBFX [armBFAuxInt(24, 8)] w) mem)))) - // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) - // result: (MOVWstoreidx ptr0 idx0 (REVW w) mem) + // match: (MOVDstorezero [8] {s} p0:(ADD ptr0 idx0) x:(MOVDstorezeroidx ptr1 idx1 mem)) + // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) + // result: (MOVQstorezero [0] {s} p0 mem) for { - if v.AuxInt != 3 { + if v.AuxInt != 8 { break } s := v.Aux - _ = v.Args[2] - p := v.Args[0] - w := v.Args[1] - x0 := v.Args[2] - if x0.Op != OpARM64MOVBstore || x0.AuxInt != 2 || x0.Aux != s { + _ = v.Args[1] + p0 := v.Args[0] + if p0.Op != OpARM64ADD { break } - _ = x0.Args[2] - if p != x0.Args[0] { - break + _ = p0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr0 := p0.Args[_i0] + idx0 := p0.Args[1^_i0] + x := v.Args[1] + if x.Op != OpARM64MOVDstorezeroidx { + continue + } + mem := x.Args[2] + ptr1 := x.Args[0] + idx1 := x.Args[1] + if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + continue + } + v.reset(OpARM64MOVQstorezero) + v.AuxInt = 0 + v.Aux = s + v.AddArg(p0) + v.AddArg(mem) + return true } - x0_1 := x0.Args[1] - if x0_1.Op != OpARM64UBFX || x0_1.AuxInt != armBFAuxInt(8, 24) || w != x0_1.Args[0] { + break + } + // match: (MOVDstorezero [8] {s} p0:(ADDshiftLL [3] ptr0 idx0) x:(MOVDstorezeroidx8 ptr1 idx1 mem)) + // cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x) + // result: (MOVQstorezero [0] {s} p0 mem) + for { + if v.AuxInt != 8 { break } - x1 := x0.Args[2] - if x1.Op != OpARM64MOVBstore || x1.AuxInt != 1 || x1.Aux != s { + s := v.Aux + _ = v.Args[1] + p0 := v.Args[0] + if p0.Op != OpARM64ADDshiftLL || p0.AuxInt != 3 { break } - _ = x1.Args[2] - p1 := x1.Args[0] - if p1.Op != OpARM64ADD { + idx0 := p0.Args[1] + ptr0 := p0.Args[0] + x := v.Args[1] + if x.Op != OpARM64MOVDstorezeroidx8 { break } - ptr1 := p1.Args[1] - idx1 := p1.Args[0] - x1_1 := x1.Args[1] - if x1_1.Op != OpARM64UBFX || x1_1.AuxInt != armBFAuxInt(16, 16) || w != x1_1.Args[0] { + mem := x.Args[2] + ptr1 := x.Args[0] + idx1 := x.Args[1] + if !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) { break } - x2 := x1.Args[2] - if x2.Op != OpARM64MOVBstoreidx { + v.reset(OpARM64MOVQstorezero) + v.AuxInt = 0 + v.Aux = s + v.AddArg(p0) + v.AddArg(mem) + return true + } + return false +} +func rewriteValueARM64_OpARM64MOVDstorezeroidx_0(v *Value) bool { + // match: (MOVDstorezeroidx ptr (MOVDconst [c]) mem) + // result: (MOVDstorezero [c] ptr mem) + for { + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - mem := x2.Args[3] - ptr0 := x2.Args[0] - idx0 := x2.Args[1] - x2_2 := x2.Args[2] - if x2_2.Op != OpARM64UBFX || x2_2.AuxInt != armBFAuxInt(24, 8) || w != x2_2.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2)) { + c := v_1.AuxInt + v.reset(OpARM64MOVDstorezero) + v.AuxInt = c + v.AddArg(ptr) + v.AddArg(mem) + return true + } + // match: (MOVDstorezeroidx (MOVDconst [c]) idx mem) + // result: (MOVDstorezero [c] idx mem) + for { + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVWstoreidx) - v.AddArg(ptr0) - v.AddArg(idx0) - v0 := b.NewValue0(x1.Pos, OpARM64REVW, w.Type) - v0.AddArg(w) - v.AddArg(v0) + c := v_0.AuxInt + idx := v.Args[1] + v.reset(OpARM64MOVDstorezero) + v.AuxInt = c + v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVBstore [i] {s} ptr w x0:(MOVBstore [i-1] {s} ptr (SRLconst [8] (MOVDreg w)) x1:(MOVBstore [i-2] {s} ptr (SRLconst [16] (MOVDreg w)) x2:(MOVBstore [i-3] {s} ptr (SRLconst [24] (MOVDreg w)) mem)))) - // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2) - // result: (MOVWstore [i-3] {s} ptr (REVW w) mem) + // match: (MOVDstorezeroidx ptr (SLLconst [3] idx) mem) + // result: (MOVDstorezeroidx8 ptr idx mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] - w := v.Args[1] - x0 := v.Args[2] - if x0.Op != OpARM64MOVBstore || x0.AuxInt != i-1 || x0.Aux != s { - break - } - _ = x0.Args[2] - if ptr != x0.Args[0] { + v_1 := v.Args[1] + if v_1.Op != OpARM64SLLconst || v_1.AuxInt != 3 { break } - x0_1 := x0.Args[1] - if x0_1.Op != OpARM64SRLconst || x0_1.AuxInt != 8 { + idx := v_1.Args[0] + v.reset(OpARM64MOVDstorezeroidx8) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + // match: (MOVDstorezeroidx (SLLconst [3] idx) ptr mem) + // result: (MOVDstorezeroidx8 ptr idx mem) + for { + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 3 { break } - x0_1_0 := x0_1.Args[0] - if x0_1_0.Op != OpARM64MOVDreg || w != x0_1_0.Args[0] { + idx := v_0.Args[0] + ptr := v.Args[1] + v.reset(OpARM64MOVDstorezeroidx8) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + return false +} +func rewriteValueARM64_OpARM64MOVDstorezeroidx8_0(v *Value) bool { + // match: (MOVDstorezeroidx8 ptr (MOVDconst [c]) mem) + // result: (MOVDstorezero [c<<3] ptr mem) + for { + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - x1 := x0.Args[2] - if x1.Op != OpARM64MOVBstore || x1.AuxInt != i-2 || x1.Aux != s { + c := v_1.AuxInt + v.reset(OpARM64MOVDstorezero) + v.AuxInt = c << 3 + v.AddArg(ptr) + v.AddArg(mem) + return true + } + return false +} +func rewriteValueARM64_OpARM64MOVHUload_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (MOVHUload [off1] {sym} (ADDconst [off2] ptr) mem) + // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVHUload [off1+off2] {sym} ptr mem) + for { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADDconst { break } - _ = x1.Args[2] - if ptr != x1.Args[0] { + off2 := v_0.AuxInt + ptr := v_0.Args[0] + if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - x1_1 := x1.Args[1] - if x1_1.Op != OpARM64SRLconst || x1_1.AuxInt != 16 { + v.reset(OpARM64MOVHUload) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(ptr) + v.AddArg(mem) + return true + } + // match: (MOVHUload [off] {sym} (ADD ptr idx) mem) + // cond: off == 0 && sym == nil + // result: (MOVHUloadidx ptr idx mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADD { break } - x1_1_0 := x1_1.Args[0] - if x1_1_0.Op != OpARM64MOVDreg || w != x1_1_0.Args[0] { + idx := v_0.Args[1] + ptr := v_0.Args[0] + if !(off == 0 && sym == nil) { break } - x2 := x1.Args[2] - if x2.Op != OpARM64MOVBstore || x2.AuxInt != i-3 || x2.Aux != s { + v.reset(OpARM64MOVHUloadidx) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + // match: (MOVHUload [off] {sym} (ADDshiftLL [1] ptr idx) mem) + // cond: off == 0 && sym == nil + // result: (MOVHUloadidx2 ptr idx mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 1 { break } - mem := x2.Args[2] - if ptr != x2.Args[0] { + idx := v_0.Args[1] + ptr := v_0.Args[0] + if !(off == 0 && sym == nil) { break } - x2_1 := x2.Args[1] - if x2_1.Op != OpARM64SRLconst || x2_1.AuxInt != 24 { + v.reset(OpARM64MOVHUloadidx2) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + // match: (MOVHUload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVHUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) + for { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDaddr { break } - x2_1_0 := x2_1.Args[0] - if x2_1_0.Op != OpARM64MOVDreg || w != x2_1_0.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2)) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + ptr := v_0.Args[0] + if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(OpARM64MOVWstore) - v.AuxInt = i - 3 - v.Aux = s + v.reset(OpARM64MOVHUload) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) v.AddArg(ptr) - v0 := b.NewValue0(x2.Pos, OpARM64REVW, w.Type) - v0.AddArg(w) - v.AddArg(v0) v.AddArg(mem) return true } - // match: (MOVBstore [3] {s} p w x0:(MOVBstore [2] {s} p (SRLconst [8] (MOVDreg w)) x1:(MOVBstore [1] {s} p1:(ADD ptr1 idx1) (SRLconst [16] (MOVDreg w)) x2:(MOVBstoreidx ptr0 idx0 (SRLconst [24] (MOVDreg w)) mem)))) - // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) - // result: (MOVWstoreidx ptr0 idx0 (REVW w) mem) + // match: (MOVHUload [off] {sym} ptr (MOVHstorezero [off2] {sym2} ptr2 _)) + // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) + // result: (MOVDconst [0]) for { - if v.AuxInt != 3 { - break - } - s := v.Aux - _ = v.Args[2] - p := v.Args[0] - w := v.Args[1] - x0 := v.Args[2] - if x0.Op != OpARM64MOVBstore || x0.AuxInt != 2 || x0.Aux != s { + off := v.AuxInt + sym := v.Aux + _ = v.Args[1] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVHstorezero { break } - _ = x0.Args[2] - if p != x0.Args[0] { + off2 := v_1.AuxInt + sym2 := v_1.Aux + _ = v_1.Args[1] + ptr2 := v_1.Args[0] + if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { break } - x0_1 := x0.Args[1] - if x0_1.Op != OpARM64SRLconst || x0_1.AuxInt != 8 { - break - } - x0_1_0 := x0_1.Args[0] - if x0_1_0.Op != OpARM64MOVDreg || w != x0_1_0.Args[0] { + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 + return true + } + // match: (MOVHUload [off] {sym} (SB) _) + // cond: symIsRO(sym) + // result: (MOVDconst [int64(read16(sym, off, config.BigEndian))]) + for { + off := v.AuxInt + sym := v.Aux + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpSB || !(symIsRO(sym)) { break } - x1 := x0.Args[2] - if x1.Op != OpARM64MOVBstore || x1.AuxInt != 1 || x1.Aux != s { + v.reset(OpARM64MOVDconst) + v.AuxInt = int64(read16(sym, off, config.BigEndian)) + return true + } + return false +} +func rewriteValueARM64_OpARM64MOVHUloadidx_0(v *Value) bool { + // match: (MOVHUloadidx ptr (MOVDconst [c]) mem) + // result: (MOVHUload [c] ptr mem) + for { + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - _ = x1.Args[2] - p1 := x1.Args[0] - if p1.Op != OpARM64ADD { + c := v_1.AuxInt + v.reset(OpARM64MOVHUload) + v.AuxInt = c + v.AddArg(ptr) + v.AddArg(mem) + return true + } + // match: (MOVHUloadidx (MOVDconst [c]) ptr mem) + // result: (MOVHUload [c] ptr mem) + for { + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - idx1 := p1.Args[1] - ptr1 := p1.Args[0] - x1_1 := x1.Args[1] - if x1_1.Op != OpARM64SRLconst || x1_1.AuxInt != 16 { + c := v_0.AuxInt + ptr := v.Args[1] + v.reset(OpARM64MOVHUload) + v.AuxInt = c + v.AddArg(ptr) + v.AddArg(mem) + return true + } + // match: (MOVHUloadidx ptr (SLLconst [1] idx) mem) + // result: (MOVHUloadidx2 ptr idx mem) + for { + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64SLLconst || v_1.AuxInt != 1 { break } - x1_1_0 := x1_1.Args[0] - if x1_1_0.Op != OpARM64MOVDreg || w != x1_1_0.Args[0] { + idx := v_1.Args[0] + v.reset(OpARM64MOVHUloadidx2) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + // match: (MOVHUloadidx ptr (ADD idx idx) mem) + // result: (MOVHUloadidx2 ptr idx mem) + for { + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64ADD { break } - x2 := x1.Args[2] - if x2.Op != OpARM64MOVBstoreidx { + idx := v_1.Args[1] + if idx != v_1.Args[0] { break } - mem := x2.Args[3] - ptr0 := x2.Args[0] - idx0 := x2.Args[1] - x2_2 := x2.Args[2] - if x2_2.Op != OpARM64SRLconst || x2_2.AuxInt != 24 { + v.reset(OpARM64MOVHUloadidx2) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + // match: (MOVHUloadidx (ADD idx idx) ptr mem) + // result: (MOVHUloadidx2 ptr idx mem) + for { + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADD { break } - x2_2_0 := x2_2.Args[0] - if x2_2_0.Op != OpARM64MOVDreg || w != x2_2_0.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2)) { + idx := v_0.Args[1] + if idx != v_0.Args[0] { break } - v.reset(OpARM64MOVWstoreidx) - v.AddArg(ptr0) - v.AddArg(idx0) - v0 := b.NewValue0(x1.Pos, OpARM64REVW, w.Type) - v0.AddArg(w) - v.AddArg(v0) + ptr := v.Args[1] + v.reset(OpARM64MOVHUloadidx2) + v.AddArg(ptr) + v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVBstore [3] {s} p w x0:(MOVBstore [2] {s} p (SRLconst [8] (MOVDreg w)) x1:(MOVBstore [1] {s} p1:(ADD idx1 ptr1) (SRLconst [16] (MOVDreg w)) x2:(MOVBstoreidx ptr0 idx0 (SRLconst [24] (MOVDreg w)) mem)))) - // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) - // result: (MOVWstoreidx ptr0 idx0 (REVW w) mem) + // match: (MOVHUloadidx ptr idx (MOVHstorezeroidx ptr2 idx2 _)) + // cond: (isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) + // result: (MOVDconst [0]) for { - if v.AuxInt != 3 { - break - } - s := v.Aux _ = v.Args[2] - p := v.Args[0] - w := v.Args[1] - x0 := v.Args[2] - if x0.Op != OpARM64MOVBstore || x0.AuxInt != 2 || x0.Aux != s { + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVHstorezeroidx { break } - _ = x0.Args[2] - if p != x0.Args[0] { + _ = v_2.Args[2] + ptr2 := v_2.Args[0] + idx2 := v_2.Args[1] + if !(isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) { break } - x0_1 := x0.Args[1] - if x0_1.Op != OpARM64SRLconst || x0_1.AuxInt != 8 { + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 + return true + } + return false +} +func rewriteValueARM64_OpARM64MOVHUloadidx2_0(v *Value) bool { + // match: (MOVHUloadidx2 ptr (MOVDconst [c]) mem) + // result: (MOVHUload [c<<1] ptr mem) + for { + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - x0_1_0 := x0_1.Args[0] - if x0_1_0.Op != OpARM64MOVDreg || w != x0_1_0.Args[0] { + c := v_1.AuxInt + v.reset(OpARM64MOVHUload) + v.AuxInt = c << 1 + v.AddArg(ptr) + v.AddArg(mem) + return true + } + // match: (MOVHUloadidx2 ptr idx (MOVHstorezeroidx2 ptr2 idx2 _)) + // cond: isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) + // result: (MOVDconst [0]) + for { + _ = v.Args[2] + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVHstorezeroidx2 { break } - x1 := x0.Args[2] - if x1.Op != OpARM64MOVBstore || x1.AuxInt != 1 || x1.Aux != s { + _ = v_2.Args[2] + ptr2 := v_2.Args[0] + idx2 := v_2.Args[1] + if !(isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2)) { break } - _ = x1.Args[2] - p1 := x1.Args[0] - if p1.Op != OpARM64ADD { + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 + return true + } + return false +} +func rewriteValueARM64_OpARM64MOVHUreg_0(v *Value) bool { + // match: (MOVHUreg x:(MOVBUload _ _)) + // result: (MOVDreg x) + for { + x := v.Args[0] + if x.Op != OpARM64MOVBUload { break } - ptr1 := p1.Args[1] - idx1 := p1.Args[0] - x1_1 := x1.Args[1] - if x1_1.Op != OpARM64SRLconst || x1_1.AuxInt != 16 { + _ = x.Args[1] + v.reset(OpARM64MOVDreg) + v.AddArg(x) + return true + } + // match: (MOVHUreg x:(MOVHUload _ _)) + // result: (MOVDreg x) + for { + x := v.Args[0] + if x.Op != OpARM64MOVHUload { break } - x1_1_0 := x1_1.Args[0] - if x1_1_0.Op != OpARM64MOVDreg || w != x1_1_0.Args[0] { + _ = x.Args[1] + v.reset(OpARM64MOVDreg) + v.AddArg(x) + return true + } + // match: (MOVHUreg x:(MOVBUloadidx _ _ _)) + // result: (MOVDreg x) + for { + x := v.Args[0] + if x.Op != OpARM64MOVBUloadidx { break } - x2 := x1.Args[2] - if x2.Op != OpARM64MOVBstoreidx { + _ = x.Args[2] + v.reset(OpARM64MOVDreg) + v.AddArg(x) + return true + } + // match: (MOVHUreg x:(MOVHUloadidx _ _ _)) + // result: (MOVDreg x) + for { + x := v.Args[0] + if x.Op != OpARM64MOVHUloadidx { break } - mem := x2.Args[3] - ptr0 := x2.Args[0] - idx0 := x2.Args[1] - x2_2 := x2.Args[2] - if x2_2.Op != OpARM64SRLconst || x2_2.AuxInt != 24 { + _ = x.Args[2] + v.reset(OpARM64MOVDreg) + v.AddArg(x) + return true + } + // match: (MOVHUreg x:(MOVHUloadidx2 _ _ _)) + // result: (MOVDreg x) + for { + x := v.Args[0] + if x.Op != OpARM64MOVHUloadidx2 { break } - x2_2_0 := x2_2.Args[0] - if x2_2_0.Op != OpARM64MOVDreg || w != x2_2_0.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2)) { + _ = x.Args[2] + v.reset(OpARM64MOVDreg) + v.AddArg(x) + return true + } + // match: (MOVHUreg x:(MOVBUreg _)) + // result: (MOVDreg x) + for { + x := v.Args[0] + if x.Op != OpARM64MOVBUreg { break } - v.reset(OpARM64MOVWstoreidx) - v.AddArg(ptr0) - v.AddArg(idx0) - v0 := b.NewValue0(x1.Pos, OpARM64REVW, w.Type) - v0.AddArg(w) - v.AddArg(v0) - v.AddArg(mem) + v.reset(OpARM64MOVDreg) + v.AddArg(x) return true } - return false -} -func rewriteValueARM64_OpARM64MOVBstore_40(v *Value) bool { - b := v.Block - // match: (MOVBstore [i] {s} ptr w x0:(MOVBstore [i-1] {s} ptr (SRLconst [8] w) x1:(MOVBstore [i-2] {s} ptr (SRLconst [16] w) x2:(MOVBstore [i-3] {s} ptr (SRLconst [24] w) mem)))) - // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2) - // result: (MOVWstore [i-3] {s} ptr (REVW w) mem) + // match: (MOVHUreg x:(MOVHUreg _)) + // result: (MOVDreg x) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - ptr := v.Args[0] - w := v.Args[1] - x0 := v.Args[2] - if x0.Op != OpARM64MOVBstore || x0.AuxInt != i-1 || x0.Aux != s { + x := v.Args[0] + if x.Op != OpARM64MOVHUreg { break } - _ = x0.Args[2] - if ptr != x0.Args[0] { + v.reset(OpARM64MOVDreg) + v.AddArg(x) + return true + } + // match: (MOVHUreg (ANDconst [c] x)) + // result: (ANDconst [c&(1<<16-1)] x) + for { + v_0 := v.Args[0] + if v_0.Op != OpARM64ANDconst { break } - x0_1 := x0.Args[1] - if x0_1.Op != OpARM64SRLconst || x0_1.AuxInt != 8 || w != x0_1.Args[0] { + c := v_0.AuxInt + x := v_0.Args[0] + v.reset(OpARM64ANDconst) + v.AuxInt = c & (1<<16 - 1) + v.AddArg(x) + return true + } + // match: (MOVHUreg (MOVDconst [c])) + // result: (MOVDconst [int64(uint16(c))]) + for { + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - x1 := x0.Args[2] - if x1.Op != OpARM64MOVBstore || x1.AuxInt != i-2 || x1.Aux != s { + c := v_0.AuxInt + v.reset(OpARM64MOVDconst) + v.AuxInt = int64(uint16(c)) + return true + } + // match: (MOVHUreg (SLLconst [sc] x)) + // cond: isARM64BFMask(sc, 1<<16-1, sc) + // result: (UBFIZ [armBFAuxInt(sc, arm64BFWidth(1<<16-1, sc))] x) + for { + v_0 := v.Args[0] + if v_0.Op != OpARM64SLLconst { break } - _ = x1.Args[2] - if ptr != x1.Args[0] { + sc := v_0.AuxInt + x := v_0.Args[0] + if !(isARM64BFMask(sc, 1<<16-1, sc)) { break } - x1_1 := x1.Args[1] - if x1_1.Op != OpARM64SRLconst || x1_1.AuxInt != 16 || w != x1_1.Args[0] { + v.reset(OpARM64UBFIZ) + v.AuxInt = armBFAuxInt(sc, arm64BFWidth(1<<16-1, sc)) + v.AddArg(x) + return true + } + return false +} +func rewriteValueARM64_OpARM64MOVHUreg_10(v *Value) bool { + // match: (MOVHUreg (SRLconst [sc] x)) + // cond: isARM64BFMask(sc, 1<<16-1, 0) + // result: (UBFX [armBFAuxInt(sc, 16)] x) + for { + v_0 := v.Args[0] + if v_0.Op != OpARM64SRLconst { break } - x2 := x1.Args[2] - if x2.Op != OpARM64MOVBstore || x2.AuxInt != i-3 || x2.Aux != s { + sc := v_0.AuxInt + x := v_0.Args[0] + if !(isARM64BFMask(sc, 1<<16-1, 0)) { break } - mem := x2.Args[2] - if ptr != x2.Args[0] { + v.reset(OpARM64UBFX) + v.AuxInt = armBFAuxInt(sc, 16) + v.AddArg(x) + return true + } + return false +} +func rewriteValueARM64_OpARM64MOVHload_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) + // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVHload [off1+off2] {sym} ptr mem) + for { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADDconst { break } - x2_1 := x2.Args[1] - if x2_1.Op != OpARM64SRLconst || x2_1.AuxInt != 24 || w != x2_1.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2)) { + off2 := v_0.AuxInt + ptr := v_0.Args[0] + if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(OpARM64MOVWstore) - v.AuxInt = i - 3 - v.Aux = s + v.reset(OpARM64MOVHload) + v.AuxInt = off1 + off2 + v.Aux = sym v.AddArg(ptr) - v0 := b.NewValue0(x2.Pos, OpARM64REVW, w.Type) - v0.AddArg(w) - v.AddArg(v0) v.AddArg(mem) return true } - // match: (MOVBstore [3] {s} p w x0:(MOVBstore [2] {s} p (SRLconst [8] w) x1:(MOVBstore [1] {s} p1:(ADD ptr1 idx1) (SRLconst [16] w) x2:(MOVBstoreidx ptr0 idx0 (SRLconst [24] w) mem)))) - // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) - // result: (MOVWstoreidx ptr0 idx0 (REVW w) mem) + // match: (MOVHload [off] {sym} (ADD ptr idx) mem) + // cond: off == 0 && sym == nil + // result: (MOVHloadidx ptr idx mem) for { - if v.AuxInt != 3 { + off := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADD { break } - s := v.Aux - _ = v.Args[2] - p := v.Args[0] - w := v.Args[1] - x0 := v.Args[2] - if x0.Op != OpARM64MOVBstore || x0.AuxInt != 2 || x0.Aux != s { + idx := v_0.Args[1] + ptr := v_0.Args[0] + if !(off == 0 && sym == nil) { break } - _ = x0.Args[2] - if p != x0.Args[0] { + v.reset(OpARM64MOVHloadidx) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + // match: (MOVHload [off] {sym} (ADDshiftLL [1] ptr idx) mem) + // cond: off == 0 && sym == nil + // result: (MOVHloadidx2 ptr idx mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 1 { break } - x0_1 := x0.Args[1] - if x0_1.Op != OpARM64SRLconst || x0_1.AuxInt != 8 || w != x0_1.Args[0] { + idx := v_0.Args[1] + ptr := v_0.Args[0] + if !(off == 0 && sym == nil) { break } - x1 := x0.Args[2] - if x1.Op != OpARM64MOVBstore || x1.AuxInt != 1 || x1.Aux != s { + v.reset(OpARM64MOVHloadidx2) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + // match: (MOVHload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) + for { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDaddr { break } - _ = x1.Args[2] - p1 := x1.Args[0] - if p1.Op != OpARM64ADD { + off2 := v_0.AuxInt + sym2 := v_0.Aux + ptr := v_0.Args[0] + if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - idx1 := p1.Args[1] - ptr1 := p1.Args[0] - x1_1 := x1.Args[1] - if x1_1.Op != OpARM64SRLconst || x1_1.AuxInt != 16 || w != x1_1.Args[0] { + v.reset(OpARM64MOVHload) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(ptr) + v.AddArg(mem) + return true + } + // match: (MOVHload [off] {sym} ptr (MOVHstorezero [off2] {sym2} ptr2 _)) + // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) + // result: (MOVDconst [0]) + for { + off := v.AuxInt + sym := v.Aux + _ = v.Args[1] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVHstorezero { break } - x2 := x1.Args[2] - if x2.Op != OpARM64MOVBstoreidx { + off2 := v_1.AuxInt + sym2 := v_1.Aux + _ = v_1.Args[1] + ptr2 := v_1.Args[0] + if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { break } - mem := x2.Args[3] - ptr0 := x2.Args[0] - idx0 := x2.Args[1] - x2_2 := x2.Args[2] - if x2_2.Op != OpARM64SRLconst || x2_2.AuxInt != 24 || w != x2_2.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2)) { + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 + return true + } + return false +} +func rewriteValueARM64_OpARM64MOVHloadidx_0(v *Value) bool { + // match: (MOVHloadidx ptr (MOVDconst [c]) mem) + // result: (MOVHload [c] ptr mem) + for { + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVWstoreidx) - v.AddArg(ptr0) - v.AddArg(idx0) - v0 := b.NewValue0(x1.Pos, OpARM64REVW, w.Type) - v0.AddArg(w) - v.AddArg(v0) + c := v_1.AuxInt + v.reset(OpARM64MOVHload) + v.AuxInt = c + v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVBstore [3] {s} p w x0:(MOVBstore [2] {s} p (SRLconst [8] w) x1:(MOVBstore [1] {s} p1:(ADD idx1 ptr1) (SRLconst [16] w) x2:(MOVBstoreidx ptr0 idx0 (SRLconst [24] w) mem)))) - // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) - // result: (MOVWstoreidx ptr0 idx0 (REVW w) mem) + // match: (MOVHloadidx (MOVDconst [c]) ptr mem) + // result: (MOVHload [c] ptr mem) for { - if v.AuxInt != 3 { - break - } - s := v.Aux - _ = v.Args[2] - p := v.Args[0] - w := v.Args[1] - x0 := v.Args[2] - if x0.Op != OpARM64MOVBstore || x0.AuxInt != 2 || x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] { + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - x0_1 := x0.Args[1] - if x0_1.Op != OpARM64SRLconst || x0_1.AuxInt != 8 || w != x0_1.Args[0] { - break - } - x1 := x0.Args[2] - if x1.Op != OpARM64MOVBstore || x1.AuxInt != 1 || x1.Aux != s { - break - } - _ = x1.Args[2] - p1 := x1.Args[0] - if p1.Op != OpARM64ADD { - break - } - ptr1 := p1.Args[1] - idx1 := p1.Args[0] - x1_1 := x1.Args[1] - if x1_1.Op != OpARM64SRLconst || x1_1.AuxInt != 16 || w != x1_1.Args[0] { - break - } - x2 := x1.Args[2] - if x2.Op != OpARM64MOVBstoreidx { - break - } - mem := x2.Args[3] - ptr0 := x2.Args[0] - idx0 := x2.Args[1] - x2_2 := x2.Args[2] - if x2_2.Op != OpARM64SRLconst || x2_2.AuxInt != 24 || w != x2_2.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2)) { - break - } - v.reset(OpARM64MOVWstoreidx) - v.AddArg(ptr0) - v.AddArg(idx0) - v0 := b.NewValue0(x1.Pos, OpARM64REVW, w.Type) - v0.AddArg(w) - v.AddArg(v0) + c := v_0.AuxInt + ptr := v.Args[1] + v.reset(OpARM64MOVHload) + v.AuxInt = c + v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVBstore [i] {s} ptr w x:(MOVBstore [i-1] {s} ptr (SRLconst [8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHstore [i-1] {s} ptr (REV16W w) mem) + // match: (MOVHloadidx ptr (SLLconst [1] idx) mem) + // result: (MOVHloadidx2 ptr idx mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] - w := v.Args[1] - x := v.Args[2] - if x.Op != OpARM64MOVBstore || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[2] - if ptr != x.Args[0] { - break - } - x_1 := x.Args[1] - if x_1.Op != OpARM64SRLconst || x_1.AuxInt != 8 || w != x_1.Args[0] || !(x.Uses == 1 && clobber(x)) { + v_1 := v.Args[1] + if v_1.Op != OpARM64SLLconst || v_1.AuxInt != 1 { break } - v.reset(OpARM64MOVHstore) - v.AuxInt = i - 1 - v.Aux = s + idx := v_1.Args[0] + v.reset(OpARM64MOVHloadidx2) v.AddArg(ptr) - v0 := b.NewValue0(x.Pos, OpARM64REV16W, w.Type) - v0.AddArg(w) - v.AddArg(v0) + v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVBstore [1] {s} (ADD ptr1 idx1) w x:(MOVBstoreidx ptr0 idx0 (SRLconst [8] w) mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVHstoreidx ptr0 idx0 (REV16W w) mem) + // match: (MOVHloadidx ptr (ADD idx idx) mem) + // result: (MOVHloadidx2 ptr idx mem) for { - if v.AuxInt != 1 { - break - } - s := v.Aux - _ = v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { - break - } - idx1 := v_0.Args[1] - ptr1 := v_0.Args[0] - w := v.Args[1] - x := v.Args[2] - if x.Op != OpARM64MOVBstoreidx { + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64ADD { break } - mem := x.Args[3] - ptr0 := x.Args[0] - idx0 := x.Args[1] - x_2 := x.Args[2] - if x_2.Op != OpARM64SRLconst || x_2.AuxInt != 8 || w != x_2.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + idx := v_1.Args[1] + if idx != v_1.Args[0] { break } - v.reset(OpARM64MOVHstoreidx) - v.AddArg(ptr0) - v.AddArg(idx0) - v0 := b.NewValue0(v.Pos, OpARM64REV16W, w.Type) - v0.AddArg(w) - v.AddArg(v0) + v.reset(OpARM64MOVHloadidx2) + v.AddArg(ptr) + v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVBstore [1] {s} (ADD idx1 ptr1) w x:(MOVBstoreidx ptr0 idx0 (SRLconst [8] w) mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVHstoreidx ptr0 idx0 (REV16W w) mem) + // match: (MOVHloadidx (ADD idx idx) ptr mem) + // result: (MOVHloadidx2 ptr idx mem) for { - if v.AuxInt != 1 { - break - } - s := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } - ptr1 := v_0.Args[1] - idx1 := v_0.Args[0] - w := v.Args[1] - x := v.Args[2] - if x.Op != OpARM64MOVBstoreidx { - break - } - mem := x.Args[3] - ptr0 := x.Args[0] - idx0 := x.Args[1] - x_2 := x.Args[2] - if x_2.Op != OpARM64SRLconst || x_2.AuxInt != 8 || w != x_2.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + idx := v_0.Args[1] + if idx != v_0.Args[0] { break } - v.reset(OpARM64MOVHstoreidx) - v.AddArg(ptr0) - v.AddArg(idx0) - v0 := b.NewValue0(v.Pos, OpARM64REV16W, w.Type) - v0.AddArg(w) - v.AddArg(v0) + ptr := v.Args[1] + v.reset(OpARM64MOVHloadidx2) + v.AddArg(ptr) + v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVBstore [i] {s} ptr w x:(MOVBstore [i-1] {s} ptr (UBFX [armBFAuxInt(8, 8)] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHstore [i-1] {s} ptr (REV16W w) mem) + // match: (MOVHloadidx ptr idx (MOVHstorezeroidx ptr2 idx2 _)) + // cond: (isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) + // result: (MOVDconst [0]) for { - i := v.AuxInt - s := v.Aux _ = v.Args[2] ptr := v.Args[0] - w := v.Args[1] - x := v.Args[2] - if x.Op != OpARM64MOVBstore || x.AuxInt != i-1 || x.Aux != s { + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVHstorezeroidx { break } - mem := x.Args[2] - if ptr != x.Args[0] { + _ = v_2.Args[2] + ptr2 := v_2.Args[0] + idx2 := v_2.Args[1] + if !(isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) { break } - x_1 := x.Args[1] - if x_1.Op != OpARM64UBFX || x_1.AuxInt != armBFAuxInt(8, 8) || w != x_1.Args[0] || !(x.Uses == 1 && clobber(x)) { + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 + return true + } + return false +} +func rewriteValueARM64_OpARM64MOVHloadidx2_0(v *Value) bool { + // match: (MOVHloadidx2 ptr (MOVDconst [c]) mem) + // result: (MOVHload [c<<1] ptr mem) + for { + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVHstore) - v.AuxInt = i - 1 - v.Aux = s + c := v_1.AuxInt + v.reset(OpARM64MOVHload) + v.AuxInt = c << 1 v.AddArg(ptr) - v0 := b.NewValue0(x.Pos, OpARM64REV16W, w.Type) - v0.AddArg(w) - v.AddArg(v0) v.AddArg(mem) return true } - // match: (MOVBstore [1] {s} (ADD ptr1 idx1) w x:(MOVBstoreidx ptr0 idx0 (UBFX [armBFAuxInt(8, 8)] w) mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVHstoreidx ptr0 idx0 (REV16W w) mem) + // match: (MOVHloadidx2 ptr idx (MOVHstorezeroidx2 ptr2 idx2 _)) + // cond: isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) + // result: (MOVDconst [0]) for { - if v.AuxInt != 1 { - break - } - s := v.Aux _ = v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { - break - } - idx1 := v_0.Args[1] - ptr1 := v_0.Args[0] - w := v.Args[1] - x := v.Args[2] - if x.Op != OpARM64MOVBstoreidx { + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVHstorezeroidx2 { break } - mem := x.Args[3] - ptr0 := x.Args[0] - idx0 := x.Args[1] - x_2 := x.Args[2] - if x_2.Op != OpARM64UBFX || x_2.AuxInt != armBFAuxInt(8, 8) || w != x_2.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + _ = v_2.Args[2] + ptr2 := v_2.Args[0] + idx2 := v_2.Args[1] + if !(isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2)) { break } - v.reset(OpARM64MOVHstoreidx) - v.AddArg(ptr0) - v.AddArg(idx0) - v0 := b.NewValue0(v.Pos, OpARM64REV16W, w.Type) - v0.AddArg(w) - v.AddArg(v0) - v.AddArg(mem) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } - // match: (MOVBstore [1] {s} (ADD idx1 ptr1) w x:(MOVBstoreidx ptr0 idx0 (UBFX [armBFAuxInt(8, 8)] w) mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVHstoreidx ptr0 idx0 (REV16W w) mem) + return false +} +func rewriteValueARM64_OpARM64MOVHreg_0(v *Value) bool { + // match: (MOVHreg x:(MOVBload _ _)) + // result: (MOVDreg x) for { - if v.AuxInt != 1 { - break - } - s := v.Aux - _ = v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { + x := v.Args[0] + if x.Op != OpARM64MOVBload { break } - ptr1 := v_0.Args[1] - idx1 := v_0.Args[0] - w := v.Args[1] - x := v.Args[2] - if x.Op != OpARM64MOVBstoreidx { + _ = x.Args[1] + v.reset(OpARM64MOVDreg) + v.AddArg(x) + return true + } + // match: (MOVHreg x:(MOVBUload _ _)) + // result: (MOVDreg x) + for { + x := v.Args[0] + if x.Op != OpARM64MOVBUload { break } - mem := x.Args[3] - ptr0 := x.Args[0] - idx0 := x.Args[1] - x_2 := x.Args[2] - if x_2.Op != OpARM64UBFX || x_2.AuxInt != armBFAuxInt(8, 8) || w != x_2.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + _ = x.Args[1] + v.reset(OpARM64MOVDreg) + v.AddArg(x) + return true + } + // match: (MOVHreg x:(MOVHload _ _)) + // result: (MOVDreg x) + for { + x := v.Args[0] + if x.Op != OpARM64MOVHload { break } - v.reset(OpARM64MOVHstoreidx) - v.AddArg(ptr0) - v.AddArg(idx0) - v0 := b.NewValue0(v.Pos, OpARM64REV16W, w.Type) - v0.AddArg(w) - v.AddArg(v0) - v.AddArg(mem) + _ = x.Args[1] + v.reset(OpARM64MOVDreg) + v.AddArg(x) return true } - // match: (MOVBstore [i] {s} ptr w x:(MOVBstore [i-1] {s} ptr (SRLconst [8] (MOVDreg w)) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHstore [i-1] {s} ptr (REV16W w) mem) + // match: (MOVHreg x:(MOVBloadidx _ _ _)) + // result: (MOVDreg x) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - ptr := v.Args[0] - w := v.Args[1] - x := v.Args[2] - if x.Op != OpARM64MOVBstore || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[2] - if ptr != x.Args[0] { - break - } - x_1 := x.Args[1] - if x_1.Op != OpARM64SRLconst || x_1.AuxInt != 8 { - break - } - x_1_0 := x_1.Args[0] - if x_1_0.Op != OpARM64MOVDreg || w != x_1_0.Args[0] || !(x.Uses == 1 && clobber(x)) { + x := v.Args[0] + if x.Op != OpARM64MOVBloadidx { break } - v.reset(OpARM64MOVHstore) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(ptr) - v0 := b.NewValue0(x.Pos, OpARM64REV16W, w.Type) - v0.AddArg(w) - v.AddArg(v0) - v.AddArg(mem) + _ = x.Args[2] + v.reset(OpARM64MOVDreg) + v.AddArg(x) return true } - return false -} -func rewriteValueARM64_OpARM64MOVBstore_50(v *Value) bool { - b := v.Block - // match: (MOVBstore [1] {s} (ADD ptr1 idx1) w x:(MOVBstoreidx ptr0 idx0 (SRLconst [8] (MOVDreg w)) mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVHstoreidx ptr0 idx0 (REV16W w) mem) + // match: (MOVHreg x:(MOVBUloadidx _ _ _)) + // result: (MOVDreg x) for { - if v.AuxInt != 1 { + x := v.Args[0] + if x.Op != OpARM64MOVBUloadidx { break } - s := v.Aux - _ = v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { + _ = x.Args[2] + v.reset(OpARM64MOVDreg) + v.AddArg(x) + return true + } + // match: (MOVHreg x:(MOVHloadidx _ _ _)) + // result: (MOVDreg x) + for { + x := v.Args[0] + if x.Op != OpARM64MOVHloadidx { break } - idx1 := v_0.Args[1] - ptr1 := v_0.Args[0] - w := v.Args[1] - x := v.Args[2] - if x.Op != OpARM64MOVBstoreidx { + _ = x.Args[2] + v.reset(OpARM64MOVDreg) + v.AddArg(x) + return true + } + // match: (MOVHreg x:(MOVHloadidx2 _ _ _)) + // result: (MOVDreg x) + for { + x := v.Args[0] + if x.Op != OpARM64MOVHloadidx2 { break } - mem := x.Args[3] - ptr0 := x.Args[0] - idx0 := x.Args[1] - x_2 := x.Args[2] - if x_2.Op != OpARM64SRLconst || x_2.AuxInt != 8 { + _ = x.Args[2] + v.reset(OpARM64MOVDreg) + v.AddArg(x) + return true + } + // match: (MOVHreg x:(MOVBreg _)) + // result: (MOVDreg x) + for { + x := v.Args[0] + if x.Op != OpARM64MOVBreg { break } - x_2_0 := x_2.Args[0] - if x_2_0.Op != OpARM64MOVDreg || w != x_2_0.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + v.reset(OpARM64MOVDreg) + v.AddArg(x) + return true + } + // match: (MOVHreg x:(MOVBUreg _)) + // result: (MOVDreg x) + for { + x := v.Args[0] + if x.Op != OpARM64MOVBUreg { break } - v.reset(OpARM64MOVHstoreidx) - v.AddArg(ptr0) - v.AddArg(idx0) - v0 := b.NewValue0(v.Pos, OpARM64REV16W, w.Type) - v0.AddArg(w) - v.AddArg(v0) - v.AddArg(mem) + v.reset(OpARM64MOVDreg) + v.AddArg(x) return true } - // match: (MOVBstore [1] {s} (ADD idx1 ptr1) w x:(MOVBstoreidx ptr0 idx0 (SRLconst [8] (MOVDreg w)) mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVHstoreidx ptr0 idx0 (REV16W w) mem) + // match: (MOVHreg x:(MOVHreg _)) + // result: (MOVDreg x) for { - if v.AuxInt != 1 { + x := v.Args[0] + if x.Op != OpARM64MOVHreg { break } - s := v.Aux - _ = v.Args[2] + v.reset(OpARM64MOVDreg) + v.AddArg(x) + return true + } + return false +} +func rewriteValueARM64_OpARM64MOVHreg_10(v *Value) bool { + // match: (MOVHreg (MOVDconst [c])) + // result: (MOVDconst [int64(int16(c))]) + for { v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { - break - } - ptr1 := v_0.Args[1] - idx1 := v_0.Args[0] - w := v.Args[1] - x := v.Args[2] - if x.Op != OpARM64MOVBstoreidx { + if v_0.Op != OpARM64MOVDconst { break } - mem := x.Args[3] - ptr0 := x.Args[0] - idx0 := x.Args[1] - x_2 := x.Args[2] - if x_2.Op != OpARM64SRLconst || x_2.AuxInt != 8 { + c := v_0.AuxInt + v.reset(OpARM64MOVDconst) + v.AuxInt = int64(int16(c)) + return true + } + // match: (MOVHreg (SLLconst [lc] x)) + // cond: lc < 16 + // result: (SBFIZ [armBFAuxInt(lc, 16-lc)] x) + for { + v_0 := v.Args[0] + if v_0.Op != OpARM64SLLconst { break } - x_2_0 := x_2.Args[0] - if x_2_0.Op != OpARM64MOVDreg || w != x_2_0.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + lc := v_0.AuxInt + x := v_0.Args[0] + if !(lc < 16) { break } - v.reset(OpARM64MOVHstoreidx) - v.AddArg(ptr0) - v.AddArg(idx0) - v0 := b.NewValue0(v.Pos, OpARM64REV16W, w.Type) - v0.AddArg(w) - v.AddArg(v0) - v.AddArg(mem) + v.reset(OpARM64SBFIZ) + v.AuxInt = armBFAuxInt(lc, 16-lc) + v.AddArg(x) return true } - // match: (MOVBstore [i] {s} ptr w x:(MOVBstore [i-1] {s} ptr (UBFX [armBFAuxInt(8, 24)] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHstore [i-1] {s} ptr (REV16W w) mem) + return false +} +func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) + // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVHstore [off1+off2] {sym} ptr val mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - ptr := v.Args[0] - w := v.Args[1] - x := v.Args[2] - if x.Op != OpARM64MOVBstore || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[2] - if ptr != x.Args[0] { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADDconst { break } - x_1 := x.Args[1] - if x_1.Op != OpARM64UBFX || x_1.AuxInt != armBFAuxInt(8, 24) || w != x_1.Args[0] || !(x.Uses == 1 && clobber(x)) { + off2 := v_0.AuxInt + ptr := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } v.reset(OpARM64MOVHstore) - v.AuxInt = i - 1 - v.Aux = s + v.AuxInt = off1 + off2 + v.Aux = sym v.AddArg(ptr) - v0 := b.NewValue0(x.Pos, OpARM64REV16W, w.Type) - v0.AddArg(w) - v.AddArg(v0) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVBstore [1] {s} (ADD ptr1 idx1) w x:(MOVBstoreidx ptr0 idx0 (UBFX [armBFAuxInt(8, 24)] w) mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVHstoreidx ptr0 idx0 (REV16W w) mem) + // match: (MOVHstore [off] {sym} (ADD ptr idx) val mem) + // cond: off == 0 && sym == nil + // result: (MOVHstoreidx ptr idx val mem) for { - if v.AuxInt != 1 { - break - } - s := v.Aux - _ = v.Args[2] + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } - idx1 := v_0.Args[1] - ptr1 := v_0.Args[0] - w := v.Args[1] - x := v.Args[2] - if x.Op != OpARM64MOVBstoreidx { - break - } - mem := x.Args[3] - ptr0 := x.Args[0] - idx0 := x.Args[1] - x_2 := x.Args[2] - if x_2.Op != OpARM64UBFX || x_2.AuxInt != armBFAuxInt(8, 24) || w != x_2.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + idx := v_0.Args[1] + ptr := v_0.Args[0] + val := v.Args[1] + if !(off == 0 && sym == nil) { break } v.reset(OpARM64MOVHstoreidx) - v.AddArg(ptr0) - v.AddArg(idx0) - v0 := b.NewValue0(v.Pos, OpARM64REV16W, w.Type) - v0.AddArg(w) - v.AddArg(v0) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVBstore [1] {s} (ADD idx1 ptr1) w x:(MOVBstoreidx ptr0 idx0 (UBFX [armBFAuxInt(8, 24)] w) mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVHstoreidx ptr0 idx0 (REV16W w) mem) + // match: (MOVHstore [off] {sym} (ADDshiftLL [1] ptr idx) val mem) + // cond: off == 0 && sym == nil + // result: (MOVHstoreidx2 ptr idx val mem) for { - if v.AuxInt != 1 { - break - } - s := v.Aux - _ = v.Args[2] + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { - break - } - ptr1 := v_0.Args[1] - idx1 := v_0.Args[0] - w := v.Args[1] - x := v.Args[2] - if x.Op != OpARM64MOVBstoreidx { + if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 1 { break } - mem := x.Args[3] - ptr0 := x.Args[0] - idx0 := x.Args[1] - x_2 := x.Args[2] - if x_2.Op != OpARM64UBFX || x_2.AuxInt != armBFAuxInt(8, 24) || w != x_2.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + idx := v_0.Args[1] + ptr := v_0.Args[0] + val := v.Args[1] + if !(off == 0 && sym == nil) { break } - v.reset(OpARM64MOVHstoreidx) - v.AddArg(ptr0) - v.AddArg(idx0) - v0 := b.NewValue0(v.Pos, OpARM64REV16W, w.Type) - v0.AddArg(w) - v.AddArg(v0) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueARM64_OpARM64MOVBstoreidx_0(v *Value) bool { - // match: (MOVBstoreidx ptr (MOVDconst [c]) val mem) - // result: (MOVBstore [c] ptr val mem) - for { - mem := v.Args[3] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - val := v.Args[2] - v.reset(OpARM64MOVBstore) - v.AuxInt = c + v.reset(OpARM64MOVHstoreidx2) v.AddArg(ptr) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVBstoreidx (MOVDconst [c]) idx val mem) - // result: (MOVBstore [c] idx val mem) - for { - mem := v.Args[3] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - idx := v.Args[1] - val := v.Args[2] - v.reset(OpARM64MOVBstore) - v.AuxInt = c v.AddArg(idx) v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVBstoreidx ptr idx (MOVDconst [0]) mem) - // result: (MOVBstorezeroidx ptr idx mem) + // match: (MOVHstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) for { - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 0 { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDaddr { break } - v.reset(OpARM64MOVBstorezeroidx) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVBstoreidx ptr idx (MOVBreg x) mem) - // result: (MOVBstoreidx ptr idx x mem) - for { - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVBreg { + off2 := v_0.AuxInt + sym2 := v_0.Aux + ptr := v_0.Args[0] + val := v.Args[1] + if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - x := v_2.Args[0] - v.reset(OpARM64MOVBstoreidx) + v.reset(OpARM64MOVHstore) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(x) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVBstoreidx ptr idx (MOVBUreg x) mem) - // result: (MOVBstoreidx ptr idx x mem) + // match: (MOVHstore [off] {sym} ptr (MOVDconst [0]) mem) + // result: (MOVHstorezero [off] {sym} ptr mem) for { - mem := v.Args[3] + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] ptr := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVBUreg { + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 0 { break } - x := v_2.Args[0] - v.reset(OpARM64MOVBstoreidx) + v.reset(OpARM64MOVHstorezero) + v.AuxInt = off + v.Aux = sym v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(x) v.AddArg(mem) return true } - // match: (MOVBstoreidx ptr idx (MOVHreg x) mem) - // result: (MOVBstoreidx ptr idx x mem) + // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem) + // result: (MOVHstore [off] {sym} ptr x mem) for { - mem := v.Args[3] + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] ptr := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVHreg { + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVHreg { break } - x := v_2.Args[0] - v.reset(OpARM64MOVBstoreidx) + x := v_1.Args[0] + v.reset(OpARM64MOVHstore) + v.AuxInt = off + v.Aux = sym v.AddArg(ptr) - v.AddArg(idx) v.AddArg(x) v.AddArg(mem) return true } - // match: (MOVBstoreidx ptr idx (MOVHUreg x) mem) - // result: (MOVBstoreidx ptr idx x mem) + // match: (MOVHstore [off] {sym} ptr (MOVHUreg x) mem) + // result: (MOVHstore [off] {sym} ptr x mem) for { - mem := v.Args[3] + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] ptr := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVHUreg { + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVHUreg { break } - x := v_2.Args[0] - v.reset(OpARM64MOVBstoreidx) + x := v_1.Args[0] + v.reset(OpARM64MOVHstore) + v.AuxInt = off + v.Aux = sym v.AddArg(ptr) - v.AddArg(idx) v.AddArg(x) v.AddArg(mem) return true } - // match: (MOVBstoreidx ptr idx (MOVWreg x) mem) - // result: (MOVBstoreidx ptr idx x mem) + // match: (MOVHstore [off] {sym} ptr (MOVWreg x) mem) + // result: (MOVHstore [off] {sym} ptr x mem) for { - mem := v.Args[3] + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] ptr := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVWreg { + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVWreg { break } - x := v_2.Args[0] - v.reset(OpARM64MOVBstoreidx) + x := v_1.Args[0] + v.reset(OpARM64MOVHstore) + v.AuxInt = off + v.Aux = sym v.AddArg(ptr) - v.AddArg(idx) v.AddArg(x) v.AddArg(mem) return true } - // match: (MOVBstoreidx ptr idx (MOVWUreg x) mem) - // result: (MOVBstoreidx ptr idx x mem) + // match: (MOVHstore [off] {sym} ptr (MOVWUreg x) mem) + // result: (MOVHstore [off] {sym} ptr x mem) for { - mem := v.Args[3] + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] ptr := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVWUreg { + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVWUreg { break } - x := v_2.Args[0] - v.reset(OpARM64MOVBstoreidx) + x := v_1.Args[0] + v.reset(OpARM64MOVHstore) + v.AuxInt = off + v.Aux = sym v.AddArg(ptr) - v.AddArg(idx) v.AddArg(x) v.AddArg(mem) return true } - // match: (MOVBstoreidx ptr (ADDconst [1] idx) (SRLconst [8] w) x:(MOVBstoreidx ptr idx w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHstoreidx ptr idx w mem) + // match: (MOVHstore [i] {s} ptr0 (SRLconst [16] w) x:(MOVHstore [i-2] {s} ptr1 w mem)) + // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) + // result: (MOVWstore [i-2] {s} ptr0 w mem) for { - _ = v.Args[3] - ptr := v.Args[0] + i := v.AuxInt + s := v.Aux + _ = v.Args[2] + ptr0 := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64ADDconst || v_1.AuxInt != 1 { - break - } - idx := v_1.Args[0] - v_2 := v.Args[2] - if v_2.Op != OpARM64SRLconst || v_2.AuxInt != 8 { + if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 16 { break } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpARM64MOVBstoreidx { + w := v_1.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVHstore || x.AuxInt != i-2 || x.Aux != s { break } - mem := x.Args[3] - if ptr != x.Args[0] || idx != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + mem := x.Args[2] + ptr1 := x.Args[0] + if w != x.Args[1] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { break } - v.reset(OpARM64MOVHstoreidx) - v.AddArg(ptr) - v.AddArg(idx) + v.reset(OpARM64MOVWstore) + v.AuxInt = i - 2 + v.Aux = s + v.AddArg(ptr0) v.AddArg(w) v.AddArg(mem) return true } return false } -func rewriteValueARM64_OpARM64MOVBstoreidx_10(v *Value) bool { +func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { b := v.Block - // match: (MOVBstoreidx ptr (ADDconst [3] idx) w x0:(MOVBstoreidx ptr (ADDconst [2] idx) (UBFX [armBFAuxInt(8, 24)] w) x1:(MOVBstoreidx ptr (ADDconst [1] idx) (UBFX [armBFAuxInt(16, 16)] w) x2:(MOVBstoreidx ptr idx (UBFX [armBFAuxInt(24, 8)] w) mem)))) - // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2) - // result: (MOVWstoreidx ptr idx (REVW w) mem) + // match: (MOVHstore [2] {s} (ADD ptr0 idx0) (SRLconst [16] w) x:(MOVHstoreidx ptr1 idx1 w mem)) + // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) + // result: (MOVWstoreidx ptr1 idx1 w mem) for { - _ = v.Args[3] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64ADDconst || v_1.AuxInt != 3 { + if v.AuxInt != 2 { break } - idx := v_1.Args[0] - w := v.Args[2] - x0 := v.Args[3] - if x0.Op != OpARM64MOVBstoreidx { + s := v.Aux + _ = v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADD { break } - _ = x0.Args[3] - if ptr != x0.Args[0] { + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr0 := v_0.Args[_i0] + idx0 := v_0.Args[1^_i0] + v_1 := v.Args[1] + if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 16 { + continue + } + w := v_1.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVHstoreidx { + continue + } + mem := x.Args[3] + ptr1 := x.Args[0] + idx1 := x.Args[1] + if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + continue + } + v.reset(OpARM64MOVWstoreidx) + v.AddArg(ptr1) + v.AddArg(idx1) + v.AddArg(w) + v.AddArg(mem) + return true + } + break + } + // match: (MOVHstore [2] {s} (ADDshiftLL [1] ptr0 idx0) (SRLconst [16] w) x:(MOVHstoreidx2 ptr1 idx1 w mem)) + // cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x) + // result: (MOVWstoreidx ptr1 (SLLconst [1] idx1) w mem) + for { + if v.AuxInt != 2 { break } - x0_1 := x0.Args[1] - if x0_1.Op != OpARM64ADDconst || x0_1.AuxInt != 2 || idx != x0_1.Args[0] { + s := v.Aux + _ = v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 1 { break } - x0_2 := x0.Args[2] - if x0_2.Op != OpARM64UBFX || x0_2.AuxInt != armBFAuxInt(8, 24) || w != x0_2.Args[0] { - break - } - x1 := x0.Args[3] - if x1.Op != OpARM64MOVBstoreidx { - break - } - _ = x1.Args[3] - if ptr != x1.Args[0] { - break - } - x1_1 := x1.Args[1] - if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 1 || idx != x1_1.Args[0] { - break - } - x1_2 := x1.Args[2] - if x1_2.Op != OpARM64UBFX || x1_2.AuxInt != armBFAuxInt(16, 16) || w != x1_2.Args[0] { - break - } - x2 := x1.Args[3] - if x2.Op != OpARM64MOVBstoreidx { + idx0 := v_0.Args[1] + ptr0 := v_0.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 16 { break } - mem := x2.Args[3] - if ptr != x2.Args[0] || idx != x2.Args[1] { + w := v_1.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVHstoreidx2 { break } - x2_2 := x2.Args[2] - if x2_2.Op != OpARM64UBFX || x2_2.AuxInt != armBFAuxInt(24, 8) || w != x2_2.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2)) { + mem := x.Args[3] + ptr1 := x.Args[0] + idx1 := x.Args[1] + if w != x.Args[2] || !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) { break } v.reset(OpARM64MOVWstoreidx) - v.AddArg(ptr) - v.AddArg(idx) - v0 := b.NewValue0(v.Pos, OpARM64REVW, w.Type) - v0.AddArg(w) + v.AddArg(ptr1) + v0 := b.NewValue0(v.Pos, OpARM64SLLconst, idx1.Type) + v0.AuxInt = 1 + v0.AddArg(idx1) v.AddArg(v0) + v.AddArg(w) v.AddArg(mem) return true } - // match: (MOVBstoreidx ptr idx w x0:(MOVBstoreidx ptr (ADDconst [1] idx) (UBFX [armBFAuxInt(8, 24)] w) x1:(MOVBstoreidx ptr (ADDconst [2] idx) (UBFX [armBFAuxInt(16, 16)] w) x2:(MOVBstoreidx ptr (ADDconst [3] idx) (UBFX [armBFAuxInt(24, 8)] w) mem)))) - // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2) - // result: (MOVWstoreidx ptr idx w mem) + // match: (MOVHstore [i] {s} ptr0 (UBFX [armBFAuxInt(16, 16)] w) x:(MOVHstore [i-2] {s} ptr1 w mem)) + // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) + // result: (MOVWstore [i-2] {s} ptr0 w mem) for { - _ = v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] - w := v.Args[2] - x0 := v.Args[3] - if x0.Op != OpARM64MOVBstoreidx { - break - } - _ = x0.Args[3] - if ptr != x0.Args[0] { + i := v.AuxInt + s := v.Aux + _ = v.Args[2] + ptr0 := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64UBFX || v_1.AuxInt != armBFAuxInt(16, 16) { break } - x0_1 := x0.Args[1] - if x0_1.Op != OpARM64ADDconst || x0_1.AuxInt != 1 || idx != x0_1.Args[0] { + w := v_1.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVHstore || x.AuxInt != i-2 || x.Aux != s { break } - x0_2 := x0.Args[2] - if x0_2.Op != OpARM64UBFX || x0_2.AuxInt != armBFAuxInt(8, 24) || w != x0_2.Args[0] { + mem := x.Args[2] + ptr1 := x.Args[0] + if w != x.Args[1] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { break } - x1 := x0.Args[3] - if x1.Op != OpARM64MOVBstoreidx { + v.reset(OpARM64MOVWstore) + v.AuxInt = i - 2 + v.Aux = s + v.AddArg(ptr0) + v.AddArg(w) + v.AddArg(mem) + return true + } + // match: (MOVHstore [2] {s} (ADD ptr0 idx0) (UBFX [armBFAuxInt(16, 16)] w) x:(MOVHstoreidx ptr1 idx1 w mem)) + // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) + // result: (MOVWstoreidx ptr1 idx1 w mem) + for { + if v.AuxInt != 2 { break } - _ = x1.Args[3] - if ptr != x1.Args[0] { + s := v.Aux + _ = v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADD { break } - x1_1 := x1.Args[1] - if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 2 || idx != x1_1.Args[0] { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr0 := v_0.Args[_i0] + idx0 := v_0.Args[1^_i0] + v_1 := v.Args[1] + if v_1.Op != OpARM64UBFX || v_1.AuxInt != armBFAuxInt(16, 16) { + continue + } + w := v_1.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVHstoreidx { + continue + } + mem := x.Args[3] + ptr1 := x.Args[0] + idx1 := x.Args[1] + if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + continue + } + v.reset(OpARM64MOVWstoreidx) + v.AddArg(ptr1) + v.AddArg(idx1) + v.AddArg(w) + v.AddArg(mem) + return true } - x1_2 := x1.Args[2] - if x1_2.Op != OpARM64UBFX || x1_2.AuxInt != armBFAuxInt(16, 16) || w != x1_2.Args[0] { + break + } + // match: (MOVHstore [2] {s} (ADDshiftLL [1] ptr0 idx0) (UBFX [armBFAuxInt(16, 16)] w) x:(MOVHstoreidx2 ptr1 idx1 w mem)) + // cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x) + // result: (MOVWstoreidx ptr1 (SLLconst [1] idx1) w mem) + for { + if v.AuxInt != 2 { break } - x2 := x1.Args[3] - if x2.Op != OpARM64MOVBstoreidx { + s := v.Aux + _ = v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 1 { break } - mem := x2.Args[3] - if ptr != x2.Args[0] { + idx0 := v_0.Args[1] + ptr0 := v_0.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64UBFX || v_1.AuxInt != armBFAuxInt(16, 16) { break } - x2_1 := x2.Args[1] - if x2_1.Op != OpARM64ADDconst || x2_1.AuxInt != 3 || idx != x2_1.Args[0] { + w := v_1.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVHstoreidx2 { break } - x2_2 := x2.Args[2] - if x2_2.Op != OpARM64UBFX || x2_2.AuxInt != armBFAuxInt(24, 8) || w != x2_2.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2)) { + mem := x.Args[3] + ptr1 := x.Args[0] + idx1 := x.Args[1] + if w != x.Args[2] || !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) { break } v.reset(OpARM64MOVWstoreidx) - v.AddArg(ptr) - v.AddArg(idx) + v.AddArg(ptr1) + v0 := b.NewValue0(v.Pos, OpARM64SLLconst, idx1.Type) + v0.AuxInt = 1 + v0.AddArg(idx1) + v.AddArg(v0) v.AddArg(w) v.AddArg(mem) return true } - // match: (MOVBstoreidx ptr (ADDconst [1] idx) w x:(MOVBstoreidx ptr idx (UBFX [armBFAuxInt(8, 8)] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHstoreidx ptr idx (REV16W w) mem) + // match: (MOVHstore [i] {s} ptr0 (SRLconst [16] (MOVDreg w)) x:(MOVHstore [i-2] {s} ptr1 w mem)) + // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) + // result: (MOVWstore [i-2] {s} ptr0 w mem) for { - _ = v.Args[3] - ptr := v.Args[0] + i := v.AuxInt + s := v.Aux + _ = v.Args[2] + ptr0 := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64ADDconst || v_1.AuxInt != 1 { + if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 16 { break } - idx := v_1.Args[0] - w := v.Args[2] - x := v.Args[3] - if x.Op != OpARM64MOVBstoreidx { + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpARM64MOVDreg { break } - mem := x.Args[3] - if ptr != x.Args[0] || idx != x.Args[1] { + w := v_1_0.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVHstore || x.AuxInt != i-2 || x.Aux != s { break } - x_2 := x.Args[2] - if x_2.Op != OpARM64UBFX || x_2.AuxInt != armBFAuxInt(8, 8) || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + mem := x.Args[2] + ptr1 := x.Args[0] + if w != x.Args[1] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { break } - v.reset(OpARM64MOVHstoreidx) - v.AddArg(ptr) - v.AddArg(idx) - v0 := b.NewValue0(v.Pos, OpARM64REV16W, w.Type) - v0.AddArg(w) - v.AddArg(v0) + v.reset(OpARM64MOVWstore) + v.AuxInt = i - 2 + v.Aux = s + v.AddArg(ptr0) + v.AddArg(w) v.AddArg(mem) return true } - // match: (MOVBstoreidx ptr idx w x:(MOVBstoreidx ptr (ADDconst [1] idx) (UBFX [armBFAuxInt(8, 8)] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHstoreidx ptr idx w mem) + // match: (MOVHstore [2] {s} (ADD ptr0 idx0) (SRLconst [16] (MOVDreg w)) x:(MOVHstoreidx ptr1 idx1 w mem)) + // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) + // result: (MOVWstoreidx ptr1 idx1 w mem) for { - _ = v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] - w := v.Args[2] - x := v.Args[3] - if x.Op != OpARM64MOVBstoreidx { - break - } - mem := x.Args[3] - if ptr != x.Args[0] { + if v.AuxInt != 2 { break } - x_1 := x.Args[1] - if x_1.Op != OpARM64ADDconst || x_1.AuxInt != 1 || idx != x_1.Args[0] { + s := v.Aux + _ = v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADD { break } - x_2 := x.Args[2] - if x_2.Op != OpARM64UBFX || x_2.AuxInt != armBFAuxInt(8, 8) || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr0 := v_0.Args[_i0] + idx0 := v_0.Args[1^_i0] + v_1 := v.Args[1] + if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 16 { + continue + } + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpARM64MOVDreg { + continue + } + w := v_1_0.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVHstoreidx { + continue + } + mem := x.Args[3] + ptr1 := x.Args[0] + idx1 := x.Args[1] + if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + continue + } + v.reset(OpARM64MOVWstoreidx) + v.AddArg(ptr1) + v.AddArg(idx1) + v.AddArg(w) + v.AddArg(mem) + return true } - v.reset(OpARM64MOVHstoreidx) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) - return true + break } - return false -} -func rewriteValueARM64_OpARM64MOVBstorezero_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (MOVBstorezero [off1] {sym} (ADDconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVBstorezero [off1+off2] {sym} ptr mem) + // match: (MOVHstore [2] {s} (ADDshiftLL [1] ptr0 idx0) (SRLconst [16] (MOVDreg w)) x:(MOVHstoreidx2 ptr1 idx1 w mem)) + // cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x) + // result: (MOVWstoreidx ptr1 (SLLconst [1] idx1) w mem) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADDconst { - break - } - off2 := v_0.AuxInt - ptr := v_0.Args[0] - if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + if v.AuxInt != 2 { break } - v.reset(OpARM64MOVBstorezero) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MOVBstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVBstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) - for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] + s := v.Aux + _ = v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDaddr { + if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 1 { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - ptr := v_0.Args[0] - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + idx0 := v_0.Args[1] + ptr0 := v_0.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 16 { break } - v.reset(OpARM64MOVBstorezero) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MOVBstorezero [off] {sym} (ADD ptr idx) mem) - // cond: off == 0 && sym == nil - // result: (MOVBstorezeroidx ptr idx mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpARM64MOVDreg { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(off == 0 && sym == nil) { + w := v_1_0.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVHstoreidx2 { break } - v.reset(OpARM64MOVBstorezeroidx) - v.AddArg(ptr) - v.AddArg(idx) + mem := x.Args[3] + ptr1 := x.Args[0] + idx1 := x.Args[1] + if w != x.Args[2] || !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) { + break + } + v.reset(OpARM64MOVWstoreidx) + v.AddArg(ptr1) + v0 := b.NewValue0(v.Pos, OpARM64SLLconst, idx1.Type) + v0.AuxInt = 1 + v0.AddArg(idx1) + v.AddArg(v0) + v.AddArg(w) v.AddArg(mem) return true } - // match: (MOVBstorezero [i] {s} ptr0 x:(MOVBstorezero [j] {s} ptr1 mem)) - // cond: x.Uses == 1 && areAdjacentOffsets(i,j,1) && is32Bit(min(i,j)) && isSamePtr(ptr0, ptr1) && clobber(x) - // result: (MOVHstorezero [min(i,j)] {s} ptr0 mem) + // match: (MOVHstore [i] {s} ptr0 (SRLconst [j] w) x:(MOVHstore [i-2] {s} ptr1 w0:(SRLconst [j-16] w) mem)) + // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) + // result: (MOVWstore [i-2] {s} ptr0 w0 mem) for { i := v.AuxInt s := v.Aux - _ = v.Args[1] + _ = v.Args[2] ptr0 := v.Args[0] - x := v.Args[1] - if x.Op != OpARM64MOVBstorezero { + v_1 := v.Args[1] + if v_1.Op != OpARM64SRLconst { break } - j := x.AuxInt - if x.Aux != s { + j := v_1.AuxInt + w := v_1.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVHstore || x.AuxInt != i-2 || x.Aux != s { break } - mem := x.Args[1] + mem := x.Args[2] ptr1 := x.Args[0] - if !(x.Uses == 1 && areAdjacentOffsets(i, j, 1) && is32Bit(min(i, j)) && isSamePtr(ptr0, ptr1) && clobber(x)) { + w0 := x.Args[1] + if w0.Op != OpARM64SRLconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { break } - v.reset(OpARM64MOVHstorezero) - v.AuxInt = min(i, j) + v.reset(OpARM64MOVWstore) + v.AuxInt = i - 2 v.Aux = s v.AddArg(ptr0) + v.AddArg(w0) v.AddArg(mem) return true } - // match: (MOVBstorezero [1] {s} (ADD ptr0 idx0) x:(MOVBstorezeroidx ptr1 idx1 mem)) + // match: (MOVHstore [2] {s} (ADD ptr0 idx0) (SRLconst [j] w) x:(MOVHstoreidx ptr1 idx1 w0:(SRLconst [j-16] w) mem)) // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVHstorezeroidx ptr1 idx1 mem) + // result: (MOVWstoreidx ptr1 idx1 w0 mem) for { - if v.AuxInt != 1 { + if v.AuxInt != 2 { break } s := v.Aux - _ = v.Args[1] + _ = v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } - idx0 := v_0.Args[1] - ptr0 := v_0.Args[0] - x := v.Args[1] - if x.Op != OpARM64MOVBstorezeroidx { - break - } - mem := x.Args[2] - ptr1 := x.Args[0] - idx1 := x.Args[1] - if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr0 := v_0.Args[_i0] + idx0 := v_0.Args[1^_i0] + v_1 := v.Args[1] + if v_1.Op != OpARM64SRLconst { + continue + } + j := v_1.AuxInt + w := v_1.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVHstoreidx { + continue + } + mem := x.Args[3] + ptr1 := x.Args[0] + idx1 := x.Args[1] + w0 := x.Args[2] + if w0.Op != OpARM64SRLconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + continue + } + v.reset(OpARM64MOVWstoreidx) + v.AddArg(ptr1) + v.AddArg(idx1) + v.AddArg(w0) + v.AddArg(mem) + return true } - v.reset(OpARM64MOVHstorezeroidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(mem) - return true + break } - // match: (MOVBstorezero [1] {s} (ADD idx0 ptr0) x:(MOVBstorezeroidx ptr1 idx1 mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVHstorezeroidx ptr1 idx1 mem) + return false +} +func rewriteValueARM64_OpARM64MOVHstore_20(v *Value) bool { + b := v.Block + // match: (MOVHstore [2] {s} (ADDshiftLL [1] ptr0 idx0) (SRLconst [j] w) x:(MOVHstoreidx2 ptr1 idx1 w0:(SRLconst [j-16] w) mem)) + // cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x) + // result: (MOVWstoreidx ptr1 (SLLconst [1] idx1) w0 mem) for { - if v.AuxInt != 1 { + if v.AuxInt != 2 { break } s := v.Aux - _ = v.Args[1] + _ = v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { + if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 1 { break } - ptr0 := v_0.Args[1] - idx0 := v_0.Args[0] - x := v.Args[1] - if x.Op != OpARM64MOVBstorezeroidx { + idx0 := v_0.Args[1] + ptr0 := v_0.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64SRLconst { break } - mem := x.Args[2] + j := v_1.AuxInt + w := v_1.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVHstoreidx2 { + break + } + mem := x.Args[3] ptr1 := x.Args[0] idx1 := x.Args[1] - if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + w0 := x.Args[2] + if w0.Op != OpARM64SRLconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) { break } - v.reset(OpARM64MOVHstorezeroidx) + v.reset(OpARM64MOVWstoreidx) v.AddArg(ptr1) - v.AddArg(idx1) + v0 := b.NewValue0(v.Pos, OpARM64SLLconst, idx1.Type) + v0.AuxInt = 1 + v0.AddArg(idx1) + v.AddArg(v0) + v.AddArg(w0) v.AddArg(mem) return true } return false } -func rewriteValueARM64_OpARM64MOVBstorezeroidx_0(v *Value) bool { - // match: (MOVBstorezeroidx ptr (MOVDconst [c]) mem) - // result: (MOVBstorezero [c] ptr mem) +func rewriteValueARM64_OpARM64MOVHstoreidx_0(v *Value) bool { + // match: (MOVHstoreidx ptr (MOVDconst [c]) val mem) + // result: (MOVHstore [c] ptr val mem) for { - mem := v.Args[2] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - v.reset(OpARM64MOVBstorezero) + val := v.Args[2] + v.reset(OpARM64MOVHstore) v.AuxInt = c v.AddArg(ptr) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVBstorezeroidx (MOVDconst [c]) idx mem) - // result: (MOVBstorezero [c] idx mem) + // match: (MOVHstoreidx (MOVDconst [c]) idx val mem) + // result: (MOVHstore [c] idx val mem) for { - mem := v.Args[2] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt idx := v.Args[1] - v.reset(OpARM64MOVBstorezero) + val := v.Args[2] + v.reset(OpARM64MOVHstore) v.AuxInt = c v.AddArg(idx) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVBstorezeroidx ptr (ADDconst [1] idx) x:(MOVBstorezeroidx ptr idx mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHstorezeroidx ptr idx mem) + // match: (MOVHstoreidx ptr (SLLconst [1] idx) val mem) + // result: (MOVHstoreidx2 ptr idx val mem) for { - _ = v.Args[2] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64ADDconst || v_1.AuxInt != 1 { + if v_1.Op != OpARM64SLLconst || v_1.AuxInt != 1 { break } idx := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVBstorezeroidx { - break - } - mem := x.Args[2] - if ptr != x.Args[0] || idx != x.Args[1] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpARM64MOVHstorezeroidx) + val := v.Args[2] + v.reset(OpARM64MOVHstoreidx2) v.AddArg(ptr) v.AddArg(idx) + v.AddArg(val) v.AddArg(mem) return true } - return false -} -func rewriteValueARM64_OpARM64MOVDload_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (MOVDload [off] {sym} ptr (FMOVDstore [off] {sym} ptr val _)) - // result: (FMOVDfpgp val) + // match: (MOVHstoreidx ptr (ADD idx idx) val mem) + // result: (MOVHstoreidx2 ptr idx val mem) for { - off := v.AuxInt - sym := v.Aux - _ = v.Args[1] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64FMOVDstore || v_1.AuxInt != off || v_1.Aux != sym { + if v_1.Op != OpARM64ADD { break } - _ = v_1.Args[2] - if ptr != v_1.Args[0] { + idx := v_1.Args[1] + if idx != v_1.Args[0] { break } - val := v_1.Args[1] - v.reset(OpARM64FMOVDfpgp) + val := v.Args[2] + v.reset(OpARM64MOVHstoreidx2) + v.AddArg(ptr) + v.AddArg(idx) v.AddArg(val) + v.AddArg(mem) return true } - // match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVDload [off1+off2] {sym} ptr mem) + // match: (MOVHstoreidx (SLLconst [1] idx) ptr val mem) + // result: (MOVHstoreidx2 ptr idx val mem) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[1] + mem := v.Args[3] v_0 := v.Args[0] - if v_0.Op != OpARM64ADDconst { - break - } - off2 := v_0.AuxInt - ptr := v_0.Args[0] - if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 1 { break } - v.reset(OpARM64MOVDload) - v.AuxInt = off1 + off2 - v.Aux = sym + idx := v_0.Args[0] + ptr := v.Args[1] + val := v.Args[2] + v.reset(OpARM64MOVHstoreidx2) v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVDload [off] {sym} (ADD ptr idx) mem) - // cond: off == 0 && sym == nil - // result: (MOVDloadidx ptr idx mem) + // match: (MOVHstoreidx (ADD idx idx) ptr val mem) + // result: (MOVHstoreidx2 ptr idx val mem) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(off == 0 && sym == nil) { + if idx != v_0.Args[0] { break } - v.reset(OpARM64MOVDloadidx) + ptr := v.Args[1] + val := v.Args[2] + v.reset(OpARM64MOVHstoreidx2) v.AddArg(ptr) v.AddArg(idx) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVDload [off] {sym} (ADDshiftLL [3] ptr idx) mem) - // cond: off == 0 && sym == nil - // result: (MOVDloadidx8 ptr idx mem) + // match: (MOVHstoreidx ptr idx (MOVDconst [0]) mem) + // result: (MOVHstorezeroidx ptr idx mem) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 3 { - break - } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(off == 0 && sym == nil) { + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 0 { break } - v.reset(OpARM64MOVDloadidx8) + v.reset(OpARM64MOVHstorezeroidx) v.AddArg(ptr) v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) + // match: (MOVHstoreidx ptr idx (MOVHreg x) mem) + // result: (MOVHstoreidx ptr idx x mem) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDaddr { - break - } - off2 := v_0.AuxInt - sym2 := v_0.Aux - ptr := v_0.Args[0] - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVHreg { break } - v.reset(OpARM64MOVDload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + x := v_2.Args[0] + v.reset(OpARM64MOVHstoreidx) v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(x) v.AddArg(mem) return true } - // match: (MOVDload [off] {sym} ptr (MOVDstorezero [off2] {sym2} ptr2 _)) - // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) - // result: (MOVDconst [0]) + // match: (MOVHstoreidx ptr idx (MOVHUreg x) mem) + // result: (MOVHstoreidx ptr idx x mem) for { - off := v.AuxInt - sym := v.Aux - _ = v.Args[1] + mem := v.Args[3] ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDstorezero { - break - } - off2 := v_1.AuxInt - sym2 := v_1.Aux - _ = v_1.Args[1] - ptr2 := v_1.Args[0] - if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVHUreg { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + x := v_2.Args[0] + v.reset(OpARM64MOVHstoreidx) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(x) + v.AddArg(mem) return true } - // match: (MOVDload [off] {sym} (SB) _) - // cond: symIsRO(sym) - // result: (MOVDconst [int64(read64(sym, off, config.BigEndian))]) + // match: (MOVHstoreidx ptr idx (MOVWreg x) mem) + // result: (MOVHstoreidx ptr idx x mem) for { - off := v.AuxInt - sym := v.Aux - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpSB || !(symIsRO(sym)) { + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVWreg { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = int64(read64(sym, off, config.BigEndian)) + x := v_2.Args[0] + v.reset(OpARM64MOVHstoreidx) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(x) + v.AddArg(mem) return true } return false } -func rewriteValueARM64_OpARM64MOVDloadidx_0(v *Value) bool { - // match: (MOVDloadidx ptr (MOVDconst [c]) mem) - // result: (MOVDload [c] ptr mem) +func rewriteValueARM64_OpARM64MOVHstoreidx_10(v *Value) bool { + // match: (MOVHstoreidx ptr idx (MOVWUreg x) mem) + // result: (MOVHstoreidx ptr idx x mem) for { - mem := v.Args[2] + mem := v.Args[3] ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVWUreg { break } - c := v_1.AuxInt - v.reset(OpARM64MOVDload) - v.AuxInt = c + x := v_2.Args[0] + v.reset(OpARM64MOVHstoreidx) v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(x) v.AddArg(mem) return true } - // match: (MOVDloadidx (MOVDconst [c]) ptr mem) - // result: (MOVDload [c] ptr mem) + // match: (MOVHstoreidx ptr (ADDconst [2] idx) (SRLconst [16] w) x:(MOVHstoreidx ptr idx w mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVWstoreidx ptr idx w mem) for { - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + _ = v.Args[3] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64ADDconst || v_1.AuxInt != 2 { break } - c := v_0.AuxInt - ptr := v.Args[1] - v.reset(OpARM64MOVDload) - v.AuxInt = c + idx := v_1.Args[0] + v_2 := v.Args[2] + if v_2.Op != OpARM64SRLconst || v_2.AuxInt != 16 { + break + } + w := v_2.Args[0] + x := v.Args[3] + if x.Op != OpARM64MOVHstoreidx { + break + } + mem := x.Args[3] + if ptr != x.Args[0] || idx != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + break + } + v.reset(OpARM64MOVWstoreidx) v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(w) v.AddArg(mem) return true } - // match: (MOVDloadidx ptr (SLLconst [3] idx) mem) - // result: (MOVDloadidx8 ptr idx mem) + return false +} +func rewriteValueARM64_OpARM64MOVHstoreidx2_0(v *Value) bool { + // match: (MOVHstoreidx2 ptr (MOVDconst [c]) val mem) + // result: (MOVHstore [c<<1] ptr val mem) for { - mem := v.Args[2] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64SLLconst || v_1.AuxInt != 3 { + if v_1.Op != OpARM64MOVDconst { break } - idx := v_1.Args[0] - v.reset(OpARM64MOVDloadidx8) + c := v_1.AuxInt + val := v.Args[2] + v.reset(OpARM64MOVHstore) + v.AuxInt = c << 1 v.AddArg(ptr) - v.AddArg(idx) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVDloadidx (SLLconst [3] idx) ptr mem) - // result: (MOVDloadidx8 ptr idx mem) + // match: (MOVHstoreidx2 ptr idx (MOVDconst [0]) mem) + // result: (MOVHstorezeroidx2 ptr idx mem) for { - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 3 { + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 0 { break } - idx := v_0.Args[0] - ptr := v.Args[1] - v.reset(OpARM64MOVDloadidx8) + v.reset(OpARM64MOVHstorezeroidx2) v.AddArg(ptr) v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVDloadidx ptr idx (MOVDstorezeroidx ptr2 idx2 _)) - // cond: (isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) - // result: (MOVDconst [0]) + // match: (MOVHstoreidx2 ptr idx (MOVHreg x) mem) + // result: (MOVHstoreidx2 ptr idx x mem) for { - _ = v.Args[2] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDstorezeroidx { - break - } - _ = v_2.Args[2] - ptr2 := v_2.Args[0] - idx2 := v_2.Args[1] - if !(isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) { + if v_2.Op != OpARM64MOVHreg { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + x := v_2.Args[0] + v.reset(OpARM64MOVHstoreidx2) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(x) + v.AddArg(mem) return true } - return false -} -func rewriteValueARM64_OpARM64MOVDloadidx8_0(v *Value) bool { - // match: (MOVDloadidx8 ptr (MOVDconst [c]) mem) - // result: (MOVDload [c<<3] ptr mem) + // match: (MOVHstoreidx2 ptr idx (MOVHUreg x) mem) + // result: (MOVHstoreidx2 ptr idx x mem) for { - mem := v.Args[2] + mem := v.Args[3] ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVHUreg { break } - c := v_1.AuxInt - v.reset(OpARM64MOVDload) - v.AuxInt = c << 3 + x := v_2.Args[0] + v.reset(OpARM64MOVHstoreidx2) v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(x) v.AddArg(mem) return true } - // match: (MOVDloadidx8 ptr idx (MOVDstorezeroidx8 ptr2 idx2 _)) - // cond: isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) - // result: (MOVDconst [0]) + // match: (MOVHstoreidx2 ptr idx (MOVWreg x) mem) + // result: (MOVHstoreidx2 ptr idx x mem) for { - _ = v.Args[2] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDstorezeroidx8 { - break - } - _ = v_2.Args[2] - ptr2 := v_2.Args[0] - idx2 := v_2.Args[1] - if !(isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2)) { + if v_2.Op != OpARM64MOVWreg { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + x := v_2.Args[0] + v.reset(OpARM64MOVHstoreidx2) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(x) + v.AddArg(mem) return true } - return false -} -func rewriteValueARM64_OpARM64MOVDreg_0(v *Value) bool { - // match: (MOVDreg x) - // cond: x.Uses == 1 - // result: (MOVDnop x) + // match: (MOVHstoreidx2 ptr idx (MOVWUreg x) mem) + // result: (MOVHstoreidx2 ptr idx x mem) for { - x := v.Args[0] - if !(x.Uses == 1) { + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVWUreg { break } - v.reset(OpARM64MOVDnop) + x := v_2.Args[0] + v.reset(OpARM64MOVHstoreidx2) + v.AddArg(ptr) + v.AddArg(idx) v.AddArg(x) - return true - } - // match: (MOVDreg (MOVDconst [c])) - // result: (MOVDconst [c]) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = c + v.AddArg(mem) return true } return false } -func rewriteValueARM64_OpARM64MOVDstore_0(v *Value) bool { +func rewriteValueARM64_OpARM64MOVHstorezero_0(v *Value) bool { b := v.Block config := b.Func.Config - // match: (MOVDstore [off] {sym} ptr (FMOVDfpgp val) mem) - // result: (FMOVDstore [off] {sym} ptr val mem) + // match: (MOVHstorezero [off1] {sym} (ADDconst [off2] ptr) mem) + // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVHstorezero [off1+off2] {sym} ptr mem) for { - off := v.AuxInt + off1 := v.AuxInt sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64FMOVDfpgp { + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADDconst { break } - val := v_1.Args[0] - v.reset(OpARM64FMOVDstore) - v.AuxInt = off + off2 := v_0.AuxInt + ptr := v_0.Args[0] + if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + break + } + v.reset(OpARM64MOVHstorezero) + v.AuxInt = off1 + off2 v.Aux = sym v.AddArg(ptr) - v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) - // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVDstore [off1+off2] {sym} ptr val mem) + // match: (MOVHstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVHstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) for { off1 := v.AuxInt - sym := v.Aux - mem := v.Args[2] + sym1 := v.Aux + mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64ADDconst { + if v_0.Op != OpARM64MOVDaddr { break } off2 := v_0.AuxInt + sym2 := v_0.Aux ptr := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(OpARM64MOVDstore) + v.reset(OpARM64MOVHstorezero) v.AuxInt = off1 + off2 - v.Aux = sym + v.Aux = mergeSym(sym1, sym2) v.AddArg(ptr) - v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVDstore [off] {sym} (ADD ptr idx) val mem) + // match: (MOVHstorezero [off] {sym} (ADD ptr idx) mem) // cond: off == 0 && sym == nil - // result: (MOVDstoreidx ptr idx val mem) + // result: (MOVHstorezeroidx ptr idx mem) for { off := v.AuxInt sym := v.Aux - mem := v.Args[2] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } idx := v_0.Args[1] ptr := v_0.Args[0] - val := v.Args[1] if !(off == 0 && sym == nil) { break } - v.reset(OpARM64MOVDstoreidx) + v.reset(OpARM64MOVHstorezeroidx) v.AddArg(ptr) v.AddArg(idx) - v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVDstore [off] {sym} (ADDshiftLL [3] ptr idx) val mem) + // match: (MOVHstorezero [off] {sym} (ADDshiftLL [1] ptr idx) mem) // cond: off == 0 && sym == nil - // result: (MOVDstoreidx8 ptr idx val mem) + // result: (MOVHstorezeroidx2 ptr idx mem) for { off := v.AuxInt sym := v.Aux - mem := v.Args[2] + mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 3 { + if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 1 { break } idx := v_0.Args[1] ptr := v_0.Args[0] - val := v.Args[1] if !(off == 0 && sym == nil) { break } - v.reset(OpARM64MOVDstoreidx8) + v.reset(OpARM64MOVHstorezeroidx2) v.AddArg(ptr) v.AddArg(idx) - v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) + // match: (MOVHstorezero [i] {s} ptr0 x:(MOVHstorezero [j] {s} ptr1 mem)) + // cond: x.Uses == 1 && areAdjacentOffsets(i,j,2) && is32Bit(min(i,j)) && isSamePtr(ptr0, ptr1) && clobber(x) + // result: (MOVWstorezero [min(i,j)] {s} ptr0 mem) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDaddr { + i := v.AuxInt + s := v.Aux + _ = v.Args[1] + ptr0 := v.Args[0] + x := v.Args[1] + if x.Op != OpARM64MOVHstorezero { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - ptr := v_0.Args[0] - val := v.Args[1] - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + j := x.AuxInt + if x.Aux != s { break } - v.reset(OpARM64MOVDstore) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(val) + mem := x.Args[1] + ptr1 := x.Args[0] + if !(x.Uses == 1 && areAdjacentOffsets(i, j, 2) && is32Bit(min(i, j)) && isSamePtr(ptr0, ptr1) && clobber(x)) { + break + } + v.reset(OpARM64MOVWstorezero) + v.AuxInt = min(i, j) + v.Aux = s + v.AddArg(ptr0) v.AddArg(mem) return true } - // match: (MOVDstore [off] {sym} ptr (MOVDconst [0]) mem) - // result: (MOVDstorezero [off] {sym} ptr mem) + // match: (MOVHstorezero [2] {s} (ADD ptr0 idx0) x:(MOVHstorezeroidx ptr1 idx1 mem)) + // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) + // result: (MOVWstorezeroidx ptr1 idx1 mem) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 0 { + if v.AuxInt != 2 { break } - v.reset(OpARM64MOVDstorezero) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) + s := v.Aux + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADD { + break + } + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr0 := v_0.Args[_i0] + idx0 := v_0.Args[1^_i0] + x := v.Args[1] + if x.Op != OpARM64MOVHstorezeroidx { + continue + } + mem := x.Args[2] + ptr1 := x.Args[0] + idx1 := x.Args[1] + if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + continue + } + v.reset(OpARM64MOVWstorezeroidx) + v.AddArg(ptr1) + v.AddArg(idx1) + v.AddArg(mem) + return true + } + break + } + // match: (MOVHstorezero [2] {s} (ADDshiftLL [1] ptr0 idx0) x:(MOVHstorezeroidx2 ptr1 idx1 mem)) + // cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x) + // result: (MOVWstorezeroidx ptr1 (SLLconst [1] idx1) mem) + for { + if v.AuxInt != 2 { + break + } + s := v.Aux + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 1 { + break + } + idx0 := v_0.Args[1] + ptr0 := v_0.Args[0] + x := v.Args[1] + if x.Op != OpARM64MOVHstorezeroidx2 { + break + } + mem := x.Args[2] + ptr1 := x.Args[0] + idx1 := x.Args[1] + if !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) { + break + } + v.reset(OpARM64MOVWstorezeroidx) + v.AddArg(ptr1) + v0 := b.NewValue0(v.Pos, OpARM64SLLconst, idx1.Type) + v0.AuxInt = 1 + v0.AddArg(idx1) + v.AddArg(v0) v.AddArg(mem) return true } return false } -func rewriteValueARM64_OpARM64MOVDstoreidx_0(v *Value) bool { - // match: (MOVDstoreidx ptr (MOVDconst [c]) val mem) - // result: (MOVDstore [c] ptr val mem) +func rewriteValueARM64_OpARM64MOVHstorezeroidx_0(v *Value) bool { + // match: (MOVHstorezeroidx ptr (MOVDconst [c]) mem) + // result: (MOVHstorezero [c] ptr mem) for { - mem := v.Args[3] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - val := v.Args[2] - v.reset(OpARM64MOVDstore) + v.reset(OpARM64MOVHstorezero) v.AuxInt = c v.AddArg(ptr) - v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVDstoreidx (MOVDconst [c]) idx val mem) - // result: (MOVDstore [c] idx val mem) + // match: (MOVHstorezeroidx (MOVDconst [c]) idx mem) + // result: (MOVHstorezero [c] idx mem) for { - mem := v.Args[3] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt idx := v.Args[1] - val := v.Args[2] - v.reset(OpARM64MOVDstore) + v.reset(OpARM64MOVHstorezero) v.AuxInt = c v.AddArg(idx) - v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVDstoreidx ptr (SLLconst [3] idx) val mem) - // result: (MOVDstoreidx8 ptr idx val mem) + // match: (MOVHstorezeroidx ptr (SLLconst [1] idx) mem) + // result: (MOVHstorezeroidx2 ptr idx mem) for { - mem := v.Args[3] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64SLLconst || v_1.AuxInt != 3 { + if v_1.Op != OpARM64SLLconst || v_1.AuxInt != 1 { break } idx := v_1.Args[0] - val := v.Args[2] - v.reset(OpARM64MOVDstoreidx8) + v.reset(OpARM64MOVHstorezeroidx2) v.AddArg(ptr) v.AddArg(idx) - v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVDstoreidx (SLLconst [3] idx) ptr val mem) - // result: (MOVDstoreidx8 ptr idx val mem) + // match: (MOVHstorezeroidx ptr (ADD idx idx) mem) + // result: (MOVHstorezeroidx2 ptr idx mem) for { - mem := v.Args[3] - v_0 := v.Args[0] - if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 3 { + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64ADD { break } - idx := v_0.Args[0] - ptr := v.Args[1] - val := v.Args[2] - v.reset(OpARM64MOVDstoreidx8) + idx := v_1.Args[1] + if idx != v_1.Args[0] { + break + } + v.reset(OpARM64MOVHstorezeroidx2) v.AddArg(ptr) v.AddArg(idx) - v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVDstoreidx ptr idx (MOVDconst [0]) mem) - // result: (MOVDstorezeroidx ptr idx mem) + // match: (MOVHstorezeroidx (SLLconst [1] idx) ptr mem) + // result: (MOVHstorezeroidx2 ptr idx mem) for { - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 0 { + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 1 { break } - v.reset(OpARM64MOVDstorezeroidx) + idx := v_0.Args[0] + ptr := v.Args[1] + v.reset(OpARM64MOVHstorezeroidx2) v.AddArg(ptr) v.AddArg(idx) v.AddArg(mem) return true } - return false -} -func rewriteValueARM64_OpARM64MOVDstoreidx8_0(v *Value) bool { - // match: (MOVDstoreidx8 ptr (MOVDconst [c]) val mem) - // result: (MOVDstore [c<<3] ptr val mem) + // match: (MOVHstorezeroidx (ADD idx idx) ptr mem) + // result: (MOVHstorezeroidx2 ptr idx mem) for { - mem := v.Args[3] + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADD { + break + } + idx := v_0.Args[1] + if idx != v_0.Args[0] { + break + } + ptr := v.Args[1] + v.reset(OpARM64MOVHstorezeroidx2) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + // match: (MOVHstorezeroidx ptr (ADDconst [2] idx) x:(MOVHstorezeroidx ptr idx mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVWstorezeroidx ptr idx mem) + for { + _ = v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + if v_1.Op != OpARM64ADDconst || v_1.AuxInt != 2 { break } - c := v_1.AuxInt - val := v.Args[2] - v.reset(OpARM64MOVDstore) - v.AuxInt = c << 3 + idx := v_1.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVHstorezeroidx { + break + } + mem := x.Args[2] + if ptr != x.Args[0] || idx != x.Args[1] || !(x.Uses == 1 && clobber(x)) { + break + } + v.reset(OpARM64MOVWstorezeroidx) v.AddArg(ptr) - v.AddArg(val) + v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVDstoreidx8 ptr idx (MOVDconst [0]) mem) - // result: (MOVDstorezeroidx8 ptr idx mem) + return false +} +func rewriteValueARM64_OpARM64MOVHstorezeroidx2_0(v *Value) bool { + // match: (MOVHstorezeroidx2 ptr (MOVDconst [c]) mem) + // result: (MOVHstorezero [c<<1] ptr mem) for { - mem := v.Args[3] + mem := v.Args[2] ptr := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 0 { + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVDstorezeroidx8) + c := v_1.AuxInt + v.reset(OpARM64MOVHstorezero) + v.AuxInt = c << 1 v.AddArg(ptr) - v.AddArg(idx) v.AddArg(mem) return true } return false } -func rewriteValueARM64_OpARM64MOVDstorezero_0(v *Value) bool { +func rewriteValueARM64_OpARM64MOVQstorezero_0(v *Value) bool { b := v.Block config := b.Func.Config - // match: (MOVDstorezero [off1] {sym} (ADDconst [off2] ptr) mem) + // match: (MOVQstorezero [off1] {sym} (ADDconst [off2] ptr) mem) // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVDstorezero [off1+off2] {sym} ptr mem) + // result: (MOVQstorezero [off1+off2] {sym} ptr mem) for { off1 := v.AuxInt sym := v.Aux @@ -12218,16 +12986,16 @@ func rewriteValueARM64_OpARM64MOVDstorezero_0(v *Value) bool { if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(OpARM64MOVDstorezero) + v.reset(OpARM64MOVQstorezero) v.AuxInt = off1 + off2 v.Aux = sym v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVDstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) + // match: (MOVQstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVDstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) + // result: (MOVQstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) for { off1 := v.AuxInt sym1 := v.Aux @@ -12242,44 +13010,70 @@ func rewriteValueARM64_OpARM64MOVDstorezero_0(v *Value) bool { if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(OpARM64MOVDstorezero) + v.reset(OpARM64MOVQstorezero) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVDstorezero [off] {sym} (ADD ptr idx) mem) - // cond: off == 0 && sym == nil - // result: (MOVDstorezeroidx ptr idx mem) + return false +} +func rewriteValueARM64_OpARM64MOVWUload_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (MOVWUload [off] {sym} ptr (FMOVSstore [off] {sym} ptr val _)) + // result: (FMOVSfpgp val) for { off := v.AuxInt sym := v.Aux + _ = v.Args[1] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64FMOVSstore || v_1.AuxInt != off || v_1.Aux != sym { + break + } + _ = v_1.Args[2] + if ptr != v_1.Args[0] { + break + } + val := v_1.Args[1] + v.reset(OpARM64FMOVSfpgp) + v.AddArg(val) + return true + } + // match: (MOVWUload [off1] {sym} (ADDconst [off2] ptr) mem) + // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVWUload [off1+off2] {sym} ptr mem) + for { + off1 := v.AuxInt + sym := v.Aux mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { + if v_0.Op != OpARM64ADDconst { break } - idx := v_0.Args[1] + off2 := v_0.AuxInt ptr := v_0.Args[0] - if !(off == 0 && sym == nil) { + if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(OpARM64MOVDstorezeroidx) + v.reset(OpARM64MOVWUload) + v.AuxInt = off1 + off2 + v.Aux = sym v.AddArg(ptr) - v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVDstorezero [off] {sym} (ADDshiftLL [3] ptr idx) mem) + // match: (MOVWUload [off] {sym} (ADD ptr idx) mem) // cond: off == 0 && sym == nil - // result: (MOVDstorezeroidx8 ptr idx mem) + // result: (MOVWUloadidx ptr idx mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 3 { + if v_0.Op != OpARM64ADD { break } idx := v_0.Args[1] @@ -12287,141 +13081,101 @@ func rewriteValueARM64_OpARM64MOVDstorezero_0(v *Value) bool { if !(off == 0 && sym == nil) { break } - v.reset(OpARM64MOVDstorezeroidx8) + v.reset(OpARM64MOVWUloadidx) v.AddArg(ptr) v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVDstorezero [i] {s} ptr0 x:(MOVDstorezero [j] {s} ptr1 mem)) - // cond: x.Uses == 1 && areAdjacentOffsets(i,j,8) && is32Bit(min(i,j)) && isSamePtr(ptr0, ptr1) && clobber(x) - // result: (MOVQstorezero [min(i,j)] {s} ptr0 mem) + // match: (MOVWUload [off] {sym} (ADDshiftLL [2] ptr idx) mem) + // cond: off == 0 && sym == nil + // result: (MOVWUloadidx4 ptr idx mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[1] - ptr0 := v.Args[0] - x := v.Args[1] - if x.Op != OpARM64MOVDstorezero { - break - } - j := x.AuxInt - if x.Aux != s { + off := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 2 { break } - mem := x.Args[1] - ptr1 := x.Args[0] - if !(x.Uses == 1 && areAdjacentOffsets(i, j, 8) && is32Bit(min(i, j)) && isSamePtr(ptr0, ptr1) && clobber(x)) { + idx := v_0.Args[1] + ptr := v_0.Args[0] + if !(off == 0 && sym == nil) { break } - v.reset(OpARM64MOVQstorezero) - v.AuxInt = min(i, j) - v.Aux = s - v.AddArg(ptr0) + v.reset(OpARM64MOVWUloadidx4) + v.AddArg(ptr) + v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVDstorezero [8] {s} p0:(ADD ptr0 idx0) x:(MOVDstorezeroidx ptr1 idx1 mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVQstorezero [0] {s} p0 mem) + // match: (MOVWUload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVWUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) for { - if v.AuxInt != 8 { - break - } - s := v.Aux - _ = v.Args[1] - p0 := v.Args[0] - if p0.Op != OpARM64ADD { - break - } - idx0 := p0.Args[1] - ptr0 := p0.Args[0] - x := v.Args[1] - if x.Op != OpARM64MOVDstorezeroidx { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDaddr { break } - mem := x.Args[2] - ptr1 := x.Args[0] - idx1 := x.Args[1] - if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + ptr := v_0.Args[0] + if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(OpARM64MOVQstorezero) - v.AuxInt = 0 - v.Aux = s - v.AddArg(p0) + v.reset(OpARM64MOVWUload) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVDstorezero [8] {s} p0:(ADD idx0 ptr0) x:(MOVDstorezeroidx ptr1 idx1 mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVQstorezero [0] {s} p0 mem) + // match: (MOVWUload [off] {sym} ptr (MOVWstorezero [off2] {sym2} ptr2 _)) + // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) + // result: (MOVDconst [0]) for { - if v.AuxInt != 8 { - break - } - s := v.Aux + off := v.AuxInt + sym := v.Aux _ = v.Args[1] - p0 := v.Args[0] - if p0.Op != OpARM64ADD { - break - } - ptr0 := p0.Args[1] - idx0 := p0.Args[0] - x := v.Args[1] - if x.Op != OpARM64MOVDstorezeroidx { + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVWstorezero { break } - mem := x.Args[2] - ptr1 := x.Args[0] - idx1 := x.Args[1] - if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + off2 := v_1.AuxInt + sym2 := v_1.Aux + _ = v_1.Args[1] + ptr2 := v_1.Args[0] + if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { break } - v.reset(OpARM64MOVQstorezero) + v.reset(OpARM64MOVDconst) v.AuxInt = 0 - v.Aux = s - v.AddArg(p0) - v.AddArg(mem) return true } - // match: (MOVDstorezero [8] {s} p0:(ADDshiftLL [3] ptr0 idx0) x:(MOVDstorezeroidx8 ptr1 idx1 mem)) - // cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x) - // result: (MOVQstorezero [0] {s} p0 mem) + // match: (MOVWUload [off] {sym} (SB) _) + // cond: symIsRO(sym) + // result: (MOVDconst [int64(read32(sym, off, config.BigEndian))]) for { - if v.AuxInt != 8 { + off := v.AuxInt + sym := v.Aux + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpSB || !(symIsRO(sym)) { break } - s := v.Aux - _ = v.Args[1] - p0 := v.Args[0] - if p0.Op != OpARM64ADDshiftLL || p0.AuxInt != 3 { - break - } - idx0 := p0.Args[1] - ptr0 := p0.Args[0] - x := v.Args[1] - if x.Op != OpARM64MOVDstorezeroidx8 { - break - } - mem := x.Args[2] - ptr1 := x.Args[0] - idx1 := x.Args[1] - if !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) { - break - } - v.reset(OpARM64MOVQstorezero) - v.AuxInt = 0 - v.Aux = s - v.AddArg(p0) - v.AddArg(mem) + v.reset(OpARM64MOVDconst) + v.AuxInt = int64(read32(sym, off, config.BigEndian)) return true } return false } -func rewriteValueARM64_OpARM64MOVDstorezeroidx_0(v *Value) bool { - // match: (MOVDstorezeroidx ptr (MOVDconst [c]) mem) - // result: (MOVDstorezero [c] ptr mem) +func rewriteValueARM64_OpARM64MOVWUloadidx_0(v *Value) bool { + // match: (MOVWUloadidx ptr (MOVDconst [c]) mem) + // result: (MOVWUload [c] ptr mem) for { mem := v.Args[2] ptr := v.Args[0] @@ -12430,14 +13184,14 @@ func rewriteValueARM64_OpARM64MOVDstorezeroidx_0(v *Value) bool { break } c := v_1.AuxInt - v.reset(OpARM64MOVDstorezero) + v.reset(OpARM64MOVWUload) v.AuxInt = c v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVDstorezeroidx (MOVDconst [c]) idx mem) - // result: (MOVDstorezero [c] idx mem) + // match: (MOVWUloadidx (MOVDconst [c]) ptr mem) + // result: (MOVWUload [c] ptr mem) for { mem := v.Args[2] v_0 := v.Args[0] @@ -12445,50 +13199,71 @@ func rewriteValueARM64_OpARM64MOVDstorezeroidx_0(v *Value) bool { break } c := v_0.AuxInt - idx := v.Args[1] - v.reset(OpARM64MOVDstorezero) + ptr := v.Args[1] + v.reset(OpARM64MOVWUload) v.AuxInt = c - v.AddArg(idx) + v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVDstorezeroidx ptr (SLLconst [3] idx) mem) - // result: (MOVDstorezeroidx8 ptr idx mem) + // match: (MOVWUloadidx ptr (SLLconst [2] idx) mem) + // result: (MOVWUloadidx4 ptr idx mem) for { mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64SLLconst || v_1.AuxInt != 3 { + if v_1.Op != OpARM64SLLconst || v_1.AuxInt != 2 { break } idx := v_1.Args[0] - v.reset(OpARM64MOVDstorezeroidx8) + v.reset(OpARM64MOVWUloadidx4) v.AddArg(ptr) v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVDstorezeroidx (SLLconst [3] idx) ptr mem) - // result: (MOVDstorezeroidx8 ptr idx mem) + // match: (MOVWUloadidx (SLLconst [2] idx) ptr mem) + // result: (MOVWUloadidx4 ptr idx mem) for { mem := v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 3 { + if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 2 { break } idx := v_0.Args[0] ptr := v.Args[1] - v.reset(OpARM64MOVDstorezeroidx8) + v.reset(OpARM64MOVWUloadidx4) v.AddArg(ptr) v.AddArg(idx) v.AddArg(mem) return true } + // match: (MOVWUloadidx ptr idx (MOVWstorezeroidx ptr2 idx2 _)) + // cond: (isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) + // result: (MOVDconst [0]) + for { + _ = v.Args[2] + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVWstorezeroidx { + break + } + _ = v_2.Args[2] + ptr2 := v_2.Args[0] + idx2 := v_2.Args[1] + if !(isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) { + break + } + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 + return true + } return false } -func rewriteValueARM64_OpARM64MOVDstorezeroidx8_0(v *Value) bool { - // match: (MOVDstorezeroidx8 ptr (MOVDconst [c]) mem) - // result: (MOVDstorezero [c<<3] ptr mem) +func rewriteValueARM64_OpARM64MOVWUloadidx4_0(v *Value) bool { + // match: (MOVWUloadidx4 ptr (MOVDconst [c]) mem) + // result: (MOVWUload [c<<2] ptr mem) for { mem := v.Args[2] ptr := v.Args[0] @@ -12497,328 +13272,113 @@ func rewriteValueARM64_OpARM64MOVDstorezeroidx8_0(v *Value) bool { break } c := v_1.AuxInt - v.reset(OpARM64MOVDstorezero) - v.AuxInt = c << 3 + v.reset(OpARM64MOVWUload) + v.AuxInt = c << 2 v.AddArg(ptr) v.AddArg(mem) return true } - return false -} -func rewriteValueARM64_OpARM64MOVHUload_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (MOVHUload [off1] {sym} (ADDconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVHUload [off1+off2] {sym} ptr mem) + // match: (MOVWUloadidx4 ptr idx (MOVWstorezeroidx4 ptr2 idx2 _)) + // cond: isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) + // result: (MOVDconst [0]) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADDconst { + _ = v.Args[2] + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVWstorezeroidx4 { break } - off2 := v_0.AuxInt - ptr := v_0.Args[0] - if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + _ = v_2.Args[2] + ptr2 := v_2.Args[0] + idx2 := v_2.Args[1] + if !(isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2)) { break } - v.reset(OpARM64MOVHUload) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(ptr) - v.AddArg(mem) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } - // match: (MOVHUload [off] {sym} (ADD ptr idx) mem) - // cond: off == 0 && sym == nil - // result: (MOVHUloadidx ptr idx mem) + return false +} +func rewriteValueARM64_OpARM64MOVWUreg_0(v *Value) bool { + // match: (MOVWUreg x:(MOVBUload _ _)) + // result: (MOVDreg x) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { - break - } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(off == 0 && sym == nil) { + x := v.Args[0] + if x.Op != OpARM64MOVBUload { break } - v.reset(OpARM64MOVHUloadidx) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + _ = x.Args[1] + v.reset(OpARM64MOVDreg) + v.AddArg(x) return true } - // match: (MOVHUload [off] {sym} (ADDshiftLL [1] ptr idx) mem) - // cond: off == 0 && sym == nil - // result: (MOVHUloadidx2 ptr idx mem) + // match: (MOVWUreg x:(MOVHUload _ _)) + // result: (MOVDreg x) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 1 { - break - } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(off == 0 && sym == nil) { + x := v.Args[0] + if x.Op != OpARM64MOVHUload { break } - v.reset(OpARM64MOVHUloadidx2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + _ = x.Args[1] + v.reset(OpARM64MOVDreg) + v.AddArg(x) return true } - // match: (MOVHUload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVHUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) + // match: (MOVWUreg x:(MOVWUload _ _)) + // result: (MOVDreg x) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDaddr { - break - } - off2 := v_0.AuxInt - sym2 := v_0.Aux - ptr := v_0.Args[0] - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + x := v.Args[0] + if x.Op != OpARM64MOVWUload { break } - v.reset(OpARM64MOVHUload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(mem) + _ = x.Args[1] + v.reset(OpARM64MOVDreg) + v.AddArg(x) return true } - // match: (MOVHUload [off] {sym} ptr (MOVHstorezero [off2] {sym2} ptr2 _)) - // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) - // result: (MOVDconst [0]) + // match: (MOVWUreg x:(MOVBUloadidx _ _ _)) + // result: (MOVDreg x) for { - off := v.AuxInt - sym := v.Aux - _ = v.Args[1] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVHstorezero { - break - } - off2 := v_1.AuxInt - sym2 := v_1.Aux - _ = v_1.Args[1] - ptr2 := v_1.Args[0] - if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { + x := v.Args[0] + if x.Op != OpARM64MOVBUloadidx { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + _ = x.Args[2] + v.reset(OpARM64MOVDreg) + v.AddArg(x) return true } - // match: (MOVHUload [off] {sym} (SB) _) - // cond: symIsRO(sym) - // result: (MOVDconst [int64(read16(sym, off, config.BigEndian))]) + // match: (MOVWUreg x:(MOVHUloadidx _ _ _)) + // result: (MOVDreg x) for { - off := v.AuxInt - sym := v.Aux - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpSB || !(symIsRO(sym)) { + x := v.Args[0] + if x.Op != OpARM64MOVHUloadidx { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = int64(read16(sym, off, config.BigEndian)) + _ = x.Args[2] + v.reset(OpARM64MOVDreg) + v.AddArg(x) return true } - return false -} -func rewriteValueARM64_OpARM64MOVHUloadidx_0(v *Value) bool { - // match: (MOVHUloadidx ptr (MOVDconst [c]) mem) - // result: (MOVHUload [c] ptr mem) + // match: (MOVWUreg x:(MOVWUloadidx _ _ _)) + // result: (MOVDreg x) for { - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + x := v.Args[0] + if x.Op != OpARM64MOVWUloadidx { break } - c := v_1.AuxInt - v.reset(OpARM64MOVHUload) - v.AuxInt = c - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MOVHUloadidx (MOVDconst [c]) ptr mem) - // result: (MOVHUload [c] ptr mem) - for { - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - ptr := v.Args[1] - v.reset(OpARM64MOVHUload) - v.AuxInt = c - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MOVHUloadidx ptr (SLLconst [1] idx) mem) - // result: (MOVHUloadidx2 ptr idx mem) - for { - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SLLconst || v_1.AuxInt != 1 { - break - } - idx := v_1.Args[0] - v.reset(OpARM64MOVHUloadidx2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVHUloadidx ptr (ADD idx idx) mem) - // result: (MOVHUloadidx2 ptr idx mem) - for { - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64ADD { - break - } - idx := v_1.Args[1] - if idx != v_1.Args[0] { - break - } - v.reset(OpARM64MOVHUloadidx2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVHUloadidx (ADD idx idx) ptr mem) - // result: (MOVHUloadidx2 ptr idx mem) - for { - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { - break - } - idx := v_0.Args[1] - if idx != v_0.Args[0] { - break - } - ptr := v.Args[1] - v.reset(OpARM64MOVHUloadidx2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVHUloadidx ptr idx (MOVHstorezeroidx ptr2 idx2 _)) - // cond: (isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) - // result: (MOVDconst [0]) - for { - _ = v.Args[2] - ptr := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVHstorezeroidx { - break - } - _ = v_2.Args[2] - ptr2 := v_2.Args[0] - idx2 := v_2.Args[1] - if !(isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) { - break - } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 - return true - } - return false -} -func rewriteValueARM64_OpARM64MOVHUloadidx2_0(v *Value) bool { - // match: (MOVHUloadidx2 ptr (MOVDconst [c]) mem) - // result: (MOVHUload [c<<1] ptr mem) - for { - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - v.reset(OpARM64MOVHUload) - v.AuxInt = c << 1 - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MOVHUloadidx2 ptr idx (MOVHstorezeroidx2 ptr2 idx2 _)) - // cond: isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) - // result: (MOVDconst [0]) - for { - _ = v.Args[2] - ptr := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVHstorezeroidx2 { - break - } - _ = v_2.Args[2] - ptr2 := v_2.Args[0] - idx2 := v_2.Args[1] - if !(isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2)) { - break - } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 - return true - } - return false -} -func rewriteValueARM64_OpARM64MOVHUreg_0(v *Value) bool { - // match: (MOVHUreg x:(MOVBUload _ _)) - // result: (MOVDreg x) - for { - x := v.Args[0] - if x.Op != OpARM64MOVBUload { - break - } - _ = x.Args[1] - v.reset(OpARM64MOVDreg) - v.AddArg(x) - return true - } - // match: (MOVHUreg x:(MOVHUload _ _)) - // result: (MOVDreg x) - for { - x := v.Args[0] - if x.Op != OpARM64MOVHUload { - break - } - _ = x.Args[1] + _ = x.Args[2] v.reset(OpARM64MOVDreg) v.AddArg(x) return true } - // match: (MOVHUreg x:(MOVBUloadidx _ _ _)) + // match: (MOVWUreg x:(MOVHUloadidx2 _ _ _)) // result: (MOVDreg x) for { x := v.Args[0] - if x.Op != OpARM64MOVBUloadidx { + if x.Op != OpARM64MOVHUloadidx2 { break } _ = x.Args[2] @@ -12826,11 +13386,11 @@ func rewriteValueARM64_OpARM64MOVHUreg_0(v *Value) bool { v.AddArg(x) return true } - // match: (MOVHUreg x:(MOVHUloadidx _ _ _)) + // match: (MOVWUreg x:(MOVWUloadidx4 _ _ _)) // result: (MOVDreg x) for { x := v.Args[0] - if x.Op != OpARM64MOVHUloadidx { + if x.Op != OpARM64MOVWUloadidx4 { break } _ = x.Args[2] @@ -12838,42 +13398,44 @@ func rewriteValueARM64_OpARM64MOVHUreg_0(v *Value) bool { v.AddArg(x) return true } - // match: (MOVHUreg x:(MOVHUloadidx2 _ _ _)) + // match: (MOVWUreg x:(MOVBUreg _)) // result: (MOVDreg x) for { x := v.Args[0] - if x.Op != OpARM64MOVHUloadidx2 { + if x.Op != OpARM64MOVBUreg { break } - _ = x.Args[2] v.reset(OpARM64MOVDreg) v.AddArg(x) return true } - // match: (MOVHUreg x:(MOVBUreg _)) + // match: (MOVWUreg x:(MOVHUreg _)) // result: (MOVDreg x) for { x := v.Args[0] - if x.Op != OpARM64MOVBUreg { + if x.Op != OpARM64MOVHUreg { break } v.reset(OpARM64MOVDreg) v.AddArg(x) return true } - // match: (MOVHUreg x:(MOVHUreg _)) + return false +} +func rewriteValueARM64_OpARM64MOVWUreg_10(v *Value) bool { + // match: (MOVWUreg x:(MOVWUreg _)) // result: (MOVDreg x) for { x := v.Args[0] - if x.Op != OpARM64MOVHUreg { + if x.Op != OpARM64MOVWUreg { break } v.reset(OpARM64MOVDreg) v.AddArg(x) return true } - // match: (MOVHUreg (ANDconst [c] x)) - // result: (ANDconst [c&(1<<16-1)] x) + // match: (MOVWUreg (ANDconst [c] x)) + // result: (ANDconst [c&(1<<32-1)] x) for { v_0 := v.Args[0] if v_0.Op != OpARM64ANDconst { @@ -12882,12 +13444,12 @@ func rewriteValueARM64_OpARM64MOVHUreg_0(v *Value) bool { c := v_0.AuxInt x := v_0.Args[0] v.reset(OpARM64ANDconst) - v.AuxInt = c & (1<<16 - 1) + v.AuxInt = c & (1<<32 - 1) v.AddArg(x) return true } - // match: (MOVHUreg (MOVDconst [c])) - // result: (MOVDconst [int64(uint16(c))]) + // match: (MOVWUreg (MOVDconst [c])) + // result: (MOVDconst [int64(uint32(c))]) for { v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { @@ -12895,12 +13457,12 @@ func rewriteValueARM64_OpARM64MOVHUreg_0(v *Value) bool { } c := v_0.AuxInt v.reset(OpARM64MOVDconst) - v.AuxInt = int64(uint16(c)) + v.AuxInt = int64(uint32(c)) return true } - // match: (MOVHUreg (SLLconst [sc] x)) - // cond: isARM64BFMask(sc, 1<<16-1, sc) - // result: (UBFIZ [armBFAuxInt(sc, arm64BFWidth(1<<16-1, sc))] x) + // match: (MOVWUreg (SLLconst [sc] x)) + // cond: isARM64BFMask(sc, 1<<32-1, sc) + // result: (UBFIZ [armBFAuxInt(sc, arm64BFWidth(1<<32-1, sc))] x) for { v_0 := v.Args[0] if v_0.Op != OpARM64SLLconst { @@ -12908,20 +13470,17 @@ func rewriteValueARM64_OpARM64MOVHUreg_0(v *Value) bool { } sc := v_0.AuxInt x := v_0.Args[0] - if !(isARM64BFMask(sc, 1<<16-1, sc)) { + if !(isARM64BFMask(sc, 1<<32-1, sc)) { break } v.reset(OpARM64UBFIZ) - v.AuxInt = armBFAuxInt(sc, arm64BFWidth(1<<16-1, sc)) + v.AuxInt = armBFAuxInt(sc, arm64BFWidth(1<<32-1, sc)) v.AddArg(x) return true } - return false -} -func rewriteValueARM64_OpARM64MOVHUreg_10(v *Value) bool { - // match: (MOVHUreg (SRLconst [sc] x)) - // cond: isARM64BFMask(sc, 1<<16-1, 0) - // result: (UBFX [armBFAuxInt(sc, 16)] x) + // match: (MOVWUreg (SRLconst [sc] x)) + // cond: isARM64BFMask(sc, 1<<32-1, 0) + // result: (UBFX [armBFAuxInt(sc, 32)] x) for { v_0 := v.Args[0] if v_0.Op != OpARM64SRLconst { @@ -12929,22 +13488,22 @@ func rewriteValueARM64_OpARM64MOVHUreg_10(v *Value) bool { } sc := v_0.AuxInt x := v_0.Args[0] - if !(isARM64BFMask(sc, 1<<16-1, 0)) { + if !(isARM64BFMask(sc, 1<<32-1, 0)) { break } v.reset(OpARM64UBFX) - v.AuxInt = armBFAuxInt(sc, 16) + v.AuxInt = armBFAuxInt(sc, 32) v.AddArg(x) return true } return false } -func rewriteValueARM64_OpARM64MOVHload_0(v *Value) bool { +func rewriteValueARM64_OpARM64MOVWload_0(v *Value) bool { b := v.Block config := b.Func.Config - // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) + // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVHload [off1+off2] {sym} ptr mem) + // result: (MOVWload [off1+off2] {sym} ptr mem) for { off1 := v.AuxInt sym := v.Aux @@ -12958,16 +13517,16 @@ func rewriteValueARM64_OpARM64MOVHload_0(v *Value) bool { if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(OpARM64MOVHload) + v.reset(OpARM64MOVWload) v.AuxInt = off1 + off2 v.Aux = sym v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVHload [off] {sym} (ADD ptr idx) mem) + // match: (MOVWload [off] {sym} (ADD ptr idx) mem) // cond: off == 0 && sym == nil - // result: (MOVHloadidx ptr idx mem) + // result: (MOVWloadidx ptr idx mem) for { off := v.AuxInt sym := v.Aux @@ -12981,21 +13540,21 @@ func rewriteValueARM64_OpARM64MOVHload_0(v *Value) bool { if !(off == 0 && sym == nil) { break } - v.reset(OpARM64MOVHloadidx) + v.reset(OpARM64MOVWloadidx) v.AddArg(ptr) v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVHload [off] {sym} (ADDshiftLL [1] ptr idx) mem) + // match: (MOVWload [off] {sym} (ADDshiftLL [2] ptr idx) mem) // cond: off == 0 && sym == nil - // result: (MOVHloadidx2 ptr idx mem) + // result: (MOVWloadidx4 ptr idx mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 1 { + if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 2 { break } idx := v_0.Args[1] @@ -13003,15 +13562,15 @@ func rewriteValueARM64_OpARM64MOVHload_0(v *Value) bool { if !(off == 0 && sym == nil) { break } - v.reset(OpARM64MOVHloadidx2) + v.reset(OpARM64MOVWloadidx4) v.AddArg(ptr) v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVHload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) + // match: (MOVWload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) + // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) for { off1 := v.AuxInt sym1 := v.Aux @@ -13026,14 +13585,14 @@ func rewriteValueARM64_OpARM64MOVHload_0(v *Value) bool { if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(OpARM64MOVHload) + v.reset(OpARM64MOVWload) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVHload [off] {sym} ptr (MOVHstorezero [off2] {sym2} ptr2 _)) + // match: (MOVWload [off] {sym} ptr (MOVWstorezero [off2] {sym2} ptr2 _)) // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) // result: (MOVDconst [0]) for { @@ -13042,7 +13601,7 @@ func rewriteValueARM64_OpARM64MOVHload_0(v *Value) bool { _ = v.Args[1] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64MOVHstorezero { + if v_1.Op != OpARM64MOVWstorezero { break } off2 := v_1.AuxInt @@ -13058,25 +13617,25 @@ func rewriteValueARM64_OpARM64MOVHload_0(v *Value) bool { } return false } -func rewriteValueARM64_OpARM64MOVHloadidx_0(v *Value) bool { - // match: (MOVHloadidx ptr (MOVDconst [c]) mem) - // result: (MOVHload [c] ptr mem) - for { - mem := v.Args[2] +func rewriteValueARM64_OpARM64MOVWloadidx_0(v *Value) bool { + // match: (MOVWloadidx ptr (MOVDconst [c]) mem) + // result: (MOVWload [c] ptr mem) + for { + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - v.reset(OpARM64MOVHload) + v.reset(OpARM64MOVWload) v.AuxInt = c v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVHloadidx (MOVDconst [c]) ptr mem) - // result: (MOVHload [c] ptr mem) + // match: (MOVWloadidx (MOVDconst [c]) ptr mem) + // result: (MOVWload [c] ptr mem) for { mem := v.Args[2] v_0 := v.Args[0] @@ -13085,67 +13644,45 @@ func rewriteValueARM64_OpARM64MOVHloadidx_0(v *Value) bool { } c := v_0.AuxInt ptr := v.Args[1] - v.reset(OpARM64MOVHload) + v.reset(OpARM64MOVWload) v.AuxInt = c v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVHloadidx ptr (SLLconst [1] idx) mem) - // result: (MOVHloadidx2 ptr idx mem) + // match: (MOVWloadidx ptr (SLLconst [2] idx) mem) + // result: (MOVWloadidx4 ptr idx mem) for { mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64SLLconst || v_1.AuxInt != 1 { + if v_1.Op != OpARM64SLLconst || v_1.AuxInt != 2 { break } idx := v_1.Args[0] - v.reset(OpARM64MOVHloadidx2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVHloadidx ptr (ADD idx idx) mem) - // result: (MOVHloadidx2 ptr idx mem) - for { - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64ADD { - break - } - idx := v_1.Args[1] - if idx != v_1.Args[0] { - break - } - v.reset(OpARM64MOVHloadidx2) + v.reset(OpARM64MOVWloadidx4) v.AddArg(ptr) v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVHloadidx (ADD idx idx) ptr mem) - // result: (MOVHloadidx2 ptr idx mem) + // match: (MOVWloadidx (SLLconst [2] idx) ptr mem) + // result: (MOVWloadidx4 ptr idx mem) for { mem := v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { - break - } - idx := v_0.Args[1] - if idx != v_0.Args[0] { + if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 2 { break } + idx := v_0.Args[0] ptr := v.Args[1] - v.reset(OpARM64MOVHloadidx2) + v.reset(OpARM64MOVWloadidx4) v.AddArg(ptr) v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVHloadidx ptr idx (MOVHstorezeroidx ptr2 idx2 _)) + // match: (MOVWloadidx ptr idx (MOVWstorezeroidx ptr2 idx2 _)) // cond: (isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) // result: (MOVDconst [0]) for { @@ -13153,7 +13690,7 @@ func rewriteValueARM64_OpARM64MOVHloadidx_0(v *Value) bool { ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] - if v_2.Op != OpARM64MOVHstorezeroidx { + if v_2.Op != OpARM64MOVWstorezeroidx { break } _ = v_2.Args[2] @@ -13168,9 +13705,9 @@ func rewriteValueARM64_OpARM64MOVHloadidx_0(v *Value) bool { } return false } -func rewriteValueARM64_OpARM64MOVHloadidx2_0(v *Value) bool { - // match: (MOVHloadidx2 ptr (MOVDconst [c]) mem) - // result: (MOVHload [c<<1] ptr mem) +func rewriteValueARM64_OpARM64MOVWloadidx4_0(v *Value) bool { + // match: (MOVWloadidx4 ptr (MOVDconst [c]) mem) + // result: (MOVWload [c<<2] ptr mem) for { mem := v.Args[2] ptr := v.Args[0] @@ -13179,13 +13716,13 @@ func rewriteValueARM64_OpARM64MOVHloadidx2_0(v *Value) bool { break } c := v_1.AuxInt - v.reset(OpARM64MOVHload) - v.AuxInt = c << 1 + v.reset(OpARM64MOVWload) + v.AuxInt = c << 2 v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVHloadidx2 ptr idx (MOVHstorezeroidx2 ptr2 idx2 _)) + // match: (MOVWloadidx4 ptr idx (MOVWstorezeroidx4 ptr2 idx2 _)) // cond: isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) // result: (MOVDconst [0]) for { @@ -13193,7 +13730,7 @@ func rewriteValueARM64_OpARM64MOVHloadidx2_0(v *Value) bool { ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] - if v_2.Op != OpARM64MOVHstorezeroidx2 { + if v_2.Op != OpARM64MOVWstorezeroidx4 { break } _ = v_2.Args[2] @@ -13208,8 +13745,8 @@ func rewriteValueARM64_OpARM64MOVHloadidx2_0(v *Value) bool { } return false } -func rewriteValueARM64_OpARM64MOVHreg_0(v *Value) bool { - // match: (MOVHreg x:(MOVBload _ _)) +func rewriteValueARM64_OpARM64MOVWreg_0(v *Value) bool { + // match: (MOVWreg x:(MOVBload _ _)) // result: (MOVDreg x) for { x := v.Args[0] @@ -13221,7 +13758,7 @@ func rewriteValueARM64_OpARM64MOVHreg_0(v *Value) bool { v.AddArg(x) return true } - // match: (MOVHreg x:(MOVBUload _ _)) + // match: (MOVWreg x:(MOVBUload _ _)) // result: (MOVDreg x) for { x := v.Args[0] @@ -13233,7 +13770,7 @@ func rewriteValueARM64_OpARM64MOVHreg_0(v *Value) bool { v.AddArg(x) return true } - // match: (MOVHreg x:(MOVHload _ _)) + // match: (MOVWreg x:(MOVHload _ _)) // result: (MOVDreg x) for { x := v.Args[0] @@ -13245,7 +13782,31 @@ func rewriteValueARM64_OpARM64MOVHreg_0(v *Value) bool { v.AddArg(x) return true } - // match: (MOVHreg x:(MOVBloadidx _ _ _)) + // match: (MOVWreg x:(MOVHUload _ _)) + // result: (MOVDreg x) + for { + x := v.Args[0] + if x.Op != OpARM64MOVHUload { + break + } + _ = x.Args[1] + v.reset(OpARM64MOVDreg) + v.AddArg(x) + return true + } + // match: (MOVWreg x:(MOVWload _ _)) + // result: (MOVDreg x) + for { + x := v.Args[0] + if x.Op != OpARM64MOVWload { + break + } + _ = x.Args[1] + v.reset(OpARM64MOVDreg) + v.AddArg(x) + return true + } + // match: (MOVWreg x:(MOVBloadidx _ _ _)) // result: (MOVDreg x) for { x := v.Args[0] @@ -13257,7 +13818,7 @@ func rewriteValueARM64_OpARM64MOVHreg_0(v *Value) bool { v.AddArg(x) return true } - // match: (MOVHreg x:(MOVBUloadidx _ _ _)) + // match: (MOVWreg x:(MOVBUloadidx _ _ _)) // result: (MOVDreg x) for { x := v.Args[0] @@ -13269,7 +13830,7 @@ func rewriteValueARM64_OpARM64MOVHreg_0(v *Value) bool { v.AddArg(x) return true } - // match: (MOVHreg x:(MOVHloadidx _ _ _)) + // match: (MOVWreg x:(MOVHloadidx _ _ _)) // result: (MOVDreg x) for { x := v.Args[0] @@ -13281,7 +13842,34 @@ func rewriteValueARM64_OpARM64MOVHreg_0(v *Value) bool { v.AddArg(x) return true } - // match: (MOVHreg x:(MOVHloadidx2 _ _ _)) + // match: (MOVWreg x:(MOVHUloadidx _ _ _)) + // result: (MOVDreg x) + for { + x := v.Args[0] + if x.Op != OpARM64MOVHUloadidx { + break + } + _ = x.Args[2] + v.reset(OpARM64MOVDreg) + v.AddArg(x) + return true + } + // match: (MOVWreg x:(MOVWloadidx _ _ _)) + // result: (MOVDreg x) + for { + x := v.Args[0] + if x.Op != OpARM64MOVWloadidx { + break + } + _ = x.Args[2] + v.reset(OpARM64MOVDreg) + v.AddArg(x) + return true + } + return false +} +func rewriteValueARM64_OpARM64MOVWreg_10(v *Value) bool { + // match: (MOVWreg x:(MOVHloadidx2 _ _ _)) // result: (MOVDreg x) for { x := v.Args[0] @@ -13293,7 +13881,31 @@ func rewriteValueARM64_OpARM64MOVHreg_0(v *Value) bool { v.AddArg(x) return true } - // match: (MOVHreg x:(MOVBreg _)) + // match: (MOVWreg x:(MOVHUloadidx2 _ _ _)) + // result: (MOVDreg x) + for { + x := v.Args[0] + if x.Op != OpARM64MOVHUloadidx2 { + break + } + _ = x.Args[2] + v.reset(OpARM64MOVDreg) + v.AddArg(x) + return true + } + // match: (MOVWreg x:(MOVWloadidx4 _ _ _)) + // result: (MOVDreg x) + for { + x := v.Args[0] + if x.Op != OpARM64MOVWloadidx4 { + break + } + _ = x.Args[2] + v.reset(OpARM64MOVDreg) + v.AddArg(x) + return true + } + // match: (MOVWreg x:(MOVBreg _)) // result: (MOVDreg x) for { x := v.Args[0] @@ -13304,7 +13916,7 @@ func rewriteValueARM64_OpARM64MOVHreg_0(v *Value) bool { v.AddArg(x) return true } - // match: (MOVHreg x:(MOVBUreg _)) + // match: (MOVWreg x:(MOVBUreg _)) // result: (MOVDreg x) for { x := v.Args[0] @@ -13315,7 +13927,7 @@ func rewriteValueARM64_OpARM64MOVHreg_0(v *Value) bool { v.AddArg(x) return true } - // match: (MOVHreg x:(MOVHreg _)) + // match: (MOVWreg x:(MOVHreg _)) // result: (MOVDreg x) for { x := v.Args[0] @@ -13326,11 +13938,19 @@ func rewriteValueARM64_OpARM64MOVHreg_0(v *Value) bool { v.AddArg(x) return true } - return false -} -func rewriteValueARM64_OpARM64MOVHreg_10(v *Value) bool { - // match: (MOVHreg (MOVDconst [c])) - // result: (MOVDconst [int64(int16(c))]) + // match: (MOVWreg x:(MOVWreg _)) + // result: (MOVDreg x) + for { + x := v.Args[0] + if x.Op != OpARM64MOVWreg { + break + } + v.reset(OpARM64MOVDreg) + v.AddArg(x) + return true + } + // match: (MOVWreg (MOVDconst [c])) + // result: (MOVDconst [int64(int32(c))]) for { v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { @@ -13338,12 +13958,12 @@ func rewriteValueARM64_OpARM64MOVHreg_10(v *Value) bool { } c := v_0.AuxInt v.reset(OpARM64MOVDconst) - v.AuxInt = int64(int16(c)) + v.AuxInt = int64(int32(c)) return true } - // match: (MOVHreg (SLLconst [lc] x)) - // cond: lc < 16 - // result: (SBFIZ [armBFAuxInt(lc, 16-lc)] x) + // match: (MOVWreg (SLLconst [lc] x)) + // cond: lc < 32 + // result: (SBFIZ [armBFAuxInt(lc, 32-lc)] x) for { v_0 := v.Args[0] if v_0.Op != OpARM64SLLconst { @@ -13351,22 +13971,42 @@ func rewriteValueARM64_OpARM64MOVHreg_10(v *Value) bool { } lc := v_0.AuxInt x := v_0.Args[0] - if !(lc < 16) { + if !(lc < 32) { break } v.reset(OpARM64SBFIZ) - v.AuxInt = armBFAuxInt(lc, 16-lc) + v.AuxInt = armBFAuxInt(lc, 32-lc) v.AddArg(x) return true } return false } -func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { +func rewriteValueARM64_OpARM64MOVWstore_0(v *Value) bool { b := v.Block config := b.Func.Config - // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) + // match: (MOVWstore [off] {sym} ptr (FMOVSfpgp val) mem) + // result: (FMOVSstore [off] {sym} ptr val mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64FMOVSfpgp { + break + } + val := v_1.Args[0] + v.reset(OpARM64FMOVSstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(val) + v.AddArg(mem) + return true + } + // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVHstore [off1+off2] {sym} ptr val mem) + // result: (MOVWstore [off1+off2] {sym} ptr val mem) for { off1 := v.AuxInt sym := v.Aux @@ -13381,7 +14021,7 @@ func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(OpARM64MOVHstore) + v.reset(OpARM64MOVWstore) v.AuxInt = off1 + off2 v.Aux = sym v.AddArg(ptr) @@ -13389,9 +14029,9 @@ func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVHstore [off] {sym} (ADD ptr idx) val mem) + // match: (MOVWstore [off] {sym} (ADD ptr idx) val mem) // cond: off == 0 && sym == nil - // result: (MOVHstoreidx ptr idx val mem) + // result: (MOVWstoreidx ptr idx val mem) for { off := v.AuxInt sym := v.Aux @@ -13406,22 +14046,22 @@ func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { if !(off == 0 && sym == nil) { break } - v.reset(OpARM64MOVHstoreidx) + v.reset(OpARM64MOVWstoreidx) v.AddArg(ptr) v.AddArg(idx) v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVHstore [off] {sym} (ADDshiftLL [1] ptr idx) val mem) + // match: (MOVWstore [off] {sym} (ADDshiftLL [2] ptr idx) val mem) // cond: off == 0 && sym == nil - // result: (MOVHstoreidx2 ptr idx val mem) + // result: (MOVWstoreidx4 ptr idx val mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 1 { + if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 2 { break } idx := v_0.Args[1] @@ -13430,16 +14070,16 @@ func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { if !(off == 0 && sym == nil) { break } - v.reset(OpARM64MOVHstoreidx2) + v.reset(OpARM64MOVWstoreidx4) v.AddArg(ptr) v.AddArg(idx) v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVHstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem) + // match: (MOVWstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem) // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) + // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) for { off1 := v.AuxInt sym1 := v.Aux @@ -13455,7 +14095,7 @@ func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(OpARM64MOVHstore) + v.reset(OpARM64MOVWstore) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) v.AddArg(ptr) @@ -13463,8 +14103,8 @@ func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVHstore [off] {sym} ptr (MOVDconst [0]) mem) - // result: (MOVHstorezero [off] {sym} ptr mem) + // match: (MOVWstore [off] {sym} ptr (MOVDconst [0]) mem) + // result: (MOVWstorezero [off] {sym} ptr mem) for { off := v.AuxInt sym := v.Aux @@ -13474,55 +14114,15 @@ func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 0 { break } - v.reset(OpARM64MOVHstorezero) + v.reset(OpARM64MOVWstorezero) v.AuxInt = off v.Aux = sym v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem) - // result: (MOVHstore [off] {sym} ptr x mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVHreg { - break - } - x := v_1.Args[0] - v.reset(OpARM64MOVHstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true - } - // match: (MOVHstore [off] {sym} ptr (MOVHUreg x) mem) - // result: (MOVHstore [off] {sym} ptr x mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVHUreg { - break - } - x := v_1.Args[0] - v.reset(OpARM64MOVHstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true - } - // match: (MOVHstore [off] {sym} ptr (MOVWreg x) mem) - // result: (MOVHstore [off] {sym} ptr x mem) + // match: (MOVWstore [off] {sym} ptr (MOVWreg x) mem) + // result: (MOVWstore [off] {sym} ptr x mem) for { off := v.AuxInt sym := v.Aux @@ -13533,7 +14133,7 @@ func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { break } x := v_1.Args[0] - v.reset(OpARM64MOVHstore) + v.reset(OpARM64MOVWstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) @@ -13541,8 +14141,8 @@ func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVHstore [off] {sym} ptr (MOVWUreg x) mem) - // result: (MOVHstore [off] {sym} ptr x mem) + // match: (MOVWstore [off] {sym} ptr (MOVWUreg x) mem) + // result: (MOVWstore [off] {sym} ptr x mem) for { off := v.AuxInt sym := v.Aux @@ -13553,7 +14153,7 @@ func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { break } x := v_1.Args[0] - v.reset(OpARM64MOVHstore) + v.reset(OpARM64MOVWstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) @@ -13561,21 +14161,21 @@ func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVHstore [i] {s} ptr0 (SRLconst [16] w) x:(MOVHstore [i-2] {s} ptr1 w mem)) + // match: (MOVWstore [i] {s} ptr0 (SRLconst [32] w) x:(MOVWstore [i-4] {s} ptr1 w mem)) // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) - // result: (MOVWstore [i-2] {s} ptr0 w mem) + // result: (MOVDstore [i-4] {s} ptr0 w mem) for { i := v.AuxInt s := v.Aux _ = v.Args[2] ptr0 := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 16 { + if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 32 { break } w := v_1.Args[0] x := v.Args[2] - if x.Op != OpARM64MOVHstore || x.AuxInt != i-2 || x.Aux != s { + if x.Op != OpARM64MOVWstore || x.AuxInt != i-4 || x.Aux != s { break } mem := x.Args[2] @@ -13583,60 +14183,19 @@ func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { if w != x.Args[1] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { break } - v.reset(OpARM64MOVWstore) - v.AuxInt = i - 2 + v.reset(OpARM64MOVDstore) + v.AuxInt = i - 4 v.Aux = s v.AddArg(ptr0) v.AddArg(w) v.AddArg(mem) return true } - return false -} -func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { - b := v.Block - // match: (MOVHstore [2] {s} (ADD ptr0 idx0) (SRLconst [16] w) x:(MOVHstoreidx ptr1 idx1 w mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVWstoreidx ptr1 idx1 w mem) - for { - if v.AuxInt != 2 { - break - } - s := v.Aux - _ = v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { - break - } - idx0 := v_0.Args[1] - ptr0 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 16 { - break - } - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVHstoreidx { - break - } - mem := x.Args[3] - ptr1 := x.Args[0] - idx1 := x.Args[1] - if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { - break - } - v.reset(OpARM64MOVWstoreidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(w) - v.AddArg(mem) - return true - } - // match: (MOVHstore [2] {s} (ADD idx0 ptr0) (SRLconst [16] w) x:(MOVHstoreidx ptr1 idx1 w mem)) + // match: (MOVWstore [4] {s} (ADD ptr0 idx0) (SRLconst [32] w) x:(MOVWstoreidx ptr1 idx1 w mem)) // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVWstoreidx ptr1 idx1 w mem) + // result: (MOVDstoreidx ptr1 idx1 w mem) for { - if v.AuxInt != 2 { + if v.AuxInt != 4 { break } s := v.Aux @@ -13645,52 +14204,60 @@ func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { if v_0.Op != OpARM64ADD { break } - ptr0 := v_0.Args[1] - idx0 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 16 { - break - } - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVHstoreidx { - break - } - mem := x.Args[3] - ptr1 := x.Args[0] - idx1 := x.Args[1] - if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr0 := v_0.Args[_i0] + idx0 := v_0.Args[1^_i0] + v_1 := v.Args[1] + if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 32 { + continue + } + w := v_1.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVWstoreidx { + continue + } + mem := x.Args[3] + ptr1 := x.Args[0] + idx1 := x.Args[1] + if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + continue + } + v.reset(OpARM64MOVDstoreidx) + v.AddArg(ptr1) + v.AddArg(idx1) + v.AddArg(w) + v.AddArg(mem) + return true } - v.reset(OpARM64MOVWstoreidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(w) - v.AddArg(mem) - return true + break } - // match: (MOVHstore [2] {s} (ADDshiftLL [1] ptr0 idx0) (SRLconst [16] w) x:(MOVHstoreidx2 ptr1 idx1 w mem)) + return false +} +func rewriteValueARM64_OpARM64MOVWstore_10(v *Value) bool { + b := v.Block + // match: (MOVWstore [4] {s} (ADDshiftLL [2] ptr0 idx0) (SRLconst [32] w) x:(MOVWstoreidx4 ptr1 idx1 w mem)) // cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x) - // result: (MOVWstoreidx ptr1 (SLLconst [1] idx1) w mem) + // result: (MOVDstoreidx ptr1 (SLLconst [2] idx1) w mem) for { - if v.AuxInt != 2 { + if v.AuxInt != 4 { break } s := v.Aux _ = v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 1 { + if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 2 { break } idx0 := v_0.Args[1] ptr0 := v_0.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 16 { + if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 32 { break } w := v_1.Args[0] x := v.Args[2] - if x.Op != OpARM64MOVHstoreidx2 { + if x.Op != OpARM64MOVWstoreidx4 { break } mem := x.Args[3] @@ -13699,88 +14266,53 @@ func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { if w != x.Args[2] || !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) { break } - v.reset(OpARM64MOVWstoreidx) + v.reset(OpARM64MOVDstoreidx) v.AddArg(ptr1) v0 := b.NewValue0(v.Pos, OpARM64SLLconst, idx1.Type) - v0.AuxInt = 1 + v0.AuxInt = 2 v0.AddArg(idx1) v.AddArg(v0) v.AddArg(w) v.AddArg(mem) return true } - // match: (MOVHstore [i] {s} ptr0 (UBFX [armBFAuxInt(16, 16)] w) x:(MOVHstore [i-2] {s} ptr1 w mem)) + // match: (MOVWstore [i] {s} ptr0 (SRLconst [j] w) x:(MOVWstore [i-4] {s} ptr1 w0:(SRLconst [j-32] w) mem)) // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) - // result: (MOVWstore [i-2] {s} ptr0 w mem) + // result: (MOVDstore [i-4] {s} ptr0 w0 mem) for { i := v.AuxInt s := v.Aux _ = v.Args[2] ptr0 := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64UBFX || v_1.AuxInt != armBFAuxInt(16, 16) { + if v_1.Op != OpARM64SRLconst { break } + j := v_1.AuxInt w := v_1.Args[0] x := v.Args[2] - if x.Op != OpARM64MOVHstore || x.AuxInt != i-2 || x.Aux != s { + if x.Op != OpARM64MOVWstore || x.AuxInt != i-4 || x.Aux != s { break } mem := x.Args[2] ptr1 := x.Args[0] - if w != x.Args[1] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { + w0 := x.Args[1] + if w0.Op != OpARM64SRLconst || w0.AuxInt != j-32 || w != w0.Args[0] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { break } - v.reset(OpARM64MOVWstore) - v.AuxInt = i - 2 + v.reset(OpARM64MOVDstore) + v.AuxInt = i - 4 v.Aux = s v.AddArg(ptr0) - v.AddArg(w) - v.AddArg(mem) - return true - } - // match: (MOVHstore [2] {s} (ADD ptr0 idx0) (UBFX [armBFAuxInt(16, 16)] w) x:(MOVHstoreidx ptr1 idx1 w mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVWstoreidx ptr1 idx1 w mem) - for { - if v.AuxInt != 2 { - break - } - s := v.Aux - _ = v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { - break - } - idx0 := v_0.Args[1] - ptr0 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64UBFX || v_1.AuxInt != armBFAuxInt(16, 16) { - break - } - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVHstoreidx { - break - } - mem := x.Args[3] - ptr1 := x.Args[0] - idx1 := x.Args[1] - if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { - break - } - v.reset(OpARM64MOVWstoreidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(w) + v.AddArg(w0) v.AddArg(mem) return true } - // match: (MOVHstore [2] {s} (ADD idx0 ptr0) (UBFX [armBFAuxInt(16, 16)] w) x:(MOVHstoreidx ptr1 idx1 w mem)) + // match: (MOVWstore [4] {s} (ADD ptr0 idx0) (SRLconst [j] w) x:(MOVWstoreidx ptr1 idx1 w0:(SRLconst [j-32] w) mem)) // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVWstoreidx ptr1 idx1 w mem) + // result: (MOVDstoreidx ptr1 idx1 w0 mem) for { - if v.AuxInt != 2 { + if v.AuxInt != 4 { break } s := v.Aux @@ -13789,11779 +14321,4995 @@ func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { if v_0.Op != OpARM64ADD { break } - ptr0 := v_0.Args[1] - idx0 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64UBFX || v_1.AuxInt != armBFAuxInt(16, 16) { - break - } - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVHstoreidx { - break - } - mem := x.Args[3] - ptr1 := x.Args[0] - idx1 := x.Args[1] - if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr0 := v_0.Args[_i0] + idx0 := v_0.Args[1^_i0] + v_1 := v.Args[1] + if v_1.Op != OpARM64SRLconst { + continue + } + j := v_1.AuxInt + w := v_1.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVWstoreidx { + continue + } + mem := x.Args[3] + ptr1 := x.Args[0] + idx1 := x.Args[1] + w0 := x.Args[2] + if w0.Op != OpARM64SRLconst || w0.AuxInt != j-32 || w != w0.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + continue + } + v.reset(OpARM64MOVDstoreidx) + v.AddArg(ptr1) + v.AddArg(idx1) + v.AddArg(w0) + v.AddArg(mem) + return true } - v.reset(OpARM64MOVWstoreidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(w) - v.AddArg(mem) - return true + break } - // match: (MOVHstore [2] {s} (ADDshiftLL [1] ptr0 idx0) (UBFX [armBFAuxInt(16, 16)] w) x:(MOVHstoreidx2 ptr1 idx1 w mem)) + // match: (MOVWstore [4] {s} (ADDshiftLL [2] ptr0 idx0) (SRLconst [j] w) x:(MOVWstoreidx4 ptr1 idx1 w0:(SRLconst [j-32] w) mem)) // cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x) - // result: (MOVWstoreidx ptr1 (SLLconst [1] idx1) w mem) + // result: (MOVDstoreidx ptr1 (SLLconst [2] idx1) w0 mem) for { - if v.AuxInt != 2 { + if v.AuxInt != 4 { break } s := v.Aux _ = v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 1 { + if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 2 { break } idx0 := v_0.Args[1] ptr0 := v_0.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64UBFX || v_1.AuxInt != armBFAuxInt(16, 16) { + if v_1.Op != OpARM64SRLconst { break } + j := v_1.AuxInt w := v_1.Args[0] x := v.Args[2] - if x.Op != OpARM64MOVHstoreidx2 { + if x.Op != OpARM64MOVWstoreidx4 { break } mem := x.Args[3] ptr1 := x.Args[0] idx1 := x.Args[1] - if w != x.Args[2] || !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) { + w0 := x.Args[2] + if w0.Op != OpARM64SRLconst || w0.AuxInt != j-32 || w != w0.Args[0] || !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) { break } - v.reset(OpARM64MOVWstoreidx) + v.reset(OpARM64MOVDstoreidx) v.AddArg(ptr1) v0 := b.NewValue0(v.Pos, OpARM64SLLconst, idx1.Type) - v0.AuxInt = 1 + v0.AuxInt = 2 v0.AddArg(idx1) v.AddArg(v0) - v.AddArg(w) + v.AddArg(w0) v.AddArg(mem) return true } - // match: (MOVHstore [i] {s} ptr0 (SRLconst [16] (MOVDreg w)) x:(MOVHstore [i-2] {s} ptr1 w mem)) - // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) - // result: (MOVWstore [i-2] {s} ptr0 w mem) + return false +} +func rewriteValueARM64_OpARM64MOVWstoreidx_0(v *Value) bool { + // match: (MOVWstoreidx ptr (MOVDconst [c]) val mem) + // result: (MOVWstore [c] ptr val mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - ptr0 := v.Args[0] + mem := v.Args[3] + ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 16 { - break - } - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpARM64MOVDreg { - break - } - w := v_1_0.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVHstore || x.AuxInt != i-2 || x.Aux != s { - break - } - mem := x.Args[2] - ptr1 := x.Args[0] - if w != x.Args[1] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { + if v_1.Op != OpARM64MOVDconst { break } + c := v_1.AuxInt + val := v.Args[2] v.reset(OpARM64MOVWstore) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(ptr0) - v.AddArg(w) + v.AuxInt = c + v.AddArg(ptr) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVHstore [2] {s} (ADD ptr0 idx0) (SRLconst [16] (MOVDreg w)) x:(MOVHstoreidx ptr1 idx1 w mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVWstoreidx ptr1 idx1 w mem) + // match: (MOVWstoreidx (MOVDconst [c]) idx val mem) + // result: (MOVWstore [c] idx val mem) for { - if v.AuxInt != 2 { - break - } - s := v.Aux - _ = v.Args[2] + mem := v.Args[3] v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { + if v_0.Op != OpARM64MOVDconst { break } - idx0 := v_0.Args[1] - ptr0 := v_0.Args[0] + c := v_0.AuxInt + idx := v.Args[1] + val := v.Args[2] + v.reset(OpARM64MOVWstore) + v.AuxInt = c + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true + } + // match: (MOVWstoreidx ptr (SLLconst [2] idx) val mem) + // result: (MOVWstoreidx4 ptr idx val mem) + for { + mem := v.Args[3] + ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 16 { - break - } - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpARM64MOVDreg { - break - } - w := v_1_0.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVHstoreidx { - break - } - mem := x.Args[3] - ptr1 := x.Args[0] - idx1 := x.Args[1] - if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + if v_1.Op != OpARM64SLLconst || v_1.AuxInt != 2 { break } - v.reset(OpARM64MOVWstoreidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(w) + idx := v_1.Args[0] + val := v.Args[2] + v.reset(OpARM64MOVWstoreidx4) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVHstore [2] {s} (ADD idx0 ptr0) (SRLconst [16] (MOVDreg w)) x:(MOVHstoreidx ptr1 idx1 w mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVWstoreidx ptr1 idx1 w mem) + // match: (MOVWstoreidx (SLLconst [2] idx) ptr val mem) + // result: (MOVWstoreidx4 ptr idx val mem) for { - if v.AuxInt != 2 { - break - } - s := v.Aux - _ = v.Args[2] + mem := v.Args[3] v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { - break - } - ptr0 := v_0.Args[1] - idx0 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 16 { - break - } - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpARM64MOVDreg { + if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 2 { break } - w := v_1_0.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVHstoreidx { + idx := v_0.Args[0] + ptr := v.Args[1] + val := v.Args[2] + v.reset(OpARM64MOVWstoreidx4) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true + } + // match: (MOVWstoreidx ptr idx (MOVDconst [0]) mem) + // result: (MOVWstorezeroidx ptr idx mem) + for { + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 0 { break } - mem := x.Args[3] - ptr1 := x.Args[0] - idx1 := x.Args[1] - if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + v.reset(OpARM64MOVWstorezeroidx) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + // match: (MOVWstoreidx ptr idx (MOVWreg x) mem) + // result: (MOVWstoreidx ptr idx x mem) + for { + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVWreg { break } + x := v_2.Args[0] v.reset(OpARM64MOVWstoreidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(w) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(x) v.AddArg(mem) return true } - return false -} -func rewriteValueARM64_OpARM64MOVHstore_20(v *Value) bool { - b := v.Block - // match: (MOVHstore [2] {s} (ADDshiftLL [1] ptr0 idx0) (SRLconst [16] (MOVDreg w)) x:(MOVHstoreidx2 ptr1 idx1 w mem)) - // cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x) - // result: (MOVWstoreidx ptr1 (SLLconst [1] idx1) w mem) + // match: (MOVWstoreidx ptr idx (MOVWUreg x) mem) + // result: (MOVWstoreidx ptr idx x mem) for { - if v.AuxInt != 2 { - break - } - s := v.Aux - _ = v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 1 { + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVWUreg { break } - idx0 := v_0.Args[1] - ptr0 := v_0.Args[0] + x := v_2.Args[0] + v.reset(OpARM64MOVWstoreidx) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(x) + v.AddArg(mem) + return true + } + // match: (MOVWstoreidx ptr (ADDconst [4] idx) (SRLconst [32] w) x:(MOVWstoreidx ptr idx w mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVDstoreidx ptr idx w mem) + for { + _ = v.Args[3] + ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 16 { + if v_1.Op != OpARM64ADDconst || v_1.AuxInt != 4 { break } - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpARM64MOVDreg { + idx := v_1.Args[0] + v_2 := v.Args[2] + if v_2.Op != OpARM64SRLconst || v_2.AuxInt != 32 { break } - w := v_1_0.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVHstoreidx2 { + w := v_2.Args[0] + x := v.Args[3] + if x.Op != OpARM64MOVWstoreidx { break } mem := x.Args[3] - ptr1 := x.Args[0] - idx1 := x.Args[1] - if w != x.Args[2] || !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) { + if ptr != x.Args[0] || idx != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { break } - v.reset(OpARM64MOVWstoreidx) - v.AddArg(ptr1) - v0 := b.NewValue0(v.Pos, OpARM64SLLconst, idx1.Type) - v0.AuxInt = 1 - v0.AddArg(idx1) - v.AddArg(v0) + v.reset(OpARM64MOVDstoreidx) + v.AddArg(ptr) + v.AddArg(idx) v.AddArg(w) v.AddArg(mem) return true } - // match: (MOVHstore [i] {s} ptr0 (SRLconst [j] w) x:(MOVHstore [i-2] {s} ptr1 w0:(SRLconst [j-16] w) mem)) - // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) - // result: (MOVWstore [i-2] {s} ptr0 w0 mem) + return false +} +func rewriteValueARM64_OpARM64MOVWstoreidx4_0(v *Value) bool { + // match: (MOVWstoreidx4 ptr (MOVDconst [c]) val mem) + // result: (MOVWstore [c<<2] ptr val mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - ptr0 := v.Args[0] + mem := v.Args[3] + ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst { - break - } - j := v_1.AuxInt - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVHstore || x.AuxInt != i-2 || x.Aux != s { - break - } - mem := x.Args[2] - ptr1 := x.Args[0] - w0 := x.Args[1] - if w0.Op != OpARM64SRLconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { + if v_1.Op != OpARM64MOVDconst { break } + c := v_1.AuxInt + val := v.Args[2] v.reset(OpARM64MOVWstore) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(ptr0) - v.AddArg(w0) + v.AuxInt = c << 2 + v.AddArg(ptr) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVHstore [2] {s} (ADD ptr0 idx0) (SRLconst [j] w) x:(MOVHstoreidx ptr1 idx1 w0:(SRLconst [j-16] w) mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVWstoreidx ptr1 idx1 w0 mem) + // match: (MOVWstoreidx4 ptr idx (MOVDconst [0]) mem) + // result: (MOVWstorezeroidx4 ptr idx mem) for { - if v.AuxInt != 2 { - break - } - s := v.Aux - _ = v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 0 { break } - idx0 := v_0.Args[1] - ptr0 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst { + v.reset(OpARM64MOVWstorezeroidx4) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + // match: (MOVWstoreidx4 ptr idx (MOVWreg x) mem) + // result: (MOVWstoreidx4 ptr idx x mem) + for { + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVWreg { break } - j := v_1.AuxInt - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVHstoreidx { + x := v_2.Args[0] + v.reset(OpARM64MOVWstoreidx4) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(x) + v.AddArg(mem) + return true + } + // match: (MOVWstoreidx4 ptr idx (MOVWUreg x) mem) + // result: (MOVWstoreidx4 ptr idx x mem) + for { + mem := v.Args[3] + ptr := v.Args[0] + idx := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVWUreg { break } - mem := x.Args[3] - ptr1 := x.Args[0] - idx1 := x.Args[1] - w0 := x.Args[2] - if w0.Op != OpARM64SRLconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + x := v_2.Args[0] + v.reset(OpARM64MOVWstoreidx4) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(x) + v.AddArg(mem) + return true + } + return false +} +func rewriteValueARM64_OpARM64MOVWstorezero_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (MOVWstorezero [off1] {sym} (ADDconst [off2] ptr) mem) + // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVWstorezero [off1+off2] {sym} ptr mem) + for { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADDconst { break } - v.reset(OpARM64MOVWstoreidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(w0) + off2 := v_0.AuxInt + ptr := v_0.Args[0] + if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + break + } + v.reset(OpARM64MOVWstorezero) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVHstore [2] {s} (ADD idx0 ptr0) (SRLconst [j] w) x:(MOVHstoreidx ptr1 idx1 w0:(SRLconst [j-16] w) mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVWstoreidx ptr1 idx1 w0 mem) + // match: (MOVWstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (MOVWstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) for { - if v.AuxInt != 2 { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDaddr { break } - s := v.Aux - _ = v.Args[2] + off2 := v_0.AuxInt + sym2 := v_0.Aux + ptr := v_0.Args[0] + if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + break + } + v.reset(OpARM64MOVWstorezero) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(ptr) + v.AddArg(mem) + return true + } + // match: (MOVWstorezero [off] {sym} (ADD ptr idx) mem) + // cond: off == 0 && sym == nil + // result: (MOVWstorezeroidx ptr idx mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } - ptr0 := v_0.Args[1] - idx0 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst { + idx := v_0.Args[1] + ptr := v_0.Args[0] + if !(off == 0 && sym == nil) { break } - j := v_1.AuxInt - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVHstoreidx { + v.reset(OpARM64MOVWstorezeroidx) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + // match: (MOVWstorezero [off] {sym} (ADDshiftLL [2] ptr idx) mem) + // cond: off == 0 && sym == nil + // result: (MOVWstorezeroidx4 ptr idx mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 2 { break } - mem := x.Args[3] + idx := v_0.Args[1] + ptr := v_0.Args[0] + if !(off == 0 && sym == nil) { + break + } + v.reset(OpARM64MOVWstorezeroidx4) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + // match: (MOVWstorezero [i] {s} ptr0 x:(MOVWstorezero [j] {s} ptr1 mem)) + // cond: x.Uses == 1 && areAdjacentOffsets(i,j,4) && is32Bit(min(i,j)) && isSamePtr(ptr0, ptr1) && clobber(x) + // result: (MOVDstorezero [min(i,j)] {s} ptr0 mem) + for { + i := v.AuxInt + s := v.Aux + _ = v.Args[1] + ptr0 := v.Args[0] + x := v.Args[1] + if x.Op != OpARM64MOVWstorezero { + break + } + j := x.AuxInt + if x.Aux != s { + break + } + mem := x.Args[1] ptr1 := x.Args[0] - idx1 := x.Args[1] - w0 := x.Args[2] - if w0.Op != OpARM64SRLconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + if !(x.Uses == 1 && areAdjacentOffsets(i, j, 4) && is32Bit(min(i, j)) && isSamePtr(ptr0, ptr1) && clobber(x)) { break } - v.reset(OpARM64MOVWstoreidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(w0) + v.reset(OpARM64MOVDstorezero) + v.AuxInt = min(i, j) + v.Aux = s + v.AddArg(ptr0) v.AddArg(mem) return true } - // match: (MOVHstore [2] {s} (ADDshiftLL [1] ptr0 idx0) (SRLconst [j] w) x:(MOVHstoreidx2 ptr1 idx1 w0:(SRLconst [j-16] w) mem)) + // match: (MOVWstorezero [4] {s} (ADD ptr0 idx0) x:(MOVWstorezeroidx ptr1 idx1 mem)) + // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) + // result: (MOVDstorezeroidx ptr1 idx1 mem) + for { + if v.AuxInt != 4 { + break + } + s := v.Aux + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64ADD { + break + } + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr0 := v_0.Args[_i0] + idx0 := v_0.Args[1^_i0] + x := v.Args[1] + if x.Op != OpARM64MOVWstorezeroidx { + continue + } + mem := x.Args[2] + ptr1 := x.Args[0] + idx1 := x.Args[1] + if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + continue + } + v.reset(OpARM64MOVDstorezeroidx) + v.AddArg(ptr1) + v.AddArg(idx1) + v.AddArg(mem) + return true + } + break + } + // match: (MOVWstorezero [4] {s} (ADDshiftLL [2] ptr0 idx0) x:(MOVWstorezeroidx4 ptr1 idx1 mem)) // cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x) - // result: (MOVWstoreidx ptr1 (SLLconst [1] idx1) w0 mem) + // result: (MOVDstorezeroidx ptr1 (SLLconst [2] idx1) mem) for { - if v.AuxInt != 2 { + if v.AuxInt != 4 { break } s := v.Aux - _ = v.Args[2] + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 1 { + if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 2 { break } idx0 := v_0.Args[1] ptr0 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst { - break - } - j := v_1.AuxInt - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVHstoreidx2 { + x := v.Args[1] + if x.Op != OpARM64MOVWstorezeroidx4 { break } - mem := x.Args[3] + mem := x.Args[2] ptr1 := x.Args[0] idx1 := x.Args[1] - w0 := x.Args[2] - if w0.Op != OpARM64SRLconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) { + if !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) { break } - v.reset(OpARM64MOVWstoreidx) + v.reset(OpARM64MOVDstorezeroidx) v.AddArg(ptr1) v0 := b.NewValue0(v.Pos, OpARM64SLLconst, idx1.Type) - v0.AuxInt = 1 + v0.AuxInt = 2 v0.AddArg(idx1) v.AddArg(v0) - v.AddArg(w0) v.AddArg(mem) return true } return false } -func rewriteValueARM64_OpARM64MOVHstoreidx_0(v *Value) bool { - // match: (MOVHstoreidx ptr (MOVDconst [c]) val mem) - // result: (MOVHstore [c] ptr val mem) +func rewriteValueARM64_OpARM64MOVWstorezeroidx_0(v *Value) bool { + // match: (MOVWstorezeroidx ptr (MOVDconst [c]) mem) + // result: (MOVWstorezero [c] ptr mem) for { - mem := v.Args[3] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - val := v.Args[2] - v.reset(OpARM64MOVHstore) + v.reset(OpARM64MOVWstorezero) v.AuxInt = c v.AddArg(ptr) - v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVHstoreidx (MOVDconst [c]) idx val mem) - // result: (MOVHstore [c] idx val mem) + // match: (MOVWstorezeroidx (MOVDconst [c]) idx mem) + // result: (MOVWstorezero [c] idx mem) for { - mem := v.Args[3] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt idx := v.Args[1] - val := v.Args[2] - v.reset(OpARM64MOVHstore) + v.reset(OpARM64MOVWstorezero) v.AuxInt = c v.AddArg(idx) - v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVHstoreidx ptr (SLLconst [1] idx) val mem) - // result: (MOVHstoreidx2 ptr idx val mem) + // match: (MOVWstorezeroidx ptr (SLLconst [2] idx) mem) + // result: (MOVWstorezeroidx4 ptr idx mem) for { - mem := v.Args[3] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64SLLconst || v_1.AuxInt != 1 { + if v_1.Op != OpARM64SLLconst || v_1.AuxInt != 2 { break } idx := v_1.Args[0] - val := v.Args[2] - v.reset(OpARM64MOVHstoreidx2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVHstoreidx ptr (ADD idx idx) val mem) - // result: (MOVHstoreidx2 ptr idx val mem) - for { - mem := v.Args[3] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64ADD { - break - } - idx := v_1.Args[1] - if idx != v_1.Args[0] { - break - } - val := v.Args[2] - v.reset(OpARM64MOVHstoreidx2) + v.reset(OpARM64MOVWstorezeroidx4) v.AddArg(ptr) v.AddArg(idx) - v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVHstoreidx (SLLconst [1] idx) ptr val mem) - // result: (MOVHstoreidx2 ptr idx val mem) + // match: (MOVWstorezeroidx (SLLconst [2] idx) ptr mem) + // result: (MOVWstorezeroidx4 ptr idx mem) for { - mem := v.Args[3] + mem := v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 1 { + if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 2 { break } idx := v_0.Args[0] ptr := v.Args[1] - val := v.Args[2] - v.reset(OpARM64MOVHstoreidx2) + v.reset(OpARM64MOVWstorezeroidx4) v.AddArg(ptr) v.AddArg(idx) - v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVHstoreidx (ADD idx idx) ptr val mem) - // result: (MOVHstoreidx2 ptr idx val mem) + // match: (MOVWstorezeroidx ptr (ADDconst [4] idx) x:(MOVWstorezeroidx ptr idx mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVDstorezeroidx ptr idx mem) for { - mem := v.Args[3] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { + _ = v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64ADDconst || v_1.AuxInt != 4 { break } - idx := v_0.Args[1] - if idx != v_0.Args[0] { + idx := v_1.Args[0] + x := v.Args[2] + if x.Op != OpARM64MOVWstorezeroidx { break } - ptr := v.Args[1] - val := v.Args[2] - v.reset(OpARM64MOVHstoreidx2) + mem := x.Args[2] + if ptr != x.Args[0] || idx != x.Args[1] || !(x.Uses == 1 && clobber(x)) { + break + } + v.reset(OpARM64MOVDstorezeroidx) v.AddArg(ptr) v.AddArg(idx) - v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVHstoreidx ptr idx (MOVDconst [0]) mem) - // result: (MOVHstorezeroidx ptr idx mem) + return false +} +func rewriteValueARM64_OpARM64MOVWstorezeroidx4_0(v *Value) bool { + // match: (MOVWstorezeroidx4 ptr (MOVDconst [c]) mem) + // result: (MOVWstorezero [c<<2] ptr mem) for { - mem := v.Args[3] + mem := v.Args[2] ptr := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 0 { + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVHstorezeroidx) + c := v_1.AuxInt + v.reset(OpARM64MOVWstorezero) + v.AuxInt = c << 2 v.AddArg(ptr) - v.AddArg(idx) v.AddArg(mem) return true } - // match: (MOVHstoreidx ptr idx (MOVHreg x) mem) - // result: (MOVHstoreidx ptr idx x mem) + return false +} +func rewriteValueARM64_OpARM64MSUB_0(v *Value) bool { + b := v.Block + // match: (MSUB a x (MOVDconst [-1])) + // result: (ADD a x) for { - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] + _ = v.Args[2] + a := v.Args[0] + x := v.Args[1] v_2 := v.Args[2] - if v_2.Op != OpARM64MOVHreg { + if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != -1 { break } - x := v_2.Args[0] - v.reset(OpARM64MOVHstoreidx) - v.AddArg(ptr) - v.AddArg(idx) + v.reset(OpARM64ADD) + v.AddArg(a) v.AddArg(x) - v.AddArg(mem) return true } - // match: (MOVHstoreidx ptr idx (MOVHUreg x) mem) - // result: (MOVHstoreidx ptr idx x mem) + // match: (MSUB a _ (MOVDconst [0])) + // result: a for { - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] + _ = v.Args[2] + a := v.Args[0] v_2 := v.Args[2] - if v_2.Op != OpARM64MOVHUreg { + if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 0 { break } - x := v_2.Args[0] - v.reset(OpARM64MOVHstoreidx) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(x) - v.AddArg(mem) + v.reset(OpCopy) + v.Type = a.Type + v.AddArg(a) return true } - // match: (MOVHstoreidx ptr idx (MOVWreg x) mem) - // result: (MOVHstoreidx ptr idx x mem) + // match: (MSUB a x (MOVDconst [1])) + // result: (SUB a x) for { - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] + _ = v.Args[2] + a := v.Args[0] + x := v.Args[1] v_2 := v.Args[2] - if v_2.Op != OpARM64MOVWreg { + if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 1 { break } - x := v_2.Args[0] - v.reset(OpARM64MOVHstoreidx) - v.AddArg(ptr) - v.AddArg(idx) + v.reset(OpARM64SUB) + v.AddArg(a) v.AddArg(x) - v.AddArg(mem) return true } - return false -} -func rewriteValueARM64_OpARM64MOVHstoreidx_10(v *Value) bool { - // match: (MOVHstoreidx ptr idx (MOVWUreg x) mem) - // result: (MOVHstoreidx ptr idx x mem) + // match: (MSUB a x (MOVDconst [c])) + // cond: isPowerOfTwo(c) + // result: (SUBshiftLL a x [log2(c)]) for { - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] + _ = v.Args[2] + a := v.Args[0] + x := v.Args[1] v_2 := v.Args[2] - if v_2.Op != OpARM64MOVWUreg { + if v_2.Op != OpARM64MOVDconst { break } - x := v_2.Args[0] - v.reset(OpARM64MOVHstoreidx) - v.AddArg(ptr) - v.AddArg(idx) + c := v_2.AuxInt + if !(isPowerOfTwo(c)) { + break + } + v.reset(OpARM64SUBshiftLL) + v.AuxInt = log2(c) + v.AddArg(a) v.AddArg(x) - v.AddArg(mem) return true } - // match: (MOVHstoreidx ptr (ADDconst [2] idx) (SRLconst [16] w) x:(MOVHstoreidx ptr idx w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx ptr idx w mem) + // match: (MSUB a x (MOVDconst [c])) + // cond: isPowerOfTwo(c-1) && c>=3 + // result: (SUB a (ADDshiftLL x x [log2(c-1)])) for { - _ = v.Args[3] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64ADDconst || v_1.AuxInt != 2 { - break - } - idx := v_1.Args[0] + _ = v.Args[2] + a := v.Args[0] + x := v.Args[1] v_2 := v.Args[2] - if v_2.Op != OpARM64SRLconst || v_2.AuxInt != 16 { - break - } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpARM64MOVHstoreidx { + if v_2.Op != OpARM64MOVDconst { break } - mem := x.Args[3] - if ptr != x.Args[0] || idx != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + c := v_2.AuxInt + if !(isPowerOfTwo(c-1) && c >= 3) { break } - v.reset(OpARM64MOVWstoreidx) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) + v.reset(OpARM64SUB) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = log2(c - 1) + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - return false -} -func rewriteValueARM64_OpARM64MOVHstoreidx2_0(v *Value) bool { - // match: (MOVHstoreidx2 ptr (MOVDconst [c]) val mem) - // result: (MOVHstore [c<<1] ptr val mem) + // match: (MSUB a x (MOVDconst [c])) + // cond: isPowerOfTwo(c+1) && c>=7 + // result: (ADD a (SUBshiftLL x x [log2(c+1)])) for { - mem := v.Args[3] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + _ = v.Args[2] + a := v.Args[0] + x := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt - val := v.Args[2] - v.reset(OpARM64MOVHstore) - v.AuxInt = c << 1 - v.AddArg(ptr) - v.AddArg(val) - v.AddArg(mem) + c := v_2.AuxInt + if !(isPowerOfTwo(c+1) && c >= 7) { + break + } + v.reset(OpARM64ADD) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) + v0.AuxInt = log2(c + 1) + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (MOVHstoreidx2 ptr idx (MOVDconst [0]) mem) - // result: (MOVHstorezeroidx2 ptr idx mem) + // match: (MSUB a x (MOVDconst [c])) + // cond: c%3 == 0 && isPowerOfTwo(c/3) + // result: (ADDshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) for { - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 0 { + _ = v.Args[2] + a := v.Args[0] + x := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVHstorezeroidx2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVHstoreidx2 ptr idx (MOVHreg x) mem) - // result: (MOVHstoreidx2 ptr idx x mem) - for { - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVHreg { + c := v_2.AuxInt + if !(c%3 == 0 && isPowerOfTwo(c/3)) { break } - x := v_2.Args[0] - v.reset(OpARM64MOVHstoreidx2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(x) - v.AddArg(mem) + v.reset(OpARM64ADDshiftLL) + v.AuxInt = log2(c / 3) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) + v0.AuxInt = 2 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (MOVHstoreidx2 ptr idx (MOVHUreg x) mem) - // result: (MOVHstoreidx2 ptr idx x mem) + // match: (MSUB a x (MOVDconst [c])) + // cond: c%5 == 0 && isPowerOfTwo(c/5) + // result: (SUBshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) for { - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] + _ = v.Args[2] + a := v.Args[0] + x := v.Args[1] v_2 := v.Args[2] - if v_2.Op != OpARM64MOVHUreg { + if v_2.Op != OpARM64MOVDconst { break } - x := v_2.Args[0] - v.reset(OpARM64MOVHstoreidx2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(x) - v.AddArg(mem) + c := v_2.AuxInt + if !(c%5 == 0 && isPowerOfTwo(c/5)) { + break + } + v.reset(OpARM64SUBshiftLL) + v.AuxInt = log2(c / 5) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = 2 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (MOVHstoreidx2 ptr idx (MOVWreg x) mem) - // result: (MOVHstoreidx2 ptr idx x mem) + // match: (MSUB a x (MOVDconst [c])) + // cond: c%7 == 0 && isPowerOfTwo(c/7) + // result: (ADDshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) for { - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] + _ = v.Args[2] + a := v.Args[0] + x := v.Args[1] v_2 := v.Args[2] - if v_2.Op != OpARM64MOVWreg { + if v_2.Op != OpARM64MOVDconst { break } - x := v_2.Args[0] - v.reset(OpARM64MOVHstoreidx2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(x) - v.AddArg(mem) + c := v_2.AuxInt + if !(c%7 == 0 && isPowerOfTwo(c/7)) { + break + } + v.reset(OpARM64ADDshiftLL) + v.AuxInt = log2(c / 7) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) + v0.AuxInt = 3 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (MOVHstoreidx2 ptr idx (MOVWUreg x) mem) - // result: (MOVHstoreidx2 ptr idx x mem) + // match: (MSUB a x (MOVDconst [c])) + // cond: c%9 == 0 && isPowerOfTwo(c/9) + // result: (SUBshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) for { - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] + _ = v.Args[2] + a := v.Args[0] + x := v.Args[1] v_2 := v.Args[2] - if v_2.Op != OpARM64MOVWUreg { + if v_2.Op != OpARM64MOVDconst { break } - x := v_2.Args[0] - v.reset(OpARM64MOVHstoreidx2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(x) - v.AddArg(mem) + c := v_2.AuxInt + if !(c%9 == 0 && isPowerOfTwo(c/9)) { + break + } + v.reset(OpARM64SUBshiftLL) + v.AuxInt = log2(c / 9) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = 3 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } return false } -func rewriteValueARM64_OpARM64MOVHstorezero_0(v *Value) bool { +func rewriteValueARM64_OpARM64MSUB_10(v *Value) bool { b := v.Block - config := b.Func.Config - // match: (MOVHstorezero [off1] {sym} (ADDconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVHstorezero [off1+off2] {sym} ptr mem) + // match: (MSUB a (MOVDconst [-1]) x) + // result: (ADD a x) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADDconst { - break - } - off2 := v_0.AuxInt - ptr := v_0.Args[0] - if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + x := v.Args[2] + a := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != -1 { break } - v.reset(OpARM64MOVHstorezero) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(ptr) - v.AddArg(mem) + v.reset(OpARM64ADD) + v.AddArg(a) + v.AddArg(x) return true } - // match: (MOVHstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVHstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) + // match: (MSUB a (MOVDconst [0]) _) + // result: a for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDaddr { + _ = v.Args[2] + a := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 0 { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - ptr := v_0.Args[0] - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + v.reset(OpCopy) + v.Type = a.Type + v.AddArg(a) + return true + } + // match: (MSUB a (MOVDconst [1]) x) + // result: (SUB a x) + for { + x := v.Args[2] + a := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 1 { break } - v.reset(OpARM64MOVHstorezero) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(mem) + v.reset(OpARM64SUB) + v.AddArg(a) + v.AddArg(x) return true } - // match: (MOVHstorezero [off] {sym} (ADD ptr idx) mem) - // cond: off == 0 && sym == nil - // result: (MOVHstorezeroidx ptr idx mem) + // match: (MSUB a (MOVDconst [c]) x) + // cond: isPowerOfTwo(c) + // result: (SUBshiftLL a x [log2(c)]) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { + x := v.Args[2] + a := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(off == 0 && sym == nil) { + c := v_1.AuxInt + if !(isPowerOfTwo(c)) { break } - v.reset(OpARM64MOVHstorezeroidx) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + v.reset(OpARM64SUBshiftLL) + v.AuxInt = log2(c) + v.AddArg(a) + v.AddArg(x) return true } - // match: (MOVHstorezero [off] {sym} (ADDshiftLL [1] ptr idx) mem) - // cond: off == 0 && sym == nil - // result: (MOVHstorezeroidx2 ptr idx mem) + // match: (MSUB a (MOVDconst [c]) x) + // cond: isPowerOfTwo(c-1) && c>=3 + // result: (SUB a (ADDshiftLL x x [log2(c-1)])) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 1 { + x := v.Args[2] + a := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(off == 0 && sym == nil) { + c := v_1.AuxInt + if !(isPowerOfTwo(c-1) && c >= 3) { break } - v.reset(OpARM64MOVHstorezeroidx2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + v.reset(OpARM64SUB) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = log2(c - 1) + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (MOVHstorezero [i] {s} ptr0 x:(MOVHstorezero [j] {s} ptr1 mem)) - // cond: x.Uses == 1 && areAdjacentOffsets(i,j,2) && is32Bit(min(i,j)) && isSamePtr(ptr0, ptr1) && clobber(x) - // result: (MOVWstorezero [min(i,j)] {s} ptr0 mem) + // match: (MSUB a (MOVDconst [c]) x) + // cond: isPowerOfTwo(c+1) && c>=7 + // result: (ADD a (SUBshiftLL x x [log2(c+1)])) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[1] - ptr0 := v.Args[0] - x := v.Args[1] - if x.Op != OpARM64MOVHstorezero { - break - } - j := x.AuxInt - if x.Aux != s { + x := v.Args[2] + a := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - mem := x.Args[1] - ptr1 := x.Args[0] - if !(x.Uses == 1 && areAdjacentOffsets(i, j, 2) && is32Bit(min(i, j)) && isSamePtr(ptr0, ptr1) && clobber(x)) { + c := v_1.AuxInt + if !(isPowerOfTwo(c+1) && c >= 7) { break } - v.reset(OpARM64MOVWstorezero) - v.AuxInt = min(i, j) - v.Aux = s - v.AddArg(ptr0) - v.AddArg(mem) + v.reset(OpARM64ADD) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) + v0.AuxInt = log2(c + 1) + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (MOVHstorezero [2] {s} (ADD ptr0 idx0) x:(MOVHstorezeroidx ptr1 idx1 mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVWstorezeroidx ptr1 idx1 mem) + // match: (MSUB a (MOVDconst [c]) x) + // cond: c%3 == 0 && isPowerOfTwo(c/3) + // result: (ADDshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) for { - if v.AuxInt != 2 { - break - } - s := v.Aux - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { - break - } - idx0 := v_0.Args[1] - ptr0 := v_0.Args[0] - x := v.Args[1] - if x.Op != OpARM64MOVHstorezeroidx { + x := v.Args[2] + a := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - mem := x.Args[2] - ptr1 := x.Args[0] - idx1 := x.Args[1] - if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + c := v_1.AuxInt + if !(c%3 == 0 && isPowerOfTwo(c/3)) { break } - v.reset(OpARM64MOVWstorezeroidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(mem) + v.reset(OpARM64ADDshiftLL) + v.AuxInt = log2(c / 3) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) + v0.AuxInt = 2 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (MOVHstorezero [2] {s} (ADD idx0 ptr0) x:(MOVHstorezeroidx ptr1 idx1 mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVWstorezeroidx ptr1 idx1 mem) + // match: (MSUB a (MOVDconst [c]) x) + // cond: c%5 == 0 && isPowerOfTwo(c/5) + // result: (SUBshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) for { - if v.AuxInt != 2 { - break - } - s := v.Aux - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { - break - } - ptr0 := v_0.Args[1] - idx0 := v_0.Args[0] - x := v.Args[1] - if x.Op != OpARM64MOVHstorezeroidx { + x := v.Args[2] + a := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - mem := x.Args[2] - ptr1 := x.Args[0] - idx1 := x.Args[1] - if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { + c := v_1.AuxInt + if !(c%5 == 0 && isPowerOfTwo(c/5)) { break } - v.reset(OpARM64MOVWstorezeroidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(mem) + v.reset(OpARM64SUBshiftLL) + v.AuxInt = log2(c / 5) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = 2 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (MOVHstorezero [2] {s} (ADDshiftLL [1] ptr0 idx0) x:(MOVHstorezeroidx2 ptr1 idx1 mem)) - // cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x) - // result: (MOVWstorezeroidx ptr1 (SLLconst [1] idx1) mem) + // match: (MSUB a (MOVDconst [c]) x) + // cond: c%7 == 0 && isPowerOfTwo(c/7) + // result: (ADDshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) for { - if v.AuxInt != 2 { - break - } - s := v.Aux - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 1 { - break - } - idx0 := v_0.Args[1] - ptr0 := v_0.Args[0] - x := v.Args[1] - if x.Op != OpARM64MOVHstorezeroidx2 { + x := v.Args[2] + a := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - mem := x.Args[2] - ptr1 := x.Args[0] - idx1 := x.Args[1] - if !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) { + c := v_1.AuxInt + if !(c%7 == 0 && isPowerOfTwo(c/7)) { break } - v.reset(OpARM64MOVWstorezeroidx) - v.AddArg(ptr1) - v0 := b.NewValue0(v.Pos, OpARM64SLLconst, idx1.Type) - v0.AuxInt = 1 - v0.AddArg(idx1) + v.reset(OpARM64ADDshiftLL) + v.AuxInt = log2(c / 7) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) + v0.AuxInt = 3 + v0.AddArg(x) + v0.AddArg(x) v.AddArg(v0) - v.AddArg(mem) return true } - return false -} -func rewriteValueARM64_OpARM64MOVHstorezeroidx_0(v *Value) bool { - // match: (MOVHstorezeroidx ptr (MOVDconst [c]) mem) - // result: (MOVHstorezero [c] ptr mem) + // match: (MSUB a (MOVDconst [c]) x) + // cond: c%9 == 0 && isPowerOfTwo(c/9) + // result: (SUBshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) for { - mem := v.Args[2] - ptr := v.Args[0] + x := v.Args[2] + a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - v.reset(OpARM64MOVHstorezero) - v.AuxInt = c - v.AddArg(ptr) - v.AddArg(mem) + if !(c%9 == 0 && isPowerOfTwo(c/9)) { + break + } + v.reset(OpARM64SUBshiftLL) + v.AuxInt = log2(c / 9) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = 3 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (MOVHstorezeroidx (MOVDconst [c]) idx mem) - // result: (MOVHstorezero [c] idx mem) + return false +} +func rewriteValueARM64_OpARM64MSUB_20(v *Value) bool { + b := v.Block + // match: (MSUB (MOVDconst [c]) x y) + // result: (ADDconst [c] (MNEG x y)) for { - mem := v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - idx := v.Args[1] - v.reset(OpARM64MOVHstorezero) + x := v.Args[1] + v.reset(OpARM64ADDconst) v.AuxInt = c - v.AddArg(idx) - v.AddArg(mem) + v0 := b.NewValue0(v.Pos, OpARM64MNEG, x.Type) + v0.AddArg(x) + v0.AddArg(y) + v.AddArg(v0) return true } - // match: (MOVHstorezeroidx ptr (SLLconst [1] idx) mem) - // result: (MOVHstorezeroidx2 ptr idx mem) + // match: (MSUB a (MOVDconst [c]) (MOVDconst [d])) + // result: (SUBconst [c*d] a) for { - mem := v.Args[2] - ptr := v.Args[0] + _ = v.Args[2] + a := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64SLLconst || v_1.AuxInt != 1 { + if v_1.Op != OpARM64MOVDconst { break } - idx := v_1.Args[0] - v.reset(OpARM64MOVHstorezeroidx2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + c := v_1.AuxInt + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst { + break + } + d := v_2.AuxInt + v.reset(OpARM64SUBconst) + v.AuxInt = c * d + v.AddArg(a) return true } - // match: (MOVHstorezeroidx ptr (ADD idx idx) mem) - // result: (MOVHstorezeroidx2 ptr idx mem) + return false +} +func rewriteValueARM64_OpARM64MSUBW_0(v *Value) bool { + b := v.Block + // match: (MSUBW a x (MOVDconst [c])) + // cond: int32(c)==-1 + // result: (ADD a x) for { - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64ADD { + _ = v.Args[2] + a := v.Args[0] + x := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst { break } - idx := v_1.Args[1] - if idx != v_1.Args[0] { + c := v_2.AuxInt + if !(int32(c) == -1) { break } - v.reset(OpARM64MOVHstorezeroidx2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + v.reset(OpARM64ADD) + v.AddArg(a) + v.AddArg(x) return true } - // match: (MOVHstorezeroidx (SLLconst [1] idx) ptr mem) - // result: (MOVHstorezeroidx2 ptr idx mem) - for { - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 1 { + // match: (MSUBW a _ (MOVDconst [c])) + // cond: int32(c)==0 + // result: a + for { + _ = v.Args[2] + a := v.Args[0] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst { break } - idx := v_0.Args[0] - ptr := v.Args[1] - v.reset(OpARM64MOVHstorezeroidx2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + c := v_2.AuxInt + if !(int32(c) == 0) { + break + } + v.reset(OpCopy) + v.Type = a.Type + v.AddArg(a) return true } - // match: (MOVHstorezeroidx (ADD idx idx) ptr mem) - // result: (MOVHstorezeroidx2 ptr idx mem) + // match: (MSUBW a x (MOVDconst [c])) + // cond: int32(c)==1 + // result: (SUB a x) for { - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { + _ = v.Args[2] + a := v.Args[0] + x := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst { break } - idx := v_0.Args[1] - if idx != v_0.Args[0] { + c := v_2.AuxInt + if !(int32(c) == 1) { break } - ptr := v.Args[1] - v.reset(OpARM64MOVHstorezeroidx2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + v.reset(OpARM64SUB) + v.AddArg(a) + v.AddArg(x) return true } - // match: (MOVHstorezeroidx ptr (ADDconst [2] idx) x:(MOVHstorezeroidx ptr idx mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstorezeroidx ptr idx mem) + // match: (MSUBW a x (MOVDconst [c])) + // cond: isPowerOfTwo(c) + // result: (SUBshiftLL a x [log2(c)]) for { _ = v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64ADDconst || v_1.AuxInt != 2 { - break - } - idx := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVHstorezeroidx { + a := v.Args[0] + x := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst { break } - mem := x.Args[2] - if ptr != x.Args[0] || idx != x.Args[1] || !(x.Uses == 1 && clobber(x)) { + c := v_2.AuxInt + if !(isPowerOfTwo(c)) { break } - v.reset(OpARM64MOVWstorezeroidx) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + v.reset(OpARM64SUBshiftLL) + v.AuxInt = log2(c) + v.AddArg(a) + v.AddArg(x) return true } - return false -} -func rewriteValueARM64_OpARM64MOVHstorezeroidx2_0(v *Value) bool { - // match: (MOVHstorezeroidx2 ptr (MOVDconst [c]) mem) - // result: (MOVHstorezero [c<<1] ptr mem) + // match: (MSUBW a x (MOVDconst [c])) + // cond: isPowerOfTwo(c-1) && int32(c)>=3 + // result: (SUB a (ADDshiftLL x x [log2(c-1)])) for { - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + _ = v.Args[2] + a := v.Args[0] + x := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt - v.reset(OpARM64MOVHstorezero) - v.AuxInt = c << 1 - v.AddArg(ptr) - v.AddArg(mem) + c := v_2.AuxInt + if !(isPowerOfTwo(c-1) && int32(c) >= 3) { + break + } + v.reset(OpARM64SUB) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = log2(c - 1) + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - return false -} -func rewriteValueARM64_OpARM64MOVQstorezero_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (MOVQstorezero [off1] {sym} (ADDconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVQstorezero [off1+off2] {sym} ptr mem) + // match: (MSUBW a x (MOVDconst [c])) + // cond: isPowerOfTwo(c+1) && int32(c)>=7 + // result: (ADD a (SUBshiftLL x x [log2(c+1)])) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADDconst { + _ = v.Args[2] + a := v.Args[0] + x := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst { break } - off2 := v_0.AuxInt - ptr := v_0.Args[0] - if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + c := v_2.AuxInt + if !(isPowerOfTwo(c+1) && int32(c) >= 7) { break } - v.reset(OpARM64MOVQstorezero) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(ptr) - v.AddArg(mem) + v.reset(OpARM64ADD) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) + v0.AuxInt = log2(c + 1) + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (MOVQstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVQstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) + // match: (MSUBW a x (MOVDconst [c])) + // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) + // result: (ADDshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDaddr { + _ = v.Args[2] + a := v.Args[0] + x := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - ptr := v_0.Args[0] - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + c := v_2.AuxInt + if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { break } - v.reset(OpARM64MOVQstorezero) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(mem) + v.reset(OpARM64ADDshiftLL) + v.AuxInt = log2(c / 3) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) + v0.AuxInt = 2 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - return false -} -func rewriteValueARM64_OpARM64MOVWUload_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (MOVWUload [off] {sym} ptr (FMOVSstore [off] {sym} ptr val _)) - // result: (FMOVSfpgp val) + // match: (MSUBW a x (MOVDconst [c])) + // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) + // result: (SUBshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) for { - off := v.AuxInt - sym := v.Aux - _ = v.Args[1] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64FMOVSstore || v_1.AuxInt != off || v_1.Aux != sym { + _ = v.Args[2] + a := v.Args[0] + x := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst { break } - _ = v_1.Args[2] - if ptr != v_1.Args[0] { + c := v_2.AuxInt + if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { break } - val := v_1.Args[1] - v.reset(OpARM64FMOVSfpgp) - v.AddArg(val) + v.reset(OpARM64SUBshiftLL) + v.AuxInt = log2(c / 5) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = 2 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (MOVWUload [off1] {sym} (ADDconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVWUload [off1+off2] {sym} ptr mem) + // match: (MSUBW a x (MOVDconst [c])) + // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) + // result: (ADDshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADDconst { + _ = v.Args[2] + a := v.Args[0] + x := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst { break } - off2 := v_0.AuxInt - ptr := v_0.Args[0] - if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + c := v_2.AuxInt + if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { break } - v.reset(OpARM64MOVWUload) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(ptr) - v.AddArg(mem) + v.reset(OpARM64ADDshiftLL) + v.AuxInt = log2(c / 7) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) + v0.AuxInt = 3 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (MOVWUload [off] {sym} (ADD ptr idx) mem) - // cond: off == 0 && sym == nil - // result: (MOVWUloadidx ptr idx mem) + // match: (MSUBW a x (MOVDconst [c])) + // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) + // result: (SUBshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { + _ = v.Args[2] + a := v.Args[0] + x := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(off == 0 && sym == nil) { + c := v_2.AuxInt + if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { break } - v.reset(OpARM64MOVWUloadidx) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + v.reset(OpARM64SUBshiftLL) + v.AuxInt = log2(c / 9) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = 3 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (MOVWUload [off] {sym} (ADDshiftLL [2] ptr idx) mem) - // cond: off == 0 && sym == nil - // result: (MOVWUloadidx4 ptr idx mem) + return false +} +func rewriteValueARM64_OpARM64MSUBW_10(v *Value) bool { + b := v.Block + // match: (MSUBW a (MOVDconst [c]) x) + // cond: int32(c)==-1 + // result: (ADD a x) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 2 { + x := v.Args[2] + a := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(off == 0 && sym == nil) { + c := v_1.AuxInt + if !(int32(c) == -1) { break } - v.reset(OpARM64MOVWUloadidx4) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + v.reset(OpARM64ADD) + v.AddArg(a) + v.AddArg(x) return true } - // match: (MOVWUload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVWUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) + // match: (MSUBW a (MOVDconst [c]) _) + // cond: int32(c)==0 + // result: a for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDaddr { + _ = v.Args[2] + a := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - ptr := v_0.Args[0] - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + c := v_1.AuxInt + if !(int32(c) == 0) { break } - v.reset(OpARM64MOVWUload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(mem) + v.reset(OpCopy) + v.Type = a.Type + v.AddArg(a) return true } - // match: (MOVWUload [off] {sym} ptr (MOVWstorezero [off2] {sym2} ptr2 _)) - // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) - // result: (MOVDconst [0]) + // match: (MSUBW a (MOVDconst [c]) x) + // cond: int32(c)==1 + // result: (SUB a x) for { - off := v.AuxInt - sym := v.Aux - _ = v.Args[1] - ptr := v.Args[0] + x := v.Args[2] + a := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64MOVWstorezero { - break - } - off2 := v_1.AuxInt - sym2 := v_1.Aux - _ = v_1.Args[1] - ptr2 := v_1.Args[0] - if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { + if v_1.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 - return true - } - // match: (MOVWUload [off] {sym} (SB) _) - // cond: symIsRO(sym) - // result: (MOVDconst [int64(read32(sym, off, config.BigEndian))]) - for { - off := v.AuxInt - sym := v.Aux - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpSB || !(symIsRO(sym)) { + c := v_1.AuxInt + if !(int32(c) == 1) { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = int64(read32(sym, off, config.BigEndian)) + v.reset(OpARM64SUB) + v.AddArg(a) + v.AddArg(x) return true } - return false -} -func rewriteValueARM64_OpARM64MOVWUloadidx_0(v *Value) bool { - // match: (MOVWUloadidx ptr (MOVDconst [c]) mem) - // result: (MOVWUload [c] ptr mem) + // match: (MSUBW a (MOVDconst [c]) x) + // cond: isPowerOfTwo(c) + // result: (SUBshiftLL a x [log2(c)]) for { - mem := v.Args[2] - ptr := v.Args[0] + x := v.Args[2] + a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - v.reset(OpARM64MOVWUload) - v.AuxInt = c - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MOVWUloadidx (MOVDconst [c]) ptr mem) - // result: (MOVWUload [c] ptr mem) - for { - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + if !(isPowerOfTwo(c)) { break } - c := v_0.AuxInt - ptr := v.Args[1] - v.reset(OpARM64MOVWUload) - v.AuxInt = c - v.AddArg(ptr) - v.AddArg(mem) + v.reset(OpARM64SUBshiftLL) + v.AuxInt = log2(c) + v.AddArg(a) + v.AddArg(x) return true } - // match: (MOVWUloadidx ptr (SLLconst [2] idx) mem) - // result: (MOVWUloadidx4 ptr idx mem) + // match: (MSUBW a (MOVDconst [c]) x) + // cond: isPowerOfTwo(c-1) && int32(c)>=3 + // result: (SUB a (ADDshiftLL x x [log2(c-1)])) for { - mem := v.Args[2] - ptr := v.Args[0] + x := v.Args[2] + a := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64SLLconst || v_1.AuxInt != 2 { + if v_1.Op != OpARM64MOVDconst { break } - idx := v_1.Args[0] - v.reset(OpARM64MOVWUloadidx4) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWUloadidx (SLLconst [2] idx) ptr mem) - // result: (MOVWUloadidx4 ptr idx mem) - for { - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 2 { + c := v_1.AuxInt + if !(isPowerOfTwo(c-1) && int32(c) >= 3) { break } - idx := v_0.Args[0] - ptr := v.Args[1] - v.reset(OpARM64MOVWUloadidx4) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + v.reset(OpARM64SUB) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = log2(c - 1) + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (MOVWUloadidx ptr idx (MOVWstorezeroidx ptr2 idx2 _)) - // cond: (isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) - // result: (MOVDconst [0]) + // match: (MSUBW a (MOVDconst [c]) x) + // cond: isPowerOfTwo(c+1) && int32(c)>=7 + // result: (ADD a (SUBshiftLL x x [log2(c+1)])) for { - _ = v.Args[2] - ptr := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVWstorezeroidx { + x := v.Args[2] + a := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - _ = v_2.Args[2] - ptr2 := v_2.Args[0] - idx2 := v_2.Args[1] - if !(isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) { + c := v_1.AuxInt + if !(isPowerOfTwo(c+1) && int32(c) >= 7) { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.reset(OpARM64ADD) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) + v0.AuxInt = log2(c + 1) + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - return false -} -func rewriteValueARM64_OpARM64MOVWUloadidx4_0(v *Value) bool { - // match: (MOVWUloadidx4 ptr (MOVDconst [c]) mem) - // result: (MOVWUload [c<<2] ptr mem) + // match: (MSUBW a (MOVDconst [c]) x) + // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) + // result: (ADDshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) for { - mem := v.Args[2] - ptr := v.Args[0] + x := v.Args[2] + a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - v.reset(OpARM64MOVWUload) - v.AuxInt = c << 2 - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MOVWUloadidx4 ptr idx (MOVWstorezeroidx4 ptr2 idx2 _)) - // cond: isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) - // result: (MOVDconst [0]) - for { - _ = v.Args[2] - ptr := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVWstorezeroidx4 { - break - } - _ = v_2.Args[2] - ptr2 := v_2.Args[0] - idx2 := v_2.Args[1] - if !(isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2)) { - break - } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 - return true - } - return false -} -func rewriteValueARM64_OpARM64MOVWUreg_0(v *Value) bool { - // match: (MOVWUreg x:(MOVBUload _ _)) - // result: (MOVDreg x) - for { - x := v.Args[0] - if x.Op != OpARM64MOVBUload { + if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { break } - _ = x.Args[1] - v.reset(OpARM64MOVDreg) - v.AddArg(x) + v.reset(OpARM64ADDshiftLL) + v.AuxInt = log2(c / 3) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) + v0.AuxInt = 2 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (MOVWUreg x:(MOVHUload _ _)) - // result: (MOVDreg x) + // match: (MSUBW a (MOVDconst [c]) x) + // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) + // result: (SUBshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) for { - x := v.Args[0] - if x.Op != OpARM64MOVHUload { + x := v.Args[2] + a := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - _ = x.Args[1] - v.reset(OpARM64MOVDreg) - v.AddArg(x) - return true - } - // match: (MOVWUreg x:(MOVWUload _ _)) - // result: (MOVDreg x) - for { - x := v.Args[0] - if x.Op != OpARM64MOVWUload { + c := v_1.AuxInt + if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { break } - _ = x.Args[1] - v.reset(OpARM64MOVDreg) - v.AddArg(x) + v.reset(OpARM64SUBshiftLL) + v.AuxInt = log2(c / 5) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = 2 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (MOVWUreg x:(MOVBUloadidx _ _ _)) - // result: (MOVDreg x) + // match: (MSUBW a (MOVDconst [c]) x) + // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) + // result: (ADDshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) for { - x := v.Args[0] - if x.Op != OpARM64MOVBUloadidx { + x := v.Args[2] + a := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - _ = x.Args[2] - v.reset(OpARM64MOVDreg) - v.AddArg(x) - return true - } - // match: (MOVWUreg x:(MOVHUloadidx _ _ _)) - // result: (MOVDreg x) - for { - x := v.Args[0] - if x.Op != OpARM64MOVHUloadidx { + c := v_1.AuxInt + if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { break } - _ = x.Args[2] - v.reset(OpARM64MOVDreg) - v.AddArg(x) + v.reset(OpARM64ADDshiftLL) + v.AuxInt = log2(c / 7) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) + v0.AuxInt = 3 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (MOVWUreg x:(MOVWUloadidx _ _ _)) - // result: (MOVDreg x) + // match: (MSUBW a (MOVDconst [c]) x) + // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) + // result: (SUBshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) for { - x := v.Args[0] - if x.Op != OpARM64MOVWUloadidx { + x := v.Args[2] + a := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - _ = x.Args[2] - v.reset(OpARM64MOVDreg) - v.AddArg(x) - return true - } - // match: (MOVWUreg x:(MOVHUloadidx2 _ _ _)) - // result: (MOVDreg x) - for { - x := v.Args[0] - if x.Op != OpARM64MOVHUloadidx2 { + c := v_1.AuxInt + if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { break } - _ = x.Args[2] - v.reset(OpARM64MOVDreg) - v.AddArg(x) + v.reset(OpARM64SUBshiftLL) + v.AuxInt = log2(c / 9) + v.AddArg(a) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = 3 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (MOVWUreg x:(MOVWUloadidx4 _ _ _)) - // result: (MOVDreg x) + return false +} +func rewriteValueARM64_OpARM64MSUBW_20(v *Value) bool { + b := v.Block + // match: (MSUBW (MOVDconst [c]) x y) + // result: (ADDconst [c] (MNEGW x y)) for { - x := v.Args[0] - if x.Op != OpARM64MOVWUloadidx4 { + y := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - _ = x.Args[2] - v.reset(OpARM64MOVDreg) - v.AddArg(x) + c := v_0.AuxInt + x := v.Args[1] + v.reset(OpARM64ADDconst) + v.AuxInt = c + v0 := b.NewValue0(v.Pos, OpARM64MNEGW, x.Type) + v0.AddArg(x) + v0.AddArg(y) + v.AddArg(v0) return true } - // match: (MOVWUreg x:(MOVBUreg _)) - // result: (MOVDreg x) + // match: (MSUBW a (MOVDconst [c]) (MOVDconst [d])) + // result: (SUBconst [int64(int32(c)*int32(d))] a) for { - x := v.Args[0] - if x.Op != OpARM64MOVBUreg { + _ = v.Args[2] + a := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVDreg) - v.AddArg(x) - return true - } - // match: (MOVWUreg x:(MOVHUreg _)) - // result: (MOVDreg x) - for { - x := v.Args[0] - if x.Op != OpARM64MOVHUreg { + c := v_1.AuxInt + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst { break } - v.reset(OpARM64MOVDreg) - v.AddArg(x) + d := v_2.AuxInt + v.reset(OpARM64SUBconst) + v.AuxInt = int64(int32(c) * int32(d)) + v.AddArg(a) return true } return false } -func rewriteValueARM64_OpARM64MOVWUreg_10(v *Value) bool { - // match: (MOVWUreg x:(MOVWUreg _)) - // result: (MOVDreg x) +func rewriteValueARM64_OpARM64MUL_0(v *Value) bool { + b := v.Block + // match: (MUL (NEG x) y) + // result: (MNEG x y) for { - x := v.Args[0] - if x.Op != OpARM64MOVWUreg { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARM64NEG { + continue + } + x := v_0.Args[0] + y := v.Args[1^_i0] + v.reset(OpARM64MNEG) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpARM64MOVDreg) - v.AddArg(x) - return true + break } - // match: (MOVWUreg (ANDconst [c] x)) - // result: (ANDconst [c&(1<<32-1)] x) + // match: (MUL x (MOVDconst [-1])) + // result: (NEG x) for { - v_0 := v.Args[0] - if v_0.Op != OpARM64ANDconst { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != -1 { + continue + } + v.reset(OpARM64NEG) + v.AddArg(x) + return true } - c := v_0.AuxInt - x := v_0.Args[0] - v.reset(OpARM64ANDconst) - v.AuxInt = c & (1<<32 - 1) - v.AddArg(x) - return true + break } - // match: (MOVWUreg (MOVDconst [c])) - // result: (MOVDconst [int64(uint32(c))]) + // match: (MUL _ (MOVDconst [0])) + // result: (MOVDconst [0]) for { - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 0 { + continue + } + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 + return true } - c := v_0.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = int64(uint32(c)) - return true + break } - // match: (MOVWUreg (SLLconst [sc] x)) - // cond: isARM64BFMask(sc, 1<<32-1, sc) - // result: (UBFIZ [armBFAuxInt(sc, arm64BFWidth(1<<32-1, sc))] x) + // match: (MUL x (MOVDconst [1])) + // result: x for { - v_0 := v.Args[0] - if v_0.Op != OpARM64SLLconst { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 1 { + continue + } + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - sc := v_0.AuxInt - x := v_0.Args[0] - if !(isARM64BFMask(sc, 1<<32-1, sc)) { - break - } - v.reset(OpARM64UBFIZ) - v.AuxInt = armBFAuxInt(sc, arm64BFWidth(1<<32-1, sc)) - v.AddArg(x) - return true + break } - // match: (MOVWUreg (SRLconst [sc] x)) - // cond: isARM64BFMask(sc, 1<<32-1, 0) - // result: (UBFX [armBFAuxInt(sc, 32)] x) + // match: (MUL x (MOVDconst [c])) + // cond: isPowerOfTwo(c) + // result: (SLLconst [log2(c)] x) for { - v_0 := v.Args[0] - if v_0.Op != OpARM64SRLconst { - break - } - sc := v_0.AuxInt - x := v_0.Args[0] - if !(isARM64BFMask(sc, 1<<32-1, 0)) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(isPowerOfTwo(c)) { + continue + } + v.reset(OpARM64SLLconst) + v.AuxInt = log2(c) + v.AddArg(x) + return true } - v.reset(OpARM64UBFX) - v.AuxInt = armBFAuxInt(sc, 32) - v.AddArg(x) - return true + break } - return false -} -func rewriteValueARM64_OpARM64MOVWload_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVWload [off1+off2] {sym} ptr mem) + // match: (MUL x (MOVDconst [c])) + // cond: isPowerOfTwo(c-1) && c >= 3 + // result: (ADDshiftLL x x [log2(c-1)]) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADDconst { - break - } - off2 := v_0.AuxInt - ptr := v_0.Args[0] - if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(isPowerOfTwo(c-1) && c >= 3) { + continue + } + v.reset(OpARM64ADDshiftLL) + v.AuxInt = log2(c - 1) + v.AddArg(x) + v.AddArg(x) + return true } - v.reset(OpARM64MOVWload) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(ptr) - v.AddArg(mem) - return true + break } - // match: (MOVWload [off] {sym} (ADD ptr idx) mem) - // cond: off == 0 && sym == nil - // result: (MOVWloadidx ptr idx mem) + // match: (MUL x (MOVDconst [c])) + // cond: isPowerOfTwo(c+1) && c >= 7 + // result: (ADDshiftLL (NEG x) x [log2(c+1)]) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { - break - } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(off == 0 && sym == nil) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(isPowerOfTwo(c+1) && c >= 7) { + continue + } + v.reset(OpARM64ADDshiftLL) + v.AuxInt = log2(c + 1) + v0 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) + v0.AddArg(x) + v.AddArg(v0) + v.AddArg(x) + return true } - v.reset(OpARM64MOVWloadidx) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } - // match: (MOVWload [off] {sym} (ADDshiftLL [2] ptr idx) mem) - // cond: off == 0 && sym == nil - // result: (MOVWloadidx4 ptr idx mem) + // match: (MUL x (MOVDconst [c])) + // cond: c%3 == 0 && isPowerOfTwo(c/3) + // result: (SLLconst [log2(c/3)] (ADDshiftLL x x [1])) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 2 { - break - } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(off == 0 && sym == nil) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(c%3 == 0 && isPowerOfTwo(c/3)) { + continue + } + v.reset(OpARM64SLLconst) + v.AuxInt = log2(c / 3) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = 1 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) + return true } - v.reset(OpARM64MOVWloadidx4) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } - // match: (MOVWload [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) + // match: (MUL x (MOVDconst [c])) + // cond: c%5 == 0 && isPowerOfTwo(c/5) + // result: (SLLconst [log2(c/5)] (ADDshiftLL x x [2])) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDaddr { - break - } - off2 := v_0.AuxInt - sym2 := v_0.Aux - ptr := v_0.Args[0] - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(c%5 == 0 && isPowerOfTwo(c/5)) { + continue + } + v.reset(OpARM64SLLconst) + v.AuxInt = log2(c / 5) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = 2 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) + return true } - v.reset(OpARM64MOVWload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(mem) - return true + break } - // match: (MOVWload [off] {sym} ptr (MOVWstorezero [off2] {sym2} ptr2 _)) - // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) - // result: (MOVDconst [0]) + // match: (MUL x (MOVDconst [c])) + // cond: c%7 == 0 && isPowerOfTwo(c/7) + // result: (SLLconst [log2(c/7)] (ADDshiftLL (NEG x) x [3])) for { - off := v.AuxInt - sym := v.Aux _ = v.Args[1] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVWstorezero { - break - } - off2 := v_1.AuxInt - sym2 := v_1.Aux - _ = v_1.Args[1] - ptr2 := v_1.Args[0] - if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(c%7 == 0 && isPowerOfTwo(c/7)) { + continue + } + v.reset(OpARM64SLLconst) + v.AuxInt = log2(c / 7) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = 3 + v1 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) + v1.AddArg(x) + v0.AddArg(v1) + v0.AddArg(x) + v.AddArg(v0) + return true } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 - return true + break } return false } -func rewriteValueARM64_OpARM64MOVWloadidx_0(v *Value) bool { - // match: (MOVWloadidx ptr (MOVDconst [c]) mem) - // result: (MOVWload [c] ptr mem) +func rewriteValueARM64_OpARM64MUL_10(v *Value) bool { + b := v.Block + // match: (MUL x (MOVDconst [c])) + // cond: c%9 == 0 && isPowerOfTwo(c/9) + // result: (SLLconst [log2(c/9)] (ADDshiftLL x x [3])) for { - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(c%9 == 0 && isPowerOfTwo(c/9)) { + continue + } + v.reset(OpARM64SLLconst) + v.AuxInt = log2(c / 9) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = 3 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) + return true } - c := v_1.AuxInt - v.reset(OpARM64MOVWload) - v.AuxInt = c - v.AddArg(ptr) - v.AddArg(mem) - return true + break } - // match: (MOVWloadidx (MOVDconst [c]) ptr mem) - // result: (MOVWload [c] ptr mem) + // match: (MUL (MOVDconst [c]) (MOVDconst [d])) + // result: (MOVDconst [c*d]) for { - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARM64MOVDconst { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + d := v_1.AuxInt + v.reset(OpARM64MOVDconst) + v.AuxInt = c * d + return true } - c := v_0.AuxInt - ptr := v.Args[1] - v.reset(OpARM64MOVWload) - v.AuxInt = c - v.AddArg(ptr) - v.AddArg(mem) - return true + break } - // match: (MOVWloadidx ptr (SLLconst [2] idx) mem) - // result: (MOVWloadidx4 ptr idx mem) + return false +} +func rewriteValueARM64_OpARM64MULW_0(v *Value) bool { + b := v.Block + // match: (MULW (NEG x) y) + // result: (MNEGW x y) for { - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SLLconst || v_1.AuxInt != 2 { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARM64NEG { + continue + } + x := v_0.Args[0] + y := v.Args[1^_i0] + v.reset(OpARM64MNEGW) + v.AddArg(x) + v.AddArg(y) + return true } - idx := v_1.Args[0] - v.reset(OpARM64MOVWloadidx4) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } - // match: (MOVWloadidx (SLLconst [2] idx) ptr mem) - // result: (MOVWloadidx4 ptr idx mem) + // match: (MULW x (MOVDconst [c])) + // cond: int32(c)==-1 + // result: (NEG x) for { - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 2 { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(int32(c) == -1) { + continue + } + v.reset(OpARM64NEG) + v.AddArg(x) + return true } - idx := v_0.Args[0] - ptr := v.Args[1] - v.reset(OpARM64MOVWloadidx4) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWloadidx ptr idx (MOVWstorezeroidx ptr2 idx2 _)) - // cond: (isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) - // result: (MOVDconst [0]) - for { - _ = v.Args[2] - ptr := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVWstorezeroidx { - break - } - _ = v_2.Args[2] - ptr2 := v_2.Args[0] - idx2 := v_2.Args[1] - if !(isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) { - break - } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 - return true - } - return false -} -func rewriteValueARM64_OpARM64MOVWloadidx4_0(v *Value) bool { - // match: (MOVWloadidx4 ptr (MOVDconst [c]) mem) - // result: (MOVWload [c<<2] ptr mem) - for { - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - v.reset(OpARM64MOVWload) - v.AuxInt = c << 2 - v.AddArg(ptr) - v.AddArg(mem) - return true + break } - // match: (MOVWloadidx4 ptr idx (MOVWstorezeroidx4 ptr2 idx2 _)) - // cond: isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) + // match: (MULW _ (MOVDconst [c])) + // cond: int32(c)==0 // result: (MOVDconst [0]) for { - _ = v.Args[2] - ptr := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVWstorezeroidx4 { - break - } - _ = v_2.Args[2] - ptr2 := v_2.Args[0] - idx2 := v_2.Args[1] - if !(isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2)) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(int32(c) == 0) { + continue + } + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 + return true } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 - return true + break } - return false -} -func rewriteValueARM64_OpARM64MOVWreg_0(v *Value) bool { - // match: (MOVWreg x:(MOVBload _ _)) - // result: (MOVDreg x) + // match: (MULW x (MOVDconst [c])) + // cond: int32(c)==1 + // result: x for { - x := v.Args[0] - if x.Op != OpARM64MOVBload { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(int32(c) == 1) { + continue + } + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - _ = x.Args[1] - v.reset(OpARM64MOVDreg) - v.AddArg(x) - return true + break } - // match: (MOVWreg x:(MOVBUload _ _)) - // result: (MOVDreg x) + // match: (MULW x (MOVDconst [c])) + // cond: isPowerOfTwo(c) + // result: (SLLconst [log2(c)] x) for { - x := v.Args[0] - if x.Op != OpARM64MOVBUload { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(isPowerOfTwo(c)) { + continue + } + v.reset(OpARM64SLLconst) + v.AuxInt = log2(c) + v.AddArg(x) + return true } - _ = x.Args[1] - v.reset(OpARM64MOVDreg) - v.AddArg(x) - return true + break } - // match: (MOVWreg x:(MOVHload _ _)) - // result: (MOVDreg x) + // match: (MULW x (MOVDconst [c])) + // cond: isPowerOfTwo(c-1) && int32(c) >= 3 + // result: (ADDshiftLL x x [log2(c-1)]) for { - x := v.Args[0] - if x.Op != OpARM64MOVHload { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(isPowerOfTwo(c-1) && int32(c) >= 3) { + continue + } + v.reset(OpARM64ADDshiftLL) + v.AuxInt = log2(c - 1) + v.AddArg(x) + v.AddArg(x) + return true } - _ = x.Args[1] - v.reset(OpARM64MOVDreg) - v.AddArg(x) - return true + break } - // match: (MOVWreg x:(MOVHUload _ _)) - // result: (MOVDreg x) + // match: (MULW x (MOVDconst [c])) + // cond: isPowerOfTwo(c+1) && int32(c) >= 7 + // result: (ADDshiftLL (NEG x) x [log2(c+1)]) for { - x := v.Args[0] - if x.Op != OpARM64MOVHUload { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(isPowerOfTwo(c+1) && int32(c) >= 7) { + continue + } + v.reset(OpARM64ADDshiftLL) + v.AuxInt = log2(c + 1) + v0 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) + v0.AddArg(x) + v.AddArg(v0) + v.AddArg(x) + return true } - _ = x.Args[1] - v.reset(OpARM64MOVDreg) - v.AddArg(x) - return true + break } - // match: (MOVWreg x:(MOVWload _ _)) - // result: (MOVDreg x) + // match: (MULW x (MOVDconst [c])) + // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) + // result: (SLLconst [log2(c/3)] (ADDshiftLL x x [1])) for { - x := v.Args[0] - if x.Op != OpARM64MOVWload { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { + continue + } + v.reset(OpARM64SLLconst) + v.AuxInt = log2(c / 3) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = 1 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) + return true } - _ = x.Args[1] - v.reset(OpARM64MOVDreg) - v.AddArg(x) - return true + break } - // match: (MOVWreg x:(MOVBloadidx _ _ _)) - // result: (MOVDreg x) + // match: (MULW x (MOVDconst [c])) + // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) + // result: (SLLconst [log2(c/5)] (ADDshiftLL x x [2])) for { - x := v.Args[0] - if x.Op != OpARM64MOVBloadidx { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { + continue + } + v.reset(OpARM64SLLconst) + v.AuxInt = log2(c / 5) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = 2 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) + return true } - _ = x.Args[2] - v.reset(OpARM64MOVDreg) - v.AddArg(x) - return true + break } - // match: (MOVWreg x:(MOVBUloadidx _ _ _)) - // result: (MOVDreg x) + // match: (MULW x (MOVDconst [c])) + // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) + // result: (SLLconst [log2(c/7)] (ADDshiftLL (NEG x) x [3])) for { - x := v.Args[0] - if x.Op != OpARM64MOVBUloadidx { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { + continue + } + v.reset(OpARM64SLLconst) + v.AuxInt = log2(c / 7) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = 3 + v1 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) + v1.AddArg(x) + v0.AddArg(v1) + v0.AddArg(x) + v.AddArg(v0) + return true } - _ = x.Args[2] - v.reset(OpARM64MOVDreg) - v.AddArg(x) - return true + break } - // match: (MOVWreg x:(MOVHloadidx _ _ _)) - // result: (MOVDreg x) + return false +} +func rewriteValueARM64_OpARM64MULW_10(v *Value) bool { + b := v.Block + // match: (MULW x (MOVDconst [c])) + // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) + // result: (SLLconst [log2(c/9)] (ADDshiftLL x x [3])) for { - x := v.Args[0] - if x.Op != OpARM64MOVHloadidx { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { + continue + } + v.reset(OpARM64SLLconst) + v.AuxInt = log2(c / 9) + v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) + v0.AuxInt = 3 + v0.AddArg(x) + v0.AddArg(x) + v.AddArg(v0) + return true } - _ = x.Args[2] - v.reset(OpARM64MOVDreg) - v.AddArg(x) - return true + break } - // match: (MOVWreg x:(MOVHUloadidx _ _ _)) - // result: (MOVDreg x) + // match: (MULW (MOVDconst [c]) (MOVDconst [d])) + // result: (MOVDconst [int64(int32(c)*int32(d))]) for { - x := v.Args[0] - if x.Op != OpARM64MOVHUloadidx { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARM64MOVDconst { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + d := v_1.AuxInt + v.reset(OpARM64MOVDconst) + v.AuxInt = int64(int32(c) * int32(d)) + return true } - _ = x.Args[2] - v.reset(OpARM64MOVDreg) - v.AddArg(x) - return true + break } - // match: (MOVWreg x:(MOVWloadidx _ _ _)) - // result: (MOVDreg x) + return false +} +func rewriteValueARM64_OpARM64MVN_0(v *Value) bool { + // match: (MVN (MOVDconst [c])) + // result: (MOVDconst [^c]) for { - x := v.Args[0] - if x.Op != OpARM64MOVWloadidx { + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - _ = x.Args[2] - v.reset(OpARM64MOVDreg) - v.AddArg(x) + c := v_0.AuxInt + v.reset(OpARM64MOVDconst) + v.AuxInt = ^c return true } - return false -} -func rewriteValueARM64_OpARM64MOVWreg_10(v *Value) bool { - // match: (MOVWreg x:(MOVHloadidx2 _ _ _)) - // result: (MOVDreg x) + // match: (MVN x:(SLLconst [c] y)) + // cond: clobberIfDead(x) + // result: (MVNshiftLL [c] y) for { x := v.Args[0] - if x.Op != OpARM64MOVHloadidx2 { - break - } - _ = x.Args[2] - v.reset(OpARM64MOVDreg) - v.AddArg(x) - return true - } - // match: (MOVWreg x:(MOVHUloadidx2 _ _ _)) - // result: (MOVDreg x) - for { - x := v.Args[0] - if x.Op != OpARM64MOVHUloadidx2 { - break - } - _ = x.Args[2] - v.reset(OpARM64MOVDreg) - v.AddArg(x) - return true - } - // match: (MOVWreg x:(MOVWloadidx4 _ _ _)) - // result: (MOVDreg x) - for { - x := v.Args[0] - if x.Op != OpARM64MOVWloadidx4 { - break - } - _ = x.Args[2] - v.reset(OpARM64MOVDreg) - v.AddArg(x) - return true - } - // match: (MOVWreg x:(MOVBreg _)) - // result: (MOVDreg x) - for { - x := v.Args[0] - if x.Op != OpARM64MOVBreg { - break - } - v.reset(OpARM64MOVDreg) - v.AddArg(x) - return true - } - // match: (MOVWreg x:(MOVBUreg _)) - // result: (MOVDreg x) - for { - x := v.Args[0] - if x.Op != OpARM64MOVBUreg { - break - } - v.reset(OpARM64MOVDreg) - v.AddArg(x) - return true - } - // match: (MOVWreg x:(MOVHreg _)) - // result: (MOVDreg x) - for { - x := v.Args[0] - if x.Op != OpARM64MOVHreg { - break - } - v.reset(OpARM64MOVDreg) - v.AddArg(x) - return true - } - // match: (MOVWreg x:(MOVWreg _)) - // result: (MOVDreg x) - for { - x := v.Args[0] - if x.Op != OpARM64MOVWreg { - break - } - v.reset(OpARM64MOVDreg) - v.AddArg(x) - return true - } - // match: (MOVWreg (MOVDconst [c])) - // result: (MOVDconst [int64(int32(c))]) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = int64(int32(c)) - return true - } - // match: (MOVWreg (SLLconst [lc] x)) - // cond: lc < 32 - // result: (SBFIZ [armBFAuxInt(lc, 32-lc)] x) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64SLLconst { - break - } - lc := v_0.AuxInt - x := v_0.Args[0] - if !(lc < 32) { - break - } - v.reset(OpARM64SBFIZ) - v.AuxInt = armBFAuxInt(lc, 32-lc) - v.AddArg(x) - return true - } - return false -} -func rewriteValueARM64_OpARM64MOVWstore_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (MOVWstore [off] {sym} ptr (FMOVSfpgp val) mem) - // result: (FMOVSstore [off] {sym} ptr val mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64FMOVSfpgp { - break - } - val := v_1.Args[0] - v.reset(OpARM64FMOVSstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) - // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVWstore [off1+off2] {sym} ptr val mem) - for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADDconst { - break - } - off2 := v_0.AuxInt - ptr := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { - break - } - v.reset(OpARM64MOVWstore) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(ptr) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstore [off] {sym} (ADD ptr idx) val mem) - // cond: off == 0 && sym == nil - // result: (MOVWstoreidx ptr idx val mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { - break - } - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v.Args[1] - if !(off == 0 && sym == nil) { - break - } - v.reset(OpARM64MOVWstoreidx) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstore [off] {sym} (ADDshiftLL [2] ptr idx) val mem) - // cond: off == 0 && sym == nil - // result: (MOVWstoreidx4 ptr idx val mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 2 { - break - } - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v.Args[1] - if !(off == 0 && sym == nil) { - break - } - v.reset(OpARM64MOVWstoreidx4) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstore [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) - for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDaddr { - break - } - off2 := v_0.AuxInt - sym2 := v_0.Aux - ptr := v_0.Args[0] - val := v.Args[1] - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { - break - } - v.reset(OpARM64MOVWstore) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstore [off] {sym} ptr (MOVDconst [0]) mem) - // result: (MOVWstorezero [off] {sym} ptr mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 0 { - break - } - v.reset(OpARM64MOVWstorezero) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MOVWstore [off] {sym} ptr (MOVWreg x) mem) - // result: (MOVWstore [off] {sym} ptr x mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVWreg { - break - } - x := v_1.Args[0] - v.reset(OpARM64MOVWstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true - } - // match: (MOVWstore [off] {sym} ptr (MOVWUreg x) mem) - // result: (MOVWstore [off] {sym} ptr x mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVWUreg { - break - } - x := v_1.Args[0] - v.reset(OpARM64MOVWstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true - } - // match: (MOVWstore [i] {s} ptr0 (SRLconst [32] w) x:(MOVWstore [i-4] {s} ptr1 w mem)) - // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) - // result: (MOVDstore [i-4] {s} ptr0 w mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - ptr0 := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 32 { - break - } - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVWstore || x.AuxInt != i-4 || x.Aux != s { - break - } - mem := x.Args[2] - ptr1 := x.Args[0] - if w != x.Args[1] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { - break - } - v.reset(OpARM64MOVDstore) - v.AuxInt = i - 4 - v.Aux = s - v.AddArg(ptr0) - v.AddArg(w) - v.AddArg(mem) - return true - } - // match: (MOVWstore [4] {s} (ADD ptr0 idx0) (SRLconst [32] w) x:(MOVWstoreidx ptr1 idx1 w mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVDstoreidx ptr1 idx1 w mem) - for { - if v.AuxInt != 4 { - break - } - s := v.Aux - _ = v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { - break - } - idx0 := v_0.Args[1] - ptr0 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 32 { - break - } - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVWstoreidx { - break - } - mem := x.Args[3] - ptr1 := x.Args[0] - idx1 := x.Args[1] - if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { - break - } - v.reset(OpARM64MOVDstoreidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(w) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueARM64_OpARM64MOVWstore_10(v *Value) bool { - b := v.Block - // match: (MOVWstore [4] {s} (ADD idx0 ptr0) (SRLconst [32] w) x:(MOVWstoreidx ptr1 idx1 w mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVDstoreidx ptr1 idx1 w mem) - for { - if v.AuxInt != 4 { - break - } - s := v.Aux - _ = v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { - break - } - ptr0 := v_0.Args[1] - idx0 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 32 { - break - } - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVWstoreidx { - break - } - mem := x.Args[3] - ptr1 := x.Args[0] - idx1 := x.Args[1] - if w != x.Args[2] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { - break - } - v.reset(OpARM64MOVDstoreidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(w) - v.AddArg(mem) - return true - } - // match: (MOVWstore [4] {s} (ADDshiftLL [2] ptr0 idx0) (SRLconst [32] w) x:(MOVWstoreidx4 ptr1 idx1 w mem)) - // cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x) - // result: (MOVDstoreidx ptr1 (SLLconst [2] idx1) w mem) - for { - if v.AuxInt != 4 { - break - } - s := v.Aux - _ = v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 2 { - break - } - idx0 := v_0.Args[1] - ptr0 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 32 { - break - } - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVWstoreidx4 { - break - } - mem := x.Args[3] - ptr1 := x.Args[0] - idx1 := x.Args[1] - if w != x.Args[2] || !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) { - break - } - v.reset(OpARM64MOVDstoreidx) - v.AddArg(ptr1) - v0 := b.NewValue0(v.Pos, OpARM64SLLconst, idx1.Type) - v0.AuxInt = 2 - v0.AddArg(idx1) - v.AddArg(v0) - v.AddArg(w) - v.AddArg(mem) - return true - } - // match: (MOVWstore [i] {s} ptr0 (SRLconst [j] w) x:(MOVWstore [i-4] {s} ptr1 w0:(SRLconst [j-32] w) mem)) - // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) - // result: (MOVDstore [i-4] {s} ptr0 w0 mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - ptr0 := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst { - break - } - j := v_1.AuxInt - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVWstore || x.AuxInt != i-4 || x.Aux != s { - break - } - mem := x.Args[2] - ptr1 := x.Args[0] - w0 := x.Args[1] - if w0.Op != OpARM64SRLconst || w0.AuxInt != j-32 || w != w0.Args[0] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { - break - } - v.reset(OpARM64MOVDstore) - v.AuxInt = i - 4 - v.Aux = s - v.AddArg(ptr0) - v.AddArg(w0) - v.AddArg(mem) - return true - } - // match: (MOVWstore [4] {s} (ADD ptr0 idx0) (SRLconst [j] w) x:(MOVWstoreidx ptr1 idx1 w0:(SRLconst [j-32] w) mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVDstoreidx ptr1 idx1 w0 mem) - for { - if v.AuxInt != 4 { - break - } - s := v.Aux - _ = v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { - break - } - idx0 := v_0.Args[1] - ptr0 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst { - break - } - j := v_1.AuxInt - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVWstoreidx { - break - } - mem := x.Args[3] - ptr1 := x.Args[0] - idx1 := x.Args[1] - w0 := x.Args[2] - if w0.Op != OpARM64SRLconst || w0.AuxInt != j-32 || w != w0.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { - break - } - v.reset(OpARM64MOVDstoreidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(w0) - v.AddArg(mem) - return true - } - // match: (MOVWstore [4] {s} (ADD idx0 ptr0) (SRLconst [j] w) x:(MOVWstoreidx ptr1 idx1 w0:(SRLconst [j-32] w) mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVDstoreidx ptr1 idx1 w0 mem) - for { - if v.AuxInt != 4 { - break - } - s := v.Aux - _ = v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { - break - } - ptr0 := v_0.Args[1] - idx0 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst { - break - } - j := v_1.AuxInt - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVWstoreidx { - break - } - mem := x.Args[3] - ptr1 := x.Args[0] - idx1 := x.Args[1] - w0 := x.Args[2] - if w0.Op != OpARM64SRLconst || w0.AuxInt != j-32 || w != w0.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { - break - } - v.reset(OpARM64MOVDstoreidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(w0) - v.AddArg(mem) - return true - } - // match: (MOVWstore [4] {s} (ADDshiftLL [2] ptr0 idx0) (SRLconst [j] w) x:(MOVWstoreidx4 ptr1 idx1 w0:(SRLconst [j-32] w) mem)) - // cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x) - // result: (MOVDstoreidx ptr1 (SLLconst [2] idx1) w0 mem) - for { - if v.AuxInt != 4 { - break - } - s := v.Aux - _ = v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 2 { - break - } - idx0 := v_0.Args[1] - ptr0 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst { - break - } - j := v_1.AuxInt - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVWstoreidx4 { - break - } - mem := x.Args[3] - ptr1 := x.Args[0] - idx1 := x.Args[1] - w0 := x.Args[2] - if w0.Op != OpARM64SRLconst || w0.AuxInt != j-32 || w != w0.Args[0] || !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) { - break - } - v.reset(OpARM64MOVDstoreidx) - v.AddArg(ptr1) - v0 := b.NewValue0(v.Pos, OpARM64SLLconst, idx1.Type) - v0.AuxInt = 2 - v0.AddArg(idx1) - v.AddArg(v0) - v.AddArg(w0) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueARM64_OpARM64MOVWstoreidx_0(v *Value) bool { - // match: (MOVWstoreidx ptr (MOVDconst [c]) val mem) - // result: (MOVWstore [c] ptr val mem) - for { - mem := v.Args[3] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - val := v.Args[2] - v.reset(OpARM64MOVWstore) - v.AuxInt = c - v.AddArg(ptr) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx (MOVDconst [c]) idx val mem) - // result: (MOVWstore [c] idx val mem) - for { - mem := v.Args[3] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - idx := v.Args[1] - val := v.Args[2] - v.reset(OpARM64MOVWstore) - v.AuxInt = c - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx ptr (SLLconst [2] idx) val mem) - // result: (MOVWstoreidx4 ptr idx val mem) - for { - mem := v.Args[3] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SLLconst || v_1.AuxInt != 2 { - break - } - idx := v_1.Args[0] - val := v.Args[2] - v.reset(OpARM64MOVWstoreidx4) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx (SLLconst [2] idx) ptr val mem) - // result: (MOVWstoreidx4 ptr idx val mem) - for { - mem := v.Args[3] - v_0 := v.Args[0] - if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 2 { - break - } - idx := v_0.Args[0] - ptr := v.Args[1] - val := v.Args[2] - v.reset(OpARM64MOVWstoreidx4) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx ptr idx (MOVDconst [0]) mem) - // result: (MOVWstorezeroidx ptr idx mem) - for { - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 0 { - break - } - v.reset(OpARM64MOVWstorezeroidx) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx ptr idx (MOVWreg x) mem) - // result: (MOVWstoreidx ptr idx x mem) - for { - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVWreg { - break - } - x := v_2.Args[0] - v.reset(OpARM64MOVWstoreidx) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(x) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx ptr idx (MOVWUreg x) mem) - // result: (MOVWstoreidx ptr idx x mem) - for { - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVWUreg { - break - } - x := v_2.Args[0] - v.reset(OpARM64MOVWstoreidx) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(x) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx ptr (ADDconst [4] idx) (SRLconst [32] w) x:(MOVWstoreidx ptr idx w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVDstoreidx ptr idx w mem) - for { - _ = v.Args[3] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64ADDconst || v_1.AuxInt != 4 { - break - } - idx := v_1.Args[0] - v_2 := v.Args[2] - if v_2.Op != OpARM64SRLconst || v_2.AuxInt != 32 { - break - } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpARM64MOVWstoreidx { - break - } - mem := x.Args[3] - if ptr != x.Args[0] || idx != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpARM64MOVDstoreidx) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueARM64_OpARM64MOVWstoreidx4_0(v *Value) bool { - // match: (MOVWstoreidx4 ptr (MOVDconst [c]) val mem) - // result: (MOVWstore [c<<2] ptr val mem) - for { - mem := v.Args[3] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - val := v.Args[2] - v.reset(OpARM64MOVWstore) - v.AuxInt = c << 2 - v.AddArg(ptr) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx4 ptr idx (MOVDconst [0]) mem) - // result: (MOVWstorezeroidx4 ptr idx mem) - for { - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 0 { - break - } - v.reset(OpARM64MOVWstorezeroidx4) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx4 ptr idx (MOVWreg x) mem) - // result: (MOVWstoreidx4 ptr idx x mem) - for { - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVWreg { - break - } - x := v_2.Args[0] - v.reset(OpARM64MOVWstoreidx4) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(x) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx4 ptr idx (MOVWUreg x) mem) - // result: (MOVWstoreidx4 ptr idx x mem) - for { - mem := v.Args[3] - ptr := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVWUreg { - break - } - x := v_2.Args[0] - v.reset(OpARM64MOVWstoreidx4) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(x) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueARM64_OpARM64MOVWstorezero_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (MOVWstorezero [off1] {sym} (ADDconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVWstorezero [off1+off2] {sym} ptr mem) - for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADDconst { - break - } - off2 := v_0.AuxInt - ptr := v_0.Args[0] - if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { - break - } - v.reset(OpARM64MOVWstorezero) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MOVWstorezero [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (MOVWstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) - for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDaddr { - break - } - off2 := v_0.AuxInt - sym2 := v_0.Aux - ptr := v_0.Args[0] - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { - break - } - v.reset(OpARM64MOVWstorezero) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MOVWstorezero [off] {sym} (ADD ptr idx) mem) - // cond: off == 0 && sym == nil - // result: (MOVWstorezeroidx ptr idx mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { - break - } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(off == 0 && sym == nil) { - break - } - v.reset(OpARM64MOVWstorezeroidx) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWstorezero [off] {sym} (ADDshiftLL [2] ptr idx) mem) - // cond: off == 0 && sym == nil - // result: (MOVWstorezeroidx4 ptr idx mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 2 { - break - } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(off == 0 && sym == nil) { - break - } - v.reset(OpARM64MOVWstorezeroidx4) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWstorezero [i] {s} ptr0 x:(MOVWstorezero [j] {s} ptr1 mem)) - // cond: x.Uses == 1 && areAdjacentOffsets(i,j,4) && is32Bit(min(i,j)) && isSamePtr(ptr0, ptr1) && clobber(x) - // result: (MOVDstorezero [min(i,j)] {s} ptr0 mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[1] - ptr0 := v.Args[0] - x := v.Args[1] - if x.Op != OpARM64MOVWstorezero { - break - } - j := x.AuxInt - if x.Aux != s { - break - } - mem := x.Args[1] - ptr1 := x.Args[0] - if !(x.Uses == 1 && areAdjacentOffsets(i, j, 4) && is32Bit(min(i, j)) && isSamePtr(ptr0, ptr1) && clobber(x)) { - break - } - v.reset(OpARM64MOVDstorezero) - v.AuxInt = min(i, j) - v.Aux = s - v.AddArg(ptr0) - v.AddArg(mem) - return true - } - // match: (MOVWstorezero [4] {s} (ADD ptr0 idx0) x:(MOVWstorezeroidx ptr1 idx1 mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVDstorezeroidx ptr1 idx1 mem) - for { - if v.AuxInt != 4 { - break - } - s := v.Aux - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { - break - } - idx0 := v_0.Args[1] - ptr0 := v_0.Args[0] - x := v.Args[1] - if x.Op != OpARM64MOVWstorezeroidx { - break - } - mem := x.Args[2] - ptr1 := x.Args[0] - idx1 := x.Args[1] - if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { - break - } - v.reset(OpARM64MOVDstorezeroidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(mem) - return true - } - // match: (MOVWstorezero [4] {s} (ADD idx0 ptr0) x:(MOVWstorezeroidx ptr1 idx1 mem)) - // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) - // result: (MOVDstorezeroidx ptr1 idx1 mem) - for { - if v.AuxInt != 4 { - break - } - s := v.Aux - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADD { - break - } - ptr0 := v_0.Args[1] - idx0 := v_0.Args[0] - x := v.Args[1] - if x.Op != OpARM64MOVWstorezeroidx { - break - } - mem := x.Args[2] - ptr1 := x.Args[0] - idx1 := x.Args[1] - if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { - break - } - v.reset(OpARM64MOVDstorezeroidx) - v.AddArg(ptr1) - v.AddArg(idx1) - v.AddArg(mem) - return true - } - // match: (MOVWstorezero [4] {s} (ADDshiftLL [2] ptr0 idx0) x:(MOVWstorezeroidx4 ptr1 idx1 mem)) - // cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x) - // result: (MOVDstorezeroidx ptr1 (SLLconst [2] idx1) mem) - for { - if v.AuxInt != 4 { - break - } - s := v.Aux - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 2 { - break - } - idx0 := v_0.Args[1] - ptr0 := v_0.Args[0] - x := v.Args[1] - if x.Op != OpARM64MOVWstorezeroidx4 { - break - } - mem := x.Args[2] - ptr1 := x.Args[0] - idx1 := x.Args[1] - if !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) { - break - } - v.reset(OpARM64MOVDstorezeroidx) - v.AddArg(ptr1) - v0 := b.NewValue0(v.Pos, OpARM64SLLconst, idx1.Type) - v0.AuxInt = 2 - v0.AddArg(idx1) - v.AddArg(v0) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueARM64_OpARM64MOVWstorezeroidx_0(v *Value) bool { - // match: (MOVWstorezeroidx ptr (MOVDconst [c]) mem) - // result: (MOVWstorezero [c] ptr mem) - for { - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - v.reset(OpARM64MOVWstorezero) - v.AuxInt = c - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MOVWstorezeroidx (MOVDconst [c]) idx mem) - // result: (MOVWstorezero [c] idx mem) - for { - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - idx := v.Args[1] - v.reset(OpARM64MOVWstorezero) - v.AuxInt = c - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWstorezeroidx ptr (SLLconst [2] idx) mem) - // result: (MOVWstorezeroidx4 ptr idx mem) - for { - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SLLconst || v_1.AuxInt != 2 { - break - } - idx := v_1.Args[0] - v.reset(OpARM64MOVWstorezeroidx4) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWstorezeroidx (SLLconst [2] idx) ptr mem) - // result: (MOVWstorezeroidx4 ptr idx mem) - for { - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 2 { - break - } - idx := v_0.Args[0] - ptr := v.Args[1] - v.reset(OpARM64MOVWstorezeroidx4) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWstorezeroidx ptr (ADDconst [4] idx) x:(MOVWstorezeroidx ptr idx mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVDstorezeroidx ptr idx mem) - for { - _ = v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64ADDconst || v_1.AuxInt != 4 { - break - } - idx := v_1.Args[0] - x := v.Args[2] - if x.Op != OpARM64MOVWstorezeroidx { - break - } - mem := x.Args[2] - if ptr != x.Args[0] || idx != x.Args[1] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpARM64MOVDstorezeroidx) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueARM64_OpARM64MOVWstorezeroidx4_0(v *Value) bool { - // match: (MOVWstorezeroidx4 ptr (MOVDconst [c]) mem) - // result: (MOVWstorezero [c<<2] ptr mem) - for { - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - v.reset(OpARM64MOVWstorezero) - v.AuxInt = c << 2 - v.AddArg(ptr) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueARM64_OpARM64MSUB_0(v *Value) bool { - b := v.Block - // match: (MSUB a x (MOVDconst [-1])) - // result: (ADD a x) - for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != -1 { - break - } - v.reset(OpARM64ADD) - v.AddArg(a) - v.AddArg(x) - return true - } - // match: (MSUB a _ (MOVDconst [0])) - // result: a - for { - _ = v.Args[2] - a := v.Args[0] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 0 { - break - } - v.reset(OpCopy) - v.Type = a.Type - v.AddArg(a) - return true - } - // match: (MSUB a x (MOVDconst [1])) - // result: (SUB a x) - for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 1 { - break - } - v.reset(OpARM64SUB) - v.AddArg(a) - v.AddArg(x) - return true - } - // match: (MSUB a x (MOVDconst [c])) - // cond: isPowerOfTwo(c) - // result: (SUBshiftLL a x [log2(c)]) - for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - c := v_2.AuxInt - if !(isPowerOfTwo(c)) { - break - } - v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c) - v.AddArg(a) - v.AddArg(x) - return true - } - // match: (MSUB a x (MOVDconst [c])) - // cond: isPowerOfTwo(c-1) && c>=3 - // result: (SUB a (ADDshiftLL x x [log2(c-1)])) - for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - c := v_2.AuxInt - if !(isPowerOfTwo(c-1) && c >= 3) { - break - } - v.reset(OpARM64SUB) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = log2(c - 1) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MSUB a x (MOVDconst [c])) - // cond: isPowerOfTwo(c+1) && c>=7 - // result: (ADD a (SUBshiftLL x x [log2(c+1)])) - for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - c := v_2.AuxInt - if !(isPowerOfTwo(c+1) && c >= 7) { - break - } - v.reset(OpARM64ADD) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = log2(c + 1) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MSUB a x (MOVDconst [c])) - // cond: c%3 == 0 && isPowerOfTwo(c/3) - // result: (ADDshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) - for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - c := v_2.AuxInt - if !(c%3 == 0 && isPowerOfTwo(c/3)) { - break - } - v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c / 3) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 2 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MSUB a x (MOVDconst [c])) - // cond: c%5 == 0 && isPowerOfTwo(c/5) - // result: (SUBshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) - for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - c := v_2.AuxInt - if !(c%5 == 0 && isPowerOfTwo(c/5)) { - break - } - v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c / 5) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 2 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MSUB a x (MOVDconst [c])) - // cond: c%7 == 0 && isPowerOfTwo(c/7) - // result: (ADDshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) - for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - c := v_2.AuxInt - if !(c%7 == 0 && isPowerOfTwo(c/7)) { - break - } - v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c / 7) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 3 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MSUB a x (MOVDconst [c])) - // cond: c%9 == 0 && isPowerOfTwo(c/9) - // result: (SUBshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) - for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - c := v_2.AuxInt - if !(c%9 == 0 && isPowerOfTwo(c/9)) { - break - } - v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c / 9) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 3 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - return false -} -func rewriteValueARM64_OpARM64MSUB_10(v *Value) bool { - b := v.Block - // match: (MSUB a (MOVDconst [-1]) x) - // result: (ADD a x) - for { - x := v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != -1 { - break - } - v.reset(OpARM64ADD) - v.AddArg(a) - v.AddArg(x) - return true - } - // match: (MSUB a (MOVDconst [0]) _) - // result: a - for { - _ = v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 0 { - break - } - v.reset(OpCopy) - v.Type = a.Type - v.AddArg(a) - return true - } - // match: (MSUB a (MOVDconst [1]) x) - // result: (SUB a x) - for { - x := v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 1 { - break - } - v.reset(OpARM64SUB) - v.AddArg(a) - v.AddArg(x) - return true - } - // match: (MSUB a (MOVDconst [c]) x) - // cond: isPowerOfTwo(c) - // result: (SUBshiftLL a x [log2(c)]) - for { - x := v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c)) { - break - } - v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c) - v.AddArg(a) - v.AddArg(x) - return true - } - // match: (MSUB a (MOVDconst [c]) x) - // cond: isPowerOfTwo(c-1) && c>=3 - // result: (SUB a (ADDshiftLL x x [log2(c-1)])) - for { - x := v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c-1) && c >= 3) { - break - } - v.reset(OpARM64SUB) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = log2(c - 1) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MSUB a (MOVDconst [c]) x) - // cond: isPowerOfTwo(c+1) && c>=7 - // result: (ADD a (SUBshiftLL x x [log2(c+1)])) - for { - x := v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c+1) && c >= 7) { - break - } - v.reset(OpARM64ADD) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = log2(c + 1) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MSUB a (MOVDconst [c]) x) - // cond: c%3 == 0 && isPowerOfTwo(c/3) - // result: (ADDshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) - for { - x := v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(c%3 == 0 && isPowerOfTwo(c/3)) { - break - } - v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c / 3) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 2 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MSUB a (MOVDconst [c]) x) - // cond: c%5 == 0 && isPowerOfTwo(c/5) - // result: (SUBshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) - for { - x := v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(c%5 == 0 && isPowerOfTwo(c/5)) { - break - } - v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c / 5) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 2 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MSUB a (MOVDconst [c]) x) - // cond: c%7 == 0 && isPowerOfTwo(c/7) - // result: (ADDshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) - for { - x := v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(c%7 == 0 && isPowerOfTwo(c/7)) { - break - } - v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c / 7) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 3 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MSUB a (MOVDconst [c]) x) - // cond: c%9 == 0 && isPowerOfTwo(c/9) - // result: (SUBshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) - for { - x := v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(c%9 == 0 && isPowerOfTwo(c/9)) { - break - } - v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c / 9) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 3 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - return false -} -func rewriteValueARM64_OpARM64MSUB_20(v *Value) bool { - b := v.Block - // match: (MSUB (MOVDconst [c]) x y) - // result: (ADDconst [c] (MNEG x y)) - for { - y := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - x := v.Args[1] - v.reset(OpARM64ADDconst) - v.AuxInt = c - v0 := b.NewValue0(v.Pos, OpARM64MNEG, x.Type) - v0.AddArg(x) - v0.AddArg(y) - v.AddArg(v0) - return true - } - // match: (MSUB a (MOVDconst [c]) (MOVDconst [d])) - // result: (SUBconst [c*d] a) - for { - _ = v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - d := v_2.AuxInt - v.reset(OpARM64SUBconst) - v.AuxInt = c * d - v.AddArg(a) - return true - } - return false -} -func rewriteValueARM64_OpARM64MSUBW_0(v *Value) bool { - b := v.Block - // match: (MSUBW a x (MOVDconst [c])) - // cond: int32(c)==-1 - // result: (ADD a x) - for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - c := v_2.AuxInt - if !(int32(c) == -1) { - break - } - v.reset(OpARM64ADD) - v.AddArg(a) - v.AddArg(x) - return true - } - // match: (MSUBW a _ (MOVDconst [c])) - // cond: int32(c)==0 - // result: a - for { - _ = v.Args[2] - a := v.Args[0] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - c := v_2.AuxInt - if !(int32(c) == 0) { - break - } - v.reset(OpCopy) - v.Type = a.Type - v.AddArg(a) - return true - } - // match: (MSUBW a x (MOVDconst [c])) - // cond: int32(c)==1 - // result: (SUB a x) - for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - c := v_2.AuxInt - if !(int32(c) == 1) { - break - } - v.reset(OpARM64SUB) - v.AddArg(a) - v.AddArg(x) - return true - } - // match: (MSUBW a x (MOVDconst [c])) - // cond: isPowerOfTwo(c) - // result: (SUBshiftLL a x [log2(c)]) - for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - c := v_2.AuxInt - if !(isPowerOfTwo(c)) { - break - } - v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c) - v.AddArg(a) - v.AddArg(x) - return true - } - // match: (MSUBW a x (MOVDconst [c])) - // cond: isPowerOfTwo(c-1) && int32(c)>=3 - // result: (SUB a (ADDshiftLL x x [log2(c-1)])) - for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - c := v_2.AuxInt - if !(isPowerOfTwo(c-1) && int32(c) >= 3) { - break - } - v.reset(OpARM64SUB) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = log2(c - 1) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MSUBW a x (MOVDconst [c])) - // cond: isPowerOfTwo(c+1) && int32(c)>=7 - // result: (ADD a (SUBshiftLL x x [log2(c+1)])) - for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - c := v_2.AuxInt - if !(isPowerOfTwo(c+1) && int32(c) >= 7) { - break - } - v.reset(OpARM64ADD) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = log2(c + 1) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MSUBW a x (MOVDconst [c])) - // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) - // result: (ADDshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) - for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - c := v_2.AuxInt - if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { - break - } - v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c / 3) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 2 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MSUBW a x (MOVDconst [c])) - // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) - // result: (SUBshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) - for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - c := v_2.AuxInt - if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { - break - } - v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c / 5) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 2 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MSUBW a x (MOVDconst [c])) - // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) - // result: (ADDshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) - for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - c := v_2.AuxInt - if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { - break - } - v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c / 7) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 3 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MSUBW a x (MOVDconst [c])) - // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) - // result: (SUBshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) - for { - _ = v.Args[2] - a := v.Args[0] - x := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - c := v_2.AuxInt - if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { - break - } - v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c / 9) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 3 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - return false -} -func rewriteValueARM64_OpARM64MSUBW_10(v *Value) bool { - b := v.Block - // match: (MSUBW a (MOVDconst [c]) x) - // cond: int32(c)==-1 - // result: (ADD a x) - for { - x := v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(int32(c) == -1) { - break - } - v.reset(OpARM64ADD) - v.AddArg(a) - v.AddArg(x) - return true - } - // match: (MSUBW a (MOVDconst [c]) _) - // cond: int32(c)==0 - // result: a - for { - _ = v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(int32(c) == 0) { - break - } - v.reset(OpCopy) - v.Type = a.Type - v.AddArg(a) - return true - } - // match: (MSUBW a (MOVDconst [c]) x) - // cond: int32(c)==1 - // result: (SUB a x) - for { - x := v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(int32(c) == 1) { - break - } - v.reset(OpARM64SUB) - v.AddArg(a) - v.AddArg(x) - return true - } - // match: (MSUBW a (MOVDconst [c]) x) - // cond: isPowerOfTwo(c) - // result: (SUBshiftLL a x [log2(c)]) - for { - x := v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c)) { - break - } - v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c) - v.AddArg(a) - v.AddArg(x) - return true - } - // match: (MSUBW a (MOVDconst [c]) x) - // cond: isPowerOfTwo(c-1) && int32(c)>=3 - // result: (SUB a (ADDshiftLL x x [log2(c-1)])) - for { - x := v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c-1) && int32(c) >= 3) { - break - } - v.reset(OpARM64SUB) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = log2(c - 1) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MSUBW a (MOVDconst [c]) x) - // cond: isPowerOfTwo(c+1) && int32(c)>=7 - // result: (ADD a (SUBshiftLL x x [log2(c+1)])) - for { - x := v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c+1) && int32(c) >= 7) { - break - } - v.reset(OpARM64ADD) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = log2(c + 1) - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MSUBW a (MOVDconst [c]) x) - // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) - // result: (ADDshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) - for { - x := v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { - break - } - v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c / 3) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 2 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MSUBW a (MOVDconst [c]) x) - // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) - // result: (SUBshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) - for { - x := v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { - break - } - v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c / 5) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 2 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MSUBW a (MOVDconst [c]) x) - // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) - // result: (ADDshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) - for { - x := v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { - break - } - v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c / 7) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 3 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MSUBW a (MOVDconst [c]) x) - // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) - // result: (SUBshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) - for { - x := v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { - break - } - v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c / 9) - v.AddArg(a) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 3 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - return false -} -func rewriteValueARM64_OpARM64MSUBW_20(v *Value) bool { - b := v.Block - // match: (MSUBW (MOVDconst [c]) x y) - // result: (ADDconst [c] (MNEGW x y)) - for { - y := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - x := v.Args[1] - v.reset(OpARM64ADDconst) - v.AuxInt = c - v0 := b.NewValue0(v.Pos, OpARM64MNEGW, x.Type) - v0.AddArg(x) - v0.AddArg(y) - v.AddArg(v0) - return true - } - // match: (MSUBW a (MOVDconst [c]) (MOVDconst [d])) - // result: (SUBconst [int64(int32(c)*int32(d))] a) - for { - _ = v.Args[2] - a := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst { - break - } - d := v_2.AuxInt - v.reset(OpARM64SUBconst) - v.AuxInt = int64(int32(c) * int32(d)) - v.AddArg(a) - return true - } - return false -} -func rewriteValueARM64_OpARM64MUL_0(v *Value) bool { - // match: (MUL (NEG x) y) - // result: (MNEG x y) - for { - y := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64NEG { - break - } - x := v_0.Args[0] - v.reset(OpARM64MNEG) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (MUL y (NEG x)) - // result: (MNEG x y) - for { - _ = v.Args[1] - y := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64NEG { - break - } - x := v_1.Args[0] - v.reset(OpARM64MNEG) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (MUL x (MOVDconst [-1])) - // result: (NEG x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != -1 { - break - } - v.reset(OpARM64NEG) - v.AddArg(x) - return true - } - // match: (MUL (MOVDconst [-1]) x) - // result: (NEG x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst || v_0.AuxInt != -1 { - break - } - v.reset(OpARM64NEG) - v.AddArg(x) - return true - } - // match: (MUL _ (MOVDconst [0])) - // result: (MOVDconst [0]) - for { - _ = v.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 0 { - break - } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 - return true - } - // match: (MUL (MOVDconst [0]) _) - // result: (MOVDconst [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst || v_0.AuxInt != 0 { - break - } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 - return true - } - // match: (MUL x (MOVDconst [1])) - // result: x - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 1 { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (MUL (MOVDconst [1]) x) - // result: x - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst || v_0.AuxInt != 1 { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (MUL x (MOVDconst [c])) - // cond: isPowerOfTwo(c) - // result: (SLLconst [log2(c)] x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c)) { - break - } - v.reset(OpARM64SLLconst) - v.AuxInt = log2(c) - v.AddArg(x) - return true - } - // match: (MUL (MOVDconst [c]) x) - // cond: isPowerOfTwo(c) - // result: (SLLconst [log2(c)] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - if !(isPowerOfTwo(c)) { - break - } - v.reset(OpARM64SLLconst) - v.AuxInt = log2(c) - v.AddArg(x) - return true - } - return false -} -func rewriteValueARM64_OpARM64MUL_10(v *Value) bool { - b := v.Block - // match: (MUL x (MOVDconst [c])) - // cond: isPowerOfTwo(c-1) && c >= 3 - // result: (ADDshiftLL x x [log2(c-1)]) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c-1) && c >= 3) { - break - } - v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c - 1) - v.AddArg(x) - v.AddArg(x) - return true - } - // match: (MUL (MOVDconst [c]) x) - // cond: isPowerOfTwo(c-1) && c >= 3 - // result: (ADDshiftLL x x [log2(c-1)]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - if !(isPowerOfTwo(c-1) && c >= 3) { - break - } - v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c - 1) - v.AddArg(x) - v.AddArg(x) - return true - } - // match: (MUL x (MOVDconst [c])) - // cond: isPowerOfTwo(c+1) && c >= 7 - // result: (ADDshiftLL (NEG x) x [log2(c+1)]) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c+1) && c >= 7) { - break - } - v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c + 1) - v0 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) - v0.AddArg(x) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (MUL (MOVDconst [c]) x) - // cond: isPowerOfTwo(c+1) && c >= 7 - // result: (ADDshiftLL (NEG x) x [log2(c+1)]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - if !(isPowerOfTwo(c+1) && c >= 7) { - break - } - v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c + 1) - v0 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) - v0.AddArg(x) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (MUL x (MOVDconst [c])) - // cond: c%3 == 0 && isPowerOfTwo(c/3) - // result: (SLLconst [log2(c/3)] (ADDshiftLL x x [1])) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(c%3 == 0 && isPowerOfTwo(c/3)) { - break - } - v.reset(OpARM64SLLconst) - v.AuxInt = log2(c / 3) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 1 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MUL (MOVDconst [c]) x) - // cond: c%3 == 0 && isPowerOfTwo(c/3) - // result: (SLLconst [log2(c/3)] (ADDshiftLL x x [1])) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - if !(c%3 == 0 && isPowerOfTwo(c/3)) { - break - } - v.reset(OpARM64SLLconst) - v.AuxInt = log2(c / 3) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 1 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MUL x (MOVDconst [c])) - // cond: c%5 == 0 && isPowerOfTwo(c/5) - // result: (SLLconst [log2(c/5)] (ADDshiftLL x x [2])) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(c%5 == 0 && isPowerOfTwo(c/5)) { - break - } - v.reset(OpARM64SLLconst) - v.AuxInt = log2(c / 5) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 2 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MUL (MOVDconst [c]) x) - // cond: c%5 == 0 && isPowerOfTwo(c/5) - // result: (SLLconst [log2(c/5)] (ADDshiftLL x x [2])) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - if !(c%5 == 0 && isPowerOfTwo(c/5)) { - break - } - v.reset(OpARM64SLLconst) - v.AuxInt = log2(c / 5) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 2 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MUL x (MOVDconst [c])) - // cond: c%7 == 0 && isPowerOfTwo(c/7) - // result: (SLLconst [log2(c/7)] (ADDshiftLL (NEG x) x [3])) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(c%7 == 0 && isPowerOfTwo(c/7)) { - break - } - v.reset(OpARM64SLLconst) - v.AuxInt = log2(c / 7) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 3 - v1 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) - v1.AddArg(x) - v0.AddArg(v1) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MUL (MOVDconst [c]) x) - // cond: c%7 == 0 && isPowerOfTwo(c/7) - // result: (SLLconst [log2(c/7)] (ADDshiftLL (NEG x) x [3])) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - if !(c%7 == 0 && isPowerOfTwo(c/7)) { - break - } - v.reset(OpARM64SLLconst) - v.AuxInt = log2(c / 7) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 3 - v1 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) - v1.AddArg(x) - v0.AddArg(v1) - v0.AddArg(x) - v.AddArg(v0) - return true - } - return false -} -func rewriteValueARM64_OpARM64MUL_20(v *Value) bool { - b := v.Block - // match: (MUL x (MOVDconst [c])) - // cond: c%9 == 0 && isPowerOfTwo(c/9) - // result: (SLLconst [log2(c/9)] (ADDshiftLL x x [3])) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(c%9 == 0 && isPowerOfTwo(c/9)) { - break - } - v.reset(OpARM64SLLconst) - v.AuxInt = log2(c / 9) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 3 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MUL (MOVDconst [c]) x) - // cond: c%9 == 0 && isPowerOfTwo(c/9) - // result: (SLLconst [log2(c/9)] (ADDshiftLL x x [3])) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - if !(c%9 == 0 && isPowerOfTwo(c/9)) { - break - } - v.reset(OpARM64SLLconst) - v.AuxInt = log2(c / 9) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 3 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MUL (MOVDconst [c]) (MOVDconst [d])) - // result: (MOVDconst [c*d]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - d := v_1.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = c * d - return true - } - // match: (MUL (MOVDconst [d]) (MOVDconst [c])) - // result: (MOVDconst [c*d]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = c * d - return true - } - return false -} -func rewriteValueARM64_OpARM64MULW_0(v *Value) bool { - // match: (MULW (NEG x) y) - // result: (MNEGW x y) - for { - y := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64NEG { - break - } - x := v_0.Args[0] - v.reset(OpARM64MNEGW) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (MULW y (NEG x)) - // result: (MNEGW x y) - for { - _ = v.Args[1] - y := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64NEG { - break - } - x := v_1.Args[0] - v.reset(OpARM64MNEGW) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (MULW x (MOVDconst [c])) - // cond: int32(c)==-1 - // result: (NEG x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(int32(c) == -1) { - break - } - v.reset(OpARM64NEG) - v.AddArg(x) - return true - } - // match: (MULW (MOVDconst [c]) x) - // cond: int32(c)==-1 - // result: (NEG x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - if !(int32(c) == -1) { - break - } - v.reset(OpARM64NEG) - v.AddArg(x) - return true - } - // match: (MULW _ (MOVDconst [c])) - // cond: int32(c)==0 - // result: (MOVDconst [0]) - for { - _ = v.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(int32(c) == 0) { - break - } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 - return true - } - // match: (MULW (MOVDconst [c]) _) - // cond: int32(c)==0 - // result: (MOVDconst [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - if !(int32(c) == 0) { - break - } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 - return true - } - // match: (MULW x (MOVDconst [c])) - // cond: int32(c)==1 - // result: x - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(int32(c) == 1) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (MULW (MOVDconst [c]) x) - // cond: int32(c)==1 - // result: x - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - if !(int32(c) == 1) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (MULW x (MOVDconst [c])) - // cond: isPowerOfTwo(c) - // result: (SLLconst [log2(c)] x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c)) { - break - } - v.reset(OpARM64SLLconst) - v.AuxInt = log2(c) - v.AddArg(x) - return true - } - // match: (MULW (MOVDconst [c]) x) - // cond: isPowerOfTwo(c) - // result: (SLLconst [log2(c)] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - if !(isPowerOfTwo(c)) { - break - } - v.reset(OpARM64SLLconst) - v.AuxInt = log2(c) - v.AddArg(x) - return true - } - return false -} -func rewriteValueARM64_OpARM64MULW_10(v *Value) bool { - b := v.Block - // match: (MULW x (MOVDconst [c])) - // cond: isPowerOfTwo(c-1) && int32(c) >= 3 - // result: (ADDshiftLL x x [log2(c-1)]) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c-1) && int32(c) >= 3) { - break - } - v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c - 1) - v.AddArg(x) - v.AddArg(x) - return true - } - // match: (MULW (MOVDconst [c]) x) - // cond: isPowerOfTwo(c-1) && int32(c) >= 3 - // result: (ADDshiftLL x x [log2(c-1)]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - if !(isPowerOfTwo(c-1) && int32(c) >= 3) { - break - } - v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c - 1) - v.AddArg(x) - v.AddArg(x) - return true - } - // match: (MULW x (MOVDconst [c])) - // cond: isPowerOfTwo(c+1) && int32(c) >= 7 - // result: (ADDshiftLL (NEG x) x [log2(c+1)]) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c+1) && int32(c) >= 7) { - break - } - v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c + 1) - v0 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) - v0.AddArg(x) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (MULW (MOVDconst [c]) x) - // cond: isPowerOfTwo(c+1) && int32(c) >= 7 - // result: (ADDshiftLL (NEG x) x [log2(c+1)]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - if !(isPowerOfTwo(c+1) && int32(c) >= 7) { - break - } - v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c + 1) - v0 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) - v0.AddArg(x) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (MULW x (MOVDconst [c])) - // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) - // result: (SLLconst [log2(c/3)] (ADDshiftLL x x [1])) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { - break - } - v.reset(OpARM64SLLconst) - v.AuxInt = log2(c / 3) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 1 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MULW (MOVDconst [c]) x) - // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) - // result: (SLLconst [log2(c/3)] (ADDshiftLL x x [1])) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { - break - } - v.reset(OpARM64SLLconst) - v.AuxInt = log2(c / 3) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 1 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MULW x (MOVDconst [c])) - // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) - // result: (SLLconst [log2(c/5)] (ADDshiftLL x x [2])) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { - break - } - v.reset(OpARM64SLLconst) - v.AuxInt = log2(c / 5) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 2 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MULW (MOVDconst [c]) x) - // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) - // result: (SLLconst [log2(c/5)] (ADDshiftLL x x [2])) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { - break - } - v.reset(OpARM64SLLconst) - v.AuxInt = log2(c / 5) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 2 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MULW x (MOVDconst [c])) - // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) - // result: (SLLconst [log2(c/7)] (ADDshiftLL (NEG x) x [3])) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { - break - } - v.reset(OpARM64SLLconst) - v.AuxInt = log2(c / 7) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 3 - v1 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) - v1.AddArg(x) - v0.AddArg(v1) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MULW (MOVDconst [c]) x) - // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) - // result: (SLLconst [log2(c/7)] (ADDshiftLL (NEG x) x [3])) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { - break - } - v.reset(OpARM64SLLconst) - v.AuxInt = log2(c / 7) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 3 - v1 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) - v1.AddArg(x) - v0.AddArg(v1) - v0.AddArg(x) - v.AddArg(v0) - return true - } - return false -} -func rewriteValueARM64_OpARM64MULW_20(v *Value) bool { - b := v.Block - // match: (MULW x (MOVDconst [c])) - // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) - // result: (SLLconst [log2(c/9)] (ADDshiftLL x x [3])) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { - break - } - v.reset(OpARM64SLLconst) - v.AuxInt = log2(c / 9) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 3 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MULW (MOVDconst [c]) x) - // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) - // result: (SLLconst [log2(c/9)] (ADDshiftLL x x [3])) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { - break - } - v.reset(OpARM64SLLconst) - v.AuxInt = log2(c / 9) - v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 3 - v0.AddArg(x) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (MULW (MOVDconst [c]) (MOVDconst [d])) - // result: (MOVDconst [int64(int32(c)*int32(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - d := v_1.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = int64(int32(c) * int32(d)) - return true - } - // match: (MULW (MOVDconst [d]) (MOVDconst [c])) - // result: (MOVDconst [int64(int32(c)*int32(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = int64(int32(c) * int32(d)) - return true - } - return false -} -func rewriteValueARM64_OpARM64MVN_0(v *Value) bool { - // match: (MVN (MOVDconst [c])) - // result: (MOVDconst [^c]) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = ^c - return true - } - // match: (MVN x:(SLLconst [c] y)) - // cond: clobberIfDead(x) - // result: (MVNshiftLL [c] y) - for { - x := v.Args[0] - if x.Op != OpARM64SLLconst { - break - } - c := x.AuxInt - y := x.Args[0] - if !(clobberIfDead(x)) { - break - } - v.reset(OpARM64MVNshiftLL) - v.AuxInt = c - v.AddArg(y) - return true - } - // match: (MVN x:(SRLconst [c] y)) - // cond: clobberIfDead(x) - // result: (MVNshiftRL [c] y) - for { - x := v.Args[0] - if x.Op != OpARM64SRLconst { - break - } - c := x.AuxInt - y := x.Args[0] - if !(clobberIfDead(x)) { - break - } - v.reset(OpARM64MVNshiftRL) - v.AuxInt = c - v.AddArg(y) - return true - } - // match: (MVN x:(SRAconst [c] y)) - // cond: clobberIfDead(x) - // result: (MVNshiftRA [c] y) - for { - x := v.Args[0] - if x.Op != OpARM64SRAconst { - break - } - c := x.AuxInt - y := x.Args[0] - if !(clobberIfDead(x)) { - break - } - v.reset(OpARM64MVNshiftRA) - v.AuxInt = c - v.AddArg(y) - return true - } - return false -} -func rewriteValueARM64_OpARM64MVNshiftLL_0(v *Value) bool { - // match: (MVNshiftLL (MOVDconst [c]) [d]) - // result: (MOVDconst [^int64(uint64(c)<>uint64(d))]) - for { - d := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = ^(c >> uint64(d)) - return true - } - return false -} -func rewriteValueARM64_OpARM64MVNshiftRL_0(v *Value) bool { - // match: (MVNshiftRL (MOVDconst [c]) [d]) - // result: (MOVDconst [^int64(uint64(c)>>uint64(d))]) - for { - d := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = ^int64(uint64(c) >> uint64(d)) - return true - } - return false -} -func rewriteValueARM64_OpARM64NEG_0(v *Value) bool { - // match: (NEG (MUL x y)) - // result: (MNEG x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64MUL { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpARM64MNEG) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (NEG (MULW x y)) - // result: (MNEGW x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64MULW { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpARM64MNEGW) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (NEG (MOVDconst [c])) - // result: (MOVDconst [-c]) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = -c - return true - } - // match: (NEG x:(SLLconst [c] y)) - // cond: clobberIfDead(x) - // result: (NEGshiftLL [c] y) - for { - x := v.Args[0] - if x.Op != OpARM64SLLconst { - break - } - c := x.AuxInt - y := x.Args[0] - if !(clobberIfDead(x)) { - break - } - v.reset(OpARM64NEGshiftLL) - v.AuxInt = c - v.AddArg(y) - return true - } - // match: (NEG x:(SRLconst [c] y)) - // cond: clobberIfDead(x) - // result: (NEGshiftRL [c] y) - for { - x := v.Args[0] - if x.Op != OpARM64SRLconst { - break - } - c := x.AuxInt - y := x.Args[0] - if !(clobberIfDead(x)) { - break - } - v.reset(OpARM64NEGshiftRL) - v.AuxInt = c - v.AddArg(y) - return true - } - // match: (NEG x:(SRAconst [c] y)) - // cond: clobberIfDead(x) - // result: (NEGshiftRA [c] y) - for { - x := v.Args[0] - if x.Op != OpARM64SRAconst { - break - } - c := x.AuxInt - y := x.Args[0] - if !(clobberIfDead(x)) { - break - } - v.reset(OpARM64NEGshiftRA) - v.AuxInt = c - v.AddArg(y) - return true - } - return false -} -func rewriteValueARM64_OpARM64NEGshiftLL_0(v *Value) bool { - // match: (NEGshiftLL (MOVDconst [c]) [d]) - // result: (MOVDconst [-int64(uint64(c)<>uint64(d))]) - for { - d := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = -(c >> uint64(d)) - return true - } - return false -} -func rewriteValueARM64_OpARM64NEGshiftRL_0(v *Value) bool { - // match: (NEGshiftRL (MOVDconst [c]) [d]) - // result: (MOVDconst [-int64(uint64(c)>>uint64(d))]) - for { - d := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = -int64(uint64(c) >> uint64(d)) - return true - } - return false -} -func rewriteValueARM64_OpARM64NotEqual_0(v *Value) bool { - // match: (NotEqual (FlagEQ)) - // result: (MOVDconst [0]) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagEQ { - break - } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 - return true - } - // match: (NotEqual (FlagLT_ULT)) - // result: (MOVDconst [1]) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagLT_ULT { - break - } - v.reset(OpARM64MOVDconst) - v.AuxInt = 1 - return true - } - // match: (NotEqual (FlagLT_UGT)) - // result: (MOVDconst [1]) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagLT_UGT { - break - } - v.reset(OpARM64MOVDconst) - v.AuxInt = 1 - return true - } - // match: (NotEqual (FlagGT_ULT)) - // result: (MOVDconst [1]) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagGT_ULT { - break - } - v.reset(OpARM64MOVDconst) - v.AuxInt = 1 - return true - } - // match: (NotEqual (FlagGT_UGT)) - // result: (MOVDconst [1]) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64FlagGT_UGT { - break - } - v.reset(OpARM64MOVDconst) - v.AuxInt = 1 - return true - } - // match: (NotEqual (InvertFlags x)) - // result: (NotEqual x) - for { - v_0 := v.Args[0] - if v_0.Op != OpARM64InvertFlags { - break - } - x := v_0.Args[0] - v.reset(OpARM64NotEqual) - v.AddArg(x) - return true - } - return false -} -func rewriteValueARM64_OpARM64OR_0(v *Value) bool { - // match: (OR x (MOVDconst [c])) - // result: (ORconst [c] x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - v.reset(OpARM64ORconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (OR (MOVDconst [c]) x) - // result: (ORconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - v.reset(OpARM64ORconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (OR x x) - // result: x - for { - x := v.Args[1] - if x != v.Args[0] { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (OR x (MVN y)) - // result: (ORN x y) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MVN { - break - } - y := v_1.Args[0] - v.reset(OpARM64ORN) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (OR (MVN y) x) - // result: (ORN x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MVN { - break - } - y := v_0.Args[0] - v.reset(OpARM64ORN) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (OR x0 x1:(SLLconst [c] y)) - // cond: clobberIfDead(x1) - // result: (ORshiftLL x0 y [c]) - for { - _ = v.Args[1] - x0 := v.Args[0] - x1 := v.Args[1] - if x1.Op != OpARM64SLLconst { - break - } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { - break - } - v.reset(OpARM64ORshiftLL) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) - return true - } - // match: (OR x1:(SLLconst [c] y) x0) - // cond: clobberIfDead(x1) - // result: (ORshiftLL x0 y [c]) - for { - x0 := v.Args[1] - x1 := v.Args[0] - if x1.Op != OpARM64SLLconst { - break - } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { - break - } - v.reset(OpARM64ORshiftLL) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) - return true - } - // match: (OR x0 x1:(SRLconst [c] y)) - // cond: clobberIfDead(x1) - // result: (ORshiftRL x0 y [c]) - for { - _ = v.Args[1] - x0 := v.Args[0] - x1 := v.Args[1] - if x1.Op != OpARM64SRLconst { - break - } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { - break - } - v.reset(OpARM64ORshiftRL) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) - return true - } - // match: (OR x1:(SRLconst [c] y) x0) - // cond: clobberIfDead(x1) - // result: (ORshiftRL x0 y [c]) - for { - x0 := v.Args[1] - x1 := v.Args[0] - if x1.Op != OpARM64SRLconst { - break - } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { - break - } - v.reset(OpARM64ORshiftRL) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) - return true - } - // match: (OR x0 x1:(SRAconst [c] y)) - // cond: clobberIfDead(x1) - // result: (ORshiftRA x0 y [c]) - for { - _ = v.Args[1] - x0 := v.Args[0] - x1 := v.Args[1] - if x1.Op != OpARM64SRAconst { - break - } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { - break - } - v.reset(OpARM64ORshiftRA) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) - return true - } - return false -} -func rewriteValueARM64_OpARM64OR_10(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (OR x1:(SRAconst [c] y) x0) - // cond: clobberIfDead(x1) - // result: (ORshiftRA x0 y [c]) - for { - x0 := v.Args[1] - x1 := v.Args[0] - if x1.Op != OpARM64SRAconst { - break - } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { - break - } - v.reset(OpARM64ORshiftRA) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) - return true - } - // match: (OR (SLL x (ANDconst [63] y)) (CSEL0 {cc} (SRL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) - // cond: cc.(Op) == OpARM64LessThanU - // result: (ROR x (NEG y)) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64SLL { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpARM64ANDconst { - break - } - t := v_0_1.Type - if v_0_1.AuxInt != 63 { - break - } - y := v_0_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt64 { - break - } - cc := v_1.Aux - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpARM64SRL || v_1_0.Type != typ.UInt64 { - break - } - _ = v_1_0.Args[1] - if x != v_1_0.Args[0] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpARM64SUB || v_1_0_1.Type != t { - break - } - _ = v_1_0_1.Args[1] - v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 64 { - break - } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 63 || y != v_1_0_1_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpARM64SUB || v_1_1_0.Type != t { - break - } - _ = v_1_1_0.Args[1] - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 64 { - break - } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { - break - } - v.reset(OpARM64ROR) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpARM64NEG, t) - v0.AddArg(y) - v.AddArg(v0) - return true - } - // match: (OR (CSEL0 {cc} (SRL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y)))) (SLL x (ANDconst [63] y))) - // cond: cc.(Op) == OpARM64LessThanU - // result: (ROR x (NEG y)) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64CSEL0 || v_0.Type != typ.UInt64 { - break - } - cc := v_0.Aux - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpARM64SRL || v_0_0.Type != typ.UInt64 { - break - } - _ = v_0_0.Args[1] - x := v_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpARM64SUB { - break - } - t := v_0_0_1.Type - _ = v_0_0_1.Args[1] - v_0_0_1_0 := v_0_0_1.Args[0] - if v_0_0_1_0.Op != OpARM64MOVDconst || v_0_0_1_0.AuxInt != 64 { - break - } - v_0_0_1_1 := v_0_0_1.Args[1] - if v_0_0_1_1.Op != OpARM64ANDconst || v_0_0_1_1.Type != t || v_0_0_1_1.AuxInt != 63 { - break - } - y := v_0_0_1_1.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpARM64CMPconst || v_0_1.AuxInt != 64 { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpARM64SUB || v_0_1_0.Type != t { - break - } - _ = v_0_1_0.Args[1] - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpARM64MOVDconst || v_0_1_0_0.AuxInt != 64 { - break - } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpARM64ANDconst || v_0_1_0_1.Type != t || v_0_1_0_1.AuxInt != 63 || y != v_0_1_0_1.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpARM64SLL { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64ANDconst || v_1_1.Type != t || v_1_1.AuxInt != 63 || y != v_1_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { - break - } - v.reset(OpARM64ROR) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpARM64NEG, t) - v0.AddArg(y) - v.AddArg(v0) - return true - } - // match: (OR (SRL x (ANDconst [63] y)) (CSEL0 {cc} (SLL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) - // cond: cc.(Op) == OpARM64LessThanU - // result: (ROR x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64SRL || v_0.Type != typ.UInt64 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpARM64ANDconst { - break - } - t := v_0_1.Type - if v_0_1.AuxInt != 63 { - break - } - y := v_0_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt64 { - break - } - cc := v_1.Aux - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpARM64SLL { - break - } - _ = v_1_0.Args[1] - if x != v_1_0.Args[0] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpARM64SUB || v_1_0_1.Type != t { - break - } - _ = v_1_0_1.Args[1] - v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 64 { - break - } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 63 || y != v_1_0_1_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpARM64SUB || v_1_1_0.Type != t { - break - } - _ = v_1_1_0.Args[1] - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 64 { - break - } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { - break - } - v.reset(OpARM64ROR) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (OR (CSEL0 {cc} (SLL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y)))) (SRL x (ANDconst [63] y))) - // cond: cc.(Op) == OpARM64LessThanU - // result: (ROR x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64CSEL0 || v_0.Type != typ.UInt64 { - break - } - cc := v_0.Aux - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpARM64SLL { - break - } - _ = v_0_0.Args[1] - x := v_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpARM64SUB { - break - } - t := v_0_0_1.Type - _ = v_0_0_1.Args[1] - v_0_0_1_0 := v_0_0_1.Args[0] - if v_0_0_1_0.Op != OpARM64MOVDconst || v_0_0_1_0.AuxInt != 64 { - break - } - v_0_0_1_1 := v_0_0_1.Args[1] - if v_0_0_1_1.Op != OpARM64ANDconst || v_0_0_1_1.Type != t || v_0_0_1_1.AuxInt != 63 { - break - } - y := v_0_0_1_1.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpARM64CMPconst || v_0_1.AuxInt != 64 { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpARM64SUB || v_0_1_0.Type != t { - break - } - _ = v_0_1_0.Args[1] - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpARM64MOVDconst || v_0_1_0_0.AuxInt != 64 { - break - } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpARM64ANDconst || v_0_1_0_1.Type != t || v_0_1_0_1.AuxInt != 63 || y != v_0_1_0_1.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpARM64SRL || v_1.Type != typ.UInt64 { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64ANDconst || v_1_1.Type != t || v_1_1.AuxInt != 63 || y != v_1_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { - break - } - v.reset(OpARM64ROR) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (OR (SLL x (ANDconst [31] y)) (CSEL0 {cc} (SRL (MOVWUreg x) (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) - // cond: cc.(Op) == OpARM64LessThanU - // result: (RORW x (NEG y)) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64SLL { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpARM64ANDconst { - break - } - t := v_0_1.Type - if v_0_1.AuxInt != 31 { - break - } - y := v_0_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt32 { - break - } - cc := v_1.Aux - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpARM64SRL || v_1_0.Type != typ.UInt32 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpARM64MOVWUreg || x != v_1_0_0.Args[0] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpARM64SUB || v_1_0_1.Type != t { - break - } - _ = v_1_0_1.Args[1] - v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 32 { - break - } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 31 || y != v_1_0_1_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpARM64SUB || v_1_1_0.Type != t { - break - } - _ = v_1_1_0.Args[1] - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 32 { - break - } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { - break - } - v.reset(OpARM64RORW) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpARM64NEG, t) - v0.AddArg(y) - v.AddArg(v0) - return true - } - // match: (OR (CSEL0 {cc} (SRL (MOVWUreg x) (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y)))) (SLL x (ANDconst [31] y))) - // cond: cc.(Op) == OpARM64LessThanU - // result: (RORW x (NEG y)) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64CSEL0 || v_0.Type != typ.UInt32 { - break - } - cc := v_0.Aux - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpARM64SRL || v_0_0.Type != typ.UInt32 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpARM64MOVWUreg { - break - } - x := v_0_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpARM64SUB { - break - } - t := v_0_0_1.Type - _ = v_0_0_1.Args[1] - v_0_0_1_0 := v_0_0_1.Args[0] - if v_0_0_1_0.Op != OpARM64MOVDconst || v_0_0_1_0.AuxInt != 32 { - break - } - v_0_0_1_1 := v_0_0_1.Args[1] - if v_0_0_1_1.Op != OpARM64ANDconst || v_0_0_1_1.Type != t || v_0_0_1_1.AuxInt != 31 { - break - } - y := v_0_0_1_1.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpARM64CMPconst || v_0_1.AuxInt != 64 { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpARM64SUB || v_0_1_0.Type != t { - break - } - _ = v_0_1_0.Args[1] - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpARM64MOVDconst || v_0_1_0_0.AuxInt != 32 { - break - } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpARM64ANDconst || v_0_1_0_1.Type != t || v_0_1_0_1.AuxInt != 31 || y != v_0_1_0_1.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpARM64SLL { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64ANDconst || v_1_1.Type != t || v_1_1.AuxInt != 31 || y != v_1_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { - break - } - v.reset(OpARM64RORW) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpARM64NEG, t) - v0.AddArg(y) - v.AddArg(v0) - return true - } - // match: (OR (SRL (MOVWUreg x) (ANDconst [31] y)) (CSEL0 {cc} (SLL x (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) - // cond: cc.(Op) == OpARM64LessThanU - // result: (RORW x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64SRL || v_0.Type != typ.UInt32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpARM64MOVWUreg { - break - } - x := v_0_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpARM64ANDconst { - break - } - t := v_0_1.Type - if v_0_1.AuxInt != 31 { - break - } - y := v_0_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt32 { - break - } - cc := v_1.Aux - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpARM64SLL { - break - } - _ = v_1_0.Args[1] - if x != v_1_0.Args[0] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpARM64SUB || v_1_0_1.Type != t { - break - } - _ = v_1_0_1.Args[1] - v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 32 { - break - } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 31 || y != v_1_0_1_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpARM64SUB || v_1_1_0.Type != t { - break - } - _ = v_1_1_0.Args[1] - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 32 { - break - } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { - break - } - v.reset(OpARM64RORW) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (OR (CSEL0 {cc} (SLL x (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y)))) (SRL (MOVWUreg x) (ANDconst [31] y))) - // cond: cc.(Op) == OpARM64LessThanU - // result: (RORW x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64CSEL0 || v_0.Type != typ.UInt32 { - break - } - cc := v_0.Aux - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpARM64SLL { - break - } - _ = v_0_0.Args[1] - x := v_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpARM64SUB { - break - } - t := v_0_0_1.Type - _ = v_0_0_1.Args[1] - v_0_0_1_0 := v_0_0_1.Args[0] - if v_0_0_1_0.Op != OpARM64MOVDconst || v_0_0_1_0.AuxInt != 32 { - break - } - v_0_0_1_1 := v_0_0_1.Args[1] - if v_0_0_1_1.Op != OpARM64ANDconst || v_0_0_1_1.Type != t || v_0_0_1_1.AuxInt != 31 { - break - } - y := v_0_0_1_1.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpARM64CMPconst || v_0_1.AuxInt != 64 { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpARM64SUB || v_0_1_0.Type != t { - break - } - _ = v_0_1_0.Args[1] - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpARM64MOVDconst || v_0_1_0_0.AuxInt != 32 { - break - } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpARM64ANDconst || v_0_1_0_1.Type != t || v_0_1_0_1.AuxInt != 31 || y != v_0_1_0_1.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpARM64SRL || v_1.Type != typ.UInt32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpARM64MOVWUreg || x != v_1_0.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64ANDconst || v_1_1.Type != t || v_1_1.AuxInt != 31 || y != v_1_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { - break - } - v.reset(OpARM64RORW) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (OR (UBFIZ [bfc] x) (ANDconst [ac] y)) - // cond: ac == ^((1< o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUload [i3] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i2] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i1] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i0] {s} p mem))) - // cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3) (MOVWUload {s} (OffPtr [i0] p) mem) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - s0 := o1.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 24 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUload { - break - } - i3 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - y1 := o1.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - y2 := o0.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload { - break - } - i1 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] { - break - } - y3 := v.Args[1] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload { - break - } - i0 := x3.AuxInt - if x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] || !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3) - v0 := b.NewValue0(x3.Pos, OpARM64MOVWUload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.Aux = s - v1 := b.NewValue0(x3.Pos, OpOffPtr, p.Type) - v1.AuxInt = i0 - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR y3:(MOVDnop x3:(MOVBUload [i0] {s} p mem)) o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUload [i3] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i2] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i1] {s} p mem)))) - // cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3) (MOVWUload {s} (OffPtr [i0] p) mem) - for { - t := v.Type - _ = v.Args[1] - y3 := v.Args[0] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload { - break - } - i0 := x3.AuxInt - s := x3.Aux - mem := x3.Args[1] - p := x3.Args[0] - o0 := v.Args[1] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - s0 := o1.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 24 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUload { - break - } - i3 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] { - break - } - y1 := o1.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - y2 := o0.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload { - break - } - i1 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] || !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3) - v0 := b.NewValue0(x2.Pos, OpARM64MOVWUload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.Aux = s - v1 := b.NewValue0(x2.Pos, OpOffPtr, p.Type) - v1.AuxInt = i0 - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUload [3] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [2] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) y3:(MOVDnop x3:(MOVBUloadidx ptr0 idx0 mem))) - // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3) (MOVWUloadidx ptr0 idx0 mem) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - s0 := o1.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 24 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUload || x0.AuxInt != 3 { - break - } - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - y1 := o1.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 2 || x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - y2 := o0.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 1 || x2.Aux != s { - break - } - _ = x2.Args[1] - p1 := x2.Args[0] - if p1.Op != OpARM64ADD { - break - } - idx1 := p1.Args[1] - ptr1 := p1.Args[0] - if mem != x2.Args[1] { - break - } - y3 := v.Args[1] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUloadidx { - break - } - _ = x3.Args[2] - ptr0 := x3.Args[0] - idx0 := x3.Args[1] - if mem != x3.Args[2] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3) - v0 := b.NewValue0(x2.Pos, OpARM64MOVWUloadidx, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AddArg(ptr0) - v0.AddArg(idx0) - v0.AddArg(mem) - return true - } - // match: (OR o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUload [3] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [2] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [1] {s} p1:(ADD idx1 ptr1) mem))) y3:(MOVDnop x3:(MOVBUloadidx ptr0 idx0 mem))) - // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3) (MOVWUloadidx ptr0 idx0 mem) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - s0 := o1.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 24 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUload || x0.AuxInt != 3 { - break - } - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - y1 := o1.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 2 || x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - y2 := o0.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 1 || x2.Aux != s { - break - } - _ = x2.Args[1] - p1 := x2.Args[0] - if p1.Op != OpARM64ADD { - break - } - ptr1 := p1.Args[1] - idx1 := p1.Args[0] - if mem != x2.Args[1] { - break - } - y3 := v.Args[1] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUloadidx { - break - } - _ = x3.Args[2] - ptr0 := x3.Args[0] - idx0 := x3.Args[1] - if mem != x3.Args[2] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3) - v0 := b.NewValue0(x2.Pos, OpARM64MOVWUloadidx, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AddArg(ptr0) - v0.AddArg(idx0) - v0.AddArg(mem) - return true - } - // match: (OR y3:(MOVDnop x3:(MOVBUloadidx ptr0 idx0 mem)) o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUload [3] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [2] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem)))) - // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3) (MOVWUloadidx ptr0 idx0 mem) - for { - t := v.Type - _ = v.Args[1] - y3 := v.Args[0] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUloadidx { - break - } - mem := x3.Args[2] - ptr0 := x3.Args[0] - idx0 := x3.Args[1] - o0 := v.Args[1] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - s0 := o1.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 24 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUload || x0.AuxInt != 3 { - break - } - s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] - if mem != x0.Args[1] { - break - } - y1 := o1.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 2 || x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - y2 := o0.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 1 || x2.Aux != s { - break - } - _ = x2.Args[1] - p1 := x2.Args[0] - if p1.Op != OpARM64ADD { - break - } - idx1 := p1.Args[1] - ptr1 := p1.Args[0] - if mem != x2.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3) - v0 := b.NewValue0(x2.Pos, OpARM64MOVWUloadidx, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AddArg(ptr0) - v0.AddArg(idx0) - v0.AddArg(mem) - return true - } - // match: (OR y3:(MOVDnop x3:(MOVBUloadidx ptr0 idx0 mem)) o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUload [3] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [2] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [1] {s} p1:(ADD idx1 ptr1) mem)))) - // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3) (MOVWUloadidx ptr0 idx0 mem) - for { - t := v.Type - _ = v.Args[1] - y3 := v.Args[0] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUloadidx { - break - } - mem := x3.Args[2] - ptr0 := x3.Args[0] - idx0 := x3.Args[1] - o0 := v.Args[1] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - s0 := o1.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 24 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUload || x0.AuxInt != 3 { - break - } - s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] - if mem != x0.Args[1] { - break - } - y1 := o1.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 2 || x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - y2 := o0.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 1 || x2.Aux != s { - break - } - _ = x2.Args[1] - p1 := x2.Args[0] - if p1.Op != OpARM64ADD { - break - } - ptr1 := p1.Args[1] - idx1 := p1.Args[0] - if mem != x2.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3) - v0 := b.NewValue0(x2.Pos, OpARM64MOVWUloadidx, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AddArg(ptr0) - v0.AddArg(idx0) - v0.AddArg(mem) - return true - } - // match: (OR o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUloadidx ptr (ADDconst [3] idx) mem))) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [2] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) y3:(MOVDnop x3:(MOVBUloadidx ptr idx mem))) - // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3) (MOVWUloadidx ptr idx mem) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - s0 := o1.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 24 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUloadidx { - break - } - mem := x0.Args[2] - ptr := x0.Args[0] - x0_1 := x0.Args[1] - if x0_1.Op != OpARM64ADDconst || x0_1.AuxInt != 3 { - break - } - idx := x0_1.Args[0] - y1 := o1.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUloadidx { - break - } - _ = x1.Args[2] - if ptr != x1.Args[0] { - break - } - x1_1 := x1.Args[1] - if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 2 || idx != x1_1.Args[0] || mem != x1.Args[2] { - break - } - y2 := o0.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUloadidx { - break - } - _ = x2.Args[2] - if ptr != x2.Args[0] { - break - } - x2_1 := x2.Args[1] - if x2_1.Op != OpARM64ADDconst || x2_1.AuxInt != 1 || idx != x2_1.Args[0] || mem != x2.Args[2] { - break - } - y3 := v.Args[1] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUloadidx { - break - } - _ = x3.Args[2] - if ptr != x3.Args[0] || idx != x3.Args[1] || mem != x3.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3) - v0 := b.NewValue0(v.Pos, OpARM64MOVWUloadidx, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AddArg(ptr) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - return false -} -func rewriteValueARM64_OpARM64OR_30(v *Value) bool { - b := v.Block - // match: (OR y3:(MOVDnop x3:(MOVBUloadidx ptr idx mem)) o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUloadidx ptr (ADDconst [3] idx) mem))) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [2] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [1] idx) mem)))) - // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3) (MOVWUloadidx ptr idx mem) - for { - t := v.Type - _ = v.Args[1] - y3 := v.Args[0] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUloadidx { - break - } - mem := x3.Args[2] - ptr := x3.Args[0] - idx := x3.Args[1] - o0 := v.Args[1] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - s0 := o1.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 24 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUloadidx { - break - } - _ = x0.Args[2] - if ptr != x0.Args[0] { - break - } - x0_1 := x0.Args[1] - if x0_1.Op != OpARM64ADDconst || x0_1.AuxInt != 3 || idx != x0_1.Args[0] || mem != x0.Args[2] { - break - } - y1 := o1.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUloadidx { - break - } - _ = x1.Args[2] - if ptr != x1.Args[0] { - break - } - x1_1 := x1.Args[1] - if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 2 || idx != x1_1.Args[0] || mem != x1.Args[2] { - break - } - y2 := o0.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUloadidx { - break - } - _ = x2.Args[2] - if ptr != x2.Args[0] { - break - } - x2_1 := x2.Args[1] - if x2_1.Op != OpARM64ADDconst || x2_1.AuxInt != 1 || idx != x2_1.Args[0] || mem != x2.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3) - v0 := b.NewValue0(v.Pos, OpARM64MOVWUloadidx, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AddArg(ptr) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUload [i7] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i6] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i5] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i4] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [i3] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [i2] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [i1] {s} p mem))) y7:(MOVDnop x7:(MOVBUload [i0] {s} p mem))) - // cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (MOVDload {s} (OffPtr [i0] p) mem) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 24 { - break - } - _ = o2.Args[1] - o3 := o2.Args[0] - if o3.Op != OpARM64ORshiftLL || o3.AuxInt != 32 { - break - } - _ = o3.Args[1] - o4 := o3.Args[0] - if o4.Op != OpARM64ORshiftLL || o4.AuxInt != 40 { - break - } - _ = o4.Args[1] - o5 := o4.Args[0] - if o5.Op != OpARM64ORshiftLL || o5.AuxInt != 48 { - break - } - _ = o5.Args[1] - s0 := o5.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 56 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUload { - break - } - i7 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - y1 := o5.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload { - break - } - i6 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - y2 := o4.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload { - break - } - i5 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] { - break - } - y3 := o3.Args[1] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload { - break - } - i4 := x3.AuxInt - if x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { - break - } - y4 := o2.Args[1] - if y4.Op != OpARM64MOVDnop { - break - } - x4 := y4.Args[0] - if x4.Op != OpARM64MOVBUload { - break - } - i3 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - y5 := o1.Args[1] - if y5.Op != OpARM64MOVDnop { - break - } - x5 := y5.Args[0] - if x5.Op != OpARM64MOVBUload { - break - } - i2 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - y6 := o0.Args[1] - if y6.Op != OpARM64MOVDnop { - break - } - x6 := y6.Args[0] - if x6.Op != OpARM64MOVBUload { - break - } - i1 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] { - break - } - y7 := v.Args[1] - if y7.Op != OpARM64MOVDnop { - break - } - x7 := y7.Args[0] - if x7.Op != OpARM64MOVBUload { - break - } - i0 := x7.AuxInt - if x7.Aux != s { - break - } - _ = x7.Args[1] - if p != x7.Args[0] || mem != x7.Args[1] || !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x7.Pos, OpARM64MOVDload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.Aux = s - v1 := b.NewValue0(x7.Pos, OpOffPtr, p.Type) - v1.AuxInt = i0 - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR y7:(MOVDnop x7:(MOVBUload [i0] {s} p mem)) o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUload [i7] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i6] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i5] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i4] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [i3] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [i2] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [i1] {s} p mem)))) - // cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (MOVDload {s} (OffPtr [i0] p) mem) - for { - t := v.Type - _ = v.Args[1] - y7 := v.Args[0] - if y7.Op != OpARM64MOVDnop { - break - } - x7 := y7.Args[0] - if x7.Op != OpARM64MOVBUload { - break - } - i0 := x7.AuxInt - s := x7.Aux - mem := x7.Args[1] - p := x7.Args[0] - o0 := v.Args[1] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 24 { - break - } - _ = o2.Args[1] - o3 := o2.Args[0] - if o3.Op != OpARM64ORshiftLL || o3.AuxInt != 32 { - break - } - _ = o3.Args[1] - o4 := o3.Args[0] - if o4.Op != OpARM64ORshiftLL || o4.AuxInt != 40 { - break - } - _ = o4.Args[1] - o5 := o4.Args[0] - if o5.Op != OpARM64ORshiftLL || o5.AuxInt != 48 { - break - } - _ = o5.Args[1] - s0 := o5.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 56 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUload { - break - } - i7 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] { - break - } - y1 := o5.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload { - break - } - i6 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - y2 := o4.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload { - break - } - i5 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] { - break - } - y3 := o3.Args[1] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload { - break - } - i4 := x3.AuxInt - if x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { - break - } - y4 := o2.Args[1] - if y4.Op != OpARM64MOVDnop { - break - } - x4 := y4.Args[0] - if x4.Op != OpARM64MOVBUload { - break - } - i3 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - y5 := o1.Args[1] - if y5.Op != OpARM64MOVDnop { - break - } - x5 := y5.Args[0] - if x5.Op != OpARM64MOVBUload { - break - } - i2 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - y6 := o0.Args[1] - if y6.Op != OpARM64MOVDnop { - break - } - x6 := y6.Args[0] - if x6.Op != OpARM64MOVBUload { - break - } - i1 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] || !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x6.Pos, OpARM64MOVDload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.Aux = s - v1 := b.NewValue0(x6.Pos, OpOffPtr, p.Type) - v1.AuxInt = i0 - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUload [7] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [6] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [5] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [4] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [3] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [2] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) y7:(MOVDnop x7:(MOVBUloadidx ptr0 idx0 mem))) - // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (MOVDloadidx ptr0 idx0 mem) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 24 { - break - } - _ = o2.Args[1] - o3 := o2.Args[0] - if o3.Op != OpARM64ORshiftLL || o3.AuxInt != 32 { - break - } - _ = o3.Args[1] - o4 := o3.Args[0] - if o4.Op != OpARM64ORshiftLL || o4.AuxInt != 40 { - break - } - _ = o4.Args[1] - o5 := o4.Args[0] - if o5.Op != OpARM64ORshiftLL || o5.AuxInt != 48 { - break - } - _ = o5.Args[1] - s0 := o5.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 56 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUload || x0.AuxInt != 7 { - break - } - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - y1 := o5.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 6 || x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - y2 := o4.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 5 || x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] { - break - } - y3 := o3.Args[1] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload || x3.AuxInt != 4 || x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { - break - } - y4 := o2.Args[1] - if y4.Op != OpARM64MOVDnop { - break - } - x4 := y4.Args[0] - if x4.Op != OpARM64MOVBUload || x4.AuxInt != 3 || x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - y5 := o1.Args[1] - if y5.Op != OpARM64MOVDnop { - break - } - x5 := y5.Args[0] - if x5.Op != OpARM64MOVBUload || x5.AuxInt != 2 || x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - y6 := o0.Args[1] - if y6.Op != OpARM64MOVDnop { - break - } - x6 := y6.Args[0] - if x6.Op != OpARM64MOVBUload || x6.AuxInt != 1 || x6.Aux != s { - break - } - _ = x6.Args[1] - p1 := x6.Args[0] - if p1.Op != OpARM64ADD { - break - } - idx1 := p1.Args[1] - ptr1 := p1.Args[0] - if mem != x6.Args[1] { - break - } - y7 := v.Args[1] - if y7.Op != OpARM64MOVDnop { - break - } - x7 := y7.Args[0] - if x7.Op != OpARM64MOVBUloadidx { - break - } - _ = x7.Args[2] - ptr0 := x7.Args[0] - idx0 := x7.Args[1] - if mem != x7.Args[2] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x6.Pos, OpARM64MOVDloadidx, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AddArg(ptr0) - v0.AddArg(idx0) - v0.AddArg(mem) - return true - } - // match: (OR o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUload [7] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [6] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [5] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [4] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [3] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [2] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [1] {s} p1:(ADD idx1 ptr1) mem))) y7:(MOVDnop x7:(MOVBUloadidx ptr0 idx0 mem))) - // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (MOVDloadidx ptr0 idx0 mem) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 24 { - break - } - _ = o2.Args[1] - o3 := o2.Args[0] - if o3.Op != OpARM64ORshiftLL || o3.AuxInt != 32 { - break - } - _ = o3.Args[1] - o4 := o3.Args[0] - if o4.Op != OpARM64ORshiftLL || o4.AuxInt != 40 { - break - } - _ = o4.Args[1] - o5 := o4.Args[0] - if o5.Op != OpARM64ORshiftLL || o5.AuxInt != 48 { - break - } - _ = o5.Args[1] - s0 := o5.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 56 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUload || x0.AuxInt != 7 { - break - } - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - y1 := o5.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 6 || x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - y2 := o4.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 5 || x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] { - break - } - y3 := o3.Args[1] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload || x3.AuxInt != 4 || x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { - break - } - y4 := o2.Args[1] - if y4.Op != OpARM64MOVDnop { - break - } - x4 := y4.Args[0] - if x4.Op != OpARM64MOVBUload || x4.AuxInt != 3 || x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - y5 := o1.Args[1] - if y5.Op != OpARM64MOVDnop { - break - } - x5 := y5.Args[0] - if x5.Op != OpARM64MOVBUload || x5.AuxInt != 2 || x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - y6 := o0.Args[1] - if y6.Op != OpARM64MOVDnop { - break - } - x6 := y6.Args[0] - if x6.Op != OpARM64MOVBUload || x6.AuxInt != 1 || x6.Aux != s { - break - } - _ = x6.Args[1] - p1 := x6.Args[0] - if p1.Op != OpARM64ADD { - break - } - ptr1 := p1.Args[1] - idx1 := p1.Args[0] - if mem != x6.Args[1] { - break - } - y7 := v.Args[1] - if y7.Op != OpARM64MOVDnop { - break - } - x7 := y7.Args[0] - if x7.Op != OpARM64MOVBUloadidx { - break - } - _ = x7.Args[2] - ptr0 := x7.Args[0] - idx0 := x7.Args[1] - if mem != x7.Args[2] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x6.Pos, OpARM64MOVDloadidx, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AddArg(ptr0) - v0.AddArg(idx0) - v0.AddArg(mem) - return true - } - // match: (OR y7:(MOVDnop x7:(MOVBUloadidx ptr0 idx0 mem)) o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUload [7] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [6] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [5] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [4] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [3] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [2] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem)))) - // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (MOVDloadidx ptr0 idx0 mem) - for { - t := v.Type - _ = v.Args[1] - y7 := v.Args[0] - if y7.Op != OpARM64MOVDnop { - break - } - x7 := y7.Args[0] - if x7.Op != OpARM64MOVBUloadidx { - break - } - mem := x7.Args[2] - ptr0 := x7.Args[0] - idx0 := x7.Args[1] - o0 := v.Args[1] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 24 { - break - } - _ = o2.Args[1] - o3 := o2.Args[0] - if o3.Op != OpARM64ORshiftLL || o3.AuxInt != 32 { - break - } - _ = o3.Args[1] - o4 := o3.Args[0] - if o4.Op != OpARM64ORshiftLL || o4.AuxInt != 40 { - break - } - _ = o4.Args[1] - o5 := o4.Args[0] - if o5.Op != OpARM64ORshiftLL || o5.AuxInt != 48 { - break - } - _ = o5.Args[1] - s0 := o5.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 56 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUload || x0.AuxInt != 7 { - break - } - s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] - if mem != x0.Args[1] { - break - } - y1 := o5.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 6 || x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - y2 := o4.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 5 || x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] { - break - } - y3 := o3.Args[1] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload || x3.AuxInt != 4 || x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { - break - } - y4 := o2.Args[1] - if y4.Op != OpARM64MOVDnop { - break - } - x4 := y4.Args[0] - if x4.Op != OpARM64MOVBUload || x4.AuxInt != 3 || x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - y5 := o1.Args[1] - if y5.Op != OpARM64MOVDnop { - break - } - x5 := y5.Args[0] - if x5.Op != OpARM64MOVBUload || x5.AuxInt != 2 || x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - y6 := o0.Args[1] - if y6.Op != OpARM64MOVDnop { - break - } - x6 := y6.Args[0] - if x6.Op != OpARM64MOVBUload || x6.AuxInt != 1 || x6.Aux != s { - break - } - _ = x6.Args[1] - p1 := x6.Args[0] - if p1.Op != OpARM64ADD { - break - } - idx1 := p1.Args[1] - ptr1 := p1.Args[0] - if mem != x6.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x6.Pos, OpARM64MOVDloadidx, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AddArg(ptr0) - v0.AddArg(idx0) - v0.AddArg(mem) - return true - } - // match: (OR y7:(MOVDnop x7:(MOVBUloadidx ptr0 idx0 mem)) o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUload [7] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [6] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [5] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [4] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [3] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [2] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [1] {s} p1:(ADD idx1 ptr1) mem)))) - // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (MOVDloadidx ptr0 idx0 mem) - for { - t := v.Type - _ = v.Args[1] - y7 := v.Args[0] - if y7.Op != OpARM64MOVDnop { - break - } - x7 := y7.Args[0] - if x7.Op != OpARM64MOVBUloadidx { - break - } - mem := x7.Args[2] - ptr0 := x7.Args[0] - idx0 := x7.Args[1] - o0 := v.Args[1] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 24 { - break - } - _ = o2.Args[1] - o3 := o2.Args[0] - if o3.Op != OpARM64ORshiftLL || o3.AuxInt != 32 { - break - } - _ = o3.Args[1] - o4 := o3.Args[0] - if o4.Op != OpARM64ORshiftLL || o4.AuxInt != 40 { - break - } - _ = o4.Args[1] - o5 := o4.Args[0] - if o5.Op != OpARM64ORshiftLL || o5.AuxInt != 48 { - break - } - _ = o5.Args[1] - s0 := o5.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 56 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUload || x0.AuxInt != 7 { - break - } - s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] - if mem != x0.Args[1] { - break - } - y1 := o5.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 6 || x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - y2 := o4.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 5 || x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] { - break - } - y3 := o3.Args[1] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload || x3.AuxInt != 4 || x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { - break - } - y4 := o2.Args[1] - if y4.Op != OpARM64MOVDnop { - break - } - x4 := y4.Args[0] - if x4.Op != OpARM64MOVBUload || x4.AuxInt != 3 || x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - y5 := o1.Args[1] - if y5.Op != OpARM64MOVDnop { - break - } - x5 := y5.Args[0] - if x5.Op != OpARM64MOVBUload || x5.AuxInt != 2 || x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - y6 := o0.Args[1] - if y6.Op != OpARM64MOVDnop { - break - } - x6 := y6.Args[0] - if x6.Op != OpARM64MOVBUload || x6.AuxInt != 1 || x6.Aux != s { - break - } - _ = x6.Args[1] - p1 := x6.Args[0] - if p1.Op != OpARM64ADD { - break - } - ptr1 := p1.Args[1] - idx1 := p1.Args[0] - if mem != x6.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x6.Pos, OpARM64MOVDloadidx, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AddArg(ptr0) - v0.AddArg(idx0) - v0.AddArg(mem) - return true - } - // match: (OR o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUloadidx ptr (ADDconst [7] idx) mem))) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [6] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [5] idx) mem))) y3:(MOVDnop x3:(MOVBUloadidx ptr (ADDconst [4] idx) mem))) y4:(MOVDnop x4:(MOVBUloadidx ptr (ADDconst [3] idx) mem))) y5:(MOVDnop x5:(MOVBUloadidx ptr (ADDconst [2] idx) mem))) y6:(MOVDnop x6:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) y7:(MOVDnop x7:(MOVBUloadidx ptr idx mem))) - // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (MOVDloadidx ptr idx mem) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 24 { - break - } - _ = o2.Args[1] - o3 := o2.Args[0] - if o3.Op != OpARM64ORshiftLL || o3.AuxInt != 32 { - break - } - _ = o3.Args[1] - o4 := o3.Args[0] - if o4.Op != OpARM64ORshiftLL || o4.AuxInt != 40 { - break - } - _ = o4.Args[1] - o5 := o4.Args[0] - if o5.Op != OpARM64ORshiftLL || o5.AuxInt != 48 { - break - } - _ = o5.Args[1] - s0 := o5.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 56 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUloadidx { - break - } - mem := x0.Args[2] - ptr := x0.Args[0] - x0_1 := x0.Args[1] - if x0_1.Op != OpARM64ADDconst || x0_1.AuxInt != 7 { - break - } - idx := x0_1.Args[0] - y1 := o5.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUloadidx { - break - } - _ = x1.Args[2] - if ptr != x1.Args[0] { - break - } - x1_1 := x1.Args[1] - if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 6 || idx != x1_1.Args[0] || mem != x1.Args[2] { - break - } - y2 := o4.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUloadidx { - break - } - _ = x2.Args[2] - if ptr != x2.Args[0] { - break - } - x2_1 := x2.Args[1] - if x2_1.Op != OpARM64ADDconst || x2_1.AuxInt != 5 || idx != x2_1.Args[0] || mem != x2.Args[2] { - break - } - y3 := o3.Args[1] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUloadidx { - break - } - _ = x3.Args[2] - if ptr != x3.Args[0] { - break - } - x3_1 := x3.Args[1] - if x3_1.Op != OpARM64ADDconst || x3_1.AuxInt != 4 || idx != x3_1.Args[0] || mem != x3.Args[2] { - break - } - y4 := o2.Args[1] - if y4.Op != OpARM64MOVDnop { - break - } - x4 := y4.Args[0] - if x4.Op != OpARM64MOVBUloadidx { - break - } - _ = x4.Args[2] - if ptr != x4.Args[0] { - break - } - x4_1 := x4.Args[1] - if x4_1.Op != OpARM64ADDconst || x4_1.AuxInt != 3 || idx != x4_1.Args[0] || mem != x4.Args[2] { - break - } - y5 := o1.Args[1] - if y5.Op != OpARM64MOVDnop { - break - } - x5 := y5.Args[0] - if x5.Op != OpARM64MOVBUloadidx { - break - } - _ = x5.Args[2] - if ptr != x5.Args[0] { - break - } - x5_1 := x5.Args[1] - if x5_1.Op != OpARM64ADDconst || x5_1.AuxInt != 2 || idx != x5_1.Args[0] || mem != x5.Args[2] { - break - } - y6 := o0.Args[1] - if y6.Op != OpARM64MOVDnop { - break - } - x6 := y6.Args[0] - if x6.Op != OpARM64MOVBUloadidx { - break - } - _ = x6.Args[2] - if ptr != x6.Args[0] { - break - } - x6_1 := x6.Args[1] - if x6_1.Op != OpARM64ADDconst || x6_1.AuxInt != 1 || idx != x6_1.Args[0] || mem != x6.Args[2] { - break - } - y7 := v.Args[1] - if y7.Op != OpARM64MOVDnop { - break - } - x7 := y7.Args[0] - if x7.Op != OpARM64MOVBUloadidx { - break - } - _ = x7.Args[2] - if ptr != x7.Args[0] || idx != x7.Args[1] || mem != x7.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) - v0 := b.NewValue0(v.Pos, OpARM64MOVDloadidx, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AddArg(ptr) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR y7:(MOVDnop x7:(MOVBUloadidx ptr idx mem)) o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUloadidx ptr (ADDconst [7] idx) mem))) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [6] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [5] idx) mem))) y3:(MOVDnop x3:(MOVBUloadidx ptr (ADDconst [4] idx) mem))) y4:(MOVDnop x4:(MOVBUloadidx ptr (ADDconst [3] idx) mem))) y5:(MOVDnop x5:(MOVBUloadidx ptr (ADDconst [2] idx) mem))) y6:(MOVDnop x6:(MOVBUloadidx ptr (ADDconst [1] idx) mem)))) - // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (MOVDloadidx ptr idx mem) - for { - t := v.Type - _ = v.Args[1] - y7 := v.Args[0] - if y7.Op != OpARM64MOVDnop { - break - } - x7 := y7.Args[0] - if x7.Op != OpARM64MOVBUloadidx { - break - } - mem := x7.Args[2] - ptr := x7.Args[0] - idx := x7.Args[1] - o0 := v.Args[1] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 24 { - break - } - _ = o2.Args[1] - o3 := o2.Args[0] - if o3.Op != OpARM64ORshiftLL || o3.AuxInt != 32 { - break - } - _ = o3.Args[1] - o4 := o3.Args[0] - if o4.Op != OpARM64ORshiftLL || o4.AuxInt != 40 { - break - } - _ = o4.Args[1] - o5 := o4.Args[0] - if o5.Op != OpARM64ORshiftLL || o5.AuxInt != 48 { - break - } - _ = o5.Args[1] - s0 := o5.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 56 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUloadidx { - break - } - _ = x0.Args[2] - if ptr != x0.Args[0] { - break - } - x0_1 := x0.Args[1] - if x0_1.Op != OpARM64ADDconst || x0_1.AuxInt != 7 || idx != x0_1.Args[0] || mem != x0.Args[2] { - break - } - y1 := o5.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUloadidx { - break - } - _ = x1.Args[2] - if ptr != x1.Args[0] { - break - } - x1_1 := x1.Args[1] - if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 6 || idx != x1_1.Args[0] || mem != x1.Args[2] { - break - } - y2 := o4.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUloadidx { - break - } - _ = x2.Args[2] - if ptr != x2.Args[0] { - break - } - x2_1 := x2.Args[1] - if x2_1.Op != OpARM64ADDconst || x2_1.AuxInt != 5 || idx != x2_1.Args[0] || mem != x2.Args[2] { - break - } - y3 := o3.Args[1] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUloadidx { - break - } - _ = x3.Args[2] - if ptr != x3.Args[0] { - break - } - x3_1 := x3.Args[1] - if x3_1.Op != OpARM64ADDconst || x3_1.AuxInt != 4 || idx != x3_1.Args[0] || mem != x3.Args[2] { - break - } - y4 := o2.Args[1] - if y4.Op != OpARM64MOVDnop { - break - } - x4 := y4.Args[0] - if x4.Op != OpARM64MOVBUloadidx { - break - } - _ = x4.Args[2] - if ptr != x4.Args[0] { - break - } - x4_1 := x4.Args[1] - if x4_1.Op != OpARM64ADDconst || x4_1.AuxInt != 3 || idx != x4_1.Args[0] || mem != x4.Args[2] { - break - } - y5 := o1.Args[1] - if y5.Op != OpARM64MOVDnop { - break - } - x5 := y5.Args[0] - if x5.Op != OpARM64MOVBUloadidx { - break - } - _ = x5.Args[2] - if ptr != x5.Args[0] { - break - } - x5_1 := x5.Args[1] - if x5_1.Op != OpARM64ADDconst || x5_1.AuxInt != 2 || idx != x5_1.Args[0] || mem != x5.Args[2] { - break - } - y6 := o0.Args[1] - if y6.Op != OpARM64MOVDnop { - break - } - x6 := y6.Args[0] - if x6.Op != OpARM64MOVBUloadidx { - break - } - _ = x6.Args[2] - if ptr != x6.Args[0] { - break - } - x6_1 := x6.Args[1] - if x6_1.Op != OpARM64ADDconst || x6_1.AuxInt != 1 || idx != x6_1.Args[0] || mem != x6.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) - v0 := b.NewValue0(v.Pos, OpARM64MOVDloadidx, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AddArg(ptr) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUload [i0] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i1] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i3] {s} p mem))) - // cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3) (REVW (MOVWUload {s} (OffPtr [i0] p) mem)) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - s0 := o1.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 24 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - y1 := o1.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - y2 := o0.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload { - break - } - i2 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] { - break - } - y3 := v.Args[1] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload { - break - } - i3 := x3.AuxInt - if x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] || !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3) - v0 := b.NewValue0(x3.Pos, OpARM64REVW, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x3.Pos, OpARM64MOVWUload, t) - v1.Aux = s - v2 := b.NewValue0(x3.Pos, OpOffPtr, p.Type) - v2.AuxInt = i0 - v2.AddArg(p) - v1.AddArg(v2) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - return false -} -func rewriteValueARM64_OpARM64OR_40(v *Value) bool { - b := v.Block - // match: (OR y3:(MOVDnop x3:(MOVBUload [i3] {s} p mem)) o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUload [i0] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i1] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i2] {s} p mem)))) - // cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3) (REVW (MOVWUload {s} (OffPtr [i0] p) mem)) - for { - t := v.Type - _ = v.Args[1] - y3 := v.Args[0] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload { - break - } - i3 := x3.AuxInt - s := x3.Aux - mem := x3.Args[1] - p := x3.Args[0] - o0 := v.Args[1] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - s0 := o1.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 24 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] { - break - } - y1 := o1.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - y2 := o0.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload { - break - } - i2 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] || !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3) - v0 := b.NewValue0(x2.Pos, OpARM64REVW, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x2.Pos, OpARM64MOVWUload, t) - v1.Aux = s - v2 := b.NewValue0(x2.Pos, OpOffPtr, p.Type) - v2.AuxInt = i0 - v2.AddArg(p) - v1.AddArg(v2) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUloadidx ptr0 idx0 mem))) y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) y2:(MOVDnop x2:(MOVBUload [2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [3] {s} p mem))) - // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3) (REVW (MOVWUloadidx ptr0 idx0 mem)) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - s0 := o1.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 24 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUloadidx { - break - } - mem := x0.Args[2] - ptr0 := x0.Args[0] - idx0 := x0.Args[1] - y1 := o1.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 1 { - break - } - s := x1.Aux - _ = x1.Args[1] - p1 := x1.Args[0] - if p1.Op != OpARM64ADD { - break - } - idx1 := p1.Args[1] - ptr1 := p1.Args[0] - if mem != x1.Args[1] { - break - } - y2 := o0.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 2 || x2.Aux != s { - break - } - _ = x2.Args[1] - p := x2.Args[0] - if mem != x2.Args[1] { - break - } - y3 := v.Args[1] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload || x3.AuxInt != 3 || x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3) - v0 := b.NewValue0(x3.Pos, OpARM64REVW, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x3.Pos, OpARM64MOVWUloadidx, t) - v1.AddArg(ptr0) - v1.AddArg(idx0) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUloadidx ptr0 idx0 mem))) y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD idx1 ptr1) mem))) y2:(MOVDnop x2:(MOVBUload [2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [3] {s} p mem))) - // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3) (REVW (MOVWUloadidx ptr0 idx0 mem)) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - s0 := o1.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 24 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUloadidx { - break - } - mem := x0.Args[2] - ptr0 := x0.Args[0] - idx0 := x0.Args[1] - y1 := o1.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 1 { - break - } - s := x1.Aux - _ = x1.Args[1] - p1 := x1.Args[0] - if p1.Op != OpARM64ADD { - break - } - ptr1 := p1.Args[1] - idx1 := p1.Args[0] - if mem != x1.Args[1] { - break - } - y2 := o0.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 2 || x2.Aux != s { - break - } - _ = x2.Args[1] - p := x2.Args[0] - if mem != x2.Args[1] { - break - } - y3 := v.Args[1] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload || x3.AuxInt != 3 || x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3) - v0 := b.NewValue0(x3.Pos, OpARM64REVW, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x3.Pos, OpARM64MOVWUloadidx, t) - v1.AddArg(ptr0) - v1.AddArg(idx0) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR y3:(MOVDnop x3:(MOVBUload [3] {s} p mem)) o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUloadidx ptr0 idx0 mem))) y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) y2:(MOVDnop x2:(MOVBUload [2] {s} p mem)))) - // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3) (REVW (MOVWUloadidx ptr0 idx0 mem)) - for { - t := v.Type - _ = v.Args[1] - y3 := v.Args[0] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload || x3.AuxInt != 3 { - break - } - s := x3.Aux - mem := x3.Args[1] - p := x3.Args[0] - o0 := v.Args[1] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - s0 := o1.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 24 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUloadidx { - break - } - _ = x0.Args[2] - ptr0 := x0.Args[0] - idx0 := x0.Args[1] - if mem != x0.Args[2] { - break - } - y1 := o1.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 1 || x1.Aux != s { - break - } - _ = x1.Args[1] - p1 := x1.Args[0] - if p1.Op != OpARM64ADD { - break - } - idx1 := p1.Args[1] - ptr1 := p1.Args[0] - if mem != x1.Args[1] { - break - } - y2 := o0.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 2 || x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3) - v0 := b.NewValue0(x2.Pos, OpARM64REVW, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x2.Pos, OpARM64MOVWUloadidx, t) - v1.AddArg(ptr0) - v1.AddArg(idx0) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR y3:(MOVDnop x3:(MOVBUload [3] {s} p mem)) o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUloadidx ptr0 idx0 mem))) y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD idx1 ptr1) mem))) y2:(MOVDnop x2:(MOVBUload [2] {s} p mem)))) - // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3) (REVW (MOVWUloadidx ptr0 idx0 mem)) - for { - t := v.Type - _ = v.Args[1] - y3 := v.Args[0] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload || x3.AuxInt != 3 { - break - } - s := x3.Aux - mem := x3.Args[1] - p := x3.Args[0] - o0 := v.Args[1] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - s0 := o1.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 24 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUloadidx { - break - } - _ = x0.Args[2] - ptr0 := x0.Args[0] - idx0 := x0.Args[1] - if mem != x0.Args[2] { - break - } - y1 := o1.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 1 || x1.Aux != s { - break - } - _ = x1.Args[1] - p1 := x1.Args[0] - if p1.Op != OpARM64ADD { - break - } - ptr1 := p1.Args[1] - idx1 := p1.Args[0] - if mem != x1.Args[1] { - break - } - y2 := o0.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 2 || x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3) - v0 := b.NewValue0(x2.Pos, OpARM64REVW, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x2.Pos, OpARM64MOVWUloadidx, t) - v1.AddArg(ptr0) - v1.AddArg(idx0) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUloadidx ptr idx mem))) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [2] idx) mem))) y3:(MOVDnop x3:(MOVBUloadidx ptr (ADDconst [3] idx) mem))) - // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3) (REVW (MOVWUloadidx ptr idx mem)) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - s0 := o1.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 24 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUloadidx { - break - } - mem := x0.Args[2] - ptr := x0.Args[0] - idx := x0.Args[1] - y1 := o1.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUloadidx { - break - } - _ = x1.Args[2] - if ptr != x1.Args[0] { - break - } - x1_1 := x1.Args[1] - if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 1 || idx != x1_1.Args[0] || mem != x1.Args[2] { - break - } - y2 := o0.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUloadidx { - break - } - _ = x2.Args[2] - if ptr != x2.Args[0] { - break - } - x2_1 := x2.Args[1] - if x2_1.Op != OpARM64ADDconst || x2_1.AuxInt != 2 || idx != x2_1.Args[0] || mem != x2.Args[2] { - break - } - y3 := v.Args[1] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUloadidx { - break - } - _ = x3.Args[2] - if ptr != x3.Args[0] { - break - } - x3_1 := x3.Args[1] - if x3_1.Op != OpARM64ADDconst || x3_1.AuxInt != 3 || idx != x3_1.Args[0] || mem != x3.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3) - v0 := b.NewValue0(v.Pos, OpARM64REVW, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpARM64MOVWUloadidx, t) - v1.AddArg(ptr) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR y3:(MOVDnop x3:(MOVBUloadidx ptr (ADDconst [3] idx) mem)) o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUloadidx ptr idx mem))) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [2] idx) mem)))) - // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3) (REVW (MOVWUloadidx ptr idx mem)) - for { - t := v.Type - _ = v.Args[1] - y3 := v.Args[0] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUloadidx { - break - } - mem := x3.Args[2] - ptr := x3.Args[0] - x3_1 := x3.Args[1] - if x3_1.Op != OpARM64ADDconst || x3_1.AuxInt != 3 { - break - } - idx := x3_1.Args[0] - o0 := v.Args[1] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - s0 := o1.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 24 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUloadidx { - break - } - _ = x0.Args[2] - if ptr != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] { - break - } - y1 := o1.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUloadidx { - break - } - _ = x1.Args[2] - if ptr != x1.Args[0] { - break - } - x1_1 := x1.Args[1] - if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 1 || idx != x1_1.Args[0] || mem != x1.Args[2] { - break - } - y2 := o0.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUloadidx { - break - } - _ = x2.Args[2] - if ptr != x2.Args[0] { - break - } - x2_1 := x2.Args[1] - if x2_1.Op != OpARM64ADDconst || x2_1.AuxInt != 2 || idx != x2_1.Args[0] || mem != x2.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3) - v0 := b.NewValue0(v.Pos, OpARM64REVW, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpARM64MOVWUloadidx, t) - v1.AddArg(ptr) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUload [i0] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i1] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i3] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [i4] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [i5] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [i6] {s} p mem))) y7:(MOVDnop x7:(MOVBUload [i7] {s} p mem))) - // cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV (MOVDload {s} (OffPtr [i0] p) mem)) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 24 { - break - } - _ = o2.Args[1] - o3 := o2.Args[0] - if o3.Op != OpARM64ORshiftLL || o3.AuxInt != 32 { - break - } - _ = o3.Args[1] - o4 := o3.Args[0] - if o4.Op != OpARM64ORshiftLL || o4.AuxInt != 40 { - break - } - _ = o4.Args[1] - o5 := o4.Args[0] - if o5.Op != OpARM64ORshiftLL || o5.AuxInt != 48 { - break - } - _ = o5.Args[1] - s0 := o5.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 56 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - y1 := o5.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - y2 := o4.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload { - break - } - i2 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] { - break - } - y3 := o3.Args[1] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload { - break - } - i3 := x3.AuxInt - if x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { - break - } - y4 := o2.Args[1] - if y4.Op != OpARM64MOVDnop { - break - } - x4 := y4.Args[0] - if x4.Op != OpARM64MOVBUload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - y5 := o1.Args[1] - if y5.Op != OpARM64MOVDnop { - break - } - x5 := y5.Args[0] - if x5.Op != OpARM64MOVBUload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - y6 := o0.Args[1] - if y6.Op != OpARM64MOVDnop { - break - } - x6 := y6.Args[0] - if x6.Op != OpARM64MOVBUload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] { - break - } - y7 := v.Args[1] - if y7.Op != OpARM64MOVDnop { - break - } - x7 := y7.Args[0] - if x7.Op != OpARM64MOVBUload { - break - } - i7 := x7.AuxInt - if x7.Aux != s { - break - } - _ = x7.Args[1] - if p != x7.Args[0] || mem != x7.Args[1] || !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x7.Pos, OpARM64REV, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x7.Pos, OpARM64MOVDload, t) - v1.Aux = s - v2 := b.NewValue0(x7.Pos, OpOffPtr, p.Type) - v2.AuxInt = i0 - v2.AddArg(p) - v1.AddArg(v2) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR y7:(MOVDnop x7:(MOVBUload [i7] {s} p mem)) o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUload [i0] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i1] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i3] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [i4] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [i5] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [i6] {s} p mem)))) - // cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV (MOVDload {s} (OffPtr [i0] p) mem)) - for { - t := v.Type - _ = v.Args[1] - y7 := v.Args[0] - if y7.Op != OpARM64MOVDnop { - break - } - x7 := y7.Args[0] - if x7.Op != OpARM64MOVBUload { - break - } - i7 := x7.AuxInt - s := x7.Aux - mem := x7.Args[1] - p := x7.Args[0] - o0 := v.Args[1] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 24 { - break - } - _ = o2.Args[1] - o3 := o2.Args[0] - if o3.Op != OpARM64ORshiftLL || o3.AuxInt != 32 { - break - } - _ = o3.Args[1] - o4 := o3.Args[0] - if o4.Op != OpARM64ORshiftLL || o4.AuxInt != 40 { - break - } - _ = o4.Args[1] - o5 := o4.Args[0] - if o5.Op != OpARM64ORshiftLL || o5.AuxInt != 48 { - break - } - _ = o5.Args[1] - s0 := o5.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 56 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] { - break - } - y1 := o5.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - y2 := o4.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload { - break - } - i2 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] { - break - } - y3 := o3.Args[1] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload { - break - } - i3 := x3.AuxInt - if x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { - break - } - y4 := o2.Args[1] - if y4.Op != OpARM64MOVDnop { - break - } - x4 := y4.Args[0] - if x4.Op != OpARM64MOVBUload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - y5 := o1.Args[1] - if y5.Op != OpARM64MOVDnop { - break - } - x5 := y5.Args[0] - if x5.Op != OpARM64MOVBUload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - y6 := o0.Args[1] - if y6.Op != OpARM64MOVDnop { - break - } - x6 := y6.Args[0] - if x6.Op != OpARM64MOVBUload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] || !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x6.Pos, OpARM64REV, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x6.Pos, OpARM64MOVDload, t) - v1.Aux = s - v2 := b.NewValue0(x6.Pos, OpOffPtr, p.Type) - v2.AuxInt = i0 - v2.AddArg(p) - v1.AddArg(v2) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUloadidx ptr0 idx0 mem))) y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) y2:(MOVDnop x2:(MOVBUload [2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [3] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [4] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [5] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [6] {s} p mem))) y7:(MOVDnop x7:(MOVBUload [7] {s} p mem))) - // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV (MOVDloadidx ptr0 idx0 mem)) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 24 { - break - } - _ = o2.Args[1] - o3 := o2.Args[0] - if o3.Op != OpARM64ORshiftLL || o3.AuxInt != 32 { - break - } - _ = o3.Args[1] - o4 := o3.Args[0] - if o4.Op != OpARM64ORshiftLL || o4.AuxInt != 40 { - break - } - _ = o4.Args[1] - o5 := o4.Args[0] - if o5.Op != OpARM64ORshiftLL || o5.AuxInt != 48 { - break - } - _ = o5.Args[1] - s0 := o5.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 56 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUloadidx { - break - } - mem := x0.Args[2] - ptr0 := x0.Args[0] - idx0 := x0.Args[1] - y1 := o5.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 1 { - break - } - s := x1.Aux - _ = x1.Args[1] - p1 := x1.Args[0] - if p1.Op != OpARM64ADD { - break - } - idx1 := p1.Args[1] - ptr1 := p1.Args[0] - if mem != x1.Args[1] { - break - } - y2 := o4.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 2 || x2.Aux != s { - break - } - _ = x2.Args[1] - p := x2.Args[0] - if mem != x2.Args[1] { - break - } - y3 := o3.Args[1] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload || x3.AuxInt != 3 || x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { - break - } - y4 := o2.Args[1] - if y4.Op != OpARM64MOVDnop { - break - } - x4 := y4.Args[0] - if x4.Op != OpARM64MOVBUload || x4.AuxInt != 4 || x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - y5 := o1.Args[1] - if y5.Op != OpARM64MOVDnop { - break - } - x5 := y5.Args[0] - if x5.Op != OpARM64MOVBUload || x5.AuxInt != 5 || x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - y6 := o0.Args[1] - if y6.Op != OpARM64MOVDnop { - break - } - x6 := y6.Args[0] - if x6.Op != OpARM64MOVBUload || x6.AuxInt != 6 || x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] { - break - } - y7 := v.Args[1] - if y7.Op != OpARM64MOVDnop { - break - } - x7 := y7.Args[0] - if x7.Op != OpARM64MOVBUload || x7.AuxInt != 7 || x7.Aux != s { - break - } - _ = x7.Args[1] - if p != x7.Args[0] || mem != x7.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x7.Pos, OpARM64REV, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x7.Pos, OpARM64MOVDloadidx, t) - v1.AddArg(ptr0) - v1.AddArg(idx0) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - return false -} -func rewriteValueARM64_OpARM64OR_50(v *Value) bool { - b := v.Block - // match: (OR o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUloadidx ptr0 idx0 mem))) y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD idx1 ptr1) mem))) y2:(MOVDnop x2:(MOVBUload [2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [3] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [4] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [5] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [6] {s} p mem))) y7:(MOVDnop x7:(MOVBUload [7] {s} p mem))) - // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV (MOVDloadidx ptr0 idx0 mem)) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 24 { - break - } - _ = o2.Args[1] - o3 := o2.Args[0] - if o3.Op != OpARM64ORshiftLL || o3.AuxInt != 32 { - break - } - _ = o3.Args[1] - o4 := o3.Args[0] - if o4.Op != OpARM64ORshiftLL || o4.AuxInt != 40 { - break - } - _ = o4.Args[1] - o5 := o4.Args[0] - if o5.Op != OpARM64ORshiftLL || o5.AuxInt != 48 { - break - } - _ = o5.Args[1] - s0 := o5.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 56 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUloadidx { - break - } - mem := x0.Args[2] - ptr0 := x0.Args[0] - idx0 := x0.Args[1] - y1 := o5.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 1 { - break - } - s := x1.Aux - _ = x1.Args[1] - p1 := x1.Args[0] - if p1.Op != OpARM64ADD { - break - } - ptr1 := p1.Args[1] - idx1 := p1.Args[0] - if mem != x1.Args[1] { - break - } - y2 := o4.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 2 || x2.Aux != s { - break - } - _ = x2.Args[1] - p := x2.Args[0] - if mem != x2.Args[1] { - break - } - y3 := o3.Args[1] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload || x3.AuxInt != 3 || x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { - break - } - y4 := o2.Args[1] - if y4.Op != OpARM64MOVDnop { - break - } - x4 := y4.Args[0] - if x4.Op != OpARM64MOVBUload || x4.AuxInt != 4 || x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - y5 := o1.Args[1] - if y5.Op != OpARM64MOVDnop { - break - } - x5 := y5.Args[0] - if x5.Op != OpARM64MOVBUload || x5.AuxInt != 5 || x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - y6 := o0.Args[1] - if y6.Op != OpARM64MOVDnop { - break - } - x6 := y6.Args[0] - if x6.Op != OpARM64MOVBUload || x6.AuxInt != 6 || x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] { - break - } - y7 := v.Args[1] - if y7.Op != OpARM64MOVDnop { - break - } - x7 := y7.Args[0] - if x7.Op != OpARM64MOVBUload || x7.AuxInt != 7 || x7.Aux != s { - break - } - _ = x7.Args[1] - if p != x7.Args[0] || mem != x7.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x7.Pos, OpARM64REV, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x7.Pos, OpARM64MOVDloadidx, t) - v1.AddArg(ptr0) - v1.AddArg(idx0) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR y7:(MOVDnop x7:(MOVBUload [7] {s} p mem)) o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUloadidx ptr0 idx0 mem))) y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) y2:(MOVDnop x2:(MOVBUload [2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [3] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [4] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [5] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [6] {s} p mem)))) - // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV (MOVDloadidx ptr0 idx0 mem)) - for { - t := v.Type - _ = v.Args[1] - y7 := v.Args[0] - if y7.Op != OpARM64MOVDnop { - break - } - x7 := y7.Args[0] - if x7.Op != OpARM64MOVBUload || x7.AuxInt != 7 { - break - } - s := x7.Aux - mem := x7.Args[1] - p := x7.Args[0] - o0 := v.Args[1] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 24 { - break - } - _ = o2.Args[1] - o3 := o2.Args[0] - if o3.Op != OpARM64ORshiftLL || o3.AuxInt != 32 { - break - } - _ = o3.Args[1] - o4 := o3.Args[0] - if o4.Op != OpARM64ORshiftLL || o4.AuxInt != 40 { - break - } - _ = o4.Args[1] - o5 := o4.Args[0] - if o5.Op != OpARM64ORshiftLL || o5.AuxInt != 48 { - break - } - _ = o5.Args[1] - s0 := o5.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 56 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUloadidx { - break - } - _ = x0.Args[2] - ptr0 := x0.Args[0] - idx0 := x0.Args[1] - if mem != x0.Args[2] { - break - } - y1 := o5.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 1 || x1.Aux != s { - break - } - _ = x1.Args[1] - p1 := x1.Args[0] - if p1.Op != OpARM64ADD { - break - } - idx1 := p1.Args[1] - ptr1 := p1.Args[0] - if mem != x1.Args[1] { - break - } - y2 := o4.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 2 || x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] { - break - } - y3 := o3.Args[1] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload || x3.AuxInt != 3 || x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { - break - } - y4 := o2.Args[1] - if y4.Op != OpARM64MOVDnop { - break - } - x4 := y4.Args[0] - if x4.Op != OpARM64MOVBUload || x4.AuxInt != 4 || x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - y5 := o1.Args[1] - if y5.Op != OpARM64MOVDnop { - break - } - x5 := y5.Args[0] - if x5.Op != OpARM64MOVBUload || x5.AuxInt != 5 || x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - y6 := o0.Args[1] - if y6.Op != OpARM64MOVDnop { - break - } - x6 := y6.Args[0] - if x6.Op != OpARM64MOVBUload || x6.AuxInt != 6 || x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x6.Pos, OpARM64REV, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x6.Pos, OpARM64MOVDloadidx, t) - v1.AddArg(ptr0) - v1.AddArg(idx0) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR y7:(MOVDnop x7:(MOVBUload [7] {s} p mem)) o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUloadidx ptr0 idx0 mem))) y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD idx1 ptr1) mem))) y2:(MOVDnop x2:(MOVBUload [2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [3] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [4] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [5] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [6] {s} p mem)))) - // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV (MOVDloadidx ptr0 idx0 mem)) - for { - t := v.Type - _ = v.Args[1] - y7 := v.Args[0] - if y7.Op != OpARM64MOVDnop { - break - } - x7 := y7.Args[0] - if x7.Op != OpARM64MOVBUload || x7.AuxInt != 7 { - break - } - s := x7.Aux - mem := x7.Args[1] - p := x7.Args[0] - o0 := v.Args[1] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 24 { - break - } - _ = o2.Args[1] - o3 := o2.Args[0] - if o3.Op != OpARM64ORshiftLL || o3.AuxInt != 32 { - break - } - _ = o3.Args[1] - o4 := o3.Args[0] - if o4.Op != OpARM64ORshiftLL || o4.AuxInt != 40 { - break - } - _ = o4.Args[1] - o5 := o4.Args[0] - if o5.Op != OpARM64ORshiftLL || o5.AuxInt != 48 { - break - } - _ = o5.Args[1] - s0 := o5.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 56 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUloadidx { - break - } - _ = x0.Args[2] - ptr0 := x0.Args[0] - idx0 := x0.Args[1] - if mem != x0.Args[2] { - break - } - y1 := o5.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 1 || x1.Aux != s { - break - } - _ = x1.Args[1] - p1 := x1.Args[0] - if p1.Op != OpARM64ADD { - break - } - ptr1 := p1.Args[1] - idx1 := p1.Args[0] - if mem != x1.Args[1] { - break - } - y2 := o4.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 2 || x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] { - break - } - y3 := o3.Args[1] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload || x3.AuxInt != 3 || x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { - break - } - y4 := o2.Args[1] - if y4.Op != OpARM64MOVDnop { - break - } - x4 := y4.Args[0] - if x4.Op != OpARM64MOVBUload || x4.AuxInt != 4 || x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - y5 := o1.Args[1] - if y5.Op != OpARM64MOVDnop { - break - } - x5 := y5.Args[0] - if x5.Op != OpARM64MOVBUload || x5.AuxInt != 5 || x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - y6 := o0.Args[1] - if y6.Op != OpARM64MOVDnop { - break - } - x6 := y6.Args[0] - if x6.Op != OpARM64MOVBUload || x6.AuxInt != 6 || x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x6.Pos, OpARM64REV, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x6.Pos, OpARM64MOVDloadidx, t) - v1.AddArg(ptr0) - v1.AddArg(idx0) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUloadidx ptr idx mem))) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [2] idx) mem))) y3:(MOVDnop x3:(MOVBUloadidx ptr (ADDconst [3] idx) mem))) y4:(MOVDnop x4:(MOVBUloadidx ptr (ADDconst [4] idx) mem))) y5:(MOVDnop x5:(MOVBUloadidx ptr (ADDconst [5] idx) mem))) y6:(MOVDnop x6:(MOVBUloadidx ptr (ADDconst [6] idx) mem))) y7:(MOVDnop x7:(MOVBUloadidx ptr (ADDconst [7] idx) mem))) - // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV (MOVDloadidx ptr idx mem)) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 24 { - break - } - _ = o2.Args[1] - o3 := o2.Args[0] - if o3.Op != OpARM64ORshiftLL || o3.AuxInt != 32 { - break - } - _ = o3.Args[1] - o4 := o3.Args[0] - if o4.Op != OpARM64ORshiftLL || o4.AuxInt != 40 { - break - } - _ = o4.Args[1] - o5 := o4.Args[0] - if o5.Op != OpARM64ORshiftLL || o5.AuxInt != 48 { - break - } - _ = o5.Args[1] - s0 := o5.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 56 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUloadidx { - break - } - mem := x0.Args[2] - ptr := x0.Args[0] - idx := x0.Args[1] - y1 := o5.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUloadidx { - break - } - _ = x1.Args[2] - if ptr != x1.Args[0] { - break - } - x1_1 := x1.Args[1] - if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 1 || idx != x1_1.Args[0] || mem != x1.Args[2] { - break - } - y2 := o4.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUloadidx { - break - } - _ = x2.Args[2] - if ptr != x2.Args[0] { - break - } - x2_1 := x2.Args[1] - if x2_1.Op != OpARM64ADDconst || x2_1.AuxInt != 2 || idx != x2_1.Args[0] || mem != x2.Args[2] { - break - } - y3 := o3.Args[1] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUloadidx { - break - } - _ = x3.Args[2] - if ptr != x3.Args[0] { - break - } - x3_1 := x3.Args[1] - if x3_1.Op != OpARM64ADDconst || x3_1.AuxInt != 3 || idx != x3_1.Args[0] || mem != x3.Args[2] { - break - } - y4 := o2.Args[1] - if y4.Op != OpARM64MOVDnop { - break - } - x4 := y4.Args[0] - if x4.Op != OpARM64MOVBUloadidx { - break - } - _ = x4.Args[2] - if ptr != x4.Args[0] { - break - } - x4_1 := x4.Args[1] - if x4_1.Op != OpARM64ADDconst || x4_1.AuxInt != 4 || idx != x4_1.Args[0] || mem != x4.Args[2] { - break - } - y5 := o1.Args[1] - if y5.Op != OpARM64MOVDnop { - break - } - x5 := y5.Args[0] - if x5.Op != OpARM64MOVBUloadidx { - break - } - _ = x5.Args[2] - if ptr != x5.Args[0] { - break - } - x5_1 := x5.Args[1] - if x5_1.Op != OpARM64ADDconst || x5_1.AuxInt != 5 || idx != x5_1.Args[0] || mem != x5.Args[2] { - break - } - y6 := o0.Args[1] - if y6.Op != OpARM64MOVDnop { - break - } - x6 := y6.Args[0] - if x6.Op != OpARM64MOVBUloadidx { - break - } - _ = x6.Args[2] - if ptr != x6.Args[0] { - break - } - x6_1 := x6.Args[1] - if x6_1.Op != OpARM64ADDconst || x6_1.AuxInt != 6 || idx != x6_1.Args[0] || mem != x6.Args[2] { - break - } - y7 := v.Args[1] - if y7.Op != OpARM64MOVDnop { - break - } - x7 := y7.Args[0] - if x7.Op != OpARM64MOVBUloadidx { - break - } - _ = x7.Args[2] - if ptr != x7.Args[0] { - break - } - x7_1 := x7.Args[1] - if x7_1.Op != OpARM64ADDconst || x7_1.AuxInt != 7 || idx != x7_1.Args[0] || mem != x7.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) - v0 := b.NewValue0(v.Pos, OpARM64REV, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpARM64MOVDloadidx, t) - v1.AddArg(ptr) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR y7:(MOVDnop x7:(MOVBUloadidx ptr (ADDconst [7] idx) mem)) o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUloadidx ptr idx mem))) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [2] idx) mem))) y3:(MOVDnop x3:(MOVBUloadidx ptr (ADDconst [3] idx) mem))) y4:(MOVDnop x4:(MOVBUloadidx ptr (ADDconst [4] idx) mem))) y5:(MOVDnop x5:(MOVBUloadidx ptr (ADDconst [5] idx) mem))) y6:(MOVDnop x6:(MOVBUloadidx ptr (ADDconst [6] idx) mem)))) - // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) - // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV (MOVDloadidx ptr idx mem)) - for { - t := v.Type - _ = v.Args[1] - y7 := v.Args[0] - if y7.Op != OpARM64MOVDnop { - break - } - x7 := y7.Args[0] - if x7.Op != OpARM64MOVBUloadidx { - break - } - mem := x7.Args[2] - ptr := x7.Args[0] - x7_1 := x7.Args[1] - if x7_1.Op != OpARM64ADDconst || x7_1.AuxInt != 7 { - break - } - idx := x7_1.Args[0] - o0 := v.Args[1] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { - break - } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 24 { - break - } - _ = o2.Args[1] - o3 := o2.Args[0] - if o3.Op != OpARM64ORshiftLL || o3.AuxInt != 32 { - break - } - _ = o3.Args[1] - o4 := o3.Args[0] - if o4.Op != OpARM64ORshiftLL || o4.AuxInt != 40 { - break - } - _ = o4.Args[1] - o5 := o4.Args[0] - if o5.Op != OpARM64ORshiftLL || o5.AuxInt != 48 { - break - } - _ = o5.Args[1] - s0 := o5.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 56 { - break - } - y0 := s0.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUloadidx { - break - } - _ = x0.Args[2] - if ptr != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] { - break - } - y1 := o5.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUloadidx { - break - } - _ = x1.Args[2] - if ptr != x1.Args[0] { - break - } - x1_1 := x1.Args[1] - if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 1 || idx != x1_1.Args[0] || mem != x1.Args[2] { - break - } - y2 := o4.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUloadidx { - break - } - _ = x2.Args[2] - if ptr != x2.Args[0] { - break - } - x2_1 := x2.Args[1] - if x2_1.Op != OpARM64ADDconst || x2_1.AuxInt != 2 || idx != x2_1.Args[0] || mem != x2.Args[2] { - break - } - y3 := o3.Args[1] - if y3.Op != OpARM64MOVDnop { - break - } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUloadidx { - break - } - _ = x3.Args[2] - if ptr != x3.Args[0] { - break - } - x3_1 := x3.Args[1] - if x3_1.Op != OpARM64ADDconst || x3_1.AuxInt != 3 || idx != x3_1.Args[0] || mem != x3.Args[2] { - break - } - y4 := o2.Args[1] - if y4.Op != OpARM64MOVDnop { - break - } - x4 := y4.Args[0] - if x4.Op != OpARM64MOVBUloadidx { - break - } - _ = x4.Args[2] - if ptr != x4.Args[0] { - break - } - x4_1 := x4.Args[1] - if x4_1.Op != OpARM64ADDconst || x4_1.AuxInt != 4 || idx != x4_1.Args[0] || mem != x4.Args[2] { - break - } - y5 := o1.Args[1] - if y5.Op != OpARM64MOVDnop { - break - } - x5 := y5.Args[0] - if x5.Op != OpARM64MOVBUloadidx { - break - } - _ = x5.Args[2] - if ptr != x5.Args[0] { - break - } - x5_1 := x5.Args[1] - if x5_1.Op != OpARM64ADDconst || x5_1.AuxInt != 5 || idx != x5_1.Args[0] || mem != x5.Args[2] { - break - } - y6 := o0.Args[1] - if y6.Op != OpARM64MOVDnop { - break - } - x6 := y6.Args[0] - if x6.Op != OpARM64MOVBUloadidx { - break - } - _ = x6.Args[2] - if ptr != x6.Args[0] { - break - } - x6_1 := x6.Args[1] - if x6_1.Op != OpARM64ADDconst || x6_1.AuxInt != 6 || idx != x6_1.Args[0] || mem != x6.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) - v0 := b.NewValue0(v.Pos, OpARM64REV, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpARM64MOVDloadidx, t) - v1.AddArg(ptr) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - return false -} -func rewriteValueARM64_OpARM64ORN_0(v *Value) bool { - // match: (ORN x (MOVDconst [c])) - // result: (ORconst [^c] x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - v.reset(OpARM64ORconst) - v.AuxInt = ^c - v.AddArg(x) - return true - } - // match: (ORN x x) - // result: (MOVDconst [-1]) - for { - x := v.Args[1] - if x != v.Args[0] { - break - } - v.reset(OpARM64MOVDconst) - v.AuxInt = -1 - return true - } - // match: (ORN x0 x1:(SLLconst [c] y)) - // cond: clobberIfDead(x1) - // result: (ORNshiftLL x0 y [c]) - for { - _ = v.Args[1] - x0 := v.Args[0] - x1 := v.Args[1] - if x1.Op != OpARM64SLLconst { - break - } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { - break - } - v.reset(OpARM64ORNshiftLL) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) - return true - } - // match: (ORN x0 x1:(SRLconst [c] y)) - // cond: clobberIfDead(x1) - // result: (ORNshiftRL x0 y [c]) - for { - _ = v.Args[1] - x0 := v.Args[0] - x1 := v.Args[1] - if x1.Op != OpARM64SRLconst { - break - } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { - break - } - v.reset(OpARM64ORNshiftRL) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) - return true - } - // match: (ORN x0 x1:(SRAconst [c] y)) - // cond: clobberIfDead(x1) - // result: (ORNshiftRA x0 y [c]) - for { - _ = v.Args[1] - x0 := v.Args[0] - x1 := v.Args[1] - if x1.Op != OpARM64SRAconst { - break - } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { - break - } - v.reset(OpARM64ORNshiftRA) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) - return true - } - return false -} -func rewriteValueARM64_OpARM64ORNshiftLL_0(v *Value) bool { - // match: (ORNshiftLL x (MOVDconst [c]) [d]) - // result: (ORconst x [^int64(uint64(c)<>uint64(d))]) - for { - d := v.AuxInt - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - v.reset(OpARM64ORconst) - v.AuxInt = ^(c >> uint64(d)) - v.AddArg(x) - return true - } - // match: (ORNshiftRA x (SRAconst x [c]) [d]) - // cond: c==d - // result: (MOVDconst [-1]) - for { - d := v.AuxInt - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SRAconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(c == d) { - break - } - v.reset(OpARM64MOVDconst) - v.AuxInt = -1 - return true - } - return false -} -func rewriteValueARM64_OpARM64ORNshiftRL_0(v *Value) bool { - // match: (ORNshiftRL x (MOVDconst [c]) [d]) - // result: (ORconst x [^int64(uint64(c)>>uint64(d))]) - for { - d := v.AuxInt - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - v.reset(OpARM64ORconst) - v.AuxInt = ^int64(uint64(c) >> uint64(d)) - v.AddArg(x) - return true - } - // match: (ORNshiftRL x (SRLconst x [c]) [d]) - // cond: c==d - // result: (MOVDconst [-1]) - for { - d := v.AuxInt - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(c == d) { - break - } - v.reset(OpARM64MOVDconst) - v.AuxInt = -1 - return true - } - return false -} -func rewriteValueARM64_OpARM64ORconst_0(v *Value) bool { - // match: (ORconst [0] x) - // result: x - for { - if v.AuxInt != 0 { - break - } - x := v.Args[0] - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (ORconst [-1] _) - // result: (MOVDconst [-1]) - for { - if v.AuxInt != -1 { - break - } - v.reset(OpARM64MOVDconst) - v.AuxInt = -1 - return true - } - // match: (ORconst [c] (MOVDconst [d])) - // result: (MOVDconst [c|d]) - for { - c := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - d := v_0.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = c | d - return true - } - // match: (ORconst [c] (ORconst [d] x)) - // result: (ORconst [c|d] x) - for { - c := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64ORconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v.reset(OpARM64ORconst) - v.AuxInt = c | d - v.AddArg(x) - return true - } - // match: (ORconst [c1] (ANDconst [c2] x)) - // cond: c2|c1 == ^0 - // result: (ORconst [c1] x) - for { - c1 := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64ANDconst { - break - } - c2 := v_0.AuxInt - x := v_0.Args[0] - if !(c2|c1 == ^0) { - break - } - v.reset(OpARM64ORconst) - v.AuxInt = c1 - v.AddArg(x) - return true - } - return false -} -func rewriteValueARM64_OpARM64ORshiftLL_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORshiftLL (MOVDconst [c]) x [d]) - // result: (ORconst [c] (SLLconst x [d])) - for { - d := v.AuxInt - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - v.reset(OpARM64ORconst) - v.AuxInt = c - v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v0.AuxInt = d - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (ORshiftLL x (MOVDconst [c]) [d]) - // result: (ORconst x [int64(uint64(c)< [c] (UBFX [bfc] x) x) - // cond: c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c) - // result: (RORWconst [32-c] x) - for { - t := v.Type - c := v.AuxInt - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64UBFX { - break - } - bfc := v_0.AuxInt - if x != v_0.Args[0] || !(c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c)) { - break - } - v.reset(OpARM64RORWconst) - v.AuxInt = 32 - c - v.AddArg(x) - return true - } - // match: (ORshiftLL [8] (UBFX [armBFAuxInt(8, 8)] x) x) - // result: (REV16W x) - for { - if v.Type != typ.UInt16 || v.AuxInt != 8 { - break - } - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64UBFX || v_0.Type != typ.UInt16 || v_0.AuxInt != armBFAuxInt(8, 8) || x != v_0.Args[0] { - break - } - v.reset(OpARM64REV16W) - v.AddArg(x) - return true - } - // match: (ORshiftLL [c] (SRLconst x [64-c]) x2) - // result: (EXTRconst [64-c] x2 x) - for { - c := v.AuxInt - x2 := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64SRLconst || v_0.AuxInt != 64-c { - break - } - x := v_0.Args[0] - v.reset(OpARM64EXTRconst) - v.AuxInt = 64 - c - v.AddArg(x2) - v.AddArg(x) - return true - } - // match: (ORshiftLL [c] (UBFX [bfc] x) x2) - // cond: c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c) - // result: (EXTRWconst [32-c] x2 x) - for { - t := v.Type - c := v.AuxInt - x2 := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64UBFX { - break - } - bfc := v_0.AuxInt - x := v_0.Args[0] - if !(c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c)) { - break - } - v.reset(OpARM64EXTRWconst) - v.AuxInt = 32 - c - v.AddArg(x2) - v.AddArg(x) - return true - } - // match: (ORshiftLL [sc] (UBFX [bfc] x) (SRLconst [sc] y)) - // cond: sc == getARM64BFwidth(bfc) - // result: (BFXIL [bfc] y x) - for { - sc := v.AuxInt - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64UBFX { - break - } - bfc := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SRLconst || v_1.AuxInt != sc { - break - } - y := v_1.Args[0] - if !(sc == getARM64BFwidth(bfc)) { - break - } - v.reset(OpARM64BFXIL) - v.AuxInt = bfc - v.AddArg(y) - v.AddArg(x) - return true - } - // match: (ORshiftLL [8] y0:(MOVDnop x0:(MOVBUload [i0] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [i1] {s} p mem))) - // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1) - // result: @mergePoint(b,x0,x1) (MOVHUload {s} (OffPtr [i0] p) mem) - for { - t := v.Type - if v.AuxInt != 8 { - break - } - _ = v.Args[1] - y0 := v.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - y1 := v.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpARM64MOVHUload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.Aux = s - v1 := b.NewValue0(x1.Pos, OpOffPtr, p.Type) - v1.AuxInt = i0 - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - return false -} -func rewriteValueARM64_OpARM64ORshiftLL_10(v *Value) bool { - b := v.Block - // match: (ORshiftLL [8] y0:(MOVDnop x0:(MOVBUloadidx ptr0 idx0 mem)) y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) - // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1) - // result: @mergePoint(b,x0,x1) (MOVHUloadidx ptr0 idx0 mem) - for { - t := v.Type - if v.AuxInt != 8 { - break - } - _ = v.Args[1] - y0 := v.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUloadidx { - break - } - mem := x0.Args[2] - ptr0 := x0.Args[0] - idx0 := x0.Args[1] - y1 := v.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 1 { - break - } - s := x1.Aux - _ = x1.Args[1] - p1 := x1.Args[0] - if p1.Op != OpARM64ADD { - break - } - idx1 := p1.Args[1] - ptr1 := p1.Args[0] - if mem != x1.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b, x0, x1) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpARM64MOVHUloadidx, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AddArg(ptr0) - v0.AddArg(idx0) - v0.AddArg(mem) - return true - } - // match: (ORshiftLL [8] y0:(MOVDnop x0:(MOVBUloadidx ptr0 idx0 mem)) y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD idx1 ptr1) mem))) - // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1) - // result: @mergePoint(b,x0,x1) (MOVHUloadidx ptr0 idx0 mem) - for { - t := v.Type - if v.AuxInt != 8 { - break - } - _ = v.Args[1] - y0 := v.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUloadidx { - break - } - mem := x0.Args[2] - ptr0 := x0.Args[0] - idx0 := x0.Args[1] - y1 := v.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 1 { - break - } - s := x1.Aux - _ = x1.Args[1] - p1 := x1.Args[0] - if p1.Op != OpARM64ADD { - break - } - ptr1 := p1.Args[1] - idx1 := p1.Args[0] - if mem != x1.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b, x0, x1) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpARM64MOVHUloadidx, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AddArg(ptr0) - v0.AddArg(idx0) - v0.AddArg(mem) - return true - } - // match: (ORshiftLL [8] y0:(MOVDnop x0:(MOVBUloadidx ptr idx mem)) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) - // cond: x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1) - // result: @mergePoint(b,x0,x1) (MOVHUloadidx ptr idx mem) - for { - t := v.Type - if v.AuxInt != 8 { - break - } - _ = v.Args[1] - y0 := v.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUloadidx { - break - } - mem := x0.Args[2] - ptr := x0.Args[0] - idx := x0.Args[1] - y1 := v.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUloadidx { - break - } - _ = x1.Args[2] - if ptr != x1.Args[0] { - break - } - x1_1 := x1.Args[1] - if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 1 || idx != x1_1.Args[0] || mem != x1.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpARM64MOVHUloadidx, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AddArg(ptr) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORshiftLL [24] o0:(ORshiftLL [16] x0:(MOVHUload [i0] {s} p mem) y1:(MOVDnop x1:(MOVBUload [i2] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i3] {s} p mem))) - // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y1) && clobber(y2) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVWUload {s} (OffPtr [i0] p) mem) - for { - t := v.Type - if v.AuxInt != 24 { - break - } - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 16 { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != OpARM64MOVHUload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - y1 := o0.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - y2 := v.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload { - break - } - i3 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y1) && clobber(y2) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x2.Pos, OpARM64MOVWUload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.Aux = s - v1 := b.NewValue0(x2.Pos, OpOffPtr, p.Type) - v1.AuxInt = i0 - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (ORshiftLL [24] o0:(ORshiftLL [16] x0:(MOVHUloadidx ptr0 idx0 mem) y1:(MOVDnop x1:(MOVBUload [2] {s} p1:(ADD ptr1 idx1) mem))) y2:(MOVDnop x2:(MOVBUload [3] {s} p mem))) - // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y1) && clobber(y2) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVWUloadidx ptr0 idx0 mem) - for { - t := v.Type - if v.AuxInt != 24 { - break - } - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 16 { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != OpARM64MOVHUloadidx { - break - } - mem := x0.Args[2] - ptr0 := x0.Args[0] - idx0 := x0.Args[1] - y1 := o0.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 2 { - break - } - s := x1.Aux - _ = x1.Args[1] - p1 := x1.Args[0] - if p1.Op != OpARM64ADD { - break - } - idx1 := p1.Args[1] - ptr1 := p1.Args[0] - if mem != x1.Args[1] { - break - } - y2 := v.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 3 || x2.Aux != s { - break - } - _ = x2.Args[1] - p := x2.Args[0] - if mem != x2.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y1) && clobber(y2) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x2.Pos, OpARM64MOVWUloadidx, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AddArg(ptr0) - v0.AddArg(idx0) - v0.AddArg(mem) - return true - } - // match: (ORshiftLL [24] o0:(ORshiftLL [16] x0:(MOVHUloadidx ptr0 idx0 mem) y1:(MOVDnop x1:(MOVBUload [2] {s} p1:(ADD idx1 ptr1) mem))) y2:(MOVDnop x2:(MOVBUload [3] {s} p mem))) - // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y1) && clobber(y2) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVWUloadidx ptr0 idx0 mem) - for { - t := v.Type - if v.AuxInt != 24 { - break - } - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 16 { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != OpARM64MOVHUloadidx { - break - } - mem := x0.Args[2] - ptr0 := x0.Args[0] - idx0 := x0.Args[1] - y1 := o0.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 2 { - break - } - s := x1.Aux - _ = x1.Args[1] - p1 := x1.Args[0] - if p1.Op != OpARM64ADD { - break - } - ptr1 := p1.Args[1] - idx1 := p1.Args[0] - if mem != x1.Args[1] { - break - } - y2 := v.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 3 || x2.Aux != s { - break - } - _ = x2.Args[1] - p := x2.Args[0] - if mem != x2.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y1) && clobber(y2) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x2.Pos, OpARM64MOVWUloadidx, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AddArg(ptr0) - v0.AddArg(idx0) - v0.AddArg(mem) - return true - } - // match: (ORshiftLL [24] o0:(ORshiftLL [16] x0:(MOVHUloadidx ptr idx mem) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [2] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [3] idx) mem))) - // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y1) && clobber(y2) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVWUloadidx ptr idx mem) - for { - t := v.Type - if v.AuxInt != 24 { - break - } - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 16 { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != OpARM64MOVHUloadidx { - break - } - mem := x0.Args[2] - ptr := x0.Args[0] - idx := x0.Args[1] - y1 := o0.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUloadidx { - break - } - _ = x1.Args[2] - if ptr != x1.Args[0] { - break - } - x1_1 := x1.Args[1] - if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 2 || idx != x1_1.Args[0] || mem != x1.Args[2] { - break - } - y2 := v.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUloadidx { - break - } - _ = x2.Args[2] - if ptr != x2.Args[0] { - break - } - x2_1 := x2.Args[1] - if x2_1.Op != OpARM64ADDconst || x2_1.AuxInt != 3 || idx != x2_1.Args[0] || mem != x2.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y1) && clobber(y2) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, OpARM64MOVWUloadidx, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AddArg(ptr) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORshiftLL [24] o0:(ORshiftLL [16] x0:(MOVHUloadidx2 ptr0 idx0 mem) y1:(MOVDnop x1:(MOVBUload [2] {s} p1:(ADDshiftLL [1] ptr1 idx1) mem))) y2:(MOVDnop x2:(MOVBUload [3] {s} p mem))) - // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y1) && clobber(y2) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVWUloadidx ptr0 (SLLconst [1] idx0) mem) - for { - t := v.Type - if v.AuxInt != 24 { - break - } - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 16 { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != OpARM64MOVHUloadidx2 { - break - } - mem := x0.Args[2] - ptr0 := x0.Args[0] - idx0 := x0.Args[1] - y1 := o0.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 2 { - break - } - s := x1.Aux - _ = x1.Args[1] - p1 := x1.Args[0] - if p1.Op != OpARM64ADDshiftLL || p1.AuxInt != 1 { - break - } - idx1 := p1.Args[1] - ptr1 := p1.Args[0] - if mem != x1.Args[1] { - break - } - y2 := v.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 3 || x2.Aux != s { - break - } - _ = x2.Args[1] - p := x2.Args[0] - if mem != x2.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y1) && clobber(y2) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x2.Pos, OpARM64MOVWUloadidx, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AddArg(ptr0) - v1 := b.NewValue0(x2.Pos, OpARM64SLLconst, idx0.Type) - v1.AuxInt = 1 - v1.AddArg(idx0) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (ORshiftLL [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32] x0:(MOVWUload [i0] {s} p mem) y1:(MOVDnop x1:(MOVBUload [i4] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i5] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i6] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [i7] {s} p mem))) - // cond: i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2) - // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDload {s} (OffPtr [i0] p) mem) - for { - t := v.Type - if v.AuxInt != 56 { - break - } - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 48 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 40 { - break - } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 32 { - break - } - _ = o2.Args[1] - x0 := o2.Args[0] - if x0.Op != OpARM64MOVWUload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - y1 := o2.Args[1] - if y1.Op != OpARM64MOVDnop { - break - } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload { - break - } - i4 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - y2 := o1.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload { - break - } - i5 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] { - break - } - y3 := o0.Args[1] - if y3.Op != OpARM64MOVDnop { + if x.Op != OpARM64SLLconst { break } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload { + c := x.AuxInt + y := x.Args[0] + if !(clobberIfDead(x)) { break } - i6 := x3.AuxInt - if x3.Aux != s { + v.reset(OpARM64MVNshiftLL) + v.AuxInt = c + v.AddArg(y) + return true + } + // match: (MVN x:(SRLconst [c] y)) + // cond: clobberIfDead(x) + // result: (MVNshiftRL [c] y) + for { + x := v.Args[0] + if x.Op != OpARM64SRLconst { break } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { + c := x.AuxInt + y := x.Args[0] + if !(clobberIfDead(x)) { break } - y4 := v.Args[1] - if y4.Op != OpARM64MOVDnop { + v.reset(OpARM64MVNshiftRL) + v.AuxInt = c + v.AddArg(y) + return true + } + // match: (MVN x:(SRAconst [c] y)) + // cond: clobberIfDead(x) + // result: (MVNshiftRA [c] y) + for { + x := v.Args[0] + if x.Op != OpARM64SRAconst { break } - x4 := y4.Args[0] - if x4.Op != OpARM64MOVBUload { + c := x.AuxInt + y := x.Args[0] + if !(clobberIfDead(x)) { break } - i7 := x4.AuxInt - if x4.Aux != s { + v.reset(OpARM64MVNshiftRA) + v.AuxInt = c + v.AddArg(y) + return true + } + return false +} +func rewriteValueARM64_OpARM64MVNshiftLL_0(v *Value) bool { + // match: (MVNshiftLL (MOVDconst [c]) [d]) + // result: (MOVDconst [^int64(uint64(c)<>uint64(d))]) + for { + d := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - b = mergePoint(b, x0, x1, x2, x3, x4) - v0 := b.NewValue0(x4.Pos, OpARM64MOVDload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.Aux = s - v1 := b.NewValue0(x4.Pos, OpOffPtr, p.Type) - v1.AuxInt = i0 - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) + c := v_0.AuxInt + v.reset(OpARM64MOVDconst) + v.AuxInt = ^(c >> uint64(d)) return true } - // match: (ORshiftLL [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32] x0:(MOVWUloadidx ptr0 idx0 mem) y1:(MOVDnop x1:(MOVBUload [4] {s} p1:(ADD ptr1 idx1) mem))) y2:(MOVDnop x2:(MOVBUload [5] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [6] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [7] {s} p mem))) - // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2) - // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDloadidx ptr0 idx0 mem) + return false +} +func rewriteValueARM64_OpARM64MVNshiftRL_0(v *Value) bool { + // match: (MVNshiftRL (MOVDconst [c]) [d]) + // result: (MOVDconst [^int64(uint64(c)>>uint64(d))]) for { - t := v.Type - if v.AuxInt != 56 { + d := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 48 { + c := v_0.AuxInt + v.reset(OpARM64MOVDconst) + v.AuxInt = ^int64(uint64(c) >> uint64(d)) + return true + } + return false +} +func rewriteValueARM64_OpARM64NEG_0(v *Value) bool { + // match: (NEG (MUL x y)) + // result: (MNEG x y) + for { + v_0 := v.Args[0] + if v_0.Op != OpARM64MUL { break } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 40 { + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpARM64MNEG) + v.AddArg(x) + v.AddArg(y) + return true + } + // match: (NEG (MULW x y)) + // result: (MNEGW x y) + for { + v_0 := v.Args[0] + if v_0.Op != OpARM64MULW { break } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 32 { + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpARM64MNEGW) + v.AddArg(x) + v.AddArg(y) + return true + } + // match: (NEG (MOVDconst [c])) + // result: (MOVDconst [-c]) + for { + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - _ = o2.Args[1] - x0 := o2.Args[0] - if x0.Op != OpARM64MOVWUloadidx { + c := v_0.AuxInt + v.reset(OpARM64MOVDconst) + v.AuxInt = -c + return true + } + // match: (NEG x:(SLLconst [c] y)) + // cond: clobberIfDead(x) + // result: (NEGshiftLL [c] y) + for { + x := v.Args[0] + if x.Op != OpARM64SLLconst { break } - mem := x0.Args[2] - ptr0 := x0.Args[0] - idx0 := x0.Args[1] - y1 := o2.Args[1] - if y1.Op != OpARM64MOVDnop { + c := x.AuxInt + y := x.Args[0] + if !(clobberIfDead(x)) { break } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 4 { + v.reset(OpARM64NEGshiftLL) + v.AuxInt = c + v.AddArg(y) + return true + } + // match: (NEG x:(SRLconst [c] y)) + // cond: clobberIfDead(x) + // result: (NEGshiftRL [c] y) + for { + x := v.Args[0] + if x.Op != OpARM64SRLconst { break } - s := x1.Aux - _ = x1.Args[1] - p1 := x1.Args[0] - if p1.Op != OpARM64ADD { + c := x.AuxInt + y := x.Args[0] + if !(clobberIfDead(x)) { break } - idx1 := p1.Args[1] - ptr1 := p1.Args[0] - if mem != x1.Args[1] { + v.reset(OpARM64NEGshiftRL) + v.AuxInt = c + v.AddArg(y) + return true + } + // match: (NEG x:(SRAconst [c] y)) + // cond: clobberIfDead(x) + // result: (NEGshiftRA [c] y) + for { + x := v.Args[0] + if x.Op != OpARM64SRAconst { break } - y2 := o1.Args[1] - if y2.Op != OpARM64MOVDnop { + c := x.AuxInt + y := x.Args[0] + if !(clobberIfDead(x)) { break } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 5 || x2.Aux != s { + v.reset(OpARM64NEGshiftRA) + v.AuxInt = c + v.AddArg(y) + return true + } + return false +} +func rewriteValueARM64_OpARM64NEGshiftLL_0(v *Value) bool { + // match: (NEGshiftLL (MOVDconst [c]) [d]) + // result: (MOVDconst [-int64(uint64(c)<>uint64(d))]) + for { + d := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - y3 := o0.Args[1] - if y3.Op != OpARM64MOVDnop { + c := v_0.AuxInt + v.reset(OpARM64MOVDconst) + v.AuxInt = -(c >> uint64(d)) + return true + } + return false +} +func rewriteValueARM64_OpARM64NEGshiftRL_0(v *Value) bool { + // match: (NEGshiftRL (MOVDconst [c]) [d]) + // result: (MOVDconst [-int64(uint64(c)>>uint64(d))]) + for { + d := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { + break + } + c := v_0.AuxInt + v.reset(OpARM64MOVDconst) + v.AuxInt = -int64(uint64(c) >> uint64(d)) + return true + } + return false +} +func rewriteValueARM64_OpARM64NotEqual_0(v *Value) bool { + // match: (NotEqual (FlagEQ)) + // result: (MOVDconst [0]) + for { + v_0 := v.Args[0] + if v_0.Op != OpARM64FlagEQ { break } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload || x3.AuxInt != 6 || x3.Aux != s { + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 + return true + } + // match: (NotEqual (FlagLT_ULT)) + // result: (MOVDconst [1]) + for { + v_0 := v.Args[0] + if v_0.Op != OpARM64FlagLT_ULT { break } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { + v.reset(OpARM64MOVDconst) + v.AuxInt = 1 + return true + } + // match: (NotEqual (FlagLT_UGT)) + // result: (MOVDconst [1]) + for { + v_0 := v.Args[0] + if v_0.Op != OpARM64FlagLT_UGT { break } - y4 := v.Args[1] - if y4.Op != OpARM64MOVDnop { + v.reset(OpARM64MOVDconst) + v.AuxInt = 1 + return true + } + // match: (NotEqual (FlagGT_ULT)) + // result: (MOVDconst [1]) + for { + v_0 := v.Args[0] + if v_0.Op != OpARM64FlagGT_ULT { break } - x4 := y4.Args[0] - if x4.Op != OpARM64MOVBUload || x4.AuxInt != 7 || x4.Aux != s { + v.reset(OpARM64MOVDconst) + v.AuxInt = 1 + return true + } + // match: (NotEqual (FlagGT_UGT)) + // result: (MOVDconst [1]) + for { + v_0 := v.Args[0] + if v_0.Op != OpARM64FlagGT_UGT { break } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2)) { + v.reset(OpARM64MOVDconst) + v.AuxInt = 1 + return true + } + // match: (NotEqual (InvertFlags x)) + // result: (NotEqual x) + for { + v_0 := v.Args[0] + if v_0.Op != OpARM64InvertFlags { break } - b = mergePoint(b, x0, x1, x2, x3, x4) - v0 := b.NewValue0(x4.Pos, OpARM64MOVDloadidx, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AddArg(ptr0) - v0.AddArg(idx0) - v0.AddArg(mem) + x := v_0.Args[0] + v.reset(OpARM64NotEqual) + v.AddArg(x) return true } return false } -func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { +func rewriteValueARM64_OpARM64OR_0(v *Value) bool { b := v.Block - // match: (ORshiftLL [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32] x0:(MOVWUloadidx ptr0 idx0 mem) y1:(MOVDnop x1:(MOVBUload [4] {s} p1:(ADD idx1 ptr1) mem))) y2:(MOVDnop x2:(MOVBUload [5] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [6] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [7] {s} p mem))) - // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2) - // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDloadidx ptr0 idx0 mem) + typ := &b.Func.Config.Types + // match: (OR x (MOVDconst [c])) + // result: (ORconst [c] x) for { - t := v.Type - if v.AuxInt != 56 { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + v.reset(OpARM64ORconst) + v.AuxInt = c + v.AddArg(x) + return true + } + break + } + // match: (OR x x) + // result: x + for { + x := v.Args[1] + if x != v.Args[0] { break } + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + // match: (OR x (MVN y)) + // result: (ORN x y) + for { _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 48 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MVN { + continue + } + y := v_1.Args[0] + v.reset(OpARM64ORN) + v.AddArg(x) + v.AddArg(y) + return true } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 40 { - break + break + } + // match: (OR x0 x1:(SLLconst [c] y)) + // cond: clobberIfDead(x1) + // result: (ORshiftLL x0 y [c]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + x1 := v.Args[1^_i0] + if x1.Op != OpARM64SLLconst { + continue + } + c := x1.AuxInt + y := x1.Args[0] + if !(clobberIfDead(x1)) { + continue + } + v.reset(OpARM64ORshiftLL) + v.AuxInt = c + v.AddArg(x0) + v.AddArg(y) + return true } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 32 { - break + break + } + // match: (OR x0 x1:(SRLconst [c] y)) + // cond: clobberIfDead(x1) + // result: (ORshiftRL x0 y [c]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + x1 := v.Args[1^_i0] + if x1.Op != OpARM64SRLconst { + continue + } + c := x1.AuxInt + y := x1.Args[0] + if !(clobberIfDead(x1)) { + continue + } + v.reset(OpARM64ORshiftRL) + v.AuxInt = c + v.AddArg(x0) + v.AddArg(y) + return true } - _ = o2.Args[1] - x0 := o2.Args[0] - if x0.Op != OpARM64MOVWUloadidx { - break + break + } + // match: (OR x0 x1:(SRAconst [c] y)) + // cond: clobberIfDead(x1) + // result: (ORshiftRA x0 y [c]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + x1 := v.Args[1^_i0] + if x1.Op != OpARM64SRAconst { + continue + } + c := x1.AuxInt + y := x1.Args[0] + if !(clobberIfDead(x1)) { + continue + } + v.reset(OpARM64ORshiftRA) + v.AuxInt = c + v.AddArg(x0) + v.AddArg(y) + return true } - mem := x0.Args[2] - ptr0 := x0.Args[0] - idx0 := x0.Args[1] - y1 := o2.Args[1] - if y1.Op != OpARM64MOVDnop { - break + break + } + // match: (OR (SLL x (ANDconst [63] y)) (CSEL0 {cc} (SRL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) + // cond: cc.(Op) == OpARM64LessThanU + // result: (ROR x (NEG y)) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARM64SLL { + continue + } + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpARM64ANDconst { + continue + } + t := v_0_1.Type + if v_0_1.AuxInt != 63 { + continue + } + y := v_0_1.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt64 { + continue + } + cc := v_1.Aux + _ = v_1.Args[1] + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpARM64SRL || v_1_0.Type != typ.UInt64 { + continue + } + _ = v_1_0.Args[1] + if x != v_1_0.Args[0] { + continue + } + v_1_0_1 := v_1_0.Args[1] + if v_1_0_1.Op != OpARM64SUB || v_1_0_1.Type != t { + continue + } + _ = v_1_0_1.Args[1] + v_1_0_1_0 := v_1_0_1.Args[0] + if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 64 { + continue + } + v_1_0_1_1 := v_1_0_1.Args[1] + if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 63 || y != v_1_0_1_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpARM64SUB || v_1_1_0.Type != t { + continue + } + _ = v_1_1_0.Args[1] + v_1_1_0_0 := v_1_1_0.Args[0] + if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 64 { + continue + } + v_1_1_0_1 := v_1_1_0.Args[1] + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + continue + } + v.reset(OpARM64ROR) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpARM64NEG, t) + v0.AddArg(y) + v.AddArg(v0) + return true } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 4 { - break + break + } + // match: (OR (SRL x (ANDconst [63] y)) (CSEL0 {cc} (SLL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) + // cond: cc.(Op) == OpARM64LessThanU + // result: (ROR x y) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARM64SRL || v_0.Type != typ.UInt64 { + continue + } + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpARM64ANDconst { + continue + } + t := v_0_1.Type + if v_0_1.AuxInt != 63 { + continue + } + y := v_0_1.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt64 { + continue + } + cc := v_1.Aux + _ = v_1.Args[1] + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpARM64SLL { + continue + } + _ = v_1_0.Args[1] + if x != v_1_0.Args[0] { + continue + } + v_1_0_1 := v_1_0.Args[1] + if v_1_0_1.Op != OpARM64SUB || v_1_0_1.Type != t { + continue + } + _ = v_1_0_1.Args[1] + v_1_0_1_0 := v_1_0_1.Args[0] + if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 64 { + continue + } + v_1_0_1_1 := v_1_0_1.Args[1] + if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 63 || y != v_1_0_1_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpARM64SUB || v_1_1_0.Type != t { + continue + } + _ = v_1_1_0.Args[1] + v_1_1_0_0 := v_1_1_0.Args[0] + if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 64 { + continue + } + v_1_1_0_1 := v_1_1_0.Args[1] + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + continue + } + v.reset(OpARM64ROR) + v.AddArg(x) + v.AddArg(y) + return true } - s := x1.Aux - _ = x1.Args[1] - p1 := x1.Args[0] - if p1.Op != OpARM64ADD { - break + break + } + // match: (OR (SLL x (ANDconst [31] y)) (CSEL0 {cc} (SRL (MOVWUreg x) (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) + // cond: cc.(Op) == OpARM64LessThanU + // result: (RORW x (NEG y)) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARM64SLL { + continue + } + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpARM64ANDconst { + continue + } + t := v_0_1.Type + if v_0_1.AuxInt != 31 { + continue + } + y := v_0_1.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt32 { + continue + } + cc := v_1.Aux + _ = v_1.Args[1] + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpARM64SRL || v_1_0.Type != typ.UInt32 { + continue + } + _ = v_1_0.Args[1] + v_1_0_0 := v_1_0.Args[0] + if v_1_0_0.Op != OpARM64MOVWUreg || x != v_1_0_0.Args[0] { + continue + } + v_1_0_1 := v_1_0.Args[1] + if v_1_0_1.Op != OpARM64SUB || v_1_0_1.Type != t { + continue + } + _ = v_1_0_1.Args[1] + v_1_0_1_0 := v_1_0_1.Args[0] + if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 32 { + continue + } + v_1_0_1_1 := v_1_0_1.Args[1] + if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 31 || y != v_1_0_1_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpARM64SUB || v_1_1_0.Type != t { + continue + } + _ = v_1_1_0.Args[1] + v_1_1_0_0 := v_1_1_0.Args[0] + if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 32 { + continue + } + v_1_1_0_1 := v_1_1_0.Args[1] + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + continue + } + v.reset(OpARM64RORW) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpARM64NEG, t) + v0.AddArg(y) + v.AddArg(v0) + return true } - ptr1 := p1.Args[1] - idx1 := p1.Args[0] - if mem != x1.Args[1] { - break + break + } + // match: (OR (SRL (MOVWUreg x) (ANDconst [31] y)) (CSEL0 {cc} (SLL x (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) + // cond: cc.(Op) == OpARM64LessThanU + // result: (RORW x y) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARM64SRL || v_0.Type != typ.UInt32 { + continue + } + _ = v_0.Args[1] + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpARM64MOVWUreg { + continue + } + x := v_0_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpARM64ANDconst { + continue + } + t := v_0_1.Type + if v_0_1.AuxInt != 31 { + continue + } + y := v_0_1.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt32 { + continue + } + cc := v_1.Aux + _ = v_1.Args[1] + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpARM64SLL { + continue + } + _ = v_1_0.Args[1] + if x != v_1_0.Args[0] { + continue + } + v_1_0_1 := v_1_0.Args[1] + if v_1_0_1.Op != OpARM64SUB || v_1_0_1.Type != t { + continue + } + _ = v_1_0_1.Args[1] + v_1_0_1_0 := v_1_0_1.Args[0] + if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 32 { + continue + } + v_1_0_1_1 := v_1_0_1.Args[1] + if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 31 || y != v_1_0_1_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpARM64SUB || v_1_1_0.Type != t { + continue + } + _ = v_1_1_0.Args[1] + v_1_1_0_0 := v_1_1_0.Args[0] + if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 32 { + continue + } + v_1_1_0_1 := v_1_1_0.Args[1] + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + continue + } + v.reset(OpARM64RORW) + v.AddArg(x) + v.AddArg(y) + return true } - y2 := o1.Args[1] - if y2.Op != OpARM64MOVDnop { - break + break + } + return false +} +func rewriteValueARM64_OpARM64OR_10(v *Value) bool { + b := v.Block + // match: (OR (UBFIZ [bfc] x) (ANDconst [ac] y)) + // cond: ac == ^((1< o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUload [i3] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i2] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i1] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i0] {s} p mem))) + // cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0) + // result: @mergePoint(b,x0,x1,x2,x3) (MOVWUload {s} (OffPtr [i0] p) mem) + for { + t := v.Type + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + o0 := v.Args[_i0] + if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { + continue + } + _ = o0.Args[1] + o1 := o0.Args[0] + if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { + continue + } + _ = o1.Args[1] + s0 := o1.Args[0] + if s0.Op != OpARM64SLLconst || s0.AuxInt != 24 { + continue + } + y0 := s0.Args[0] + if y0.Op != OpARM64MOVDnop { + continue + } + x0 := y0.Args[0] + if x0.Op != OpARM64MOVBUload { + continue + } + i3 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + y1 := o1.Args[1] + if y1.Op != OpARM64MOVDnop { + continue + } + x1 := y1.Args[0] + if x1.Op != OpARM64MOVBUload { + continue + } + i2 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] { + continue + } + y2 := o0.Args[1] + if y2.Op != OpARM64MOVDnop { + continue + } + x2 := y2.Args[0] + if x2.Op != OpARM64MOVBUload { + continue + } + i1 := x2.AuxInt + if x2.Aux != s { + continue + } + _ = x2.Args[1] + if p != x2.Args[0] || mem != x2.Args[1] { + continue + } + y3 := v.Args[1^_i0] + if y3.Op != OpARM64MOVDnop { + continue + } + x3 := y3.Args[0] + if x3.Op != OpARM64MOVBUload { + continue + } + i0 := x3.AuxInt + if x3.Aux != s { + continue + } + _ = x3.Args[1] + if p != x3.Args[0] || mem != x3.Args[1] || !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0)) { + continue + } + b = mergePoint(b, x0, x1, x2, x3) + v0 := b.NewValue0(x3.Pos, OpARM64MOVWUload, t) + v.reset(OpCopy) + v.AddArg(v0) + v0.Aux = s + v1 := b.NewValue0(x3.Pos, OpOffPtr, p.Type) + v1.AuxInt = i0 + v1.AddArg(p) + v0.AddArg(v1) + v0.AddArg(mem) + return true + } + break + } + // match: (OR o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUload [3] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [2] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) y3:(MOVDnop x3:(MOVBUloadidx ptr0 idx0 mem))) + // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0) + // result: @mergePoint(b,x0,x1,x2,x3) (MOVWUloadidx ptr0 idx0 mem) + for { + t := v.Type + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + o0 := v.Args[_i0] + if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { + continue + } + _ = o0.Args[1] + o1 := o0.Args[0] + if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { + continue + } + _ = o1.Args[1] + s0 := o1.Args[0] + if s0.Op != OpARM64SLLconst || s0.AuxInt != 24 { + continue + } + y0 := s0.Args[0] + if y0.Op != OpARM64MOVDnop { + continue + } + x0 := y0.Args[0] + if x0.Op != OpARM64MOVBUload || x0.AuxInt != 3 { + continue + } + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + y1 := o1.Args[1] + if y1.Op != OpARM64MOVDnop { + continue + } + x1 := y1.Args[0] + if x1.Op != OpARM64MOVBUload || x1.AuxInt != 2 || x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] { + continue + } + y2 := o0.Args[1] + if y2.Op != OpARM64MOVDnop { + continue + } + x2 := y2.Args[0] + if x2.Op != OpARM64MOVBUload || x2.AuxInt != 1 || x2.Aux != s { + continue + } + _ = x2.Args[1] + p1 := x2.Args[0] + if p1.Op != OpARM64ADD { + continue + } + _ = p1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + ptr1 := p1.Args[_i1] + idx1 := p1.Args[1^_i1] + if mem != x2.Args[1] { + continue + } + y3 := v.Args[1^_i0] + if y3.Op != OpARM64MOVDnop { + continue + } + x3 := y3.Args[0] + if x3.Op != OpARM64MOVBUloadidx { + continue + } + _ = x3.Args[2] + ptr0 := x3.Args[0] + idx0 := x3.Args[1] + if mem != x3.Args[2] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0)) { + continue + } + b = mergePoint(b, x0, x1, x2, x3) + v0 := b.NewValue0(x2.Pos, OpARM64MOVWUloadidx, t) + v.reset(OpCopy) + v.AddArg(v0) + v0.AddArg(ptr0) + v0.AddArg(idx0) + v0.AddArg(mem) + return true + } + } + break + } + // match: (OR o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUloadidx ptr (ADDconst [3] idx) mem))) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [2] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) y3:(MOVDnop x3:(MOVBUloadidx ptr idx mem))) + // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0) + // result: @mergePoint(b,x0,x1,x2,x3) (MOVWUloadidx ptr idx mem) + for { + t := v.Type + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + o0 := v.Args[_i0] + if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { + continue + } + _ = o0.Args[1] + o1 := o0.Args[0] + if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { + continue + } + _ = o1.Args[1] + s0 := o1.Args[0] + if s0.Op != OpARM64SLLconst || s0.AuxInt != 24 { + continue + } + y0 := s0.Args[0] + if y0.Op != OpARM64MOVDnop { + continue + } + x0 := y0.Args[0] + if x0.Op != OpARM64MOVBUloadidx { + continue + } + mem := x0.Args[2] + ptr := x0.Args[0] + x0_1 := x0.Args[1] + if x0_1.Op != OpARM64ADDconst || x0_1.AuxInt != 3 { + continue + } + idx := x0_1.Args[0] + y1 := o1.Args[1] + if y1.Op != OpARM64MOVDnop { + continue + } + x1 := y1.Args[0] + if x1.Op != OpARM64MOVBUloadidx { + continue + } + _ = x1.Args[2] + if ptr != x1.Args[0] { + continue + } + x1_1 := x1.Args[1] + if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 2 || idx != x1_1.Args[0] || mem != x1.Args[2] { + continue + } + y2 := o0.Args[1] + if y2.Op != OpARM64MOVDnop { + continue + } + x2 := y2.Args[0] + if x2.Op != OpARM64MOVBUloadidx { + continue + } + _ = x2.Args[2] + if ptr != x2.Args[0] { + continue + } + x2_1 := x2.Args[1] + if x2_1.Op != OpARM64ADDconst || x2_1.AuxInt != 1 || idx != x2_1.Args[0] || mem != x2.Args[2] { + continue + } + y3 := v.Args[1^_i0] + if y3.Op != OpARM64MOVDnop { + continue + } + x3 := y3.Args[0] + if x3.Op != OpARM64MOVBUloadidx { + continue + } + _ = x3.Args[2] + if ptr != x3.Args[0] || idx != x3.Args[1] || mem != x3.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0)) { + continue + } + b = mergePoint(b, x0, x1, x2, x3) + v0 := b.NewValue0(v.Pos, OpARM64MOVWUloadidx, t) + v.reset(OpCopy) + v.AddArg(v0) + v0.AddArg(ptr) + v0.AddArg(idx) + v0.AddArg(mem) + return true } - _ = x2.Args[1] - p := x2.Args[0] - if mem != x2.Args[1] { - break + break + } + // match: (OR o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUload [i7] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i6] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i5] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i4] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [i3] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [i2] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [i1] {s} p mem))) y7:(MOVDnop x7:(MOVBUload [i0] {s} p mem))) + // cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) + // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (MOVDload {s} (OffPtr [i0] p) mem) + for { + t := v.Type + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + o0 := v.Args[_i0] + if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { + continue + } + _ = o0.Args[1] + o1 := o0.Args[0] + if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { + continue + } + _ = o1.Args[1] + o2 := o1.Args[0] + if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 24 { + continue + } + _ = o2.Args[1] + o3 := o2.Args[0] + if o3.Op != OpARM64ORshiftLL || o3.AuxInt != 32 { + continue + } + _ = o3.Args[1] + o4 := o3.Args[0] + if o4.Op != OpARM64ORshiftLL || o4.AuxInt != 40 { + continue + } + _ = o4.Args[1] + o5 := o4.Args[0] + if o5.Op != OpARM64ORshiftLL || o5.AuxInt != 48 { + continue + } + _ = o5.Args[1] + s0 := o5.Args[0] + if s0.Op != OpARM64SLLconst || s0.AuxInt != 56 { + continue + } + y0 := s0.Args[0] + if y0.Op != OpARM64MOVDnop { + continue + } + x0 := y0.Args[0] + if x0.Op != OpARM64MOVBUload { + continue + } + i7 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + y1 := o5.Args[1] + if y1.Op != OpARM64MOVDnop { + continue + } + x1 := y1.Args[0] + if x1.Op != OpARM64MOVBUload { + continue + } + i6 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] { + continue + } + y2 := o4.Args[1] + if y2.Op != OpARM64MOVDnop { + continue + } + x2 := y2.Args[0] + if x2.Op != OpARM64MOVBUload { + continue + } + i5 := x2.AuxInt + if x2.Aux != s { + continue + } + _ = x2.Args[1] + if p != x2.Args[0] || mem != x2.Args[1] { + continue + } + y3 := o3.Args[1] + if y3.Op != OpARM64MOVDnop { + continue + } + x3 := y3.Args[0] + if x3.Op != OpARM64MOVBUload { + continue + } + i4 := x3.AuxInt + if x3.Aux != s { + continue + } + _ = x3.Args[1] + if p != x3.Args[0] || mem != x3.Args[1] { + continue + } + y4 := o2.Args[1] + if y4.Op != OpARM64MOVDnop { + continue + } + x4 := y4.Args[0] + if x4.Op != OpARM64MOVBUload { + continue + } + i3 := x4.AuxInt + if x4.Aux != s { + continue + } + _ = x4.Args[1] + if p != x4.Args[0] || mem != x4.Args[1] { + continue + } + y5 := o1.Args[1] + if y5.Op != OpARM64MOVDnop { + continue + } + x5 := y5.Args[0] + if x5.Op != OpARM64MOVBUload { + continue + } + i2 := x5.AuxInt + if x5.Aux != s { + continue + } + _ = x5.Args[1] + if p != x5.Args[0] || mem != x5.Args[1] { + continue + } + y6 := o0.Args[1] + if y6.Op != OpARM64MOVDnop { + continue + } + x6 := y6.Args[0] + if x6.Op != OpARM64MOVBUload { + continue + } + i1 := x6.AuxInt + if x6.Aux != s { + continue + } + _ = x6.Args[1] + if p != x6.Args[0] || mem != x6.Args[1] { + continue + } + y7 := v.Args[1^_i0] + if y7.Op != OpARM64MOVDnop { + continue + } + x7 := y7.Args[0] + if x7.Op != OpARM64MOVBUload { + continue + } + i0 := x7.AuxInt + if x7.Aux != s { + continue + } + _ = x7.Args[1] + if p != x7.Args[0] || mem != x7.Args[1] || !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0)) { + continue + } + b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) + v0 := b.NewValue0(x7.Pos, OpARM64MOVDload, t) + v.reset(OpCopy) + v.AddArg(v0) + v0.Aux = s + v1 := b.NewValue0(x7.Pos, OpOffPtr, p.Type) + v1.AuxInt = i0 + v1.AddArg(p) + v0.AddArg(v1) + v0.AddArg(mem) + return true } - y3 := o0.Args[1] - if y3.Op != OpARM64MOVDnop { - break + break + } + // match: (OR o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUload [7] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [6] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [5] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [4] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [3] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [2] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) y7:(MOVDnop x7:(MOVBUloadidx ptr0 idx0 mem))) + // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) + // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (MOVDloadidx ptr0 idx0 mem) + for { + t := v.Type + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + o0 := v.Args[_i0] + if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { + continue + } + _ = o0.Args[1] + o1 := o0.Args[0] + if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { + continue + } + _ = o1.Args[1] + o2 := o1.Args[0] + if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 24 { + continue + } + _ = o2.Args[1] + o3 := o2.Args[0] + if o3.Op != OpARM64ORshiftLL || o3.AuxInt != 32 { + continue + } + _ = o3.Args[1] + o4 := o3.Args[0] + if o4.Op != OpARM64ORshiftLL || o4.AuxInt != 40 { + continue + } + _ = o4.Args[1] + o5 := o4.Args[0] + if o5.Op != OpARM64ORshiftLL || o5.AuxInt != 48 { + continue + } + _ = o5.Args[1] + s0 := o5.Args[0] + if s0.Op != OpARM64SLLconst || s0.AuxInt != 56 { + continue + } + y0 := s0.Args[0] + if y0.Op != OpARM64MOVDnop { + continue + } + x0 := y0.Args[0] + if x0.Op != OpARM64MOVBUload || x0.AuxInt != 7 { + continue + } + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + y1 := o5.Args[1] + if y1.Op != OpARM64MOVDnop { + continue + } + x1 := y1.Args[0] + if x1.Op != OpARM64MOVBUload || x1.AuxInt != 6 || x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] { + continue + } + y2 := o4.Args[1] + if y2.Op != OpARM64MOVDnop { + continue + } + x2 := y2.Args[0] + if x2.Op != OpARM64MOVBUload || x2.AuxInt != 5 || x2.Aux != s { + continue + } + _ = x2.Args[1] + if p != x2.Args[0] || mem != x2.Args[1] { + continue + } + y3 := o3.Args[1] + if y3.Op != OpARM64MOVDnop { + continue + } + x3 := y3.Args[0] + if x3.Op != OpARM64MOVBUload || x3.AuxInt != 4 || x3.Aux != s { + continue + } + _ = x3.Args[1] + if p != x3.Args[0] || mem != x3.Args[1] { + continue + } + y4 := o2.Args[1] + if y4.Op != OpARM64MOVDnop { + continue + } + x4 := y4.Args[0] + if x4.Op != OpARM64MOVBUload || x4.AuxInt != 3 || x4.Aux != s { + continue + } + _ = x4.Args[1] + if p != x4.Args[0] || mem != x4.Args[1] { + continue + } + y5 := o1.Args[1] + if y5.Op != OpARM64MOVDnop { + continue + } + x5 := y5.Args[0] + if x5.Op != OpARM64MOVBUload || x5.AuxInt != 2 || x5.Aux != s { + continue + } + _ = x5.Args[1] + if p != x5.Args[0] || mem != x5.Args[1] { + continue + } + y6 := o0.Args[1] + if y6.Op != OpARM64MOVDnop { + continue + } + x6 := y6.Args[0] + if x6.Op != OpARM64MOVBUload || x6.AuxInt != 1 || x6.Aux != s { + continue + } + _ = x6.Args[1] + p1 := x6.Args[0] + if p1.Op != OpARM64ADD { + continue + } + _ = p1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + ptr1 := p1.Args[_i1] + idx1 := p1.Args[1^_i1] + if mem != x6.Args[1] { + continue + } + y7 := v.Args[1^_i0] + if y7.Op != OpARM64MOVDnop { + continue + } + x7 := y7.Args[0] + if x7.Op != OpARM64MOVBUloadidx { + continue + } + _ = x7.Args[2] + ptr0 := x7.Args[0] + idx0 := x7.Args[1] + if mem != x7.Args[2] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0)) { + continue + } + b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) + v0 := b.NewValue0(x6.Pos, OpARM64MOVDloadidx, t) + v.reset(OpCopy) + v.AddArg(v0) + v0.AddArg(ptr0) + v0.AddArg(idx0) + v0.AddArg(mem) + return true + } + } + break + } + // match: (OR o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUloadidx ptr (ADDconst [7] idx) mem))) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [6] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [5] idx) mem))) y3:(MOVDnop x3:(MOVBUloadidx ptr (ADDconst [4] idx) mem))) y4:(MOVDnop x4:(MOVBUloadidx ptr (ADDconst [3] idx) mem))) y5:(MOVDnop x5:(MOVBUloadidx ptr (ADDconst [2] idx) mem))) y6:(MOVDnop x6:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) y7:(MOVDnop x7:(MOVBUloadidx ptr idx mem))) + // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) + // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (MOVDloadidx ptr idx mem) + for { + t := v.Type + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + o0 := v.Args[_i0] + if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { + continue + } + _ = o0.Args[1] + o1 := o0.Args[0] + if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { + continue + } + _ = o1.Args[1] + o2 := o1.Args[0] + if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 24 { + continue + } + _ = o2.Args[1] + o3 := o2.Args[0] + if o3.Op != OpARM64ORshiftLL || o3.AuxInt != 32 { + continue + } + _ = o3.Args[1] + o4 := o3.Args[0] + if o4.Op != OpARM64ORshiftLL || o4.AuxInt != 40 { + continue + } + _ = o4.Args[1] + o5 := o4.Args[0] + if o5.Op != OpARM64ORshiftLL || o5.AuxInt != 48 { + continue + } + _ = o5.Args[1] + s0 := o5.Args[0] + if s0.Op != OpARM64SLLconst || s0.AuxInt != 56 { + continue + } + y0 := s0.Args[0] + if y0.Op != OpARM64MOVDnop { + continue + } + x0 := y0.Args[0] + if x0.Op != OpARM64MOVBUloadidx { + continue + } + mem := x0.Args[2] + ptr := x0.Args[0] + x0_1 := x0.Args[1] + if x0_1.Op != OpARM64ADDconst || x0_1.AuxInt != 7 { + continue + } + idx := x0_1.Args[0] + y1 := o5.Args[1] + if y1.Op != OpARM64MOVDnop { + continue + } + x1 := y1.Args[0] + if x1.Op != OpARM64MOVBUloadidx { + continue + } + _ = x1.Args[2] + if ptr != x1.Args[0] { + continue + } + x1_1 := x1.Args[1] + if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 6 || idx != x1_1.Args[0] || mem != x1.Args[2] { + continue + } + y2 := o4.Args[1] + if y2.Op != OpARM64MOVDnop { + continue + } + x2 := y2.Args[0] + if x2.Op != OpARM64MOVBUloadidx { + continue + } + _ = x2.Args[2] + if ptr != x2.Args[0] { + continue + } + x2_1 := x2.Args[1] + if x2_1.Op != OpARM64ADDconst || x2_1.AuxInt != 5 || idx != x2_1.Args[0] || mem != x2.Args[2] { + continue + } + y3 := o3.Args[1] + if y3.Op != OpARM64MOVDnop { + continue + } + x3 := y3.Args[0] + if x3.Op != OpARM64MOVBUloadidx { + continue + } + _ = x3.Args[2] + if ptr != x3.Args[0] { + continue + } + x3_1 := x3.Args[1] + if x3_1.Op != OpARM64ADDconst || x3_1.AuxInt != 4 || idx != x3_1.Args[0] || mem != x3.Args[2] { + continue + } + y4 := o2.Args[1] + if y4.Op != OpARM64MOVDnop { + continue + } + x4 := y4.Args[0] + if x4.Op != OpARM64MOVBUloadidx { + continue + } + _ = x4.Args[2] + if ptr != x4.Args[0] { + continue + } + x4_1 := x4.Args[1] + if x4_1.Op != OpARM64ADDconst || x4_1.AuxInt != 3 || idx != x4_1.Args[0] || mem != x4.Args[2] { + continue + } + y5 := o1.Args[1] + if y5.Op != OpARM64MOVDnop { + continue + } + x5 := y5.Args[0] + if x5.Op != OpARM64MOVBUloadidx { + continue + } + _ = x5.Args[2] + if ptr != x5.Args[0] { + continue + } + x5_1 := x5.Args[1] + if x5_1.Op != OpARM64ADDconst || x5_1.AuxInt != 2 || idx != x5_1.Args[0] || mem != x5.Args[2] { + continue + } + y6 := o0.Args[1] + if y6.Op != OpARM64MOVDnop { + continue + } + x6 := y6.Args[0] + if x6.Op != OpARM64MOVBUloadidx { + continue + } + _ = x6.Args[2] + if ptr != x6.Args[0] { + continue + } + x6_1 := x6.Args[1] + if x6_1.Op != OpARM64ADDconst || x6_1.AuxInt != 1 || idx != x6_1.Args[0] || mem != x6.Args[2] { + continue + } + y7 := v.Args[1^_i0] + if y7.Op != OpARM64MOVDnop { + continue + } + x7 := y7.Args[0] + if x7.Op != OpARM64MOVBUloadidx { + continue + } + _ = x7.Args[2] + if ptr != x7.Args[0] || idx != x7.Args[1] || mem != x7.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0)) { + continue + } + b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) + v0 := b.NewValue0(v.Pos, OpARM64MOVDloadidx, t) + v.reset(OpCopy) + v.AddArg(v0) + v0.AddArg(ptr) + v0.AddArg(idx) + v0.AddArg(mem) + return true } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload || x3.AuxInt != 6 || x3.Aux != s { - break + break + } + // match: (OR o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUload [i0] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i1] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i3] {s} p mem))) + // cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0) + // result: @mergePoint(b,x0,x1,x2,x3) (REVW (MOVWUload {s} (OffPtr [i0] p) mem)) + for { + t := v.Type + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + o0 := v.Args[_i0] + if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { + continue + } + _ = o0.Args[1] + o1 := o0.Args[0] + if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { + continue + } + _ = o1.Args[1] + s0 := o1.Args[0] + if s0.Op != OpARM64SLLconst || s0.AuxInt != 24 { + continue + } + y0 := s0.Args[0] + if y0.Op != OpARM64MOVDnop { + continue + } + x0 := y0.Args[0] + if x0.Op != OpARM64MOVBUload { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + y1 := o1.Args[1] + if y1.Op != OpARM64MOVDnop { + continue + } + x1 := y1.Args[0] + if x1.Op != OpARM64MOVBUload { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] { + continue + } + y2 := o0.Args[1] + if y2.Op != OpARM64MOVDnop { + continue + } + x2 := y2.Args[0] + if x2.Op != OpARM64MOVBUload { + continue + } + i2 := x2.AuxInt + if x2.Aux != s { + continue + } + _ = x2.Args[1] + if p != x2.Args[0] || mem != x2.Args[1] { + continue + } + y3 := v.Args[1^_i0] + if y3.Op != OpARM64MOVDnop { + continue + } + x3 := y3.Args[0] + if x3.Op != OpARM64MOVBUload { + continue + } + i3 := x3.AuxInt + if x3.Aux != s { + continue + } + _ = x3.Args[1] + if p != x3.Args[0] || mem != x3.Args[1] || !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0)) { + continue + } + b = mergePoint(b, x0, x1, x2, x3) + v0 := b.NewValue0(x3.Pos, OpARM64REVW, t) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x3.Pos, OpARM64MOVWUload, t) + v1.Aux = s + v2 := b.NewValue0(x3.Pos, OpOffPtr, p.Type) + v2.AuxInt = i0 + v2.AddArg(p) + v1.AddArg(v2) + v1.AddArg(mem) + v0.AddArg(v1) + return true } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { - break + break + } + // match: (OR o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUloadidx ptr0 idx0 mem))) y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) y2:(MOVDnop x2:(MOVBUload [2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [3] {s} p mem))) + // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0) + // result: @mergePoint(b,x0,x1,x2,x3) (REVW (MOVWUloadidx ptr0 idx0 mem)) + for { + t := v.Type + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + o0 := v.Args[_i0] + if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { + continue + } + _ = o0.Args[1] + o1 := o0.Args[0] + if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { + continue + } + _ = o1.Args[1] + s0 := o1.Args[0] + if s0.Op != OpARM64SLLconst || s0.AuxInt != 24 { + continue + } + y0 := s0.Args[0] + if y0.Op != OpARM64MOVDnop { + continue + } + x0 := y0.Args[0] + if x0.Op != OpARM64MOVBUloadidx { + continue + } + mem := x0.Args[2] + ptr0 := x0.Args[0] + idx0 := x0.Args[1] + y1 := o1.Args[1] + if y1.Op != OpARM64MOVDnop { + continue + } + x1 := y1.Args[0] + if x1.Op != OpARM64MOVBUload || x1.AuxInt != 1 { + continue + } + s := x1.Aux + _ = x1.Args[1] + p1 := x1.Args[0] + if p1.Op != OpARM64ADD { + continue + } + _ = p1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + ptr1 := p1.Args[_i1] + idx1 := p1.Args[1^_i1] + if mem != x1.Args[1] { + continue + } + y2 := o0.Args[1] + if y2.Op != OpARM64MOVDnop { + continue + } + x2 := y2.Args[0] + if x2.Op != OpARM64MOVBUload || x2.AuxInt != 2 || x2.Aux != s { + continue + } + _ = x2.Args[1] + p := x2.Args[0] + if mem != x2.Args[1] { + continue + } + y3 := v.Args[1^_i0] + if y3.Op != OpARM64MOVDnop { + continue + } + x3 := y3.Args[0] + if x3.Op != OpARM64MOVBUload || x3.AuxInt != 3 || x3.Aux != s { + continue + } + _ = x3.Args[1] + if p != x3.Args[0] || mem != x3.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0)) { + continue + } + b = mergePoint(b, x0, x1, x2, x3) + v0 := b.NewValue0(x3.Pos, OpARM64REVW, t) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x3.Pos, OpARM64MOVWUloadidx, t) + v1.AddArg(ptr0) + v1.AddArg(idx0) + v1.AddArg(mem) + v0.AddArg(v1) + return true + } + } + break + } + return false +} +func rewriteValueARM64_OpARM64OR_20(v *Value) bool { + b := v.Block + // match: (OR o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUloadidx ptr idx mem))) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [2] idx) mem))) y3:(MOVDnop x3:(MOVBUloadidx ptr (ADDconst [3] idx) mem))) + // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0) + // result: @mergePoint(b,x0,x1,x2,x3) (REVW (MOVWUloadidx ptr idx mem)) + for { + t := v.Type + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + o0 := v.Args[_i0] + if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { + continue + } + _ = o0.Args[1] + o1 := o0.Args[0] + if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { + continue + } + _ = o1.Args[1] + s0 := o1.Args[0] + if s0.Op != OpARM64SLLconst || s0.AuxInt != 24 { + continue + } + y0 := s0.Args[0] + if y0.Op != OpARM64MOVDnop { + continue + } + x0 := y0.Args[0] + if x0.Op != OpARM64MOVBUloadidx { + continue + } + mem := x0.Args[2] + ptr := x0.Args[0] + idx := x0.Args[1] + y1 := o1.Args[1] + if y1.Op != OpARM64MOVDnop { + continue + } + x1 := y1.Args[0] + if x1.Op != OpARM64MOVBUloadidx { + continue + } + _ = x1.Args[2] + if ptr != x1.Args[0] { + continue + } + x1_1 := x1.Args[1] + if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 1 || idx != x1_1.Args[0] || mem != x1.Args[2] { + continue + } + y2 := o0.Args[1] + if y2.Op != OpARM64MOVDnop { + continue + } + x2 := y2.Args[0] + if x2.Op != OpARM64MOVBUloadidx { + continue + } + _ = x2.Args[2] + if ptr != x2.Args[0] { + continue + } + x2_1 := x2.Args[1] + if x2_1.Op != OpARM64ADDconst || x2_1.AuxInt != 2 || idx != x2_1.Args[0] || mem != x2.Args[2] { + continue + } + y3 := v.Args[1^_i0] + if y3.Op != OpARM64MOVDnop { + continue + } + x3 := y3.Args[0] + if x3.Op != OpARM64MOVBUloadidx { + continue + } + _ = x3.Args[2] + if ptr != x3.Args[0] { + continue + } + x3_1 := x3.Args[1] + if x3_1.Op != OpARM64ADDconst || x3_1.AuxInt != 3 || idx != x3_1.Args[0] || mem != x3.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0)) { + continue + } + b = mergePoint(b, x0, x1, x2, x3) + v0 := b.NewValue0(v.Pos, OpARM64REVW, t) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpARM64MOVWUloadidx, t) + v1.AddArg(ptr) + v1.AddArg(idx) + v1.AddArg(mem) + v0.AddArg(v1) + return true } - y4 := v.Args[1] - if y4.Op != OpARM64MOVDnop { - break + break + } + // match: (OR o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUload [i0] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i1] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i3] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [i4] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [i5] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [i6] {s} p mem))) y7:(MOVDnop x7:(MOVBUload [i7] {s} p mem))) + // cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) + // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV (MOVDload {s} (OffPtr [i0] p) mem)) + for { + t := v.Type + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + o0 := v.Args[_i0] + if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { + continue + } + _ = o0.Args[1] + o1 := o0.Args[0] + if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { + continue + } + _ = o1.Args[1] + o2 := o1.Args[0] + if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 24 { + continue + } + _ = o2.Args[1] + o3 := o2.Args[0] + if o3.Op != OpARM64ORshiftLL || o3.AuxInt != 32 { + continue + } + _ = o3.Args[1] + o4 := o3.Args[0] + if o4.Op != OpARM64ORshiftLL || o4.AuxInt != 40 { + continue + } + _ = o4.Args[1] + o5 := o4.Args[0] + if o5.Op != OpARM64ORshiftLL || o5.AuxInt != 48 { + continue + } + _ = o5.Args[1] + s0 := o5.Args[0] + if s0.Op != OpARM64SLLconst || s0.AuxInt != 56 { + continue + } + y0 := s0.Args[0] + if y0.Op != OpARM64MOVDnop { + continue + } + x0 := y0.Args[0] + if x0.Op != OpARM64MOVBUload { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + y1 := o5.Args[1] + if y1.Op != OpARM64MOVDnop { + continue + } + x1 := y1.Args[0] + if x1.Op != OpARM64MOVBUload { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] { + continue + } + y2 := o4.Args[1] + if y2.Op != OpARM64MOVDnop { + continue + } + x2 := y2.Args[0] + if x2.Op != OpARM64MOVBUload { + continue + } + i2 := x2.AuxInt + if x2.Aux != s { + continue + } + _ = x2.Args[1] + if p != x2.Args[0] || mem != x2.Args[1] { + continue + } + y3 := o3.Args[1] + if y3.Op != OpARM64MOVDnop { + continue + } + x3 := y3.Args[0] + if x3.Op != OpARM64MOVBUload { + continue + } + i3 := x3.AuxInt + if x3.Aux != s { + continue + } + _ = x3.Args[1] + if p != x3.Args[0] || mem != x3.Args[1] { + continue + } + y4 := o2.Args[1] + if y4.Op != OpARM64MOVDnop { + continue + } + x4 := y4.Args[0] + if x4.Op != OpARM64MOVBUload { + continue + } + i4 := x4.AuxInt + if x4.Aux != s { + continue + } + _ = x4.Args[1] + if p != x4.Args[0] || mem != x4.Args[1] { + continue + } + y5 := o1.Args[1] + if y5.Op != OpARM64MOVDnop { + continue + } + x5 := y5.Args[0] + if x5.Op != OpARM64MOVBUload { + continue + } + i5 := x5.AuxInt + if x5.Aux != s { + continue + } + _ = x5.Args[1] + if p != x5.Args[0] || mem != x5.Args[1] { + continue + } + y6 := o0.Args[1] + if y6.Op != OpARM64MOVDnop { + continue + } + x6 := y6.Args[0] + if x6.Op != OpARM64MOVBUload { + continue + } + i6 := x6.AuxInt + if x6.Aux != s { + continue + } + _ = x6.Args[1] + if p != x6.Args[0] || mem != x6.Args[1] { + continue + } + y7 := v.Args[1^_i0] + if y7.Op != OpARM64MOVDnop { + continue + } + x7 := y7.Args[0] + if x7.Op != OpARM64MOVBUload { + continue + } + i7 := x7.AuxInt + if x7.Aux != s { + continue + } + _ = x7.Args[1] + if p != x7.Args[0] || mem != x7.Args[1] || !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0)) { + continue + } + b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) + v0 := b.NewValue0(x7.Pos, OpARM64REV, t) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x7.Pos, OpARM64MOVDload, t) + v1.Aux = s + v2 := b.NewValue0(x7.Pos, OpOffPtr, p.Type) + v2.AuxInt = i0 + v2.AddArg(p) + v1.AddArg(v2) + v1.AddArg(mem) + v0.AddArg(v1) + return true } - x4 := y4.Args[0] - if x4.Op != OpARM64MOVBUload || x4.AuxInt != 7 || x4.Aux != s { - break + break + } + // match: (OR o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUloadidx ptr0 idx0 mem))) y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) y2:(MOVDnop x2:(MOVBUload [2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [3] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [4] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [5] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [6] {s} p mem))) y7:(MOVDnop x7:(MOVBUload [7] {s} p mem))) + // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) + // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV (MOVDloadidx ptr0 idx0 mem)) + for { + t := v.Type + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + o0 := v.Args[_i0] + if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { + continue + } + _ = o0.Args[1] + o1 := o0.Args[0] + if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { + continue + } + _ = o1.Args[1] + o2 := o1.Args[0] + if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 24 { + continue + } + _ = o2.Args[1] + o3 := o2.Args[0] + if o3.Op != OpARM64ORshiftLL || o3.AuxInt != 32 { + continue + } + _ = o3.Args[1] + o4 := o3.Args[0] + if o4.Op != OpARM64ORshiftLL || o4.AuxInt != 40 { + continue + } + _ = o4.Args[1] + o5 := o4.Args[0] + if o5.Op != OpARM64ORshiftLL || o5.AuxInt != 48 { + continue + } + _ = o5.Args[1] + s0 := o5.Args[0] + if s0.Op != OpARM64SLLconst || s0.AuxInt != 56 { + continue + } + y0 := s0.Args[0] + if y0.Op != OpARM64MOVDnop { + continue + } + x0 := y0.Args[0] + if x0.Op != OpARM64MOVBUloadidx { + continue + } + mem := x0.Args[2] + ptr0 := x0.Args[0] + idx0 := x0.Args[1] + y1 := o5.Args[1] + if y1.Op != OpARM64MOVDnop { + continue + } + x1 := y1.Args[0] + if x1.Op != OpARM64MOVBUload || x1.AuxInt != 1 { + continue + } + s := x1.Aux + _ = x1.Args[1] + p1 := x1.Args[0] + if p1.Op != OpARM64ADD { + continue + } + _ = p1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + ptr1 := p1.Args[_i1] + idx1 := p1.Args[1^_i1] + if mem != x1.Args[1] { + continue + } + y2 := o4.Args[1] + if y2.Op != OpARM64MOVDnop { + continue + } + x2 := y2.Args[0] + if x2.Op != OpARM64MOVBUload || x2.AuxInt != 2 || x2.Aux != s { + continue + } + _ = x2.Args[1] + p := x2.Args[0] + if mem != x2.Args[1] { + continue + } + y3 := o3.Args[1] + if y3.Op != OpARM64MOVDnop { + continue + } + x3 := y3.Args[0] + if x3.Op != OpARM64MOVBUload || x3.AuxInt != 3 || x3.Aux != s { + continue + } + _ = x3.Args[1] + if p != x3.Args[0] || mem != x3.Args[1] { + continue + } + y4 := o2.Args[1] + if y4.Op != OpARM64MOVDnop { + continue + } + x4 := y4.Args[0] + if x4.Op != OpARM64MOVBUload || x4.AuxInt != 4 || x4.Aux != s { + continue + } + _ = x4.Args[1] + if p != x4.Args[0] || mem != x4.Args[1] { + continue + } + y5 := o1.Args[1] + if y5.Op != OpARM64MOVDnop { + continue + } + x5 := y5.Args[0] + if x5.Op != OpARM64MOVBUload || x5.AuxInt != 5 || x5.Aux != s { + continue + } + _ = x5.Args[1] + if p != x5.Args[0] || mem != x5.Args[1] { + continue + } + y6 := o0.Args[1] + if y6.Op != OpARM64MOVDnop { + continue + } + x6 := y6.Args[0] + if x6.Op != OpARM64MOVBUload || x6.AuxInt != 6 || x6.Aux != s { + continue + } + _ = x6.Args[1] + if p != x6.Args[0] || mem != x6.Args[1] { + continue + } + y7 := v.Args[1^_i0] + if y7.Op != OpARM64MOVDnop { + continue + } + x7 := y7.Args[0] + if x7.Op != OpARM64MOVBUload || x7.AuxInt != 7 || x7.Aux != s { + continue + } + _ = x7.Args[1] + if p != x7.Args[0] || mem != x7.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0)) { + continue + } + b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) + v0 := b.NewValue0(x7.Pos, OpARM64REV, t) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x7.Pos, OpARM64MOVDloadidx, t) + v1.AddArg(ptr0) + v1.AddArg(idx0) + v1.AddArg(mem) + v0.AddArg(v1) + return true + } + } + break + } + // match: (OR o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUloadidx ptr idx mem))) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [2] idx) mem))) y3:(MOVDnop x3:(MOVBUloadidx ptr (ADDconst [3] idx) mem))) y4:(MOVDnop x4:(MOVBUloadidx ptr (ADDconst [4] idx) mem))) y5:(MOVDnop x5:(MOVBUloadidx ptr (ADDconst [5] idx) mem))) y6:(MOVDnop x6:(MOVBUloadidx ptr (ADDconst [6] idx) mem))) y7:(MOVDnop x7:(MOVBUloadidx ptr (ADDconst [7] idx) mem))) + // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) + // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV (MOVDloadidx ptr idx mem)) + for { + t := v.Type + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + o0 := v.Args[_i0] + if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 8 { + continue + } + _ = o0.Args[1] + o1 := o0.Args[0] + if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { + continue + } + _ = o1.Args[1] + o2 := o1.Args[0] + if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 24 { + continue + } + _ = o2.Args[1] + o3 := o2.Args[0] + if o3.Op != OpARM64ORshiftLL || o3.AuxInt != 32 { + continue + } + _ = o3.Args[1] + o4 := o3.Args[0] + if o4.Op != OpARM64ORshiftLL || o4.AuxInt != 40 { + continue + } + _ = o4.Args[1] + o5 := o4.Args[0] + if o5.Op != OpARM64ORshiftLL || o5.AuxInt != 48 { + continue + } + _ = o5.Args[1] + s0 := o5.Args[0] + if s0.Op != OpARM64SLLconst || s0.AuxInt != 56 { + continue + } + y0 := s0.Args[0] + if y0.Op != OpARM64MOVDnop { + continue + } + x0 := y0.Args[0] + if x0.Op != OpARM64MOVBUloadidx { + continue + } + mem := x0.Args[2] + ptr := x0.Args[0] + idx := x0.Args[1] + y1 := o5.Args[1] + if y1.Op != OpARM64MOVDnop { + continue + } + x1 := y1.Args[0] + if x1.Op != OpARM64MOVBUloadidx { + continue + } + _ = x1.Args[2] + if ptr != x1.Args[0] { + continue + } + x1_1 := x1.Args[1] + if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 1 || idx != x1_1.Args[0] || mem != x1.Args[2] { + continue + } + y2 := o4.Args[1] + if y2.Op != OpARM64MOVDnop { + continue + } + x2 := y2.Args[0] + if x2.Op != OpARM64MOVBUloadidx { + continue + } + _ = x2.Args[2] + if ptr != x2.Args[0] { + continue + } + x2_1 := x2.Args[1] + if x2_1.Op != OpARM64ADDconst || x2_1.AuxInt != 2 || idx != x2_1.Args[0] || mem != x2.Args[2] { + continue + } + y3 := o3.Args[1] + if y3.Op != OpARM64MOVDnop { + continue + } + x3 := y3.Args[0] + if x3.Op != OpARM64MOVBUloadidx { + continue + } + _ = x3.Args[2] + if ptr != x3.Args[0] { + continue + } + x3_1 := x3.Args[1] + if x3_1.Op != OpARM64ADDconst || x3_1.AuxInt != 3 || idx != x3_1.Args[0] || mem != x3.Args[2] { + continue + } + y4 := o2.Args[1] + if y4.Op != OpARM64MOVDnop { + continue + } + x4 := y4.Args[0] + if x4.Op != OpARM64MOVBUloadidx { + continue + } + _ = x4.Args[2] + if ptr != x4.Args[0] { + continue + } + x4_1 := x4.Args[1] + if x4_1.Op != OpARM64ADDconst || x4_1.AuxInt != 4 || idx != x4_1.Args[0] || mem != x4.Args[2] { + continue + } + y5 := o1.Args[1] + if y5.Op != OpARM64MOVDnop { + continue + } + x5 := y5.Args[0] + if x5.Op != OpARM64MOVBUloadidx { + continue + } + _ = x5.Args[2] + if ptr != x5.Args[0] { + continue + } + x5_1 := x5.Args[1] + if x5_1.Op != OpARM64ADDconst || x5_1.AuxInt != 5 || idx != x5_1.Args[0] || mem != x5.Args[2] { + continue + } + y6 := o0.Args[1] + if y6.Op != OpARM64MOVDnop { + continue + } + x6 := y6.Args[0] + if x6.Op != OpARM64MOVBUloadidx { + continue + } + _ = x6.Args[2] + if ptr != x6.Args[0] { + continue + } + x6_1 := x6.Args[1] + if x6_1.Op != OpARM64ADDconst || x6_1.AuxInt != 6 || idx != x6_1.Args[0] || mem != x6.Args[2] { + continue + } + y7 := v.Args[1^_i0] + if y7.Op != OpARM64MOVDnop { + continue + } + x7 := y7.Args[0] + if x7.Op != OpARM64MOVBUloadidx { + continue + } + _ = x7.Args[2] + if ptr != x7.Args[0] { + continue + } + x7_1 := x7.Args[1] + if x7_1.Op != OpARM64ADDconst || x7_1.AuxInt != 7 || idx != x7_1.Args[0] || mem != x7.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0)) { + continue + } + b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) + v0 := b.NewValue0(v.Pos, OpARM64REV, t) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpARM64MOVDloadidx, t) + v1.AddArg(ptr) + v1.AddArg(idx) + v1.AddArg(mem) + v0.AddArg(v1) + return true } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2)) { + break + } + return false +} +func rewriteValueARM64_OpARM64ORN_0(v *Value) bool { + // match: (ORN x (MOVDconst [c])) + // result: (ORconst [^c] x) + for { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - b = mergePoint(b, x0, x1, x2, x3, x4) - v0 := b.NewValue0(x4.Pos, OpARM64MOVDloadidx, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AddArg(ptr0) - v0.AddArg(idx0) - v0.AddArg(mem) + c := v_1.AuxInt + v.reset(OpARM64ORconst) + v.AuxInt = ^c + v.AddArg(x) return true } - // match: (ORshiftLL [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32] x0:(MOVWUloadidx4 ptr0 idx0 mem) y1:(MOVDnop x1:(MOVBUload [4] {s} p1:(ADDshiftLL [2] ptr1 idx1) mem))) y2:(MOVDnop x2:(MOVBUload [5] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [6] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [7] {s} p mem))) - // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4) != nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2) - // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDloadidx ptr0 (SLLconst [2] idx0) mem) + // match: (ORN x x) + // result: (MOVDconst [-1]) for { - t := v.Type - if v.AuxInt != 56 { + x := v.Args[1] + if x != v.Args[0] { break } + v.reset(OpARM64MOVDconst) + v.AuxInt = -1 + return true + } + // match: (ORN x0 x1:(SLLconst [c] y)) + // cond: clobberIfDead(x1) + // result: (ORNshiftLL x0 y [c]) + for { _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 48 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 40 { + x0 := v.Args[0] + x1 := v.Args[1] + if x1.Op != OpARM64SLLconst { break } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 32 { + c := x1.AuxInt + y := x1.Args[0] + if !(clobberIfDead(x1)) { break } - _ = o2.Args[1] - x0 := o2.Args[0] - if x0.Op != OpARM64MOVWUloadidx4 { + v.reset(OpARM64ORNshiftLL) + v.AuxInt = c + v.AddArg(x0) + v.AddArg(y) + return true + } + // match: (ORN x0 x1:(SRLconst [c] y)) + // cond: clobberIfDead(x1) + // result: (ORNshiftRL x0 y [c]) + for { + _ = v.Args[1] + x0 := v.Args[0] + x1 := v.Args[1] + if x1.Op != OpARM64SRLconst { break } - mem := x0.Args[2] - ptr0 := x0.Args[0] - idx0 := x0.Args[1] - y1 := o2.Args[1] - if y1.Op != OpARM64MOVDnop { + c := x1.AuxInt + y := x1.Args[0] + if !(clobberIfDead(x1)) { break } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 4 { + v.reset(OpARM64ORNshiftRL) + v.AuxInt = c + v.AddArg(x0) + v.AddArg(y) + return true + } + // match: (ORN x0 x1:(SRAconst [c] y)) + // cond: clobberIfDead(x1) + // result: (ORNshiftRA x0 y [c]) + for { + _ = v.Args[1] + x0 := v.Args[0] + x1 := v.Args[1] + if x1.Op != OpARM64SRAconst { break } - s := x1.Aux - _ = x1.Args[1] - p1 := x1.Args[0] - if p1.Op != OpARM64ADDshiftLL || p1.AuxInt != 2 { + c := x1.AuxInt + y := x1.Args[0] + if !(clobberIfDead(x1)) { break } - idx1 := p1.Args[1] - ptr1 := p1.Args[0] - if mem != x1.Args[1] { + v.reset(OpARM64ORNshiftRA) + v.AuxInt = c + v.AddArg(x0) + v.AddArg(y) + return true + } + return false +} +func rewriteValueARM64_OpARM64ORNshiftLL_0(v *Value) bool { + // match: (ORNshiftLL x (MOVDconst [c]) [d]) + // result: (ORconst x [^int64(uint64(c)<>uint64(d))]) + for { + d := v.AuxInt + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - y3 := o0.Args[1] - if y3.Op != OpARM64MOVDnop { + c := v_1.AuxInt + v.reset(OpARM64ORconst) + v.AuxInt = ^(c >> uint64(d)) + v.AddArg(x) + return true + } + // match: (ORNshiftRA x (SRAconst x [c]) [d]) + // cond: c==d + // result: (MOVDconst [-1]) + for { + d := v.AuxInt + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64SRAconst { break } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload || x3.AuxInt != 6 || x3.Aux != s { + c := v_1.AuxInt + if x != v_1.Args[0] || !(c == d) { break } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { + v.reset(OpARM64MOVDconst) + v.AuxInt = -1 + return true + } + return false +} +func rewriteValueARM64_OpARM64ORNshiftRL_0(v *Value) bool { + // match: (ORNshiftRL x (MOVDconst [c]) [d]) + // result: (ORconst x [^int64(uint64(c)>>uint64(d))]) + for { + d := v.AuxInt + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - y4 := v.Args[1] - if y4.Op != OpARM64MOVDnop { + c := v_1.AuxInt + v.reset(OpARM64ORconst) + v.AuxInt = ^int64(uint64(c) >> uint64(d)) + v.AddArg(x) + return true + } + // match: (ORNshiftRL x (SRLconst x [c]) [d]) + // cond: c==d + // result: (MOVDconst [-1]) + for { + d := v.AuxInt + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64SRLconst { break } - x4 := y4.Args[0] - if x4.Op != OpARM64MOVBUload || x4.AuxInt != 7 || x4.Aux != s { + c := v_1.AuxInt + if x != v_1.Args[0] || !(c == d) { break } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2)) { + v.reset(OpARM64MOVDconst) + v.AuxInt = -1 + return true + } + return false +} +func rewriteValueARM64_OpARM64ORconst_0(v *Value) bool { + // match: (ORconst [0] x) + // result: x + for { + if v.AuxInt != 0 { break } - b = mergePoint(b, x0, x1, x2, x3, x4) - v0 := b.NewValue0(x4.Pos, OpARM64MOVDloadidx, t) + x := v.Args[0] v.reset(OpCopy) - v.AddArg(v0) - v0.AddArg(ptr0) - v1 := b.NewValue0(x4.Pos, OpARM64SLLconst, idx0.Type) - v1.AuxInt = 2 - v1.AddArg(idx0) - v0.AddArg(v1) - v0.AddArg(mem) + v.Type = x.Type + v.AddArg(x) return true } - // match: (ORshiftLL [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32] x0:(MOVWUloadidx ptr idx mem) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [4] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [5] idx) mem))) y3:(MOVDnop x3:(MOVBUloadidx ptr (ADDconst [6] idx) mem))) y4:(MOVDnop x4:(MOVBUloadidx ptr (ADDconst [7] idx) mem))) - // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2) - // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDloadidx ptr idx mem) + // match: (ORconst [-1] _) + // result: (MOVDconst [-1]) for { - t := v.Type - if v.AuxInt != 56 { - break - } - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 48 { + if v.AuxInt != -1 { break } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 40 { + v.reset(OpARM64MOVDconst) + v.AuxInt = -1 + return true + } + // match: (ORconst [c] (MOVDconst [d])) + // result: (MOVDconst [c|d]) + for { + c := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 32 { + d := v_0.AuxInt + v.reset(OpARM64MOVDconst) + v.AuxInt = c | d + return true + } + // match: (ORconst [c] (ORconst [d] x)) + // result: (ORconst [c|d] x) + for { + c := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64ORconst { break } - _ = o2.Args[1] - x0 := o2.Args[0] - if x0.Op != OpARM64MOVWUloadidx { + d := v_0.AuxInt + x := v_0.Args[0] + v.reset(OpARM64ORconst) + v.AuxInt = c | d + v.AddArg(x) + return true + } + // match: (ORconst [c1] (ANDconst [c2] x)) + // cond: c2|c1 == ^0 + // result: (ORconst [c1] x) + for { + c1 := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64ANDconst { break } - mem := x0.Args[2] - ptr := x0.Args[0] - idx := x0.Args[1] - y1 := o2.Args[1] - if y1.Op != OpARM64MOVDnop { + c2 := v_0.AuxInt + x := v_0.Args[0] + if !(c2|c1 == ^0) { break } - x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUloadidx { + v.reset(OpARM64ORconst) + v.AuxInt = c1 + v.AddArg(x) + return true + } + return false +} +func rewriteValueARM64_OpARM64ORshiftLL_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (ORshiftLL (MOVDconst [c]) x [d]) + // result: (ORconst [c] (SLLconst x [d])) + for { + d := v.AuxInt + x := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - _ = x1.Args[2] - if ptr != x1.Args[0] { + c := v_0.AuxInt + v.reset(OpARM64ORconst) + v.AuxInt = c + v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) + v0.AuxInt = d + v0.AddArg(x) + v.AddArg(v0) + return true + } + // match: (ORshiftLL x (MOVDconst [c]) [d]) + // result: (ORconst x [int64(uint64(c)< [c] (UBFX [bfc] x) x) + // cond: c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c) + // result: (RORWconst [32-c] x) + for { + t := v.Type + c := v.AuxInt + x := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64UBFX { break } - x2_1 := x2.Args[1] - if x2_1.Op != OpARM64ADDconst || x2_1.AuxInt != 5 || idx != x2_1.Args[0] || mem != x2.Args[2] { + bfc := v_0.AuxInt + if x != v_0.Args[0] || !(c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c)) { break } - y3 := o0.Args[1] - if y3.Op != OpARM64MOVDnop { + v.reset(OpARM64RORWconst) + v.AuxInt = 32 - c + v.AddArg(x) + return true + } + // match: (ORshiftLL [8] (UBFX [armBFAuxInt(8, 8)] x) x) + // result: (REV16W x) + for { + if v.Type != typ.UInt16 || v.AuxInt != 8 { break } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUloadidx { + x := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64UBFX || v_0.Type != typ.UInt16 || v_0.AuxInt != armBFAuxInt(8, 8) || x != v_0.Args[0] { break } - _ = x3.Args[2] - if ptr != x3.Args[0] { + v.reset(OpARM64REV16W) + v.AddArg(x) + return true + } + // match: ( ORshiftLL [c] (SRLconst x [64-c]) x2) + // result: (EXTRconst [64-c] x2 x) + for { + c := v.AuxInt + x2 := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64SRLconst || v_0.AuxInt != 64-c { break } - x3_1 := x3.Args[1] - if x3_1.Op != OpARM64ADDconst || x3_1.AuxInt != 6 || idx != x3_1.Args[0] || mem != x3.Args[2] { + x := v_0.Args[0] + v.reset(OpARM64EXTRconst) + v.AuxInt = 64 - c + v.AddArg(x2) + v.AddArg(x) + return true + } + // match: ( ORshiftLL [c] (UBFX [bfc] x) x2) + // cond: c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c) + // result: (EXTRWconst [32-c] x2 x) + for { + t := v.Type + c := v.AuxInt + x2 := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64UBFX { break } - y4 := v.Args[1] - if y4.Op != OpARM64MOVDnop { + bfc := v_0.AuxInt + x := v_0.Args[0] + if !(c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c)) { break } - x4 := y4.Args[0] - if x4.Op != OpARM64MOVBUloadidx { + v.reset(OpARM64EXTRWconst) + v.AuxInt = 32 - c + v.AddArg(x2) + v.AddArg(x) + return true + } + // match: (ORshiftLL [sc] (UBFX [bfc] x) (SRLconst [sc] y)) + // cond: sc == getARM64BFwidth(bfc) + // result: (BFXIL [bfc] y x) + for { + sc := v.AuxInt + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64UBFX { break } - _ = x4.Args[2] - if ptr != x4.Args[0] { + bfc := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64SRLconst || v_1.AuxInt != sc { break } - x4_1 := x4.Args[1] - if x4_1.Op != OpARM64ADDconst || x4_1.AuxInt != 7 || idx != x4_1.Args[0] || mem != x4.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2)) { + y := v_1.Args[0] + if !(sc == getARM64BFwidth(bfc)) { break } - b = mergePoint(b, x0, x1, x2, x3, x4) - v0 := b.NewValue0(v.Pos, OpARM64MOVDloadidx, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AddArg(ptr) - v0.AddArg(idx) - v0.AddArg(mem) + v.reset(OpARM64BFXIL) + v.AuxInt = bfc + v.AddArg(y) + v.AddArg(x) return true } - // match: (ORshiftLL [8] y0:(MOVDnop x0:(MOVBUload [i1] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [i0] {s} p mem))) + // match: (ORshiftLL [8] y0:(MOVDnop x0:(MOVBUload [i0] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [i1] {s} p mem))) // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1) - // result: @mergePoint(b,x0,x1) (REV16W (MOVHUload [i0] {s} p mem)) + // result: @mergePoint(b,x0,x1) (MOVHUload {s} (OffPtr [i0] p) mem) for { t := v.Type if v.AuxInt != 8 { @@ -25576,7 +19324,7 @@ func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { if x0.Op != OpARM64MOVBUload { break } - i1 := x0.AuxInt + i0 := x0.AuxInt s := x0.Aux mem := x0.Args[1] p := x0.Args[0] @@ -25588,7 +19336,7 @@ func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { if x1.Op != OpARM64MOVBUload { break } - i0 := x1.AuxInt + i1 := x1.AuxInt if x1.Aux != s { break } @@ -25597,20 +19345,24 @@ func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { break } b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpARM64REV16W, t) + v0 := b.NewValue0(x1.Pos, OpARM64MOVHUload, t) v.reset(OpCopy) v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpARM64MOVHUload, t) + v0.Aux = s + v1 := b.NewValue0(x1.Pos, OpOffPtr, p.Type) v1.AuxInt = i0 - v1.Aux = s v1.AddArg(p) - v1.AddArg(mem) v0.AddArg(v1) + v0.AddArg(mem) return true } - // match: (ORshiftLL [8] y0:(MOVDnop x0:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem)) y1:(MOVDnop x1:(MOVBUloadidx ptr0 idx0 mem))) + return false +} +func rewriteValueARM64_OpARM64ORshiftLL_10(v *Value) bool { + b := v.Block + // match: (ORshiftLL [8] y0:(MOVDnop x0:(MOVBUloadidx ptr0 idx0 mem)) y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1) - // result: @mergePoint(b,x0,x1) (REV16W (MOVHUloadidx ptr0 idx0 mem)) + // result: @mergePoint(b,x0,x1) (MOVHUloadidx ptr0 idx0 mem) for { t := v.Type if v.AuxInt != 8 { @@ -25622,45 +19374,47 @@ func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { break } x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUload || x0.AuxInt != 1 { - break - } - s := x0.Aux - mem := x0.Args[1] - p1 := x0.Args[0] - if p1.Op != OpARM64ADD { + if x0.Op != OpARM64MOVBUloadidx { break } - idx1 := p1.Args[1] - ptr1 := p1.Args[0] + mem := x0.Args[2] + ptr0 := x0.Args[0] + idx0 := x0.Args[1] y1 := v.Args[1] if y1.Op != OpARM64MOVDnop { break } x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUloadidx { + if x1.Op != OpARM64MOVBUload || x1.AuxInt != 1 { break } - _ = x1.Args[2] - ptr0 := x1.Args[0] - idx0 := x1.Args[1] - if mem != x1.Args[2] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b, x0, x1) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1)) { + s := x1.Aux + _ = x1.Args[1] + p1 := x1.Args[0] + if p1.Op != OpARM64ADD { break } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x0.Pos, OpARM64REV16W, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpARM64MOVHUloadidx, t) - v1.AddArg(ptr0) - v1.AddArg(idx0) - v1.AddArg(mem) - v0.AddArg(v1) - return true + _ = p1.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr1 := p1.Args[_i0] + idx1 := p1.Args[1^_i0] + if mem != x1.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b, x0, x1) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(x1.Pos, OpARM64MOVHUloadidx, t) + v.reset(OpCopy) + v.AddArg(v0) + v0.AddArg(ptr0) + v0.AddArg(idx0) + v0.AddArg(mem) + return true + } + break } - // match: (ORshiftLL [8] y0:(MOVDnop x0:(MOVBUload [1] {s} p1:(ADD idx1 ptr1) mem)) y1:(MOVDnop x1:(MOVBUloadidx ptr0 idx0 mem))) - // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1) - // result: @mergePoint(b,x0,x1) (REV16W (MOVHUloadidx ptr0 idx0 mem)) + // match: (ORshiftLL [8] y0:(MOVDnop x0:(MOVBUloadidx ptr idx mem)) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) + // cond: x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1) + // result: @mergePoint(b,x0,x1) (MOVHUloadidx ptr idx mem) for { t := v.Type if v.AuxInt != 8 { @@ -25672,17 +19426,12 @@ func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { break } x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUload || x0.AuxInt != 1 { - break - } - s := x0.Aux - mem := x0.Args[1] - p1 := x0.Args[0] - if p1.Op != OpARM64ADD { + if x0.Op != OpARM64MOVBUloadidx { break } - ptr1 := p1.Args[1] - idx1 := p1.Args[0] + mem := x0.Args[2] + ptr := x0.Args[0] + idx := x0.Args[1] y1 := v.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -25692,72 +19441,157 @@ func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { break } _ = x1.Args[2] - ptr0 := x1.Args[0] - idx0 := x1.Args[1] - if mem != x1.Args[2] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b, x0, x1) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1)) { + if ptr != x1.Args[0] { + break + } + x1_1 := x1.Args[1] + if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 1 || idx != x1_1.Args[0] || mem != x1.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1)) { break } b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x0.Pos, OpARM64REV16W, t) + v0 := b.NewValue0(v.Pos, OpARM64MOVHUloadidx, t) v.reset(OpCopy) v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpARM64MOVHUloadidx, t) - v1.AddArg(ptr0) - v1.AddArg(idx0) - v1.AddArg(mem) - v0.AddArg(v1) + v0.AddArg(ptr) + v0.AddArg(idx) + v0.AddArg(mem) return true } - // match: (ORshiftLL [8] y0:(MOVDnop x0:(MOVBUloadidx ptr (ADDconst [1] idx) mem)) y1:(MOVDnop x1:(MOVBUloadidx ptr idx mem))) - // cond: x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1) - // result: @mergePoint(b,x0,x1) (REV16W (MOVHUloadidx ptr idx mem)) + // match: (ORshiftLL [24] o0:(ORshiftLL [16] x0:(MOVHUload [i0] {s} p mem) y1:(MOVDnop x1:(MOVBUload [i2] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i3] {s} p mem))) + // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y1) && clobber(y2) && clobber(o0) + // result: @mergePoint(b,x0,x1,x2) (MOVWUload {s} (OffPtr [i0] p) mem) for { t := v.Type - if v.AuxInt != 8 { + if v.AuxInt != 24 { break } _ = v.Args[1] - y0 := v.Args[0] - if y0.Op != OpARM64MOVDnop { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUloadidx { + o0 := v.Args[0] + if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 16 { break } - mem := x0.Args[2] - ptr := x0.Args[0] - x0_1 := x0.Args[1] - if x0_1.Op != OpARM64ADDconst || x0_1.AuxInt != 1 { + _ = o0.Args[1] + x0 := o0.Args[0] + if x0.Op != OpARM64MOVHUload { break } - idx := x0_1.Args[0] - y1 := v.Args[1] + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + y1 := o0.Args[1] if y1.Op != OpARM64MOVDnop { break } x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUloadidx { + if x1.Op != OpARM64MOVBUload { break } - _ = x1.Args[2] - if ptr != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1)) { + i2 := x1.AuxInt + if x1.Aux != s { break } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpARM64REV16W, t) + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] { + break + } + y2 := v.Args[1] + if y2.Op != OpARM64MOVDnop { + break + } + x2 := y2.Args[0] + if x2.Op != OpARM64MOVBUload { + break + } + i3 := x2.AuxInt + if x2.Aux != s { + break + } + _ = x2.Args[1] + if p != x2.Args[0] || mem != x2.Args[1] || !(i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y1) && clobber(y2) && clobber(o0)) { + break + } + b = mergePoint(b, x0, x1, x2) + v0 := b.NewValue0(x2.Pos, OpARM64MOVWUload, t) v.reset(OpCopy) v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpARM64MOVHUloadidx, t) - v1.AddArg(ptr) - v1.AddArg(idx) - v1.AddArg(mem) + v0.Aux = s + v1 := b.NewValue0(x2.Pos, OpOffPtr, p.Type) + v1.AuxInt = i0 + v1.AddArg(p) v0.AddArg(v1) + v0.AddArg(mem) return true } - // match: (ORshiftLL [24] o0:(ORshiftLL [16] y0:(REV16W x0:(MOVHUload [i2] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [i1] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i0] {s} p mem))) - // cond: i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (REVW (MOVWUload {s} (OffPtr [i0] p) mem)) + // match: (ORshiftLL [24] o0:(ORshiftLL [16] x0:(MOVHUloadidx ptr0 idx0 mem) y1:(MOVDnop x1:(MOVBUload [2] {s} p1:(ADD ptr1 idx1) mem))) y2:(MOVDnop x2:(MOVBUload [3] {s} p mem))) + // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y1) && clobber(y2) && clobber(o0) + // result: @mergePoint(b,x0,x1,x2) (MOVWUloadidx ptr0 idx0 mem) + for { + t := v.Type + if v.AuxInt != 24 { + break + } + _ = v.Args[1] + o0 := v.Args[0] + if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 16 { + break + } + _ = o0.Args[1] + x0 := o0.Args[0] + if x0.Op != OpARM64MOVHUloadidx { + break + } + mem := x0.Args[2] + ptr0 := x0.Args[0] + idx0 := x0.Args[1] + y1 := o0.Args[1] + if y1.Op != OpARM64MOVDnop { + break + } + x1 := y1.Args[0] + if x1.Op != OpARM64MOVBUload || x1.AuxInt != 2 { + break + } + s := x1.Aux + _ = x1.Args[1] + p1 := x1.Args[0] + if p1.Op != OpARM64ADD { + break + } + _ = p1.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr1 := p1.Args[_i0] + idx1 := p1.Args[1^_i0] + if mem != x1.Args[1] { + continue + } + y2 := v.Args[1] + if y2.Op != OpARM64MOVDnop { + continue + } + x2 := y2.Args[0] + if x2.Op != OpARM64MOVBUload || x2.AuxInt != 3 || x2.Aux != s { + continue + } + _ = x2.Args[1] + p := x2.Args[0] + if mem != x2.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y1) && clobber(y2) && clobber(o0)) { + continue + } + b = mergePoint(b, x0, x1, x2) + v0 := b.NewValue0(x2.Pos, OpARM64MOVWUloadidx, t) + v.reset(OpCopy) + v.AddArg(v0) + v0.AddArg(ptr0) + v0.AddArg(idx0) + v0.AddArg(mem) + return true + } + break + } + // match: (ORshiftLL [24] o0:(ORshiftLL [16] x0:(MOVHUloadidx ptr idx mem) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [2] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [3] idx) mem))) + // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y1) && clobber(y2) && clobber(o0) + // result: @mergePoint(b,x0,x1,x2) (MOVWUloadidx ptr idx mem) for { t := v.Type if v.AuxInt != 24 { @@ -25769,32 +19603,27 @@ func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { break } _ = o0.Args[1] - y0 := o0.Args[0] - if y0.Op != OpARM64REV16W { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVHUload { + x0 := o0.Args[0] + if x0.Op != OpARM64MOVHUloadidx { break } - i2 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] + mem := x0.Args[2] + ptr := x0.Args[0] + idx := x0.Args[1] y1 := o0.Args[1] if y1.Op != OpARM64MOVDnop { break } x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload { + if x1.Op != OpARM64MOVBUloadidx { break } - i1 := x1.AuxInt - if x1.Aux != s { + _ = x1.Args[2] + if ptr != x1.Args[0] { break } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { + x1_1 := x1.Args[1] + if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 2 || idx != x1_1.Args[0] || mem != x1.Args[2] { break } y2 := v.Args[1] @@ -25802,34 +19631,29 @@ func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { break } x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload { + if x2.Op != OpARM64MOVBUloadidx { break } - i0 := x2.AuxInt - if x2.Aux != s { + _ = x2.Args[2] + if ptr != x2.Args[0] { break } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] || !(i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(o0)) { + x2_1 := x2.Args[1] + if x2_1.Op != OpARM64ADDconst || x2_1.AuxInt != 3 || idx != x2_1.Args[0] || mem != x2.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y1) && clobber(y2) && clobber(o0)) { break } b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x2.Pos, OpARM64REVW, t) + v0 := b.NewValue0(v.Pos, OpARM64MOVWUloadidx, t) v.reset(OpCopy) v.AddArg(v0) - v1 := b.NewValue0(x2.Pos, OpARM64MOVWUload, t) - v1.Aux = s - v2 := b.NewValue0(x2.Pos, OpOffPtr, p.Type) - v2.AuxInt = i0 - v2.AddArg(p) - v1.AddArg(v2) - v1.AddArg(mem) - v0.AddArg(v1) + v0.AddArg(ptr) + v0.AddArg(idx) + v0.AddArg(mem) return true } - // match: (ORshiftLL [24] o0:(ORshiftLL [16] y0:(REV16W x0:(MOVHUload [2] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr0 idx0 mem))) - // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (REVW (MOVWUloadidx ptr0 idx0 mem)) + // match: (ORshiftLL [24] o0:(ORshiftLL [16] x0:(MOVHUloadidx2 ptr0 idx0 mem) y1:(MOVDnop x1:(MOVBUload [2] {s} p1:(ADDshiftLL [1] ptr1 idx1) mem))) y2:(MOVDnop x2:(MOVBUload [3] {s} p mem))) + // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y1) && clobber(y2) && clobber(o0) + // result: @mergePoint(b,x0,x1,x2) (MOVWUloadidx ptr0 (SLLconst [1] idx0) mem) for { t := v.Type if v.AuxInt != 24 { @@ -25841,28 +19665,25 @@ func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { break } _ = o0.Args[1] - y0 := o0.Args[0] - if y0.Op != OpARM64REV16W { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVHUload || x0.AuxInt != 2 { + x0 := o0.Args[0] + if x0.Op != OpARM64MOVHUloadidx2 { break } - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] + mem := x0.Args[2] + ptr0 := x0.Args[0] + idx0 := x0.Args[1] y1 := o0.Args[1] if y1.Op != OpARM64MOVDnop { break } x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 1 || x1.Aux != s { + if x1.Op != OpARM64MOVBUload || x1.AuxInt != 2 { break } + s := x1.Aux _ = x1.Args[1] p1 := x1.Args[0] - if p1.Op != OpARM64ADD { + if p1.Op != OpARM64ADDshiftLL || p1.AuxInt != 1 { break } idx1 := p1.Args[1] @@ -25875,169 +19696,237 @@ func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { break } x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUloadidx { + if x2.Op != OpARM64MOVBUload || x2.AuxInt != 3 || x2.Aux != s { break } - _ = x2.Args[2] - ptr0 := x2.Args[0] - idx0 := x2.Args[1] - if mem != x2.Args[2] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(o0)) { + _ = x2.Args[1] + p := x2.Args[0] + if mem != x2.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y1) && clobber(y2) && clobber(o0)) { break } b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x1.Pos, OpARM64REVW, t) + v0 := b.NewValue0(x2.Pos, OpARM64MOVWUloadidx, t) v.reset(OpCopy) v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpARM64MOVWUloadidx, t) - v1.AddArg(ptr0) + v0.AddArg(ptr0) + v1 := b.NewValue0(x2.Pos, OpARM64SLLconst, idx0.Type) + v1.AuxInt = 1 v1.AddArg(idx0) - v1.AddArg(mem) v0.AddArg(v1) + v0.AddArg(mem) return true } - // match: (ORshiftLL [24] o0:(ORshiftLL [16] y0:(REV16W x0:(MOVHUload [2] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD idx1 ptr1) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr0 idx0 mem))) - // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (REVW (MOVWUloadidx ptr0 idx0 mem)) + // match: (ORshiftLL [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32] x0:(MOVWUload [i0] {s} p mem) y1:(MOVDnop x1:(MOVBUload [i4] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i5] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i6] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [i7] {s} p mem))) + // cond: i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2) + // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDload {s} (OffPtr [i0] p) mem) for { t := v.Type - if v.AuxInt != 24 { + if v.AuxInt != 56 { break } _ = v.Args[1] o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 16 { + if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 48 { break } _ = o0.Args[1] - y0 := o0.Args[0] - if y0.Op != OpARM64REV16W { + o1 := o0.Args[0] + if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 40 { break } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVHUload || x0.AuxInt != 2 { + _ = o1.Args[1] + o2 := o1.Args[0] + if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 32 { + break + } + _ = o2.Args[1] + x0 := o2.Args[0] + if x0.Op != OpARM64MOVWUload { break } + i0 := x0.AuxInt s := x0.Aux mem := x0.Args[1] p := x0.Args[0] - y1 := o0.Args[1] + y1 := o2.Args[1] if y1.Op != OpARM64MOVDnop { break } x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 1 || x1.Aux != s { + if x1.Op != OpARM64MOVBUload { break } - _ = x1.Args[1] - p1 := x1.Args[0] - if p1.Op != OpARM64ADD { + i4 := x1.AuxInt + if x1.Aux != s { break } - ptr1 := p1.Args[1] - idx1 := p1.Args[0] - if mem != x1.Args[1] { + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] { break } - y2 := v.Args[1] + y2 := o1.Args[1] if y2.Op != OpARM64MOVDnop { break } x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUloadidx { + if x2.Op != OpARM64MOVBUload { break } - _ = x2.Args[2] - ptr0 := x2.Args[0] - idx0 := x2.Args[1] - if mem != x2.Args[2] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(o0)) { + i5 := x2.AuxInt + if x2.Aux != s { break } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x1.Pos, OpARM64REVW, t) + _ = x2.Args[1] + if p != x2.Args[0] || mem != x2.Args[1] { + break + } + y3 := o0.Args[1] + if y3.Op != OpARM64MOVDnop { + break + } + x3 := y3.Args[0] + if x3.Op != OpARM64MOVBUload { + break + } + i6 := x3.AuxInt + if x3.Aux != s { + break + } + _ = x3.Args[1] + if p != x3.Args[0] || mem != x3.Args[1] { + break + } + y4 := v.Args[1] + if y4.Op != OpARM64MOVDnop { + break + } + x4 := y4.Args[0] + if x4.Op != OpARM64MOVBUload { + break + } + i7 := x4.AuxInt + if x4.Aux != s { + break + } + _ = x4.Args[1] + if p != x4.Args[0] || mem != x4.Args[1] || !(i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2)) { + break + } + b = mergePoint(b, x0, x1, x2, x3, x4) + v0 := b.NewValue0(x4.Pos, OpARM64MOVDload, t) v.reset(OpCopy) v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpARM64MOVWUloadidx, t) - v1.AddArg(ptr0) - v1.AddArg(idx0) - v1.AddArg(mem) + v0.Aux = s + v1 := b.NewValue0(x4.Pos, OpOffPtr, p.Type) + v1.AuxInt = i0 + v1.AddArg(p) v0.AddArg(v1) + v0.AddArg(mem) return true } - return false -} -func rewriteValueARM64_OpARM64ORshiftLL_30(v *Value) bool { - b := v.Block - // match: (ORshiftLL [24] o0:(ORshiftLL [16] y0:(REV16W x0:(MOVHUloadidx ptr (ADDconst [2] idx) mem)) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr idx mem))) - // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (REVW (MOVWUloadidx ptr idx mem)) + // match: (ORshiftLL [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32] x0:(MOVWUloadidx ptr0 idx0 mem) y1:(MOVDnop x1:(MOVBUload [4] {s} p1:(ADD ptr1 idx1) mem))) y2:(MOVDnop x2:(MOVBUload [5] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [6] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [7] {s} p mem))) + // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2) + // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDloadidx ptr0 idx0 mem) for { t := v.Type - if v.AuxInt != 24 { + if v.AuxInt != 56 { break } _ = v.Args[1] o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 16 { + if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 48 { break } _ = o0.Args[1] - y0 := o0.Args[0] - if y0.Op != OpARM64REV16W { + o1 := o0.Args[0] + if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 40 { break } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVHUloadidx { + _ = o1.Args[1] + o2 := o1.Args[0] + if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 32 { break } - mem := x0.Args[2] - ptr := x0.Args[0] - x0_1 := x0.Args[1] - if x0_1.Op != OpARM64ADDconst || x0_1.AuxInt != 2 { + _ = o2.Args[1] + x0 := o2.Args[0] + if x0.Op != OpARM64MOVWUloadidx { break } - idx := x0_1.Args[0] - y1 := o0.Args[1] + mem := x0.Args[2] + ptr0 := x0.Args[0] + idx0 := x0.Args[1] + y1 := o2.Args[1] if y1.Op != OpARM64MOVDnop { break } x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUloadidx { - break - } - _ = x1.Args[2] - if ptr != x1.Args[0] { - break - } - x1_1 := x1.Args[1] - if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 1 || idx != x1_1.Args[0] || mem != x1.Args[2] { - break - } - y2 := v.Args[1] - if y2.Op != OpARM64MOVDnop { - break - } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUloadidx { - break - } - _ = x2.Args[2] - if ptr != x2.Args[0] || idx != x2.Args[1] || mem != x2.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(o0)) { + if x1.Op != OpARM64MOVBUload || x1.AuxInt != 4 { break } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(v.Pos, OpARM64REVW, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpARM64MOVWUloadidx, t) - v1.AddArg(ptr) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true + s := x1.Aux + _ = x1.Args[1] + p1 := x1.Args[0] + if p1.Op != OpARM64ADD { + break + } + _ = p1.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr1 := p1.Args[_i0] + idx1 := p1.Args[1^_i0] + if mem != x1.Args[1] { + continue + } + y2 := o1.Args[1] + if y2.Op != OpARM64MOVDnop { + continue + } + x2 := y2.Args[0] + if x2.Op != OpARM64MOVBUload || x2.AuxInt != 5 || x2.Aux != s { + continue + } + _ = x2.Args[1] + p := x2.Args[0] + if mem != x2.Args[1] { + continue + } + y3 := o0.Args[1] + if y3.Op != OpARM64MOVDnop { + continue + } + x3 := y3.Args[0] + if x3.Op != OpARM64MOVBUload || x3.AuxInt != 6 || x3.Aux != s { + continue + } + _ = x3.Args[1] + if p != x3.Args[0] || mem != x3.Args[1] { + continue + } + y4 := v.Args[1] + if y4.Op != OpARM64MOVDnop { + continue + } + x4 := y4.Args[0] + if x4.Op != OpARM64MOVBUload || x4.AuxInt != 7 || x4.Aux != s { + continue + } + _ = x4.Args[1] + if p != x4.Args[0] || mem != x4.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2)) { + continue + } + b = mergePoint(b, x0, x1, x2, x3, x4) + v0 := b.NewValue0(x4.Pos, OpARM64MOVDloadidx, t) + v.reset(OpCopy) + v.AddArg(v0) + v0.AddArg(ptr0) + v0.AddArg(idx0) + v0.AddArg(mem) + return true + } + break } - // match: (ORshiftLL [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32] y0:(REVW x0:(MOVWUload [i4] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [i3] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i1] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [i0] {s} p mem))) - // cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2) - // result: @mergePoint(b,x0,x1,x2,x3,x4) (REV (MOVDload {s} (OffPtr [i0] p) mem)) + // match: (ORshiftLL [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32] x0:(MOVWUloadidx4 ptr0 idx0 mem) y1:(MOVDnop x1:(MOVBUload [4] {s} p1:(ADDshiftLL [2] ptr1 idx1) mem))) y2:(MOVDnop x2:(MOVBUload [5] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [6] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [7] {s} p mem))) + // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4) != nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2) + // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDloadidx ptr0 (SLLconst [2] idx0) mem) for { t := v.Type if v.AuxInt != 56 { @@ -26059,32 +19948,30 @@ func rewriteValueARM64_OpARM64ORshiftLL_30(v *Value) bool { break } _ = o2.Args[1] - y0 := o2.Args[0] - if y0.Op != OpARM64REVW { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVWUload { + x0 := o2.Args[0] + if x0.Op != OpARM64MOVWUloadidx4 { break } - i4 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] + mem := x0.Args[2] + ptr0 := x0.Args[0] + idx0 := x0.Args[1] y1 := o2.Args[1] if y1.Op != OpARM64MOVDnop { break } x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload { + if x1.Op != OpARM64MOVBUload || x1.AuxInt != 4 { break } - i3 := x1.AuxInt - if x1.Aux != s { + s := x1.Aux + _ = x1.Args[1] + p1 := x1.Args[0] + if p1.Op != OpARM64ADDshiftLL || p1.AuxInt != 2 { break } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { + idx1 := p1.Args[1] + ptr1 := p1.Args[0] + if mem != x1.Args[1] { break } y2 := o1.Args[1] @@ -26092,15 +19979,12 @@ func rewriteValueARM64_OpARM64ORshiftLL_30(v *Value) bool { break } x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload { - break - } - i2 := x2.AuxInt - if x2.Aux != s { + if x2.Op != OpARM64MOVBUload || x2.AuxInt != 5 || x2.Aux != s { break } _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] { + p := x2.Args[0] + if mem != x2.Args[1] { break } y3 := o0.Args[1] @@ -26108,11 +19992,7 @@ func rewriteValueARM64_OpARM64ORshiftLL_30(v *Value) bool { break } x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload { - break - } - i1 := x3.AuxInt - if x3.Aux != s { + if x3.Op != OpARM64MOVBUload || x3.AuxInt != 6 || x3.Aux != s { break } _ = x3.Args[1] @@ -26124,34 +20004,28 @@ func rewriteValueARM64_OpARM64ORshiftLL_30(v *Value) bool { break } x4 := y4.Args[0] - if x4.Op != OpARM64MOVBUload { - break - } - i0 := x4.AuxInt - if x4.Aux != s { + if x4.Op != OpARM64MOVBUload || x4.AuxInt != 7 || x4.Aux != s { break } _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] || !(i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2)) { + if p != x4.Args[0] || mem != x4.Args[1] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2)) { break } b = mergePoint(b, x0, x1, x2, x3, x4) - v0 := b.NewValue0(x4.Pos, OpARM64REV, t) + v0 := b.NewValue0(x4.Pos, OpARM64MOVDloadidx, t) v.reset(OpCopy) v.AddArg(v0) - v1 := b.NewValue0(x4.Pos, OpARM64MOVDload, t) - v1.Aux = s - v2 := b.NewValue0(x4.Pos, OpOffPtr, p.Type) - v2.AuxInt = i0 - v2.AddArg(p) - v1.AddArg(v2) - v1.AddArg(mem) + v0.AddArg(ptr0) + v1 := b.NewValue0(x4.Pos, OpARM64SLLconst, idx0.Type) + v1.AuxInt = 2 + v1.AddArg(idx0) v0.AddArg(v1) + v0.AddArg(mem) return true } - // match: (ORshiftLL [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32] y0:(REVW x0:(MOVWUload [4] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [3] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) y4:(MOVDnop x4:(MOVBUloadidx ptr0 idx0 mem))) - // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2) - // result: @mergePoint(b,x0,x1,x2,x3,x4) (REV (MOVDloadidx ptr0 idx0 mem)) + // match: (ORshiftLL [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32] x0:(MOVWUloadidx ptr idx mem) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [4] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [5] idx) mem))) y3:(MOVDnop x3:(MOVBUloadidx ptr (ADDconst [6] idx) mem))) y4:(MOVDnop x4:(MOVBUloadidx ptr (ADDconst [7] idx) mem))) + // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2) + // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDloadidx ptr idx mem) for { t := v.Type if v.AuxInt != 56 { @@ -26173,27 +20047,27 @@ func rewriteValueARM64_OpARM64ORshiftLL_30(v *Value) bool { break } _ = o2.Args[1] - y0 := o2.Args[0] - if y0.Op != OpARM64REVW { - break - } - x0 := y0.Args[0] - if x0.Op != OpARM64MOVWUload || x0.AuxInt != 4 { + x0 := o2.Args[0] + if x0.Op != OpARM64MOVWUloadidx { break } - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] + mem := x0.Args[2] + ptr := x0.Args[0] + idx := x0.Args[1] y1 := o2.Args[1] if y1.Op != OpARM64MOVDnop { break } x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 3 || x1.Aux != s { + if x1.Op != OpARM64MOVBUloadidx { break } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { + _ = x1.Args[2] + if ptr != x1.Args[0] { + break + } + x1_1 := x1.Args[1] + if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 4 || idx != x1_1.Args[0] || mem != x1.Args[2] { break } y2 := o1.Args[1] @@ -26201,11 +20075,15 @@ func rewriteValueARM64_OpARM64ORshiftLL_30(v *Value) bool { break } x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 2 || x2.Aux != s { + if x2.Op != OpARM64MOVBUloadidx { break } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] { + _ = x2.Args[2] + if ptr != x2.Args[0] { + break + } + x2_1 := x2.Args[1] + if x2_1.Op != OpARM64ADDconst || x2_1.AuxInt != 5 || idx != x2_1.Args[0] || mem != x2.Args[2] { break } y3 := o0.Args[1] @@ -26213,17 +20091,15 @@ func rewriteValueARM64_OpARM64ORshiftLL_30(v *Value) bool { break } x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload || x3.AuxInt != 1 || x3.Aux != s { + if x3.Op != OpARM64MOVBUloadidx { break } - _ = x3.Args[1] - p1 := x3.Args[0] - if p1.Op != OpARM64ADD { + _ = x3.Args[2] + if ptr != x3.Args[0] { break } - idx1 := p1.Args[1] - ptr1 := p1.Args[0] - if mem != x3.Args[1] { + x3_1 := x3.Args[1] + if x3_1.Op != OpARM64ADDconst || x3_1.AuxInt != 6 || idx != x3_1.Args[0] || mem != x3.Args[2] { break } y4 := v.Args[1] @@ -26235,1170 +20111,1021 @@ func rewriteValueARM64_OpARM64ORshiftLL_30(v *Value) bool { break } _ = x4.Args[2] - ptr0 := x4.Args[0] - idx0 := x4.Args[1] - if mem != x4.Args[2] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2)) { + if ptr != x4.Args[0] { + break + } + x4_1 := x4.Args[1] + if x4_1.Op != OpARM64ADDconst || x4_1.AuxInt != 7 || idx != x4_1.Args[0] || mem != x4.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2)) { break } b = mergePoint(b, x0, x1, x2, x3, x4) - v0 := b.NewValue0(x3.Pos, OpARM64REV, t) + v0 := b.NewValue0(v.Pos, OpARM64MOVDloadidx, t) v.reset(OpCopy) v.AddArg(v0) - v1 := b.NewValue0(x3.Pos, OpARM64MOVDloadidx, t) - v1.AddArg(ptr0) - v1.AddArg(idx0) - v1.AddArg(mem) - v0.AddArg(v1) + v0.AddArg(ptr) + v0.AddArg(idx) + v0.AddArg(mem) return true } - // match: (ORshiftLL [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32] y0:(REVW x0:(MOVWUload [4] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [3] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [1] {s} p1:(ADD idx1 ptr1) mem))) y4:(MOVDnop x4:(MOVBUloadidx ptr0 idx0 mem))) - // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2) - // result: @mergePoint(b,x0,x1,x2,x3,x4) (REV (MOVDloadidx ptr0 idx0 mem)) + return false +} +func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { + b := v.Block + // match: (ORshiftLL [8] y0:(MOVDnop x0:(MOVBUload [i1] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [i0] {s} p mem))) + // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1) + // result: @mergePoint(b,x0,x1) (REV16W (MOVHUload [i0] {s} p mem)) for { t := v.Type - if v.AuxInt != 56 { + if v.AuxInt != 8 { break } _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 48 { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 40 { - break - } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 32 { - break - } - _ = o2.Args[1] - y0 := o2.Args[0] - if y0.Op != OpARM64REVW { + y0 := v.Args[0] + if y0.Op != OpARM64MOVDnop { break } x0 := y0.Args[0] - if x0.Op != OpARM64MOVWUload || x0.AuxInt != 4 { + if x0.Op != OpARM64MOVBUload { break } + i1 := x0.AuxInt s := x0.Aux mem := x0.Args[1] p := x0.Args[0] - y1 := o2.Args[1] + y1 := v.Args[1] if y1.Op != OpARM64MOVDnop { break } x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 3 || x1.Aux != s { + if x1.Op != OpARM64MOVBUload { + break + } + i0 := x1.AuxInt + if x1.Aux != s { break } _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { + if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1)) { break } - y2 := o1.Args[1] - if y2.Op != OpARM64MOVDnop { + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(x1.Pos, OpARM64REV16W, t) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x1.Pos, OpARM64MOVHUload, t) + v1.AuxInt = i0 + v1.Aux = s + v1.AddArg(p) + v1.AddArg(mem) + v0.AddArg(v1) + return true + } + // match: (ORshiftLL [8] y0:(MOVDnop x0:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem)) y1:(MOVDnop x1:(MOVBUloadidx ptr0 idx0 mem))) + // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1) + // result: @mergePoint(b,x0,x1) (REV16W (MOVHUloadidx ptr0 idx0 mem)) + for { + t := v.Type + if v.AuxInt != 8 { break } - x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 2 || x2.Aux != s { + _ = v.Args[1] + y0 := v.Args[0] + if y0.Op != OpARM64MOVDnop { break } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] { + x0 := y0.Args[0] + if x0.Op != OpARM64MOVBUload || x0.AuxInt != 1 { break } - y3 := o0.Args[1] - if y3.Op != OpARM64MOVDnop { + s := x0.Aux + mem := x0.Args[1] + p1 := x0.Args[0] + if p1.Op != OpARM64ADD { break } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload || x3.AuxInt != 1 || x3.Aux != s { + _ = p1.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr1 := p1.Args[_i0] + idx1 := p1.Args[1^_i0] + y1 := v.Args[1] + if y1.Op != OpARM64MOVDnop { + continue + } + x1 := y1.Args[0] + if x1.Op != OpARM64MOVBUloadidx { + continue + } + _ = x1.Args[2] + ptr0 := x1.Args[0] + idx0 := x1.Args[1] + if mem != x1.Args[2] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b, x0, x1) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(x0.Pos, OpARM64REV16W, t) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x0.Pos, OpARM64MOVHUloadidx, t) + v1.AddArg(ptr0) + v1.AddArg(idx0) + v1.AddArg(mem) + v0.AddArg(v1) + return true + } + break + } + // match: (ORshiftLL [8] y0:(MOVDnop x0:(MOVBUloadidx ptr (ADDconst [1] idx) mem)) y1:(MOVDnop x1:(MOVBUloadidx ptr idx mem))) + // cond: x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1) + // result: @mergePoint(b,x0,x1) (REV16W (MOVHUloadidx ptr idx mem)) + for { + t := v.Type + if v.AuxInt != 8 { break } - _ = x3.Args[1] - p1 := x3.Args[0] - if p1.Op != OpARM64ADD { + _ = v.Args[1] + y0 := v.Args[0] + if y0.Op != OpARM64MOVDnop { + break + } + x0 := y0.Args[0] + if x0.Op != OpARM64MOVBUloadidx { break } - ptr1 := p1.Args[1] - idx1 := p1.Args[0] - if mem != x3.Args[1] { + mem := x0.Args[2] + ptr := x0.Args[0] + x0_1 := x0.Args[1] + if x0_1.Op != OpARM64ADDconst || x0_1.AuxInt != 1 { break } - y4 := v.Args[1] - if y4.Op != OpARM64MOVDnop { + idx := x0_1.Args[0] + y1 := v.Args[1] + if y1.Op != OpARM64MOVDnop { break } - x4 := y4.Args[0] - if x4.Op != OpARM64MOVBUloadidx { + x1 := y1.Args[0] + if x1.Op != OpARM64MOVBUloadidx { break } - _ = x4.Args[2] - ptr0 := x4.Args[0] - idx0 := x4.Args[1] - if mem != x4.Args[2] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2)) { + _ = x1.Args[2] + if ptr != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1)) { break } - b = mergePoint(b, x0, x1, x2, x3, x4) - v0 := b.NewValue0(x3.Pos, OpARM64REV, t) + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(v.Pos, OpARM64REV16W, t) v.reset(OpCopy) v.AddArg(v0) - v1 := b.NewValue0(x3.Pos, OpARM64MOVDloadidx, t) - v1.AddArg(ptr0) - v1.AddArg(idx0) + v1 := b.NewValue0(v.Pos, OpARM64MOVHUloadidx, t) + v1.AddArg(ptr) + v1.AddArg(idx) v1.AddArg(mem) v0.AddArg(v1) return true } - // match: (ORshiftLL [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32] y0:(REVW x0:(MOVWUloadidx ptr (ADDconst [4] idx) mem)) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [3] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [2] idx) mem))) y3:(MOVDnop x3:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) y4:(MOVDnop x4:(MOVBUloadidx ptr idx mem))) - // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2) - // result: @mergePoint(b,x0,x1,x2,x3,x4) (REV (MOVDloadidx ptr idx mem)) + // match: (ORshiftLL [24] o0:(ORshiftLL [16] y0:(REV16W x0:(MOVHUload [i2] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [i1] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i0] {s} p mem))) + // cond: i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(o0) + // result: @mergePoint(b,x0,x1,x2) (REVW (MOVWUload {s} (OffPtr [i0] p) mem)) for { t := v.Type - if v.AuxInt != 56 { + if v.AuxInt != 24 { break } _ = v.Args[1] o0 := v.Args[0] - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 48 { + if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 16 { break } _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 40 { - break - } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 32 { - break - } - _ = o2.Args[1] - y0 := o2.Args[0] - if y0.Op != OpARM64REVW { + y0 := o0.Args[0] + if y0.Op != OpARM64REV16W { break } x0 := y0.Args[0] - if x0.Op != OpARM64MOVWUloadidx { - break - } - mem := x0.Args[2] - ptr := x0.Args[0] - x0_1 := x0.Args[1] - if x0_1.Op != OpARM64ADDconst || x0_1.AuxInt != 4 { + if x0.Op != OpARM64MOVHUload { break } - idx := x0_1.Args[0] - y1 := o2.Args[1] + i2 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + y1 := o0.Args[1] if y1.Op != OpARM64MOVDnop { break } x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUloadidx { + if x1.Op != OpARM64MOVBUload { break } - _ = x1.Args[2] - if ptr != x1.Args[0] { + i1 := x1.AuxInt + if x1.Aux != s { break } - x1_1 := x1.Args[1] - if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 3 || idx != x1_1.Args[0] || mem != x1.Args[2] { + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] { break } - y2 := o1.Args[1] + y2 := v.Args[1] if y2.Op != OpARM64MOVDnop { break } x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUloadidx { + if x2.Op != OpARM64MOVBUload { break } - _ = x2.Args[2] - if ptr != x2.Args[0] { + i0 := x2.AuxInt + if x2.Aux != s { break } - x2_1 := x2.Args[1] - if x2_1.Op != OpARM64ADDconst || x2_1.AuxInt != 2 || idx != x2_1.Args[0] || mem != x2.Args[2] { + _ = x2.Args[1] + if p != x2.Args[0] || mem != x2.Args[1] || !(i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(o0)) { break } - y3 := o0.Args[1] - if y3.Op != OpARM64MOVDnop { + b = mergePoint(b, x0, x1, x2) + v0 := b.NewValue0(x2.Pos, OpARM64REVW, t) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x2.Pos, OpARM64MOVWUload, t) + v1.Aux = s + v2 := b.NewValue0(x2.Pos, OpOffPtr, p.Type) + v2.AuxInt = i0 + v2.AddArg(p) + v1.AddArg(v2) + v1.AddArg(mem) + v0.AddArg(v1) + return true + } + // match: (ORshiftLL [24] o0:(ORshiftLL [16] y0:(REV16W x0:(MOVHUload [2] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr0 idx0 mem))) + // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(o0) + // result: @mergePoint(b,x0,x1,x2) (REVW (MOVWUloadidx ptr0 idx0 mem)) + for { + t := v.Type + if v.AuxInt != 24 { break } - x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUloadidx { + _ = v.Args[1] + o0 := v.Args[0] + if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 16 { break } - _ = x3.Args[2] - if ptr != x3.Args[0] { + _ = o0.Args[1] + y0 := o0.Args[0] + if y0.Op != OpARM64REV16W { break } - x3_1 := x3.Args[1] - if x3_1.Op != OpARM64ADDconst || x3_1.AuxInt != 1 || idx != x3_1.Args[0] || mem != x3.Args[2] { + x0 := y0.Args[0] + if x0.Op != OpARM64MOVHUload || x0.AuxInt != 2 { break } - y4 := v.Args[1] - if y4.Op != OpARM64MOVDnop { + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + y1 := o0.Args[1] + if y1.Op != OpARM64MOVDnop { break } - x4 := y4.Args[0] - if x4.Op != OpARM64MOVBUloadidx { + x1 := y1.Args[0] + if x1.Op != OpARM64MOVBUload || x1.AuxInt != 1 || x1.Aux != s { break } - _ = x4.Args[2] - if ptr != x4.Args[0] || idx != x4.Args[1] || mem != x4.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2)) { + _ = x1.Args[1] + p1 := x1.Args[0] + if p1.Op != OpARM64ADD { break } - b = mergePoint(b, x0, x1, x2, x3, x4) - v0 := b.NewValue0(v.Pos, OpARM64REV, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpARM64MOVDloadidx, t) - v1.AddArg(ptr) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true + _ = p1.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr1 := p1.Args[_i0] + idx1 := p1.Args[1^_i0] + if mem != x1.Args[1] { + continue + } + y2 := v.Args[1] + if y2.Op != OpARM64MOVDnop { + continue + } + x2 := y2.Args[0] + if x2.Op != OpARM64MOVBUloadidx { + continue + } + _ = x2.Args[2] + ptr0 := x2.Args[0] + idx0 := x2.Args[1] + if mem != x2.Args[2] || !(s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(o0)) { + continue + } + b = mergePoint(b, x0, x1, x2) + v0 := b.NewValue0(x1.Pos, OpARM64REVW, t) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x1.Pos, OpARM64MOVWUloadidx, t) + v1.AddArg(ptr0) + v1.AddArg(idx0) + v1.AddArg(mem) + v0.AddArg(v1) + return true + } + break } - return false -} -func rewriteValueARM64_OpARM64ORshiftRA_0(v *Value) bool { - b := v.Block - // match: (ORshiftRA (MOVDconst [c]) x [d]) - // result: (ORconst [c] (SRAconst x [d])) + // match: (ORshiftLL [24] o0:(ORshiftLL [16] y0:(REV16W x0:(MOVHUloadidx ptr (ADDconst [2] idx) mem)) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr idx mem))) + // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(o0) + // result: @mergePoint(b,x0,x1,x2) (REVW (MOVWUloadidx ptr idx mem)) for { - d := v.AuxInt - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + t := v.Type + if v.AuxInt != 24 { break } - c := v_0.AuxInt - v.reset(OpARM64ORconst) - v.AuxInt = c - v0 := b.NewValue0(v.Pos, OpARM64SRAconst, x.Type) - v0.AuxInt = d - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (ORshiftRA x (MOVDconst [c]) [d]) - // result: (ORconst x [c>>uint64(d)]) - for { - d := v.AuxInt _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + o0 := v.Args[0] + if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 16 { break } - c := v_1.AuxInt - v.reset(OpARM64ORconst) - v.AuxInt = c >> uint64(d) - v.AddArg(x) - return true - } - // match: (ORshiftRA x y:(SRAconst x [c]) [d]) - // cond: c==d - // result: y - for { - d := v.AuxInt - _ = v.Args[1] - x := v.Args[0] - y := v.Args[1] - if y.Op != OpARM64SRAconst { + _ = o0.Args[1] + y0 := o0.Args[0] + if y0.Op != OpARM64REV16W { break } - c := y.AuxInt - if x != y.Args[0] || !(c == d) { + x0 := y0.Args[0] + if x0.Op != OpARM64MOVHUloadidx { break } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) - return true - } - return false -} -func rewriteValueARM64_OpARM64ORshiftRL_0(v *Value) bool { - b := v.Block - // match: (ORshiftRL (MOVDconst [c]) x [d]) - // result: (ORconst [c] (SRLconst x [d])) - for { - d := v.AuxInt - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + mem := x0.Args[2] + ptr := x0.Args[0] + x0_1 := x0.Args[1] + if x0_1.Op != OpARM64ADDconst || x0_1.AuxInt != 2 { break } - c := v_0.AuxInt - v.reset(OpARM64ORconst) - v.AuxInt = c - v0 := b.NewValue0(v.Pos, OpARM64SRLconst, x.Type) - v0.AuxInt = d - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (ORshiftRL x (MOVDconst [c]) [d]) - // result: (ORconst x [int64(uint64(c)>>uint64(d))]) - for { - d := v.AuxInt - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + idx := x0_1.Args[0] + y1 := o0.Args[1] + if y1.Op != OpARM64MOVDnop { break } - c := v_1.AuxInt - v.reset(OpARM64ORconst) - v.AuxInt = int64(uint64(c) >> uint64(d)) - v.AddArg(x) - return true - } - // match: (ORshiftRL x y:(SRLconst x [c]) [d]) - // cond: c==d - // result: y - for { - d := v.AuxInt - _ = v.Args[1] - x := v.Args[0] - y := v.Args[1] - if y.Op != OpARM64SRLconst { + x1 := y1.Args[0] + if x1.Op != OpARM64MOVBUloadidx { + break + } + _ = x1.Args[2] + if ptr != x1.Args[0] { + break + } + x1_1 := x1.Args[1] + if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 1 || idx != x1_1.Args[0] || mem != x1.Args[2] { + break + } + y2 := v.Args[1] + if y2.Op != OpARM64MOVDnop { break } - c := y.AuxInt - if x != y.Args[0] || !(c == d) { + x2 := y2.Args[0] + if x2.Op != OpARM64MOVBUloadidx { break } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) - return true - } - // match: (ORshiftRL [c] (SLLconst x [64-c]) x) - // result: (RORconst [ c] x) - for { - c := v.AuxInt - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 64-c || x != v_0.Args[0] { + _ = x2.Args[2] + if ptr != x2.Args[0] || idx != x2.Args[1] || mem != x2.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && o0.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(o0)) { break } - v.reset(OpARM64RORconst) - v.AuxInt = c - v.AddArg(x) + b = mergePoint(b, x0, x1, x2) + v0 := b.NewValue0(v.Pos, OpARM64REVW, t) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpARM64MOVWUloadidx, t) + v1.AddArg(ptr) + v1.AddArg(idx) + v1.AddArg(mem) + v0.AddArg(v1) return true } - // match: (ORshiftRL [c] (SLLconst x [32-c]) (MOVWUreg x)) - // cond: c < 32 && t.Size() == 4 - // result: (RORWconst [c] x) + // match: (ORshiftLL [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32] y0:(REVW x0:(MOVWUload [i4] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [i3] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i1] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [i0] {s} p mem))) + // cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2) + // result: @mergePoint(b,x0,x1,x2,x3,x4) (REV (MOVDload {s} (OffPtr [i0] p) mem)) for { t := v.Type - c := v.AuxInt + if v.AuxInt != 56 { + break + } _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 32-c { + o0 := v.Args[0] + if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 48 { break } - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVWUreg || x != v_1.Args[0] || !(c < 32 && t.Size() == 4) { + _ = o0.Args[1] + o1 := o0.Args[0] + if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 40 { break } - v.reset(OpARM64RORWconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ORshiftRL [rc] (ANDconst [ac] x) (SLLconst [lc] y)) - // cond: lc > rc && ac == ^((1< rc && ac == ^((1< (NEGSflags (NEG (NGCzerocarry bo))))) - // result: (SBCSflags x y bo) - for { - _ = v.Args[2] - x := v.Args[0] - y := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpSelect1 || v_2.Type != types.TypeFlags { + x2 := y2.Args[0] + if x2.Op != OpARM64MOVBUload { break } - v_2_0 := v_2.Args[0] - if v_2_0.Op != OpARM64NEGSflags { + i2 := x2.AuxInt + if x2.Aux != s { break } - v_2_0_0 := v_2_0.Args[0] - if v_2_0_0.Op != OpARM64NEG || v_2_0_0.Type != typ.UInt64 { + _ = x2.Args[1] + if p != x2.Args[0] || mem != x2.Args[1] { break } - v_2_0_0_0 := v_2_0_0.Args[0] - if v_2_0_0_0.Op != OpARM64NGCzerocarry || v_2_0_0_0.Type != typ.UInt64 { + y3 := o0.Args[1] + if y3.Op != OpARM64MOVDnop { break } - bo := v_2_0_0_0.Args[0] - v.reset(OpARM64SBCSflags) - v.AddArg(x) - v.AddArg(y) - v.AddArg(bo) - return true - } - // match: (SBCSflags x y (Select1 (NEGSflags (MOVDconst [0])))) - // result: (SUBSflags x y) - for { - _ = v.Args[2] - x := v.Args[0] - y := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpSelect1 || v_2.Type != types.TypeFlags { + x3 := y3.Args[0] + if x3.Op != OpARM64MOVBUload { break } - v_2_0 := v_2.Args[0] - if v_2_0.Op != OpARM64NEGSflags { + i1 := x3.AuxInt + if x3.Aux != s { break } - v_2_0_0 := v_2_0.Args[0] - if v_2_0_0.Op != OpARM64MOVDconst || v_2_0_0.AuxInt != 0 { + _ = x3.Args[1] + if p != x3.Args[0] || mem != x3.Args[1] { break } - v.reset(OpARM64SUBSflags) - v.AddArg(x) - v.AddArg(y) - return true - } - return false -} -func rewriteValueARM64_OpARM64SLL_0(v *Value) bool { - // match: (SLL x (MOVDconst [c])) - // result: (SLLconst x [c&63]) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + y4 := v.Args[1] + if y4.Op != OpARM64MOVDnop { break } - c := v_1.AuxInt - v.reset(OpARM64SLLconst) - v.AuxInt = c & 63 - v.AddArg(x) - return true - } - return false -} -func rewriteValueARM64_OpARM64SLLconst_0(v *Value) bool { - // match: (SLLconst [c] (MOVDconst [d])) - // result: (MOVDconst [d< [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32] y0:(REVW x0:(MOVWUload [4] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [3] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [2] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) y4:(MOVDnop x4:(MOVBUloadidx ptr0 idx0 mem))) + // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2) + // result: @mergePoint(b,x0,x1,x2,x3,x4) (REV (MOVDloadidx ptr0 idx0 mem)) for { - c := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64SRLconst || v_0.AuxInt != c { + t := v.Type + if v.AuxInt != 56 { break } - x := v_0.Args[0] - if !(0 < c && c < 64) { + _ = v.Args[1] + o0 := v.Args[0] + if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 48 { break } - v.reset(OpARM64ANDconst) - v.AuxInt = ^(1< [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32] y0:(REVW x0:(MOVWUloadidx ptr (ADDconst [4] idx) mem)) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [3] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [2] idx) mem))) y3:(MOVDnop x3:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) y4:(MOVDnop x4:(MOVBUloadidx ptr idx mem))) + // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2) + // result: @mergePoint(b,x0,x1,x2,x3,x4) (REV (MOVDloadidx ptr idx mem)) for { + t := v.Type + if v.AuxInt != 56 { + break + } _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + o0 := v.Args[0] + if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 48 { break } - c := v_1.AuxInt - v.reset(OpARM64SRAconst) - v.AuxInt = c & 63 - v.AddArg(x) - return true - } - return false -} -func rewriteValueARM64_OpARM64SRAconst_0(v *Value) bool { - // match: (SRAconst [c] (MOVDconst [d])) - // result: (MOVDconst [d>>uint64(c)]) - for { - c := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + _ = o0.Args[1] + o1 := o0.Args[0] + if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 40 { break } - d := v_0.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = d >> uint64(c) - return true - } - // match: (SRAconst [rc] (SLLconst [lc] x)) - // cond: lc > rc - // result: (SBFIZ [armBFAuxInt(lc-rc, 64-lc)] x) - for { - rc := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64SLLconst { + _ = o1.Args[1] + o2 := o1.Args[0] + if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 32 { break } - lc := v_0.AuxInt - x := v_0.Args[0] - if !(lc > rc) { + _ = o2.Args[1] + y0 := o2.Args[0] + if y0.Op != OpARM64REVW { break } - v.reset(OpARM64SBFIZ) - v.AuxInt = armBFAuxInt(lc-rc, 64-lc) - v.AddArg(x) - return true - } - // match: (SRAconst [rc] (SLLconst [lc] x)) - // cond: lc <= rc - // result: (SBFX [armBFAuxInt(rc-lc, 64-rc)] x) - for { - rc := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64SLLconst { + x0 := y0.Args[0] + if x0.Op != OpARM64MOVWUloadidx { break } - lc := v_0.AuxInt - x := v_0.Args[0] - if !(lc <= rc) { + mem := x0.Args[2] + ptr := x0.Args[0] + x0_1 := x0.Args[1] + if x0_1.Op != OpARM64ADDconst || x0_1.AuxInt != 4 { break } - v.reset(OpARM64SBFX) - v.AuxInt = armBFAuxInt(rc-lc, 64-rc) - v.AddArg(x) - return true - } - // match: (SRAconst [rc] (MOVWreg x)) - // cond: rc < 32 - // result: (SBFX [armBFAuxInt(rc, 32-rc)] x) - for { - rc := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVWreg { + idx := x0_1.Args[0] + y1 := o2.Args[1] + if y1.Op != OpARM64MOVDnop { break } - x := v_0.Args[0] - if !(rc < 32) { + x1 := y1.Args[0] + if x1.Op != OpARM64MOVBUloadidx { break } - v.reset(OpARM64SBFX) - v.AuxInt = armBFAuxInt(rc, 32-rc) - v.AddArg(x) - return true - } - // match: (SRAconst [rc] (MOVHreg x)) - // cond: rc < 16 - // result: (SBFX [armBFAuxInt(rc, 16-rc)] x) - for { - rc := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVHreg { + _ = x1.Args[2] + if ptr != x1.Args[0] { + break + } + x1_1 := x1.Args[1] + if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 3 || idx != x1_1.Args[0] || mem != x1.Args[2] { + break + } + y2 := o1.Args[1] + if y2.Op != OpARM64MOVDnop { break } - x := v_0.Args[0] - if !(rc < 16) { + x2 := y2.Args[0] + if x2.Op != OpARM64MOVBUloadidx { break } - v.reset(OpARM64SBFX) - v.AuxInt = armBFAuxInt(rc, 16-rc) - v.AddArg(x) - return true - } - // match: (SRAconst [rc] (MOVBreg x)) - // cond: rc < 8 - // result: (SBFX [armBFAuxInt(rc, 8-rc)] x) - for { - rc := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVBreg { + _ = x2.Args[2] + if ptr != x2.Args[0] { break } - x := v_0.Args[0] - if !(rc < 8) { + x2_1 := x2.Args[1] + if x2_1.Op != OpARM64ADDconst || x2_1.AuxInt != 2 || idx != x2_1.Args[0] || mem != x2.Args[2] { break } - v.reset(OpARM64SBFX) - v.AuxInt = armBFAuxInt(rc, 8-rc) - v.AddArg(x) - return true - } - // match: (SRAconst [sc] (SBFIZ [bfc] x)) - // cond: sc < getARM64BFlsb(bfc) - // result: (SBFIZ [armBFAuxInt(getARM64BFlsb(bfc)-sc, getARM64BFwidth(bfc))] x) - for { - sc := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64SBFIZ { + y3 := o0.Args[1] + if y3.Op != OpARM64MOVDnop { break } - bfc := v_0.AuxInt - x := v_0.Args[0] - if !(sc < getARM64BFlsb(bfc)) { + x3 := y3.Args[0] + if x3.Op != OpARM64MOVBUloadidx { break } - v.reset(OpARM64SBFIZ) - v.AuxInt = armBFAuxInt(getARM64BFlsb(bfc)-sc, getARM64BFwidth(bfc)) - v.AddArg(x) - return true - } - // match: (SRAconst [sc] (SBFIZ [bfc] x)) - // cond: sc >= getARM64BFlsb(bfc) && sc < getARM64BFlsb(bfc)+getARM64BFwidth(bfc) - // result: (SBFX [armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc)] x) - for { - sc := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64SBFIZ { + _ = x3.Args[2] + if ptr != x3.Args[0] { break } - bfc := v_0.AuxInt - x := v_0.Args[0] - if !(sc >= getARM64BFlsb(bfc) && sc < getARM64BFlsb(bfc)+getARM64BFwidth(bfc)) { + x3_1 := x3.Args[1] + if x3_1.Op != OpARM64ADDconst || x3_1.AuxInt != 1 || idx != x3_1.Args[0] || mem != x3.Args[2] { break } - v.reset(OpARM64SBFX) - v.AuxInt = armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc) - v.AddArg(x) - return true - } - return false -} -func rewriteValueARM64_OpARM64SRL_0(v *Value) bool { - // match: (SRL x (MOVDconst [c])) - // result: (SRLconst x [c&63]) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + y4 := v.Args[1] + if y4.Op != OpARM64MOVDnop { break } - c := v_1.AuxInt - v.reset(OpARM64SRLconst) - v.AuxInt = c & 63 - v.AddArg(x) + x4 := y4.Args[0] + if x4.Op != OpARM64MOVBUloadidx { + break + } + _ = x4.Args[2] + if ptr != x4.Args[0] || idx != x4.Args[1] || mem != x4.Args[2] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(o0) && clobber(o1) && clobber(o2)) { + break + } + b = mergePoint(b, x0, x1, x2, x3, x4) + v0 := b.NewValue0(v.Pos, OpARM64REV, t) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpARM64MOVDloadidx, t) + v1.AddArg(ptr) + v1.AddArg(idx) + v1.AddArg(mem) + v0.AddArg(v1) return true } return false } -func rewriteValueARM64_OpARM64SRLconst_0(v *Value) bool { - // match: (SRLconst [c] (MOVDconst [d])) - // result: (MOVDconst [int64(uint64(d)>>uint64(c))]) +func rewriteValueARM64_OpARM64ORshiftRA_0(v *Value) bool { + b := v.Block + // match: (ORshiftRA (MOVDconst [c]) x [d]) + // result: (ORconst [c] (SRAconst x [d])) for { - c := v.AuxInt + d := v.AuxInt + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } - d := v_0.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = int64(uint64(d) >> uint64(c)) + c := v_0.AuxInt + v.reset(OpARM64ORconst) + v.AuxInt = c + v0 := b.NewValue0(v.Pos, OpARM64SRAconst, x.Type) + v0.AuxInt = d + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (SRLconst [c] (SLLconst [c] x)) - // cond: 0 < c && c < 64 - // result: (ANDconst [1<>uint64(d)]) for { - c := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64SLLconst || v_0.AuxInt != c { - break - } - x := v_0.Args[0] - if !(0 < c && c < 64) { + d := v.AuxInt + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - v.reset(OpARM64ANDconst) - v.AuxInt = 1<> uint64(d) v.AddArg(x) return true } - // match: (SRLconst [rc] (SLLconst [lc] x)) - // cond: lc > rc - // result: (UBFIZ [armBFAuxInt(lc-rc, 64-lc)] x) + // match: (ORshiftRA x y:(SRAconst x [c]) [d]) + // cond: c==d + // result: y for { - rc := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64SLLconst { + d := v.AuxInt + _ = v.Args[1] + x := v.Args[0] + y := v.Args[1] + if y.Op != OpARM64SRAconst { break } - lc := v_0.AuxInt - x := v_0.Args[0] - if !(lc > rc) { + c := y.AuxInt + if x != y.Args[0] || !(c == d) { break } - v.reset(OpARM64UBFIZ) - v.AuxInt = armBFAuxInt(lc-rc, 64-lc) - v.AddArg(x) + v.reset(OpCopy) + v.Type = y.Type + v.AddArg(y) return true } - // match: (SRLconst [sc] (ANDconst [ac] x)) - // cond: isARM64BFMask(sc, ac, sc) - // result: (UBFX [armBFAuxInt(sc, arm64BFWidth(ac, sc))] x) + return false +} +func rewriteValueARM64_OpARM64ORshiftRL_0(v *Value) bool { + b := v.Block + // match: (ORshiftRL (MOVDconst [c]) x [d]) + // result: (ORconst [c] (SRLconst x [d])) for { - sc := v.AuxInt + d := v.AuxInt + x := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64ANDconst { - break - } - ac := v_0.AuxInt - x := v_0.Args[0] - if !(isARM64BFMask(sc, ac, sc)) { + if v_0.Op != OpARM64MOVDconst { break } - v.reset(OpARM64UBFX) - v.AuxInt = armBFAuxInt(sc, arm64BFWidth(ac, sc)) - v.AddArg(x) + c := v_0.AuxInt + v.reset(OpARM64ORconst) + v.AuxInt = c + v0 := b.NewValue0(v.Pos, OpARM64SRLconst, x.Type) + v0.AuxInt = d + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (SRLconst [sc] (MOVWUreg x)) - // cond: isARM64BFMask(sc, 1<<32-1, sc) - // result: (UBFX [armBFAuxInt(sc, arm64BFWidth(1<<32-1, sc))] x) + // match: (ORshiftRL x (MOVDconst [c]) [d]) + // result: (ORconst x [int64(uint64(c)>>uint64(d))]) for { - sc := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVWUreg { - break - } - x := v_0.Args[0] - if !(isARM64BFMask(sc, 1<<32-1, sc)) { + d := v.AuxInt + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - v.reset(OpARM64UBFX) - v.AuxInt = armBFAuxInt(sc, arm64BFWidth(1<<32-1, sc)) + c := v_1.AuxInt + v.reset(OpARM64ORconst) + v.AuxInt = int64(uint64(c) >> uint64(d)) v.AddArg(x) return true } - // match: (SRLconst [sc] (MOVHUreg x)) - // cond: isARM64BFMask(sc, 1<<16-1, sc) - // result: (UBFX [armBFAuxInt(sc, arm64BFWidth(1<<16-1, sc))] x) + // match: (ORshiftRL x y:(SRLconst x [c]) [d]) + // cond: c==d + // result: y for { - sc := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVHUreg { + d := v.AuxInt + _ = v.Args[1] + x := v.Args[0] + y := v.Args[1] + if y.Op != OpARM64SRLconst { break } - x := v_0.Args[0] - if !(isARM64BFMask(sc, 1<<16-1, sc)) { + c := y.AuxInt + if x != y.Args[0] || !(c == d) { break } - v.reset(OpARM64UBFX) - v.AuxInt = armBFAuxInt(sc, arm64BFWidth(1<<16-1, sc)) - v.AddArg(x) + v.reset(OpCopy) + v.Type = y.Type + v.AddArg(y) return true } - // match: (SRLconst [sc] (MOVBUreg x)) - // cond: isARM64BFMask(sc, 1<<8-1, sc) - // result: (UBFX [armBFAuxInt(sc, arm64BFWidth(1<<8-1, sc))] x) + // match: ( ORshiftRL [c] (SLLconst x [64-c]) x) + // result: (RORconst [ c] x) for { - sc := v.AuxInt + c := v.AuxInt + x := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64MOVBUreg { - break - } - x := v_0.Args[0] - if !(isARM64BFMask(sc, 1<<8-1, sc)) { + if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 64-c || x != v_0.Args[0] { break } - v.reset(OpARM64UBFX) - v.AuxInt = armBFAuxInt(sc, arm64BFWidth(1<<8-1, sc)) + v.reset(OpARM64RORconst) + v.AuxInt = c v.AddArg(x) return true } - // match: (SRLconst [rc] (SLLconst [lc] x)) - // cond: lc < rc - // result: (UBFX [armBFAuxInt(rc-lc, 64-rc)] x) + // match: ( ORshiftRL [c] (SLLconst x [32-c]) (MOVWUreg x)) + // cond: c < 32 && t.Size() == 4 + // result: (RORWconst [c] x) for { - rc := v.AuxInt + t := v.Type + c := v.AuxInt + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64SLLconst { + if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 32-c { break } - lc := v_0.AuxInt x := v_0.Args[0] - if !(lc < rc) { + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVWUreg || x != v_1.Args[0] || !(c < 32 && t.Size() == 4) { break } - v.reset(OpARM64UBFX) - v.AuxInt = armBFAuxInt(rc-lc, 64-rc) + v.reset(OpARM64RORWconst) + v.AuxInt = c v.AddArg(x) return true } - // match: (SRLconst [sc] (UBFX [bfc] x)) - // cond: sc < getARM64BFwidth(bfc) - // result: (UBFX [armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)-sc)] x) + // match: (ORshiftRL [rc] (ANDconst [ac] x) (SLLconst [lc] y)) + // cond: lc > rc && ac == ^((1< rc && ac == ^((1< getARM64BFlsb(bfc) && sc < getARM64BFlsb(bfc)+getARM64BFwidth(bfc) - // result: (UBFX [armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc)] x) + return false +} +func rewriteValueARM64_OpARM64RORconst_0(v *Value) bool { + // match: (RORconst [c] (RORconst [d] x)) + // result: (RORconst [(c+d)&63] x) for { - sc := v.AuxInt + c := v.AuxInt v_0 := v.Args[0] - if v_0.Op != OpARM64UBFIZ { + if v_0.Op != OpARM64RORconst { break } - bfc := v_0.AuxInt + d := v_0.AuxInt x := v_0.Args[0] - if !(sc > getARM64BFlsb(bfc) && sc < getARM64BFlsb(bfc)+getARM64BFwidth(bfc)) { - break - } - v.reset(OpARM64UBFX) - v.AuxInt = armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc) + v.reset(OpARM64RORconst) + v.AuxInt = (c + d) & 63 v.AddArg(x) return true } return false } -func rewriteValueARM64_OpARM64STP_0(v *Value) bool { +func rewriteValueARM64_OpARM64SBCSflags_0(v *Value) bool { b := v.Block - config := b.Func.Config - // match: (STP [off1] {sym} (ADDconst [off2] ptr) val1 val2 mem) - // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (STP [off1+off2] {sym} ptr val1 val2 mem) + typ := &b.Func.Config.Types + // match: (SBCSflags x y (Select1 (NEGSflags (NEG (NGCzerocarry bo))))) + // result: (SBCSflags x y bo) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[3] - v_0 := v.Args[0] - if v_0.Op != OpARM64ADDconst { + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpSelect1 || v_2.Type != types.TypeFlags { break } - off2 := v_0.AuxInt - ptr := v_0.Args[0] - val1 := v.Args[1] - val2 := v.Args[2] - if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + v_2_0 := v_2.Args[0] + if v_2_0.Op != OpARM64NEGSflags { break } - v.reset(OpARM64STP) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(ptr) - v.AddArg(val1) - v.AddArg(val2) - v.AddArg(mem) - return true - } - // match: (STP [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val1 val2 mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) - // result: (STP [off1+off2] {mergeSym(sym1,sym2)} ptr val1 val2 mem) - for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[3] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDaddr { + v_2_0_0 := v_2_0.Args[0] + if v_2_0_0.Op != OpARM64NEG || v_2_0_0.Type != typ.UInt64 { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - ptr := v_0.Args[0] - val1 := v.Args[1] - val2 := v.Args[2] - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { + v_2_0_0_0 := v_2_0_0.Args[0] + if v_2_0_0_0.Op != OpARM64NGCzerocarry || v_2_0_0_0.Type != typ.UInt64 { break } - v.reset(OpARM64STP) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(val1) - v.AddArg(val2) - v.AddArg(mem) + bo := v_2_0_0_0.Args[0] + v.reset(OpARM64SBCSflags) + v.AddArg(x) + v.AddArg(y) + v.AddArg(bo) return true } - // match: (STP [off] {sym} ptr (MOVDconst [0]) (MOVDconst [0]) mem) - // result: (MOVQstorezero [off] {sym} ptr mem) + // match: (SBCSflags x y (Select1 (NEGSflags (MOVDconst [0])))) + // result: (SUBSflags x y) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[3] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 0 { + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpSelect1 || v_2.Type != types.TypeFlags { break } - v_2 := v.Args[2] - if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 0 { + v_2_0 := v_2.Args[0] + if v_2_0.Op != OpARM64NEGSflags { break } - v.reset(OpARM64MOVQstorezero) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(mem) + v_2_0_0 := v_2_0.Args[0] + if v_2_0_0.Op != OpARM64MOVDconst || v_2_0_0.AuxInt != 0 { + break + } + v.reset(OpARM64SUBSflags) + v.AddArg(x) + v.AddArg(y) return true } return false } -func rewriteValueARM64_OpARM64SUB_0(v *Value) bool { - b := v.Block - // match: (SUB x (MOVDconst [c])) - // result: (SUBconst [c] x) +func rewriteValueARM64_OpARM64SLL_0(v *Value) bool { + // match: (SLL x (MOVDconst [c])) + // result: (SLLconst x [c&63]) for { _ = v.Args[1] x := v.Args[0] @@ -27407,312 +21134,307 @@ func rewriteValueARM64_OpARM64SUB_0(v *Value) bool { break } c := v_1.AuxInt - v.reset(OpARM64SUBconst) - v.AuxInt = c + v.reset(OpARM64SLLconst) + v.AuxInt = c & 63 v.AddArg(x) return true } - // match: (SUB a l:(MUL x y)) - // cond: l.Uses==1 && clobber(l) - // result: (MSUB a x y) + return false +} +func rewriteValueARM64_OpARM64SLLconst_0(v *Value) bool { + // match: (SLLconst [c] (MOVDconst [d])) + // result: (MOVDconst [d< x z) y) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SUB { + x := v_0.Args[0] + if !(isARM64BFMask(sc, 1<<8-1, 0)) { break } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpARM64SUB) - v0 := b.NewValue0(v.Pos, OpARM64ADD, v.Type) - v0.AddArg(x) - v0.AddArg(z) - v.AddArg(v0) - v.AddArg(y) + v.reset(OpARM64UBFIZ) + v.AuxInt = armBFAuxInt(sc, 8) + v.AddArg(x) return true } - // match: (SUB (SUB x y) z) - // result: (SUB x (ADD y z)) + // match: (SLLconst [sc] (UBFIZ [bfc] x)) + // cond: sc+getARM64BFwidth(bfc)+getARM64BFlsb(bfc) < 64 + // result: (UBFIZ [armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc))] x) for { - z := v.Args[1] + sc := v.AuxInt v_0 := v.Args[0] - if v_0.Op != OpARM64SUB { + if v_0.Op != OpARM64UBFIZ { break } - y := v_0.Args[1] + bfc := v_0.AuxInt x := v_0.Args[0] - v.reset(OpARM64SUB) + if !(sc+getARM64BFwidth(bfc)+getARM64BFlsb(bfc) < 64) { + break + } + v.reset(OpARM64UBFIZ) + v.AuxInt = armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)) v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpARM64ADD, y.Type) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) return true } - // match: (SUB x0 x1:(SLLconst [c] y)) - // cond: clobberIfDead(x1) - // result: (SUBshiftLL x0 y [c]) + return false +} +func rewriteValueARM64_OpARM64SRA_0(v *Value) bool { + // match: (SRA x (MOVDconst [c])) + // result: (SRAconst x [c&63]) for { _ = v.Args[1] - x0 := v.Args[0] - x1 := v.Args[1] - if x1.Op != OpARM64SLLconst { - break - } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - v.reset(OpARM64SUBshiftLL) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) + c := v_1.AuxInt + v.reset(OpARM64SRAconst) + v.AuxInt = c & 63 + v.AddArg(x) return true } - // match: (SUB x0 x1:(SRLconst [c] y)) - // cond: clobberIfDead(x1) - // result: (SUBshiftRL x0 y [c]) + return false +} +func rewriteValueARM64_OpARM64SRAconst_0(v *Value) bool { + // match: (SRAconst [c] (MOVDconst [d])) + // result: (MOVDconst [d>>uint64(c)]) for { - _ = v.Args[1] - x0 := v.Args[0] - x1 := v.Args[1] - if x1.Op != OpARM64SRLconst { - break - } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { + c := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - v.reset(OpARM64SUBshiftRL) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) + d := v_0.AuxInt + v.reset(OpARM64MOVDconst) + v.AuxInt = d >> uint64(c) return true } - return false -} -func rewriteValueARM64_OpARM64SUB_10(v *Value) bool { - // match: (SUB x0 x1:(SRAconst [c] y)) - // cond: clobberIfDead(x1) - // result: (SUBshiftRA x0 y [c]) + // match: (SRAconst [rc] (SLLconst [lc] x)) + // cond: lc > rc + // result: (SBFIZ [armBFAuxInt(lc-rc, 64-lc)] x) for { - _ = v.Args[1] - x0 := v.Args[0] - x1 := v.Args[1] - if x1.Op != OpARM64SRAconst { + rc := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64SLLconst { break } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { + lc := v_0.AuxInt + x := v_0.Args[0] + if !(lc > rc) { break } - v.reset(OpARM64SUBshiftRA) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) + v.reset(OpARM64SBFIZ) + v.AuxInt = armBFAuxInt(lc-rc, 64-lc) + v.AddArg(x) return true } - return false -} -func rewriteValueARM64_OpARM64SUBconst_0(v *Value) bool { - // match: (SUBconst [0] x) - // result: x + // match: (SRAconst [rc] (SLLconst [lc] x)) + // cond: lc <= rc + // result: (SBFX [armBFAuxInt(rc-lc, 64-rc)] x) for { - if v.AuxInt != 0 { + rc := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64SLLconst { break } - x := v.Args[0] - v.reset(OpCopy) - v.Type = x.Type + lc := v_0.AuxInt + x := v_0.Args[0] + if !(lc <= rc) { + break + } + v.reset(OpARM64SBFX) + v.AuxInt = armBFAuxInt(rc-lc, 64-rc) v.AddArg(x) return true } - // match: (SUBconst [c] (MOVDconst [d])) - // result: (MOVDconst [d-c]) + // match: (SRAconst [rc] (MOVWreg x)) + // cond: rc < 32 + // result: (SBFX [armBFAuxInt(rc, 32-rc)] x) for { - c := v.AuxInt + rc := v.AuxInt v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + if v_0.Op != OpARM64MOVWreg { break } - d := v_0.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = d - c + x := v_0.Args[0] + if !(rc < 32) { + break + } + v.reset(OpARM64SBFX) + v.AuxInt = armBFAuxInt(rc, 32-rc) + v.AddArg(x) return true } - // match: (SUBconst [c] (SUBconst [d] x)) - // result: (ADDconst [-c-d] x) + // match: (SRAconst [rc] (MOVHreg x)) + // cond: rc < 16 + // result: (SBFX [armBFAuxInt(rc, 16-rc)] x) for { - c := v.AuxInt + rc := v.AuxInt v_0 := v.Args[0] - if v_0.Op != OpARM64SUBconst { + if v_0.Op != OpARM64MOVHreg { break } - d := v_0.AuxInt x := v_0.Args[0] - v.reset(OpARM64ADDconst) - v.AuxInt = -c - d + if !(rc < 16) { + break + } + v.reset(OpARM64SBFX) + v.AuxInt = armBFAuxInt(rc, 16-rc) v.AddArg(x) return true } - // match: (SUBconst [c] (ADDconst [d] x)) - // result: (ADDconst [-c+d] x) + // match: (SRAconst [rc] (MOVBreg x)) + // cond: rc < 8 + // result: (SBFX [armBFAuxInt(rc, 8-rc)] x) for { - c := v.AuxInt + rc := v.AuxInt v_0 := v.Args[0] - if v_0.Op != OpARM64ADDconst { + if v_0.Op != OpARM64MOVBreg { break } - d := v_0.AuxInt x := v_0.Args[0] - v.reset(OpARM64ADDconst) - v.AuxInt = -c + d + if !(rc < 8) { + break + } + v.reset(OpARM64SBFX) + v.AuxInt = armBFAuxInt(rc, 8-rc) v.AddArg(x) return true } - return false -} -func rewriteValueARM64_OpARM64SUBshiftLL_0(v *Value) bool { - // match: (SUBshiftLL x (MOVDconst [c]) [d]) - // result: (SUBconst x [int64(uint64(c)<= getARM64BFlsb(bfc) && sc < getARM64BFlsb(bfc)+getARM64BFwidth(bfc) + // result: (SBFX [armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc)] x) for { - d := v.AuxInt - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SLLconst { + sc := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64SBFIZ { break } - c := v_1.AuxInt - if x != v_1.Args[0] || !(c == d) { + bfc := v_0.AuxInt + x := v_0.Args[0] + if !(sc >= getARM64BFlsb(bfc) && sc < getARM64BFlsb(bfc)+getARM64BFwidth(bfc)) { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.reset(OpARM64SBFX) + v.AuxInt = armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc) + v.AddArg(x) return true } return false } -func rewriteValueARM64_OpARM64SUBshiftRA_0(v *Value) bool { - // match: (SUBshiftRA x (MOVDconst [c]) [d]) - // result: (SUBconst x [c>>uint64(d)]) +func rewriteValueARM64_OpARM64SRL_0(v *Value) bool { + // match: (SRL x (MOVDconst [c])) + // result: (SRLconst x [c&63]) for { - d := v.AuxInt _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] @@ -27720,652 +21442,675 @@ func rewriteValueARM64_OpARM64SUBshiftRA_0(v *Value) bool { break } c := v_1.AuxInt - v.reset(OpARM64SUBconst) - v.AuxInt = c >> uint64(d) + v.reset(OpARM64SRLconst) + v.AuxInt = c & 63 v.AddArg(x) return true } - // match: (SUBshiftRA x (SRAconst x [c]) [d]) - // cond: c==d - // result: (MOVDconst [0]) - for { - d := v.AuxInt - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64SRAconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(c == d) { - break - } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 - return true - } return false } -func rewriteValueARM64_OpARM64SUBshiftRL_0(v *Value) bool { - // match: (SUBshiftRL x (MOVDconst [c]) [d]) - // result: (SUBconst x [int64(uint64(c)>>uint64(d))]) +func rewriteValueARM64_OpARM64SRLconst_0(v *Value) bool { + // match: (SRLconst [c] (MOVDconst [d])) + // result: (MOVDconst [int64(uint64(d)>>uint64(c))]) for { - d := v.AuxInt - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + c := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt - v.reset(OpARM64SUBconst) - v.AuxInt = int64(uint64(c) >> uint64(d)) - v.AddArg(x) + d := v_0.AuxInt + v.reset(OpARM64MOVDconst) + v.AuxInt = int64(uint64(d) >> uint64(c)) return true } - // match: (SUBshiftRL x (SRLconst x [c]) [d]) - // cond: c==d - // result: (MOVDconst [0]) + // match: (SRLconst [c] (SLLconst [c] x)) + // cond: 0 < c && c < 64 + // result: (ANDconst [1< rc + // result: (UBFIZ [armBFAuxInt(lc-rc, 64-lc)] x) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + rc := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64SLLconst { break } - c := v_1.AuxInt - v.reset(OpARM64TSTconst) - v.AuxInt = c + lc := v_0.AuxInt + x := v_0.Args[0] + if !(lc > rc) { + break + } + v.reset(OpARM64UBFIZ) + v.AuxInt = armBFAuxInt(lc-rc, 64-lc) v.AddArg(x) return true } - // match: (TST (MOVDconst [c]) x) - // result: (TSTconst [c] x) + // match: (SRLconst [sc] (ANDconst [ac] x)) + // cond: isARM64BFMask(sc, ac, sc) + // result: (UBFX [armBFAuxInt(sc, arm64BFWidth(ac, sc))] x) for { - x := v.Args[1] + sc := v.AuxInt v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + if v_0.Op != OpARM64ANDconst { break } - c := v_0.AuxInt - v.reset(OpARM64TSTconst) - v.AuxInt = c + ac := v_0.AuxInt + x := v_0.Args[0] + if !(isARM64BFMask(sc, ac, sc)) { + break + } + v.reset(OpARM64UBFX) + v.AuxInt = armBFAuxInt(sc, arm64BFWidth(ac, sc)) v.AddArg(x) return true } - // match: (TST x0 x1:(SLLconst [c] y)) - // cond: clobberIfDead(x1) - // result: (TSTshiftLL x0 y [c]) + // match: (SRLconst [sc] (MOVWUreg x)) + // cond: isARM64BFMask(sc, 1<<32-1, sc) + // result: (UBFX [armBFAuxInt(sc, arm64BFWidth(1<<32-1, sc))] x) for { - _ = v.Args[1] - x0 := v.Args[0] - x1 := v.Args[1] - if x1.Op != OpARM64SLLconst { + sc := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVWUreg { break } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { + x := v_0.Args[0] + if !(isARM64BFMask(sc, 1<<32-1, sc)) { break } - v.reset(OpARM64TSTshiftLL) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) + v.reset(OpARM64UBFX) + v.AuxInt = armBFAuxInt(sc, arm64BFWidth(1<<32-1, sc)) + v.AddArg(x) return true } - // match: (TST x1:(SLLconst [c] y) x0) - // cond: clobberIfDead(x1) - // result: (TSTshiftLL x0 y [c]) + // match: (SRLconst [sc] (MOVHUreg x)) + // cond: isARM64BFMask(sc, 1<<16-1, sc) + // result: (UBFX [armBFAuxInt(sc, arm64BFWidth(1<<16-1, sc))] x) for { - x0 := v.Args[1] - x1 := v.Args[0] - if x1.Op != OpARM64SLLconst { + sc := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVHUreg { break } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { + x := v_0.Args[0] + if !(isARM64BFMask(sc, 1<<16-1, sc)) { break } - v.reset(OpARM64TSTshiftLL) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) + v.reset(OpARM64UBFX) + v.AuxInt = armBFAuxInt(sc, arm64BFWidth(1<<16-1, sc)) + v.AddArg(x) return true } - // match: (TST x0 x1:(SRLconst [c] y)) - // cond: clobberIfDead(x1) - // result: (TSTshiftRL x0 y [c]) - for { - _ = v.Args[1] - x0 := v.Args[0] - x1 := v.Args[1] - if x1.Op != OpARM64SRLconst { + // match: (SRLconst [sc] (MOVBUreg x)) + // cond: isARM64BFMask(sc, 1<<8-1, sc) + // result: (UBFX [armBFAuxInt(sc, arm64BFWidth(1<<8-1, sc))] x) + for { + sc := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVBUreg { break } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { + x := v_0.Args[0] + if !(isARM64BFMask(sc, 1<<8-1, sc)) { break } - v.reset(OpARM64TSTshiftRL) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) + v.reset(OpARM64UBFX) + v.AuxInt = armBFAuxInt(sc, arm64BFWidth(1<<8-1, sc)) + v.AddArg(x) return true } - // match: (TST x1:(SRLconst [c] y) x0) - // cond: clobberIfDead(x1) - // result: (TSTshiftRL x0 y [c]) + // match: (SRLconst [rc] (SLLconst [lc] x)) + // cond: lc < rc + // result: (UBFX [armBFAuxInt(rc-lc, 64-rc)] x) for { - x0 := v.Args[1] - x1 := v.Args[0] - if x1.Op != OpARM64SRLconst { + rc := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64SLLconst { break } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { + lc := v_0.AuxInt + x := v_0.Args[0] + if !(lc < rc) { break } - v.reset(OpARM64TSTshiftRL) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) + v.reset(OpARM64UBFX) + v.AuxInt = armBFAuxInt(rc-lc, 64-rc) + v.AddArg(x) return true } - // match: (TST x0 x1:(SRAconst [c] y)) - // cond: clobberIfDead(x1) - // result: (TSTshiftRA x0 y [c]) + // match: (SRLconst [sc] (UBFX [bfc] x)) + // cond: sc < getARM64BFwidth(bfc) + // result: (UBFX [armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)-sc)] x) for { - _ = v.Args[1] - x0 := v.Args[0] - x1 := v.Args[1] - if x1.Op != OpARM64SRAconst { + sc := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64UBFX { break } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { + bfc := v_0.AuxInt + x := v_0.Args[0] + if !(sc < getARM64BFwidth(bfc)) { break } - v.reset(OpARM64TSTshiftRA) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) + v.reset(OpARM64UBFX) + v.AuxInt = armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)-sc) + v.AddArg(x) return true } - // match: (TST x1:(SRAconst [c] y) x0) - // cond: clobberIfDead(x1) - // result: (TSTshiftRA x0 y [c]) + // match: (SRLconst [sc] (UBFIZ [bfc] x)) + // cond: sc == getARM64BFlsb(bfc) + // result: (ANDconst [1< getARM64BFlsb(bfc) && sc < getARM64BFlsb(bfc)+getARM64BFwidth(bfc) + // result: (UBFX [armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc)] x) for { - x := v.Args[1] + sc := v.AuxInt v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + if v_0.Op != OpARM64UBFIZ { break } - c := v_0.AuxInt - v.reset(OpARM64TSTWconst) - v.AuxInt = c + bfc := v_0.AuxInt + x := v_0.Args[0] + if !(sc > getARM64BFlsb(bfc) && sc < getARM64BFlsb(bfc)+getARM64BFwidth(bfc)) { + break + } + v.reset(OpARM64UBFX) + v.AuxInt = armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc) v.AddArg(x) return true } return false } -func rewriteValueARM64_OpARM64TSTWconst_0(v *Value) bool { - // match: (TSTWconst (MOVDconst [x]) [y]) - // cond: int32(x&y)==0 - // result: (FlagEQ) +func rewriteValueARM64_OpARM64STP_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (STP [off1] {sym} (ADDconst [off2] ptr) val1 val2 mem) + // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (STP [off1+off2] {sym} ptr val1 val2 mem) for { - y := v.AuxInt + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[3] v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + if v_0.Op != OpARM64ADDconst { break } - x := v_0.AuxInt - if !(int32(x&y) == 0) { + off2 := v_0.AuxInt + ptr := v_0.Args[0] + val1 := v.Args[1] + val2 := v.Args[2] + if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(OpARM64FlagEQ) + v.reset(OpARM64STP) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(ptr) + v.AddArg(val1) + v.AddArg(val2) + v.AddArg(mem) return true } - // match: (TSTWconst (MOVDconst [x]) [y]) - // cond: int32(x&y)<0 - // result: (FlagLT_UGT) + // match: (STP [off1] {sym1} (MOVDaddr [off2] {sym2} ptr) val1 val2 mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) + // result: (STP [off1+off2] {mergeSym(sym1,sym2)} ptr val1 val2 mem) for { - y := v.AuxInt + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[3] v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + if v_0.Op != OpARM64MOVDaddr { break } - x := v_0.AuxInt - if !(int32(x&y) < 0) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + ptr := v_0.Args[0] + val1 := v.Args[1] + val2 := v.Args[2] + if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } - v.reset(OpARM64FlagLT_UGT) + v.reset(OpARM64STP) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(ptr) + v.AddArg(val1) + v.AddArg(val2) + v.AddArg(mem) return true } - // match: (TSTWconst (MOVDconst [x]) [y]) - // cond: int32(x&y)>0 - // result: (FlagGT_UGT) + // match: (STP [off] {sym} ptr (MOVDconst [0]) (MOVDconst [0]) mem) + // result: (MOVQstorezero [off] {sym} ptr mem) for { - y := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + off := v.AuxInt + sym := v.Aux + mem := v.Args[3] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 0 { break } - x := v_0.AuxInt - if !(int32(x&y) > 0) { + v_2 := v.Args[2] + if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 0 { break } - v.reset(OpARM64FlagGT_UGT) + v.reset(OpARM64MOVQstorezero) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(mem) return true } return false } -func rewriteValueARM64_OpARM64TSTconst_0(v *Value) bool { - // match: (TSTconst (MOVDconst [x]) [y]) - // cond: int64(x&y)==0 - // result: (FlagEQ) +func rewriteValueARM64_OpARM64SUB_0(v *Value) bool { + b := v.Block + // match: (SUB x (MOVDconst [c])) + // result: (SUBconst [c] x) for { - y := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { + break + } + c := v_1.AuxInt + v.reset(OpARM64SUBconst) + v.AuxInt = c + v.AddArg(x) + return true + } + // match: (SUB a l:(MUL x y)) + // cond: l.Uses==1 && clobber(l) + // result: (MSUB a x y) + for { + _ = v.Args[1] + a := v.Args[0] + l := v.Args[1] + if l.Op != OpARM64MUL { + break + } + y := l.Args[1] + x := l.Args[0] + if !(l.Uses == 1 && clobber(l)) { + break + } + v.reset(OpARM64MSUB) + v.AddArg(a) + v.AddArg(x) + v.AddArg(y) + return true + } + // match: (SUB a l:(MNEG x y)) + // cond: l.Uses==1 && clobber(l) + // result: (MADD a x y) + for { + _ = v.Args[1] + a := v.Args[0] + l := v.Args[1] + if l.Op != OpARM64MNEG { break } - x := v_0.AuxInt - if !(int64(x&y) == 0) { + y := l.Args[1] + x := l.Args[0] + if !(l.Uses == 1 && clobber(l)) { break } - v.reset(OpARM64FlagEQ) + v.reset(OpARM64MADD) + v.AddArg(a) + v.AddArg(x) + v.AddArg(y) return true } - // match: (TSTconst (MOVDconst [x]) [y]) - // cond: int64(x&y)<0 - // result: (FlagLT_UGT) + // match: (SUB a l:(MULW x y)) + // cond: a.Type.Size() != 8 && l.Uses==1 && clobber(l) + // result: (MSUBW a x y) for { - y := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + _ = v.Args[1] + a := v.Args[0] + l := v.Args[1] + if l.Op != OpARM64MULW { break } - x := v_0.AuxInt - if !(int64(x&y) < 0) { + y := l.Args[1] + x := l.Args[0] + if !(a.Type.Size() != 8 && l.Uses == 1 && clobber(l)) { break } - v.reset(OpARM64FlagLT_UGT) + v.reset(OpARM64MSUBW) + v.AddArg(a) + v.AddArg(x) + v.AddArg(y) return true } - // match: (TSTconst (MOVDconst [x]) [y]) - // cond: int64(x&y)>0 - // result: (FlagGT_UGT) + // match: (SUB a l:(MNEGW x y)) + // cond: a.Type.Size() != 8 && l.Uses==1 && clobber(l) + // result: (MADDW a x y) for { - y := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + _ = v.Args[1] + a := v.Args[0] + l := v.Args[1] + if l.Op != OpARM64MNEGW { break } - x := v_0.AuxInt - if !(int64(x&y) > 0) { + y := l.Args[1] + x := l.Args[0] + if !(a.Type.Size() != 8 && l.Uses == 1 && clobber(l)) { break } - v.reset(OpARM64FlagGT_UGT) + v.reset(OpARM64MADDW) + v.AddArg(a) + v.AddArg(x) + v.AddArg(y) return true } - return false -} -func rewriteValueARM64_OpARM64TSTshiftLL_0(v *Value) bool { - b := v.Block - // match: (TSTshiftLL (MOVDconst [c]) x [d]) - // result: (TSTconst [c] (SLLconst x [d])) + // match: (SUB x x) + // result: (MOVDconst [0]) for { - d := v.AuxInt x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + if x != v.Args[0] { break } - c := v_0.AuxInt - v.reset(OpARM64TSTconst) - v.AuxInt = c - v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v0.AuxInt = d - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } - // match: (TSTshiftLL x (MOVDconst [c]) [d]) - // result: (TSTconst x [int64(uint64(c)< x z) y) for { - d := v.AuxInt _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + if v_1.Op != OpARM64SUB { break } - c := v_1.AuxInt - v.reset(OpARM64TSTconst) - v.AuxInt = int64(uint64(c) << uint64(d)) - v.AddArg(x) + z := v_1.Args[1] + y := v_1.Args[0] + v.reset(OpARM64SUB) + v0 := b.NewValue0(v.Pos, OpARM64ADD, v.Type) + v0.AddArg(x) + v0.AddArg(z) + v.AddArg(v0) + v.AddArg(y) return true } - return false -} -func rewriteValueARM64_OpARM64TSTshiftRA_0(v *Value) bool { - b := v.Block - // match: (TSTshiftRA (MOVDconst [c]) x [d]) - // result: (TSTconst [c] (SRAconst x [d])) + // match: (SUB (SUB x y) z) + // result: (SUB x (ADD y z)) for { - d := v.AuxInt - x := v.Args[1] + z := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + if v_0.Op != OpARM64SUB { break } - c := v_0.AuxInt - v.reset(OpARM64TSTconst) - v.AuxInt = c - v0 := b.NewValue0(v.Pos, OpARM64SRAconst, x.Type) - v0.AuxInt = d - v0.AddArg(x) + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpARM64SUB) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpARM64ADD, y.Type) + v0.AddArg(y) + v0.AddArg(z) v.AddArg(v0) return true } - // match: (TSTshiftRA x (MOVDconst [c]) [d]) - // result: (TSTconst x [c>>uint64(d)]) + // match: (SUB x0 x1:(SLLconst [c] y)) + // cond: clobberIfDead(x1) + // result: (SUBshiftLL x0 y [c]) for { - d := v.AuxInt _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + x0 := v.Args[0] + x1 := v.Args[1] + if x1.Op != OpARM64SLLconst { break } - c := v_1.AuxInt - v.reset(OpARM64TSTconst) - v.AuxInt = c >> uint64(d) - v.AddArg(x) - return true - } - return false -} -func rewriteValueARM64_OpARM64TSTshiftRL_0(v *Value) bool { - b := v.Block - // match: (TSTshiftRL (MOVDconst [c]) x [d]) - // result: (TSTconst [c] (SRLconst x [d])) - for { - d := v.AuxInt - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + c := x1.AuxInt + y := x1.Args[0] + if !(clobberIfDead(x1)) { break } - c := v_0.AuxInt - v.reset(OpARM64TSTconst) + v.reset(OpARM64SUBshiftLL) v.AuxInt = c - v0 := b.NewValue0(v.Pos, OpARM64SRLconst, x.Type) - v0.AuxInt = d - v0.AddArg(x) - v.AddArg(v0) + v.AddArg(x0) + v.AddArg(y) return true } - // match: (TSTshiftRL x (MOVDconst [c]) [d]) - // result: (TSTconst x [int64(uint64(c)>>uint64(d))]) + // match: (SUB x0 x1:(SRLconst [c] y)) + // cond: clobberIfDead(x1) + // result: (SUBshiftRL x0 y [c]) for { - d := v.AuxInt _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - v.reset(OpARM64TSTconst) - v.AuxInt = int64(uint64(c) >> uint64(d)) - v.AddArg(x) - return true - } - return false -} -func rewriteValueARM64_OpARM64UBFIZ_0(v *Value) bool { - // match: (UBFIZ [bfc] (SLLconst [sc] x)) - // cond: sc < getARM64BFwidth(bfc) - // result: (UBFIZ [armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)-sc)] x) - for { - bfc := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64SLLconst { + x0 := v.Args[0] + x1 := v.Args[1] + if x1.Op != OpARM64SRLconst { break } - sc := v_0.AuxInt - x := v_0.Args[0] - if !(sc < getARM64BFwidth(bfc)) { + c := x1.AuxInt + y := x1.Args[0] + if !(clobberIfDead(x1)) { break } - v.reset(OpARM64UBFIZ) - v.AuxInt = armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)-sc) - v.AddArg(x) + v.reset(OpARM64SUBshiftRL) + v.AuxInt = c + v.AddArg(x0) + v.AddArg(y) return true } return false } -func rewriteValueARM64_OpARM64UBFX_0(v *Value) bool { - // match: (UBFX [bfc] (SRLconst [sc] x)) - // cond: sc+getARM64BFwidth(bfc)+getARM64BFlsb(bfc) < 64 - // result: (UBFX [armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc))] x) +func rewriteValueARM64_OpARM64SUB_10(v *Value) bool { + // match: (SUB x0 x1:(SRAconst [c] y)) + // cond: clobberIfDead(x1) + // result: (SUBshiftRA x0 y [c]) for { - bfc := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpARM64SRLconst { + _ = v.Args[1] + x0 := v.Args[0] + x1 := v.Args[1] + if x1.Op != OpARM64SRAconst { break } - sc := v_0.AuxInt - x := v_0.Args[0] - if !(sc+getARM64BFwidth(bfc)+getARM64BFlsb(bfc) < 64) { + c := x1.AuxInt + y := x1.Args[0] + if !(clobberIfDead(x1)) { break } - v.reset(OpARM64UBFX) - v.AuxInt = armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)) - v.AddArg(x) + v.reset(OpARM64SUBshiftRA) + v.AuxInt = c + v.AddArg(x0) + v.AddArg(y) return true } - // match: (UBFX [bfc] (SLLconst [sc] x)) - // cond: sc == getARM64BFlsb(bfc) - // result: (ANDconst [1< getARM64BFlsb(bfc) && sc < getARM64BFlsb(bfc)+getARM64BFwidth(bfc) - // result: (UBFIZ [armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc)] x) + // match: (SUBconst [c] (ADDconst [d] x)) + // result: (ADDconst [-c+d] x) for { - bfc := v.AuxInt + c := v.AuxInt v_0 := v.Args[0] - if v_0.Op != OpARM64SLLconst { + if v_0.Op != OpARM64ADDconst { break } - sc := v_0.AuxInt + d := v_0.AuxInt x := v_0.Args[0] - if !(sc > getARM64BFlsb(bfc) && sc < getARM64BFlsb(bfc)+getARM64BFwidth(bfc)) { - break - } - v.reset(OpARM64UBFIZ) - v.AuxInt = armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc) + v.reset(OpARM64ADDconst) + v.AuxInt = -c + d v.AddArg(x) return true } return false } -func rewriteValueARM64_OpARM64UDIV_0(v *Value) bool { - // match: (UDIV x (MOVDconst [1])) - // result: x +func rewriteValueARM64_OpARM64SUBshiftLL_0(v *Value) bool { + // match: (SUBshiftLL x (MOVDconst [c]) [d]) + // result: (SUBconst x [int64(uint64(c)<>uint64(d)]) for { + d := v.AuxInt _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt + x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } - d := v_1.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = int64(uint64(c) / uint64(d)) + c := v_1.AuxInt + v.reset(OpARM64SUBconst) + v.AuxInt = c >> uint64(d) + v.AddArg(x) return true } - return false -} -func rewriteValueARM64_OpARM64UDIVW_0(v *Value) bool { - // match: (UDIVW x (MOVDconst [c])) - // cond: uint32(c)==1 - // result: x + // match: (SUBshiftRA x (SRAconst x [c]) [d]) + // cond: c==d + // result: (MOVDconst [0]) for { + d := v.AuxInt _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + if v_1.Op != OpARM64SRAconst { break } c := v_1.AuxInt - if !(uint32(c) == 1) { + if x != v_1.Args[0] || !(c == d) { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 return true } - // match: (UDIVW x (MOVDconst [c])) - // cond: isPowerOfTwo(c) && is32Bit(c) - // result: (SRLconst [log2(c)] x) + return false +} +func rewriteValueARM64_OpARM64SUBshiftRL_0(v *Value) bool { + // match: (SUBshiftRL x (MOVDconst [c]) [d]) + // result: (SUBconst x [int64(uint64(c)>>uint64(d))]) for { + d := v.AuxInt _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] @@ -28373,938 +22118,1143 @@ func rewriteValueARM64_OpARM64UDIVW_0(v *Value) bool { break } c := v_1.AuxInt - if !(isPowerOfTwo(c) && is32Bit(c)) { - break - } - v.reset(OpARM64SRLconst) - v.AuxInt = log2(c) + v.reset(OpARM64SUBconst) + v.AuxInt = int64(uint64(c) >> uint64(d)) v.AddArg(x) return true } - // match: (UDIVW (MOVDconst [c]) (MOVDconst [d])) - // result: (MOVDconst [int64(uint32(c)/uint32(d))]) + // match: (SUBshiftRL x (SRLconst x [c]) [d]) + // cond: c==d + // result: (MOVDconst [0]) for { + d := v.AuxInt _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64SRLconst { break } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + c := v_1.AuxInt + if x != v_1.Args[0] || !(c == d) { break } - d := v_1.AuxInt v.reset(OpARM64MOVDconst) - v.AuxInt = int64(uint32(c) / uint32(d)) + v.AuxInt = 0 return true } return false } -func rewriteValueARM64_OpARM64UMOD_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (UMOD x y) - // result: (MSUB x y (UDIV x y)) +func rewriteValueARM64_OpARM64TST_0(v *Value) bool { + // match: (TST x (MOVDconst [c])) + // result: (TSTconst [c] x) for { - if v.Type != typ.UInt64 { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + v.reset(OpARM64TSTconst) + v.AuxInt = c + v.AddArg(x) + return true } - y := v.Args[1] - x := v.Args[0] - v.reset(OpARM64MSUB) - v.Type = typ.UInt64 - v.AddArg(x) - v.AddArg(y) - v0 := b.NewValue0(v.Pos, OpARM64UDIV, typ.UInt64) - v0.AddArg(x) - v0.AddArg(y) - v.AddArg(v0) - return true + break } - // match: (UMOD _ (MOVDconst [1])) - // result: (MOVDconst [0]) + // match: (TST x0 x1:(SLLconst [c] y)) + // cond: clobberIfDead(x1) + // result: (TSTshiftLL x0 y [c]) for { _ = v.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + x1 := v.Args[1^_i0] + if x1.Op != OpARM64SLLconst { + continue + } + c := x1.AuxInt + y := x1.Args[0] + if !(clobberIfDead(x1)) { + continue + } + v.reset(OpARM64TSTshiftLL) + v.AuxInt = c + v.AddArg(x0) + v.AddArg(y) + return true } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 - return true + break } - // match: (UMOD x (MOVDconst [c])) - // cond: isPowerOfTwo(c) - // result: (ANDconst [c-1] x) + // match: (TST x0 x1:(SRLconst [c] y)) + // cond: clobberIfDead(x1) + // result: (TSTshiftRL x0 y [c]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + x1 := v.Args[1^_i0] + if x1.Op != OpARM64SRLconst { + continue + } + c := x1.AuxInt + y := x1.Args[0] + if !(clobberIfDead(x1)) { + continue + } + v.reset(OpARM64TSTshiftRL) + v.AuxInt = c + v.AddArg(x0) + v.AddArg(y) + return true } - v.reset(OpARM64ANDconst) - v.AuxInt = c - 1 - v.AddArg(x) - return true + break } - // match: (UMOD (MOVDconst [c]) (MOVDconst [d])) - // result: (MOVDconst [int64(uint64(c)%uint64(d))]) + // match: (TST x0 x1:(SRAconst [c] y)) + // cond: clobberIfDead(x1) + // result: (TSTshiftRA x0 y [c]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64MOVDconst { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + x1 := v.Args[1^_i0] + if x1.Op != OpARM64SRAconst { + continue + } + c := x1.AuxInt + y := x1.Args[0] + if !(clobberIfDead(x1)) { + continue + } + v.reset(OpARM64TSTshiftRA) + v.AuxInt = c + v.AddArg(x0) + v.AddArg(y) + return true } - d := v_1.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = int64(uint64(c) % uint64(d)) - return true + break } return false } -func rewriteValueARM64_OpARM64UMODW_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (UMODW x y) - // result: (MSUBW x y (UDIVW x y)) +func rewriteValueARM64_OpARM64TSTW_0(v *Value) bool { + // match: (TSTW x (MOVDconst [c])) + // result: (TSTWconst [c] x) for { - if v.Type != typ.UInt32 { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + v.reset(OpARM64TSTWconst) + v.AuxInt = c + v.AddArg(x) + return true } - y := v.Args[1] - x := v.Args[0] - v.reset(OpARM64MSUBW) - v.Type = typ.UInt32 - v.AddArg(x) - v.AddArg(y) - v0 := b.NewValue0(v.Pos, OpARM64UDIVW, typ.UInt32) - v0.AddArg(x) - v0.AddArg(y) - v.AddArg(v0) - return true + break } - // match: (UMODW _ (MOVDconst [c])) - // cond: uint32(c)==1 - // result: (MOVDconst [0]) + return false +} +func rewriteValueARM64_OpARM64TSTWconst_0(v *Value) bool { + // match: (TSTWconst (MOVDconst [x]) [y]) + // cond: int32(x&y)==0 + // result: (FlagEQ) for { - _ = v.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + y := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt - if !(uint32(c) == 1) { + x := v_0.AuxInt + if !(int32(x&y) == 0) { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.reset(OpARM64FlagEQ) return true } - // match: (UMODW x (MOVDconst [c])) - // cond: isPowerOfTwo(c) && is32Bit(c) - // result: (ANDconst [c-1] x) + // match: (TSTWconst (MOVDconst [x]) [y]) + // cond: int32(x&y)<0 + // result: (FlagLT_UGT) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + y := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt - if !(isPowerOfTwo(c) && is32Bit(c)) { + x := v_0.AuxInt + if !(int32(x&y) < 0) { break } - v.reset(OpARM64ANDconst) - v.AuxInt = c - 1 - v.AddArg(x) + v.reset(OpARM64FlagLT_UGT) return true } - // match: (UMODW (MOVDconst [c]) (MOVDconst [d])) - // result: (MOVDconst [int64(uint32(c)%uint32(d))]) + // match: (TSTWconst (MOVDconst [x]) [y]) + // cond: int32(x&y)>0 + // result: (FlagGT_UGT) for { - _ = v.Args[1] + y := v.AuxInt v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + x := v_0.AuxInt + if !(int32(x&y) > 0) { break } - d := v_1.AuxInt - v.reset(OpARM64MOVDconst) - v.AuxInt = int64(uint32(c) % uint32(d)) + v.reset(OpARM64FlagGT_UGT) return true } return false } -func rewriteValueARM64_OpARM64XOR_0(v *Value) bool { - // match: (XOR x (MOVDconst [c])) - // result: (XORconst [c] x) +func rewriteValueARM64_OpARM64TSTconst_0(v *Value) bool { + // match: (TSTconst (MOVDconst [x]) [y]) + // cond: int64(x&y)==0 + // result: (FlagEQ) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MOVDconst { + y := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt - v.reset(OpARM64XORconst) - v.AuxInt = c - v.AddArg(x) + x := v_0.AuxInt + if !(int64(x&y) == 0) { + break + } + v.reset(OpARM64FlagEQ) return true } - // match: (XOR (MOVDconst [c]) x) - // result: (XORconst [c] x) + // match: (TSTconst (MOVDconst [x]) [y]) + // cond: int64(x&y)<0 + // result: (FlagLT_UGT) for { - x := v.Args[1] + y := v.AuxInt v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt - v.reset(OpARM64XORconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (XOR x x) - // result: (MOVDconst [0]) - for { - x := v.Args[1] - if x != v.Args[0] { + x := v_0.AuxInt + if !(int64(x&y) < 0) { break } - v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.reset(OpARM64FlagLT_UGT) return true } - // match: (XOR x (MVN y)) - // result: (EON x y) + // match: (TSTconst (MOVDconst [x]) [y]) + // cond: int64(x&y)>0 + // result: (FlagGT_UGT) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64MVN { + y := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - y := v_1.Args[0] - v.reset(OpARM64EON) - v.AddArg(x) - v.AddArg(y) + x := v_0.AuxInt + if !(int64(x&y) > 0) { + break + } + v.reset(OpARM64FlagGT_UGT) return true } - // match: (XOR (MVN y) x) - // result: (EON x y) + return false +} +func rewriteValueARM64_OpARM64TSTshiftLL_0(v *Value) bool { + b := v.Block + // match: (TSTshiftLL (MOVDconst [c]) x [d]) + // result: (TSTconst [c] (SLLconst x [d])) for { + d := v.AuxInt x := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64MVN { + if v_0.Op != OpARM64MOVDconst { break } - y := v_0.Args[0] - v.reset(OpARM64EON) - v.AddArg(x) - v.AddArg(y) + c := v_0.AuxInt + v.reset(OpARM64TSTconst) + v.AuxInt = c + v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) + v0.AuxInt = d + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (XOR x0 x1:(SLLconst [c] y)) - // cond: clobberIfDead(x1) - // result: (XORshiftLL x0 y [c]) + // match: (TSTshiftLL x (MOVDconst [c]) [d]) + // result: (TSTconst x [int64(uint64(c)< x [d])) for { - x0 := v.Args[1] - x1 := v.Args[0] - if x1.Op != OpARM64SLLconst { - break - } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { + d := v.AuxInt + x := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - v.reset(OpARM64XORshiftLL) + c := v_0.AuxInt + v.reset(OpARM64TSTconst) v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) + v0 := b.NewValue0(v.Pos, OpARM64SRAconst, x.Type) + v0.AuxInt = d + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (XOR x0 x1:(SRLconst [c] y)) - // cond: clobberIfDead(x1) - // result: (XORshiftRL x0 y [c]) + // match: (TSTshiftRA x (MOVDconst [c]) [d]) + // result: (TSTconst x [c>>uint64(d)]) for { + d := v.AuxInt _ = v.Args[1] - x0 := v.Args[0] - x1 := v.Args[1] - if x1.Op != OpARM64SRLconst { - break - } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - v.reset(OpARM64XORshiftRL) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) + c := v_1.AuxInt + v.reset(OpARM64TSTconst) + v.AuxInt = c >> uint64(d) + v.AddArg(x) return true } - // match: (XOR x1:(SRLconst [c] y) x0) - // cond: clobberIfDead(x1) - // result: (XORshiftRL x0 y [c]) + return false +} +func rewriteValueARM64_OpARM64TSTshiftRL_0(v *Value) bool { + b := v.Block + // match: (TSTshiftRL (MOVDconst [c]) x [d]) + // result: (TSTconst [c] (SRLconst x [d])) for { - x0 := v.Args[1] - x1 := v.Args[0] - if x1.Op != OpARM64SRLconst { - break - } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { + d := v.AuxInt + x := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - v.reset(OpARM64XORshiftRL) + c := v_0.AuxInt + v.reset(OpARM64TSTconst) v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) + v0 := b.NewValue0(v.Pos, OpARM64SRLconst, x.Type) + v0.AuxInt = d + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (XOR x0 x1:(SRAconst [c] y)) - // cond: clobberIfDead(x1) - // result: (XORshiftRA x0 y [c]) + // match: (TSTshiftRL x (MOVDconst [c]) [d]) + // result: (TSTconst x [int64(uint64(c)>>uint64(d))]) for { - _ = v.Args[1] - x0 := v.Args[0] - x1 := v.Args[1] - if x1.Op != OpARM64SRAconst { - break - } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { + d := v.AuxInt + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - v.reset(OpARM64XORshiftRA) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) + c := v_1.AuxInt + v.reset(OpARM64TSTconst) + v.AuxInt = int64(uint64(c) >> uint64(d)) + v.AddArg(x) return true } return false } -func rewriteValueARM64_OpARM64XOR_10(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (XOR x1:(SRAconst [c] y) x0) - // cond: clobberIfDead(x1) - // result: (XORshiftRA x0 y [c]) +func rewriteValueARM64_OpARM64UBFIZ_0(v *Value) bool { + // match: (UBFIZ [bfc] (SLLconst [sc] x)) + // cond: sc < getARM64BFwidth(bfc) + // result: (UBFIZ [armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)-sc)] x) for { - x0 := v.Args[1] - x1 := v.Args[0] - if x1.Op != OpARM64SRAconst { + bfc := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpARM64SLLconst { break } - c := x1.AuxInt - y := x1.Args[0] - if !(clobberIfDead(x1)) { + sc := v_0.AuxInt + x := v_0.Args[0] + if !(sc < getARM64BFwidth(bfc)) { break } - v.reset(OpARM64XORshiftRA) - v.AuxInt = c - v.AddArg(x0) - v.AddArg(y) + v.reset(OpARM64UBFIZ) + v.AuxInt = armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)-sc) + v.AddArg(x) return true } - // match: (XOR (SLL x (ANDconst [63] y)) (CSEL0 {cc} (SRL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) - // cond: cc.(Op) == OpARM64LessThanU - // result: (ROR x (NEG y)) + return false +} +func rewriteValueARM64_OpARM64UBFX_0(v *Value) bool { + // match: (UBFX [bfc] (SRLconst [sc] x)) + // cond: sc+getARM64BFwidth(bfc)+getARM64BFlsb(bfc) < 64 + // result: (UBFX [armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc))] x) for { - _ = v.Args[1] + bfc := v.AuxInt v_0 := v.Args[0] - if v_0.Op != OpARM64SLL { + if v_0.Op != OpARM64SRLconst { break } - _ = v_0.Args[1] + sc := v_0.AuxInt x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpARM64ANDconst { - break - } - t := v_0_1.Type - if v_0_1.AuxInt != 63 { - break - } - y := v_0_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt64 { - break - } - cc := v_1.Aux - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpARM64SRL || v_1_0.Type != typ.UInt64 { - break - } - _ = v_1_0.Args[1] - if x != v_1_0.Args[0] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpARM64SUB || v_1_0_1.Type != t { - break - } - _ = v_1_0_1.Args[1] - v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 64 { - break - } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 63 || y != v_1_0_1_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpARM64SUB || v_1_1_0.Type != t { - break - } - _ = v_1_1_0.Args[1] - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 64 { - break - } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + if !(sc+getARM64BFwidth(bfc)+getARM64BFlsb(bfc) < 64) { break } - v.reset(OpARM64ROR) + v.reset(OpARM64UBFX) + v.AuxInt = armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)) v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpARM64NEG, t) - v0.AddArg(y) - v.AddArg(v0) return true } - // match: (XOR (CSEL0 {cc} (SRL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y)))) (SLL x (ANDconst [63] y))) - // cond: cc.(Op) == OpARM64LessThanU - // result: (ROR x (NEG y)) + // match: (UBFX [bfc] (SLLconst [sc] x)) + // cond: sc == getARM64BFlsb(bfc) + // result: (ANDconst [1< x (ANDconst [63] y)) (CSEL0 {cc} (SLL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) - // cond: cc.(Op) == OpARM64LessThanU - // result: (ROR x y) + // match: (UBFX [bfc] (SLLconst [sc] x)) + // cond: sc > getARM64BFlsb(bfc) && sc < getARM64BFlsb(bfc)+getARM64BFwidth(bfc) + // result: (UBFIZ [armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc)] x) for { - _ = v.Args[1] + bfc := v.AuxInt v_0 := v.Args[0] - if v_0.Op != OpARM64SRL || v_0.Type != typ.UInt64 { + if v_0.Op != OpARM64SLLconst { break } - _ = v_0.Args[1] + sc := v_0.AuxInt x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpARM64ANDconst { - break - } - t := v_0_1.Type - if v_0_1.AuxInt != 63 { + if !(sc > getARM64BFlsb(bfc) && sc < getARM64BFlsb(bfc)+getARM64BFwidth(bfc)) { break } - y := v_0_1.Args[0] + v.reset(OpARM64UBFIZ) + v.AuxInt = armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc) + v.AddArg(x) + return true + } + return false +} +func rewriteValueARM64_OpARM64UDIV_0(v *Value) bool { + // match: (UDIV x (MOVDconst [1])) + // result: x + for { + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt64 { - break - } - cc := v_1.Aux - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpARM64SLL { - break - } - _ = v_1_0.Args[1] - if x != v_1_0.Args[0] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpARM64SUB || v_1_0_1.Type != t { - break - } - _ = v_1_0_1.Args[1] - v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 64 { - break - } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 63 || y != v_1_0_1_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpARM64SUB || v_1_1_0.Type != t { - break - } - _ = v_1_1_0.Args[1] - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 64 { - break - } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 1 { break } - v.reset(OpARM64ROR) + v.reset(OpCopy) + v.Type = x.Type v.AddArg(x) - v.AddArg(y) return true } - // match: (XOR (CSEL0 {cc} (SLL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y)))) (SRL x (ANDconst [63] y))) - // cond: cc.(Op) == OpARM64LessThanU - // result: (ROR x y) + // match: (UDIV x (MOVDconst [c])) + // cond: isPowerOfTwo(c) + // result: (SRLconst [log2(c)] x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64CSEL0 || v_0.Type != typ.UInt64 { - break - } - cc := v_0.Aux - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpARM64SLL { - break - } - _ = v_0_0.Args[1] - x := v_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpARM64SUB { - break - } - t := v_0_0_1.Type - _ = v_0_0_1.Args[1] - v_0_0_1_0 := v_0_0_1.Args[0] - if v_0_0_1_0.Op != OpARM64MOVDconst || v_0_0_1_0.AuxInt != 64 { - break - } - v_0_0_1_1 := v_0_0_1.Args[1] - if v_0_0_1_1.Op != OpARM64ANDconst || v_0_0_1_1.Type != t || v_0_0_1_1.AuxInt != 63 { - break - } - y := v_0_0_1_1.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpARM64CMPconst || v_0_1.AuxInt != 64 { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpARM64SUB || v_0_1_0.Type != t { - break - } - _ = v_0_1_0.Args[1] - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpARM64MOVDconst || v_0_1_0_0.AuxInt != 64 { - break - } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpARM64ANDconst || v_0_1_0_1.Type != t || v_0_1_0_1.AuxInt != 63 || y != v_0_1_0_1.Args[0] { - break - } + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64SRL || v_1.Type != typ.UInt64 { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { + if v_1.Op != OpARM64MOVDconst { break } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64ANDconst || v_1_1.Type != t || v_1_1.AuxInt != 63 || y != v_1_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + c := v_1.AuxInt + if !(isPowerOfTwo(c)) { break } - v.reset(OpARM64ROR) + v.reset(OpARM64SRLconst) + v.AuxInt = log2(c) v.AddArg(x) - v.AddArg(y) return true } - // match: (XOR (SLL x (ANDconst [31] y)) (CSEL0 {cc} (SRL (MOVWUreg x) (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) - // cond: cc.(Op) == OpARM64LessThanU - // result: (RORW x (NEG y)) + // match: (UDIV (MOVDconst [c]) (MOVDconst [d])) + // result: (MOVDconst [int64(uint64(c)/uint64(d))]) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64SLL { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpARM64ANDconst { - break - } - t := v_0_1.Type - if v_0_1.AuxInt != 31 { + if v_0.Op != OpARM64MOVDconst { break } - y := v_0_1.Args[0] + c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt32 { - break - } - cc := v_1.Aux - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpARM64SRL || v_1_0.Type != typ.UInt32 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpARM64MOVWUreg || x != v_1_0_0.Args[0] { + if v_1.Op != OpARM64MOVDconst { break } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpARM64SUB || v_1_0_1.Type != t { + d := v_1.AuxInt + v.reset(OpARM64MOVDconst) + v.AuxInt = int64(uint64(c) / uint64(d)) + return true + } + return false +} +func rewriteValueARM64_OpARM64UDIVW_0(v *Value) bool { + // match: (UDIVW x (MOVDconst [c])) + // cond: uint32(c)==1 + // result: x + for { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - _ = v_1_0_1.Args[1] - v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 32 { + c := v_1.AuxInt + if !(uint32(c) == 1) { break } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 31 || y != v_1_0_1_1.Args[0] { + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + // match: (UDIVW x (MOVDconst [c])) + // cond: isPowerOfTwo(c) && is32Bit(c) + // result: (SRLconst [log2(c)] x) + for { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { + c := v_1.AuxInt + if !(isPowerOfTwo(c) && is32Bit(c)) { break } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpARM64SUB || v_1_1_0.Type != t { + v.reset(OpARM64SRLconst) + v.AuxInt = log2(c) + v.AddArg(x) + return true + } + // match: (UDIVW (MOVDconst [c]) (MOVDconst [d])) + // result: (MOVDconst [int64(uint32(c)/uint32(d))]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - _ = v_1_1_0.Args[1] - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 32 { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + d := v_1.AuxInt + v.reset(OpARM64MOVDconst) + v.AuxInt = int64(uint32(c) / uint32(d)) + return true + } + return false +} +func rewriteValueARM64_OpARM64UMOD_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (UMOD x y) + // result: (MSUB x y (UDIV x y)) + for { + if v.Type != typ.UInt64 { break } - v.reset(OpARM64RORW) + y := v.Args[1] + x := v.Args[0] + v.reset(OpARM64MSUB) + v.Type = typ.UInt64 v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpARM64NEG, t) + v.AddArg(y) + v0 := b.NewValue0(v.Pos, OpARM64UDIV, typ.UInt64) + v0.AddArg(x) v0.AddArg(y) v.AddArg(v0) return true } - // match: (XOR (CSEL0 {cc} (SRL (MOVWUreg x) (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y)))) (SLL x (ANDconst [31] y))) - // cond: cc.(Op) == OpARM64LessThanU - // result: (RORW x (NEG y)) + // match: (UMOD _ (MOVDconst [1])) + // result: (MOVDconst [0]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64CSEL0 || v_0.Type != typ.UInt32 { - break - } - cc := v_0.Aux - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpARM64SRL || v_0_0.Type != typ.UInt32 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpARM64MOVWUreg { + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 1 { break } - x := v_0_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpARM64SUB { + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 + return true + } + // match: (UMOD x (MOVDconst [c])) + // cond: isPowerOfTwo(c) + // result: (ANDconst [c-1] x) + for { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - t := v_0_0_1.Type - _ = v_0_0_1.Args[1] - v_0_0_1_0 := v_0_0_1.Args[0] - if v_0_0_1_0.Op != OpARM64MOVDconst || v_0_0_1_0.AuxInt != 32 { + c := v_1.AuxInt + if !(isPowerOfTwo(c)) { break } - v_0_0_1_1 := v_0_0_1.Args[1] - if v_0_0_1_1.Op != OpARM64ANDconst || v_0_0_1_1.Type != t || v_0_0_1_1.AuxInt != 31 { + v.reset(OpARM64ANDconst) + v.AuxInt = c - 1 + v.AddArg(x) + return true + } + // match: (UMOD (MOVDconst [c]) (MOVDconst [d])) + // result: (MOVDconst [int64(uint64(c)%uint64(d))]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64MOVDconst { break } - y := v_0_0_1_1.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpARM64CMPconst || v_0_1.AuxInt != 64 { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpARM64SUB || v_0_1_0.Type != t { + d := v_1.AuxInt + v.reset(OpARM64MOVDconst) + v.AuxInt = int64(uint64(c) % uint64(d)) + return true + } + return false +} +func rewriteValueARM64_OpARM64UMODW_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (UMODW x y) + // result: (MSUBW x y (UDIVW x y)) + for { + if v.Type != typ.UInt32 { break } - _ = v_0_1_0.Args[1] - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpARM64MOVDconst || v_0_1_0_0.AuxInt != 32 { + y := v.Args[1] + x := v.Args[0] + v.reset(OpARM64MSUBW) + v.Type = typ.UInt32 + v.AddArg(x) + v.AddArg(y) + v0 := b.NewValue0(v.Pos, OpARM64UDIVW, typ.UInt32) + v0.AddArg(x) + v0.AddArg(y) + v.AddArg(v0) + return true + } + // match: (UMODW _ (MOVDconst [c])) + // cond: uint32(c)==1 + // result: (MOVDconst [0]) + for { + _ = v.Args[1] + v_1 := v.Args[1] + if v_1.Op != OpARM64MOVDconst { break } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpARM64ANDconst || v_0_1_0_1.Type != t || v_0_1_0_1.AuxInt != 31 || y != v_0_1_0_1.Args[0] { + c := v_1.AuxInt + if !(uint32(c) == 1) { break } + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 + return true + } + // match: (UMODW x (MOVDconst [c])) + // cond: isPowerOfTwo(c) && is32Bit(c) + // result: (ANDconst [c-1] x) + for { + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpARM64SLL { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { + if v_1.Op != OpARM64MOVDconst { break } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64ANDconst || v_1_1.Type != t || v_1_1.AuxInt != 31 || y != v_1_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + c := v_1.AuxInt + if !(isPowerOfTwo(c) && is32Bit(c)) { break } - v.reset(OpARM64RORW) + v.reset(OpARM64ANDconst) + v.AuxInt = c - 1 v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpARM64NEG, t) - v0.AddArg(y) - v.AddArg(v0) return true } - // match: (XOR (SRL (MOVWUreg x) (ANDconst [31] y)) (CSEL0 {cc} (SLL x (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) - // cond: cc.(Op) == OpARM64LessThanU - // result: (RORW x y) + // match: (UMODW (MOVDconst [c]) (MOVDconst [d])) + // result: (MOVDconst [int64(uint32(c)%uint32(d))]) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpARM64SRL || v_0.Type != typ.UInt32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpARM64MOVWUreg { - break - } - x := v_0_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpARM64ANDconst { - break - } - t := v_0_1.Type - if v_0_1.AuxInt != 31 { + if v_0.Op != OpARM64MOVDconst { break } - y := v_0_1.Args[0] + c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt32 { + if v_1.Op != OpARM64MOVDconst { break } - cc := v_1.Aux - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpARM64SLL { - break + d := v_1.AuxInt + v.reset(OpARM64MOVDconst) + v.AuxInt = int64(uint32(c) % uint32(d)) + return true + } + return false +} +func rewriteValueARM64_OpARM64XOR_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (XOR x (MOVDconst [c])) + // result: (XORconst [c] x) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MOVDconst { + continue + } + c := v_1.AuxInt + v.reset(OpARM64XORconst) + v.AuxInt = c + v.AddArg(x) + return true } - _ = v_1_0.Args[1] - if x != v_1_0.Args[0] { + break + } + // match: (XOR x x) + // result: (MOVDconst [0]) + for { + x := v.Args[1] + if x != v.Args[0] { break } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpARM64SUB || v_1_0_1.Type != t { - break + v.reset(OpARM64MOVDconst) + v.AuxInt = 0 + return true + } + // match: (XOR x (MVN y)) + // result: (EON x y) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64MVN { + continue + } + y := v_1.Args[0] + v.reset(OpARM64EON) + v.AddArg(x) + v.AddArg(y) + return true } - _ = v_1_0_1.Args[1] - v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 32 { - break + break + } + // match: (XOR x0 x1:(SLLconst [c] y)) + // cond: clobberIfDead(x1) + // result: (XORshiftLL x0 y [c]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + x1 := v.Args[1^_i0] + if x1.Op != OpARM64SLLconst { + continue + } + c := x1.AuxInt + y := x1.Args[0] + if !(clobberIfDead(x1)) { + continue + } + v.reset(OpARM64XORshiftLL) + v.AuxInt = c + v.AddArg(x0) + v.AddArg(y) + return true } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 31 || y != v_1_0_1_1.Args[0] { - break + break + } + // match: (XOR x0 x1:(SRLconst [c] y)) + // cond: clobberIfDead(x1) + // result: (XORshiftRL x0 y [c]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + x1 := v.Args[1^_i0] + if x1.Op != OpARM64SRLconst { + continue + } + c := x1.AuxInt + y := x1.Args[0] + if !(clobberIfDead(x1)) { + continue + } + v.reset(OpARM64XORshiftRL) + v.AuxInt = c + v.AddArg(x0) + v.AddArg(y) + return true } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { - break + break + } + // match: (XOR x0 x1:(SRAconst [c] y)) + // cond: clobberIfDead(x1) + // result: (XORshiftRA x0 y [c]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + x1 := v.Args[1^_i0] + if x1.Op != OpARM64SRAconst { + continue + } + c := x1.AuxInt + y := x1.Args[0] + if !(clobberIfDead(x1)) { + continue + } + v.reset(OpARM64XORshiftRA) + v.AuxInt = c + v.AddArg(x0) + v.AddArg(y) + return true } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpARM64SUB || v_1_1_0.Type != t { - break + break + } + // match: (XOR (SLL x (ANDconst [63] y)) (CSEL0 {cc} (SRL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) + // cond: cc.(Op) == OpARM64LessThanU + // result: (ROR x (NEG y)) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARM64SLL { + continue + } + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpARM64ANDconst { + continue + } + t := v_0_1.Type + if v_0_1.AuxInt != 63 { + continue + } + y := v_0_1.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt64 { + continue + } + cc := v_1.Aux + _ = v_1.Args[1] + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpARM64SRL || v_1_0.Type != typ.UInt64 { + continue + } + _ = v_1_0.Args[1] + if x != v_1_0.Args[0] { + continue + } + v_1_0_1 := v_1_0.Args[1] + if v_1_0_1.Op != OpARM64SUB || v_1_0_1.Type != t { + continue + } + _ = v_1_0_1.Args[1] + v_1_0_1_0 := v_1_0_1.Args[0] + if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 64 { + continue + } + v_1_0_1_1 := v_1_0_1.Args[1] + if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 63 || y != v_1_0_1_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpARM64SUB || v_1_1_0.Type != t { + continue + } + _ = v_1_1_0.Args[1] + v_1_1_0_0 := v_1_1_0.Args[0] + if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 64 { + continue + } + v_1_1_0_1 := v_1_1_0.Args[1] + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + continue + } + v.reset(OpARM64ROR) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpARM64NEG, t) + v0.AddArg(y) + v.AddArg(v0) + return true } - _ = v_1_1_0.Args[1] - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 32 { - break + break + } + // match: (XOR (SRL x (ANDconst [63] y)) (CSEL0 {cc} (SLL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) + // cond: cc.(Op) == OpARM64LessThanU + // result: (ROR x y) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARM64SRL || v_0.Type != typ.UInt64 { + continue + } + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpARM64ANDconst { + continue + } + t := v_0_1.Type + if v_0_1.AuxInt != 63 { + continue + } + y := v_0_1.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt64 { + continue + } + cc := v_1.Aux + _ = v_1.Args[1] + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpARM64SLL { + continue + } + _ = v_1_0.Args[1] + if x != v_1_0.Args[0] { + continue + } + v_1_0_1 := v_1_0.Args[1] + if v_1_0_1.Op != OpARM64SUB || v_1_0_1.Type != t { + continue + } + _ = v_1_0_1.Args[1] + v_1_0_1_0 := v_1_0_1.Args[0] + if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 64 { + continue + } + v_1_0_1_1 := v_1_0_1.Args[1] + if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 63 || y != v_1_0_1_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpARM64SUB || v_1_1_0.Type != t { + continue + } + _ = v_1_1_0.Args[1] + v_1_1_0_0 := v_1_1_0.Args[0] + if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 64 { + continue + } + v_1_1_0_1 := v_1_1_0.Args[1] + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + continue + } + v.reset(OpARM64ROR) + v.AddArg(x) + v.AddArg(y) + return true } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { - break + break + } + // match: (XOR (SLL x (ANDconst [31] y)) (CSEL0 {cc} (SRL (MOVWUreg x) (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) + // cond: cc.(Op) == OpARM64LessThanU + // result: (RORW x (NEG y)) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARM64SLL { + continue + } + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpARM64ANDconst { + continue + } + t := v_0_1.Type + if v_0_1.AuxInt != 31 { + continue + } + y := v_0_1.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt32 { + continue + } + cc := v_1.Aux + _ = v_1.Args[1] + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpARM64SRL || v_1_0.Type != typ.UInt32 { + continue + } + _ = v_1_0.Args[1] + v_1_0_0 := v_1_0.Args[0] + if v_1_0_0.Op != OpARM64MOVWUreg || x != v_1_0_0.Args[0] { + continue + } + v_1_0_1 := v_1_0.Args[1] + if v_1_0_1.Op != OpARM64SUB || v_1_0_1.Type != t { + continue + } + _ = v_1_0_1.Args[1] + v_1_0_1_0 := v_1_0_1.Args[0] + if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 32 { + continue + } + v_1_0_1_1 := v_1_0_1.Args[1] + if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 31 || y != v_1_0_1_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpARM64SUB || v_1_1_0.Type != t { + continue + } + _ = v_1_1_0.Args[1] + v_1_1_0_0 := v_1_1_0.Args[0] + if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 32 { + continue + } + v_1_1_0_1 := v_1_1_0.Args[1] + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + continue + } + v.reset(OpARM64RORW) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpARM64NEG, t) + v0.AddArg(y) + v.AddArg(v0) + return true } - v.reset(OpARM64RORW) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (XOR (CSEL0 {cc} (SLL x (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y)))) (SRL (MOVWUreg x) (ANDconst [31] y))) + // match: (XOR (SRL (MOVWUreg x) (ANDconst [31] y)) (CSEL0 {cc} (SLL x (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) // cond: cc.(Op) == OpARM64LessThanU // result: (RORW x y) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpARM64CSEL0 || v_0.Type != typ.UInt32 { - break - } - cc := v_0.Aux - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpARM64SLL { - break - } - _ = v_0_0.Args[1] - x := v_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpARM64SUB { - break - } - t := v_0_0_1.Type - _ = v_0_0_1.Args[1] - v_0_0_1_0 := v_0_0_1.Args[0] - if v_0_0_1_0.Op != OpARM64MOVDconst || v_0_0_1_0.AuxInt != 32 { - break - } - v_0_0_1_1 := v_0_0_1.Args[1] - if v_0_0_1_1.Op != OpARM64ANDconst || v_0_0_1_1.Type != t || v_0_0_1_1.AuxInt != 31 { - break - } - y := v_0_0_1_1.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpARM64CMPconst || v_0_1.AuxInt != 64 { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpARM64SUB || v_0_1_0.Type != t { - break - } - _ = v_0_1_0.Args[1] - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpARM64MOVDconst || v_0_1_0_0.AuxInt != 32 { - break - } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpARM64ANDconst || v_0_1_0_1.Type != t || v_0_1_0_1.AuxInt != 31 || y != v_0_1_0_1.Args[0] { - break - } - v_1 := v.Args[1] - if v_1.Op != OpARM64SRL || v_1.Type != typ.UInt32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpARM64MOVWUreg || x != v_1_0.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64ANDconst || v_1_1.Type != t || v_1_1.AuxInt != 31 || y != v_1_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpARM64SRL || v_0.Type != typ.UInt32 { + continue + } + _ = v_0.Args[1] + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpARM64MOVWUreg { + continue + } + x := v_0_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpARM64ANDconst { + continue + } + t := v_0_1.Type + if v_0_1.AuxInt != 31 { + continue + } + y := v_0_1.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt32 { + continue + } + cc := v_1.Aux + _ = v_1.Args[1] + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpARM64SLL { + continue + } + _ = v_1_0.Args[1] + if x != v_1_0.Args[0] { + continue + } + v_1_0_1 := v_1_0.Args[1] + if v_1_0_1.Op != OpARM64SUB || v_1_0_1.Type != t { + continue + } + _ = v_1_0_1.Args[1] + v_1_0_1_0 := v_1_0_1.Args[0] + if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 32 { + continue + } + v_1_0_1_1 := v_1_0_1.Args[1] + if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 31 || y != v_1_0_1_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpARM64SUB || v_1_1_0.Type != t { + continue + } + _ = v_1_1_0.Args[1] + v_1_1_0_0 := v_1_1_0.Args[0] + if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 32 { + continue + } + v_1_1_0_1 := v_1_1_0.Args[1] + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + continue + } + v.reset(OpARM64RORW) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpARM64RORW) - v.AddArg(x) - v.AddArg(y) - return true + break } return false } @@ -35729,17 +29679,21 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64AND { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockARM64EQ) + v0 := b.NewValue0(v_0.Pos, OpARM64TST, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARM64EQ) - v0 := b.NewValue0(v_0.Pos, OpARM64TST, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (EQ (CMPWconst [0] z:(AND x y)) yes no) // cond: z.Uses == 1 @@ -35753,17 +29707,21 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64AND { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockARM64EQ) + v0 := b.NewValue0(v_0.Pos, OpARM64TSTW, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARM64EQ) - v0 := b.NewValue0(v_0.Pos, OpARM64TSTW, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (EQ (CMPconst [0] x:(ANDconst [c] y)) yes no) // cond: x.Uses == 1 @@ -35849,17 +29807,21 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64ADD { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockARM64EQ) + v0 := b.NewValue0(v_0.Pos, OpARM64CMN, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARM64EQ) - v0 := b.NewValue0(v_0.Pos, OpARM64CMN, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (EQ (CMPWconst [0] z:(ADD x y)) yes no) // cond: z.Uses == 1 @@ -35873,17 +29835,21 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64ADD { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockARM64EQ) + v0 := b.NewValue0(v_0.Pos, OpARM64CMNW, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARM64EQ) - v0 := b.NewValue0(v_0.Pos, OpARM64CMNW, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (EQ (CMP x z:(NEG y)) yes no) // cond: z.Uses == 1 @@ -36215,17 +30181,21 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64AND { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockARM64GE) + v0 := b.NewValue0(v_0.Pos, OpARM64TST, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARM64GE) - v0 := b.NewValue0(v_0.Pos, OpARM64TST, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (GE (CMPWconst [0] z:(AND x y)) yes no) // cond: z.Uses == 1 @@ -36239,17 +30209,21 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64AND { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockARM64GE) + v0 := b.NewValue0(v_0.Pos, OpARM64TSTW, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARM64GE) - v0 := b.NewValue0(v_0.Pos, OpARM64TSTW, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (GE (CMPconst [0] x:(ANDconst [c] y)) yes no) // cond: x.Uses == 1 @@ -36335,17 +30309,21 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64ADD { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockARM64GE) + v0 := b.NewValue0(v_0.Pos, OpARM64CMN, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARM64GE) - v0 := b.NewValue0(v_0.Pos, OpARM64CMN, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (GE (CMPWconst [0] z:(ADD x y)) yes no) // cond: z.Uses == 1 @@ -36359,17 +30337,21 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64ADD { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockARM64GE) + v0 := b.NewValue0(v_0.Pos, OpARM64CMNW, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARM64GE) - v0 := b.NewValue0(v_0.Pos, OpARM64CMNW, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (GE (CMP x z:(NEG y)) yes no) // cond: z.Uses == 1 @@ -36631,17 +30613,21 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64AND { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockARM64GT) + v0 := b.NewValue0(v_0.Pos, OpARM64TST, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARM64GT) - v0 := b.NewValue0(v_0.Pos, OpARM64TST, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (GT (CMPWconst [0] z:(AND x y)) yes no) // cond: z.Uses == 1 @@ -36655,17 +30641,21 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64AND { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockARM64GT) + v0 := b.NewValue0(v_0.Pos, OpARM64TSTW, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARM64GT) - v0 := b.NewValue0(v_0.Pos, OpARM64TSTW, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (GT (CMPconst [0] x:(ANDconst [c] y)) yes no) // cond: x.Uses == 1 @@ -36751,17 +30741,21 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64ADD { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockARM64GT) + v0 := b.NewValue0(v_0.Pos, OpARM64CMN, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARM64GT) - v0 := b.NewValue0(v_0.Pos, OpARM64CMN, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (GT (CMPWconst [0] z:(ADD x y)) yes no) // cond: z.Uses == 1 @@ -36775,17 +30769,21 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64ADD { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockARM64GT) + v0 := b.NewValue0(v_0.Pos, OpARM64CMNW, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARM64GT) - v0 := b.NewValue0(v_0.Pos, OpARM64CMNW, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (GT (CMP x z:(NEG y)) yes no) // cond: z.Uses == 1 @@ -37157,17 +31155,21 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64AND { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockARM64LE) + v0 := b.NewValue0(v_0.Pos, OpARM64TST, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARM64LE) - v0 := b.NewValue0(v_0.Pos, OpARM64TST, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (LE (CMPWconst [0] z:(AND x y)) yes no) // cond: z.Uses == 1 @@ -37181,17 +31183,21 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64AND { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockARM64LE) + v0 := b.NewValue0(v_0.Pos, OpARM64TSTW, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARM64LE) - v0 := b.NewValue0(v_0.Pos, OpARM64TSTW, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (LE (CMPconst [0] x:(ANDconst [c] y)) yes no) // cond: x.Uses == 1 @@ -37277,17 +31283,21 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64ADD { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockARM64LE) + v0 := b.NewValue0(v_0.Pos, OpARM64CMN, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARM64LE) - v0 := b.NewValue0(v_0.Pos, OpARM64CMN, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (LE (CMPWconst [0] z:(ADD x y)) yes no) // cond: z.Uses == 1 @@ -37301,17 +31311,21 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64ADD { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockARM64LE) + v0 := b.NewValue0(v_0.Pos, OpARM64CMNW, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARM64LE) - v0 := b.NewValue0(v_0.Pos, OpARM64CMNW, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (LE (CMP x z:(NEG y)) yes no) // cond: z.Uses == 1 @@ -37547,17 +31561,21 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64AND { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockARM64LT) + v0 := b.NewValue0(v_0.Pos, OpARM64TST, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARM64LT) - v0 := b.NewValue0(v_0.Pos, OpARM64TST, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (LT (CMPWconst [0] z:(AND x y)) yes no) // cond: z.Uses == 1 @@ -37571,17 +31589,21 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64AND { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockARM64LT) + v0 := b.NewValue0(v_0.Pos, OpARM64TSTW, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARM64LT) - v0 := b.NewValue0(v_0.Pos, OpARM64TSTW, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (LT (CMPconst [0] x:(ANDconst [c] y)) yes no) // cond: x.Uses == 1 @@ -37667,17 +31689,21 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64ADD { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockARM64LT) + v0 := b.NewValue0(v_0.Pos, OpARM64CMN, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARM64LT) - v0 := b.NewValue0(v_0.Pos, OpARM64CMN, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (LT (CMPWconst [0] z:(ADD x y)) yes no) // cond: z.Uses == 1 @@ -37691,17 +31717,21 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64ADD { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockARM64LT) + v0 := b.NewValue0(v_0.Pos, OpARM64CMNW, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARM64LT) - v0 := b.NewValue0(v_0.Pos, OpARM64CMNW, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (LT (CMP x z:(NEG y)) yes no) // cond: z.Uses == 1 @@ -37964,17 +31994,21 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64AND { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockARM64NE) + v0 := b.NewValue0(v_0.Pos, OpARM64TST, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARM64NE) - v0 := b.NewValue0(v_0.Pos, OpARM64TST, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (NE (CMPWconst [0] z:(AND x y)) yes no) // cond: z.Uses == 1 @@ -37988,17 +32022,21 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64AND { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockARM64NE) + v0 := b.NewValue0(v_0.Pos, OpARM64TSTW, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARM64NE) - v0 := b.NewValue0(v_0.Pos, OpARM64TSTW, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (NE (CMPconst [0] x:(ANDconst [c] y)) yes no) // cond: x.Uses == 1 @@ -38084,17 +32122,21 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64ADD { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockARM64NE) + v0 := b.NewValue0(v_0.Pos, OpARM64CMN, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARM64NE) - v0 := b.NewValue0(v_0.Pos, OpARM64CMN, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (NE (CMPWconst [0] z:(ADD x y)) yes no) // cond: z.Uses == 1 @@ -38108,17 +32150,21 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64ADD { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockARM64NE) + v0 := b.NewValue0(v_0.Pos, OpARM64CMNW, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockARM64NE) - v0 := b.NewValue0(v_0.Pos, OpARM64CMNW, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (NE (CMP x z:(NEG y)) yes no) // cond: z.Uses == 1 diff --git a/src/cmd/compile/internal/ssa/rewriteMIPS.go b/src/cmd/compile/internal/ssa/rewriteMIPS.go index d17be4422b..912c4a1082 100644 --- a/src/cmd/compile/internal/ssa/rewriteMIPS.go +++ b/src/cmd/compile/internal/ssa/rewriteMIPS.go @@ -464,9 +464,9 @@ func rewriteValueMIPS(v *Value) bool { case OpRsh8x8: return rewriteValueMIPS_OpRsh8x8_0(v) case OpSelect0: - return rewriteValueMIPS_OpSelect0_0(v) || rewriteValueMIPS_OpSelect0_10(v) + return rewriteValueMIPS_OpSelect0_0(v) case OpSelect1: - return rewriteValueMIPS_OpSelect1_0(v) || rewriteValueMIPS_OpSelect1_10(v) + return rewriteValueMIPS_OpSelect1_0(v) case OpSignExt16to32: return rewriteValueMIPS_OpSignExt16to32_0(v) case OpSignExt8to16: @@ -2650,59 +2650,37 @@ func rewriteValueMIPS_OpMIPSADD_0(v *Value) bool { // result: (ADDconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMIPSMOVWconst { - break - } - c := v_1.AuxInt - v.reset(OpMIPSADDconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ADD (MOVWconst [c]) x) - // result: (ADDconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMIPSMOVWconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMIPSMOVWconst { + continue + } + c := v_1.AuxInt + v.reset(OpMIPSADDconst) + v.AuxInt = c + v.AddArg(x) + return true } - c := v_0.AuxInt - v.reset(OpMIPSADDconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (ADD x (NEG y)) // result: (SUB x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMIPSNEG { - break - } - y := v_1.Args[0] - v.reset(OpMIPSSUB) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADD (NEG y) x) - // result: (SUB x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMIPSNEG { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMIPSNEG { + continue + } + y := v_1.Args[0] + v.reset(OpMIPSSUB) + v.AddArg(x) + v.AddArg(y) + return true } - y := v_0.Args[0] - v.reset(OpMIPSSUB) - v.AddArg(x) - v.AddArg(y) - return true + break } return false } @@ -2787,30 +2765,19 @@ func rewriteValueMIPS_OpMIPSAND_0(v *Value) bool { // result: (ANDconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMIPSMOVWconst { - break - } - c := v_1.AuxInt - v.reset(OpMIPSANDconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (AND (MOVWconst [c]) x) - // result: (ANDconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMIPSMOVWconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMIPSMOVWconst { + continue + } + c := v_1.AuxInt + v.reset(OpMIPSANDconst) + v.AuxInt = c + v.AddArg(x) + return true } - c := v_0.AuxInt - v.reset(OpMIPSANDconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (AND x x) // result: x @@ -2828,45 +2795,26 @@ func rewriteValueMIPS_OpMIPSAND_0(v *Value) bool { // result: (SGTUconst [1] (OR x y)) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMIPSSGTUconst || v_0.AuxInt != 1 { - break - } - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMIPSSGTUconst || v_1.AuxInt != 1 { - break - } - y := v_1.Args[0] - v.reset(OpMIPSSGTUconst) - v.AuxInt = 1 - v0 := b.NewValue0(v.Pos, OpMIPSOR, x.Type) - v0.AddArg(x) - v0.AddArg(y) - v.AddArg(v0) - return true - } - // match: (AND (SGTUconst [1] y) (SGTUconst [1] x)) - // result: (SGTUconst [1] (OR x y)) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMIPSSGTUconst || v_0.AuxInt != 1 { - break - } - y := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMIPSSGTUconst || v_1.AuxInt != 1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpMIPSSGTUconst || v_0.AuxInt != 1 { + continue + } + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMIPSSGTUconst || v_1.AuxInt != 1 { + continue + } + y := v_1.Args[0] + v.reset(OpMIPSSGTUconst) + v.AuxInt = 1 + v0 := b.NewValue0(v.Pos, OpMIPSOR, x.Type) + v0.AddArg(x) + v0.AddArg(y) + v.AddArg(v0) + return true } - x := v_1.Args[0] - v.reset(OpMIPSSGTUconst) - v.AuxInt = 1 - v0 := b.NewValue0(v.Pos, OpMIPSOR, x.Type) - v0.AddArg(x) - v0.AddArg(y) - v.AddArg(v0) - return true + break } return false } @@ -4643,154 +4591,96 @@ func rewriteValueMIPS_OpMIPSMOVWstorezero_0(v *Value) bool { return false } func rewriteValueMIPS_OpMIPSMUL_0(v *Value) bool { - // match: (MUL (MOVWconst [0]) _) - // result: (MOVWconst [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMIPSMOVWconst || v_0.AuxInt != 0 { - break - } - v.reset(OpMIPSMOVWconst) - v.AuxInt = 0 - return true - } - // match: (MUL _ (MOVWconst [0])) + // match: (MUL (MOVWconst [0]) _ ) // result: (MOVWconst [0]) for { _ = v.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpMIPSMOVWconst || v_1.AuxInt != 0 { - break - } - v.reset(OpMIPSMOVWconst) - v.AuxInt = 0 - return true - } - // match: (MUL (MOVWconst [1]) x) - // result: x - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMIPSMOVWconst || v_0.AuxInt != 1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpMIPSMOVWconst || v_0.AuxInt != 0 { + continue + } + v.reset(OpMIPSMOVWconst) + v.AuxInt = 0 + return true } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true + break } - // match: (MUL x (MOVWconst [1])) + // match: (MUL (MOVWconst [1]) x ) // result: x for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMIPSMOVWconst || v_1.AuxInt != 1 { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (MUL (MOVWconst [-1]) x) - // result: (NEG x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMIPSMOVWconst || v_0.AuxInt != -1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpMIPSMOVWconst || v_0.AuxInt != 1 { + continue + } + x := v.Args[1^_i0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - v.reset(OpMIPSNEG) - v.AddArg(x) - return true + break } - // match: (MUL x (MOVWconst [-1])) + // match: (MUL (MOVWconst [-1]) x ) // result: (NEG x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMIPSMOVWconst || v_1.AuxInt != -1 { - break - } - v.reset(OpMIPSNEG) - v.AddArg(x) - return true - } - // match: (MUL (MOVWconst [c]) x) - // cond: isPowerOfTwo(int64(uint32(c))) - // result: (SLLconst [log2(int64(uint32(c)))] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMIPSMOVWconst { - break - } - c := v_0.AuxInt - if !(isPowerOfTwo(int64(uint32(c)))) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpMIPSMOVWconst || v_0.AuxInt != -1 { + continue + } + x := v.Args[1^_i0] + v.reset(OpMIPSNEG) + v.AddArg(x) + return true } - v.reset(OpMIPSSLLconst) - v.AuxInt = log2(int64(uint32(c))) - v.AddArg(x) - return true + break } - // match: (MUL x (MOVWconst [c])) + // match: (MUL (MOVWconst [c]) x ) // cond: isPowerOfTwo(int64(uint32(c))) // result: (SLLconst [log2(int64(uint32(c)))] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMIPSMOVWconst { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(int64(uint32(c)))) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpMIPSMOVWconst { + continue + } + c := v_0.AuxInt + x := v.Args[1^_i0] + if !(isPowerOfTwo(int64(uint32(c)))) { + continue + } + v.reset(OpMIPSSLLconst) + v.AuxInt = log2(int64(uint32(c))) + v.AddArg(x) + return true } - v.reset(OpMIPSSLLconst) - v.AuxInt = log2(int64(uint32(c))) - v.AddArg(x) - return true + break } // match: (MUL (MOVWconst [c]) (MOVWconst [d])) // result: (MOVWconst [int64(int32(c)*int32(d))]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMIPSMOVWconst { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpMIPSMOVWconst { - break - } - d := v_1.AuxInt - v.reset(OpMIPSMOVWconst) - v.AuxInt = int64(int32(c) * int32(d)) - return true - } - // match: (MUL (MOVWconst [d]) (MOVWconst [c])) - // result: (MOVWconst [int64(int32(c)*int32(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMIPSMOVWconst { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpMIPSMOVWconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpMIPSMOVWconst { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpMIPSMOVWconst { + continue + } + d := v_1.AuxInt + v.reset(OpMIPSMOVWconst) + v.AuxInt = int64(int32(c) * int32(d)) + return true } - c := v_1.AuxInt - v.reset(OpMIPSMOVWconst) - v.AuxInt = int64(int32(c) * int32(d)) - return true + break } return false } @@ -4814,30 +4704,19 @@ func rewriteValueMIPS_OpMIPSNOR_0(v *Value) bool { // result: (NORconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMIPSMOVWconst { - break - } - c := v_1.AuxInt - v.reset(OpMIPSNORconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (NOR (MOVWconst [c]) x) - // result: (NORconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMIPSMOVWconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMIPSMOVWconst { + continue + } + c := v_1.AuxInt + v.reset(OpMIPSNORconst) + v.AuxInt = c + v.AddArg(x) + return true } - c := v_0.AuxInt - v.reset(OpMIPSNORconst) - v.AuxInt = c - v.AddArg(x) - return true + break } return false } @@ -4863,33 +4742,22 @@ func rewriteValueMIPS_OpMIPSOR_0(v *Value) bool { // result: (ORconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMIPSMOVWconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMIPSMOVWconst { + continue + } + c := v_1.AuxInt + v.reset(OpMIPSORconst) + v.AuxInt = c + v.AddArg(x) + return true } - c := v_1.AuxInt - v.reset(OpMIPSORconst) - v.AuxInt = c - v.AddArg(x) - return true + break } - // match: (OR (MOVWconst [c]) x) - // result: (ORconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMIPSMOVWconst { - break - } - c := v_0.AuxInt - v.reset(OpMIPSORconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (OR x x) - // result: x + // match: (OR x x) + // result: x for { x := v.Args[1] if x != v.Args[0] { @@ -4904,43 +4772,25 @@ func rewriteValueMIPS_OpMIPSOR_0(v *Value) bool { // result: (SGTUzero (OR x y)) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMIPSSGTUzero { - break - } - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMIPSSGTUzero { - break - } - y := v_1.Args[0] - v.reset(OpMIPSSGTUzero) - v0 := b.NewValue0(v.Pos, OpMIPSOR, x.Type) - v0.AddArg(x) - v0.AddArg(y) - v.AddArg(v0) - return true - } - // match: (OR (SGTUzero y) (SGTUzero x)) - // result: (SGTUzero (OR x y)) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMIPSSGTUzero { - break - } - y := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMIPSSGTUzero { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpMIPSSGTUzero { + continue + } + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMIPSSGTUzero { + continue + } + y := v_1.Args[0] + v.reset(OpMIPSSGTUzero) + v0 := b.NewValue0(v.Pos, OpMIPSOR, x.Type) + v0.AddArg(x) + v0.AddArg(y) + v.AddArg(v0) + return true } - x := v_1.Args[0] - v.reset(OpMIPSSGTUzero) - v0 := b.NewValue0(v.Pos, OpMIPSOR, x.Type) - v0.AddArg(x) - v0.AddArg(y) - v.AddArg(v0) - return true + break } return false } @@ -5661,30 +5511,19 @@ func rewriteValueMIPS_OpMIPSXOR_0(v *Value) bool { // result: (XORconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMIPSMOVWconst { - break - } - c := v_1.AuxInt - v.reset(OpMIPSXORconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (XOR (MOVWconst [c]) x) - // result: (XORconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMIPSMOVWconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMIPSMOVWconst { + continue + } + c := v_1.AuxInt + v.reset(OpMIPSXORconst) + v.AuxInt = c + v.AddArg(x) + return true } - c := v_0.AuxInt - v.reset(OpMIPSXORconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (XOR x x) // result: (MOVWconst [0]) @@ -7736,39 +7575,7 @@ func rewriteValueMIPS_OpSelect0_0(v *Value) bool { v.AddArg(y) return true } - // match: (Select0 (MULTU (MOVWconst [0]) _)) - // result: (MOVWconst [0]) - for { - v_0 := v.Args[0] - if v_0.Op != OpMIPSMULTU { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpMIPSMOVWconst || v_0_0.AuxInt != 0 { - break - } - v.reset(OpMIPSMOVWconst) - v.AuxInt = 0 - return true - } - // match: (Select0 (MULTU _ (MOVWconst [0]))) - // result: (MOVWconst [0]) - for { - v_0 := v.Args[0] - if v_0.Op != OpMIPSMULTU { - break - } - _ = v_0.Args[1] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpMIPSMOVWconst || v_0_1.AuxInt != 0 { - break - } - v.reset(OpMIPSMOVWconst) - v.AuxInt = 0 - return true - } - // match: (Select0 (MULTU (MOVWconst [1]) _)) + // match: (Select0 (MULTU (MOVWconst [0]) _ )) // result: (MOVWconst [0]) for { v_0 := v.Args[0] @@ -7776,15 +7583,18 @@ func rewriteValueMIPS_OpSelect0_0(v *Value) bool { break } _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpMIPSMOVWconst || v_0_0.AuxInt != 1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpMIPSMOVWconst || v_0_0.AuxInt != 0 { + continue + } + v.reset(OpMIPSMOVWconst) + v.AuxInt = 0 + return true } - v.reset(OpMIPSMOVWconst) - v.AuxInt = 0 - return true + break } - // match: (Select0 (MULTU _ (MOVWconst [1]))) + // match: (Select0 (MULTU (MOVWconst [1]) _ )) // result: (MOVWconst [0]) for { v_0 := v.Args[0] @@ -7792,38 +7602,18 @@ func rewriteValueMIPS_OpSelect0_0(v *Value) bool { break } _ = v_0.Args[1] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpMIPSMOVWconst || v_0_1.AuxInt != 1 { - break - } - v.reset(OpMIPSMOVWconst) - v.AuxInt = 0 - return true - } - // match: (Select0 (MULTU (MOVWconst [-1]) x)) - // result: (CMOVZ (ADDconst [-1] x) (MOVWconst [0]) x) - for { - v_0 := v.Args[0] - if v_0.Op != OpMIPSMULTU { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpMIPSMOVWconst || v_0_0.AuxInt != -1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpMIPSMOVWconst || v_0_0.AuxInt != 1 { + continue + } + v.reset(OpMIPSMOVWconst) + v.AuxInt = 0 + return true } - v.reset(OpMIPSCMOVZ) - v0 := b.NewValue0(v.Pos, OpMIPSADDconst, x.Type) - v0.AuxInt = -1 - v0.AddArg(x) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpMIPSMOVWconst, typ.UInt32) - v1.AuxInt = 0 - v.AddArg(v1) - v.AddArg(x) - return true + break } - // match: (Select0 (MULTU x (MOVWconst [-1]))) + // match: (Select0 (MULTU (MOVWconst [-1]) x )) // result: (CMOVZ (ADDconst [-1] x) (MOVWconst [0]) x) for { v_0 := v.Args[0] @@ -7831,45 +7621,26 @@ func rewriteValueMIPS_OpSelect0_0(v *Value) bool { break } _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpMIPSMOVWconst || v_0_1.AuxInt != -1 { - break - } - v.reset(OpMIPSCMOVZ) - v0 := b.NewValue0(v.Pos, OpMIPSADDconst, x.Type) - v0.AuxInt = -1 - v0.AddArg(x) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpMIPSMOVWconst, typ.UInt32) - v1.AuxInt = 0 - v.AddArg(v1) - v.AddArg(x) - return true - } - // match: (Select0 (MULTU (MOVWconst [c]) x)) - // cond: isPowerOfTwo(int64(uint32(c))) - // result: (SRLconst [32-log2(int64(uint32(c)))] x) - for { - v_0 := v.Args[0] - if v_0.Op != OpMIPSMULTU { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpMIPSMOVWconst { - break - } - c := v_0_0.AuxInt - if !(isPowerOfTwo(int64(uint32(c)))) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpMIPSMOVWconst || v_0_0.AuxInt != -1 { + continue + } + x := v_0.Args[1^_i0] + v.reset(OpMIPSCMOVZ) + v0 := b.NewValue0(v.Pos, OpMIPSADDconst, x.Type) + v0.AuxInt = -1 + v0.AddArg(x) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpMIPSMOVWconst, typ.UInt32) + v1.AuxInt = 0 + v.AddArg(v1) + v.AddArg(x) + return true } - v.reset(OpMIPSSRLconst) - v.AuxInt = 32 - log2(int64(uint32(c))) - v.AddArg(x) - return true + break } - // match: (Select0 (MULTU x (MOVWconst [c]))) + // match: (Select0 (MULTU (MOVWconst [c]) x )) // cond: isPowerOfTwo(int64(uint32(c))) // result: (SRLconst [32-log2(int64(uint32(c)))] x) for { @@ -7878,23 +7649,23 @@ func rewriteValueMIPS_OpSelect0_0(v *Value) bool { break } _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpMIPSMOVWconst { - break - } - c := v_0_1.AuxInt - if !(isPowerOfTwo(int64(uint32(c)))) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpMIPSMOVWconst { + continue + } + c := v_0_0.AuxInt + x := v_0.Args[1^_i0] + if !(isPowerOfTwo(int64(uint32(c)))) { + continue + } + v.reset(OpMIPSSRLconst) + v.AuxInt = 32 - log2(int64(uint32(c))) + v.AddArg(x) + return true } - v.reset(OpMIPSSRLconst) - v.AuxInt = 32 - log2(int64(uint32(c))) - v.AddArg(x) - return true + break } - return false -} -func rewriteValueMIPS_OpSelect0_10(v *Value) bool { // match: (Select0 (MULTU (MOVWconst [c]) (MOVWconst [d]))) // result: (MOVWconst [(c*d)>>32]) for { @@ -7903,41 +7674,22 @@ func rewriteValueMIPS_OpSelect0_10(v *Value) bool { break } _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpMIPSMOVWconst { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpMIPSMOVWconst { - break - } - d := v_0_1.AuxInt - v.reset(OpMIPSMOVWconst) - v.AuxInt = (c * d) >> 32 - return true - } - // match: (Select0 (MULTU (MOVWconst [d]) (MOVWconst [c]))) - // result: (MOVWconst [(c*d)>>32]) - for { - v_0 := v.Args[0] - if v_0.Op != OpMIPSMULTU { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpMIPSMOVWconst { - break - } - d := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpMIPSMOVWconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpMIPSMOVWconst { + continue + } + c := v_0_0.AuxInt + v_0_1 := v_0.Args[1^_i0] + if v_0_1.Op != OpMIPSMOVWconst { + continue + } + d := v_0_1.AuxInt + v.reset(OpMIPSMOVWconst) + v.AuxInt = (c * d) >> 32 + return true } - c := v_0_1.AuxInt - v.reset(OpMIPSMOVWconst) - v.AuxInt = (c * d) >> 32 - return true + break } // match: (Select0 (DIV (MOVWconst [c]) (MOVWconst [d]))) // result: (MOVWconst [int64(int32(c)%int32(d))]) @@ -8026,23 +7778,7 @@ func rewriteValueMIPS_OpSelect1_0(v *Value) bool { v.AddArg(x) return true } - // match: (Select1 (MULTU (MOVWconst [0]) _)) - // result: (MOVWconst [0]) - for { - v_0 := v.Args[0] - if v_0.Op != OpMIPSMULTU { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpMIPSMOVWconst || v_0_0.AuxInt != 0 { - break - } - v.reset(OpMIPSMOVWconst) - v.AuxInt = 0 - return true - } - // match: (Select1 (MULTU _ (MOVWconst [0]))) + // match: (Select1 (MULTU (MOVWconst [0]) _ )) // result: (MOVWconst [0]) for { v_0 := v.Args[0] @@ -8050,32 +7786,18 @@ func rewriteValueMIPS_OpSelect1_0(v *Value) bool { break } _ = v_0.Args[1] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpMIPSMOVWconst || v_0_1.AuxInt != 0 { - break - } - v.reset(OpMIPSMOVWconst) - v.AuxInt = 0 - return true - } - // match: (Select1 (MULTU (MOVWconst [1]) x)) - // result: x - for { - v_0 := v.Args[0] - if v_0.Op != OpMIPSMULTU { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpMIPSMOVWconst || v_0_0.AuxInt != 1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpMIPSMOVWconst || v_0_0.AuxInt != 0 { + continue + } + v.reset(OpMIPSMOVWconst) + v.AuxInt = 0 + return true } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true + break } - // match: (Select1 (MULTU x (MOVWconst [1]))) + // match: (Select1 (MULTU (MOVWconst [1]) x )) // result: x for { v_0 := v.Args[0] @@ -8083,34 +7805,20 @@ func rewriteValueMIPS_OpSelect1_0(v *Value) bool { break } _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpMIPSMOVWconst || v_0_1.AuxInt != 1 { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Select1 (MULTU (MOVWconst [-1]) x)) - // result: (NEG x) - for { - v_0 := v.Args[0] - if v_0.Op != OpMIPSMULTU { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpMIPSMOVWconst || v_0_0.AuxInt != -1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpMIPSMOVWconst || v_0_0.AuxInt != 1 { + continue + } + x := v_0.Args[1^_i0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - v.reset(OpMIPSNEG) - v.Type = x.Type - v.AddArg(x) - return true + break } - // match: (Select1 (MULTU x (MOVWconst [-1]))) + // match: (Select1 (MULTU (MOVWconst [-1]) x )) // result: (NEG x) for { v_0 := v.Args[0] @@ -8118,39 +7826,20 @@ func rewriteValueMIPS_OpSelect1_0(v *Value) bool { break } _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpMIPSMOVWconst || v_0_1.AuxInt != -1 { - break - } - v.reset(OpMIPSNEG) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Select1 (MULTU (MOVWconst [c]) x)) - // cond: isPowerOfTwo(int64(uint32(c))) - // result: (SLLconst [log2(int64(uint32(c)))] x) - for { - v_0 := v.Args[0] - if v_0.Op != OpMIPSMULTU { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpMIPSMOVWconst { - break - } - c := v_0_0.AuxInt - if !(isPowerOfTwo(int64(uint32(c)))) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpMIPSMOVWconst || v_0_0.AuxInt != -1 { + continue + } + x := v_0.Args[1^_i0] + v.reset(OpMIPSNEG) + v.Type = x.Type + v.AddArg(x) + return true } - v.reset(OpMIPSSLLconst) - v.AuxInt = log2(int64(uint32(c))) - v.AddArg(x) - return true + break } - // match: (Select1 (MULTU x (MOVWconst [c]))) + // match: (Select1 (MULTU (MOVWconst [c]) x )) // cond: isPowerOfTwo(int64(uint32(c))) // result: (SLLconst [log2(int64(uint32(c)))] x) for { @@ -8159,23 +7848,23 @@ func rewriteValueMIPS_OpSelect1_0(v *Value) bool { break } _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpMIPSMOVWconst { - break - } - c := v_0_1.AuxInt - if !(isPowerOfTwo(int64(uint32(c)))) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpMIPSMOVWconst { + continue + } + c := v_0_0.AuxInt + x := v_0.Args[1^_i0] + if !(isPowerOfTwo(int64(uint32(c)))) { + continue + } + v.reset(OpMIPSSLLconst) + v.AuxInt = log2(int64(uint32(c))) + v.AddArg(x) + return true } - v.reset(OpMIPSSLLconst) - v.AuxInt = log2(int64(uint32(c))) - v.AddArg(x) - return true + break } - return false -} -func rewriteValueMIPS_OpSelect1_10(v *Value) bool { // match: (Select1 (MULTU (MOVWconst [c]) (MOVWconst [d]))) // result: (MOVWconst [int64(int32(uint32(c)*uint32(d)))]) for { @@ -8184,41 +7873,22 @@ func rewriteValueMIPS_OpSelect1_10(v *Value) bool { break } _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpMIPSMOVWconst { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpMIPSMOVWconst { - break - } - d := v_0_1.AuxInt - v.reset(OpMIPSMOVWconst) - v.AuxInt = int64(int32(uint32(c) * uint32(d))) - return true - } - // match: (Select1 (MULTU (MOVWconst [d]) (MOVWconst [c]))) - // result: (MOVWconst [int64(int32(uint32(c)*uint32(d)))]) - for { - v_0 := v.Args[0] - if v_0.Op != OpMIPSMULTU { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpMIPSMOVWconst { - break - } - d := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpMIPSMOVWconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpMIPSMOVWconst { + continue + } + c := v_0_0.AuxInt + v_0_1 := v_0.Args[1^_i0] + if v_0_1.Op != OpMIPSMOVWconst { + continue + } + d := v_0_1.AuxInt + v.reset(OpMIPSMOVWconst) + v.AuxInt = int64(int32(uint32(c) * uint32(d))) + return true } - c := v_0_1.AuxInt - v.reset(OpMIPSMOVWconst) - v.AuxInt = int64(int32(uint32(c) * uint32(d))) - return true + break } // match: (Select1 (DIV (MOVWconst [c]) (MOVWconst [d]))) // result: (MOVWconst [int64(int32(c)/int32(d))]) diff --git a/src/cmd/compile/internal/ssa/rewriteMIPS64.go b/src/cmd/compile/internal/ssa/rewriteMIPS64.go index a62ac3cdb8..98d1e3bd25 100644 --- a/src/cmd/compile/internal/ssa/rewriteMIPS64.go +++ b/src/cmd/compile/internal/ssa/rewriteMIPS64.go @@ -546,7 +546,7 @@ func rewriteValueMIPS64(v *Value) bool { case OpSelect0: return rewriteValueMIPS64_OpSelect0_0(v) case OpSelect1: - return rewriteValueMIPS64_OpSelect1_0(v) || rewriteValueMIPS64_OpSelect1_10(v) + return rewriteValueMIPS64_OpSelect1_0(v) case OpSignExt16to32: return rewriteValueMIPS64_OpSignExt16to32_0(v) case OpSignExt16to64: @@ -3093,66 +3093,40 @@ func rewriteValueMIPS64_OpMIPS64ADDV_0(v *Value) bool { // result: (ADDVconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMIPS64MOVVconst { - break - } - c := v_1.AuxInt - if !(is32Bit(c)) { - break - } - v.reset(OpMIPS64ADDVconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ADDV (MOVVconst [c]) x) - // cond: is32Bit(c) - // result: (ADDVconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMIPS64MOVVconst { - break - } - c := v_0.AuxInt - if !(is32Bit(c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMIPS64MOVVconst { + continue + } + c := v_1.AuxInt + if !(is32Bit(c)) { + continue + } + v.reset(OpMIPS64ADDVconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpMIPS64ADDVconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (ADDV x (NEGV y)) // result: (SUBV x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMIPS64NEGV { - break - } - y := v_1.Args[0] - v.reset(OpMIPS64SUBV) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADDV (NEGV y) x) - // result: (SUBV x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMIPS64NEGV { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMIPS64NEGV { + continue + } + y := v_1.Args[0] + v.reset(OpMIPS64SUBV) + v.AddArg(x) + v.AddArg(y) + return true } - y := v_0.Args[0] - v.reset(OpMIPS64SUBV) - v.AddArg(x) - v.AddArg(y) - return true + break } return false } @@ -3245,37 +3219,22 @@ func rewriteValueMIPS64_OpMIPS64AND_0(v *Value) bool { // result: (ANDconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMIPS64MOVVconst { - break - } - c := v_1.AuxInt - if !(is32Bit(c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMIPS64MOVVconst { + continue + } + c := v_1.AuxInt + if !(is32Bit(c)) { + continue + } + v.reset(OpMIPS64ANDconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpMIPS64ANDconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (AND (MOVVconst [c]) x) - // cond: is32Bit(c) - // result: (ANDconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMIPS64MOVVconst { - break - } - c := v_0.AuxInt - if !(is32Bit(c)) { - break - } - v.reset(OpMIPS64ANDconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (AND x x) // result: x @@ -5182,37 +5141,22 @@ func rewriteValueMIPS64_OpMIPS64NOR_0(v *Value) bool { // result: (NORconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMIPS64MOVVconst { - break - } - c := v_1.AuxInt - if !(is32Bit(c)) { - break - } - v.reset(OpMIPS64NORconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (NOR (MOVVconst [c]) x) - // cond: is32Bit(c) - // result: (NORconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMIPS64MOVVconst { - break - } - c := v_0.AuxInt - if !(is32Bit(c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMIPS64MOVVconst { + continue + } + c := v_1.AuxInt + if !(is32Bit(c)) { + continue + } + v.reset(OpMIPS64NORconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpMIPS64NORconst) - v.AuxInt = c - v.AddArg(x) - return true + break } return false } @@ -5238,37 +5182,22 @@ func rewriteValueMIPS64_OpMIPS64OR_0(v *Value) bool { // result: (ORconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMIPS64MOVVconst { - break - } - c := v_1.AuxInt - if !(is32Bit(c)) { - break - } - v.reset(OpMIPS64ORconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (OR (MOVVconst [c]) x) - // cond: is32Bit(c) - // result: (ORconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMIPS64MOVVconst { - break - } - c := v_0.AuxInt - if !(is32Bit(c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMIPS64MOVVconst { + continue + } + c := v_1.AuxInt + if !(is32Bit(c)) { + continue + } + v.reset(OpMIPS64ORconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpMIPS64ORconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (OR x x) // result: x @@ -5943,37 +5872,22 @@ func rewriteValueMIPS64_OpMIPS64XOR_0(v *Value) bool { // result: (XORconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMIPS64MOVVconst { - break - } - c := v_1.AuxInt - if !(is32Bit(c)) { - break - } - v.reset(OpMIPS64XORconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (XOR (MOVVconst [c]) x) - // cond: is32Bit(c) - // result: (XORconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMIPS64MOVVconst { - break - } - c := v_0.AuxInt - if !(is32Bit(c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMIPS64MOVVconst { + continue + } + c := v_1.AuxInt + if !(is32Bit(c)) { + continue + } + v.reset(OpMIPS64XORconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpMIPS64XORconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (XOR x x) // result: (MOVVconst [0]) @@ -8387,30 +8301,17 @@ func rewriteValueMIPS64_OpSelect1_0(v *Value) bool { break } _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpMIPS64MOVVconst || v_0_1.AuxInt != -1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v_0.Args[_i0] + v_0_1 := v_0.Args[1^_i0] + if v_0_1.Op != OpMIPS64MOVVconst || v_0_1.AuxInt != -1 { + continue + } + v.reset(OpMIPS64NEGV) + v.AddArg(x) + return true } - v.reset(OpMIPS64NEGV) - v.AddArg(x) - return true - } - // match: (Select1 (MULVU (MOVVconst [-1]) x)) - // result: (NEGV x) - for { - v_0 := v.Args[0] - if v_0.Op != OpMIPS64MULVU { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpMIPS64MOVVconst || v_0_0.AuxInt != -1 { - break - } - v.reset(OpMIPS64NEGV) - v.AddArg(x) - return true + break } // match: (Select1 (MULVU _ (MOVVconst [0]))) // result: (MOVVconst [0]) @@ -8420,29 +8321,16 @@ func rewriteValueMIPS64_OpSelect1_0(v *Value) bool { break } _ = v_0.Args[1] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpMIPS64MOVVconst || v_0_1.AuxInt != 0 { - break - } - v.reset(OpMIPS64MOVVconst) - v.AuxInt = 0 - return true - } - // match: (Select1 (MULVU (MOVVconst [0]) _)) - // result: (MOVVconst [0]) - for { - v_0 := v.Args[0] - if v_0.Op != OpMIPS64MULVU { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpMIPS64MOVVconst || v_0_0.AuxInt != 0 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_1 := v_0.Args[1^_i0] + if v_0_1.Op != OpMIPS64MOVVconst || v_0_1.AuxInt != 0 { + continue + } + v.reset(OpMIPS64MOVVconst) + v.AuxInt = 0 + return true } - v.reset(OpMIPS64MOVVconst) - v.AuxInt = 0 - return true + break } // match: (Select1 (MULVU x (MOVVconst [1]))) // result: x @@ -8452,32 +8340,18 @@ func rewriteValueMIPS64_OpSelect1_0(v *Value) bool { break } _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpMIPS64MOVVconst || v_0_1.AuxInt != 1 { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Select1 (MULVU (MOVVconst [1]) x)) - // result: x - for { - v_0 := v.Args[0] - if v_0.Op != OpMIPS64MULVU { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpMIPS64MOVVconst || v_0_0.AuxInt != 1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v_0.Args[_i0] + v_0_1 := v_0.Args[1^_i0] + if v_0_1.Op != OpMIPS64MOVVconst || v_0_1.AuxInt != 1 { + continue + } + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true + break } // match: (Select1 (MULVU x (MOVVconst [c]))) // cond: isPowerOfTwo(c) @@ -8488,41 +8362,22 @@ func rewriteValueMIPS64_OpSelect1_0(v *Value) bool { break } _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpMIPS64MOVVconst { - break - } - c := v_0_1.AuxInt - if !(isPowerOfTwo(c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v_0.Args[_i0] + v_0_1 := v_0.Args[1^_i0] + if v_0_1.Op != OpMIPS64MOVVconst { + continue + } + c := v_0_1.AuxInt + if !(isPowerOfTwo(c)) { + continue + } + v.reset(OpMIPS64SLLVconst) + v.AuxInt = log2(c) + v.AddArg(x) + return true } - v.reset(OpMIPS64SLLVconst) - v.AuxInt = log2(c) - v.AddArg(x) - return true - } - // match: (Select1 (MULVU (MOVVconst [c]) x)) - // cond: isPowerOfTwo(c) - // result: (SLLVconst [log2(c)] x) - for { - v_0 := v.Args[0] - if v_0.Op != OpMIPS64MULVU { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpMIPS64MOVVconst { - break - } - c := v_0_0.AuxInt - if !(isPowerOfTwo(c)) { - break - } - v.reset(OpMIPS64SLLVconst) - v.AuxInt = log2(c) - v.AddArg(x) - return true + break } // match: (Select1 (DIVVU x (MOVVconst [1]))) // result: x @@ -8565,9 +8420,6 @@ func rewriteValueMIPS64_OpSelect1_0(v *Value) bool { v.AddArg(x) return true } - return false -} -func rewriteValueMIPS64_OpSelect1_10(v *Value) bool { // match: (Select1 (MULVU (MOVVconst [c]) (MOVVconst [d]))) // result: (MOVVconst [c*d]) for { @@ -8576,41 +8428,22 @@ func rewriteValueMIPS64_OpSelect1_10(v *Value) bool { break } _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpMIPS64MOVVconst { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpMIPS64MOVVconst { - break - } - d := v_0_1.AuxInt - v.reset(OpMIPS64MOVVconst) - v.AuxInt = c * d - return true - } - // match: (Select1 (MULVU (MOVVconst [d]) (MOVVconst [c]))) - // result: (MOVVconst [c*d]) - for { - v_0 := v.Args[0] - if v_0.Op != OpMIPS64MULVU { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpMIPS64MOVVconst { - break - } - d := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpMIPS64MOVVconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpMIPS64MOVVconst { + continue + } + c := v_0_0.AuxInt + v_0_1 := v_0.Args[1^_i0] + if v_0_1.Op != OpMIPS64MOVVconst { + continue + } + d := v_0_1.AuxInt + v.reset(OpMIPS64MOVVconst) + v.AuxInt = c * d + return true } - c := v_0_1.AuxInt - v.reset(OpMIPS64MOVVconst) - v.AuxInt = c * d - return true + break } // match: (Select1 (DIVV (MOVVconst [c]) (MOVVconst [d]))) // result: (MOVVconst [c/d]) diff --git a/src/cmd/compile/internal/ssa/rewritePPC64.go b/src/cmd/compile/internal/ssa/rewritePPC64.go index a8641ce1a4..bb6eb60efe 100644 --- a/src/cmd/compile/internal/ssa/rewritePPC64.go +++ b/src/cmd/compile/internal/ssa/rewritePPC64.go @@ -404,7 +404,7 @@ func rewriteValuePPC64(v *Value) bool { case OpPPC64ADDconst: return rewriteValuePPC64_OpPPC64ADDconst_0(v) case OpPPC64AND: - return rewriteValuePPC64_OpPPC64AND_0(v) || rewriteValuePPC64_OpPPC64AND_10(v) + return rewriteValuePPC64_OpPPC64AND_0(v) case OpPPC64ANDconst: return rewriteValuePPC64_OpPPC64ANDconst_0(v) || rewriteValuePPC64_OpPPC64ANDconst_10(v) case OpPPC64CMP: @@ -546,7 +546,7 @@ func rewriteValuePPC64(v *Value) bool { case OpPPC64NotEqual: return rewriteValuePPC64_OpPPC64NotEqual_0(v) case OpPPC64OR: - return rewriteValuePPC64_OpPPC64OR_0(v) || rewriteValuePPC64_OpPPC64OR_10(v) || rewriteValuePPC64_OpPPC64OR_20(v) || rewriteValuePPC64_OpPPC64OR_30(v) || rewriteValuePPC64_OpPPC64OR_40(v) || rewriteValuePPC64_OpPPC64OR_50(v) || rewriteValuePPC64_OpPPC64OR_60(v) || rewriteValuePPC64_OpPPC64OR_70(v) || rewriteValuePPC64_OpPPC64OR_80(v) || rewriteValuePPC64_OpPPC64OR_90(v) || rewriteValuePPC64_OpPPC64OR_100(v) || rewriteValuePPC64_OpPPC64OR_110(v) + return rewriteValuePPC64_OpPPC64OR_0(v) || rewriteValuePPC64_OpPPC64OR_10(v) || rewriteValuePPC64_OpPPC64OR_20(v) case OpPPC64ORN: return rewriteValuePPC64_OpPPC64ORN_0(v) case OpPPC64ORconst: @@ -558,7 +558,7 @@ func rewriteValuePPC64(v *Value) bool { case OpPPC64SUB: return rewriteValuePPC64_OpPPC64SUB_0(v) case OpPPC64XOR: - return rewriteValuePPC64_OpPPC64XOR_0(v) || rewriteValuePPC64_OpPPC64XOR_10(v) + return rewriteValuePPC64_OpPPC64XOR_0(v) case OpPPC64XORconst: return rewriteValuePPC64_OpPPC64XORconst_0(v) case OpPanicBounds: @@ -606,7 +606,7 @@ func rewriteValuePPC64(v *Value) bool { case OpRsh32Ux32: return rewriteValuePPC64_OpRsh32Ux32_0(v) case OpRsh32Ux64: - return rewriteValuePPC64_OpRsh32Ux64_0(v) || rewriteValuePPC64_OpRsh32Ux64_10(v) + return rewriteValuePPC64_OpRsh32Ux64_0(v) case OpRsh32Ux8: return rewriteValuePPC64_OpRsh32Ux8_0(v) case OpRsh32x16: @@ -614,7 +614,7 @@ func rewriteValuePPC64(v *Value) bool { case OpRsh32x32: return rewriteValuePPC64_OpRsh32x32_0(v) case OpRsh32x64: - return rewriteValuePPC64_OpRsh32x64_0(v) || rewriteValuePPC64_OpRsh32x64_10(v) + return rewriteValuePPC64_OpRsh32x64_0(v) case OpRsh32x8: return rewriteValuePPC64_OpRsh32x8_0(v) case OpRsh64Ux16: @@ -622,7 +622,7 @@ func rewriteValuePPC64(v *Value) bool { case OpRsh64Ux32: return rewriteValuePPC64_OpRsh64Ux32_0(v) case OpRsh64Ux64: - return rewriteValuePPC64_OpRsh64Ux64_0(v) || rewriteValuePPC64_OpRsh64Ux64_10(v) + return rewriteValuePPC64_OpRsh64Ux64_0(v) case OpRsh64Ux8: return rewriteValuePPC64_OpRsh64Ux8_0(v) case OpRsh64x16: @@ -630,7 +630,7 @@ func rewriteValuePPC64(v *Value) bool { case OpRsh64x32: return rewriteValuePPC64_OpRsh64x32_0(v) case OpRsh64x64: - return rewriteValuePPC64_OpRsh64x64_0(v) || rewriteValuePPC64_OpRsh64x64_10(v) + return rewriteValuePPC64_OpRsh64x64_0(v) case OpRsh64x8: return rewriteValuePPC64_OpRsh64x8_0(v) case OpRsh8Ux16: @@ -1832,41 +1832,25 @@ func rewriteValuePPC64_OpEq16_0(v *Value) bool { // cond: isSigned(x.Type) && isSigned(y.Type) // result: (Equal (CMPW (SignExt16to32 x) (SignExt16to32 y))) for { - y := v.Args[1] - x := v.Args[0] - if !(isSigned(x.Type) && isSigned(y.Type)) { - break - } - v.reset(OpPPC64Equal) - v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) - v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) - v1.AddArg(x) - v0.AddArg(v1) - v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) - v2.AddArg(y) - v0.AddArg(v2) - v.AddArg(v0) - return true - } - // match: (Eq16 y x) - // cond: isSigned(x.Type) && isSigned(y.Type) - // result: (Equal (CMPW (SignExt16to32 x) (SignExt16to32 y))) - for { - x := v.Args[1] - y := v.Args[0] - if !(isSigned(x.Type) && isSigned(y.Type)) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + y := v.Args[1^_i0] + if !(isSigned(x.Type) && isSigned(y.Type)) { + continue + } + v.reset(OpPPC64Equal) + v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) + v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) + v1.AddArg(x) + v0.AddArg(v1) + v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) + v2.AddArg(y) + v0.AddArg(v2) + v.AddArg(v0) + return true } - v.reset(OpPPC64Equal) - v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) - v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) - v1.AddArg(x) - v0.AddArg(v1) - v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) - v2.AddArg(y) - v0.AddArg(v2) - v.AddArg(v0) - return true + break } // match: (Eq16 x y) // result: (Equal (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) @@ -1952,41 +1936,25 @@ func rewriteValuePPC64_OpEq8_0(v *Value) bool { // cond: isSigned(x.Type) && isSigned(y.Type) // result: (Equal (CMPW (SignExt8to32 x) (SignExt8to32 y))) for { - y := v.Args[1] - x := v.Args[0] - if !(isSigned(x.Type) && isSigned(y.Type)) { - break - } - v.reset(OpPPC64Equal) - v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) - v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) - v1.AddArg(x) - v0.AddArg(v1) - v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) - v2.AddArg(y) - v0.AddArg(v2) - v.AddArg(v0) - return true - } - // match: (Eq8 y x) - // cond: isSigned(x.Type) && isSigned(y.Type) - // result: (Equal (CMPW (SignExt8to32 x) (SignExt8to32 y))) - for { - x := v.Args[1] - y := v.Args[0] - if !(isSigned(x.Type) && isSigned(y.Type)) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + y := v.Args[1^_i0] + if !(isSigned(x.Type) && isSigned(y.Type)) { + continue + } + v.reset(OpPPC64Equal) + v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) + v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) + v1.AddArg(x) + v0.AddArg(v1) + v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) + v2.AddArg(y) + v0.AddArg(v2) + v.AddArg(v0) + return true } - v.reset(OpPPC64Equal) - v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) - v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) - v1.AddArg(x) - v0.AddArg(v1) - v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) - v2.AddArg(y) - v0.AddArg(v2) - v.AddArg(v0) - return true + break } // match: (Eq8 x y) // result: (Equal (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) @@ -3480,40 +3448,21 @@ func rewriteValuePPC64_OpLsh32x64_0(v *Value) bool { break } _ = v_1.Args[1] - y := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpPPC64MOVDconst || v_1_1.AuxInt != 31 { - break - } - v.reset(OpPPC64SLW) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.Int32) - v0.AuxInt = 31 - v0.AddArg(y) - v.AddArg(v0) - return true - } - // match: (Lsh32x64 x (AND (MOVDconst [31]) y)) - // result: (SLW x (ANDconst [31] y)) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64AND { - break - } - y := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpPPC64MOVDconst || v_1_0.AuxInt != 31 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + y := v_1.Args[_i0] + v_1_1 := v_1.Args[1^_i0] + if v_1_1.Op != OpPPC64MOVDconst || v_1_1.AuxInt != 31 { + continue + } + v.reset(OpPPC64SLW) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.Int32) + v0.AuxInt = 31 + v0.AddArg(y) + v.AddArg(v0) + return true } - v.reset(OpPPC64SLW) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.Int32) - v0.AuxInt = 31 - v0.AddArg(y) - v.AddArg(v0) - return true + break } // match: (Lsh32x64 x (ANDconst [31] y)) // result: (SLW x (ANDconst [31] y)) @@ -3786,40 +3735,21 @@ func rewriteValuePPC64_OpLsh64x64_0(v *Value) bool { break } _ = v_1.Args[1] - y := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpPPC64MOVDconst || v_1_1.AuxInt != 63 { - break - } - v.reset(OpPPC64SLD) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.Int64) - v0.AuxInt = 63 - v0.AddArg(y) - v.AddArg(v0) - return true - } - // match: (Lsh64x64 x (AND (MOVDconst [63]) y)) - // result: (SLD x (ANDconst [63] y)) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64AND { - break - } - y := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpPPC64MOVDconst || v_1_0.AuxInt != 63 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + y := v_1.Args[_i0] + v_1_1 := v_1.Args[1^_i0] + if v_1_1.Op != OpPPC64MOVDconst || v_1_1.AuxInt != 63 { + continue + } + v.reset(OpPPC64SLD) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.Int64) + v0.AuxInt = 63 + v0.AddArg(y) + v.AddArg(v0) + return true } - v.reset(OpPPC64SLD) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.Int64) - v0.AuxInt = 63 - v0.AddArg(y) - v.AddArg(v0) - return true + break } // match: (Lsh64x64 x (ANDconst [63] y)) // result: (SLD x (ANDconst [63] y)) @@ -4701,41 +4631,25 @@ func rewriteValuePPC64_OpNeq16_0(v *Value) bool { // cond: isSigned(x.Type) && isSigned(y.Type) // result: (NotEqual (CMPW (SignExt16to32 x) (SignExt16to32 y))) for { - y := v.Args[1] - x := v.Args[0] - if !(isSigned(x.Type) && isSigned(y.Type)) { - break - } - v.reset(OpPPC64NotEqual) - v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) - v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) - v1.AddArg(x) - v0.AddArg(v1) - v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) - v2.AddArg(y) - v0.AddArg(v2) - v.AddArg(v0) - return true - } - // match: (Neq16 y x) - // cond: isSigned(x.Type) && isSigned(y.Type) - // result: (NotEqual (CMPW (SignExt16to32 x) (SignExt16to32 y))) - for { - x := v.Args[1] - y := v.Args[0] - if !(isSigned(x.Type) && isSigned(y.Type)) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + y := v.Args[1^_i0] + if !(isSigned(x.Type) && isSigned(y.Type)) { + continue + } + v.reset(OpPPC64NotEqual) + v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) + v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) + v1.AddArg(x) + v0.AddArg(v1) + v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) + v2.AddArg(y) + v0.AddArg(v2) + v.AddArg(v0) + return true } - v.reset(OpPPC64NotEqual) - v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) - v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) - v1.AddArg(x) - v0.AddArg(v1) - v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) - v2.AddArg(y) - v0.AddArg(v2) - v.AddArg(v0) - return true + break } // match: (Neq16 x y) // result: (NotEqual (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) @@ -4821,41 +4735,25 @@ func rewriteValuePPC64_OpNeq8_0(v *Value) bool { // cond: isSigned(x.Type) && isSigned(y.Type) // result: (NotEqual (CMPW (SignExt8to32 x) (SignExt8to32 y))) for { - y := v.Args[1] - x := v.Args[0] - if !(isSigned(x.Type) && isSigned(y.Type)) { - break - } - v.reset(OpPPC64NotEqual) - v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) - v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) - v1.AddArg(x) - v0.AddArg(v1) - v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) - v2.AddArg(y) - v0.AddArg(v2) - v.AddArg(v0) - return true - } - // match: (Neq8 y x) - // cond: isSigned(x.Type) && isSigned(y.Type) - // result: (NotEqual (CMPW (SignExt8to32 x) (SignExt8to32 y))) - for { - x := v.Args[1] - y := v.Args[0] - if !(isSigned(x.Type) && isSigned(y.Type)) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + y := v.Args[1^_i0] + if !(isSigned(x.Type) && isSigned(y.Type)) { + continue + } + v.reset(OpPPC64NotEqual) + v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) + v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) + v1.AddArg(x) + v0.AddArg(v1) + v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) + v2.AddArg(y) + v0.AddArg(v2) + v.AddArg(v0) + return true } - v.reset(OpPPC64NotEqual) - v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) - v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) - v1.AddArg(x) - v0.AddArg(v1) - v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) - v2.AddArg(y) - v0.AddArg(v2) - v.AddArg(v0) - return true + break } // match: (Neq8 x y) // result: (NotEqual (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) @@ -5008,297 +4906,164 @@ func rewriteValuePPC64_OpPPC64ADD_0(v *Value) bool { // result: (ROTLconst [c] x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64SLDconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64SRDconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(d == 64-c) { - break - } - v.reset(OpPPC64ROTLconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ADD (SRDconst x [d]) (SLDconst x [c])) - // cond: d == 64-c - // result: (ROTLconst [c] x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64SRDconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64SLDconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(d == 64-c) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpPPC64SLDconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpPPC64SRDconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(d == 64-c) { + continue + } + v.reset(OpPPC64ROTLconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpPPC64ROTLconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (ADD (SLWconst x [c]) (SRWconst x [d])) // cond: d == 32-c // result: (ROTLWconst [c] x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64SLWconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64SRWconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(d == 32-c) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpPPC64SLWconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpPPC64SRWconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(d == 32-c) { + continue + } + v.reset(OpPPC64ROTLWconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpPPC64ROTLWconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ADD (SRWconst x [d]) (SLWconst x [c])) - // cond: d == 32-c - // result: (ROTLWconst [c] x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64SRWconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64SLWconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(d == 32-c) { - break - } - v.reset(OpPPC64ROTLWconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (ADD (SLD x (ANDconst [63] y)) (SRD x (SUB (MOVDconst [64]) (ANDconst [63] y)))) // result: (ROTL x y) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64SLD { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpPPC64ANDconst || v_0_1.Type != typ.Int64 || v_0_1.AuxInt != 63 { - break - } - y := v_0_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64SRD { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpPPC64SUB || v_1_1.Type != typ.UInt { - break - } - _ = v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpPPC64MOVDconst || v_1_1_0.AuxInt != 64 { - break - } - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpPPC64ANDconst || v_1_1_1.Type != typ.UInt || v_1_1_1.AuxInt != 63 || y != v_1_1_1.Args[0] { - break - } - v.reset(OpPPC64ROTL) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADD (SRD x (SUB (MOVDconst [64]) (ANDconst [63] y))) (SLD x (ANDconst [63] y))) - // result: (ROTL x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64SRD { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpPPC64SUB || v_0_1.Type != typ.UInt { - break - } - _ = v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpPPC64MOVDconst || v_0_1_0.AuxInt != 64 { - break - } - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpPPC64ANDconst || v_0_1_1.Type != typ.UInt || v_0_1_1.AuxInt != 63 { - break - } - y := v_0_1_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64SLD { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpPPC64ANDconst || v_1_1.Type != typ.Int64 || v_1_1.AuxInt != 63 || y != v_1_1.Args[0] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpPPC64SLD { + continue + } + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpPPC64ANDconst || v_0_1.Type != typ.Int64 || v_0_1.AuxInt != 63 { + continue + } + y := v_0_1.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpPPC64SRD { + continue + } + _ = v_1.Args[1] + if x != v_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpPPC64SUB || v_1_1.Type != typ.UInt { + continue + } + _ = v_1_1.Args[1] + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpPPC64MOVDconst || v_1_1_0.AuxInt != 64 { + continue + } + v_1_1_1 := v_1_1.Args[1] + if v_1_1_1.Op != OpPPC64ANDconst || v_1_1_1.Type != typ.UInt || v_1_1_1.AuxInt != 63 || y != v_1_1_1.Args[0] { + continue + } + v.reset(OpPPC64ROTL) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpPPC64ROTL) - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (ADD (SLW x (ANDconst [31] y)) (SRW x (SUB (MOVDconst [32]) (ANDconst [31] y)))) // result: (ROTLW x y) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64SLW { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpPPC64ANDconst || v_0_1.Type != typ.Int32 || v_0_1.AuxInt != 31 { - break - } - y := v_0_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64SRW { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpPPC64SUB || v_1_1.Type != typ.UInt { - break - } - _ = v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpPPC64MOVDconst || v_1_1_0.AuxInt != 32 { - break - } - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpPPC64ANDconst || v_1_1_1.Type != typ.UInt || v_1_1_1.AuxInt != 31 || y != v_1_1_1.Args[0] { - break - } - v.reset(OpPPC64ROTLW) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADD (SRW x (SUB (MOVDconst [32]) (ANDconst [31] y))) (SLW x (ANDconst [31] y))) - // result: (ROTLW x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64SRW { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpPPC64SUB || v_0_1.Type != typ.UInt { - break - } - _ = v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpPPC64MOVDconst || v_0_1_0.AuxInt != 32 { - break - } - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpPPC64ANDconst || v_0_1_1.Type != typ.UInt || v_0_1_1.AuxInt != 31 { - break - } - y := v_0_1_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64SLW { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpPPC64ANDconst || v_1_1.Type != typ.Int32 || v_1_1.AuxInt != 31 || y != v_1_1.Args[0] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpPPC64SLW { + continue + } + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpPPC64ANDconst || v_0_1.Type != typ.Int32 || v_0_1.AuxInt != 31 { + continue + } + y := v_0_1.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpPPC64SRW { + continue + } + _ = v_1.Args[1] + if x != v_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpPPC64SUB || v_1_1.Type != typ.UInt { + continue + } + _ = v_1_1.Args[1] + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpPPC64MOVDconst || v_1_1_0.AuxInt != 32 { + continue + } + v_1_1_1 := v_1_1.Args[1] + if v_1_1_1.Op != OpPPC64ANDconst || v_1_1_1.Type != typ.UInt || v_1_1_1.AuxInt != 31 || y != v_1_1_1.Args[0] { + continue + } + v.reset(OpPPC64ROTLW) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpPPC64ROTLW) - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (ADD x (MOVDconst [c])) // cond: is32Bit(c) // result: (ADDconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64MOVDconst { - break - } - c := v_1.AuxInt - if !(is32Bit(c)) { - break - } - v.reset(OpPPC64ADDconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ADD (MOVDconst [c]) x) - // cond: is32Bit(c) - // result: (ADDconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64MOVDconst { - break - } - c := v_0.AuxInt - if !(is32Bit(c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpPPC64MOVDconst { + continue + } + c := v_1.AuxInt + if !(is32Bit(c)) { + continue + } + v.reset(OpPPC64ADDconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpPPC64ADDconst) - v.AuxInt = c - v.AddArg(x) - return true + break } return false } @@ -5358,225 +5123,129 @@ func rewriteValuePPC64_OpPPC64AND_0(v *Value) bool { // result: (ANDN x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64NOR { - break - } - y := v_1.Args[1] - if y != v_1.Args[0] { - break - } - v.reset(OpPPC64ANDN) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (AND (NOR y y) x) - // result: (ANDN x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64NOR { - break - } - y := v_0.Args[1] - if y != v_0.Args[0] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpPPC64NOR { + continue + } + y := v_1.Args[1] + if y != v_1.Args[0] { + continue + } + v.reset(OpPPC64ANDN) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpPPC64ANDN) - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (AND (MOVDconst [c]) (MOVDconst [d])) // result: (MOVDconst [c&d]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64MOVDconst { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpPPC64MOVDconst { - break - } - d := v_1.AuxInt - v.reset(OpPPC64MOVDconst) - v.AuxInt = c & d - return true - } - // match: (AND (MOVDconst [d]) (MOVDconst [c])) - // result: (MOVDconst [c&d]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64MOVDconst { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpPPC64MOVDconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpPPC64MOVDconst { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpPPC64MOVDconst { + continue + } + d := v_1.AuxInt + v.reset(OpPPC64MOVDconst) + v.AuxInt = c & d + return true } - c := v_1.AuxInt - v.reset(OpPPC64MOVDconst) - v.AuxInt = c & d - return true + break } // match: (AND x (MOVDconst [c])) // cond: isU16Bit(c) // result: (ANDconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64MOVDconst { - break - } - c := v_1.AuxInt - if !(isU16Bit(c)) { - break - } - v.reset(OpPPC64ANDconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (AND (MOVDconst [c]) x) - // cond: isU16Bit(c) - // result: (ANDconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64MOVDconst { - break - } - c := v_0.AuxInt - if !(isU16Bit(c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpPPC64MOVDconst { + continue + } + c := v_1.AuxInt + if !(isU16Bit(c)) { + continue + } + v.reset(OpPPC64ANDconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpPPC64ANDconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (AND (MOVDconst [c]) y:(MOVWZreg _)) // cond: c&0xFFFFFFFF == 0xFFFFFFFF // result: y for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64MOVDconst { - break - } - c := v_0.AuxInt - y := v.Args[1] - if y.Op != OpPPC64MOVWZreg || !(c&0xFFFFFFFF == 0xFFFFFFFF) { - break - } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) - return true - } - // match: (AND y:(MOVWZreg _) (MOVDconst [c])) - // cond: c&0xFFFFFFFF == 0xFFFFFFFF - // result: y - for { - _ = v.Args[1] - y := v.Args[0] - if y.Op != OpPPC64MOVWZreg { - break - } - v_1 := v.Args[1] - if v_1.Op != OpPPC64MOVDconst { - break - } - c := v_1.AuxInt - if !(c&0xFFFFFFFF == 0xFFFFFFFF) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpPPC64MOVDconst { + continue + } + c := v_0.AuxInt + y := v.Args[1^_i0] + if y.Op != OpPPC64MOVWZreg || !(c&0xFFFFFFFF == 0xFFFFFFFF) { + continue + } + v.reset(OpCopy) + v.Type = y.Type + v.AddArg(y) + return true } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) - return true + break } // match: (AND (MOVDconst [0xFFFFFFFF]) y:(MOVWreg x)) // result: (MOVWZreg x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64MOVDconst || v_0.AuxInt != 0xFFFFFFFF { - break - } - y := v.Args[1] - if y.Op != OpPPC64MOVWreg { - break - } - x := y.Args[0] - v.reset(OpPPC64MOVWZreg) - v.AddArg(x) - return true - } - // match: (AND y:(MOVWreg x) (MOVDconst [0xFFFFFFFF])) - // result: (MOVWZreg x) - for { - _ = v.Args[1] - y := v.Args[0] - if y.Op != OpPPC64MOVWreg { - break - } - x := y.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64MOVDconst || v_1.AuxInt != 0xFFFFFFFF { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpPPC64MOVDconst || v_0.AuxInt != 0xFFFFFFFF { + continue + } + y := v.Args[1^_i0] + if y.Op != OpPPC64MOVWreg { + continue + } + x := y.Args[0] + v.reset(OpPPC64MOVWZreg) + v.AddArg(x) + return true } - v.reset(OpPPC64MOVWZreg) - v.AddArg(x) - return true + break } - return false -} -func rewriteValuePPC64_OpPPC64AND_10(v *Value) bool { // match: (AND (MOVDconst [c]) x:(MOVBZload _ _)) // result: (ANDconst [c&0xFF] x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64MOVDconst { - break - } - c := v_0.AuxInt - x := v.Args[1] - if x.Op != OpPPC64MOVBZload { - break - } - _ = x.Args[1] - v.reset(OpPPC64ANDconst) - v.AuxInt = c & 0xFF - v.AddArg(x) - return true - } - // match: (AND x:(MOVBZload _ _) (MOVDconst [c])) - // result: (ANDconst [c&0xFF] x) - for { - _ = v.Args[1] - x := v.Args[0] - if x.Op != OpPPC64MOVBZload { - break - } - _ = x.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpPPC64MOVDconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpPPC64MOVDconst { + continue + } + c := v_0.AuxInt + x := v.Args[1^_i0] + if x.Op != OpPPC64MOVBZload { + continue + } + _ = x.Args[1] + v.reset(OpPPC64ANDconst) + v.AuxInt = c & 0xFF + v.AddArg(x) + return true } - c := v_1.AuxInt - v.reset(OpPPC64ANDconst) - v.AuxInt = c & 0xFF - v.AddArg(x) - return true + break } return false } @@ -6278,72 +5947,46 @@ func rewriteValuePPC64_OpPPC64FABS_0(v *Value) bool { func rewriteValuePPC64_OpPPC64FADD_0(v *Value) bool { // match: (FADD (FMUL x y) z) // result: (FMADD x y z) - for { - z := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64FMUL { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpPPC64FMADD) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true - } - // match: (FADD z (FMUL x y)) - // result: (FMADD x y z) for { _ = v.Args[1] - z := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64FMUL { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpPPC64FMUL { + continue + } + y := v_0.Args[1] + x := v_0.Args[0] + z := v.Args[1^_i0] + v.reset(OpPPC64FMADD) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + return true } - y := v_1.Args[1] - x := v_1.Args[0] - v.reset(OpPPC64FMADD) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } return false } func rewriteValuePPC64_OpPPC64FADDS_0(v *Value) bool { // match: (FADDS (FMULS x y) z) // result: (FMADDS x y z) - for { - z := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64FMULS { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpPPC64FMADDS) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true - } - // match: (FADDS z (FMULS x y)) - // result: (FMADDS x y z) for { _ = v.Args[1] - z := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64FMULS { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpPPC64FMULS { + continue + } + y := v_0.Args[1] + x := v_0.Args[0] + z := v.Args[1^_i0] + v.reset(OpPPC64FMADDS) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + return true } - y := v_1.Args[1] - x := v_1.Args[0] - v.reset(OpPPC64FMADDS) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } return false } @@ -11268,40 +10911,21 @@ func rewriteValuePPC64_OpPPC64MOVWZreg_0(v *Value) bool { break } _ = y.Args[1] - y_0 := y.Args[0] - if y_0.Op != OpPPC64MOVDconst { - break - } - c := y_0.AuxInt - if !(uint64(c) <= 0xFFFFFFFF) { - break - } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) - return true - } - // match: (MOVWZreg y:(AND _ (MOVDconst [c]))) - // cond: uint64(c) <= 0xFFFFFFFF - // result: y - for { - y := v.Args[0] - if y.Op != OpPPC64AND { - break - } - _ = y.Args[1] - y_1 := y.Args[1] - if y_1.Op != OpPPC64MOVDconst { - break - } - c := y_1.AuxInt - if !(uint64(c) <= 0xFFFFFFFF) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + y_0 := y.Args[_i0] + if y_0.Op != OpPPC64MOVDconst { + continue + } + c := y_0.AuxInt + if !(uint64(c) <= 0xFFFFFFFF) { + continue + } + v.reset(OpCopy) + v.Type = y.Type + v.AddArg(y) + return true } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) - return true + break } // match: (MOVWZreg (SRWconst [c] (MOVBZreg x))) // result: (SRWconst [c] (MOVBZreg x)) @@ -11423,9 +11047,6 @@ func rewriteValuePPC64_OpPPC64MOVWZreg_0(v *Value) bool { v.AddArg(y) return true } - return false -} -func rewriteValuePPC64_OpPPC64MOVWZreg_10(v *Value) bool { // match: (MOVWZreg y:(MOVBZreg _)) // result: y for { @@ -11438,6 +11059,9 @@ func rewriteValuePPC64_OpPPC64MOVWZreg_10(v *Value) bool { v.AddArg(y) return true } + return false +} +func rewriteValuePPC64_OpPPC64MOVWZreg_10(v *Value) bool { // match: (MOVWZreg y:(MOVHBRload _ _)) // result: y for { @@ -11554,9 +11178,6 @@ func rewriteValuePPC64_OpPPC64MOVWZreg_10(v *Value) bool { v.AddArg(x) return true } - return false -} -func rewriteValuePPC64_OpPPC64MOVWZreg_20(v *Value) bool { // match: (MOVWZreg x:(Arg )) // cond: (is8BitInt(t) || is16BitInt(t) || is32BitInt(t)) && !isSigned(t) // result: x @@ -11574,6 +11195,9 @@ func rewriteValuePPC64_OpPPC64MOVWZreg_20(v *Value) bool { v.AddArg(x) return true } + return false +} +func rewriteValuePPC64_OpPPC64MOVWZreg_20(v *Value) bool { // match: (MOVWZreg (MOVDconst [c])) // result: (MOVDconst [int64(uint32(c))]) for { @@ -11734,40 +11358,21 @@ func rewriteValuePPC64_OpPPC64MOVWreg_0(v *Value) bool { break } _ = y.Args[1] - y_0 := y.Args[0] - if y_0.Op != OpPPC64MOVDconst { - break - } - c := y_0.AuxInt - if !(uint64(c) <= 0x7FFFFFFF) { - break - } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) - return true - } - // match: (MOVWreg y:(AND _ (MOVDconst [c]))) - // cond: uint64(c) <= 0x7FFFFFFF - // result: y - for { - y := v.Args[0] - if y.Op != OpPPC64AND { - break - } - _ = y.Args[1] - y_1 := y.Args[1] - if y_1.Op != OpPPC64MOVDconst { - break - } - c := y_1.AuxInt - if !(uint64(c) <= 0x7FFFFFFF) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + y_0 := y.Args[_i0] + if y_0.Op != OpPPC64MOVDconst { + continue + } + c := y_0.AuxInt + if !(uint64(c) <= 0x7FFFFFFF) { + continue + } + v.reset(OpCopy) + v.Type = y.Type + v.AddArg(y) + return true } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) - return true + break } // match: (MOVWreg (SRAWconst [c] (MOVBreg x))) // result: (SRAWconst [c] (MOVBreg x)) @@ -11895,9 +11500,6 @@ func rewriteValuePPC64_OpPPC64MOVWreg_0(v *Value) bool { v.AddArg(y) return true } - return false -} -func rewriteValuePPC64_OpPPC64MOVWreg_10(v *Value) bool { // match: (MOVWreg y:(MOVHreg _)) // result: y for { @@ -11910,6 +11512,9 @@ func rewriteValuePPC64_OpPPC64MOVWreg_10(v *Value) bool { v.AddArg(y) return true } + return false +} +func rewriteValuePPC64_OpPPC64MOVWreg_10(v *Value) bool { // match: (MOVWreg y:(MOVBreg _)) // result: y for { @@ -12423,302 +12028,368 @@ func rewriteValuePPC64_OpPPC64NotEqual_0(v *Value) bool { } func rewriteValuePPC64_OpPPC64OR_0(v *Value) bool { b := v.Block + config := b.Func.Config typ := &b.Func.Config.Types - // match: (OR (SLDconst x [c]) (SRDconst x [d])) + // match: ( OR (SLDconst x [c]) (SRDconst x [d])) // cond: d == 64-c // result: (ROTLconst [c] x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64SLDconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64SRDconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(d == 64-c) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpPPC64SLDconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpPPC64SRDconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(d == 64-c) { + continue + } + v.reset(OpPPC64ROTLconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpPPC64ROTLconst) - v.AuxInt = c - v.AddArg(x) - return true + break } - // match: (OR (SRDconst x [d]) (SLDconst x [c])) - // cond: d == 64-c - // result: (ROTLconst [c] x) + // match: ( OR (SLWconst x [c]) (SRWconst x [d])) + // cond: d == 32-c + // result: (ROTLWconst [c] x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64SRDconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64SLDconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(d == 64-c) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpPPC64SLWconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpPPC64SRWconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(d == 32-c) { + continue + } + v.reset(OpPPC64ROTLWconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpPPC64ROTLconst) - v.AuxInt = c - v.AddArg(x) - return true + break } - // match: (OR (SLWconst x [c]) (SRWconst x [d])) - // cond: d == 32-c - // result: (ROTLWconst [c] x) + // match: ( OR (SLD x (ANDconst [63] y)) (SRD x (SUB (MOVDconst [64]) (ANDconst [63] y)))) + // result: (ROTL x y) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64SLWconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64SRWconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(d == 32-c) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpPPC64SLD { + continue + } + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpPPC64ANDconst || v_0_1.Type != typ.Int64 || v_0_1.AuxInt != 63 { + continue + } + y := v_0_1.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpPPC64SRD { + continue + } + _ = v_1.Args[1] + if x != v_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpPPC64SUB || v_1_1.Type != typ.UInt { + continue + } + _ = v_1_1.Args[1] + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpPPC64MOVDconst || v_1_1_0.AuxInt != 64 { + continue + } + v_1_1_1 := v_1_1.Args[1] + if v_1_1_1.Op != OpPPC64ANDconst || v_1_1_1.Type != typ.UInt || v_1_1_1.AuxInt != 63 || y != v_1_1_1.Args[0] { + continue + } + v.reset(OpPPC64ROTL) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpPPC64ROTLWconst) - v.AuxInt = c - v.AddArg(x) - return true + break } - // match: (OR (SRWconst x [d]) (SLWconst x [c])) - // cond: d == 32-c - // result: (ROTLWconst [c] x) + // match: ( OR (SLW x (ANDconst [31] y)) (SRW x (SUB (MOVDconst [32]) (ANDconst [31] y)))) + // result: (ROTLW x y) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64SRWconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64SLWconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(d == 32-c) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpPPC64SLW { + continue + } + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpPPC64ANDconst || v_0_1.Type != typ.Int32 || v_0_1.AuxInt != 31 { + continue + } + y := v_0_1.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpPPC64SRW { + continue + } + _ = v_1.Args[1] + if x != v_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpPPC64SUB || v_1_1.Type != typ.UInt { + continue + } + _ = v_1_1.Args[1] + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpPPC64MOVDconst || v_1_1_0.AuxInt != 32 { + continue + } + v_1_1_1 := v_1_1.Args[1] + if v_1_1_1.Op != OpPPC64ANDconst || v_1_1_1.Type != typ.UInt || v_1_1_1.AuxInt != 31 || y != v_1_1_1.Args[0] { + continue + } + v.reset(OpPPC64ROTLW) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpPPC64ROTLWconst) - v.AuxInt = c - v.AddArg(x) - return true + break } - // match: (OR (SLD x (ANDconst [63] y)) (SRD x (SUB (MOVDconst [64]) (ANDconst [63] y)))) - // result: (ROTL x y) + // match: (OR (MOVDconst [c]) (MOVDconst [d])) + // result: (MOVDconst [c|d]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64SLD { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpPPC64ANDconst || v_0_1.Type != typ.Int64 || v_0_1.AuxInt != 63 { - break - } - y := v_0_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64SRD { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpPPC64SUB || v_1_1.Type != typ.UInt { - break - } - _ = v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpPPC64MOVDconst || v_1_1_0.AuxInt != 64 { - break - } - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpPPC64ANDconst || v_1_1_1.Type != typ.UInt || v_1_1_1.AuxInt != 63 || y != v_1_1_1.Args[0] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpPPC64MOVDconst { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpPPC64MOVDconst { + continue + } + d := v_1.AuxInt + v.reset(OpPPC64MOVDconst) + v.AuxInt = c | d + return true } - v.reset(OpPPC64ROTL) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (OR (SRD x (SUB (MOVDconst [64]) (ANDconst [63] y))) (SLD x (ANDconst [63] y))) - // result: (ROTL x y) + // match: (OR x (MOVDconst [c])) + // cond: isU32Bit(c) + // result: (ORconst [c] x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64SRD { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpPPC64SUB || v_0_1.Type != typ.UInt { - break - } - _ = v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpPPC64MOVDconst || v_0_1_0.AuxInt != 64 { - break - } - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpPPC64ANDconst || v_0_1_1.Type != typ.UInt || v_0_1_1.AuxInt != 63 { - break - } - y := v_0_1_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64SLD { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpPPC64ANDconst || v_1_1.Type != typ.Int64 || v_1_1.AuxInt != 63 || y != v_1_1.Args[0] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpPPC64MOVDconst { + continue + } + c := v_1.AuxInt + if !(isU32Bit(c)) { + continue + } + v.reset(OpPPC64ORconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpPPC64ROTL) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (OR (SLW x (ANDconst [31] y)) (SRW x (SUB (MOVDconst [32]) (ANDconst [31] y)))) - // result: (ROTLW x y) + // match: (OR x0:(MOVBZload [i0] {s} p mem) o1:(SLWconst x1:(MOVBZload [i1] {s} p mem) [8])) + // cond: !config.BigEndian && i1 == i0+1 && x0.Uses ==1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(o1) + // result: @mergePoint(b,x0,x1) (MOVHZload {s} [i0] p mem) for { + t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64SLW { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpPPC64ANDconst || v_0_1.Type != typ.Int32 || v_0_1.AuxInt != 31 { - break - } - y := v_0_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64SRW { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpPPC64SUB || v_1_1.Type != typ.UInt { - break - } - _ = v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpPPC64MOVDconst || v_1_1_0.AuxInt != 32 { - break - } - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpPPC64ANDconst || v_1_1_1.Type != typ.UInt || v_1_1_1.AuxInt != 31 || y != v_1_1_1.Args[0] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + if x0.Op != OpPPC64MOVBZload { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + o1 := v.Args[1^_i0] + if o1.Op != OpPPC64SLWconst || o1.AuxInt != 8 { + continue + } + x1 := o1.Args[0] + if x1.Op != OpPPC64MOVBZload { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(o1)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(x1.Pos, OpPPC64MOVHZload, t) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(mem) + return true } - v.reset(OpPPC64ROTLW) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (OR (SRW x (SUB (MOVDconst [32]) (ANDconst [31] y))) (SLW x (ANDconst [31] y))) - // result: (ROTLW x y) + // match: (OR x0:(MOVBZload [i0] {s} p mem) o1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [8])) + // cond: !config.BigEndian && i1 == i0+1 && x0.Uses ==1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(o1) + // result: @mergePoint(b,x0,x1) (MOVHZload {s} [i0] p mem) for { + t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64SRW { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpPPC64SUB || v_0_1.Type != typ.UInt { - break - } - _ = v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpPPC64MOVDconst || v_0_1_0.AuxInt != 32 { - break - } - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpPPC64ANDconst || v_0_1_1.Type != typ.UInt || v_0_1_1.AuxInt != 31 { - break - } - y := v_0_1_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64SLW { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpPPC64ANDconst || v_1_1.Type != typ.Int32 || v_1_1.AuxInt != 31 || y != v_1_1.Args[0] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + if x0.Op != OpPPC64MOVBZload { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + o1 := v.Args[1^_i0] + if o1.Op != OpPPC64SLDconst || o1.AuxInt != 8 { + continue + } + x1 := o1.Args[0] + if x1.Op != OpPPC64MOVBZload { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(o1)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(x1.Pos, OpPPC64MOVHZload, t) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(mem) + return true } - v.reset(OpPPC64ROTLW) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (OR (MOVDconst [c]) (MOVDconst [d])) - // result: (MOVDconst [c|d]) + // match: (OR x0:(MOVBZload [i1] {s} p mem) o1:(SLWconst x1:(MOVBZload [i0] {s} p mem) [8])) + // cond: !config.BigEndian && i1 == i0+1 && x0.Uses ==1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(o1) + // result: @mergePoint(b,x0,x1) (MOVHBRload (MOVDaddr [i0] {s} p) mem) for { + t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64MOVDconst { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpPPC64MOVDconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + if x0.Op != OpPPC64MOVBZload { + continue + } + i1 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + o1 := v.Args[1^_i0] + if o1.Op != OpPPC64SLWconst || o1.AuxInt != 8 { + continue + } + x1 := o1.Args[0] + if x1.Op != OpPPC64MOVBZload { + continue + } + i0 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(o1)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(x1.Pos, OpPPC64MOVHBRload, t) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x1.Pos, OpPPC64MOVDaddr, typ.Uintptr) + v1.AuxInt = i0 + v1.Aux = s + v1.AddArg(p) + v0.AddArg(v1) + v0.AddArg(mem) + return true } - d := v_1.AuxInt - v.reset(OpPPC64MOVDconst) - v.AuxInt = c | d - return true + break } - // match: (OR (MOVDconst [d]) (MOVDconst [c])) - // result: (MOVDconst [c|d]) + // match: (OR x0:(MOVBZload [i1] {s} p mem) o1:(SLDconst x1:(MOVBZload [i0] {s} p mem) [8])) + // cond: !config.BigEndian && i1 == i0+1 && x0.Uses ==1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(o1) + // result: @mergePoint(b,x0,x1) (MOVHBRload (MOVDaddr [i0] {s} p) mem) for { + t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64MOVDconst { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpPPC64MOVDconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + if x0.Op != OpPPC64MOVBZload { + continue + } + i1 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + o1 := v.Args[1^_i0] + if o1.Op != OpPPC64SLDconst || o1.AuxInt != 8 { + continue + } + x1 := o1.Args[0] + if x1.Op != OpPPC64MOVBZload { + continue + } + i0 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(o1)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(x1.Pos, OpPPC64MOVHBRload, t) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x1.Pos, OpPPC64MOVDaddr, typ.Uintptr) + v1.AuxInt = i0 + v1.Aux = s + v1.AddArg(p) + v0.AddArg(v1) + v0.AddArg(mem) + return true } - c := v_1.AuxInt - v.reset(OpPPC64MOVDconst) - v.AuxInt = c | d - return true + break } return false } @@ -12726,370 +12397,673 @@ func rewriteValuePPC64_OpPPC64OR_10(v *Value) bool { b := v.Block config := b.Func.Config typ := &b.Func.Config.Types - // match: (OR x (MOVDconst [c])) - // cond: isU32Bit(c) - // result: (ORconst [c] x) + // match: (OR s0:(SLWconst x0:(MOVBZload [i1] {s} p mem) [n1]) s1:(SLWconst x1:(MOVBZload [i0] {s} p mem) [n2])) + // cond: !config.BigEndian && i1 == i0+1 && n1%8 == 0 && n2 == n1+8 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) + // result: @mergePoint(b,x0,x1) (SLDconst (MOVHBRload (MOVDaddr [i0] {s} p) mem) [n1]) for { + t := v.Type _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64MOVDconst { - break - } - c := v_1.AuxInt - if !(isU32Bit(c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + s0 := v.Args[_i0] + if s0.Op != OpPPC64SLWconst { + continue + } + n1 := s0.AuxInt + x0 := s0.Args[0] + if x0.Op != OpPPC64MOVBZload { + continue + } + i1 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + s1 := v.Args[1^_i0] + if s1.Op != OpPPC64SLWconst { + continue + } + n2 := s1.AuxInt + x1 := s1.Args[0] + if x1.Op != OpPPC64MOVBZload { + continue + } + i0 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && n1%8 == 0 && n2 == n1+8 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(x1.Pos, OpPPC64SLDconst, t) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = n1 + v1 := b.NewValue0(x1.Pos, OpPPC64MOVHBRload, t) + v2 := b.NewValue0(x1.Pos, OpPPC64MOVDaddr, typ.Uintptr) + v2.AuxInt = i0 + v2.Aux = s + v2.AddArg(p) + v1.AddArg(v2) + v1.AddArg(mem) + v0.AddArg(v1) + return true } - v.reset(OpPPC64ORconst) - v.AuxInt = c - v.AddArg(x) - return true + break } - // match: (OR (MOVDconst [c]) x) - // cond: isU32Bit(c) - // result: (ORconst [c] x) + // match: (OR s0:(SLDconst x0:(MOVBZload [i1] {s} p mem) [n1]) s1:(SLDconst x1:(MOVBZload [i0] {s} p mem) [n2])) + // cond: !config.BigEndian && i1 == i0+1 && n1%8 == 0 && n2 == n1+8 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) + // result: @mergePoint(b,x0,x1) (SLDconst (MOVHBRload (MOVDaddr [i0] {s} p) mem) [n1]) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64MOVDconst { - break - } - c := v_0.AuxInt - if !(isU32Bit(c)) { - break + t := v.Type + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + s0 := v.Args[_i0] + if s0.Op != OpPPC64SLDconst { + continue + } + n1 := s0.AuxInt + x0 := s0.Args[0] + if x0.Op != OpPPC64MOVBZload { + continue + } + i1 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + s1 := v.Args[1^_i0] + if s1.Op != OpPPC64SLDconst { + continue + } + n2 := s1.AuxInt + x1 := s1.Args[0] + if x1.Op != OpPPC64MOVBZload { + continue + } + i0 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && n1%8 == 0 && n2 == n1+8 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(x1.Pos, OpPPC64SLDconst, t) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = n1 + v1 := b.NewValue0(x1.Pos, OpPPC64MOVHBRload, t) + v2 := b.NewValue0(x1.Pos, OpPPC64MOVDaddr, typ.Uintptr) + v2.AuxInt = i0 + v2.Aux = s + v2.AddArg(p) + v1.AddArg(v2) + v1.AddArg(mem) + v0.AddArg(v1) + return true } - v.reset(OpPPC64ORconst) - v.AuxInt = c - v.AddArg(x) - return true + break } - // match: (OR x0:(MOVBZload [i0] {s} p mem) o1:(SLWconst x1:(MOVBZload [i1] {s} p mem) [8])) - // cond: !config.BigEndian && i1 == i0+1 && x0.Uses ==1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(o1) - // result: @mergePoint(b,x0,x1) (MOVHZload {s} [i0] p mem) + // match: (OR s1:(SLWconst x2:(MOVBZload [i3] {s} p mem) [24]) o0:(OR s0:(SLWconst x1:(MOVBZload [i2] {s} p mem) [16]) x0:(MOVHZload [i0] {s} p mem))) + // cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses ==1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) + // result: @mergePoint(b,x0,x1,x2) (MOVWZload {s} [i0] p mem) for { t := v.Type _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpPPC64MOVBZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - o1 := v.Args[1] - if o1.Op != OpPPC64SLWconst || o1.AuxInt != 8 { - break - } - x1 := o1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(o1)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + s1 := v.Args[_i0] + if s1.Op != OpPPC64SLWconst || s1.AuxInt != 24 { + continue + } + x2 := s1.Args[0] + if x2.Op != OpPPC64MOVBZload { + continue + } + i3 := x2.AuxInt + s := x2.Aux + mem := x2.Args[1] + p := x2.Args[0] + o0 := v.Args[1^_i0] + if o0.Op != OpPPC64OR || o0.Type != t { + continue + } + _ = o0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + s0 := o0.Args[_i1] + if s0.Op != OpPPC64SLWconst || s0.AuxInt != 16 { + continue + } + x1 := s0.Args[0] + if x1.Op != OpPPC64MOVBZload { + continue + } + i2 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] { + continue + } + x0 := o0.Args[1^_i1] + if x0.Op != OpPPC64MOVHZload { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[1] + if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { + continue + } + b = mergePoint(b, x0, x1, x2) + v0 := b.NewValue0(x0.Pos, OpPPC64MOVWZload, t) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(mem) + return true + } } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpPPC64MOVHZload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true + break } - // match: (OR o1:(SLWconst x1:(MOVBZload [i1] {s} p mem) [8]) x0:(MOVBZload [i0] {s} p mem)) - // cond: !config.BigEndian && i1 == i0+1 && x0.Uses ==1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(o1) - // result: @mergePoint(b,x0,x1) (MOVHZload {s} [i0] p mem) + // match: (OR s1:(SLDconst x2:(MOVBZload [i3] {s} p mem) [24]) o0:(OR s0:(SLDconst x1:(MOVBZload [i2] {s} p mem) [16]) x0:(MOVHZload [i0] {s} p mem))) + // cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses ==1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) + // result: @mergePoint(b,x0,x1,x2) (MOVWZload {s} [i0] p mem) for { t := v.Type _ = v.Args[1] - o1 := v.Args[0] - if o1.Op != OpPPC64SLWconst || o1.AuxInt != 8 { - break - } - x1 := o1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - x0 := v.Args[1] - if x0.Op != OpPPC64MOVBZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(o1)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + s1 := v.Args[_i0] + if s1.Op != OpPPC64SLDconst || s1.AuxInt != 24 { + continue + } + x2 := s1.Args[0] + if x2.Op != OpPPC64MOVBZload { + continue + } + i3 := x2.AuxInt + s := x2.Aux + mem := x2.Args[1] + p := x2.Args[0] + o0 := v.Args[1^_i0] + if o0.Op != OpPPC64OR || o0.Type != t { + continue + } + _ = o0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + s0 := o0.Args[_i1] + if s0.Op != OpPPC64SLDconst || s0.AuxInt != 16 { + continue + } + x1 := s0.Args[0] + if x1.Op != OpPPC64MOVBZload { + continue + } + i2 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] { + continue + } + x0 := o0.Args[1^_i1] + if x0.Op != OpPPC64MOVHZload { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[1] + if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { + continue + } + b = mergePoint(b, x0, x1, x2) + v0 := b.NewValue0(x0.Pos, OpPPC64MOVWZload, t) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(mem) + return true + } } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x0.Pos, OpPPC64MOVHZload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true + break } - // match: (OR x0:(MOVBZload [i0] {s} p mem) o1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [8])) - // cond: !config.BigEndian && i1 == i0+1 && x0.Uses ==1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(o1) - // result: @mergePoint(b,x0,x1) (MOVHZload {s} [i0] p mem) + // match: (OR s1:(SLWconst x2:(MOVBZload [i0] {s} p mem) [24]) o0:(OR s0:(SLWconst x1:(MOVBZload [i1] {s} p mem) [16]) x0:(MOVHBRload (MOVDaddr [i2] {s} p) mem))) + // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) + // result: @mergePoint(b,x0,x1,x2) (MOVWBRload (MOVDaddr [i0] {s} p) mem) for { t := v.Type _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpPPC64MOVBZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - o1 := v.Args[1] - if o1.Op != OpPPC64SLDconst || o1.AuxInt != 8 { - break - } - x1 := o1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(o1)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + s1 := v.Args[_i0] + if s1.Op != OpPPC64SLWconst || s1.AuxInt != 24 { + continue + } + x2 := s1.Args[0] + if x2.Op != OpPPC64MOVBZload { + continue + } + i0 := x2.AuxInt + s := x2.Aux + mem := x2.Args[1] + p := x2.Args[0] + o0 := v.Args[1^_i0] + if o0.Op != OpPPC64OR || o0.Type != t { + continue + } + _ = o0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + s0 := o0.Args[_i1] + if s0.Op != OpPPC64SLWconst || s0.AuxInt != 16 { + continue + } + x1 := s0.Args[0] + if x1.Op != OpPPC64MOVBZload { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] { + continue + } + x0 := o0.Args[1^_i1] + if x0.Op != OpPPC64MOVHBRload || x0.Type != t { + continue + } + _ = x0.Args[1] + x0_0 := x0.Args[0] + if x0_0.Op != OpPPC64MOVDaddr || x0_0.Type != typ.Uintptr { + continue + } + i2 := x0_0.AuxInt + if x0_0.Aux != s || p != x0_0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { + continue + } + b = mergePoint(b, x0, x1, x2) + v0 := b.NewValue0(x0.Pos, OpPPC64MOVWBRload, t) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr) + v1.AuxInt = i0 + v1.Aux = s + v1.AddArg(p) + v0.AddArg(v1) + v0.AddArg(mem) + return true + } } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpPPC64MOVHZload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true + break } - // match: (OR o1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [8]) x0:(MOVBZload [i0] {s} p mem)) - // cond: !config.BigEndian && i1 == i0+1 && x0.Uses ==1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(o1) - // result: @mergePoint(b,x0,x1) (MOVHZload {s} [i0] p mem) + // match: (OR s1:(SLDconst x2:(MOVBZload [i0] {s} p mem) [24]) o0:(OR s0:(SLDconst x1:(MOVBZload [i1] {s} p mem) [16]) x0:(MOVHBRload (MOVDaddr [i2] {s} p) mem))) + // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) + // result: @mergePoint(b,x0,x1,x2) (MOVWBRload (MOVDaddr [i0] {s} p) mem) for { t := v.Type _ = v.Args[1] - o1 := v.Args[0] - if o1.Op != OpPPC64SLDconst || o1.AuxInt != 8 { - break - } - x1 := o1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - x0 := v.Args[1] - if x0.Op != OpPPC64MOVBZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(o1)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + s1 := v.Args[_i0] + if s1.Op != OpPPC64SLDconst || s1.AuxInt != 24 { + continue + } + x2 := s1.Args[0] + if x2.Op != OpPPC64MOVBZload { + continue + } + i0 := x2.AuxInt + s := x2.Aux + mem := x2.Args[1] + p := x2.Args[0] + o0 := v.Args[1^_i0] + if o0.Op != OpPPC64OR || o0.Type != t { + continue + } + _ = o0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + s0 := o0.Args[_i1] + if s0.Op != OpPPC64SLDconst || s0.AuxInt != 16 { + continue + } + x1 := s0.Args[0] + if x1.Op != OpPPC64MOVBZload { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] { + continue + } + x0 := o0.Args[1^_i1] + if x0.Op != OpPPC64MOVHBRload || x0.Type != t { + continue + } + _ = x0.Args[1] + x0_0 := x0.Args[0] + if x0_0.Op != OpPPC64MOVDaddr || x0_0.Type != typ.Uintptr { + continue + } + i2 := x0_0.AuxInt + if x0_0.Aux != s || p != x0_0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { + continue + } + b = mergePoint(b, x0, x1, x2) + v0 := b.NewValue0(x0.Pos, OpPPC64MOVWBRload, t) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr) + v1.AuxInt = i0 + v1.Aux = s + v1.AddArg(p) + v0.AddArg(v1) + v0.AddArg(mem) + return true + } } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x0.Pos, OpPPC64MOVHZload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true + break } - // match: (OR x0:(MOVBZload [i1] {s} p mem) o1:(SLWconst x1:(MOVBZload [i0] {s} p mem) [8])) - // cond: !config.BigEndian && i1 == i0+1 && x0.Uses ==1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(o1) - // result: @mergePoint(b,x0,x1) (MOVHBRload (MOVDaddr [i0] {s} p) mem) + // match: (OR x0:(MOVBZload [i3] {s} p mem) o0:(OR s0:(SLWconst x1:(MOVBZload [i2] {s} p mem) [8]) s1:(SLWconst x2:(MOVHBRload (MOVDaddr [i0] {s} p) mem) [16]))) + // cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) + // result: @mergePoint(b,x0,x1,x2) (MOVWBRload (MOVDaddr [i0] {s} p) mem) for { t := v.Type _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpPPC64MOVBZload { - break - } - i1 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - o1 := v.Args[1] - if o1.Op != OpPPC64SLWconst || o1.AuxInt != 8 { - break - } - x1 := o1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i0 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(o1)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + if x0.Op != OpPPC64MOVBZload { + continue + } + i3 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + o0 := v.Args[1^_i0] + if o0.Op != OpPPC64OR || o0.Type != t { + continue + } + _ = o0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + s0 := o0.Args[_i1] + if s0.Op != OpPPC64SLWconst || s0.AuxInt != 8 { + continue + } + x1 := s0.Args[0] + if x1.Op != OpPPC64MOVBZload { + continue + } + i2 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] { + continue + } + s1 := o0.Args[1^_i1] + if s1.Op != OpPPC64SLWconst || s1.AuxInt != 16 { + continue + } + x2 := s1.Args[0] + if x2.Op != OpPPC64MOVHBRload || x2.Type != t { + continue + } + _ = x2.Args[1] + x2_0 := x2.Args[0] + if x2_0.Op != OpPPC64MOVDaddr || x2_0.Type != typ.Uintptr { + continue + } + i0 := x2_0.AuxInt + if x2_0.Aux != s || p != x2_0.Args[0] || mem != x2.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { + continue + } + b = mergePoint(b, x0, x1, x2) + v0 := b.NewValue0(x2.Pos, OpPPC64MOVWBRload, t) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x2.Pos, OpPPC64MOVDaddr, typ.Uintptr) + v1.AuxInt = i0 + v1.Aux = s + v1.AddArg(p) + v0.AddArg(v1) + v0.AddArg(mem) + return true + } } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpPPC64MOVHBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true + break } - // match: (OR o1:(SLWconst x1:(MOVBZload [i0] {s} p mem) [8]) x0:(MOVBZload [i1] {s} p mem)) - // cond: !config.BigEndian && i1 == i0+1 && x0.Uses ==1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(o1) - // result: @mergePoint(b,x0,x1) (MOVHBRload (MOVDaddr [i0] {s} p) mem) + // match: (OR x0:(MOVBZload [i3] {s} p mem) o0:(OR s0:(SLDconst x1:(MOVBZload [i2] {s} p mem) [8]) s1:(SLDconst x2:(MOVHBRload (MOVDaddr [i0] {s} p) mem) [16]))) + // cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) + // result: @mergePoint(b,x0,x1,x2) (MOVWBRload (MOVDaddr [i0] {s} p) mem) for { t := v.Type _ = v.Args[1] - o1 := v.Args[0] - if o1.Op != OpPPC64SLWconst || o1.AuxInt != 8 { - break - } - x1 := o1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i0 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - x0 := v.Args[1] - if x0.Op != OpPPC64MOVBZload { - break - } - i1 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(o1)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + if x0.Op != OpPPC64MOVBZload { + continue + } + i3 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + o0 := v.Args[1^_i0] + if o0.Op != OpPPC64OR || o0.Type != t { + continue + } + _ = o0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + s0 := o0.Args[_i1] + if s0.Op != OpPPC64SLDconst || s0.AuxInt != 8 { + continue + } + x1 := s0.Args[0] + if x1.Op != OpPPC64MOVBZload { + continue + } + i2 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] { + continue + } + s1 := o0.Args[1^_i1] + if s1.Op != OpPPC64SLDconst || s1.AuxInt != 16 { + continue + } + x2 := s1.Args[0] + if x2.Op != OpPPC64MOVHBRload || x2.Type != t { + continue + } + _ = x2.Args[1] + x2_0 := x2.Args[0] + if x2_0.Op != OpPPC64MOVDaddr || x2_0.Type != typ.Uintptr { + continue + } + i0 := x2_0.AuxInt + if x2_0.Aux != s || p != x2_0.Args[0] || mem != x2.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { + continue + } + b = mergePoint(b, x0, x1, x2) + v0 := b.NewValue0(x2.Pos, OpPPC64MOVWBRload, t) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x2.Pos, OpPPC64MOVDaddr, typ.Uintptr) + v1.AuxInt = i0 + v1.Aux = s + v1.AddArg(p) + v0.AddArg(v1) + v0.AddArg(mem) + return true + } } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x0.Pos, OpPPC64MOVHBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true + break } - // match: (OR x0:(MOVBZload [i1] {s} p mem) o1:(SLDconst x1:(MOVBZload [i0] {s} p mem) [8])) - // cond: !config.BigEndian && i1 == i0+1 && x0.Uses ==1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(o1) - // result: @mergePoint(b,x0,x1) (MOVHBRload (MOVDaddr [i0] {s} p) mem) + // match: (OR s2:(SLDconst x2:(MOVBZload [i3] {s} p mem) [32]) o0:(OR s1:(SLDconst x1:(MOVBZload [i2] {s} p mem) [40]) s0:(SLDconst x0:(MOVHBRload (MOVDaddr [i0] {s} p) mem) [48]))) + // cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(o0) + // result: @mergePoint(b,x0,x1,x2) (SLDconst (MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]) for { t := v.Type _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpPPC64MOVBZload { - break - } - i1 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - o1 := v.Args[1] - if o1.Op != OpPPC64SLDconst || o1.AuxInt != 8 { - break - } - x1 := o1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i0 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(o1)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + s2 := v.Args[_i0] + if s2.Op != OpPPC64SLDconst || s2.AuxInt != 32 { + continue + } + x2 := s2.Args[0] + if x2.Op != OpPPC64MOVBZload { + continue + } + i3 := x2.AuxInt + s := x2.Aux + mem := x2.Args[1] + p := x2.Args[0] + o0 := v.Args[1^_i0] + if o0.Op != OpPPC64OR || o0.Type != t { + continue + } + _ = o0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + s1 := o0.Args[_i1] + if s1.Op != OpPPC64SLDconst || s1.AuxInt != 40 { + continue + } + x1 := s1.Args[0] + if x1.Op != OpPPC64MOVBZload { + continue + } + i2 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] { + continue + } + s0 := o0.Args[1^_i1] + if s0.Op != OpPPC64SLDconst || s0.AuxInt != 48 { + continue + } + x0 := s0.Args[0] + if x0.Op != OpPPC64MOVHBRload || x0.Type != t { + continue + } + _ = x0.Args[1] + x0_0 := x0.Args[0] + if x0_0.Op != OpPPC64MOVDaddr || x0_0.Type != typ.Uintptr { + continue + } + i0 := x0_0.AuxInt + if x0_0.Aux != s || p != x0_0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(o0)) { + continue + } + b = mergePoint(b, x0, x1, x2) + v0 := b.NewValue0(x0.Pos, OpPPC64SLDconst, t) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = 32 + v1 := b.NewValue0(x0.Pos, OpPPC64MOVWBRload, t) + v2 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr) + v2.AuxInt = i0 + v2.Aux = s + v2.AddArg(p) + v1.AddArg(v2) + v1.AddArg(mem) + v0.AddArg(v1) + return true + } } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpPPC64MOVHBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true + break } - // match: (OR o1:(SLDconst x1:(MOVBZload [i0] {s} p mem) [8]) x0:(MOVBZload [i1] {s} p mem)) - // cond: !config.BigEndian && i1 == i0+1 && x0.Uses ==1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(o1) - // result: @mergePoint(b,x0,x1) (MOVHBRload (MOVDaddr [i0] {s} p) mem) + // match: (OR s2:(SLDconst x2:(MOVBZload [i0] {s} p mem) [56]) o0:(OR s1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [48]) s0:(SLDconst x0:(MOVHBRload (MOVDaddr [i2] {s} p) mem) [32]))) + // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(o0) + // result: @mergePoint(b,x0,x1,x2) (SLDconst (MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]) for { t := v.Type _ = v.Args[1] - o1 := v.Args[0] - if o1.Op != OpPPC64SLDconst || o1.AuxInt != 8 { - break - } - x1 := o1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i0 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - x0 := v.Args[1] - if x0.Op != OpPPC64MOVBZload { - break - } - i1 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && o1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(o1)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + s2 := v.Args[_i0] + if s2.Op != OpPPC64SLDconst || s2.AuxInt != 56 { + continue + } + x2 := s2.Args[0] + if x2.Op != OpPPC64MOVBZload { + continue + } + i0 := x2.AuxInt + s := x2.Aux + mem := x2.Args[1] + p := x2.Args[0] + o0 := v.Args[1^_i0] + if o0.Op != OpPPC64OR || o0.Type != t { + continue + } + _ = o0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + s1 := o0.Args[_i1] + if s1.Op != OpPPC64SLDconst || s1.AuxInt != 48 { + continue + } + x1 := s1.Args[0] + if x1.Op != OpPPC64MOVBZload { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] { + continue + } + s0 := o0.Args[1^_i1] + if s0.Op != OpPPC64SLDconst || s0.AuxInt != 32 { + continue + } + x0 := s0.Args[0] + if x0.Op != OpPPC64MOVHBRload || x0.Type != t { + continue + } + _ = x0.Args[1] + x0_0 := x0.Args[0] + if x0_0.Op != OpPPC64MOVDaddr || x0_0.Type != typ.Uintptr { + continue + } + i2 := x0_0.AuxInt + if x0_0.Aux != s || p != x0_0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(o0)) { + continue + } + b = mergePoint(b, x0, x1, x2) + v0 := b.NewValue0(x0.Pos, OpPPC64SLDconst, t) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = 32 + v1 := b.NewValue0(x0.Pos, OpPPC64MOVWBRload, t) + v2 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr) + v2.AuxInt = i0 + v2.Aux = s + v2.AddArg(p) + v1.AddArg(v2) + v1.AddArg(mem) + v0.AddArg(v1) + return true + } } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x0.Pos, OpPPC64MOVHBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true + break } return false } @@ -13097,9102 +13071,462 @@ func rewriteValuePPC64_OpPPC64OR_20(v *Value) bool { b := v.Block config := b.Func.Config typ := &b.Func.Config.Types - // match: (OR s0:(SLWconst x0:(MOVBZload [i1] {s} p mem) [n1]) s1:(SLWconst x1:(MOVBZload [i0] {s} p mem) [n2])) - // cond: !config.BigEndian && i1 == i0+1 && n1%8 == 0 && n2 == n1+8 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) - // result: @mergePoint(b,x0,x1) (SLDconst (MOVHBRload (MOVDaddr [i0] {s} p) mem) [n1]) + // match: (OR s6:(SLDconst x7:(MOVBZload [i7] {s} p mem) [56]) o5:(OR s5:(SLDconst x6:(MOVBZload [i6] {s} p mem) [48]) o4:(OR s4:(SLDconst x5:(MOVBZload [i5] {s} p mem) [40]) o3:(OR s3:(SLDconst x4:(MOVBZload [i4] {s} p mem) [32]) x0:(MOVWZload {s} [i0] p mem))))) + // cond: !config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses ==1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber (s6) && clobber(o3) && clobber(o4) && clobber(o5) + // result: @mergePoint(b,x0,x4,x5,x6,x7) (MOVDload {s} [i0] p mem) for { t := v.Type _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpPPC64SLWconst { - break - } - n1 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpPPC64MOVBZload { - break - } - i1 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - s1 := v.Args[1] - if s1.Op != OpPPC64SLWconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + s6 := v.Args[_i0] + if s6.Op != OpPPC64SLDconst || s6.AuxInt != 56 { + continue + } + x7 := s6.Args[0] + if x7.Op != OpPPC64MOVBZload { + continue + } + i7 := x7.AuxInt + s := x7.Aux + mem := x7.Args[1] + p := x7.Args[0] + o5 := v.Args[1^_i0] + if o5.Op != OpPPC64OR || o5.Type != t { + continue + } + _ = o5.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + s5 := o5.Args[_i1] + if s5.Op != OpPPC64SLDconst || s5.AuxInt != 48 { + continue + } + x6 := s5.Args[0] + if x6.Op != OpPPC64MOVBZload { + continue + } + i6 := x6.AuxInt + if x6.Aux != s { + continue + } + _ = x6.Args[1] + if p != x6.Args[0] || mem != x6.Args[1] { + continue + } + o4 := o5.Args[1^_i1] + if o4.Op != OpPPC64OR || o4.Type != t { + continue + } + _ = o4.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + s4 := o4.Args[_i2] + if s4.Op != OpPPC64SLDconst || s4.AuxInt != 40 { + continue + } + x5 := s4.Args[0] + if x5.Op != OpPPC64MOVBZload { + continue + } + i5 := x5.AuxInt + if x5.Aux != s { + continue + } + _ = x5.Args[1] + if p != x5.Args[0] || mem != x5.Args[1] { + continue + } + o3 := o4.Args[1^_i2] + if o3.Op != OpPPC64OR || o3.Type != t { + continue + } + _ = o3.Args[1] + for _i3 := 0; _i3 <= 1; _i3++ { + s3 := o3.Args[_i3] + if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { + continue + } + x4 := s3.Args[0] + if x4.Op != OpPPC64MOVBZload { + continue + } + i4 := x4.AuxInt + if x4.Aux != s { + continue + } + _ = x4.Args[1] + if p != x4.Args[0] || mem != x4.Args[1] { + continue + } + x0 := o3.Args[1^_i3] + if x0.Op != OpPPC64MOVWZload { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[1] + if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber(s6) && clobber(o3) && clobber(o4) && clobber(o5)) { + continue + } + b = mergePoint(b, x0, x4, x5, x6, x7) + v0 := b.NewValue0(x0.Pos, OpPPC64MOVDload, t) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(mem) + return true + } + } + } } - n2 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break + break + } + // match: (OR s0:(SLDconst x0:(MOVBZload [i0] {s} p mem) [56]) o0:(OR s1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [48]) o1:(OR s2:(SLDconst x2:(MOVBZload [i2] {s} p mem) [40]) o2:(OR s3:(SLDconst x3:(MOVBZload [i3] {s} p mem) [32]) x4:(MOVWBRload (MOVDaddr [i4] p) mem))))) + // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3) + // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDBRload (MOVDaddr [i0] {s} p) mem) + for { + t := v.Type + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + s0 := v.Args[_i0] + if s0.Op != OpPPC64SLDconst || s0.AuxInt != 56 { + continue + } + x0 := s0.Args[0] + if x0.Op != OpPPC64MOVBZload { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + o0 := v.Args[1^_i0] + if o0.Op != OpPPC64OR || o0.Type != t { + continue + } + _ = o0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + s1 := o0.Args[_i1] + if s1.Op != OpPPC64SLDconst || s1.AuxInt != 48 { + continue + } + x1 := s1.Args[0] + if x1.Op != OpPPC64MOVBZload { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] { + continue + } + o1 := o0.Args[1^_i1] + if o1.Op != OpPPC64OR || o1.Type != t { + continue + } + _ = o1.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + s2 := o1.Args[_i2] + if s2.Op != OpPPC64SLDconst || s2.AuxInt != 40 { + continue + } + x2 := s2.Args[0] + if x2.Op != OpPPC64MOVBZload { + continue + } + i2 := x2.AuxInt + if x2.Aux != s { + continue + } + _ = x2.Args[1] + if p != x2.Args[0] || mem != x2.Args[1] { + continue + } + o2 := o1.Args[1^_i2] + if o2.Op != OpPPC64OR || o2.Type != t { + continue + } + _ = o2.Args[1] + for _i3 := 0; _i3 <= 1; _i3++ { + s3 := o2.Args[_i3] + if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { + continue + } + x3 := s3.Args[0] + if x3.Op != OpPPC64MOVBZload { + continue + } + i3 := x3.AuxInt + if x3.Aux != s { + continue + } + _ = x3.Args[1] + if p != x3.Args[0] || mem != x3.Args[1] { + continue + } + x4 := o2.Args[1^_i3] + if x4.Op != OpPPC64MOVWBRload || x4.Type != t { + continue + } + _ = x4.Args[1] + x4_0 := x4.Args[0] + if x4_0.Op != OpPPC64MOVDaddr || x4_0.Type != typ.Uintptr { + continue + } + i4 := x4_0.AuxInt + if p != x4_0.Args[0] || mem != x4.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3)) { + continue + } + b = mergePoint(b, x0, x1, x2, x3, x4) + v0 := b.NewValue0(x4.Pos, OpPPC64MOVDBRload, t) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x4.Pos, OpPPC64MOVDaddr, typ.Uintptr) + v1.AuxInt = i0 + v1.Aux = s + v1.AddArg(p) + v0.AddArg(v1) + v0.AddArg(mem) + return true + } + } + } } - i0 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && n1%8 == 0 && n2 == n1+8 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpPPC64SLDconst, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = n1 - v1 := b.NewValue0(x1.Pos, OpPPC64MOVHBRload, t) - v2 := b.NewValue0(x1.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v1.AddArg(v2) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR s1:(SLWconst x1:(MOVBZload [i0] {s} p mem) [n2]) s0:(SLWconst x0:(MOVBZload [i1] {s} p mem) [n1])) - // cond: !config.BigEndian && i1 == i0+1 && n1%8 == 0 && n2 == n1+8 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) - // result: @mergePoint(b,x0,x1) (SLDconst (MOVHBRload (MOVDaddr [i0] {s} p) mem) [n1]) - for { - t := v.Type - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpPPC64SLWconst { - break - } - n2 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i0 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - s0 := v.Args[1] - if s0.Op != OpPPC64SLWconst { - break - } - n1 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpPPC64MOVBZload { - break - } - i1 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i1 == i0+1 && n1%8 == 0 && n2 == n1+8 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x0.Pos, OpPPC64SLDconst, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = n1 - v1 := b.NewValue0(x0.Pos, OpPPC64MOVHBRload, t) - v2 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v1.AddArg(v2) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR s0:(SLDconst x0:(MOVBZload [i1] {s} p mem) [n1]) s1:(SLDconst x1:(MOVBZload [i0] {s} p mem) [n2])) - // cond: !config.BigEndian && i1 == i0+1 && n1%8 == 0 && n2 == n1+8 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) - // result: @mergePoint(b,x0,x1) (SLDconst (MOVHBRload (MOVDaddr [i0] {s} p) mem) [n1]) - for { - t := v.Type - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpPPC64SLDconst { - break - } - n1 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpPPC64MOVBZload { - break - } - i1 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - s1 := v.Args[1] - if s1.Op != OpPPC64SLDconst { - break - } - n2 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i0 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && n1%8 == 0 && n2 == n1+8 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpPPC64SLDconst, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = n1 - v1 := b.NewValue0(x1.Pos, OpPPC64MOVHBRload, t) - v2 := b.NewValue0(x1.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v1.AddArg(v2) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR s1:(SLDconst x1:(MOVBZload [i0] {s} p mem) [n2]) s0:(SLDconst x0:(MOVBZload [i1] {s} p mem) [n1])) - // cond: !config.BigEndian && i1 == i0+1 && n1%8 == 0 && n2 == n1+8 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) - // result: @mergePoint(b,x0,x1) (SLDconst (MOVHBRload (MOVDaddr [i0] {s} p) mem) [n1]) - for { - t := v.Type - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpPPC64SLDconst { - break - } - n2 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i0 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - s0 := v.Args[1] - if s0.Op != OpPPC64SLDconst { - break - } - n1 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpPPC64MOVBZload { - break - } - i1 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i1 == i0+1 && n1%8 == 0 && n2 == n1+8 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x0.Pos, OpPPC64SLDconst, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = n1 - v1 := b.NewValue0(x0.Pos, OpPPC64MOVHBRload, t) - v2 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v1.AddArg(v2) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR s1:(SLWconst x2:(MOVBZload [i3] {s} p mem) [24]) o0:(OR s0:(SLWconst x1:(MOVBZload [i2] {s} p mem) [16]) x0:(MOVHZload [i0] {s} p mem))) - // cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses ==1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVWZload {s} [i0] p mem) - for { - t := v.Type - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpPPC64SLWconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i3 := x2.AuxInt - s := x2.Aux - mem := x2.Args[1] - p := x2.Args[0] - o0 := v.Args[1] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != OpPPC64SLWconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - x0 := o0.Args[1] - if x0.Op != OpPPC64MOVHZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x0.Pos, OpPPC64MOVWZload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (OR s1:(SLWconst x2:(MOVBZload [i3] {s} p mem) [24]) o0:(OR x0:(MOVHZload [i0] {s} p mem) s0:(SLWconst x1:(MOVBZload [i2] {s} p mem) [16]))) - // cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses ==1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVWZload {s} [i0] p mem) - for { - t := v.Type - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpPPC64SLWconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i3 := x2.AuxInt - s := x2.Aux - mem := x2.Args[1] - p := x2.Args[0] - o0 := v.Args[1] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != OpPPC64MOVHZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] { - break - } - s0 := o0.Args[1] - if s0.Op != OpPPC64SLWconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x1.Pos, OpPPC64MOVWZload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (OR o0:(OR s0:(SLWconst x1:(MOVBZload [i2] {s} p mem) [16]) x0:(MOVHZload [i0] {s} p mem)) s1:(SLWconst x2:(MOVBZload [i3] {s} p mem) [24])) - // cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses ==1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVWZload {s} [i0] p mem) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != OpPPC64SLWconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i2 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - x0 := o0.Args[1] - if x0.Op != OpPPC64MOVHZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] { - break - } - s1 := v.Args[1] - if s1.Op != OpPPC64SLWconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i3 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x2.Pos, OpPPC64MOVWZload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (OR o0:(OR x0:(MOVHZload [i0] {s} p mem) s0:(SLWconst x1:(MOVBZload [i2] {s} p mem) [16])) s1:(SLWconst x2:(MOVBZload [i3] {s} p mem) [24])) - // cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses ==1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVWZload {s} [i0] p mem) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != OpPPC64MOVHZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - s0 := o0.Args[1] - if s0.Op != OpPPC64SLWconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - s1 := v.Args[1] - if s1.Op != OpPPC64SLWconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i3 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x2.Pos, OpPPC64MOVWZload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (OR s1:(SLDconst x2:(MOVBZload [i3] {s} p mem) [24]) o0:(OR s0:(SLDconst x1:(MOVBZload [i2] {s} p mem) [16]) x0:(MOVHZload [i0] {s} p mem))) - // cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses ==1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVWZload {s} [i0] p mem) - for { - t := v.Type - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i3 := x2.AuxInt - s := x2.Aux - mem := x2.Args[1] - p := x2.Args[0] - o0 := v.Args[1] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - x0 := o0.Args[1] - if x0.Op != OpPPC64MOVHZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x0.Pos, OpPPC64MOVWZload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (OR s1:(SLDconst x2:(MOVBZload [i3] {s} p mem) [24]) o0:(OR x0:(MOVHZload [i0] {s} p mem) s0:(SLDconst x1:(MOVBZload [i2] {s} p mem) [16]))) - // cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses ==1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVWZload {s} [i0] p mem) - for { - t := v.Type - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i3 := x2.AuxInt - s := x2.Aux - mem := x2.Args[1] - p := x2.Args[0] - o0 := v.Args[1] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != OpPPC64MOVHZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] { - break - } - s0 := o0.Args[1] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x1.Pos, OpPPC64MOVWZload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - return false -} -func rewriteValuePPC64_OpPPC64OR_30(v *Value) bool { - b := v.Block - config := b.Func.Config - typ := &b.Func.Config.Types - // match: (OR o0:(OR s0:(SLDconst x1:(MOVBZload [i2] {s} p mem) [16]) x0:(MOVHZload [i0] {s} p mem)) s1:(SLDconst x2:(MOVBZload [i3] {s} p mem) [24])) - // cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses ==1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVWZload {s} [i0] p mem) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i2 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - x0 := o0.Args[1] - if x0.Op != OpPPC64MOVHZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] { - break - } - s1 := v.Args[1] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i3 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x2.Pos, OpPPC64MOVWZload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (OR o0:(OR x0:(MOVHZload [i0] {s} p mem) s0:(SLDconst x1:(MOVBZload [i2] {s} p mem) [16])) s1:(SLDconst x2:(MOVBZload [i3] {s} p mem) [24])) - // cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses ==1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVWZload {s} [i0] p mem) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != OpPPC64MOVHZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - s0 := o0.Args[1] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - s1 := v.Args[1] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i3 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x2.Pos, OpPPC64MOVWZload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (OR s1:(SLWconst x2:(MOVBZload [i0] {s} p mem) [24]) o0:(OR s0:(SLWconst x1:(MOVBZload [i1] {s} p mem) [16]) x0:(MOVHBRload (MOVDaddr [i2] {s} p) mem))) - // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVWBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpPPC64SLWconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i0 := x2.AuxInt - s := x2.Aux - mem := x2.Args[1] - p := x2.Args[0] - o0 := v.Args[1] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != OpPPC64SLWconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - x0 := o0.Args[1] - if x0.Op != OpPPC64MOVHBRload || x0.Type != t { - break - } - _ = x0.Args[1] - x0_0 := x0.Args[0] - if x0_0.Op != OpPPC64MOVDaddr || x0_0.Type != typ.Uintptr { - break - } - i2 := x0_0.AuxInt - if x0_0.Aux != s || p != x0_0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x0.Pos, OpPPC64MOVWBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR s1:(SLWconst x2:(MOVBZload [i0] {s} p mem) [24]) o0:(OR x0:(MOVHBRload (MOVDaddr [i2] {s} p) mem) s0:(SLWconst x1:(MOVBZload [i1] {s} p mem) [16]))) - // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVWBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpPPC64SLWconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i0 := x2.AuxInt - s := x2.Aux - mem := x2.Args[1] - p := x2.Args[0] - o0 := v.Args[1] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != OpPPC64MOVHBRload || x0.Type != t { - break - } - _ = x0.Args[1] - x0_0 := x0.Args[0] - if x0_0.Op != OpPPC64MOVDaddr || x0_0.Type != typ.Uintptr { - break - } - i2 := x0_0.AuxInt - if x0_0.Aux != s || p != x0_0.Args[0] || mem != x0.Args[1] { - break - } - s0 := o0.Args[1] - if s0.Op != OpPPC64SLWconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x1.Pos, OpPPC64MOVWBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o0:(OR s0:(SLWconst x1:(MOVBZload [i1] {s} p mem) [16]) x0:(MOVHBRload (MOVDaddr [i2] {s} p) mem)) s1:(SLWconst x2:(MOVBZload [i0] {s} p mem) [24])) - // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVWBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != OpPPC64SLWconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - x0 := o0.Args[1] - if x0.Op != OpPPC64MOVHBRload || x0.Type != t { - break - } - _ = x0.Args[1] - x0_0 := x0.Args[0] - if x0_0.Op != OpPPC64MOVDaddr || x0_0.Type != typ.Uintptr { - break - } - i2 := x0_0.AuxInt - if x0_0.Aux != s || p != x0_0.Args[0] || mem != x0.Args[1] { - break - } - s1 := v.Args[1] - if s1.Op != OpPPC64SLWconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i0 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x2.Pos, OpPPC64MOVWBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x2.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o0:(OR x0:(MOVHBRload (MOVDaddr [i2] {s} p) mem) s0:(SLWconst x1:(MOVBZload [i1] {s} p mem) [16])) s1:(SLWconst x2:(MOVBZload [i0] {s} p mem) [24])) - // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVWBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != OpPPC64MOVHBRload || x0.Type != t { - break - } - mem := x0.Args[1] - x0_0 := x0.Args[0] - if x0_0.Op != OpPPC64MOVDaddr || x0_0.Type != typ.Uintptr { - break - } - i2 := x0_0.AuxInt - s := x0_0.Aux - p := x0_0.Args[0] - s0 := o0.Args[1] - if s0.Op != OpPPC64SLWconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - s1 := v.Args[1] - if s1.Op != OpPPC64SLWconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i0 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x2.Pos, OpPPC64MOVWBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x2.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR s1:(SLDconst x2:(MOVBZload [i0] {s} p mem) [24]) o0:(OR s0:(SLDconst x1:(MOVBZload [i1] {s} p mem) [16]) x0:(MOVHBRload (MOVDaddr [i2] {s} p) mem))) - // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVWBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i0 := x2.AuxInt - s := x2.Aux - mem := x2.Args[1] - p := x2.Args[0] - o0 := v.Args[1] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - x0 := o0.Args[1] - if x0.Op != OpPPC64MOVHBRload || x0.Type != t { - break - } - _ = x0.Args[1] - x0_0 := x0.Args[0] - if x0_0.Op != OpPPC64MOVDaddr || x0_0.Type != typ.Uintptr { - break - } - i2 := x0_0.AuxInt - if x0_0.Aux != s || p != x0_0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x0.Pos, OpPPC64MOVWBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR s1:(SLDconst x2:(MOVBZload [i0] {s} p mem) [24]) o0:(OR x0:(MOVHBRload (MOVDaddr [i2] {s} p) mem) s0:(SLDconst x1:(MOVBZload [i1] {s} p mem) [16]))) - // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVWBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i0 := x2.AuxInt - s := x2.Aux - mem := x2.Args[1] - p := x2.Args[0] - o0 := v.Args[1] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != OpPPC64MOVHBRload || x0.Type != t { - break - } - _ = x0.Args[1] - x0_0 := x0.Args[0] - if x0_0.Op != OpPPC64MOVDaddr || x0_0.Type != typ.Uintptr { - break - } - i2 := x0_0.AuxInt - if x0_0.Aux != s || p != x0_0.Args[0] || mem != x0.Args[1] { - break - } - s0 := o0.Args[1] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x1.Pos, OpPPC64MOVWBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o0:(OR s0:(SLDconst x1:(MOVBZload [i1] {s} p mem) [16]) x0:(MOVHBRload (MOVDaddr [i2] {s} p) mem)) s1:(SLDconst x2:(MOVBZload [i0] {s} p mem) [24])) - // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVWBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - x0 := o0.Args[1] - if x0.Op != OpPPC64MOVHBRload || x0.Type != t { - break - } - _ = x0.Args[1] - x0_0 := x0.Args[0] - if x0_0.Op != OpPPC64MOVDaddr || x0_0.Type != typ.Uintptr { - break - } - i2 := x0_0.AuxInt - if x0_0.Aux != s || p != x0_0.Args[0] || mem != x0.Args[1] { - break - } - s1 := v.Args[1] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i0 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x2.Pos, OpPPC64MOVWBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x2.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o0:(OR x0:(MOVHBRload (MOVDaddr [i2] {s} p) mem) s0:(SLDconst x1:(MOVBZload [i1] {s} p mem) [16])) s1:(SLDconst x2:(MOVBZload [i0] {s} p mem) [24])) - // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVWBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - x0 := o0.Args[0] - if x0.Op != OpPPC64MOVHBRload || x0.Type != t { - break - } - mem := x0.Args[1] - x0_0 := x0.Args[0] - if x0_0.Op != OpPPC64MOVDaddr || x0_0.Type != typ.Uintptr { - break - } - i2 := x0_0.AuxInt - s := x0_0.Aux - p := x0_0.Args[0] - s0 := o0.Args[1] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 16 { - break - } - x1 := s0.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - s1 := v.Args[1] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 24 { - break - } - x2 := s1.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i0 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x2.Pos, OpPPC64MOVWBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x2.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - return false -} -func rewriteValuePPC64_OpPPC64OR_40(v *Value) bool { - b := v.Block - config := b.Func.Config - typ := &b.Func.Config.Types - // match: (OR x0:(MOVBZload [i3] {s} p mem) o0:(OR s0:(SLWconst x1:(MOVBZload [i2] {s} p mem) [8]) s1:(SLWconst x2:(MOVHBRload (MOVDaddr [i0] {s} p) mem) [16]))) - // cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVWBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpPPC64MOVBZload { - break - } - i3 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - o0 := v.Args[1] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != OpPPC64SLWconst || s0.AuxInt != 8 { - break - } - x1 := s0.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - s1 := o0.Args[1] - if s1.Op != OpPPC64SLWconst || s1.AuxInt != 16 { - break - } - x2 := s1.Args[0] - if x2.Op != OpPPC64MOVHBRload || x2.Type != t { - break - } - _ = x2.Args[1] - x2_0 := x2.Args[0] - if x2_0.Op != OpPPC64MOVDaddr || x2_0.Type != typ.Uintptr { - break - } - i0 := x2_0.AuxInt - if x2_0.Aux != s || p != x2_0.Args[0] || mem != x2.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x2.Pos, OpPPC64MOVWBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x2.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR x0:(MOVBZload [i3] {s} p mem) o0:(OR s1:(SLWconst x2:(MOVHBRload (MOVDaddr [i0] {s} p) mem) [16]) s0:(SLWconst x1:(MOVBZload [i2] {s} p mem) [8]))) - // cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVWBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpPPC64MOVBZload { - break - } - i3 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - o0 := v.Args[1] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s1 := o0.Args[0] - if s1.Op != OpPPC64SLWconst || s1.AuxInt != 16 { - break - } - x2 := s1.Args[0] - if x2.Op != OpPPC64MOVHBRload || x2.Type != t { - break - } - _ = x2.Args[1] - x2_0 := x2.Args[0] - if x2_0.Op != OpPPC64MOVDaddr || x2_0.Type != typ.Uintptr { - break - } - i0 := x2_0.AuxInt - if x2_0.Aux != s || p != x2_0.Args[0] || mem != x2.Args[1] { - break - } - s0 := o0.Args[1] - if s0.Op != OpPPC64SLWconst || s0.AuxInt != 8 { - break - } - x1 := s0.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x1.Pos, OpPPC64MOVWBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o0:(OR s0:(SLWconst x1:(MOVBZload [i2] {s} p mem) [8]) s1:(SLWconst x2:(MOVHBRload (MOVDaddr [i0] {s} p) mem) [16])) x0:(MOVBZload [i3] {s} p mem)) - // cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVWBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != OpPPC64SLWconst || s0.AuxInt != 8 { - break - } - x1 := s0.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i2 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - s1 := o0.Args[1] - if s1.Op != OpPPC64SLWconst || s1.AuxInt != 16 { - break - } - x2 := s1.Args[0] - if x2.Op != OpPPC64MOVHBRload || x2.Type != t { - break - } - _ = x2.Args[1] - x2_0 := x2.Args[0] - if x2_0.Op != OpPPC64MOVDaddr || x2_0.Type != typ.Uintptr { - break - } - i0 := x2_0.AuxInt - if x2_0.Aux != s || p != x2_0.Args[0] || mem != x2.Args[1] { - break - } - x0 := v.Args[1] - if x0.Op != OpPPC64MOVBZload { - break - } - i3 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x0.Pos, OpPPC64MOVWBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o0:(OR s1:(SLWconst x2:(MOVHBRload (MOVDaddr [i0] {s} p) mem) [16]) s0:(SLWconst x1:(MOVBZload [i2] {s} p mem) [8])) x0:(MOVBZload [i3] {s} p mem)) - // cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVWBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s1 := o0.Args[0] - if s1.Op != OpPPC64SLWconst || s1.AuxInt != 16 { - break - } - x2 := s1.Args[0] - if x2.Op != OpPPC64MOVHBRload || x2.Type != t { - break - } - mem := x2.Args[1] - x2_0 := x2.Args[0] - if x2_0.Op != OpPPC64MOVDaddr || x2_0.Type != typ.Uintptr { - break - } - i0 := x2_0.AuxInt - s := x2_0.Aux - p := x2_0.Args[0] - s0 := o0.Args[1] - if s0.Op != OpPPC64SLWconst || s0.AuxInt != 8 { - break - } - x1 := s0.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - x0 := v.Args[1] - if x0.Op != OpPPC64MOVBZload { - break - } - i3 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x0.Pos, OpPPC64MOVWBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR x0:(MOVBZload [i3] {s} p mem) o0:(OR s0:(SLDconst x1:(MOVBZload [i2] {s} p mem) [8]) s1:(SLDconst x2:(MOVHBRload (MOVDaddr [i0] {s} p) mem) [16]))) - // cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVWBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpPPC64MOVBZload { - break - } - i3 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - o0 := v.Args[1] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 8 { - break - } - x1 := s0.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - s1 := o0.Args[1] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 16 { - break - } - x2 := s1.Args[0] - if x2.Op != OpPPC64MOVHBRload || x2.Type != t { - break - } - _ = x2.Args[1] - x2_0 := x2.Args[0] - if x2_0.Op != OpPPC64MOVDaddr || x2_0.Type != typ.Uintptr { - break - } - i0 := x2_0.AuxInt - if x2_0.Aux != s || p != x2_0.Args[0] || mem != x2.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x2.Pos, OpPPC64MOVWBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x2.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR x0:(MOVBZload [i3] {s} p mem) o0:(OR s1:(SLDconst x2:(MOVHBRload (MOVDaddr [i0] {s} p) mem) [16]) s0:(SLDconst x1:(MOVBZload [i2] {s} p mem) [8]))) - // cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVWBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpPPC64MOVBZload { - break - } - i3 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - o0 := v.Args[1] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s1 := o0.Args[0] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 16 { - break - } - x2 := s1.Args[0] - if x2.Op != OpPPC64MOVHBRload || x2.Type != t { - break - } - _ = x2.Args[1] - x2_0 := x2.Args[0] - if x2_0.Op != OpPPC64MOVDaddr || x2_0.Type != typ.Uintptr { - break - } - i0 := x2_0.AuxInt - if x2_0.Aux != s || p != x2_0.Args[0] || mem != x2.Args[1] { - break - } - s0 := o0.Args[1] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 8 { - break - } - x1 := s0.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x1.Pos, OpPPC64MOVWBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o0:(OR s0:(SLDconst x1:(MOVBZload [i2] {s} p mem) [8]) s1:(SLDconst x2:(MOVHBRload (MOVDaddr [i0] {s} p) mem) [16])) x0:(MOVBZload [i3] {s} p mem)) - // cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVWBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 8 { - break - } - x1 := s0.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i2 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - s1 := o0.Args[1] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 16 { - break - } - x2 := s1.Args[0] - if x2.Op != OpPPC64MOVHBRload || x2.Type != t { - break - } - _ = x2.Args[1] - x2_0 := x2.Args[0] - if x2_0.Op != OpPPC64MOVDaddr || x2_0.Type != typ.Uintptr { - break - } - i0 := x2_0.AuxInt - if x2_0.Aux != s || p != x2_0.Args[0] || mem != x2.Args[1] { - break - } - x0 := v.Args[1] - if x0.Op != OpPPC64MOVBZload { - break - } - i3 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x0.Pos, OpPPC64MOVWBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o0:(OR s1:(SLDconst x2:(MOVHBRload (MOVDaddr [i0] {s} p) mem) [16]) s0:(SLDconst x1:(MOVBZload [i2] {s} p mem) [8])) x0:(MOVBZload [i3] {s} p mem)) - // cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (MOVWBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s1 := o0.Args[0] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 16 { - break - } - x2 := s1.Args[0] - if x2.Op != OpPPC64MOVHBRload || x2.Type != t { - break - } - mem := x2.Args[1] - x2_0 := x2.Args[0] - if x2_0.Op != OpPPC64MOVDaddr || x2_0.Type != typ.Uintptr { - break - } - i0 := x2_0.AuxInt - s := x2_0.Aux - p := x2_0.Args[0] - s0 := o0.Args[1] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 8 { - break - } - x1 := s0.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - x0 := v.Args[1] - if x0.Op != OpPPC64MOVBZload { - break - } - i3 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x0.Pos, OpPPC64MOVWBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR s2:(SLDconst x2:(MOVBZload [i3] {s} p mem) [32]) o0:(OR s1:(SLDconst x1:(MOVBZload [i2] {s} p mem) [40]) s0:(SLDconst x0:(MOVHBRload (MOVDaddr [i0] {s} p) mem) [48]))) - // cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (SLDconst (MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]) - for { - t := v.Type - _ = v.Args[1] - s2 := v.Args[0] - if s2.Op != OpPPC64SLDconst || s2.AuxInt != 32 { - break - } - x2 := s2.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i3 := x2.AuxInt - s := x2.Aux - mem := x2.Args[1] - p := x2.Args[0] - o0 := v.Args[1] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s1 := o0.Args[0] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 40 { - break - } - x1 := s1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - s0 := o0.Args[1] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 48 { - break - } - x0 := s0.Args[0] - if x0.Op != OpPPC64MOVHBRload || x0.Type != t { - break - } - _ = x0.Args[1] - x0_0 := x0.Args[0] - if x0_0.Op != OpPPC64MOVDaddr || x0_0.Type != typ.Uintptr { - break - } - i0 := x0_0.AuxInt - if x0_0.Aux != s || p != x0_0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x0.Pos, OpPPC64SLDconst, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = 32 - v1 := b.NewValue0(x0.Pos, OpPPC64MOVWBRload, t) - v2 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v1.AddArg(v2) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR s2:(SLDconst x2:(MOVBZload [i3] {s} p mem) [32]) o0:(OR s0:(SLDconst x0:(MOVHBRload (MOVDaddr [i0] {s} p) mem) [48]) s1:(SLDconst x1:(MOVBZload [i2] {s} p mem) [40]))) - // cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (SLDconst (MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]) - for { - t := v.Type - _ = v.Args[1] - s2 := v.Args[0] - if s2.Op != OpPPC64SLDconst || s2.AuxInt != 32 { - break - } - x2 := s2.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i3 := x2.AuxInt - s := x2.Aux - mem := x2.Args[1] - p := x2.Args[0] - o0 := v.Args[1] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 48 { - break - } - x0 := s0.Args[0] - if x0.Op != OpPPC64MOVHBRload || x0.Type != t { - break - } - _ = x0.Args[1] - x0_0 := x0.Args[0] - if x0_0.Op != OpPPC64MOVDaddr || x0_0.Type != typ.Uintptr { - break - } - i0 := x0_0.AuxInt - if x0_0.Aux != s || p != x0_0.Args[0] || mem != x0.Args[1] { - break - } - s1 := o0.Args[1] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 40 { - break - } - x1 := s1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x1.Pos, OpPPC64SLDconst, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = 32 - v1 := b.NewValue0(x1.Pos, OpPPC64MOVWBRload, t) - v2 := b.NewValue0(x1.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v1.AddArg(v2) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - return false -} -func rewriteValuePPC64_OpPPC64OR_50(v *Value) bool { - b := v.Block - config := b.Func.Config - typ := &b.Func.Config.Types - // match: (OR o0:(OR s1:(SLDconst x1:(MOVBZload [i2] {s} p mem) [40]) s0:(SLDconst x0:(MOVHBRload (MOVDaddr [i0] {s} p) mem) [48])) s2:(SLDconst x2:(MOVBZload [i3] {s} p mem) [32])) - // cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (SLDconst (MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s1 := o0.Args[0] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 40 { - break - } - x1 := s1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i2 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - s0 := o0.Args[1] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 48 { - break - } - x0 := s0.Args[0] - if x0.Op != OpPPC64MOVHBRload || x0.Type != t { - break - } - _ = x0.Args[1] - x0_0 := x0.Args[0] - if x0_0.Op != OpPPC64MOVDaddr || x0_0.Type != typ.Uintptr { - break - } - i0 := x0_0.AuxInt - if x0_0.Aux != s || p != x0_0.Args[0] || mem != x0.Args[1] { - break - } - s2 := v.Args[1] - if s2.Op != OpPPC64SLDconst || s2.AuxInt != 32 { - break - } - x2 := s2.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i3 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x2.Pos, OpPPC64SLDconst, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = 32 - v1 := b.NewValue0(x2.Pos, OpPPC64MOVWBRload, t) - v2 := b.NewValue0(x2.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v1.AddArg(v2) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR o0:(OR s0:(SLDconst x0:(MOVHBRload (MOVDaddr [i0] {s} p) mem) [48]) s1:(SLDconst x1:(MOVBZload [i2] {s} p mem) [40])) s2:(SLDconst x2:(MOVBZload [i3] {s} p mem) [32])) - // cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (SLDconst (MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 48 { - break - } - x0 := s0.Args[0] - if x0.Op != OpPPC64MOVHBRload || x0.Type != t { - break - } - mem := x0.Args[1] - x0_0 := x0.Args[0] - if x0_0.Op != OpPPC64MOVDaddr || x0_0.Type != typ.Uintptr { - break - } - i0 := x0_0.AuxInt - s := x0_0.Aux - p := x0_0.Args[0] - s1 := o0.Args[1] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 40 { - break - } - x1 := s1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i2 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - s2 := v.Args[1] - if s2.Op != OpPPC64SLDconst || s2.AuxInt != 32 { - break - } - x2 := s2.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i3 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] || !(!config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x2.Pos, OpPPC64SLDconst, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = 32 - v1 := b.NewValue0(x2.Pos, OpPPC64MOVWBRload, t) - v2 := b.NewValue0(x2.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v1.AddArg(v2) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR s2:(SLDconst x2:(MOVBZload [i0] {s} p mem) [56]) o0:(OR s1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [48]) s0:(SLDconst x0:(MOVHBRload (MOVDaddr [i2] {s} p) mem) [32]))) - // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (SLDconst (MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]) - for { - t := v.Type - _ = v.Args[1] - s2 := v.Args[0] - if s2.Op != OpPPC64SLDconst || s2.AuxInt != 56 { - break - } - x2 := s2.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i0 := x2.AuxInt - s := x2.Aux - mem := x2.Args[1] - p := x2.Args[0] - o0 := v.Args[1] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s1 := o0.Args[0] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 48 { - break - } - x1 := s1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - s0 := o0.Args[1] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 32 { - break - } - x0 := s0.Args[0] - if x0.Op != OpPPC64MOVHBRload || x0.Type != t { - break - } - _ = x0.Args[1] - x0_0 := x0.Args[0] - if x0_0.Op != OpPPC64MOVDaddr || x0_0.Type != typ.Uintptr { - break - } - i2 := x0_0.AuxInt - if x0_0.Aux != s || p != x0_0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x0.Pos, OpPPC64SLDconst, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = 32 - v1 := b.NewValue0(x0.Pos, OpPPC64MOVWBRload, t) - v2 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v1.AddArg(v2) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR s2:(SLDconst x2:(MOVBZload [i0] {s} p mem) [56]) o0:(OR s0:(SLDconst x0:(MOVHBRload (MOVDaddr [i2] {s} p) mem) [32]) s1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [48]))) - // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (SLDconst (MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]) - for { - t := v.Type - _ = v.Args[1] - s2 := v.Args[0] - if s2.Op != OpPPC64SLDconst || s2.AuxInt != 56 { - break - } - x2 := s2.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i0 := x2.AuxInt - s := x2.Aux - mem := x2.Args[1] - p := x2.Args[0] - o0 := v.Args[1] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 32 { - break - } - x0 := s0.Args[0] - if x0.Op != OpPPC64MOVHBRload || x0.Type != t { - break - } - _ = x0.Args[1] - x0_0 := x0.Args[0] - if x0_0.Op != OpPPC64MOVDaddr || x0_0.Type != typ.Uintptr { - break - } - i2 := x0_0.AuxInt - if x0_0.Aux != s || p != x0_0.Args[0] || mem != x0.Args[1] { - break - } - s1 := o0.Args[1] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 48 { - break - } - x1 := s1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x1.Pos, OpPPC64SLDconst, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = 32 - v1 := b.NewValue0(x1.Pos, OpPPC64MOVWBRload, t) - v2 := b.NewValue0(x1.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v1.AddArg(v2) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR o0:(OR s1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [48]) s0:(SLDconst x0:(MOVHBRload (MOVDaddr [i2] {s} p) mem) [32])) s2:(SLDconst x2:(MOVBZload [i0] {s} p mem) [56])) - // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (SLDconst (MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s1 := o0.Args[0] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 48 { - break - } - x1 := s1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - s0 := o0.Args[1] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 32 { - break - } - x0 := s0.Args[0] - if x0.Op != OpPPC64MOVHBRload || x0.Type != t { - break - } - _ = x0.Args[1] - x0_0 := x0.Args[0] - if x0_0.Op != OpPPC64MOVDaddr || x0_0.Type != typ.Uintptr { - break - } - i2 := x0_0.AuxInt - if x0_0.Aux != s || p != x0_0.Args[0] || mem != x0.Args[1] { - break - } - s2 := v.Args[1] - if s2.Op != OpPPC64SLDconst || s2.AuxInt != 56 { - break - } - x2 := s2.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i0 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x2.Pos, OpPPC64SLDconst, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = 32 - v1 := b.NewValue0(x2.Pos, OpPPC64MOVWBRload, t) - v2 := b.NewValue0(x2.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v1.AddArg(v2) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR o0:(OR s0:(SLDconst x0:(MOVHBRload (MOVDaddr [i2] {s} p) mem) [32]) s1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [48])) s2:(SLDconst x2:(MOVBZload [i0] {s} p mem) [56])) - // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(o0) - // result: @mergePoint(b,x0,x1,x2) (SLDconst (MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s0 := o0.Args[0] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 32 { - break - } - x0 := s0.Args[0] - if x0.Op != OpPPC64MOVHBRload || x0.Type != t { - break - } - mem := x0.Args[1] - x0_0 := x0.Args[0] - if x0_0.Op != OpPPC64MOVDaddr || x0_0.Type != typ.Uintptr { - break - } - i2 := x0_0.AuxInt - s := x0_0.Aux - p := x0_0.Args[0] - s1 := o0.Args[1] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 48 { - break - } - x1 := s1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - s2 := v.Args[1] - if s2.Op != OpPPC64SLDconst || s2.AuxInt != 56 { - break - } - x2 := s2.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i0 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(o0)) { - break - } - b = mergePoint(b, x0, x1, x2) - v0 := b.NewValue0(x2.Pos, OpPPC64SLDconst, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = 32 - v1 := b.NewValue0(x2.Pos, OpPPC64MOVWBRload, t) - v2 := b.NewValue0(x2.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v1.AddArg(v2) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR s6:(SLDconst x7:(MOVBZload [i7] {s} p mem) [56]) o5:(OR s5:(SLDconst x6:(MOVBZload [i6] {s} p mem) [48]) o4:(OR s4:(SLDconst x5:(MOVBZload [i5] {s} p mem) [40]) o3:(OR s3:(SLDconst x4:(MOVBZload [i4] {s} p mem) [32]) x0:(MOVWZload {s} [i0] p mem))))) - // cond: !config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses ==1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber (s6) && clobber(o3) && clobber(o4) && clobber(o5) - // result: @mergePoint(b,x0,x4,x5,x6,x7) (MOVDload {s} [i0] p mem) - for { - t := v.Type - _ = v.Args[1] - s6 := v.Args[0] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 56 { - break - } - x7 := s6.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - s := x7.Aux - mem := x7.Args[1] - p := x7.Args[0] - o5 := v.Args[1] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - s5 := o5.Args[0] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 48 { - break - } - x6 := s5.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] { - break - } - o4 := o5.Args[1] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - s4 := o4.Args[0] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 40 { - break - } - x5 := s4.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - o3 := o4.Args[1] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s3 := o3.Args[0] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x4 := s3.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - x0 := o3.Args[1] - if x0.Op != OpPPC64MOVWZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber(s6) && clobber(o3) && clobber(o4) && clobber(o5)) { - break - } - b = mergePoint(b, x0, x4, x5, x6, x7) - v0 := b.NewValue0(x0.Pos, OpPPC64MOVDload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (OR s6:(SLDconst x7:(MOVBZload [i7] {s} p mem) [56]) o5:(OR s5:(SLDconst x6:(MOVBZload [i6] {s} p mem) [48]) o4:(OR s4:(SLDconst x5:(MOVBZload [i5] {s} p mem) [40]) o3:(OR x0:(MOVWZload {s} [i0] p mem) s3:(SLDconst x4:(MOVBZload [i4] {s} p mem) [32]))))) - // cond: !config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses ==1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber (s6) && clobber(o3) && clobber(o4) && clobber(o5) - // result: @mergePoint(b,x0,x4,x5,x6,x7) (MOVDload {s} [i0] p mem) - for { - t := v.Type - _ = v.Args[1] - s6 := v.Args[0] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 56 { - break - } - x7 := s6.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - s := x7.Aux - mem := x7.Args[1] - p := x7.Args[0] - o5 := v.Args[1] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - s5 := o5.Args[0] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 48 { - break - } - x6 := s5.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] { - break - } - o4 := o5.Args[1] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - s4 := o4.Args[0] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 40 { - break - } - x5 := s4.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - o3 := o4.Args[1] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - x0 := o3.Args[0] - if x0.Op != OpPPC64MOVWZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] { - break - } - s3 := o3.Args[1] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x4 := s3.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] || !(!config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber(s6) && clobber(o3) && clobber(o4) && clobber(o5)) { - break - } - b = mergePoint(b, x0, x4, x5, x6, x7) - v0 := b.NewValue0(x4.Pos, OpPPC64MOVDload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (OR s6:(SLDconst x7:(MOVBZload [i7] {s} p mem) [56]) o5:(OR s5:(SLDconst x6:(MOVBZload [i6] {s} p mem) [48]) o4:(OR o3:(OR s3:(SLDconst x4:(MOVBZload [i4] {s} p mem) [32]) x0:(MOVWZload {s} [i0] p mem)) s4:(SLDconst x5:(MOVBZload [i5] {s} p mem) [40])))) - // cond: !config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses ==1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber (s6) && clobber(o3) && clobber(o4) && clobber(o5) - // result: @mergePoint(b,x0,x4,x5,x6,x7) (MOVDload {s} [i0] p mem) - for { - t := v.Type - _ = v.Args[1] - s6 := v.Args[0] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 56 { - break - } - x7 := s6.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - s := x7.Aux - mem := x7.Args[1] - p := x7.Args[0] - o5 := v.Args[1] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - s5 := o5.Args[0] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 48 { - break - } - x6 := s5.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] { - break - } - o4 := o5.Args[1] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - o3 := o4.Args[0] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s3 := o3.Args[0] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x4 := s3.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - x0 := o3.Args[1] - if x0.Op != OpPPC64MOVWZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] { - break - } - s4 := o4.Args[1] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 40 { - break - } - x5 := s4.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] || !(!config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber(s6) && clobber(o3) && clobber(o4) && clobber(o5)) { - break - } - b = mergePoint(b, x0, x4, x5, x6, x7) - v0 := b.NewValue0(x5.Pos, OpPPC64MOVDload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (OR s6:(SLDconst x7:(MOVBZload [i7] {s} p mem) [56]) o5:(OR s5:(SLDconst x6:(MOVBZload [i6] {s} p mem) [48]) o4:(OR o3:(OR x0:(MOVWZload {s} [i0] p mem) s3:(SLDconst x4:(MOVBZload [i4] {s} p mem) [32])) s4:(SLDconst x5:(MOVBZload [i5] {s} p mem) [40])))) - // cond: !config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses ==1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber (s6) && clobber(o3) && clobber(o4) && clobber(o5) - // result: @mergePoint(b,x0,x4,x5,x6,x7) (MOVDload {s} [i0] p mem) - for { - t := v.Type - _ = v.Args[1] - s6 := v.Args[0] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 56 { - break - } - x7 := s6.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - s := x7.Aux - mem := x7.Args[1] - p := x7.Args[0] - o5 := v.Args[1] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - s5 := o5.Args[0] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 48 { - break - } - x6 := s5.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] { - break - } - o4 := o5.Args[1] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - o3 := o4.Args[0] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - x0 := o3.Args[0] - if x0.Op != OpPPC64MOVWZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] { - break - } - s3 := o3.Args[1] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x4 := s3.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s4 := o4.Args[1] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 40 { - break - } - x5 := s4.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] || !(!config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber(s6) && clobber(o3) && clobber(o4) && clobber(o5)) { - break - } - b = mergePoint(b, x0, x4, x5, x6, x7) - v0 := b.NewValue0(x5.Pos, OpPPC64MOVDload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - return false -} -func rewriteValuePPC64_OpPPC64OR_60(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (OR s6:(SLDconst x7:(MOVBZload [i7] {s} p mem) [56]) o5:(OR o4:(OR s4:(SLDconst x5:(MOVBZload [i5] {s} p mem) [40]) o3:(OR s3:(SLDconst x4:(MOVBZload [i4] {s} p mem) [32]) x0:(MOVWZload {s} [i0] p mem))) s5:(SLDconst x6:(MOVBZload [i6] {s} p mem) [48]))) - // cond: !config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses ==1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber (s6) && clobber(o3) && clobber(o4) && clobber(o5) - // result: @mergePoint(b,x0,x4,x5,x6,x7) (MOVDload {s} [i0] p mem) - for { - t := v.Type - _ = v.Args[1] - s6 := v.Args[0] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 56 { - break - } - x7 := s6.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - s := x7.Aux - mem := x7.Args[1] - p := x7.Args[0] - o5 := v.Args[1] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - o4 := o5.Args[0] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - s4 := o4.Args[0] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 40 { - break - } - x5 := s4.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - o3 := o4.Args[1] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s3 := o3.Args[0] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x4 := s3.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - x0 := o3.Args[1] - if x0.Op != OpPPC64MOVWZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] { - break - } - s5 := o5.Args[1] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 48 { - break - } - x6 := s5.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] || !(!config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber(s6) && clobber(o3) && clobber(o4) && clobber(o5)) { - break - } - b = mergePoint(b, x0, x4, x5, x6, x7) - v0 := b.NewValue0(x6.Pos, OpPPC64MOVDload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (OR s6:(SLDconst x7:(MOVBZload [i7] {s} p mem) [56]) o5:(OR o4:(OR s4:(SLDconst x5:(MOVBZload [i5] {s} p mem) [40]) o3:(OR x0:(MOVWZload {s} [i0] p mem) s3:(SLDconst x4:(MOVBZload [i4] {s} p mem) [32]))) s5:(SLDconst x6:(MOVBZload [i6] {s} p mem) [48]))) - // cond: !config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses ==1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber (s6) && clobber(o3) && clobber(o4) && clobber(o5) - // result: @mergePoint(b,x0,x4,x5,x6,x7) (MOVDload {s} [i0] p mem) - for { - t := v.Type - _ = v.Args[1] - s6 := v.Args[0] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 56 { - break - } - x7 := s6.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - s := x7.Aux - mem := x7.Args[1] - p := x7.Args[0] - o5 := v.Args[1] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - o4 := o5.Args[0] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - s4 := o4.Args[0] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 40 { - break - } - x5 := s4.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - o3 := o4.Args[1] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - x0 := o3.Args[0] - if x0.Op != OpPPC64MOVWZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] { - break - } - s3 := o3.Args[1] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x4 := s3.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s5 := o5.Args[1] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 48 { - break - } - x6 := s5.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] || !(!config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber(s6) && clobber(o3) && clobber(o4) && clobber(o5)) { - break - } - b = mergePoint(b, x0, x4, x5, x6, x7) - v0 := b.NewValue0(x6.Pos, OpPPC64MOVDload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (OR s6:(SLDconst x7:(MOVBZload [i7] {s} p mem) [56]) o5:(OR o4:(OR o3:(OR s3:(SLDconst x4:(MOVBZload [i4] {s} p mem) [32]) x0:(MOVWZload {s} [i0] p mem)) s4:(SLDconst x5:(MOVBZload [i5] {s} p mem) [40])) s5:(SLDconst x6:(MOVBZload [i6] {s} p mem) [48]))) - // cond: !config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses ==1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber (s6) && clobber(o3) && clobber(o4) && clobber(o5) - // result: @mergePoint(b,x0,x4,x5,x6,x7) (MOVDload {s} [i0] p mem) - for { - t := v.Type - _ = v.Args[1] - s6 := v.Args[0] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 56 { - break - } - x7 := s6.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - s := x7.Aux - mem := x7.Args[1] - p := x7.Args[0] - o5 := v.Args[1] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - o4 := o5.Args[0] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - o3 := o4.Args[0] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s3 := o3.Args[0] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x4 := s3.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - x0 := o3.Args[1] - if x0.Op != OpPPC64MOVWZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] { - break - } - s4 := o4.Args[1] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 40 { - break - } - x5 := s4.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - s5 := o5.Args[1] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 48 { - break - } - x6 := s5.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] || !(!config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber(s6) && clobber(o3) && clobber(o4) && clobber(o5)) { - break - } - b = mergePoint(b, x0, x4, x5, x6, x7) - v0 := b.NewValue0(x6.Pos, OpPPC64MOVDload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (OR s6:(SLDconst x7:(MOVBZload [i7] {s} p mem) [56]) o5:(OR o4:(OR o3:(OR x0:(MOVWZload {s} [i0] p mem) s3:(SLDconst x4:(MOVBZload [i4] {s} p mem) [32])) s4:(SLDconst x5:(MOVBZload [i5] {s} p mem) [40])) s5:(SLDconst x6:(MOVBZload [i6] {s} p mem) [48]))) - // cond: !config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses ==1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber (s6) && clobber(o3) && clobber(o4) && clobber(o5) - // result: @mergePoint(b,x0,x4,x5,x6,x7) (MOVDload {s} [i0] p mem) - for { - t := v.Type - _ = v.Args[1] - s6 := v.Args[0] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 56 { - break - } - x7 := s6.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - s := x7.Aux - mem := x7.Args[1] - p := x7.Args[0] - o5 := v.Args[1] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - o4 := o5.Args[0] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - o3 := o4.Args[0] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - x0 := o3.Args[0] - if x0.Op != OpPPC64MOVWZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] { - break - } - s3 := o3.Args[1] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x4 := s3.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s4 := o4.Args[1] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 40 { - break - } - x5 := s4.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - s5 := o5.Args[1] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 48 { - break - } - x6 := s5.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] || !(!config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber(s6) && clobber(o3) && clobber(o4) && clobber(o5)) { - break - } - b = mergePoint(b, x0, x4, x5, x6, x7) - v0 := b.NewValue0(x6.Pos, OpPPC64MOVDload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (OR o5:(OR s5:(SLDconst x6:(MOVBZload [i6] {s} p mem) [48]) o4:(OR s4:(SLDconst x5:(MOVBZload [i5] {s} p mem) [40]) o3:(OR s3:(SLDconst x4:(MOVBZload [i4] {s} p mem) [32]) x0:(MOVWZload {s} [i0] p mem)))) s6:(SLDconst x7:(MOVBZload [i7] {s} p mem) [56])) - // cond: !config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses ==1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber (s6) && clobber(o3) && clobber(o4) && clobber(o5) - // result: @mergePoint(b,x0,x4,x5,x6,x7) (MOVDload {s} [i0] p mem) - for { - t := v.Type - _ = v.Args[1] - o5 := v.Args[0] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - s5 := o5.Args[0] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 48 { - break - } - x6 := s5.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - s := x6.Aux - mem := x6.Args[1] - p := x6.Args[0] - o4 := o5.Args[1] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - s4 := o4.Args[0] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 40 { - break - } - x5 := s4.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - o3 := o4.Args[1] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s3 := o3.Args[0] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x4 := s3.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - x0 := o3.Args[1] - if x0.Op != OpPPC64MOVWZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] { - break - } - s6 := v.Args[1] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 56 { - break - } - x7 := s6.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - if x7.Aux != s { - break - } - _ = x7.Args[1] - if p != x7.Args[0] || mem != x7.Args[1] || !(!config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber(s6) && clobber(o3) && clobber(o4) && clobber(o5)) { - break - } - b = mergePoint(b, x0, x4, x5, x6, x7) - v0 := b.NewValue0(x7.Pos, OpPPC64MOVDload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (OR o5:(OR s5:(SLDconst x6:(MOVBZload [i6] {s} p mem) [48]) o4:(OR s4:(SLDconst x5:(MOVBZload [i5] {s} p mem) [40]) o3:(OR x0:(MOVWZload {s} [i0] p mem) s3:(SLDconst x4:(MOVBZload [i4] {s} p mem) [32])))) s6:(SLDconst x7:(MOVBZload [i7] {s} p mem) [56])) - // cond: !config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses ==1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber (s6) && clobber(o3) && clobber(o4) && clobber(o5) - // result: @mergePoint(b,x0,x4,x5,x6,x7) (MOVDload {s} [i0] p mem) - for { - t := v.Type - _ = v.Args[1] - o5 := v.Args[0] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - s5 := o5.Args[0] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 48 { - break - } - x6 := s5.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - s := x6.Aux - mem := x6.Args[1] - p := x6.Args[0] - o4 := o5.Args[1] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - s4 := o4.Args[0] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 40 { - break - } - x5 := s4.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - o3 := o4.Args[1] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - x0 := o3.Args[0] - if x0.Op != OpPPC64MOVWZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] { - break - } - s3 := o3.Args[1] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x4 := s3.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s6 := v.Args[1] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 56 { - break - } - x7 := s6.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - if x7.Aux != s { - break - } - _ = x7.Args[1] - if p != x7.Args[0] || mem != x7.Args[1] || !(!config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber(s6) && clobber(o3) && clobber(o4) && clobber(o5)) { - break - } - b = mergePoint(b, x0, x4, x5, x6, x7) - v0 := b.NewValue0(x7.Pos, OpPPC64MOVDload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (OR o5:(OR s5:(SLDconst x6:(MOVBZload [i6] {s} p mem) [48]) o4:(OR o3:(OR s3:(SLDconst x4:(MOVBZload [i4] {s} p mem) [32]) x0:(MOVWZload {s} [i0] p mem)) s4:(SLDconst x5:(MOVBZload [i5] {s} p mem) [40]))) s6:(SLDconst x7:(MOVBZload [i7] {s} p mem) [56])) - // cond: !config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses ==1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber (s6) && clobber(o3) && clobber(o4) && clobber(o5) - // result: @mergePoint(b,x0,x4,x5,x6,x7) (MOVDload {s} [i0] p mem) - for { - t := v.Type - _ = v.Args[1] - o5 := v.Args[0] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - s5 := o5.Args[0] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 48 { - break - } - x6 := s5.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - s := x6.Aux - mem := x6.Args[1] - p := x6.Args[0] - o4 := o5.Args[1] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - o3 := o4.Args[0] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s3 := o3.Args[0] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x4 := s3.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - x0 := o3.Args[1] - if x0.Op != OpPPC64MOVWZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] { - break - } - s4 := o4.Args[1] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 40 { - break - } - x5 := s4.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - s6 := v.Args[1] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 56 { - break - } - x7 := s6.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - if x7.Aux != s { - break - } - _ = x7.Args[1] - if p != x7.Args[0] || mem != x7.Args[1] || !(!config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber(s6) && clobber(o3) && clobber(o4) && clobber(o5)) { - break - } - b = mergePoint(b, x0, x4, x5, x6, x7) - v0 := b.NewValue0(x7.Pos, OpPPC64MOVDload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (OR o5:(OR s5:(SLDconst x6:(MOVBZload [i6] {s} p mem) [48]) o4:(OR o3:(OR x0:(MOVWZload {s} [i0] p mem) s3:(SLDconst x4:(MOVBZload [i4] {s} p mem) [32])) s4:(SLDconst x5:(MOVBZload [i5] {s} p mem) [40]))) s6:(SLDconst x7:(MOVBZload [i7] {s} p mem) [56])) - // cond: !config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses ==1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber (s6) && clobber(o3) && clobber(o4) && clobber(o5) - // result: @mergePoint(b,x0,x4,x5,x6,x7) (MOVDload {s} [i0] p mem) - for { - t := v.Type - _ = v.Args[1] - o5 := v.Args[0] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - s5 := o5.Args[0] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 48 { - break - } - x6 := s5.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - s := x6.Aux - mem := x6.Args[1] - p := x6.Args[0] - o4 := o5.Args[1] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - o3 := o4.Args[0] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - x0 := o3.Args[0] - if x0.Op != OpPPC64MOVWZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] { - break - } - s3 := o3.Args[1] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x4 := s3.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s4 := o4.Args[1] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 40 { - break - } - x5 := s4.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - s6 := v.Args[1] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 56 { - break - } - x7 := s6.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - if x7.Aux != s { - break - } - _ = x7.Args[1] - if p != x7.Args[0] || mem != x7.Args[1] || !(!config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber(s6) && clobber(o3) && clobber(o4) && clobber(o5)) { - break - } - b = mergePoint(b, x0, x4, x5, x6, x7) - v0 := b.NewValue0(x7.Pos, OpPPC64MOVDload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (OR o5:(OR o4:(OR s4:(SLDconst x5:(MOVBZload [i5] {s} p mem) [40]) o3:(OR s3:(SLDconst x4:(MOVBZload [i4] {s} p mem) [32]) x0:(MOVWZload {s} [i0] p mem))) s5:(SLDconst x6:(MOVBZload [i6] {s} p mem) [48])) s6:(SLDconst x7:(MOVBZload [i7] {s} p mem) [56])) - // cond: !config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses ==1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber (s6) && clobber(o3) && clobber(o4) && clobber(o5) - // result: @mergePoint(b,x0,x4,x5,x6,x7) (MOVDload {s} [i0] p mem) - for { - t := v.Type - _ = v.Args[1] - o5 := v.Args[0] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - o4 := o5.Args[0] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - s4 := o4.Args[0] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 40 { - break - } - x5 := s4.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - s := x5.Aux - mem := x5.Args[1] - p := x5.Args[0] - o3 := o4.Args[1] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s3 := o3.Args[0] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x4 := s3.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - x0 := o3.Args[1] - if x0.Op != OpPPC64MOVWZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] { - break - } - s5 := o5.Args[1] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 48 { - break - } - x6 := s5.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] { - break - } - s6 := v.Args[1] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 56 { - break - } - x7 := s6.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - if x7.Aux != s { - break - } - _ = x7.Args[1] - if p != x7.Args[0] || mem != x7.Args[1] || !(!config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber(s6) && clobber(o3) && clobber(o4) && clobber(o5)) { - break - } - b = mergePoint(b, x0, x4, x5, x6, x7) - v0 := b.NewValue0(x7.Pos, OpPPC64MOVDload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (OR o5:(OR o4:(OR s4:(SLDconst x5:(MOVBZload [i5] {s} p mem) [40]) o3:(OR x0:(MOVWZload {s} [i0] p mem) s3:(SLDconst x4:(MOVBZload [i4] {s} p mem) [32]))) s5:(SLDconst x6:(MOVBZload [i6] {s} p mem) [48])) s6:(SLDconst x7:(MOVBZload [i7] {s} p mem) [56])) - // cond: !config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses ==1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber (s6) && clobber(o3) && clobber(o4) && clobber(o5) - // result: @mergePoint(b,x0,x4,x5,x6,x7) (MOVDload {s} [i0] p mem) - for { - t := v.Type - _ = v.Args[1] - o5 := v.Args[0] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - o4 := o5.Args[0] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - s4 := o4.Args[0] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 40 { - break - } - x5 := s4.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - s := x5.Aux - mem := x5.Args[1] - p := x5.Args[0] - o3 := o4.Args[1] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - x0 := o3.Args[0] - if x0.Op != OpPPC64MOVWZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] { - break - } - s3 := o3.Args[1] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x4 := s3.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s5 := o5.Args[1] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 48 { - break - } - x6 := s5.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] { - break - } - s6 := v.Args[1] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 56 { - break - } - x7 := s6.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - if x7.Aux != s { - break - } - _ = x7.Args[1] - if p != x7.Args[0] || mem != x7.Args[1] || !(!config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber(s6) && clobber(o3) && clobber(o4) && clobber(o5)) { - break - } - b = mergePoint(b, x0, x4, x5, x6, x7) - v0 := b.NewValue0(x7.Pos, OpPPC64MOVDload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - return false -} -func rewriteValuePPC64_OpPPC64OR_70(v *Value) bool { - b := v.Block - config := b.Func.Config - typ := &b.Func.Config.Types - // match: (OR o5:(OR o4:(OR o3:(OR s3:(SLDconst x4:(MOVBZload [i4] {s} p mem) [32]) x0:(MOVWZload {s} [i0] p mem)) s4:(SLDconst x5:(MOVBZload [i5] {s} p mem) [40])) s5:(SLDconst x6:(MOVBZload [i6] {s} p mem) [48])) s6:(SLDconst x7:(MOVBZload [i7] {s} p mem) [56])) - // cond: !config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses ==1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber (s6) && clobber(o3) && clobber(o4) && clobber(o5) - // result: @mergePoint(b,x0,x4,x5,x6,x7) (MOVDload {s} [i0] p mem) - for { - t := v.Type - _ = v.Args[1] - o5 := v.Args[0] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - o4 := o5.Args[0] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - o3 := o4.Args[0] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s3 := o3.Args[0] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x4 := s3.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - s := x4.Aux - mem := x4.Args[1] - p := x4.Args[0] - x0 := o3.Args[1] - if x0.Op != OpPPC64MOVWZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] { - break - } - s4 := o4.Args[1] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 40 { - break - } - x5 := s4.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - s5 := o5.Args[1] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 48 { - break - } - x6 := s5.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] { - break - } - s6 := v.Args[1] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 56 { - break - } - x7 := s6.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - if x7.Aux != s { - break - } - _ = x7.Args[1] - if p != x7.Args[0] || mem != x7.Args[1] || !(!config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber(s6) && clobber(o3) && clobber(o4) && clobber(o5)) { - break - } - b = mergePoint(b, x0, x4, x5, x6, x7) - v0 := b.NewValue0(x7.Pos, OpPPC64MOVDload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (OR o5:(OR o4:(OR o3:(OR x0:(MOVWZload {s} [i0] p mem) s3:(SLDconst x4:(MOVBZload [i4] {s} p mem) [32])) s4:(SLDconst x5:(MOVBZload [i5] {s} p mem) [40])) s5:(SLDconst x6:(MOVBZload [i6] {s} p mem) [48])) s6:(SLDconst x7:(MOVBZload [i7] {s} p mem) [56])) - // cond: !config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses ==1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber (s6) && clobber(o3) && clobber(o4) && clobber(o5) - // result: @mergePoint(b,x0,x4,x5,x6,x7) (MOVDload {s} [i0] p mem) - for { - t := v.Type - _ = v.Args[1] - o5 := v.Args[0] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - o4 := o5.Args[0] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - o3 := o4.Args[0] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - x0 := o3.Args[0] - if x0.Op != OpPPC64MOVWZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - s3 := o3.Args[1] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x4 := s3.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s4 := o4.Args[1] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 40 { - break - } - x5 := s4.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - s5 := o5.Args[1] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 48 { - break - } - x6 := s5.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] { - break - } - s6 := v.Args[1] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 56 { - break - } - x7 := s6.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - if x7.Aux != s { - break - } - _ = x7.Args[1] - if p != x7.Args[0] || mem != x7.Args[1] || !(!config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber(s6) && clobber(o3) && clobber(o4) && clobber(o5)) { - break - } - b = mergePoint(b, x0, x4, x5, x6, x7) - v0 := b.NewValue0(x7.Pos, OpPPC64MOVDload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (OR s0:(SLDconst x0:(MOVBZload [i0] {s} p mem) [56]) o0:(OR s1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [48]) o1:(OR s2:(SLDconst x2:(MOVBZload [i2] {s} p mem) [40]) o2:(OR s3:(SLDconst x3:(MOVBZload [i3] {s} p mem) [32]) x4:(MOVWBRload (MOVDaddr [i4] p) mem))))) - // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3) - // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 56 { - break - } - x0 := s0.Args[0] - if x0.Op != OpPPC64MOVBZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - o0 := v.Args[1] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s1 := o0.Args[0] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 48 { - break - } - x1 := s1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - o1 := o0.Args[1] - if o1.Op != OpPPC64OR || o1.Type != t { - break - } - _ = o1.Args[1] - s2 := o1.Args[0] - if s2.Op != OpPPC64SLDconst || s2.AuxInt != 40 { - break - } - x2 := s2.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i2 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] { - break - } - o2 := o1.Args[1] - if o2.Op != OpPPC64OR || o2.Type != t { - break - } - _ = o2.Args[1] - s3 := o2.Args[0] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x3 := s3.Args[0] - if x3.Op != OpPPC64MOVBZload { - break - } - i3 := x3.AuxInt - if x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { - break - } - x4 := o2.Args[1] - if x4.Op != OpPPC64MOVWBRload || x4.Type != t { - break - } - _ = x4.Args[1] - x4_0 := x4.Args[0] - if x4_0.Op != OpPPC64MOVDaddr || x4_0.Type != typ.Uintptr { - break - } - i4 := x4_0.AuxInt - if p != x4_0.Args[0] || mem != x4.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4) - v0 := b.NewValue0(x4.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x4.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR s0:(SLDconst x0:(MOVBZload [i0] {s} p mem) [56]) o0:(OR s1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [48]) o1:(OR s2:(SLDconst x2:(MOVBZload [i2] {s} p mem) [40]) o2:(OR x4:(MOVWBRload (MOVDaddr [i4] p) mem) s3:(SLDconst x3:(MOVBZload [i3] {s} p mem) [32]))))) - // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3) - // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 56 { - break - } - x0 := s0.Args[0] - if x0.Op != OpPPC64MOVBZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - o0 := v.Args[1] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s1 := o0.Args[0] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 48 { - break - } - x1 := s1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - o1 := o0.Args[1] - if o1.Op != OpPPC64OR || o1.Type != t { - break - } - _ = o1.Args[1] - s2 := o1.Args[0] - if s2.Op != OpPPC64SLDconst || s2.AuxInt != 40 { - break - } - x2 := s2.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i2 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] { - break - } - o2 := o1.Args[1] - if o2.Op != OpPPC64OR || o2.Type != t { - break - } - _ = o2.Args[1] - x4 := o2.Args[0] - if x4.Op != OpPPC64MOVWBRload || x4.Type != t { - break - } - _ = x4.Args[1] - x4_0 := x4.Args[0] - if x4_0.Op != OpPPC64MOVDaddr || x4_0.Type != typ.Uintptr { - break - } - i4 := x4_0.AuxInt - if p != x4_0.Args[0] || mem != x4.Args[1] { - break - } - s3 := o2.Args[1] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x3 := s3.Args[0] - if x3.Op != OpPPC64MOVBZload { - break - } - i3 := x3.AuxInt - if x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4) - v0 := b.NewValue0(x3.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x3.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR s0:(SLDconst x0:(MOVBZload [i0] {s} p mem) [56]) o0:(OR s1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [48]) o1:(OR o2:(OR s3:(SLDconst x3:(MOVBZload [i3] {s} p mem) [32]) x4:(MOVWBRload (MOVDaddr [i4] p) mem)) s2:(SLDconst x2:(MOVBZload [i2] {s} p mem) [40])))) - // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3) - // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 56 { - break - } - x0 := s0.Args[0] - if x0.Op != OpPPC64MOVBZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - o0 := v.Args[1] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s1 := o0.Args[0] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 48 { - break - } - x1 := s1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - o1 := o0.Args[1] - if o1.Op != OpPPC64OR || o1.Type != t { - break - } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpPPC64OR || o2.Type != t { - break - } - _ = o2.Args[1] - s3 := o2.Args[0] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x3 := s3.Args[0] - if x3.Op != OpPPC64MOVBZload { - break - } - i3 := x3.AuxInt - if x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { - break - } - x4 := o2.Args[1] - if x4.Op != OpPPC64MOVWBRload || x4.Type != t { - break - } - _ = x4.Args[1] - x4_0 := x4.Args[0] - if x4_0.Op != OpPPC64MOVDaddr || x4_0.Type != typ.Uintptr { - break - } - i4 := x4_0.AuxInt - if p != x4_0.Args[0] || mem != x4.Args[1] { - break - } - s2 := o1.Args[1] - if s2.Op != OpPPC64SLDconst || s2.AuxInt != 40 { - break - } - x2 := s2.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i2 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4) - v0 := b.NewValue0(x2.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x2.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR s0:(SLDconst x0:(MOVBZload [i0] {s} p mem) [56]) o0:(OR s1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [48]) o1:(OR o2:(OR x4:(MOVWBRload (MOVDaddr [i4] p) mem) s3:(SLDconst x3:(MOVBZload [i3] {s} p mem) [32])) s2:(SLDconst x2:(MOVBZload [i2] {s} p mem) [40])))) - // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3) - // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 56 { - break - } - x0 := s0.Args[0] - if x0.Op != OpPPC64MOVBZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - o0 := v.Args[1] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s1 := o0.Args[0] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 48 { - break - } - x1 := s1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - o1 := o0.Args[1] - if o1.Op != OpPPC64OR || o1.Type != t { - break - } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpPPC64OR || o2.Type != t { - break - } - _ = o2.Args[1] - x4 := o2.Args[0] - if x4.Op != OpPPC64MOVWBRload || x4.Type != t { - break - } - _ = x4.Args[1] - x4_0 := x4.Args[0] - if x4_0.Op != OpPPC64MOVDaddr || x4_0.Type != typ.Uintptr { - break - } - i4 := x4_0.AuxInt - if p != x4_0.Args[0] || mem != x4.Args[1] { - break - } - s3 := o2.Args[1] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x3 := s3.Args[0] - if x3.Op != OpPPC64MOVBZload { - break - } - i3 := x3.AuxInt - if x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { - break - } - s2 := o1.Args[1] - if s2.Op != OpPPC64SLDconst || s2.AuxInt != 40 { - break - } - x2 := s2.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i2 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4) - v0 := b.NewValue0(x2.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x2.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR s0:(SLDconst x0:(MOVBZload [i0] {s} p mem) [56]) o0:(OR o1:(OR s2:(SLDconst x2:(MOVBZload [i2] {s} p mem) [40]) o2:(OR s3:(SLDconst x3:(MOVBZload [i3] {s} p mem) [32]) x4:(MOVWBRload (MOVDaddr [i4] p) mem))) s1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [48]))) - // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3) - // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 56 { - break - } - x0 := s0.Args[0] - if x0.Op != OpPPC64MOVBZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - o0 := v.Args[1] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpPPC64OR || o1.Type != t { - break - } - _ = o1.Args[1] - s2 := o1.Args[0] - if s2.Op != OpPPC64SLDconst || s2.AuxInt != 40 { - break - } - x2 := s2.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i2 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] { - break - } - o2 := o1.Args[1] - if o2.Op != OpPPC64OR || o2.Type != t { - break - } - _ = o2.Args[1] - s3 := o2.Args[0] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x3 := s3.Args[0] - if x3.Op != OpPPC64MOVBZload { - break - } - i3 := x3.AuxInt - if x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { - break - } - x4 := o2.Args[1] - if x4.Op != OpPPC64MOVWBRload || x4.Type != t { - break - } - _ = x4.Args[1] - x4_0 := x4.Args[0] - if x4_0.Op != OpPPC64MOVDaddr || x4_0.Type != typ.Uintptr { - break - } - i4 := x4_0.AuxInt - if p != x4_0.Args[0] || mem != x4.Args[1] { - break - } - s1 := o0.Args[1] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 48 { - break - } - x1 := s1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4) - v0 := b.NewValue0(x1.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR s0:(SLDconst x0:(MOVBZload [i0] {s} p mem) [56]) o0:(OR o1:(OR s2:(SLDconst x2:(MOVBZload [i2] {s} p mem) [40]) o2:(OR x4:(MOVWBRload (MOVDaddr [i4] p) mem) s3:(SLDconst x3:(MOVBZload [i3] {s} p mem) [32]))) s1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [48]))) - // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3) - // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 56 { - break - } - x0 := s0.Args[0] - if x0.Op != OpPPC64MOVBZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - o0 := v.Args[1] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpPPC64OR || o1.Type != t { - break - } - _ = o1.Args[1] - s2 := o1.Args[0] - if s2.Op != OpPPC64SLDconst || s2.AuxInt != 40 { - break - } - x2 := s2.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i2 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] { - break - } - o2 := o1.Args[1] - if o2.Op != OpPPC64OR || o2.Type != t { - break - } - _ = o2.Args[1] - x4 := o2.Args[0] - if x4.Op != OpPPC64MOVWBRload || x4.Type != t { - break - } - _ = x4.Args[1] - x4_0 := x4.Args[0] - if x4_0.Op != OpPPC64MOVDaddr || x4_0.Type != typ.Uintptr { - break - } - i4 := x4_0.AuxInt - if p != x4_0.Args[0] || mem != x4.Args[1] { - break - } - s3 := o2.Args[1] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x3 := s3.Args[0] - if x3.Op != OpPPC64MOVBZload { - break - } - i3 := x3.AuxInt - if x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { - break - } - s1 := o0.Args[1] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 48 { - break - } - x1 := s1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4) - v0 := b.NewValue0(x1.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR s0:(SLDconst x0:(MOVBZload [i0] {s} p mem) [56]) o0:(OR o1:(OR o2:(OR s3:(SLDconst x3:(MOVBZload [i3] {s} p mem) [32]) x4:(MOVWBRload (MOVDaddr [i4] p) mem)) s2:(SLDconst x2:(MOVBZload [i2] {s} p mem) [40])) s1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [48]))) - // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3) - // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 56 { - break - } - x0 := s0.Args[0] - if x0.Op != OpPPC64MOVBZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - o0 := v.Args[1] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpPPC64OR || o1.Type != t { - break - } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpPPC64OR || o2.Type != t { - break - } - _ = o2.Args[1] - s3 := o2.Args[0] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x3 := s3.Args[0] - if x3.Op != OpPPC64MOVBZload { - break - } - i3 := x3.AuxInt - if x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { - break - } - x4 := o2.Args[1] - if x4.Op != OpPPC64MOVWBRload || x4.Type != t { - break - } - _ = x4.Args[1] - x4_0 := x4.Args[0] - if x4_0.Op != OpPPC64MOVDaddr || x4_0.Type != typ.Uintptr { - break - } - i4 := x4_0.AuxInt - if p != x4_0.Args[0] || mem != x4.Args[1] { - break - } - s2 := o1.Args[1] - if s2.Op != OpPPC64SLDconst || s2.AuxInt != 40 { - break - } - x2 := s2.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i2 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] { - break - } - s1 := o0.Args[1] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 48 { - break - } - x1 := s1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4) - v0 := b.NewValue0(x1.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR s0:(SLDconst x0:(MOVBZload [i0] {s} p mem) [56]) o0:(OR o1:(OR o2:(OR x4:(MOVWBRload (MOVDaddr [i4] p) mem) s3:(SLDconst x3:(MOVBZload [i3] {s} p mem) [32])) s2:(SLDconst x2:(MOVBZload [i2] {s} p mem) [40])) s1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [48]))) - // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3) - // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 56 { - break - } - x0 := s0.Args[0] - if x0.Op != OpPPC64MOVBZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - o0 := v.Args[1] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpPPC64OR || o1.Type != t { - break - } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpPPC64OR || o2.Type != t { - break - } - _ = o2.Args[1] - x4 := o2.Args[0] - if x4.Op != OpPPC64MOVWBRload || x4.Type != t { - break - } - _ = x4.Args[1] - x4_0 := x4.Args[0] - if x4_0.Op != OpPPC64MOVDaddr || x4_0.Type != typ.Uintptr { - break - } - i4 := x4_0.AuxInt - if p != x4_0.Args[0] || mem != x4.Args[1] { - break - } - s3 := o2.Args[1] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x3 := s3.Args[0] - if x3.Op != OpPPC64MOVBZload { - break - } - i3 := x3.AuxInt - if x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { - break - } - s2 := o1.Args[1] - if s2.Op != OpPPC64SLDconst || s2.AuxInt != 40 { - break - } - x2 := s2.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i2 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] { - break - } - s1 := o0.Args[1] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 48 { - break - } - x1 := s1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4) - v0 := b.NewValue0(x1.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - return false -} -func rewriteValuePPC64_OpPPC64OR_80(v *Value) bool { - b := v.Block - config := b.Func.Config - typ := &b.Func.Config.Types - // match: (OR o0:(OR s1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [48]) o1:(OR s2:(SLDconst x2:(MOVBZload [i2] {s} p mem) [40]) o2:(OR s3:(SLDconst x3:(MOVBZload [i3] {s} p mem) [32]) x4:(MOVWBRload (MOVDaddr [i4] p) mem)))) s0:(SLDconst x0:(MOVBZload [i0] {s} p mem) [56])) - // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3) - // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s1 := o0.Args[0] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 48 { - break - } - x1 := s1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - o1 := o0.Args[1] - if o1.Op != OpPPC64OR || o1.Type != t { - break - } - _ = o1.Args[1] - s2 := o1.Args[0] - if s2.Op != OpPPC64SLDconst || s2.AuxInt != 40 { - break - } - x2 := s2.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i2 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] { - break - } - o2 := o1.Args[1] - if o2.Op != OpPPC64OR || o2.Type != t { - break - } - _ = o2.Args[1] - s3 := o2.Args[0] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x3 := s3.Args[0] - if x3.Op != OpPPC64MOVBZload { - break - } - i3 := x3.AuxInt - if x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { - break - } - x4 := o2.Args[1] - if x4.Op != OpPPC64MOVWBRload || x4.Type != t { - break - } - _ = x4.Args[1] - x4_0 := x4.Args[0] - if x4_0.Op != OpPPC64MOVDaddr || x4_0.Type != typ.Uintptr { - break - } - i4 := x4_0.AuxInt - if p != x4_0.Args[0] || mem != x4.Args[1] { - break - } - s0 := v.Args[1] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 56 { - break - } - x0 := s0.Args[0] - if x0.Op != OpPPC64MOVBZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4) - v0 := b.NewValue0(x0.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o0:(OR s1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [48]) o1:(OR s2:(SLDconst x2:(MOVBZload [i2] {s} p mem) [40]) o2:(OR x4:(MOVWBRload (MOVDaddr [i4] p) mem) s3:(SLDconst x3:(MOVBZload [i3] {s} p mem) [32])))) s0:(SLDconst x0:(MOVBZload [i0] {s} p mem) [56])) - // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3) - // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s1 := o0.Args[0] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 48 { - break - } - x1 := s1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - o1 := o0.Args[1] - if o1.Op != OpPPC64OR || o1.Type != t { - break - } - _ = o1.Args[1] - s2 := o1.Args[0] - if s2.Op != OpPPC64SLDconst || s2.AuxInt != 40 { - break - } - x2 := s2.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i2 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] { - break - } - o2 := o1.Args[1] - if o2.Op != OpPPC64OR || o2.Type != t { - break - } - _ = o2.Args[1] - x4 := o2.Args[0] - if x4.Op != OpPPC64MOVWBRload || x4.Type != t { - break - } - _ = x4.Args[1] - x4_0 := x4.Args[0] - if x4_0.Op != OpPPC64MOVDaddr || x4_0.Type != typ.Uintptr { - break - } - i4 := x4_0.AuxInt - if p != x4_0.Args[0] || mem != x4.Args[1] { - break - } - s3 := o2.Args[1] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x3 := s3.Args[0] - if x3.Op != OpPPC64MOVBZload { - break - } - i3 := x3.AuxInt - if x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { - break - } - s0 := v.Args[1] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 56 { - break - } - x0 := s0.Args[0] - if x0.Op != OpPPC64MOVBZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4) - v0 := b.NewValue0(x0.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o0:(OR s1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [48]) o1:(OR o2:(OR s3:(SLDconst x3:(MOVBZload [i3] {s} p mem) [32]) x4:(MOVWBRload (MOVDaddr [i4] p) mem)) s2:(SLDconst x2:(MOVBZload [i2] {s} p mem) [40]))) s0:(SLDconst x0:(MOVBZload [i0] {s} p mem) [56])) - // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3) - // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s1 := o0.Args[0] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 48 { - break - } - x1 := s1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - o1 := o0.Args[1] - if o1.Op != OpPPC64OR || o1.Type != t { - break - } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpPPC64OR || o2.Type != t { - break - } - _ = o2.Args[1] - s3 := o2.Args[0] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x3 := s3.Args[0] - if x3.Op != OpPPC64MOVBZload { - break - } - i3 := x3.AuxInt - if x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { - break - } - x4 := o2.Args[1] - if x4.Op != OpPPC64MOVWBRload || x4.Type != t { - break - } - _ = x4.Args[1] - x4_0 := x4.Args[0] - if x4_0.Op != OpPPC64MOVDaddr || x4_0.Type != typ.Uintptr { - break - } - i4 := x4_0.AuxInt - if p != x4_0.Args[0] || mem != x4.Args[1] { - break - } - s2 := o1.Args[1] - if s2.Op != OpPPC64SLDconst || s2.AuxInt != 40 { - break - } - x2 := s2.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i2 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] { - break - } - s0 := v.Args[1] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 56 { - break - } - x0 := s0.Args[0] - if x0.Op != OpPPC64MOVBZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4) - v0 := b.NewValue0(x0.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o0:(OR s1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [48]) o1:(OR o2:(OR x4:(MOVWBRload (MOVDaddr [i4] p) mem) s3:(SLDconst x3:(MOVBZload [i3] {s} p mem) [32])) s2:(SLDconst x2:(MOVBZload [i2] {s} p mem) [40]))) s0:(SLDconst x0:(MOVBZload [i0] {s} p mem) [56])) - // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3) - // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - s1 := o0.Args[0] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 48 { - break - } - x1 := s1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - o1 := o0.Args[1] - if o1.Op != OpPPC64OR || o1.Type != t { - break - } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpPPC64OR || o2.Type != t { - break - } - _ = o2.Args[1] - x4 := o2.Args[0] - if x4.Op != OpPPC64MOVWBRload || x4.Type != t { - break - } - _ = x4.Args[1] - x4_0 := x4.Args[0] - if x4_0.Op != OpPPC64MOVDaddr || x4_0.Type != typ.Uintptr { - break - } - i4 := x4_0.AuxInt - if p != x4_0.Args[0] || mem != x4.Args[1] { - break - } - s3 := o2.Args[1] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x3 := s3.Args[0] - if x3.Op != OpPPC64MOVBZload { - break - } - i3 := x3.AuxInt - if x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { - break - } - s2 := o1.Args[1] - if s2.Op != OpPPC64SLDconst || s2.AuxInt != 40 { - break - } - x2 := s2.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i2 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] { - break - } - s0 := v.Args[1] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 56 { - break - } - x0 := s0.Args[0] - if x0.Op != OpPPC64MOVBZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4) - v0 := b.NewValue0(x0.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o0:(OR o1:(OR s2:(SLDconst x2:(MOVBZload [i2] {s} p mem) [40]) o2:(OR s3:(SLDconst x3:(MOVBZload [i3] {s} p mem) [32]) x4:(MOVWBRload (MOVDaddr [i4] p) mem))) s1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [48])) s0:(SLDconst x0:(MOVBZload [i0] {s} p mem) [56])) - // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3) - // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpPPC64OR || o1.Type != t { - break - } - _ = o1.Args[1] - s2 := o1.Args[0] - if s2.Op != OpPPC64SLDconst || s2.AuxInt != 40 { - break - } - x2 := s2.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i2 := x2.AuxInt - s := x2.Aux - mem := x2.Args[1] - p := x2.Args[0] - o2 := o1.Args[1] - if o2.Op != OpPPC64OR || o2.Type != t { - break - } - _ = o2.Args[1] - s3 := o2.Args[0] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x3 := s3.Args[0] - if x3.Op != OpPPC64MOVBZload { - break - } - i3 := x3.AuxInt - if x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { - break - } - x4 := o2.Args[1] - if x4.Op != OpPPC64MOVWBRload || x4.Type != t { - break - } - _ = x4.Args[1] - x4_0 := x4.Args[0] - if x4_0.Op != OpPPC64MOVDaddr || x4_0.Type != typ.Uintptr { - break - } - i4 := x4_0.AuxInt - if p != x4_0.Args[0] || mem != x4.Args[1] { - break - } - s1 := o0.Args[1] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 48 { - break - } - x1 := s1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - s0 := v.Args[1] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 56 { - break - } - x0 := s0.Args[0] - if x0.Op != OpPPC64MOVBZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4) - v0 := b.NewValue0(x0.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o0:(OR o1:(OR s2:(SLDconst x2:(MOVBZload [i2] {s} p mem) [40]) o2:(OR x4:(MOVWBRload (MOVDaddr [i4] p) mem) s3:(SLDconst x3:(MOVBZload [i3] {s} p mem) [32]))) s1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [48])) s0:(SLDconst x0:(MOVBZload [i0] {s} p mem) [56])) - // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3) - // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpPPC64OR || o1.Type != t { - break - } - _ = o1.Args[1] - s2 := o1.Args[0] - if s2.Op != OpPPC64SLDconst || s2.AuxInt != 40 { - break - } - x2 := s2.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i2 := x2.AuxInt - s := x2.Aux - mem := x2.Args[1] - p := x2.Args[0] - o2 := o1.Args[1] - if o2.Op != OpPPC64OR || o2.Type != t { - break - } - _ = o2.Args[1] - x4 := o2.Args[0] - if x4.Op != OpPPC64MOVWBRload || x4.Type != t { - break - } - _ = x4.Args[1] - x4_0 := x4.Args[0] - if x4_0.Op != OpPPC64MOVDaddr || x4_0.Type != typ.Uintptr { - break - } - i4 := x4_0.AuxInt - if p != x4_0.Args[0] || mem != x4.Args[1] { - break - } - s3 := o2.Args[1] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x3 := s3.Args[0] - if x3.Op != OpPPC64MOVBZload { - break - } - i3 := x3.AuxInt - if x3.Aux != s { - break - } - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { - break - } - s1 := o0.Args[1] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 48 { - break - } - x1 := s1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - s0 := v.Args[1] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 56 { - break - } - x0 := s0.Args[0] - if x0.Op != OpPPC64MOVBZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4) - v0 := b.NewValue0(x0.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o0:(OR o1:(OR o2:(OR s3:(SLDconst x3:(MOVBZload [i3] {s} p mem) [32]) x4:(MOVWBRload (MOVDaddr [i4] p) mem)) s2:(SLDconst x2:(MOVBZload [i2] {s} p mem) [40])) s1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [48])) s0:(SLDconst x0:(MOVBZload [i0] {s} p mem) [56])) - // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3) - // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpPPC64OR || o1.Type != t { - break - } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpPPC64OR || o2.Type != t { - break - } - _ = o2.Args[1] - s3 := o2.Args[0] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x3 := s3.Args[0] - if x3.Op != OpPPC64MOVBZload { - break - } - i3 := x3.AuxInt - s := x3.Aux - mem := x3.Args[1] - p := x3.Args[0] - x4 := o2.Args[1] - if x4.Op != OpPPC64MOVWBRload || x4.Type != t { - break - } - _ = x4.Args[1] - x4_0 := x4.Args[0] - if x4_0.Op != OpPPC64MOVDaddr || x4_0.Type != typ.Uintptr { - break - } - i4 := x4_0.AuxInt - if p != x4_0.Args[0] || mem != x4.Args[1] { - break - } - s2 := o1.Args[1] - if s2.Op != OpPPC64SLDconst || s2.AuxInt != 40 { - break - } - x2 := s2.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i2 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] { - break - } - s1 := o0.Args[1] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 48 { - break - } - x1 := s1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - s0 := v.Args[1] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 56 { - break - } - x0 := s0.Args[0] - if x0.Op != OpPPC64MOVBZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4) - v0 := b.NewValue0(x0.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o0:(OR o1:(OR o2:(OR x4:(MOVWBRload (MOVDaddr [i4] p) mem) s3:(SLDconst x3:(MOVBZload [i3] {s} p mem) [32])) s2:(SLDconst x2:(MOVBZload [i2] {s} p mem) [40])) s1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [48])) s0:(SLDconst x0:(MOVBZload [i0] {s} p mem) [56])) - // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3) - // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o0 := v.Args[0] - if o0.Op != OpPPC64OR || o0.Type != t { - break - } - _ = o0.Args[1] - o1 := o0.Args[0] - if o1.Op != OpPPC64OR || o1.Type != t { - break - } - _ = o1.Args[1] - o2 := o1.Args[0] - if o2.Op != OpPPC64OR || o2.Type != t { - break - } - _ = o2.Args[1] - x4 := o2.Args[0] - if x4.Op != OpPPC64MOVWBRload || x4.Type != t { - break - } - mem := x4.Args[1] - x4_0 := x4.Args[0] - if x4_0.Op != OpPPC64MOVDaddr || x4_0.Type != typ.Uintptr { - break - } - i4 := x4_0.AuxInt - p := x4_0.Args[0] - s3 := o2.Args[1] - if s3.Op != OpPPC64SLDconst || s3.AuxInt != 32 { - break - } - x3 := s3.Args[0] - if x3.Op != OpPPC64MOVBZload { - break - } - i3 := x3.AuxInt - s := x3.Aux - _ = x3.Args[1] - if p != x3.Args[0] || mem != x3.Args[1] { - break - } - s2 := o1.Args[1] - if s2.Op != OpPPC64SLDconst || s2.AuxInt != 40 { - break - } - x2 := s2.Args[0] - if x2.Op != OpPPC64MOVBZload { - break - } - i2 := x2.AuxInt - if x2.Aux != s { - break - } - _ = x2.Args[1] - if p != x2.Args[0] || mem != x2.Args[1] { - break - } - s1 := o0.Args[1] - if s1.Op != OpPPC64SLDconst || s1.AuxInt != 48 { - break - } - x1 := s1.Args[0] - if x1.Op != OpPPC64MOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] { - break - } - s0 := v.Args[1] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 56 { - break - } - x0 := s0.Args[0] - if x0.Op != OpPPC64MOVBZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(!config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3)) { - break - } - b = mergePoint(b, x0, x1, x2, x3, x4) - v0 := b.NewValue0(x0.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR x7:(MOVBZload [i7] {s} p mem) o5:(OR s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]) o4:(OR s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16]) o3:(OR s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]) s0:(SLWconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]))))) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - x7 := v.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - s := x7.Aux - mem := x7.Args[1] - p := x7.Args[0] - o5 := v.Args[1] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - s6 := o5.Args[0] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] { - break - } - o4 := o5.Args[1] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - s5 := o4.Args[0] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - o3 := o4.Args[1] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s4 := o3.Args[0] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s0 := o3.Args[1] - if s0.Op != OpPPC64SLWconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x3.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x3.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR x7:(MOVBZload [i7] {s} p mem) o5:(OR s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]) o4:(OR s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16]) o3:(OR s0:(SLWconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]) s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]))))) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - x7 := v.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - s := x7.Aux - mem := x7.Args[1] - p := x7.Args[0] - o5 := v.Args[1] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - s6 := o5.Args[0] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] { - break - } - o4 := o5.Args[1] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - s5 := o4.Args[0] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - o3 := o4.Args[1] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s0 := o3.Args[0] - if s0.Op != OpPPC64SLWconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] { - break - } - s4 := o3.Args[1] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x4.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x4.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - return false -} -func rewriteValuePPC64_OpPPC64OR_90(v *Value) bool { - b := v.Block - config := b.Func.Config - typ := &b.Func.Config.Types - // match: (OR x7:(MOVBZload [i7] {s} p mem) o5:(OR s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]) o4:(OR o3:(OR s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]) s0:(SLWconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32])) s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16])))) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - x7 := v.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - s := x7.Aux - mem := x7.Args[1] - p := x7.Args[0] - o5 := v.Args[1] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - s6 := o5.Args[0] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] { - break - } - o4 := o5.Args[1] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - o3 := o4.Args[0] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s4 := o3.Args[0] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s0 := o3.Args[1] - if s0.Op != OpPPC64SLWconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] { - break - } - s5 := o4.Args[1] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x5.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x5.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR x7:(MOVBZload [i7] {s} p mem) o5:(OR s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]) o4:(OR o3:(OR s0:(SLWconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]) s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24])) s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16])))) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - x7 := v.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - s := x7.Aux - mem := x7.Args[1] - p := x7.Args[0] - o5 := v.Args[1] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - s6 := o5.Args[0] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] { - break - } - o4 := o5.Args[1] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - o3 := o4.Args[0] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s0 := o3.Args[0] - if s0.Op != OpPPC64SLWconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] { - break - } - s4 := o3.Args[1] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s5 := o4.Args[1] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x5.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x5.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR x7:(MOVBZload [i7] {s} p mem) o5:(OR o4:(OR s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16]) o3:(OR s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]) s0:(SLWconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]))) s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]))) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - x7 := v.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - s := x7.Aux - mem := x7.Args[1] - p := x7.Args[0] - o5 := v.Args[1] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - o4 := o5.Args[0] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - s5 := o4.Args[0] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - o3 := o4.Args[1] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s4 := o3.Args[0] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s0 := o3.Args[1] - if s0.Op != OpPPC64SLWconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] { - break - } - s6 := o5.Args[1] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x6.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x6.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR x7:(MOVBZload [i7] {s} p mem) o5:(OR o4:(OR s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16]) o3:(OR s0:(SLWconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]) s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]))) s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]))) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - x7 := v.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - s := x7.Aux - mem := x7.Args[1] - p := x7.Args[0] - o5 := v.Args[1] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - o4 := o5.Args[0] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - s5 := o4.Args[0] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - o3 := o4.Args[1] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s0 := o3.Args[0] - if s0.Op != OpPPC64SLWconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] { - break - } - s4 := o3.Args[1] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s6 := o5.Args[1] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x6.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x6.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR x7:(MOVBZload [i7] {s} p mem) o5:(OR o4:(OR o3:(OR s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]) s0:(SLWconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32])) s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16])) s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]))) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - x7 := v.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - s := x7.Aux - mem := x7.Args[1] - p := x7.Args[0] - o5 := v.Args[1] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - o4 := o5.Args[0] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - o3 := o4.Args[0] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s4 := o3.Args[0] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s0 := o3.Args[1] - if s0.Op != OpPPC64SLWconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] { - break - } - s5 := o4.Args[1] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - s6 := o5.Args[1] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x6.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x6.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR x7:(MOVBZload [i7] {s} p mem) o5:(OR o4:(OR o3:(OR s0:(SLWconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]) s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24])) s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16])) s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]))) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - x7 := v.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - s := x7.Aux - mem := x7.Args[1] - p := x7.Args[0] - o5 := v.Args[1] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - o4 := o5.Args[0] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - o3 := o4.Args[0] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s0 := o3.Args[0] - if s0.Op != OpPPC64SLWconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] { - break - } - s4 := o3.Args[1] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s5 := o4.Args[1] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - s6 := o5.Args[1] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x6.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x6.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o5:(OR s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]) o4:(OR s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16]) o3:(OR s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]) s0:(SLWconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32])))) x7:(MOVBZload [i7] {s} p mem)) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o5 := v.Args[0] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - s6 := o5.Args[0] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - s := x6.Aux - mem := x6.Args[1] - p := x6.Args[0] - o4 := o5.Args[1] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - s5 := o4.Args[0] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - o3 := o4.Args[1] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s4 := o3.Args[0] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s0 := o3.Args[1] - if s0.Op != OpPPC64SLWconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] { - break - } - x7 := v.Args[1] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - if x7.Aux != s { - break - } - _ = x7.Args[1] - if p != x7.Args[0] || mem != x7.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x7.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x7.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o5:(OR s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]) o4:(OR s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16]) o3:(OR s0:(SLWconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]) s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24])))) x7:(MOVBZload [i7] {s} p mem)) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o5 := v.Args[0] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - s6 := o5.Args[0] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - s := x6.Aux - mem := x6.Args[1] - p := x6.Args[0] - o4 := o5.Args[1] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - s5 := o4.Args[0] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - o3 := o4.Args[1] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s0 := o3.Args[0] - if s0.Op != OpPPC64SLWconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] { - break - } - s4 := o3.Args[1] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - x7 := v.Args[1] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - if x7.Aux != s { - break - } - _ = x7.Args[1] - if p != x7.Args[0] || mem != x7.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x7.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x7.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o5:(OR s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]) o4:(OR o3:(OR s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]) s0:(SLWconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32])) s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16]))) x7:(MOVBZload [i7] {s} p mem)) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o5 := v.Args[0] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - s6 := o5.Args[0] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - s := x6.Aux - mem := x6.Args[1] - p := x6.Args[0] - o4 := o5.Args[1] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - o3 := o4.Args[0] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s4 := o3.Args[0] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s0 := o3.Args[1] - if s0.Op != OpPPC64SLWconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] { - break - } - s5 := o4.Args[1] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - x7 := v.Args[1] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - if x7.Aux != s { - break - } - _ = x7.Args[1] - if p != x7.Args[0] || mem != x7.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x7.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x7.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o5:(OR s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]) o4:(OR o3:(OR s0:(SLWconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]) s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24])) s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16]))) x7:(MOVBZload [i7] {s} p mem)) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o5 := v.Args[0] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - s6 := o5.Args[0] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - s := x6.Aux - mem := x6.Args[1] - p := x6.Args[0] - o4 := o5.Args[1] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - o3 := o4.Args[0] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s0 := o3.Args[0] - if s0.Op != OpPPC64SLWconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] { - break - } - s4 := o3.Args[1] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s5 := o4.Args[1] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - x7 := v.Args[1] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - if x7.Aux != s { - break - } - _ = x7.Args[1] - if p != x7.Args[0] || mem != x7.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x7.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x7.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - return false -} -func rewriteValuePPC64_OpPPC64OR_100(v *Value) bool { - b := v.Block - config := b.Func.Config - typ := &b.Func.Config.Types - // match: (OR o5:(OR o4:(OR s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16]) o3:(OR s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]) s0:(SLWconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]))) s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8])) x7:(MOVBZload [i7] {s} p mem)) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o5 := v.Args[0] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - o4 := o5.Args[0] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - s5 := o4.Args[0] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - s := x5.Aux - mem := x5.Args[1] - p := x5.Args[0] - o3 := o4.Args[1] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s4 := o3.Args[0] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s0 := o3.Args[1] - if s0.Op != OpPPC64SLWconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] { - break - } - s6 := o5.Args[1] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] { - break - } - x7 := v.Args[1] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - if x7.Aux != s { - break - } - _ = x7.Args[1] - if p != x7.Args[0] || mem != x7.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x7.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x7.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o5:(OR o4:(OR s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16]) o3:(OR s0:(SLWconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]) s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]))) s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8])) x7:(MOVBZload [i7] {s} p mem)) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o5 := v.Args[0] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - o4 := o5.Args[0] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - s5 := o4.Args[0] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - s := x5.Aux - mem := x5.Args[1] - p := x5.Args[0] - o3 := o4.Args[1] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s0 := o3.Args[0] - if s0.Op != OpPPC64SLWconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] { - break - } - s4 := o3.Args[1] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s6 := o5.Args[1] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] { - break - } - x7 := v.Args[1] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - if x7.Aux != s { - break - } - _ = x7.Args[1] - if p != x7.Args[0] || mem != x7.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x7.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x7.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o5:(OR o4:(OR o3:(OR s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]) s0:(SLWconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32])) s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16])) s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8])) x7:(MOVBZload [i7] {s} p mem)) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o5 := v.Args[0] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - o4 := o5.Args[0] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - o3 := o4.Args[0] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s4 := o3.Args[0] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - s := x4.Aux - mem := x4.Args[1] - p := x4.Args[0] - s0 := o3.Args[1] - if s0.Op != OpPPC64SLWconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] { - break - } - s5 := o4.Args[1] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - s6 := o5.Args[1] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] { - break - } - x7 := v.Args[1] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - if x7.Aux != s { - break - } - _ = x7.Args[1] - if p != x7.Args[0] || mem != x7.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x7.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x7.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o5:(OR o4:(OR o3:(OR s0:(SLWconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]) s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24])) s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16])) s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8])) x7:(MOVBZload [i7] {s} p mem)) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o5 := v.Args[0] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - o4 := o5.Args[0] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - o3 := o4.Args[0] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s0 := o3.Args[0] - if s0.Op != OpPPC64SLWconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - mem := x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - s := x3_0.Aux - p := x3_0.Args[0] - s4 := o3.Args[1] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s5 := o4.Args[1] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - s6 := o5.Args[1] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] { - break - } - x7 := v.Args[1] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - if x7.Aux != s { - break - } - _ = x7.Args[1] - if p != x7.Args[0] || mem != x7.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x7.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x7.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR x7:(MOVBZload [i7] {s} p mem) o5:(OR s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]) o4:(OR s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16]) o3:(OR s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]) s0:(SLDconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]))))) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - x7 := v.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - s := x7.Aux - mem := x7.Args[1] - p := x7.Args[0] - o5 := v.Args[1] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - s6 := o5.Args[0] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] { - break - } - o4 := o5.Args[1] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - s5 := o4.Args[0] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - o3 := o4.Args[1] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s4 := o3.Args[0] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s0 := o3.Args[1] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x3.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x3.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR x7:(MOVBZload [i7] {s} p mem) o5:(OR s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]) o4:(OR s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16]) o3:(OR s0:(SLDconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]) s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]))))) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - x7 := v.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - s := x7.Aux - mem := x7.Args[1] - p := x7.Args[0] - o5 := v.Args[1] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - s6 := o5.Args[0] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] { - break - } - o4 := o5.Args[1] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - s5 := o4.Args[0] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - o3 := o4.Args[1] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s0 := o3.Args[0] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] { - break - } - s4 := o3.Args[1] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x4.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x4.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR x7:(MOVBZload [i7] {s} p mem) o5:(OR s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]) o4:(OR o3:(OR s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]) s0:(SLDconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32])) s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16])))) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - x7 := v.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - s := x7.Aux - mem := x7.Args[1] - p := x7.Args[0] - o5 := v.Args[1] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - s6 := o5.Args[0] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] { - break - } - o4 := o5.Args[1] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - o3 := o4.Args[0] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s4 := o3.Args[0] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s0 := o3.Args[1] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] { - break - } - s5 := o4.Args[1] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x5.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x5.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR x7:(MOVBZload [i7] {s} p mem) o5:(OR s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]) o4:(OR o3:(OR s0:(SLDconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]) s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24])) s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16])))) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - x7 := v.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - s := x7.Aux - mem := x7.Args[1] - p := x7.Args[0] - o5 := v.Args[1] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - s6 := o5.Args[0] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] { - break - } - o4 := o5.Args[1] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - o3 := o4.Args[0] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s0 := o3.Args[0] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] { - break - } - s4 := o3.Args[1] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s5 := o4.Args[1] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x5.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x5.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR x7:(MOVBZload [i7] {s} p mem) o5:(OR o4:(OR s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16]) o3:(OR s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]) s0:(SLDconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]))) s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]))) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - x7 := v.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - s := x7.Aux - mem := x7.Args[1] - p := x7.Args[0] - o5 := v.Args[1] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - o4 := o5.Args[0] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - s5 := o4.Args[0] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - o3 := o4.Args[1] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s4 := o3.Args[0] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s0 := o3.Args[1] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] { - break - } - s6 := o5.Args[1] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x6.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x6.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR x7:(MOVBZload [i7] {s} p mem) o5:(OR o4:(OR s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16]) o3:(OR s0:(SLDconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]) s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]))) s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]))) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - x7 := v.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - s := x7.Aux - mem := x7.Args[1] - p := x7.Args[0] - o5 := v.Args[1] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - o4 := o5.Args[0] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - s5 := o4.Args[0] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - o3 := o4.Args[1] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s0 := o3.Args[0] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] { - break - } - s4 := o3.Args[1] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s6 := o5.Args[1] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x6.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x6.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - return false -} -func rewriteValuePPC64_OpPPC64OR_110(v *Value) bool { - b := v.Block - config := b.Func.Config - typ := &b.Func.Config.Types - // match: (OR x7:(MOVBZload [i7] {s} p mem) o5:(OR o4:(OR o3:(OR s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]) s0:(SLDconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32])) s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16])) s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]))) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - x7 := v.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - s := x7.Aux - mem := x7.Args[1] - p := x7.Args[0] - o5 := v.Args[1] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - o4 := o5.Args[0] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - o3 := o4.Args[0] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s4 := o3.Args[0] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s0 := o3.Args[1] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] { - break - } - s5 := o4.Args[1] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - s6 := o5.Args[1] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x6.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x6.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR x7:(MOVBZload [i7] {s} p mem) o5:(OR o4:(OR o3:(OR s0:(SLDconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]) s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24])) s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16])) s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]))) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - x7 := v.Args[0] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - s := x7.Aux - mem := x7.Args[1] - p := x7.Args[0] - o5 := v.Args[1] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - o4 := o5.Args[0] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - o3 := o4.Args[0] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s0 := o3.Args[0] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] { - break - } - s4 := o3.Args[1] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s5 := o4.Args[1] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - s6 := o5.Args[1] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x6.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x6.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o5:(OR s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]) o4:(OR s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16]) o3:(OR s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]) s0:(SLDconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32])))) x7:(MOVBZload [i7] {s} p mem)) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o5 := v.Args[0] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - s6 := o5.Args[0] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - s := x6.Aux - mem := x6.Args[1] - p := x6.Args[0] - o4 := o5.Args[1] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - s5 := o4.Args[0] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - o3 := o4.Args[1] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s4 := o3.Args[0] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s0 := o3.Args[1] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] { - break - } - x7 := v.Args[1] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - if x7.Aux != s { - break - } - _ = x7.Args[1] - if p != x7.Args[0] || mem != x7.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x7.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x7.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o5:(OR s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]) o4:(OR s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16]) o3:(OR s0:(SLDconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]) s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24])))) x7:(MOVBZload [i7] {s} p mem)) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o5 := v.Args[0] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - s6 := o5.Args[0] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - s := x6.Aux - mem := x6.Args[1] - p := x6.Args[0] - o4 := o5.Args[1] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - s5 := o4.Args[0] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - o3 := o4.Args[1] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s0 := o3.Args[0] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] { - break - } - s4 := o3.Args[1] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - x7 := v.Args[1] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - if x7.Aux != s { - break - } - _ = x7.Args[1] - if p != x7.Args[0] || mem != x7.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x7.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x7.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o5:(OR s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]) o4:(OR o3:(OR s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]) s0:(SLDconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32])) s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16]))) x7:(MOVBZload [i7] {s} p mem)) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o5 := v.Args[0] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - s6 := o5.Args[0] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - s := x6.Aux - mem := x6.Args[1] - p := x6.Args[0] - o4 := o5.Args[1] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - o3 := o4.Args[0] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s4 := o3.Args[0] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s0 := o3.Args[1] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] { - break - } - s5 := o4.Args[1] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - x7 := v.Args[1] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - if x7.Aux != s { - break - } - _ = x7.Args[1] - if p != x7.Args[0] || mem != x7.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x7.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x7.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true + break } - // match: (OR o5:(OR s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]) o4:(OR o3:(OR s0:(SLDconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]) s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24])) s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16]))) x7:(MOVBZload [i7] {s} p mem)) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o5 := v.Args[0] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - s6 := o5.Args[0] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - s := x6.Aux - mem := x6.Args[1] - p := x6.Args[0] - o4 := o5.Args[1] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - o3 := o4.Args[0] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s0 := o3.Args[0] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] { - break - } - s4 := o3.Args[1] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s5 := o4.Args[1] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - x7 := v.Args[1] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - if x7.Aux != s { - break - } - _ = x7.Args[1] - if p != x7.Args[0] || mem != x7.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x7.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x7.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o5:(OR o4:(OR s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16]) o3:(OR s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]) s0:(SLDconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]))) s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8])) x7:(MOVBZload [i7] {s} p mem)) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o5 := v.Args[0] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - o4 := o5.Args[0] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - s5 := o4.Args[0] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - s := x5.Aux - mem := x5.Args[1] - p := x5.Args[0] - o3 := o4.Args[1] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s4 := o3.Args[0] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s0 := o3.Args[1] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] { - break - } - s6 := o5.Args[1] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] { - break - } - x7 := v.Args[1] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - if x7.Aux != s { - break - } - _ = x7.Args[1] - if p != x7.Args[0] || mem != x7.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x7.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x7.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o5:(OR o4:(OR s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16]) o3:(OR s0:(SLDconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]) s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]))) s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8])) x7:(MOVBZload [i7] {s} p mem)) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o5 := v.Args[0] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - o4 := o5.Args[0] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - s5 := o4.Args[0] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - s := x5.Aux - mem := x5.Args[1] - p := x5.Args[0] - o3 := o4.Args[1] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s0 := o3.Args[0] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] { - break - } - s4 := o3.Args[1] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s6 := o5.Args[1] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] { - break - } - x7 := v.Args[1] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - if x7.Aux != s { - break - } - _ = x7.Args[1] - if p != x7.Args[0] || mem != x7.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x7.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x7.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o5:(OR o4:(OR o3:(OR s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]) s0:(SLDconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32])) s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16])) s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8])) x7:(MOVBZload [i7] {s} p mem)) - // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) - // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) - for { - t := v.Type - _ = v.Args[1] - o5 := v.Args[0] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - o4 := o5.Args[0] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - o3 := o4.Args[0] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s4 := o3.Args[0] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - s := x4.Aux - mem := x4.Args[1] - p := x4.Args[0] - s0 := o3.Args[1] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - _ = x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] { - break - } - s5 := o4.Args[1] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - s6 := o5.Args[1] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] { - break - } - x7 := v.Args[1] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - if x7.Aux != s { - break - } - _ = x7.Args[1] - if p != x7.Args[0] || mem != x7.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break - } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x7.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x7.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (OR o5:(OR o4:(OR o3:(OR s0:(SLDconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]) s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24])) s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16])) s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8])) x7:(MOVBZload [i7] {s} p mem)) + // match: (OR x7:(MOVBZload [i7] {s} p mem) o5:(OR s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]) o4:(OR s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16]) o3:(OR s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]) s0:(SLWconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]))))) // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) for { t := v.Type _ = v.Args[1] - o5 := v.Args[0] - if o5.Op != OpPPC64OR || o5.Type != t { - break - } - _ = o5.Args[1] - o4 := o5.Args[0] - if o4.Op != OpPPC64OR || o4.Type != t { - break - } - _ = o4.Args[1] - o3 := o4.Args[0] - if o3.Op != OpPPC64OR || o3.Type != t { - break - } - _ = o3.Args[1] - s0 := o3.Args[0] - if s0.Op != OpPPC64SLDconst || s0.AuxInt != 32 { - break - } - x3 := s0.Args[0] - if x3.Op != OpPPC64MOVWBRload || x3.Type != t { - break - } - mem := x3.Args[1] - x3_0 := x3.Args[0] - if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { - break - } - i0 := x3_0.AuxInt - s := x3_0.Aux - p := x3_0.Args[0] - s4 := o3.Args[1] - if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { - break - } - x4 := s4.Args[0] - if x4.Op != OpPPC64MOVBZload { - break - } - i4 := x4.AuxInt - if x4.Aux != s { - break - } - _ = x4.Args[1] - if p != x4.Args[0] || mem != x4.Args[1] { - break - } - s5 := o4.Args[1] - if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { - break - } - x5 := s5.Args[0] - if x5.Op != OpPPC64MOVBZload { - break - } - i5 := x5.AuxInt - if x5.Aux != s { - break - } - _ = x5.Args[1] - if p != x5.Args[0] || mem != x5.Args[1] { - break - } - s6 := o5.Args[1] - if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { - break - } - x6 := s6.Args[0] - if x6.Op != OpPPC64MOVBZload { - break - } - i6 := x6.AuxInt - if x6.Aux != s { - break - } - _ = x6.Args[1] - if p != x6.Args[0] || mem != x6.Args[1] { - break - } - x7 := v.Args[1] - if x7.Op != OpPPC64MOVBZload { - break - } - i7 := x7.AuxInt - if x7.Aux != s { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x7 := v.Args[_i0] + if x7.Op != OpPPC64MOVBZload { + continue + } + i7 := x7.AuxInt + s := x7.Aux + mem := x7.Args[1] + p := x7.Args[0] + o5 := v.Args[1^_i0] + if o5.Op != OpPPC64OR || o5.Type != t { + continue + } + _ = o5.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + s6 := o5.Args[_i1] + if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { + continue + } + x6 := s6.Args[0] + if x6.Op != OpPPC64MOVBZload { + continue + } + i6 := x6.AuxInt + if x6.Aux != s { + continue + } + _ = x6.Args[1] + if p != x6.Args[0] || mem != x6.Args[1] { + continue + } + o4 := o5.Args[1^_i1] + if o4.Op != OpPPC64OR || o4.Type != t { + continue + } + _ = o4.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + s5 := o4.Args[_i2] + if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { + continue + } + x5 := s5.Args[0] + if x5.Op != OpPPC64MOVBZload { + continue + } + i5 := x5.AuxInt + if x5.Aux != s { + continue + } + _ = x5.Args[1] + if p != x5.Args[0] || mem != x5.Args[1] { + continue + } + o3 := o4.Args[1^_i2] + if o3.Op != OpPPC64OR || o3.Type != t { + continue + } + _ = o3.Args[1] + for _i3 := 0; _i3 <= 1; _i3++ { + s4 := o3.Args[_i3] + if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { + continue + } + x4 := s4.Args[0] + if x4.Op != OpPPC64MOVBZload { + continue + } + i4 := x4.AuxInt + if x4.Aux != s { + continue + } + _ = x4.Args[1] + if p != x4.Args[0] || mem != x4.Args[1] { + continue + } + s0 := o3.Args[1^_i3] + if s0.Op != OpPPC64SLWconst || s0.AuxInt != 32 { + continue + } + x3 := s0.Args[0] + if x3.Op != OpPPC64MOVWBRload || x3.Type != t { + continue + } + _ = x3.Args[1] + x3_0 := x3.Args[0] + if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { + continue + } + i0 := x3_0.AuxInt + if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { + continue + } + b = mergePoint(b, x3, x4, x5, x6, x7) + v0 := b.NewValue0(x3.Pos, OpPPC64MOVDBRload, t) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x3.Pos, OpPPC64MOVDaddr, typ.Uintptr) + v1.AuxInt = i0 + v1.Aux = s + v1.AddArg(p) + v0.AddArg(v1) + v0.AddArg(mem) + return true + } + } + } } - _ = x7.Args[1] - if p != x7.Args[0] || mem != x7.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { - break + break + } + // match: (OR x7:(MOVBZload [i7] {s} p mem) o5:(OR s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]) o4:(OR s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16]) o3:(OR s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]) s0:(SLDconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]))))) + // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) + // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) + for { + t := v.Type + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x7 := v.Args[_i0] + if x7.Op != OpPPC64MOVBZload { + continue + } + i7 := x7.AuxInt + s := x7.Aux + mem := x7.Args[1] + p := x7.Args[0] + o5 := v.Args[1^_i0] + if o5.Op != OpPPC64OR || o5.Type != t { + continue + } + _ = o5.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + s6 := o5.Args[_i1] + if s6.Op != OpPPC64SLDconst || s6.AuxInt != 8 { + continue + } + x6 := s6.Args[0] + if x6.Op != OpPPC64MOVBZload { + continue + } + i6 := x6.AuxInt + if x6.Aux != s { + continue + } + _ = x6.Args[1] + if p != x6.Args[0] || mem != x6.Args[1] { + continue + } + o4 := o5.Args[1^_i1] + if o4.Op != OpPPC64OR || o4.Type != t { + continue + } + _ = o4.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + s5 := o4.Args[_i2] + if s5.Op != OpPPC64SLDconst || s5.AuxInt != 16 { + continue + } + x5 := s5.Args[0] + if x5.Op != OpPPC64MOVBZload { + continue + } + i5 := x5.AuxInt + if x5.Aux != s { + continue + } + _ = x5.Args[1] + if p != x5.Args[0] || mem != x5.Args[1] { + continue + } + o3 := o4.Args[1^_i2] + if o3.Op != OpPPC64OR || o3.Type != t { + continue + } + _ = o3.Args[1] + for _i3 := 0; _i3 <= 1; _i3++ { + s4 := o3.Args[_i3] + if s4.Op != OpPPC64SLDconst || s4.AuxInt != 24 { + continue + } + x4 := s4.Args[0] + if x4.Op != OpPPC64MOVBZload { + continue + } + i4 := x4.AuxInt + if x4.Aux != s { + continue + } + _ = x4.Args[1] + if p != x4.Args[0] || mem != x4.Args[1] { + continue + } + s0 := o3.Args[1^_i3] + if s0.Op != OpPPC64SLDconst || s0.AuxInt != 32 { + continue + } + x3 := s0.Args[0] + if x3.Op != OpPPC64MOVWBRload || x3.Type != t { + continue + } + _ = x3.Args[1] + x3_0 := x3.Args[0] + if x3_0.Op != OpPPC64MOVDaddr || x3_0.Type != typ.Uintptr { + continue + } + i0 := x3_0.AuxInt + if x3_0.Aux != s || p != x3_0.Args[0] || mem != x3.Args[1] || !(!config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6)) { + continue + } + b = mergePoint(b, x3, x4, x5, x6, x7) + v0 := b.NewValue0(x3.Pos, OpPPC64MOVDBRload, t) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x3.Pos, OpPPC64MOVDaddr, typ.Uintptr) + v1.AuxInt = i0 + v1.Aux = s + v1.AddArg(p) + v0.AddArg(v1) + v0.AddArg(mem) + return true + } + } + } } - b = mergePoint(b, x3, x4, x5, x6, x7) - v0 := b.NewValue0(x7.Pos, OpPPC64MOVDBRload, t) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x7.Pos, OpPPC64MOVDaddr, typ.Uintptr) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v0.AddArg(v1) - v0.AddArg(mem) - return true + break } return false } @@ -22319,336 +13653,185 @@ func rewriteValuePPC64_OpPPC64XOR_0(v *Value) bool { // result: (ROTLconst [c] x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64SLDconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64SRDconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(d == 64-c) { - break - } - v.reset(OpPPC64ROTLconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (XOR (SRDconst x [d]) (SLDconst x [c])) - // cond: d == 64-c - // result: (ROTLconst [c] x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64SRDconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64SLDconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(d == 64-c) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpPPC64SLDconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpPPC64SRDconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(d == 64-c) { + continue + } + v.reset(OpPPC64ROTLconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpPPC64ROTLconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (XOR (SLWconst x [c]) (SRWconst x [d])) // cond: d == 32-c // result: (ROTLWconst [c] x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64SLWconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64SRWconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(d == 32-c) { - break - } - v.reset(OpPPC64ROTLWconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (XOR (SRWconst x [d]) (SLWconst x [c])) - // cond: d == 32-c - // result: (ROTLWconst [c] x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64SRWconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64SLWconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(d == 32-c) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpPPC64SLWconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpPPC64SRWconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(d == 32-c) { + continue + } + v.reset(OpPPC64ROTLWconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpPPC64ROTLWconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (XOR (SLD x (ANDconst [63] y)) (SRD x (SUB (MOVDconst [64]) (ANDconst [63] y)))) // result: (ROTL x y) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64SLD { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpPPC64ANDconst || v_0_1.Type != typ.Int64 || v_0_1.AuxInt != 63 { - break - } - y := v_0_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64SRD { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpPPC64SUB || v_1_1.Type != typ.UInt { - break - } - _ = v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpPPC64MOVDconst || v_1_1_0.AuxInt != 64 { - break - } - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpPPC64ANDconst || v_1_1_1.Type != typ.UInt || v_1_1_1.AuxInt != 63 || y != v_1_1_1.Args[0] { - break - } - v.reset(OpPPC64ROTL) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (XOR (SRD x (SUB (MOVDconst [64]) (ANDconst [63] y))) (SLD x (ANDconst [63] y))) - // result: (ROTL x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64SRD { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpPPC64SUB || v_0_1.Type != typ.UInt { - break - } - _ = v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpPPC64MOVDconst || v_0_1_0.AuxInt != 64 { - break - } - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpPPC64ANDconst || v_0_1_1.Type != typ.UInt || v_0_1_1.AuxInt != 63 { - break - } - y := v_0_1_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64SLD { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpPPC64ANDconst || v_1_1.Type != typ.Int64 || v_1_1.AuxInt != 63 || y != v_1_1.Args[0] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpPPC64SLD { + continue + } + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpPPC64ANDconst || v_0_1.Type != typ.Int64 || v_0_1.AuxInt != 63 { + continue + } + y := v_0_1.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpPPC64SRD { + continue + } + _ = v_1.Args[1] + if x != v_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpPPC64SUB || v_1_1.Type != typ.UInt { + continue + } + _ = v_1_1.Args[1] + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpPPC64MOVDconst || v_1_1_0.AuxInt != 64 { + continue + } + v_1_1_1 := v_1_1.Args[1] + if v_1_1_1.Op != OpPPC64ANDconst || v_1_1_1.Type != typ.UInt || v_1_1_1.AuxInt != 63 || y != v_1_1_1.Args[0] { + continue + } + v.reset(OpPPC64ROTL) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpPPC64ROTL) - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (XOR (SLW x (ANDconst [31] y)) (SRW x (SUB (MOVDconst [32]) (ANDconst [31] y)))) // result: (ROTLW x y) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64SLW { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpPPC64ANDconst || v_0_1.Type != typ.Int32 || v_0_1.AuxInt != 31 { - break - } - y := v_0_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64SRW { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpPPC64SUB || v_1_1.Type != typ.UInt { - break - } - _ = v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpPPC64MOVDconst || v_1_1_0.AuxInt != 32 { - break - } - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpPPC64ANDconst || v_1_1_1.Type != typ.UInt || v_1_1_1.AuxInt != 31 || y != v_1_1_1.Args[0] { - break - } - v.reset(OpPPC64ROTLW) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (XOR (SRW x (SUB (MOVDconst [32]) (ANDconst [31] y))) (SLW x (ANDconst [31] y))) - // result: (ROTLW x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64SRW { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpPPC64SUB || v_0_1.Type != typ.UInt { - break - } - _ = v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpPPC64MOVDconst || v_0_1_0.AuxInt != 32 { - break - } - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpPPC64ANDconst || v_0_1_1.Type != typ.UInt || v_0_1_1.AuxInt != 31 { - break - } - y := v_0_1_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64SLW { - break - } - _ = v_1.Args[1] - if x != v_1.Args[0] { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpPPC64ANDconst || v_1_1.Type != typ.Int32 || v_1_1.AuxInt != 31 || y != v_1_1.Args[0] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpPPC64SLW { + continue + } + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpPPC64ANDconst || v_0_1.Type != typ.Int32 || v_0_1.AuxInt != 31 { + continue + } + y := v_0_1.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpPPC64SRW { + continue + } + _ = v_1.Args[1] + if x != v_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpPPC64SUB || v_1_1.Type != typ.UInt { + continue + } + _ = v_1_1.Args[1] + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpPPC64MOVDconst || v_1_1_0.AuxInt != 32 { + continue + } + v_1_1_1 := v_1_1.Args[1] + if v_1_1_1.Op != OpPPC64ANDconst || v_1_1_1.Type != typ.UInt || v_1_1_1.AuxInt != 31 || y != v_1_1_1.Args[0] { + continue + } + v.reset(OpPPC64ROTLW) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpPPC64ROTLW) - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (XOR (MOVDconst [c]) (MOVDconst [d])) // result: (MOVDconst [c^d]) for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64MOVDconst { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpPPC64MOVDconst { - break - } - d := v_1.AuxInt - v.reset(OpPPC64MOVDconst) - v.AuxInt = c ^ d - return true - } - // match: (XOR (MOVDconst [d]) (MOVDconst [c])) - // result: (MOVDconst [c^d]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64MOVDconst { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpPPC64MOVDconst { - break - } - c := v_1.AuxInt - v.reset(OpPPC64MOVDconst) - v.AuxInt = c ^ d - return true - } - return false -} -func rewriteValuePPC64_OpPPC64XOR_10(v *Value) bool { - // match: (XOR x (MOVDconst [c])) - // cond: isU32Bit(c) - // result: (XORconst [c] x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64MOVDconst { - break - } - c := v_1.AuxInt - if !(isU32Bit(c)) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpPPC64MOVDconst { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpPPC64MOVDconst { + continue + } + d := v_1.AuxInt + v.reset(OpPPC64MOVDconst) + v.AuxInt = c ^ d + return true } - v.reset(OpPPC64XORconst) - v.AuxInt = c - v.AddArg(x) - return true + break } - // match: (XOR (MOVDconst [c]) x) + // match: (XOR x (MOVDconst [c])) // cond: isU32Bit(c) // result: (XORconst [c] x) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpPPC64MOVDconst { - break - } - c := v_0.AuxInt - if !(isU32Bit(c)) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpPPC64MOVDconst { + continue + } + c := v_1.AuxInt + if !(isU32Bit(c)) { + continue + } + v.reset(OpPPC64XORconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpPPC64XORconst) - v.AuxInt = c - v.AddArg(x) - return true + break } return false } @@ -23671,40 +14854,21 @@ func rewriteValuePPC64_OpRsh32Ux64_0(v *Value) bool { break } _ = v_1.Args[1] - y := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpPPC64MOVDconst || v_1_1.AuxInt != 31 { - break - } - v.reset(OpPPC64SRW) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.Int32) - v0.AuxInt = 31 - v0.AddArg(y) - v.AddArg(v0) - return true - } - // match: (Rsh32Ux64 x (AND (MOVDconst [31]) y)) - // result: (SRW x (ANDconst [31] y)) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64AND { - break - } - y := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpPPC64MOVDconst || v_1_0.AuxInt != 31 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + y := v_1.Args[_i0] + v_1_1 := v_1.Args[1^_i0] + if v_1_1.Op != OpPPC64MOVDconst || v_1_1.AuxInt != 31 { + continue + } + v.reset(OpPPC64SRW) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.Int32) + v0.AuxInt = 31 + v0.AddArg(y) + v.AddArg(v0) + return true } - v.reset(OpPPC64SRW) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.Int32) - v0.AuxInt = 31 - v0.AddArg(y) - v.AddArg(v0) - return true + break } // match: (Rsh32Ux64 x (ANDconst [31] y)) // result: (SRW x (ANDconst [31] y)) @@ -23775,65 +14939,27 @@ func rewriteValuePPC64_OpRsh32Ux64_0(v *Value) bool { break } _ = v_1_1.Args[1] - y := v_1_1.Args[0] - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpPPC64MOVDconst || v_1_1_1.AuxInt != 31 { - break - } - v.reset(OpPPC64SRW) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpPPC64SUB, typ.UInt) - v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64) - v1.AuxInt = 32 - v0.AddArg(v1) - v2 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.UInt) - v2.AuxInt = 31 - v2.AddArg(y) - v0.AddArg(v2) - v.AddArg(v0) - return true - } - // match: (Rsh32Ux64 x (SUB (MOVDconst [32]) (AND (MOVDconst [31]) y))) - // result: (SRW x (SUB (MOVDconst [32]) (ANDconst [31] y))) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64SUB || v_1.Type != typ.UInt { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpPPC64MOVDconst || v_1_0.AuxInt != 32 { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpPPC64AND || v_1_1.Type != typ.UInt { - break - } - y := v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpPPC64MOVDconst || v_1_1_0.AuxInt != 31 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + y := v_1_1.Args[_i0] + v_1_1_1 := v_1_1.Args[1^_i0] + if v_1_1_1.Op != OpPPC64MOVDconst || v_1_1_1.AuxInt != 31 { + continue + } + v.reset(OpPPC64SRW) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpPPC64SUB, typ.UInt) + v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64) + v1.AuxInt = 32 + v0.AddArg(v1) + v2 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.UInt) + v2.AuxInt = 31 + v2.AddArg(y) + v0.AddArg(v2) + v.AddArg(v0) + return true } - v.reset(OpPPC64SRW) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpPPC64SUB, typ.UInt) - v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64) - v1.AuxInt = 32 - v0.AddArg(v1) - v2 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.UInt) - v2.AuxInt = 31 - v2.AddArg(y) - v0.AddArg(v2) - v.AddArg(v0) - return true + break } - return false -} -func rewriteValuePPC64_OpRsh32Ux64_10(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types // match: (Rsh32Ux64 x y) // result: (SRW x (ORN y (MaskIfNotCarry (ADDconstForCarry [-32] y)))) for { @@ -24089,40 +15215,21 @@ func rewriteValuePPC64_OpRsh32x64_0(v *Value) bool { break } _ = v_1.Args[1] - y := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpPPC64MOVDconst || v_1_1.AuxInt != 31 { - break - } - v.reset(OpPPC64SRAW) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.Int32) - v0.AuxInt = 31 - v0.AddArg(y) - v.AddArg(v0) - return true - } - // match: (Rsh32x64 x (AND (MOVDconst [31]) y)) - // result: (SRAW x (ANDconst [31] y)) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64AND { - break - } - y := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpPPC64MOVDconst || v_1_0.AuxInt != 31 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + y := v_1.Args[_i0] + v_1_1 := v_1.Args[1^_i0] + if v_1_1.Op != OpPPC64MOVDconst || v_1_1.AuxInt != 31 { + continue + } + v.reset(OpPPC64SRAW) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.Int32) + v0.AuxInt = 31 + v0.AddArg(y) + v.AddArg(v0) + return true } - v.reset(OpPPC64SRAW) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.Int32) - v0.AuxInt = 31 - v0.AddArg(y) - v.AddArg(v0) - return true + break } // match: (Rsh32x64 x (ANDconst [31] y)) // result: (SRAW x (ANDconst [31] y)) @@ -24193,65 +15300,27 @@ func rewriteValuePPC64_OpRsh32x64_0(v *Value) bool { break } _ = v_1_1.Args[1] - y := v_1_1.Args[0] - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpPPC64MOVDconst || v_1_1_1.AuxInt != 31 { - break - } - v.reset(OpPPC64SRAW) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpPPC64SUB, typ.UInt) - v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64) - v1.AuxInt = 32 - v0.AddArg(v1) - v2 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.UInt) - v2.AuxInt = 31 - v2.AddArg(y) - v0.AddArg(v2) - v.AddArg(v0) - return true - } - // match: (Rsh32x64 x (SUB (MOVDconst [32]) (AND (MOVDconst [31]) y))) - // result: (SRAW x (SUB (MOVDconst [32]) (ANDconst [31] y))) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64SUB || v_1.Type != typ.UInt { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpPPC64MOVDconst || v_1_0.AuxInt != 32 { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpPPC64AND || v_1_1.Type != typ.UInt { - break - } - y := v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpPPC64MOVDconst || v_1_1_0.AuxInt != 31 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + y := v_1_1.Args[_i0] + v_1_1_1 := v_1_1.Args[1^_i0] + if v_1_1_1.Op != OpPPC64MOVDconst || v_1_1_1.AuxInt != 31 { + continue + } + v.reset(OpPPC64SRAW) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpPPC64SUB, typ.UInt) + v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64) + v1.AuxInt = 32 + v0.AddArg(v1) + v2 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.UInt) + v2.AuxInt = 31 + v2.AddArg(y) + v0.AddArg(v2) + v.AddArg(v0) + return true } - v.reset(OpPPC64SRAW) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpPPC64SUB, typ.UInt) - v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64) - v1.AuxInt = 32 - v0.AddArg(v1) - v2 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.UInt) - v2.AuxInt = 31 - v2.AddArg(y) - v0.AddArg(v2) - v.AddArg(v0) - return true + break } - return false -} -func rewriteValuePPC64_OpRsh32x64_10(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types // match: (Rsh32x64 x y) // result: (SRAW x (ORN y (MaskIfNotCarry (ADDconstForCarry [-32] y)))) for { @@ -24505,92 +15574,41 @@ func rewriteValuePPC64_OpRsh64Ux64_0(v *Value) bool { break } _ = v_1.Args[1] - y := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpPPC64MOVDconst || v_1_1.AuxInt != 63 { - break - } - v.reset(OpPPC64SRD) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.Int64) - v0.AuxInt = 63 - v0.AddArg(y) - v.AddArg(v0) - return true - } - // match: (Rsh64Ux64 x (AND (MOVDconst [63]) y)) - // result: (SRD x (ANDconst [63] y)) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64AND { - break - } - y := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpPPC64MOVDconst || v_1_0.AuxInt != 63 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + y := v_1.Args[_i0] + v_1_1 := v_1.Args[1^_i0] + if v_1_1.Op != OpPPC64MOVDconst || v_1_1.AuxInt != 63 { + continue + } + v.reset(OpPPC64SRD) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.Int64) + v0.AuxInt = 63 + v0.AddArg(y) + v.AddArg(v0) + return true } - v.reset(OpPPC64SRD) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.Int64) - v0.AuxInt = 63 - v0.AddArg(y) - v.AddArg(v0) - return true + break } // match: (Rsh64Ux64 x (ANDconst [63] y)) // result: (SRD x (ANDconst [63] y)) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64ANDconst || v_1.Type != typ.UInt || v_1.AuxInt != 63 { - break - } - y := v_1.Args[0] - v.reset(OpPPC64SRD) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.UInt) - v0.AuxInt = 63 - v0.AddArg(y) - v.AddArg(v0) - return true - } - // match: (Rsh64Ux64 x (SUB (MOVDconst [64]) (ANDconst [63] y))) - // result: (SRD x (SUB (MOVDconst [64]) (ANDconst [63] y))) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64SUB || v_1.Type != typ.UInt { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpPPC64MOVDconst || v_1_0.AuxInt != 64 { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpPPC64ANDconst || v_1_1.Type != typ.UInt || v_1_1.AuxInt != 63 { + for { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpPPC64ANDconst || v_1.Type != typ.UInt || v_1.AuxInt != 63 { break } - y := v_1_1.Args[0] + y := v_1.Args[0] v.reset(OpPPC64SRD) v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpPPC64SUB, typ.UInt) - v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64) - v1.AuxInt = 64 - v0.AddArg(v1) - v2 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.UInt) - v2.AuxInt = 63 - v2.AddArg(y) - v0.AddArg(v2) + v0 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.UInt) + v0.AuxInt = 63 + v0.AddArg(y) v.AddArg(v0) return true } - // match: (Rsh64Ux64 x (SUB (MOVDconst [64]) (AND y (MOVDconst [63])))) + // match: (Rsh64Ux64 x (SUB (MOVDconst [64]) (ANDconst [63] y))) // result: (SRD x (SUB (MOVDconst [64]) (ANDconst [63] y))) for { _ = v.Args[1] @@ -24605,15 +15623,10 @@ func rewriteValuePPC64_OpRsh64Ux64_0(v *Value) bool { break } v_1_1 := v_1.Args[1] - if v_1_1.Op != OpPPC64AND || v_1_1.Type != typ.UInt { + if v_1_1.Op != OpPPC64ANDconst || v_1_1.Type != typ.UInt || v_1_1.AuxInt != 63 { break } - _ = v_1_1.Args[1] y := v_1_1.Args[0] - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpPPC64MOVDconst || v_1_1_1.AuxInt != 63 { - break - } v.reset(OpPPC64SRD) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64SUB, typ.UInt) @@ -24627,7 +15640,7 @@ func rewriteValuePPC64_OpRsh64Ux64_0(v *Value) bool { v.AddArg(v0) return true } - // match: (Rsh64Ux64 x (SUB (MOVDconst [64]) (AND (MOVDconst [63]) y))) + // match: (Rsh64Ux64 x (SUB (MOVDconst [64]) (AND y (MOVDconst [63])))) // result: (SRD x (SUB (MOVDconst [64]) (ANDconst [63] y))) for { _ = v.Args[1] @@ -24645,29 +15658,28 @@ func rewriteValuePPC64_OpRsh64Ux64_0(v *Value) bool { if v_1_1.Op != OpPPC64AND || v_1_1.Type != typ.UInt { break } - y := v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpPPC64MOVDconst || v_1_1_0.AuxInt != 63 { - break + _ = v_1_1.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + y := v_1_1.Args[_i0] + v_1_1_1 := v_1_1.Args[1^_i0] + if v_1_1_1.Op != OpPPC64MOVDconst || v_1_1_1.AuxInt != 63 { + continue + } + v.reset(OpPPC64SRD) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpPPC64SUB, typ.UInt) + v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64) + v1.AuxInt = 64 + v0.AddArg(v1) + v2 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.UInt) + v2.AuxInt = 63 + v2.AddArg(y) + v0.AddArg(v2) + v.AddArg(v0) + return true } - v.reset(OpPPC64SRD) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpPPC64SUB, typ.UInt) - v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64) - v1.AuxInt = 64 - v0.AddArg(v1) - v2 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.UInt) - v2.AuxInt = 63 - v2.AddArg(y) - v0.AddArg(v2) - v.AddArg(v0) - return true + break } - return false -} -func rewriteValuePPC64_OpRsh64Ux64_10(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types // match: (Rsh64Ux64 x y) // result: (SRD x (ORN y (MaskIfNotCarry (ADDconstForCarry [-64] y)))) for { @@ -24923,40 +15935,21 @@ func rewriteValuePPC64_OpRsh64x64_0(v *Value) bool { break } _ = v_1.Args[1] - y := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpPPC64MOVDconst || v_1_1.AuxInt != 63 { - break - } - v.reset(OpPPC64SRAD) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.Int64) - v0.AuxInt = 63 - v0.AddArg(y) - v.AddArg(v0) - return true - } - // match: (Rsh64x64 x (AND (MOVDconst [63]) y)) - // result: (SRAD x (ANDconst [63] y)) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64AND { - break - } - y := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpPPC64MOVDconst || v_1_0.AuxInt != 63 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + y := v_1.Args[_i0] + v_1_1 := v_1.Args[1^_i0] + if v_1_1.Op != OpPPC64MOVDconst || v_1_1.AuxInt != 63 { + continue + } + v.reset(OpPPC64SRAD) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.Int64) + v0.AuxInt = 63 + v0.AddArg(y) + v.AddArg(v0) + return true } - v.reset(OpPPC64SRAD) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.Int64) - v0.AuxInt = 63 - v0.AddArg(y) - v.AddArg(v0) - return true + break } // match: (Rsh64x64 x (ANDconst [63] y)) // result: (SRAD x (ANDconst [63] y)) @@ -25027,65 +16020,27 @@ func rewriteValuePPC64_OpRsh64x64_0(v *Value) bool { break } _ = v_1_1.Args[1] - y := v_1_1.Args[0] - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpPPC64MOVDconst || v_1_1_1.AuxInt != 63 { - break - } - v.reset(OpPPC64SRAD) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpPPC64SUB, typ.UInt) - v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64) - v1.AuxInt = 64 - v0.AddArg(v1) - v2 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.UInt) - v2.AuxInt = 63 - v2.AddArg(y) - v0.AddArg(v2) - v.AddArg(v0) - return true - } - // match: (Rsh64x64 x (SUB (MOVDconst [64]) (AND (MOVDconst [63]) y))) - // result: (SRAD x (SUB (MOVDconst [64]) (ANDconst [63] y))) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpPPC64SUB || v_1.Type != typ.UInt { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpPPC64MOVDconst || v_1_0.AuxInt != 64 { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpPPC64AND || v_1_1.Type != typ.UInt { - break - } - y := v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpPPC64MOVDconst || v_1_1_0.AuxInt != 63 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + y := v_1_1.Args[_i0] + v_1_1_1 := v_1_1.Args[1^_i0] + if v_1_1_1.Op != OpPPC64MOVDconst || v_1_1_1.AuxInt != 63 { + continue + } + v.reset(OpPPC64SRAD) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpPPC64SUB, typ.UInt) + v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64) + v1.AuxInt = 64 + v0.AddArg(v1) + v2 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.UInt) + v2.AuxInt = 63 + v2.AddArg(y) + v0.AddArg(v2) + v.AddArg(v0) + return true } - v.reset(OpPPC64SRAD) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpPPC64SUB, typ.UInt) - v1 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64) - v1.AuxInt = 64 - v0.AddArg(v1) - v2 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.UInt) - v2.AuxInt = 63 - v2.AddArg(y) - v0.AddArg(v2) - v.AddArg(v0) - return true + break } - return false -} -func rewriteValuePPC64_OpRsh64x64_10(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types // match: (Rsh64x64 x y) // result: (SRAD x (ORN y (MaskIfNotCarry (ADDconstForCarry [-64] y)))) for { @@ -26664,17 +17619,21 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64AND { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockPPC64EQ) + v0 := b.NewValue0(v_0.Pos, OpPPC64ANDCC, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockPPC64EQ) - v0 := b.NewValue0(v_0.Pos, OpPPC64ANDCC, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (EQ (CMPconst [0] z:(OR x y)) yes no) // cond: z.Uses == 1 @@ -26688,17 +17647,21 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64OR { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockPPC64EQ) + v0 := b.NewValue0(v_0.Pos, OpPPC64ORCC, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockPPC64EQ) - v0 := b.NewValue0(v_0.Pos, OpPPC64ORCC, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (EQ (CMPconst [0] z:(XOR x y)) yes no) // cond: z.Uses == 1 @@ -26712,17 +17675,21 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64XOR { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockPPC64EQ) + v0 := b.NewValue0(v_0.Pos, OpPPC64XORCC, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockPPC64EQ) - v0 := b.NewValue0(v_0.Pos, OpPPC64XORCC, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } case BlockPPC64GE: // match: (GE (FlagEQ) yes no) @@ -26805,17 +17772,21 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64AND { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockPPC64GE) + v0 := b.NewValue0(v_0.Pos, OpPPC64ANDCC, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockPPC64GE) - v0 := b.NewValue0(v_0.Pos, OpPPC64ANDCC, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (GE (CMPconst [0] z:(OR x y)) yes no) // cond: z.Uses == 1 @@ -26829,17 +17800,21 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64OR { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockPPC64GE) + v0 := b.NewValue0(v_0.Pos, OpPPC64ORCC, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockPPC64GE) - v0 := b.NewValue0(v_0.Pos, OpPPC64ORCC, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (GE (CMPconst [0] z:(XOR x y)) yes no) // cond: z.Uses == 1 @@ -26853,17 +17828,21 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64XOR { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockPPC64GE) + v0 := b.NewValue0(v_0.Pos, OpPPC64XORCC, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockPPC64GE) - v0 := b.NewValue0(v_0.Pos, OpPPC64XORCC, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } case BlockPPC64GT: // match: (GT (FlagEQ) yes no) @@ -26947,17 +17926,21 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64AND { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockPPC64GT) + v0 := b.NewValue0(v_0.Pos, OpPPC64ANDCC, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockPPC64GT) - v0 := b.NewValue0(v_0.Pos, OpPPC64ANDCC, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (GT (CMPconst [0] z:(OR x y)) yes no) // cond: z.Uses == 1 @@ -26971,17 +17954,21 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64OR { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockPPC64GT) + v0 := b.NewValue0(v_0.Pos, OpPPC64ORCC, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockPPC64GT) - v0 := b.NewValue0(v_0.Pos, OpPPC64ORCC, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (GT (CMPconst [0] z:(XOR x y)) yes no) // cond: z.Uses == 1 @@ -26995,17 +17982,21 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64XOR { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockPPC64GT) + v0 := b.NewValue0(v_0.Pos, OpPPC64XORCC, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockPPC64GT) - v0 := b.NewValue0(v_0.Pos, OpPPC64XORCC, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } case BlockIf: // match: (If (Equal cc) yes no) @@ -27190,17 +18181,21 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64AND { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockPPC64LE) + v0 := b.NewValue0(v_0.Pos, OpPPC64ANDCC, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockPPC64LE) - v0 := b.NewValue0(v_0.Pos, OpPPC64ANDCC, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (LE (CMPconst [0] z:(OR x y)) yes no) // cond: z.Uses == 1 @@ -27214,17 +18209,21 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64OR { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockPPC64LE) + v0 := b.NewValue0(v_0.Pos, OpPPC64ORCC, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockPPC64LE) - v0 := b.NewValue0(v_0.Pos, OpPPC64ORCC, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (LE (CMPconst [0] z:(XOR x y)) yes no) // cond: z.Uses == 1 @@ -27238,17 +18237,21 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64XOR { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockPPC64LE) + v0 := b.NewValue0(v_0.Pos, OpPPC64XORCC, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockPPC64LE) - v0 := b.NewValue0(v_0.Pos, OpPPC64XORCC, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } case BlockPPC64LT: // match: (LT (FlagEQ) yes no) @@ -27332,17 +18335,21 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64AND { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockPPC64LT) + v0 := b.NewValue0(v_0.Pos, OpPPC64ANDCC, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockPPC64LT) - v0 := b.NewValue0(v_0.Pos, OpPPC64ANDCC, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (LT (CMPconst [0] z:(OR x y)) yes no) // cond: z.Uses == 1 @@ -27356,17 +18363,21 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64OR { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockPPC64LT) + v0 := b.NewValue0(v_0.Pos, OpPPC64ORCC, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockPPC64LT) - v0 := b.NewValue0(v_0.Pos, OpPPC64ORCC, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (LT (CMPconst [0] z:(XOR x y)) yes no) // cond: z.Uses == 1 @@ -27380,17 +18391,21 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64XOR { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockPPC64LT) + v0 := b.NewValue0(v_0.Pos, OpPPC64XORCC, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockPPC64LT) - v0 := b.NewValue0(v_0.Pos, OpPPC64XORCC, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } case BlockPPC64NE: // match: (NE (CMPWconst [0] (Equal cc)) yes no) @@ -27673,17 +18688,21 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64AND { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockPPC64NE) + v0 := b.NewValue0(v_0.Pos, OpPPC64ANDCC, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockPPC64NE) - v0 := b.NewValue0(v_0.Pos, OpPPC64ANDCC, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (NE (CMPconst [0] z:(OR x y)) yes no) // cond: z.Uses == 1 @@ -27697,17 +18716,21 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64OR { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockPPC64NE) + v0 := b.NewValue0(v_0.Pos, OpPPC64ORCC, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockPPC64NE) - v0 := b.NewValue0(v_0.Pos, OpPPC64ORCC, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } // match: (NE (CMPconst [0] z:(XOR x y)) yes no) // cond: z.Uses == 1 @@ -27721,17 +18744,21 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64XOR { break } - y := z.Args[1] - x := z.Args[0] - if !(z.Uses == 1) { - break + _ = z.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := z.Args[_i0] + y := z.Args[1^_i0] + if !(z.Uses == 1) { + continue + } + b.Reset(BlockPPC64NE) + v0 := b.NewValue0(v_0.Pos, OpPPC64XORCC, types.TypeFlags) + v0.AddArg(x) + v0.AddArg(y) + b.AddControl(v0) + return true } - b.Reset(BlockPPC64NE) - v0 := b.NewValue0(v_0.Pos, OpPPC64XORCC, types.TypeFlags) - v0.AddArg(x) - v0.AddArg(y) - b.AddControl(v0) - return true + break } } return false diff --git a/src/cmd/compile/internal/ssa/rewriteRISCV64.go b/src/cmd/compile/internal/ssa/rewriteRISCV64.go index 8ccfaa54f9..2c23609d48 100644 --- a/src/cmd/compile/internal/ssa/rewriteRISCV64.go +++ b/src/cmd/compile/internal/ssa/rewriteRISCV64.go @@ -3195,39 +3195,24 @@ func rewriteValueRISCV64_OpRISCV64ADD_0(v *Value) bool { // match: (ADD (MOVDconst [off]) ptr) // cond: is32Bit(off) // result: (ADDI [off] ptr) - for { - ptr := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpRISCV64MOVDconst { - break - } - off := v_0.AuxInt - if !(is32Bit(off)) { - break - } - v.reset(OpRISCV64ADDI) - v.AuxInt = off - v.AddArg(ptr) - return true - } - // match: (ADD ptr (MOVDconst [off])) - // cond: is32Bit(off) - // result: (ADDI [off] ptr) for { _ = v.Args[1] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpRISCV64MOVDconst { - break - } - off := v_1.AuxInt - if !(is32Bit(off)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpRISCV64MOVDconst { + continue + } + off := v_0.AuxInt + ptr := v.Args[1^_i0] + if !(is32Bit(off)) { + continue + } + v.reset(OpRISCV64ADDI) + v.AuxInt = off + v.AddArg(ptr) + return true } - v.reset(OpRISCV64ADDI) - v.AuxInt = off - v.AddArg(ptr) - return true + break } return false } diff --git a/src/cmd/compile/internal/ssa/rewriteS390X.go b/src/cmd/compile/internal/ssa/rewriteS390X.go index e7c8120ea0..b04e1439bf 100644 --- a/src/cmd/compile/internal/ssa/rewriteS390X.go +++ b/src/cmd/compile/internal/ssa/rewriteS390X.go @@ -499,7 +499,7 @@ func rewriteValueS390X(v *Value) bool { case OpS390XADDload: return rewriteValueS390X_OpS390XADDload_0(v) case OpS390XAND: - return rewriteValueS390X_OpS390XAND_0(v) || rewriteValueS390X_OpS390XAND_10(v) + return rewriteValueS390X_OpS390XAND_0(v) case OpS390XANDW: return rewriteValueS390X_OpS390XANDW_0(v) case OpS390XANDWconst: @@ -585,7 +585,7 @@ func rewriteValueS390X(v *Value) bool { case OpS390XMOVBstoreconst: return rewriteValueS390X_OpS390XMOVBstoreconst_0(v) case OpS390XMOVBstoreidx: - return rewriteValueS390X_OpS390XMOVBstoreidx_0(v) || rewriteValueS390X_OpS390XMOVBstoreidx_10(v) || rewriteValueS390X_OpS390XMOVBstoreidx_20(v) || rewriteValueS390X_OpS390XMOVBstoreidx_30(v) + return rewriteValueS390X_OpS390XMOVBstoreidx_0(v) case OpS390XMOVDaddridx: return rewriteValueS390X_OpS390XMOVDaddridx_0(v) case OpS390XMOVDload: @@ -601,7 +601,7 @@ func rewriteValueS390X(v *Value) bool { case OpS390XMOVHBRstore: return rewriteValueS390X_OpS390XMOVHBRstore_0(v) case OpS390XMOVHBRstoreidx: - return rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v) || rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v) + return rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v) case OpS390XMOVHZload: return rewriteValueS390X_OpS390XMOVHZload_0(v) case OpS390XMOVHZloadidx: @@ -619,7 +619,7 @@ func rewriteValueS390X(v *Value) bool { case OpS390XMOVHstoreconst: return rewriteValueS390X_OpS390XMOVHstoreconst_0(v) case OpS390XMOVHstoreidx: - return rewriteValueS390X_OpS390XMOVHstoreidx_0(v) || rewriteValueS390X_OpS390XMOVHstoreidx_10(v) + return rewriteValueS390X_OpS390XMOVHstoreidx_0(v) case OpS390XMOVWBRstore: return rewriteValueS390X_OpS390XMOVWBRstore_0(v) case OpS390XMOVWBRstoreidx: @@ -641,7 +641,7 @@ func rewriteValueS390X(v *Value) bool { case OpS390XMOVWstoreconst: return rewriteValueS390X_OpS390XMOVWstoreconst_0(v) case OpS390XMOVWstoreidx: - return rewriteValueS390X_OpS390XMOVWstoreidx_0(v) || rewriteValueS390X_OpS390XMOVWstoreidx_10(v) + return rewriteValueS390X_OpS390XMOVWstoreidx_0(v) case OpS390XMULLD: return rewriteValueS390X_OpS390XMULLD_0(v) case OpS390XMULLDconst: @@ -663,9 +663,9 @@ func rewriteValueS390X(v *Value) bool { case OpS390XNOTW: return rewriteValueS390X_OpS390XNOTW_0(v) case OpS390XOR: - return rewriteValueS390X_OpS390XOR_0(v) || rewriteValueS390X_OpS390XOR_10(v) || rewriteValueS390X_OpS390XOR_20(v) || rewriteValueS390X_OpS390XOR_30(v) || rewriteValueS390X_OpS390XOR_40(v) || rewriteValueS390X_OpS390XOR_50(v) || rewriteValueS390X_OpS390XOR_60(v) || rewriteValueS390X_OpS390XOR_70(v) || rewriteValueS390X_OpS390XOR_80(v) || rewriteValueS390X_OpS390XOR_90(v) || rewriteValueS390X_OpS390XOR_100(v) || rewriteValueS390X_OpS390XOR_110(v) || rewriteValueS390X_OpS390XOR_120(v) || rewriteValueS390X_OpS390XOR_130(v) || rewriteValueS390X_OpS390XOR_140(v) || rewriteValueS390X_OpS390XOR_150(v) || rewriteValueS390X_OpS390XOR_160(v) + return rewriteValueS390X_OpS390XOR_0(v) || rewriteValueS390X_OpS390XOR_10(v) || rewriteValueS390X_OpS390XOR_20(v) case OpS390XORW: - return rewriteValueS390X_OpS390XORW_0(v) || rewriteValueS390X_OpS390XORW_10(v) || rewriteValueS390X_OpS390XORW_20(v) || rewriteValueS390X_OpS390XORW_30(v) || rewriteValueS390X_OpS390XORW_40(v) || rewriteValueS390X_OpS390XORW_50(v) || rewriteValueS390X_OpS390XORW_60(v) || rewriteValueS390X_OpS390XORW_70(v) || rewriteValueS390X_OpS390XORW_80(v) + return rewriteValueS390X_OpS390XORW_0(v) || rewriteValueS390X_OpS390XORW_10(v) case OpS390XORWconst: return rewriteValueS390X_OpS390XORWconst_0(v) case OpS390XORWload: @@ -6589,159 +6589,93 @@ func rewriteValueS390X_OpS390XADD_0(v *Value) bool { // result: (ADDconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDconst { - break - } - c := v_1.AuxInt - if !(is32Bit(c)) { - break - } - v.reset(OpS390XADDconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ADD (MOVDconst [c]) x) - // cond: is32Bit(c) - // result: (ADDconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst { - break - } - c := v_0.AuxInt - if !(is32Bit(c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XMOVDconst { + continue + } + c := v_1.AuxInt + if !(is32Bit(c)) { + continue + } + v.reset(OpS390XADDconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpS390XADDconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (ADD (SLDconst x [c]) (SRDconst x [d])) // cond: d == 64-c // result: (RLLGconst [c] x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XSLDconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XSRDconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(d == 64-c) { - break - } - v.reset(OpS390XRLLGconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ADD (SRDconst x [d]) (SLDconst x [c])) - // cond: d == 64-c - // result: (RLLGconst [c] x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XSRDconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XSLDconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(d == 64-c) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpS390XSLDconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XSRDconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(d == 64-c) { + continue + } + v.reset(OpS390XRLLGconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpS390XRLLGconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (ADD idx (MOVDaddr [c] {s} ptr)) // cond: ptr.Op != OpSB && idx.Op != OpSB // result: (MOVDaddridx [c] {s} ptr idx) for { _ = v.Args[1] - idx := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDaddr { - break - } - c := v_1.AuxInt - s := v_1.Aux - ptr := v_1.Args[0] - if !(ptr.Op != OpSB && idx.Op != OpSB) { - break - } - v.reset(OpS390XMOVDaddridx) - v.AuxInt = c - v.Aux = s - v.AddArg(ptr) - v.AddArg(idx) - return true - } - // match: (ADD (MOVDaddr [c] {s} ptr) idx) - // cond: ptr.Op != OpSB && idx.Op != OpSB - // result: (MOVDaddridx [c] {s} ptr idx) - for { - idx := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDaddr { - break - } - c := v_0.AuxInt - s := v_0.Aux - ptr := v_0.Args[0] - if !(ptr.Op != OpSB && idx.Op != OpSB) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + idx := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XMOVDaddr { + continue + } + c := v_1.AuxInt + s := v_1.Aux + ptr := v_1.Args[0] + if !(ptr.Op != OpSB && idx.Op != OpSB) { + continue + } + v.reset(OpS390XMOVDaddridx) + v.AuxInt = c + v.Aux = s + v.AddArg(ptr) + v.AddArg(idx) + return true } - v.reset(OpS390XMOVDaddridx) - v.AuxInt = c - v.Aux = s - v.AddArg(ptr) - v.AddArg(idx) - return true + break } // match: (ADD x (NEG y)) // result: (SUB x y) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XNEG { - break - } - y := v_1.Args[0] - v.reset(OpS390XSUB) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADD (NEG y) x) - // result: (SUB x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XNEG { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XNEG { + continue + } + y := v_1.Args[0] + v.reset(OpS390XSUB) + v.AddArg(x) + v.AddArg(y) + return true } - y := v_0.Args[0] - v.reset(OpS390XSUB) - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (ADD x g:(MOVDload [off] {sym} ptr mem)) // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) @@ -6749,52 +6683,29 @@ func rewriteValueS390X_OpS390XADD_0(v *Value) bool { for { t := v.Type _ = v.Args[1] - x := v.Args[0] - g := v.Args[1] - if g.Op != OpS390XMOVDload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break - } - v.reset(OpS390XADDload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (ADD g:(MOVDload [off] {sym} ptr mem) x) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) - // result: (ADDload [off] {sym} x ptr mem) - for { - t := v.Type - x := v.Args[1] - g := v.Args[0] - if g.Op != OpS390XMOVDload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + g := v.Args[1^_i0] + if g.Op != OpS390XMOVDload { + continue + } + off := g.AuxInt + sym := g.Aux + mem := g.Args[1] + ptr := g.Args[0] + if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + continue + } + v.reset(OpS390XADDload) + v.Type = t + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - v.reset(OpS390XADDload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true + break } return false } @@ -6804,37 +6715,22 @@ func rewriteValueS390X_OpS390XADDC_0(v *Value) bool { // result: (ADDCconst x [c]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDconst { - break - } - c := v_1.AuxInt - if !(is16Bit(c)) { - break - } - v.reset(OpS390XADDCconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ADDC (MOVDconst [c]) x) - // cond: is16Bit(c) - // result: (ADDCconst x [c]) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst { - break - } - c := v_0.AuxInt - if !(is16Bit(c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XMOVDconst { + continue + } + c := v_1.AuxInt + if !(is16Bit(c)) { + continue + } + v.reset(OpS390XADDCconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpS390XADDCconst) - v.AuxInt = c - v.AddArg(x) - return true + break } return false } @@ -6913,107 +6809,64 @@ func rewriteValueS390X_OpS390XADDW_0(v *Value) bool { // result: (ADDWconst [int64(int32(c))] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDconst { - break - } - c := v_1.AuxInt - v.reset(OpS390XADDWconst) - v.AuxInt = int64(int32(c)) - v.AddArg(x) - return true - } - // match: (ADDW (MOVDconst [c]) x) - // result: (ADDWconst [int64(int32(c))] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XMOVDconst { + continue + } + c := v_1.AuxInt + v.reset(OpS390XADDWconst) + v.AuxInt = int64(int32(c)) + v.AddArg(x) + return true } - c := v_0.AuxInt - v.reset(OpS390XADDWconst) - v.AuxInt = int64(int32(c)) - v.AddArg(x) - return true + break } // match: (ADDW (SLWconst x [c]) (SRWconst x [d])) // cond: d == 32-c // result: (RLLconst [c] x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XSLWconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XSRWconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(d == 32-c) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpS390XSLWconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XSRWconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(d == 32-c) { + continue + } + v.reset(OpS390XRLLconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpS390XRLLconst) - v.AuxInt = c - v.AddArg(x) - return true + break } - // match: (ADDW (SRWconst x [d]) (SLWconst x [c])) - // cond: d == 32-c - // result: (RLLconst [c] x) + // match: (ADDW x (NEGW y)) + // result: (SUBW x y) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XSRWconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XSLWconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(d == 32-c) { - break - } - v.reset(OpS390XRLLconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ADDW x (NEGW y)) - // result: (SUBW x y) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XNEGW { - break - } - y := v_1.Args[0] - v.reset(OpS390XSUBW) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (ADDW (NEGW y) x) - // result: (SUBW x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XNEGW { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XNEGW { + continue + } + y := v_1.Args[0] + v.reset(OpS390XSUBW) + v.AddArg(x) + v.AddArg(y) + return true } - y := v_0.Args[0] - v.reset(OpS390XSUBW) - v.AddArg(x) - v.AddArg(y) - return true + break } // match: (ADDW x g:(MOVWload [off] {sym} ptr mem)) // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) @@ -7021,52 +6874,29 @@ func rewriteValueS390X_OpS390XADDW_0(v *Value) bool { for { t := v.Type _ = v.Args[1] - x := v.Args[0] - g := v.Args[1] - if g.Op != OpS390XMOVWload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break - } - v.reset(OpS390XADDWload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (ADDW g:(MOVWload [off] {sym} ptr mem) x) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) - // result: (ADDWload [off] {sym} x ptr mem) - for { - t := v.Type - x := v.Args[1] - g := v.Args[0] - if g.Op != OpS390XMOVWload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + g := v.Args[1^_i0] + if g.Op != OpS390XMOVWload { + continue + } + off := g.AuxInt + sym := g.Aux + mem := g.Args[1] + ptr := g.Args[0] + if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + continue + } + v.reset(OpS390XADDWload) + v.Type = t + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - v.reset(OpS390XADDWload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true + break } // match: (ADDW x g:(MOVWZload [off] {sym} ptr mem)) // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) @@ -7074,52 +6904,29 @@ func rewriteValueS390X_OpS390XADDW_0(v *Value) bool { for { t := v.Type _ = v.Args[1] - x := v.Args[0] - g := v.Args[1] - if g.Op != OpS390XMOVWZload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break - } - v.reset(OpS390XADDWload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (ADDW g:(MOVWZload [off] {sym} ptr mem) x) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) - // result: (ADDWload [off] {sym} x ptr mem) - for { - t := v.Type - x := v.Args[1] - g := v.Args[0] - if g.Op != OpS390XMOVWZload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + g := v.Args[1^_i0] + if g.Op != OpS390XMOVWZload { + continue + } + off := g.AuxInt + sym := g.Aux + mem := g.Args[1] + ptr := g.Args[0] + if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + continue + } + v.reset(OpS390XADDWload) + v.Type = t + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - v.reset(OpS390XADDWload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true + break } return false } @@ -7424,235 +7231,139 @@ func rewriteValueS390X_OpS390XAND_0(v *Value) bool { // result: (ANDconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDconst { - break - } - c := v_1.AuxInt - if !(is32Bit(c) && c < 0) { - break - } - v.reset(OpS390XANDconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (AND (MOVDconst [c]) x) - // cond: is32Bit(c) && c < 0 - // result: (ANDconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst { - break - } - c := v_0.AuxInt - if !(is32Bit(c) && c < 0) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XMOVDconst { + continue + } + c := v_1.AuxInt + if !(is32Bit(c) && c < 0) { + continue + } + v.reset(OpS390XANDconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpS390XANDconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (AND x (MOVDconst [c])) // cond: is32Bit(c) && c >= 0 // result: (MOVWZreg (ANDWconst [int64(int32(c))] x)) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDconst { - break - } - c := v_1.AuxInt - if !(is32Bit(c) && c >= 0) { - break - } - v.reset(OpS390XMOVWZreg) - v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) - v0.AuxInt = int64(int32(c)) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (AND (MOVDconst [c]) x) - // cond: is32Bit(c) && c >= 0 - // result: (MOVWZreg (ANDWconst [int64(int32(c))] x)) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst { - break - } - c := v_0.AuxInt - if !(is32Bit(c) && c >= 0) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XMOVDconst { + continue + } + c := v_1.AuxInt + if !(is32Bit(c) && c >= 0) { + continue + } + v.reset(OpS390XMOVWZreg) + v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) + v0.AuxInt = int64(int32(c)) + v0.AddArg(x) + v.AddArg(v0) + return true } - v.reset(OpS390XMOVWZreg) - v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) - v0.AuxInt = int64(int32(c)) - v0.AddArg(x) - v.AddArg(v0) - return true + break } // match: (AND x (MOVDconst [0xFF])) // result: (MOVBZreg x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDconst || v_1.AuxInt != 0xFF { - break - } - v.reset(OpS390XMOVBZreg) - v.AddArg(x) - return true - } - // match: (AND (MOVDconst [0xFF]) x) - // result: (MOVBZreg x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst || v_0.AuxInt != 0xFF { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XMOVDconst || v_1.AuxInt != 0xFF { + continue + } + v.reset(OpS390XMOVBZreg) + v.AddArg(x) + return true } - v.reset(OpS390XMOVBZreg) - v.AddArg(x) - return true + break } // match: (AND x (MOVDconst [0xFFFF])) // result: (MOVHZreg x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDconst || v_1.AuxInt != 0xFFFF { - break - } - v.reset(OpS390XMOVHZreg) - v.AddArg(x) - return true - } - // match: (AND (MOVDconst [0xFFFF]) x) - // result: (MOVHZreg x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst || v_0.AuxInt != 0xFFFF { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XMOVDconst || v_1.AuxInt != 0xFFFF { + continue + } + v.reset(OpS390XMOVHZreg) + v.AddArg(x) + return true } - v.reset(OpS390XMOVHZreg) - v.AddArg(x) - return true + break } // match: (AND x (MOVDconst [0xFFFFFFFF])) // result: (MOVWZreg x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDconst || v_1.AuxInt != 0xFFFFFFFF { - break - } - v.reset(OpS390XMOVWZreg) - v.AddArg(x) - return true - } - // match: (AND (MOVDconst [0xFFFFFFFF]) x) - // result: (MOVWZreg x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst || v_0.AuxInt != 0xFFFFFFFF { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XMOVDconst || v_1.AuxInt != 0xFFFFFFFF { + continue + } + v.reset(OpS390XMOVWZreg) + v.AddArg(x) + return true } - v.reset(OpS390XMOVWZreg) - v.AddArg(x) - return true + break } - return false -} -func rewriteValueS390X_OpS390XAND_10(v *Value) bool { - b := v.Block // match: (AND (MOVDconst [^(-1<<63)]) (LGDR x)) // result: (LGDR (LPDFR x)) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst || v_0.AuxInt != ^(-1<<63) { - break - } - v_1 := v.Args[1] - if v_1.Op != OpS390XLGDR { - break - } - t := v_1.Type - x := v_1.Args[0] - v.reset(OpS390XLGDR) - v.Type = t - v0 := b.NewValue0(v.Pos, OpS390XLPDFR, x.Type) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (AND (LGDR x) (MOVDconst [^(-1<<63)])) - // result: (LGDR (LPDFR x)) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XLGDR { - break - } - t := v_0.Type - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDconst || v_1.AuxInt != ^(-1<<63) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpS390XMOVDconst || v_0.AuxInt != ^(-1<<63) { + continue + } + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XLGDR { + continue + } + t := v_1.Type + x := v_1.Args[0] + v.reset(OpS390XLGDR) + v.Type = t + v0 := b.NewValue0(v.Pos, OpS390XLPDFR, x.Type) + v0.AddArg(x) + v.AddArg(v0) + return true } - v.reset(OpS390XLGDR) - v.Type = t - v0 := b.NewValue0(v.Pos, OpS390XLPDFR, x.Type) - v0.AddArg(x) - v.AddArg(v0) - return true + break } // match: (AND (MOVDconst [c]) (MOVDconst [d])) // result: (MOVDconst [c&d]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDconst { - break - } - d := v_1.AuxInt - v.reset(OpS390XMOVDconst) - v.AuxInt = c & d - return true - } - // match: (AND (MOVDconst [d]) (MOVDconst [c])) - // result: (MOVDconst [c&d]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpS390XMOVDconst { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XMOVDconst { + continue + } + d := v_1.AuxInt + v.reset(OpS390XMOVDconst) + v.AuxInt = c & d + return true } - c := v_1.AuxInt - v.reset(OpS390XMOVDconst) - v.AuxInt = c & d - return true + break } // match: (AND x x) // result: x @@ -7672,52 +7383,29 @@ func rewriteValueS390X_OpS390XAND_10(v *Value) bool { for { t := v.Type _ = v.Args[1] - x := v.Args[0] - g := v.Args[1] - if g.Op != OpS390XMOVDload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break - } - v.reset(OpS390XANDload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (AND g:(MOVDload [off] {sym} ptr mem) x) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) - // result: (ANDload [off] {sym} x ptr mem) - for { - t := v.Type - x := v.Args[1] - g := v.Args[0] - if g.Op != OpS390XMOVDload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + g := v.Args[1^_i0] + if g.Op != OpS390XMOVDload { + continue + } + off := g.AuxInt + sym := g.Aux + mem := g.Args[1] + ptr := g.Args[0] + if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + continue + } + v.reset(OpS390XANDload) + v.Type = t + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - v.reset(OpS390XANDload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true + break } return false } @@ -7726,30 +7414,19 @@ func rewriteValueS390X_OpS390XANDW_0(v *Value) bool { // result: (ANDWconst [int64(int32(c))] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDconst { - break - } - c := v_1.AuxInt - v.reset(OpS390XANDWconst) - v.AuxInt = int64(int32(c)) - v.AddArg(x) - return true - } - // match: (ANDW (MOVDconst [c]) x) - // result: (ANDWconst [int64(int32(c))] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XMOVDconst { + continue + } + c := v_1.AuxInt + v.reset(OpS390XANDWconst) + v.AuxInt = int64(int32(c)) + v.AddArg(x) + return true } - c := v_0.AuxInt - v.reset(OpS390XANDWconst) - v.AuxInt = int64(int32(c)) - v.AddArg(x) - return true + break } // match: (ANDW x x) // result: x @@ -7769,52 +7446,29 @@ func rewriteValueS390X_OpS390XANDW_0(v *Value) bool { for { t := v.Type _ = v.Args[1] - x := v.Args[0] - g := v.Args[1] - if g.Op != OpS390XMOVWload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break - } - v.reset(OpS390XANDWload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (ANDW g:(MOVWload [off] {sym} ptr mem) x) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) - // result: (ANDWload [off] {sym} x ptr mem) - for { - t := v.Type - x := v.Args[1] - g := v.Args[0] - if g.Op != OpS390XMOVWload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + g := v.Args[1^_i0] + if g.Op != OpS390XMOVWload { + continue + } + off := g.AuxInt + sym := g.Aux + mem := g.Args[1] + ptr := g.Args[0] + if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + continue + } + v.reset(OpS390XANDWload) + v.Type = t + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - v.reset(OpS390XANDWload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true + break } // match: (ANDW x g:(MOVWZload [off] {sym} ptr mem)) // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) @@ -7822,52 +7476,29 @@ func rewriteValueS390X_OpS390XANDW_0(v *Value) bool { for { t := v.Type _ = v.Args[1] - x := v.Args[0] - g := v.Args[1] - if g.Op != OpS390XMOVWZload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break - } - v.reset(OpS390XANDWload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (ANDW g:(MOVWZload [off] {sym} ptr mem) x) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) - // result: (ANDWload [off] {sym} x ptr mem) - for { - t := v.Type - x := v.Args[1] - g := v.Args[0] - if g.Op != OpS390XMOVWZload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + g := v.Args[1^_i0] + if g.Op != OpS390XMOVWZload { + continue + } + off := g.AuxInt + sym := g.Aux + mem := g.Args[1] + ptr := g.Args[0] + if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + continue + } + v.reset(OpS390XANDWload) + v.Type = t + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - v.reset(OpS390XANDWload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true + break } return false } @@ -9119,72 +8750,46 @@ func rewriteValueS390X_OpS390XCPSDR_0(v *Value) bool { func rewriteValueS390X_OpS390XFADD_0(v *Value) bool { // match: (FADD (FMUL y z) x) // result: (FMADD x y z) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XFMUL { - break - } - z := v_0.Args[1] - y := v_0.Args[0] - v.reset(OpS390XFMADD) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true - } - // match: (FADD x (FMUL y z)) - // result: (FMADD x y z) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XFMUL { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpS390XFMUL { + continue + } + z := v_0.Args[1] + y := v_0.Args[0] + x := v.Args[1^_i0] + v.reset(OpS390XFMADD) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + return true } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpS390XFMADD) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } return false } func rewriteValueS390X_OpS390XFADDS_0(v *Value) bool { // match: (FADDS (FMULS y z) x) // result: (FMADDS x y z) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XFMULS { - break - } - z := v_0.Args[1] - y := v_0.Args[0] - v.reset(OpS390XFMADDS) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true - } - // match: (FADDS x (FMULS y z)) - // result: (FMADDS x y z) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XFMULS { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpS390XFMULS { + continue + } + z := v_0.Args[1] + y := v_0.Args[0] + x := v.Args[1^_i0] + v.reset(OpS390XFMADDS) + v.AddArg(x) + v.AddArg(y) + v.AddArg(z) + return true } - z := v_1.Args[1] - y := v_1.Args[0] - v.reset(OpS390XFMADDS) - v.AddArg(x) - v.AddArg(y) - v.AddArg(z) - return true + break } return false } @@ -9318,42 +8923,22 @@ func rewriteValueS390X_OpS390XFMOVDload_0(v *Value) bool { if v_0.Op != OpS390XADD { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(ptr.Op != OpSB) { - break - } - v.reset(OpS390XFMOVDloadidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (FMOVDload [off] {sym} (ADD idx ptr) mem) - // cond: ptr.Op != OpSB - // result: (FMOVDloadidx [off] {sym} ptr idx mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XADD { - break - } - ptr := v_0.Args[1] - idx := v_0.Args[0] - if !(ptr.Op != OpSB) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + if !(ptr.Op != OpSB) { + continue + } + v.reset(OpS390XFMOVDloadidx) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpS390XFMOVDloadidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } return false } @@ -9501,46 +9086,24 @@ func rewriteValueS390X_OpS390XFMOVDstore_0(v *Value) bool { if v_0.Op != OpS390XADD { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { - break - } - v.reset(OpS390XFMOVDstoreidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (FMOVDstore [off] {sym} (ADD idx ptr) val mem) - // cond: ptr.Op != OpSB - // result: (FMOVDstoreidx [off] {sym} ptr idx val mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpS390XADD { - break - } - ptr := v_0.Args[1] - idx := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + val := v.Args[1] + if !(ptr.Op != OpSB) { + continue + } + v.reset(OpS390XFMOVDstoreidx) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true } - v.reset(OpS390XFMOVDstoreidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true + break } return false } @@ -9709,42 +9272,22 @@ func rewriteValueS390X_OpS390XFMOVSload_0(v *Value) bool { if v_0.Op != OpS390XADD { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(ptr.Op != OpSB) { - break - } - v.reset(OpS390XFMOVSloadidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (FMOVSload [off] {sym} (ADD idx ptr) mem) - // cond: ptr.Op != OpSB - // result: (FMOVSloadidx [off] {sym} ptr idx mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XADD { - break - } - ptr := v_0.Args[1] - idx := v_0.Args[0] - if !(ptr.Op != OpSB) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + if !(ptr.Op != OpSB) { + continue + } + v.reset(OpS390XFMOVSloadidx) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpS390XFMOVSloadidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } return false } @@ -9892,46 +9435,24 @@ func rewriteValueS390X_OpS390XFMOVSstore_0(v *Value) bool { if v_0.Op != OpS390XADD { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { - break - } - v.reset(OpS390XFMOVSstoreidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (FMOVSstore [off] {sym} (ADD idx ptr) val mem) - // cond: ptr.Op != OpSB - // result: (FMOVSstoreidx [off] {sym} ptr idx val mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpS390XADD { - break - } - ptr := v_0.Args[1] - idx := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + val := v.Args[1] + if !(ptr.Op != OpSB) { + continue + } + v.reset(OpS390XFMOVSstoreidx) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true } - v.reset(OpS390XFMOVSstoreidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true + break } return false } @@ -10107,25 +9628,6 @@ func rewriteValueS390X_OpS390XLDGR_0(v *Value) bool { } // match: (LDGR (AND (MOVDconst [^(-1<<63)]) x)) // result: (LPDFR (LDGR x)) - for { - t := v.Type - v_0 := v.Args[0] - if v_0.Op != OpS390XAND { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpS390XMOVDconst || v_0_0.AuxInt != ^(-1<<63) { - break - } - v.reset(OpS390XLPDFR) - v0 := b.NewValue0(v.Pos, OpS390XLDGR, t) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (LDGR (AND x (MOVDconst [^(-1<<63)]))) - // result: (LPDFR (LDGR x)) for { t := v.Type v_0 := v.Args[0] @@ -10133,38 +9635,22 @@ func rewriteValueS390X_OpS390XLDGR_0(v *Value) bool { break } _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpS390XMOVDconst || v_0_1.AuxInt != ^(-1<<63) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpS390XMOVDconst || v_0_0.AuxInt != ^(-1<<63) { + continue + } + x := v_0.Args[1^_i0] + v.reset(OpS390XLPDFR) + v0 := b.NewValue0(v.Pos, OpS390XLDGR, t) + v0.AddArg(x) + v.AddArg(v0) + return true } - v.reset(OpS390XLPDFR) - v0 := b.NewValue0(v.Pos, OpS390XLDGR, t) - v0.AddArg(x) - v.AddArg(v0) - return true + break } // match: (LDGR (OR (MOVDconst [-1<<63]) x)) // result: (LNDFR (LDGR x)) - for { - t := v.Type - v_0 := v.Args[0] - if v_0.Op != OpS390XOR { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpS390XMOVDconst || v_0_0.AuxInt != -1<<63 { - break - } - v.reset(OpS390XLNDFR) - v0 := b.NewValue0(v.Pos, OpS390XLDGR, t) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (LDGR (OR x (MOVDconst [-1<<63]))) - // result: (LNDFR (LDGR x)) for { t := v.Type v_0 := v.Args[0] @@ -10172,16 +9658,19 @@ func rewriteValueS390X_OpS390XLDGR_0(v *Value) bool { break } _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpS390XMOVDconst || v_0_1.AuxInt != -1<<63 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpS390XMOVDconst || v_0_0.AuxInt != -1<<63 { + continue + } + x := v_0.Args[1^_i0] + v.reset(OpS390XLNDFR) + v0 := b.NewValue0(v.Pos, OpS390XLDGR, t) + v0.AddArg(x) + v.AddArg(v0) + return true } - v.reset(OpS390XLNDFR) - v0 := b.NewValue0(v.Pos, OpS390XLDGR, t) - v0.AddArg(x) - v.AddArg(v0) - return true + break } // match: (LDGR x:(ORload [off] {sym} (MOVDconst [-1<<63]) ptr mem)) // cond: x.Uses == 1 && clobber(x) @@ -10571,42 +10060,22 @@ func rewriteValueS390X_OpS390XMOVBZload_0(v *Value) bool { if v_0.Op != OpS390XADD { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(ptr.Op != OpSB) { - break - } - v.reset(OpS390XMOVBZloadidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVBZload [off] {sym} (ADD idx ptr) mem) - // cond: ptr.Op != OpSB - // result: (MOVBZloadidx [off] {sym} ptr idx mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XADD { - break - } - ptr := v_0.Args[1] - idx := v_0.Args[0] - if !(ptr.Op != OpSB) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + if !(ptr.Op != OpSB) { + continue + } + v.reset(OpS390XMOVBZloadidx) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpS390XMOVBZloadidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } return false } @@ -10618,48 +10087,26 @@ func rewriteValueS390X_OpS390XMOVBZloadidx_0(v *Value) bool { c := v.AuxInt sym := v.Aux mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpS390XADDconst { + continue + } + d := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1^_i0] + if !(is20Bit(c + d)) { + continue + } + v.reset(OpS390XMOVBZloadidx) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - d := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - if !(is20Bit(c + d)) { - break - } - v.reset(OpS390XMOVBZloadidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVBZloadidx [c] {sym} idx (ADDconst [d] ptr) mem) - // cond: is20Bit(c+d) - // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - idx := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XADDconst { - break - } - d := v_1.AuxInt - ptr := v_1.Args[0] - if !(is20Bit(c + d)) { - break - } - v.reset(OpS390XMOVBZloadidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } // match: (MOVBZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) // cond: is20Bit(c+d) @@ -10668,48 +10115,26 @@ func rewriteValueS390X_OpS390XMOVBZloadidx_0(v *Value) bool { c := v.AuxInt sym := v.Aux mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XADDconst { - break - } - d := v_1.AuxInt - idx := v_1.Args[0] - if !(is20Bit(c + d)) { - break - } - v.reset(OpS390XMOVBZloadidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVBZloadidx [c] {sym} (ADDconst [d] idx) ptr mem) - // cond: is20Bit(c+d) - // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { - break - } - d := v_0.AuxInt - idx := v_0.Args[0] - ptr := v.Args[1] - if !(is20Bit(c + d)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XADDconst { + continue + } + d := v_1.AuxInt + idx := v_1.Args[0] + if !(is20Bit(c + d)) { + continue + } + v.reset(OpS390XMOVBZloadidx) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpS390XMOVBZloadidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } return false } @@ -11085,42 +10510,22 @@ func rewriteValueS390X_OpS390XMOVBload_0(v *Value) bool { if v_0.Op != OpS390XADD { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(ptr.Op != OpSB) { - break - } - v.reset(OpS390XMOVBloadidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVBload [off] {sym} (ADD idx ptr) mem) - // cond: ptr.Op != OpSB - // result: (MOVBloadidx [off] {sym} ptr idx mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XADD { - break - } - ptr := v_0.Args[1] - idx := v_0.Args[0] - if !(ptr.Op != OpSB) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + if !(ptr.Op != OpSB) { + continue + } + v.reset(OpS390XMOVBloadidx) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpS390XMOVBloadidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } return false } @@ -11132,48 +10537,26 @@ func rewriteValueS390X_OpS390XMOVBloadidx_0(v *Value) bool { c := v.AuxInt sym := v.Aux mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { - break - } - d := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - if !(is20Bit(c + d)) { - break - } - v.reset(OpS390XMOVBloadidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVBloadidx [c] {sym} idx (ADDconst [d] ptr) mem) - // cond: is20Bit(c+d) - // result: (MOVBloadidx [c+d] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - idx := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XADDconst { - break - } - d := v_1.AuxInt - ptr := v_1.Args[0] - if !(is20Bit(c + d)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpS390XADDconst { + continue + } + d := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1^_i0] + if !(is20Bit(c + d)) { + continue + } + v.reset(OpS390XMOVBloadidx) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpS390XMOVBloadidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } // match: (MOVBloadidx [c] {sym} ptr (ADDconst [d] idx) mem) // cond: is20Bit(c+d) @@ -11182,48 +10565,26 @@ func rewriteValueS390X_OpS390XMOVBloadidx_0(v *Value) bool { c := v.AuxInt sym := v.Aux mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XADDconst { - break - } - d := v_1.AuxInt - idx := v_1.Args[0] - if !(is20Bit(c + d)) { - break - } - v.reset(OpS390XMOVBloadidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVBloadidx [c] {sym} (ADDconst [d] idx) ptr mem) - // cond: is20Bit(c+d) - // result: (MOVBloadidx [c+d] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { - break - } - d := v_0.AuxInt - idx := v_0.Args[0] - ptr := v.Args[1] - if !(is20Bit(c + d)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XADDconst { + continue + } + d := v_1.AuxInt + idx := v_1.Args[0] + if !(is20Bit(c + d)) { + continue + } + v.reset(OpS390XMOVBloadidx) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpS390XMOVBloadidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } return false } @@ -11623,46 +10984,24 @@ func rewriteValueS390X_OpS390XMOVBstore_0(v *Value) bool { if v_0.Op != OpS390XADD { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { - break - } - v.reset(OpS390XMOVBstoreidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVBstore [off] {sym} (ADD idx ptr) val mem) - // cond: ptr.Op != OpSB - // result: (MOVBstoreidx [off] {sym} ptr idx val mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpS390XADD { - break - } - ptr := v_0.Args[1] - idx := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + val := v.Args[1] + if !(ptr.Op != OpSB) { + continue + } + v.reset(OpS390XMOVBstoreidx) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true } - v.reset(OpS390XMOVBstoreidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true + break } // match: (MOVBstore [i] {s} p w x:(MOVBstore [i-1] {s} p (SRDconst [8] w) mem)) // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) @@ -11727,9 +11066,6 @@ func rewriteValueS390X_OpS390XMOVBstore_0(v *Value) bool { v.AddArg(mem) return true } - return false -} -func rewriteValueS390X_OpS390XMOVBstore_10(v *Value) bool { // match: (MOVBstore [i] {s} p w x:(MOVBstore [i-1] {s} p (SRWconst [8] w) mem)) // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) // result: (MOVHstore [i-1] {s} p w mem) @@ -11759,6 +11095,9 @@ func rewriteValueS390X_OpS390XMOVBstore_10(v *Value) bool { v.AddArg(mem) return true } + return false +} +func rewriteValueS390X_OpS390XMOVBstore_10(v *Value) bool { // match: (MOVBstore [i] {s} p w0:(SRWconst [j] w) x:(MOVBstore [i-1] {s} p (SRWconst [j+8] w) mem)) // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) // result: (MOVHstore [i-1] {s} p w0 mem) @@ -12006,52 +11345,28 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { c := v.AuxInt sym := v.Aux mem := v.Args[3] - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { - break - } - d := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - val := v.Args[2] - if !(is20Bit(c + d)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpS390XADDconst { + continue + } + d := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1^_i0] + val := v.Args[2] + if !(is20Bit(c + d)) { + continue + } + v.reset(OpS390XMOVBstoreidx) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true } - v.reset(OpS390XMOVBstoreidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVBstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) - // cond: is20Bit(c+d) - // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[3] - idx := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XADDconst { - break - } - d := v_1.AuxInt - ptr := v_1.Args[0] - val := v.Args[2] - if !(is20Bit(c + d)) { - break - } - v.reset(OpS390XMOVBstoreidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true + break } // match: (MOVBstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) // cond: is20Bit(c+d) @@ -12060,52 +11375,28 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { c := v.AuxInt sym := v.Aux mem := v.Args[3] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XADDconst { - break - } - d := v_1.AuxInt - idx := v_1.Args[0] - val := v.Args[2] - if !(is20Bit(c + d)) { - break - } - v.reset(OpS390XMOVBstoreidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVBstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) - // cond: is20Bit(c+d) - // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[3] - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { - break - } - d := v_0.AuxInt - idx := v_0.Args[0] - ptr := v.Args[1] - val := v.Args[2] - if !(is20Bit(c + d)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XADDconst { + continue + } + d := v_1.AuxInt + idx := v_1.Args[0] + val := v.Args[2] + if !(is20Bit(c + d)) { + continue + } + v.reset(OpS390XMOVBstoreidx) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true } - v.reset(OpS390XMOVBstoreidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true + break } // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [8] w) mem)) // cond: x.Uses == 1 && clobber(x) @@ -12114,1510 +11405,1743 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { i := v.AuxInt s := v.Aux _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - w := v.Args[2] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { - break - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != 8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + idx := v.Args[1^_i0] + w := v.Args[2] + x := v.Args[3] + if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { + continue + } + mem := x.Args[3] + for _i1 := 0; _i1 <= 1; _i1++ { + if p != x.Args[_i1] || idx != x.Args[1^_i1] { + continue + } + x_2 := x.Args[2] + if x_2.Op != OpS390XSRDconst || x_2.AuxInt != 8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + continue + } + v.reset(OpS390XMOVHstoreidx) + v.AuxInt = i - 1 + v.Aux = s + v.AddArg(p) + v.AddArg(idx) + v.AddArg(w) + v.AddArg(mem) + return true + } } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) - return true + break } - // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [8] w) mem)) + // match: (MOVBstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [j+8] w) mem)) // cond: x.Uses == 1 && clobber(x) - // result: (MOVHstoreidx [i-1] {s} p idx w mem) + // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) for { i := v.AuxInt s := v.Aux _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - w := v.Args[2] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { - break - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != 8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + idx := v.Args[1^_i0] + w0 := v.Args[2] + if w0.Op != OpS390XSRDconst { + continue + } + j := w0.AuxInt + w := w0.Args[0] + x := v.Args[3] + if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { + continue + } + mem := x.Args[3] + for _i1 := 0; _i1 <= 1; _i1++ { + if p != x.Args[_i1] || idx != x.Args[1^_i1] { + continue + } + x_2 := x.Args[2] + if x_2.Op != OpS390XSRDconst || x_2.AuxInt != j+8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + continue + } + v.reset(OpS390XMOVHstoreidx) + v.AuxInt = i - 1 + v.Aux = s + v.AddArg(p) + v.AddArg(idx) + v.AddArg(w0) + v.AddArg(mem) + return true + } } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) - return true + break } - // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [8] w) mem)) + // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [8] w) mem)) // cond: x.Uses == 1 && clobber(x) // result: (MOVHstoreidx [i-1] {s} p idx w mem) for { i := v.AuxInt s := v.Aux _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - w := v.Args[2] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { - break - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != 8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + idx := v.Args[1^_i0] + w := v.Args[2] + x := v.Args[3] + if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { + continue + } + mem := x.Args[3] + for _i1 := 0; _i1 <= 1; _i1++ { + if p != x.Args[_i1] || idx != x.Args[1^_i1] { + continue + } + x_2 := x.Args[2] + if x_2.Op != OpS390XSRWconst || x_2.AuxInt != 8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + continue + } + v.reset(OpS390XMOVHstoreidx) + v.AuxInt = i - 1 + v.Aux = s + v.AddArg(p) + v.AddArg(idx) + v.AddArg(w) + v.AddArg(mem) + return true + } } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) - return true + break } - // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [8] w) mem)) + // match: (MOVBstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [j+8] w) mem)) // cond: x.Uses == 1 && clobber(x) - // result: (MOVHstoreidx [i-1] {s} p idx w mem) + // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) for { i := v.AuxInt s := v.Aux _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - w := v.Args[2] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { - break - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != 8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + idx := v.Args[1^_i0] + w0 := v.Args[2] + if w0.Op != OpS390XSRWconst { + continue + } + j := w0.AuxInt + w := w0.Args[0] + x := v.Args[3] + if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { + continue + } + mem := x.Args[3] + for _i1 := 0; _i1 <= 1; _i1++ { + if p != x.Args[_i1] || idx != x.Args[1^_i1] { + continue + } + x_2 := x.Args[2] + if x_2.Op != OpS390XSRWconst || x_2.AuxInt != j+8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + continue + } + v.reset(OpS390XMOVHstoreidx) + v.AuxInt = i - 1 + v.Aux = s + v.AddArg(p) + v.AddArg(idx) + v.AddArg(w0) + v.AddArg(mem) + return true + } } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) - return true + break } - // match: (MOVBstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [j+8] w) mem)) + // match: (MOVBstoreidx [i] {s} p idx (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) // cond: x.Uses == 1 && clobber(x) - // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) + // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) for { i := v.AuxInt s := v.Aux _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - w0 := v.Args[2] - if w0.Op != OpS390XSRDconst { - break - } - j := w0.AuxInt - w := w0.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { - break - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != j+8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + idx := v.Args[1^_i0] + v_2 := v.Args[2] + if v_2.Op != OpS390XSRDconst || v_2.AuxInt != 8 { + continue + } + w := v_2.Args[0] + x := v.Args[3] + if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { + continue + } + mem := x.Args[3] + for _i1 := 0; _i1 <= 1; _i1++ { + if p != x.Args[_i1] || idx != x.Args[1^_i1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + continue + } + v.reset(OpS390XMOVHBRstoreidx) + v.AuxInt = i - 1 + v.Aux = s + v.AddArg(p) + v.AddArg(idx) + v.AddArg(w) + v.AddArg(mem) + return true + } } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) - v.AddArg(mem) - return true + break } - // match: (MOVBstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [j+8] w) mem)) + // match: (MOVBstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRDconst [j-8] w) mem)) // cond: x.Uses == 1 && clobber(x) - // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) + // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) for { i := v.AuxInt s := v.Aux _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - w0 := v.Args[2] - if w0.Op != OpS390XSRDconst { - break - } - j := w0.AuxInt - w := w0.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { - break - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != j+8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + idx := v.Args[1^_i0] + v_2 := v.Args[2] + if v_2.Op != OpS390XSRDconst { + continue + } + j := v_2.AuxInt + w := v_2.Args[0] + x := v.Args[3] + if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { + continue + } + mem := x.Args[3] + for _i1 := 0; _i1 <= 1; _i1++ { + if p != x.Args[_i1] || idx != x.Args[1^_i1] { + continue + } + w0 := x.Args[2] + if w0.Op != OpS390XSRDconst || w0.AuxInt != j-8 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + continue + } + v.reset(OpS390XMOVHBRstoreidx) + v.AuxInt = i - 1 + v.Aux = s + v.AddArg(p) + v.AddArg(idx) + v.AddArg(w0) + v.AddArg(mem) + return true + } } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) - v.AddArg(mem) - return true + break } - return false -} -func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool { - // match: (MOVBstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [j+8] w) mem)) + // match: (MOVBstoreidx [i] {s} p idx (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) // cond: x.Uses == 1 && clobber(x) - // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) + // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) for { i := v.AuxInt s := v.Aux _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - w0 := v.Args[2] - if w0.Op != OpS390XSRDconst { - break - } - j := w0.AuxInt - w := w0.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { - break - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != j+8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + idx := v.Args[1^_i0] + v_2 := v.Args[2] + if v_2.Op != OpS390XSRWconst || v_2.AuxInt != 8 { + continue + } + w := v_2.Args[0] + x := v.Args[3] + if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { + continue + } + mem := x.Args[3] + for _i1 := 0; _i1 <= 1; _i1++ { + if p != x.Args[_i1] || idx != x.Args[1^_i1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + continue + } + v.reset(OpS390XMOVHBRstoreidx) + v.AuxInt = i - 1 + v.Aux = s + v.AddArg(p) + v.AddArg(idx) + v.AddArg(w) + v.AddArg(mem) + return true + } } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) - v.AddArg(mem) - return true + break } - // match: (MOVBstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRDconst [j+8] w) mem)) + // match: (MOVBstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRWconst [j-8] w) mem)) // cond: x.Uses == 1 && clobber(x) - // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) + // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) for { i := v.AuxInt s := v.Aux _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - w0 := v.Args[2] - if w0.Op != OpS390XSRDconst { - break - } - j := w0.AuxInt - w := w0.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { - break + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + idx := v.Args[1^_i0] + v_2 := v.Args[2] + if v_2.Op != OpS390XSRWconst { + continue + } + j := v_2.AuxInt + w := v_2.Args[0] + x := v.Args[3] + if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { + continue + } + mem := x.Args[3] + for _i1 := 0; _i1 <= 1; _i1++ { + if p != x.Args[_i1] || idx != x.Args[1^_i1] { + continue + } + w0 := x.Args[2] + if w0.Op != OpS390XSRWconst || w0.AuxInt != j-8 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + continue + } + v.reset(OpS390XMOVHBRstoreidx) + v.AuxInt = i - 1 + v.Aux = s + v.AddArg(p) + v.AddArg(idx) + v.AddArg(w0) + v.AddArg(mem) + return true + } } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { + break + } + return false +} +func rewriteValueS390X_OpS390XMOVDaddridx_0(v *Value) bool { + // match: (MOVDaddridx [c] {s} (ADDconst [d] x) y) + // cond: is20Bit(c+d) && x.Op != OpSB + // result: (MOVDaddridx [c+d] {s} x y) + for { + c := v.AuxInt + s := v.Aux + y := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpS390XADDconst { break } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != j+8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + d := v_0.AuxInt + x := v_0.Args[0] + if !(is20Bit(c+d) && x.Op != OpSB) { break } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = i - 1 + v.reset(OpS390XMOVDaddridx) + v.AuxInt = c + d v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) - v.AddArg(mem) + v.AddArg(x) + v.AddArg(y) return true } - // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHstoreidx [i-1] {s} p idx w mem) + // match: (MOVDaddridx [c] {s} x (ADDconst [d] y)) + // cond: is20Bit(c+d) && y.Op != OpSB + // result: (MOVDaddridx [c+d] {s} x y) for { - i := v.AuxInt + c := v.AuxInt s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - w := v.Args[2] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpS390XADDconst { break } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRWconst || x_2.AuxInt != 8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + d := v_1.AuxInt + y := v_1.Args[0] + if !(is20Bit(c+d) && y.Op != OpSB) { break } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = i - 1 + v.reset(OpS390XMOVDaddridx) + v.AuxInt = c + d v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) + v.AddArg(x) + v.AddArg(y) return true } - // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHstoreidx [i-1] {s} p idx w mem) + // match: (MOVDaddridx [off1] {sym1} (MOVDaddr [off2] {sym2} x) y) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB + // result: (MOVDaddridx [off1+off2] {mergeSym(sym1,sym2)} x y) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - w := v.Args[2] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { + off1 := v.AuxInt + sym1 := v.Aux + y := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpS390XMOVDaddr { break } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRWconst || x_2.AuxInt != 8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + x := v_0.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { break } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) + v.reset(OpS390XMOVDaddridx) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(x) + v.AddArg(y) return true } - // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHstoreidx [i-1] {s} p idx w mem) + // match: (MOVDaddridx [off1] {sym1} x (MOVDaddr [off2] {sym2} y)) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && y.Op != OpSB + // result: (MOVDaddridx [off1+off2] {mergeSym(sym1,sym2)} x y) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - w := v.Args[2] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { + off1 := v.AuxInt + sym1 := v.Aux + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpS390XMOVDaddr { break } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRWconst || x_2.AuxInt != 8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + off2 := v_1.AuxInt + sym2 := v_1.Aux + y := v_1.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && y.Op != OpSB) { break } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) + v.reset(OpS390XMOVDaddridx) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(x) + v.AddArg(y) return true } - // match: (MOVBstoreidx [i] {s} idx p w x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHstoreidx [i-1] {s} p idx w mem) + return false +} +func rewriteValueS390X_OpS390XMOVDload_0(v *Value) bool { + // match: (MOVDload [off] {sym} ptr1 (MOVDstore [off] {sym} ptr2 x _)) + // cond: isSamePtr(ptr1, ptr2) + // result: x for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - w := v.Args[2] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { + off := v.AuxInt + sym := v.Aux + _ = v.Args[1] + ptr1 := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpS390XMOVDstore || v_1.AuxInt != off || v_1.Aux != sym { break } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRWconst || x_2.AuxInt != 8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + _ = v_1.Args[2] + ptr2 := v_1.Args[0] + x := v_1.Args[1] + if !(isSamePtr(ptr1, ptr2)) { break } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (MOVBstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [j+8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) + // match: (MOVDload [off] {sym} ptr1 (FMOVDstore [off] {sym} ptr2 x _)) + // cond: isSamePtr(ptr1, ptr2) + // result: (LGDR x) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - w0 := v.Args[2] - if w0.Op != OpS390XSRWconst { + off := v.AuxInt + sym := v.Aux + _ = v.Args[1] + ptr1 := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpS390XFMOVDstore || v_1.AuxInt != off || v_1.Aux != sym { break } - j := w0.AuxInt - w := w0.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { + _ = v_1.Args[2] + ptr2 := v_1.Args[0] + x := v_1.Args[1] + if !(isSamePtr(ptr1, ptr2)) { break } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { + v.reset(OpS390XLGDR) + v.AddArg(x) + return true + } + // match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) + // cond: is20Bit(off1+off2) + // result: (MOVDload [off1+off2] {sym} ptr mem) + for { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpS390XADDconst { break } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRWconst || x_2.AuxInt != j+8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + off2 := v_0.AuxInt + ptr := v_0.Args[0] + if !(is20Bit(off1 + off2)) { break } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) + v.reset(OpS390XMOVDload) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVBstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [j+8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) + // match: (MOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0)) + // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - w0 := v.Args[2] - if w0.Op != OpS390XSRWconst { - break - } - j := w0.AuxInt - w := w0.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpS390XMOVDaddr { break } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRWconst || x_2.AuxInt != j+8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + t := v_0.Type + off2 := v_0.AuxInt + sym2 := v_0.Aux + base := v_0.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0))) { break } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) + v.reset(OpS390XMOVDload) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(base) v.AddArg(mem) return true } - // match: (MOVBstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [j+8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) + // match: (MOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (MOVDloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - w0 := v.Args[2] - if w0.Op != OpS390XSRWconst { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpS390XMOVDaddridx { break } - j := w0.AuxInt - w := w0.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { + off2 := v_0.AuxInt + sym2 := v_0.Aux + idx := v_0.Args[1] + ptr := v_0.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { + v.reset(OpS390XMOVDloadidx) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + // match: (MOVDload [off] {sym} (ADD ptr idx) mem) + // cond: ptr.Op != OpSB + // result: (MOVDloadidx [off] {sym} ptr idx mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpS390XADD { + break + } + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + if !(ptr.Op != OpSB) { + continue + } + v.reset(OpS390XMOVDloadidx) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + break + } + return false +} +func rewriteValueS390X_OpS390XMOVDloadidx_0(v *Value) bool { + // match: (MOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) + // cond: is20Bit(c+d) + // result: (MOVDloadidx [c+d] {sym} ptr idx mem) + for { + c := v.AuxInt + sym := v.Aux + mem := v.Args[2] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpS390XADDconst { + continue + } + d := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1^_i0] + if !(is20Bit(c + d)) { + continue + } + v.reset(OpS390XMOVDloadidx) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + break + } + // match: (MOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) + // cond: is20Bit(c+d) + // result: (MOVDloadidx [c+d] {sym} ptr idx mem) + for { + c := v.AuxInt + sym := v.Aux + mem := v.Args[2] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XADDconst { + continue + } + d := v_1.AuxInt + idx := v_1.Args[0] + if !(is20Bit(c + d)) { + continue + } + v.reset(OpS390XMOVDloadidx) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + break + } + return false +} +func rewriteValueS390X_OpS390XMOVDstore_0(v *Value) bool { + // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) + // cond: is20Bit(off1+off2) + // result: (MOVDstore [off1+off2] {sym} ptr val mem) + for { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpS390XADDconst { break } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRWconst || x_2.AuxInt != j+8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + off2 := v_0.AuxInt + ptr := v_0.Args[0] + val := v.Args[1] + if !(is20Bit(off1 + off2)) { break } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) + v.reset(OpS390XMOVDstore) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(ptr) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVBstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p (SRWconst [j+8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) + // match: (MOVDstore [off] {sym} ptr (MOVDconst [c]) mem) + // cond: is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB + // result: (MOVDstoreconst [makeValAndOff(c,off)] {sym} ptr mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - w0 := v.Args[2] - if w0.Op != OpS390XSRWconst { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpS390XMOVDconst { break } - j := w0.AuxInt - w := w0.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { + c := v_1.AuxInt + if !(is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB) { break } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { + v.reset(OpS390XMOVDstoreconst) + v.AuxInt = makeValAndOff(c, off) + v.Aux = sym + v.AddArg(ptr) + v.AddArg(mem) + return true + } + // match: (MOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0)) + // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) + for { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpS390XMOVDaddr { break } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRWconst || x_2.AuxInt != j+8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + t := v_0.Type + off2 := v_0.AuxInt + sym2 := v_0.Aux + base := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0))) { break } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) + v.reset(OpS390XMOVDstore) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(base) + v.AddArg(val) v.AddArg(mem) return true } - return false -} -func rewriteValueS390X_OpS390XMOVBstoreidx_20(v *Value) bool { - // match: (MOVBstoreidx [i] {s} p idx (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) + // match: (MOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (MOVDstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRDconst || v_2.AuxInt != 8 { - break - } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpS390XMOVDaddridx { break } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + idx := v_0.Args[1] + ptr := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(OpS390XMOVHBRstoreidx) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) + v.reset(OpS390XMOVDstoreidx) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(ptr) v.AddArg(idx) - v.AddArg(w) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVBstoreidx [i] {s} p idx (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) + // match: (MOVDstore [off] {sym} (ADD ptr idx) val mem) + // cond: ptr.Op != OpSB + // result: (MOVDstoreidx [off] {sym} ptr idx val mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpS390XADD { + break + } + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + val := v.Args[1] + if !(ptr.Op != OpSB) { + continue + } + v.reset(OpS390XMOVDstoreidx) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true + } + break + } + // match: (MOVDstore [i] {s} p w1 x:(MOVDstore [i-8] {s} p w0 mem)) + // cond: p.Op != OpSB && x.Uses == 1 && is20Bit(i-8) && clobber(x) + // result: (STMG2 [i-8] {s} p w0 w1 mem) for { i := v.AuxInt s := v.Aux - _ = v.Args[3] + _ = v.Args[2] p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRDconst || v_2.AuxInt != 8 { + w1 := v.Args[1] + x := v.Args[2] + if x.Op != OpS390XMOVDstore || x.AuxInt != i-8 || x.Aux != s { break } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { + mem := x.Args[2] + if p != x.Args[0] { break } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + w0 := x.Args[1] + if !(p.Op != OpSB && x.Uses == 1 && is20Bit(i-8) && clobber(x)) { break } - v.reset(OpS390XMOVHBRstoreidx) - v.AuxInt = i - 1 + v.reset(OpS390XSTMG2) + v.AuxInt = i - 8 v.Aux = s v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) + v.AddArg(w0) + v.AddArg(w1) v.AddArg(mem) return true } - // match: (MOVBstoreidx [i] {s} idx p (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) + // match: (MOVDstore [i] {s} p w2 x:(STMG2 [i-16] {s} p w0 w1 mem)) + // cond: x.Uses == 1 && is20Bit(i-16) && clobber(x) + // result: (STMG3 [i-16] {s} p w0 w1 w2 mem) for { i := v.AuxInt s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRDconst || v_2.AuxInt != 8 { + _ = v.Args[2] + p := v.Args[0] + w2 := v.Args[1] + x := v.Args[2] + if x.Op != OpS390XSTMG2 || x.AuxInt != i-16 || x.Aux != s { break } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { + mem := x.Args[3] + if p != x.Args[0] { break } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + w0 := x.Args[1] + w1 := x.Args[2] + if !(x.Uses == 1 && is20Bit(i-16) && clobber(x)) { break } - v.reset(OpS390XMOVHBRstoreidx) - v.AuxInt = i - 1 + v.reset(OpS390XSTMG3) + v.AuxInt = i - 16 v.Aux = s v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) + v.AddArg(w0) + v.AddArg(w1) + v.AddArg(w2) v.AddArg(mem) return true } - // match: (MOVBstoreidx [i] {s} idx p (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) + // match: (MOVDstore [i] {s} p w3 x:(STMG3 [i-24] {s} p w0 w1 w2 mem)) + // cond: x.Uses == 1 && is20Bit(i-24) && clobber(x) + // result: (STMG4 [i-24] {s} p w0 w1 w2 w3 mem) for { i := v.AuxInt s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRDconst || v_2.AuxInt != 8 { + _ = v.Args[2] + p := v.Args[0] + w3 := v.Args[1] + x := v.Args[2] + if x.Op != OpS390XSTMG3 || x.AuxInt != i-24 || x.Aux != s { break } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { + mem := x.Args[4] + if p != x.Args[0] { break } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + w0 := x.Args[1] + w1 := x.Args[2] + w2 := x.Args[3] + if !(x.Uses == 1 && is20Bit(i-24) && clobber(x)) { break } - v.reset(OpS390XMOVHBRstoreidx) - v.AuxInt = i - 1 + v.reset(OpS390XSTMG4) + v.AuxInt = i - 24 v.Aux = s v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) + v.AddArg(w0) + v.AddArg(w1) + v.AddArg(w2) + v.AddArg(w3) v.AddArg(mem) return true } - // match: (MOVBstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRDconst [j-8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) + return false +} +func rewriteValueS390X_OpS390XMOVDstoreconst_0(v *Value) bool { + // match: (MOVDstoreconst [sc] {s} (ADDconst [off] ptr) mem) + // cond: isU12Bit(ValAndOff(sc).Off()+off) + // result: (MOVDstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) for { - i := v.AuxInt + sc := v.AuxInt s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRDconst { - break - } - j := v_2.AuxInt - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpS390XADDconst { break } - w0 := x.Args[2] - if w0.Op != OpS390XSRDconst || w0.AuxInt != j-8 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + off := v_0.AuxInt + ptr := v_0.Args[0] + if !(isU12Bit(ValAndOff(sc).Off() + off)) { break } - v.reset(OpS390XMOVHBRstoreidx) - v.AuxInt = i - 1 + v.reset(OpS390XMOVDstoreconst) + v.AuxInt = ValAndOff(sc).add(off) v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) + v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVBstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRDconst [j-8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) + // match: (MOVDstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) + // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) + // result: (MOVDstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRDconst { - break - } - j := v_2.AuxInt - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { + sc := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpS390XMOVDaddr { break } - w0 := x.Args[2] - if w0.Op != OpS390XSRDconst || w0.AuxInt != j-8 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + off := v_0.AuxInt + sym2 := v_0.Aux + ptr := v_0.Args[0] + if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { break } - v.reset(OpS390XMOVHBRstoreidx) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) + v.reset(OpS390XMOVDstoreconst) + v.AuxInt = ValAndOff(sc).add(off) + v.Aux = mergeSym(sym1, sym2) + v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVBstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRDconst [j-8] w) mem)) + return false +} +func rewriteValueS390X_OpS390XMOVDstoreidx_0(v *Value) bool { + // match: (MOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) + // cond: is20Bit(c+d) + // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) + for { + c := v.AuxInt + sym := v.Aux + mem := v.Args[3] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpS390XADDconst { + continue + } + d := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1^_i0] + val := v.Args[2] + if !(is20Bit(c + d)) { + continue + } + v.reset(OpS390XMOVDstoreidx) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true + } + break + } + // match: (MOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) + // cond: is20Bit(c+d) + // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) + for { + c := v.AuxInt + sym := v.Aux + mem := v.Args[3] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XADDconst { + continue + } + d := v_1.AuxInt + idx := v_1.Args[0] + val := v.Args[2] + if !(is20Bit(c + d)) { + continue + } + v.reset(OpS390XMOVDstoreidx) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true + } + break + } + return false +} +func rewriteValueS390X_OpS390XMOVHBRstore_0(v *Value) bool { + // match: (MOVHBRstore [i] {s} p (SRDconst [16] w) x:(MOVHBRstore [i-2] {s} p w mem)) // cond: x.Uses == 1 && clobber(x) - // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) + // result: (MOVWBRstore [i-2] {s} p w mem) for { i := v.AuxInt s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRDconst { - break - } - j := v_2.AuxInt - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { + _ = v.Args[2] + p := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpS390XSRDconst || v_1.AuxInt != 16 { break } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { + w := v_1.Args[0] + x := v.Args[2] + if x.Op != OpS390XMOVHBRstore || x.AuxInt != i-2 || x.Aux != s { break } - w0 := x.Args[2] - if w0.Op != OpS390XSRDconst || w0.AuxInt != j-8 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + mem := x.Args[2] + if p != x.Args[0] || w != x.Args[1] || !(x.Uses == 1 && clobber(x)) { break } - v.reset(OpS390XMOVHBRstoreidx) - v.AuxInt = i - 1 + v.reset(OpS390XMOVWBRstore) + v.AuxInt = i - 2 v.Aux = s v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) + v.AddArg(w) v.AddArg(mem) return true } - // match: (MOVBstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRDconst [j-8] w) mem)) + // match: (MOVHBRstore [i] {s} p (SRDconst [j] w) x:(MOVHBRstore [i-2] {s} p w0:(SRDconst [j-16] w) mem)) // cond: x.Uses == 1 && clobber(x) - // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) + // result: (MOVWBRstore [i-2] {s} p w0 mem) for { i := v.AuxInt s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRDconst { + _ = v.Args[2] + p := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpS390XSRDconst { break } - j := v_2.AuxInt - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { + j := v_1.AuxInt + w := v_1.Args[0] + x := v.Args[2] + if x.Op != OpS390XMOVHBRstore || x.AuxInt != i-2 || x.Aux != s { break } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { + mem := x.Args[2] + if p != x.Args[0] { break } - w0 := x.Args[2] - if w0.Op != OpS390XSRDconst || w0.AuxInt != j-8 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + w0 := x.Args[1] + if w0.Op != OpS390XSRDconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { break } - v.reset(OpS390XMOVHBRstoreidx) - v.AuxInt = i - 1 + v.reset(OpS390XMOVWBRstore) + v.AuxInt = i - 2 v.Aux = s v.AddArg(p) - v.AddArg(idx) v.AddArg(w0) v.AddArg(mem) return true } - // match: (MOVBstoreidx [i] {s} p idx (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) + // match: (MOVHBRstore [i] {s} p (SRWconst [16] w) x:(MOVHBRstore [i-2] {s} p w mem)) // cond: x.Uses == 1 && clobber(x) - // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) + // result: (MOVWBRstore [i-2] {s} p w mem) for { i := v.AuxInt s := v.Aux - _ = v.Args[3] + _ = v.Args[2] p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRWconst || v_2.AuxInt != 8 { + v_1 := v.Args[1] + if v_1.Op != OpS390XSRWconst || v_1.AuxInt != 16 { break } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { + w := v_1.Args[0] + x := v.Args[2] + if x.Op != OpS390XMOVHBRstore || x.AuxInt != i-2 || x.Aux != s { break } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + mem := x.Args[2] + if p != x.Args[0] || w != x.Args[1] || !(x.Uses == 1 && clobber(x)) { break } - v.reset(OpS390XMOVHBRstoreidx) - v.AuxInt = i - 1 + v.reset(OpS390XMOVWBRstore) + v.AuxInt = i - 2 v.Aux = s v.AddArg(p) - v.AddArg(idx) v.AddArg(w) v.AddArg(mem) return true } - // match: (MOVBstoreidx [i] {s} p idx (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) + // match: (MOVHBRstore [i] {s} p (SRWconst [j] w) x:(MOVHBRstore [i-2] {s} p w0:(SRWconst [j-16] w) mem)) // cond: x.Uses == 1 && clobber(x) - // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) + // result: (MOVWBRstore [i-2] {s} p w0 mem) for { i := v.AuxInt s := v.Aux - _ = v.Args[3] + _ = v.Args[2] p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRWconst || v_2.AuxInt != 8 { + v_1 := v.Args[1] + if v_1.Op != OpS390XSRWconst { break } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { + j := v_1.AuxInt + w := v_1.Args[0] + x := v.Args[2] + if x.Op != OpS390XMOVHBRstore || x.AuxInt != i-2 || x.Aux != s { break } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + mem := x.Args[2] + if p != x.Args[0] { break } - v.reset(OpS390XMOVHBRstoreidx) - v.AuxInt = i - 1 + w0 := x.Args[1] + if w0.Op != OpS390XSRWconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + break + } + v.reset(OpS390XMOVWBRstore) + v.AuxInt = i - 2 v.Aux = s v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) + v.AddArg(w0) v.AddArg(mem) return true } return false } -func rewriteValueS390X_OpS390XMOVBstoreidx_30(v *Value) bool { - // match: (MOVBstoreidx [i] {s} idx p (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) +func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool { + // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) // cond: x.Uses == 1 && clobber(x) - // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) + // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) for { i := v.AuxInt s := v.Aux _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRWconst || v_2.AuxInt != 8 { - break - } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + idx := v.Args[1^_i0] + v_2 := v.Args[2] + if v_2.Op != OpS390XSRDconst || v_2.AuxInt != 16 { + continue + } + w := v_2.Args[0] + x := v.Args[3] + if x.Op != OpS390XMOVHBRstoreidx || x.AuxInt != i-2 || x.Aux != s { + continue + } + mem := x.Args[3] + for _i1 := 0; _i1 <= 1; _i1++ { + if p != x.Args[_i1] || idx != x.Args[1^_i1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + continue + } + v.reset(OpS390XMOVWBRstoreidx) + v.AuxInt = i - 2 + v.Aux = s + v.AddArg(p) + v.AddArg(idx) + v.AddArg(w) + v.AddArg(mem) + return true + } } - v.reset(OpS390XMOVHBRstoreidx) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) - return true - } - // match: (MOVBstoreidx [i] {s} idx p (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} idx p w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRWconst || v_2.AuxInt != 8 { - break - } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpS390XMOVHBRstoreidx) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) - return true - } - // match: (MOVBstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRWconst [j-8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRWconst { - break - } - j := v_2.AuxInt - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { - break - } - w0 := x.Args[2] - if w0.Op != OpS390XSRWconst || w0.AuxInt != j-8 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpS390XMOVHBRstoreidx) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) - v.AddArg(mem) - return true + break } - // match: (MOVBstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRWconst [j-8] w) mem)) + // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRDconst [j-16] w) mem)) // cond: x.Uses == 1 && clobber(x) - // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) + // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) for { i := v.AuxInt s := v.Aux _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRWconst { - break - } - j := v_2.AuxInt - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { - break - } - w0 := x.Args[2] - if w0.Op != OpS390XSRWconst || w0.AuxInt != j-8 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + idx := v.Args[1^_i0] + v_2 := v.Args[2] + if v_2.Op != OpS390XSRDconst { + continue + } + j := v_2.AuxInt + w := v_2.Args[0] + x := v.Args[3] + if x.Op != OpS390XMOVHBRstoreidx || x.AuxInt != i-2 || x.Aux != s { + continue + } + mem := x.Args[3] + for _i1 := 0; _i1 <= 1; _i1++ { + if p != x.Args[_i1] || idx != x.Args[1^_i1] { + continue + } + w0 := x.Args[2] + if w0.Op != OpS390XSRDconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + continue + } + v.reset(OpS390XMOVWBRstoreidx) + v.AuxInt = i - 2 + v.Aux = s + v.AddArg(p) + v.AddArg(idx) + v.AddArg(w0) + v.AddArg(mem) + return true + } } - v.reset(OpS390XMOVHBRstoreidx) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) - v.AddArg(mem) - return true + break } - // match: (MOVBstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRWconst [j-8] w) mem)) + // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) // cond: x.Uses == 1 && clobber(x) - // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) + // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) for { i := v.AuxInt s := v.Aux _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRWconst { - break - } - j := v_2.AuxInt - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { - break - } - w0 := x.Args[2] - if w0.Op != OpS390XSRWconst || w0.AuxInt != j-8 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + idx := v.Args[1^_i0] + v_2 := v.Args[2] + if v_2.Op != OpS390XSRWconst || v_2.AuxInt != 16 { + continue + } + w := v_2.Args[0] + x := v.Args[3] + if x.Op != OpS390XMOVHBRstoreidx || x.AuxInt != i-2 || x.Aux != s { + continue + } + mem := x.Args[3] + for _i1 := 0; _i1 <= 1; _i1++ { + if p != x.Args[_i1] || idx != x.Args[1^_i1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + continue + } + v.reset(OpS390XMOVWBRstoreidx) + v.AuxInt = i - 2 + v.Aux = s + v.AddArg(p) + v.AddArg(idx) + v.AddArg(w) + v.AddArg(mem) + return true + } } - v.reset(OpS390XMOVHBRstoreidx) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) - v.AddArg(mem) - return true + break } - // match: (MOVBstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} idx p w0:(SRWconst [j-8] w) mem)) + // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRWconst [j-16] w) mem)) // cond: x.Uses == 1 && clobber(x) - // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) + // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) for { i := v.AuxInt s := v.Aux _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRWconst { - break - } - j := v_2.AuxInt - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { - break - } - w0 := x.Args[2] - if w0.Op != OpS390XSRWconst || w0.AuxInt != j-8 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + idx := v.Args[1^_i0] + v_2 := v.Args[2] + if v_2.Op != OpS390XSRWconst { + continue + } + j := v_2.AuxInt + w := v_2.Args[0] + x := v.Args[3] + if x.Op != OpS390XMOVHBRstoreidx || x.AuxInt != i-2 || x.Aux != s { + continue + } + mem := x.Args[3] + for _i1 := 0; _i1 <= 1; _i1++ { + if p != x.Args[_i1] || idx != x.Args[1^_i1] { + continue + } + w0 := x.Args[2] + if w0.Op != OpS390XSRWconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + continue + } + v.reset(OpS390XMOVWBRstoreidx) + v.AuxInt = i - 2 + v.Aux = s + v.AddArg(p) + v.AddArg(idx) + v.AddArg(w0) + v.AddArg(mem) + return true + } } - v.reset(OpS390XMOVHBRstoreidx) - v.AuxInt = i - 1 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) - v.AddArg(mem) - return true + break } return false } -func rewriteValueS390X_OpS390XMOVDaddridx_0(v *Value) bool { - // match: (MOVDaddridx [c] {s} (ADDconst [d] x) y) - // cond: is20Bit(c+d) && x.Op != OpSB - // result: (MOVDaddridx [c+d] {s} x y) +func rewriteValueS390X_OpS390XMOVHZload_0(v *Value) bool { + // match: (MOVHZload [off] {sym} ptr1 (MOVHstore [off] {sym} ptr2 x _)) + // cond: isSamePtr(ptr1, ptr2) + // result: (MOVHZreg x) for { - c := v.AuxInt - s := v.Aux - y := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { + off := v.AuxInt + sym := v.Aux + _ = v.Args[1] + ptr1 := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpS390XMOVHstore || v_1.AuxInt != off || v_1.Aux != sym { break } - d := v_0.AuxInt - x := v_0.Args[0] - if !(is20Bit(c+d) && x.Op != OpSB) { + _ = v_1.Args[2] + ptr2 := v_1.Args[0] + x := v_1.Args[1] + if !(isSamePtr(ptr1, ptr2)) { break } - v.reset(OpS390XMOVDaddridx) - v.AuxInt = c + d - v.Aux = s + v.reset(OpS390XMOVHZreg) v.AddArg(x) - v.AddArg(y) return true } - // match: (MOVDaddridx [c] {s} x (ADDconst [d] y)) - // cond: is20Bit(c+d) && y.Op != OpSB - // result: (MOVDaddridx [c+d] {s} x y) + // match: (MOVHZload [off1] {sym} (ADDconst [off2] ptr) mem) + // cond: is20Bit(off1+off2) + // result: (MOVHZload [off1+off2] {sym} ptr mem) for { - c := v.AuxInt - s := v.Aux - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XADDconst { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpS390XADDconst { break } - d := v_1.AuxInt - y := v_1.Args[0] - if !(is20Bit(c+d) && y.Op != OpSB) { + off2 := v_0.AuxInt + ptr := v_0.Args[0] + if !(is20Bit(off1 + off2)) { break } - v.reset(OpS390XMOVDaddridx) - v.AuxInt = c + d - v.Aux = s - v.AddArg(x) - v.AddArg(y) + v.reset(OpS390XMOVHZload) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(ptr) + v.AddArg(mem) return true } - // match: (MOVDaddridx [off1] {sym1} (MOVDaddr [off2] {sym2} x) y) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB - // result: (MOVDaddridx [off1+off2] {mergeSym(sym1,sym2)} x y) + // match: (MOVHZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0)) + // result: (MOVHZload [off1+off2] {mergeSym(sym1,sym2)} base mem) for { off1 := v.AuxInt sym1 := v.Aux - y := v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddr { break } + t := v_0.Type off2 := v_0.AuxInt sym2 := v_0.Aux - x := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { + base := v_0.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { break } - v.reset(OpS390XMOVDaddridx) + v.reset(OpS390XMOVHZload) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) - v.AddArg(x) - v.AddArg(y) + v.AddArg(base) + v.AddArg(mem) return true } - // match: (MOVDaddridx [off1] {sym1} x (MOVDaddr [off2] {sym2} y)) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && y.Op != OpSB - // result: (MOVDaddridx [off1+off2] {mergeSym(sym1,sym2)} x y) + // match: (MOVHZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (MOVHZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDaddr { + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpS390XMOVDaddridx { break } - off2 := v_1.AuxInt - sym2 := v_1.Aux - y := v_1.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && y.Op != OpSB) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + idx := v_0.Args[1] + ptr := v_0.Args[0] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(OpS390XMOVDaddridx) + v.reset(OpS390XMOVHZloadidx) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) - v.AddArg(x) - v.AddArg(y) + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) return true } - return false -} -func rewriteValueS390X_OpS390XMOVDload_0(v *Value) bool { - // match: (MOVDload [off] {sym} ptr1 (MOVDstore [off] {sym} ptr2 x _)) - // cond: isSamePtr(ptr1, ptr2) - // result: x + // match: (MOVHZload [off] {sym} (ADD ptr idx) mem) + // cond: ptr.Op != OpSB + // result: (MOVHZloadidx [off] {sym} ptr idx mem) for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] - ptr1 := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDstore || v_1.AuxInt != off || v_1.Aux != sym { + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpS390XADD { break } - _ = v_1.Args[2] - ptr2 := v_1.Args[0] - x := v_1.Args[1] - if !(isSamePtr(ptr1, ptr2)) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + if !(ptr.Op != OpSB) { + continue + } + v.reset(OpS390XMOVHZloadidx) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true + break } - // match: (MOVDload [off] {sym} ptr1 (FMOVDstore [off] {sym} ptr2 x _)) - // cond: isSamePtr(ptr1, ptr2) - // result: (LGDR x) + return false +} +func rewriteValueS390X_OpS390XMOVHZloadidx_0(v *Value) bool { + // match: (MOVHZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) + // cond: is20Bit(c+d) + // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) for { - off := v.AuxInt + c := v.AuxInt sym := v.Aux - _ = v.Args[1] - ptr1 := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XFMOVDstore || v_1.AuxInt != off || v_1.Aux != sym { + mem := v.Args[2] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpS390XADDconst { + continue + } + d := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1^_i0] + if !(is20Bit(c + d)) { + continue + } + v.reset(OpS390XMOVHZloadidx) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + break + } + // match: (MOVHZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) + // cond: is20Bit(c+d) + // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) + for { + c := v.AuxInt + sym := v.Aux + mem := v.Args[2] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XADDconst { + continue + } + d := v_1.AuxInt + idx := v_1.Args[0] + if !(is20Bit(c + d)) { + continue + } + v.reset(OpS390XMOVHZloadidx) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true + } + break + } + return false +} +func rewriteValueS390X_OpS390XMOVHZreg_0(v *Value) bool { + b := v.Block + // match: (MOVHZreg e:(MOVBZreg x)) + // cond: clobberIfDead(e) + // result: (MOVBZreg x) + for { + e := v.Args[0] + if e.Op != OpS390XMOVBZreg { break } - _ = v_1.Args[2] - ptr2 := v_1.Args[0] - x := v_1.Args[1] - if !(isSamePtr(ptr1, ptr2)) { + x := e.Args[0] + if !(clobberIfDead(e)) { break } - v.reset(OpS390XLGDR) + v.reset(OpS390XMOVBZreg) v.AddArg(x) return true } - // match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) - // cond: is20Bit(off1+off2) - // result: (MOVDload [off1+off2] {sym} ptr mem) + // match: (MOVHZreg e:(MOVHreg x)) + // cond: clobberIfDead(e) + // result: (MOVHZreg x) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { + e := v.Args[0] + if e.Op != OpS390XMOVHreg { break } - off2 := v_0.AuxInt - ptr := v_0.Args[0] - if !(is20Bit(off1 + off2)) { + x := e.Args[0] + if !(clobberIfDead(e)) { break } - v.reset(OpS390XMOVDload) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(ptr) - v.AddArg(mem) + v.reset(OpS390XMOVHZreg) + v.AddArg(x) return true } - // match: (MOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0)) - // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem) + // match: (MOVHZreg e:(MOVWreg x)) + // cond: clobberIfDead(e) + // result: (MOVHZreg x) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDaddr { + e := v.Args[0] + if e.Op != OpS390XMOVWreg { break } - t := v_0.Type - off2 := v_0.AuxInt - sym2 := v_0.Aux - base := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0))) { + x := e.Args[0] + if !(clobberIfDead(e)) { break } - v.reset(OpS390XMOVDload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(base) - v.AddArg(mem) + v.reset(OpS390XMOVHZreg) + v.AddArg(x) return true } - // match: (MOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVDloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) + // match: (MOVHZreg e:(MOVHZreg x)) + // cond: clobberIfDead(e) + // result: (MOVHZreg x) for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDaddridx { + e := v.Args[0] + if e.Op != OpS390XMOVHZreg { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + x := e.Args[0] + if !(clobberIfDead(e)) { break } - v.reset(OpS390XMOVDloadidx) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + v.reset(OpS390XMOVHZreg) + v.AddArg(x) return true } - // match: (MOVDload [off] {sym} (ADD ptr idx) mem) - // cond: ptr.Op != OpSB - // result: (MOVDloadidx [off] {sym} ptr idx mem) + // match: (MOVHZreg e:(MOVWZreg x)) + // cond: clobberIfDead(e) + // result: (MOVHZreg x) for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XADD { + e := v.Args[0] + if e.Op != OpS390XMOVWZreg { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(ptr.Op != OpSB) { + x := e.Args[0] + if !(clobberIfDead(e)) { break } - v.reset(OpS390XMOVDloadidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + v.reset(OpS390XMOVHZreg) + v.AddArg(x) return true } - // match: (MOVDload [off] {sym} (ADD idx ptr) mem) - // cond: ptr.Op != OpSB - // result: (MOVDloadidx [off] {sym} ptr idx mem) + // match: (MOVHZreg x:(MOVBZload _ _)) + // cond: (!x.Type.IsSigned() || x.Type.Size() > 1) + // result: x for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XADD { + x := v.Args[0] + if x.Op != OpS390XMOVBZload { break } - ptr := v_0.Args[1] - idx := v_0.Args[0] - if !(ptr.Op != OpSB) { + _ = x.Args[1] + if !(!x.Type.IsSigned() || x.Type.Size() > 1) { break } - v.reset(OpS390XMOVDloadidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - return false -} -func rewriteValueS390X_OpS390XMOVDloadidx_0(v *Value) bool { - // match: (MOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) - // cond: is20Bit(c+d) - // result: (MOVDloadidx [c+d] {sym} ptr idx mem) + // match: (MOVHZreg x:(MOVBZloadidx _ _ _)) + // cond: (!x.Type.IsSigned() || x.Type.Size() > 1) + // result: x for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { + x := v.Args[0] + if x.Op != OpS390XMOVBZloadidx { break } - d := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - if !(is20Bit(c + d)) { + _ = x.Args[2] + if !(!x.Type.IsSigned() || x.Type.Size() > 1) { break } - v.reset(OpS390XMOVDloadidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (MOVDloadidx [c] {sym} idx (ADDconst [d] ptr) mem) - // cond: is20Bit(c+d) - // result: (MOVDloadidx [c+d] {sym} ptr idx mem) + // match: (MOVHZreg x:(MOVHZload _ _)) + // cond: (!x.Type.IsSigned() || x.Type.Size() > 2) + // result: x for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - idx := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XADDconst { + x := v.Args[0] + if x.Op != OpS390XMOVHZload { break } - d := v_1.AuxInt - ptr := v_1.Args[0] - if !(is20Bit(c + d)) { + _ = x.Args[1] + if !(!x.Type.IsSigned() || x.Type.Size() > 2) { break } - v.reset(OpS390XMOVDloadidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (MOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) - // cond: is20Bit(c+d) - // result: (MOVDloadidx [c+d] {sym} ptr idx mem) + // match: (MOVHZreg x:(MOVHZloadidx _ _ _)) + // cond: (!x.Type.IsSigned() || x.Type.Size() > 2) + // result: x for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XADDconst { + x := v.Args[0] + if x.Op != OpS390XMOVHZloadidx { break } - d := v_1.AuxInt - idx := v_1.Args[0] - if !(is20Bit(c + d)) { + _ = x.Args[2] + if !(!x.Type.IsSigned() || x.Type.Size() > 2) { break } - v.reset(OpS390XMOVDloadidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (MOVDloadidx [c] {sym} (ADDconst [d] idx) ptr mem) - // cond: is20Bit(c+d) - // result: (MOVDloadidx [c+d] {sym} ptr idx mem) + // match: (MOVHZreg x:(MOVHload [o] {s} p mem)) + // cond: x.Uses == 1 && clobber(x) + // result: @x.Block (MOVHZload [o] {s} p mem) for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { + t := v.Type + x := v.Args[0] + if x.Op != OpS390XMOVHload { break } - d := v_0.AuxInt - idx := v_0.Args[0] - ptr := v.Args[1] - if !(is20Bit(c + d)) { + o := x.AuxInt + s := x.Aux + mem := x.Args[1] + p := x.Args[0] + if !(x.Uses == 1 && clobber(x)) { break } - v.reset(OpS390XMOVDloadidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) + b = x.Block + v0 := b.NewValue0(x.Pos, OpS390XMOVHZload, t) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = o + v0.Aux = s + v0.AddArg(p) + v0.AddArg(mem) return true } return false } -func rewriteValueS390X_OpS390XMOVDstore_0(v *Value) bool { - // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) - // cond: is20Bit(off1+off2) - // result: (MOVDstore [off1+off2] {sym} ptr val mem) +func rewriteValueS390X_OpS390XMOVHZreg_10(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (MOVHZreg x:(MOVHloadidx [o] {s} p i mem)) + // cond: x.Uses == 1 && clobber(x) + // result: @x.Block (MOVHZloadidx [o] {s} p i mem) + for { + t := v.Type + x := v.Args[0] + if x.Op != OpS390XMOVHloadidx { + break + } + o := x.AuxInt + s := x.Aux + mem := x.Args[2] + p := x.Args[0] + i := x.Args[1] + if !(x.Uses == 1 && clobber(x)) { + break + } + b = x.Block + v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, t) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = o + v0.Aux = s + v0.AddArg(p) + v0.AddArg(i) + v0.AddArg(mem) + return true + } + // match: (MOVHZreg x:(Arg )) + // cond: !t.IsSigned() && t.Size() <= 2 + // result: x + for { + x := v.Args[0] + if x.Op != OpArg { + break + } + t := x.Type + if !(!t.IsSigned() && t.Size() <= 2) { + break + } + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + // match: (MOVHZreg (MOVDconst [c])) + // result: (MOVDconst [int64(uint16(c))]) for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { + if v_0.Op != OpS390XMOVDconst { break } - off2 := v_0.AuxInt - ptr := v_0.Args[0] - val := v.Args[1] - if !(is20Bit(off1 + off2)) { + c := v_0.AuxInt + v.reset(OpS390XMOVDconst) + v.AuxInt = int64(uint16(c)) + return true + } + // match: (MOVHZreg (ANDWconst [m] x)) + // result: (MOVWZreg (ANDWconst [int64(uint16(m))] x)) + for { + v_0 := v.Args[0] + if v_0.Op != OpS390XANDWconst { break } - v.reset(OpS390XMOVDstore) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(ptr) - v.AddArg(val) - v.AddArg(mem) + m := v_0.AuxInt + x := v_0.Args[0] + v.reset(OpS390XMOVWZreg) + v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) + v0.AuxInt = int64(uint16(m)) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (MOVDstore [off] {sym} ptr (MOVDconst [c]) mem) - // cond: is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB - // result: (MOVDstoreconst [makeValAndOff(c,off)] {sym} ptr mem) + return false +} +func rewriteValueS390X_OpS390XMOVHload_0(v *Value) bool { + // match: (MOVHload [off] {sym} ptr1 (MOVHstore [off] {sym} ptr2 x _)) + // cond: isSamePtr(ptr1, ptr2) + // result: (MOVHreg x) for { off := v.AuxInt sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] + _ = v.Args[1] + ptr1 := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDconst { + if v_1.Op != OpS390XMOVHstore || v_1.AuxInt != off || v_1.Aux != sym { break } - c := v_1.AuxInt - if !(is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB) { + _ = v_1.Args[2] + ptr2 := v_1.Args[0] + x := v_1.Args[1] + if !(isSamePtr(ptr1, ptr2)) { break } - v.reset(OpS390XMOVDstoreconst) - v.AuxInt = makeValAndOff(c, off) + v.reset(OpS390XMOVHreg) + v.AddArg(x) + return true + } + // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) + // cond: is20Bit(off1+off2) + // result: (MOVHload [off1+off2] {sym} ptr mem) + for { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpS390XADDconst { + break + } + off2 := v_0.AuxInt + ptr := v_0.Args[0] + if !(is20Bit(off1 + off2)) { + break + } + v.reset(OpS390XMOVHload) + v.AuxInt = off1 + off2 v.Aux = sym v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0)) - // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) + // match: (MOVHload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0)) + // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} base mem) for { off1 := v.AuxInt sym1 := v.Aux - mem := v.Args[2] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddr { break @@ -13626,25 +13150,23 @@ func rewriteValueS390X_OpS390XMOVDstore_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0))) { + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { break } - v.reset(OpS390XMOVDstore) + v.reset(OpS390XMOVHload) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) v.AddArg(base) - v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) + // match: (MOVHload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVDstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) + // result: (MOVHloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) for { off1 := v.AuxInt sym1 := v.Aux - mem := v.Args[2] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddridx { break @@ -13653,1012 +13175,1160 @@ func rewriteValueS390X_OpS390XMOVDstore_0(v *Value) bool { sym2 := v_0.Aux idx := v_0.Args[1] ptr := v_0.Args[0] - val := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(OpS390XMOVDstoreidx) + v.reset(OpS390XMOVHloadidx) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) v.AddArg(ptr) v.AddArg(idx) - v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVDstore [off] {sym} (ADD ptr idx) val mem) + // match: (MOVHload [off] {sym} (ADD ptr idx) mem) // cond: ptr.Op != OpSB - // result: (MOVDstoreidx [off] {sym} ptr idx val mem) + // result: (MOVHloadidx [off] {sym} ptr idx mem) for { off := v.AuxInt sym := v.Aux - mem := v.Args[2] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XADD { break } - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + if !(ptr.Op != OpSB) { + continue + } + v.reset(OpS390XMOVHloadidx) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpS390XMOVDstoreidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true + break } - // match: (MOVDstore [off] {sym} (ADD idx ptr) val mem) - // cond: ptr.Op != OpSB - // result: (MOVDstoreidx [off] {sym} ptr idx val mem) + return false +} +func rewriteValueS390X_OpS390XMOVHloadidx_0(v *Value) bool { + // match: (MOVHloadidx [c] {sym} (ADDconst [d] ptr) idx mem) + // cond: is20Bit(c+d) + // result: (MOVHloadidx [c+d] {sym} ptr idx mem) for { - off := v.AuxInt + c := v.AuxInt sym := v.Aux mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpS390XADD { - break - } - ptr := v_0.Args[1] - idx := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpS390XADDconst { + continue + } + d := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1^_i0] + if !(is20Bit(c + d)) { + continue + } + v.reset(OpS390XMOVHloadidx) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpS390XMOVDstoreidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true + break } - // match: (MOVDstore [i] {s} p w1 x:(MOVDstore [i-8] {s} p w0 mem)) - // cond: p.Op != OpSB && x.Uses == 1 && is20Bit(i-8) && clobber(x) - // result: (STMG2 [i-8] {s} p w0 w1 mem) + // match: (MOVHloadidx [c] {sym} ptr (ADDconst [d] idx) mem) + // cond: is20Bit(c+d) + // result: (MOVHloadidx [c+d] {sym} ptr idx mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - p := v.Args[0] - w1 := v.Args[1] - x := v.Args[2] - if x.Op != OpS390XMOVDstore || x.AuxInt != i-8 || x.Aux != s { - break + c := v.AuxInt + sym := v.Aux + mem := v.Args[2] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XADDconst { + continue + } + d := v_1.AuxInt + idx := v_1.Args[0] + if !(is20Bit(c + d)) { + continue + } + v.reset(OpS390XMOVHloadidx) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - mem := x.Args[2] - if p != x.Args[0] { + break + } + return false +} +func rewriteValueS390X_OpS390XMOVHreg_0(v *Value) bool { + // match: (MOVHreg e:(MOVBreg x)) + // cond: clobberIfDead(e) + // result: (MOVBreg x) + for { + e := v.Args[0] + if e.Op != OpS390XMOVBreg { break } - w0 := x.Args[1] - if !(p.Op != OpSB && x.Uses == 1 && is20Bit(i-8) && clobber(x)) { + x := e.Args[0] + if !(clobberIfDead(e)) { break } - v.reset(OpS390XSTMG2) - v.AuxInt = i - 8 - v.Aux = s - v.AddArg(p) - v.AddArg(w0) - v.AddArg(w1) - v.AddArg(mem) + v.reset(OpS390XMOVBreg) + v.AddArg(x) return true } - // match: (MOVDstore [i] {s} p w2 x:(STMG2 [i-16] {s} p w0 w1 mem)) - // cond: x.Uses == 1 && is20Bit(i-16) && clobber(x) - // result: (STMG3 [i-16] {s} p w0 w1 w2 mem) + // match: (MOVHreg e:(MOVHreg x)) + // cond: clobberIfDead(e) + // result: (MOVHreg x) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - p := v.Args[0] - w2 := v.Args[1] - x := v.Args[2] - if x.Op != OpS390XSTMG2 || x.AuxInt != i-16 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] { + e := v.Args[0] + if e.Op != OpS390XMOVHreg { break } - w0 := x.Args[1] - w1 := x.Args[2] - if !(x.Uses == 1 && is20Bit(i-16) && clobber(x)) { + x := e.Args[0] + if !(clobberIfDead(e)) { break } - v.reset(OpS390XSTMG3) - v.AuxInt = i - 16 - v.Aux = s - v.AddArg(p) - v.AddArg(w0) - v.AddArg(w1) - v.AddArg(w2) - v.AddArg(mem) + v.reset(OpS390XMOVHreg) + v.AddArg(x) return true } - // match: (MOVDstore [i] {s} p w3 x:(STMG3 [i-24] {s} p w0 w1 w2 mem)) - // cond: x.Uses == 1 && is20Bit(i-24) && clobber(x) - // result: (STMG4 [i-24] {s} p w0 w1 w2 w3 mem) + // match: (MOVHreg e:(MOVWreg x)) + // cond: clobberIfDead(e) + // result: (MOVHreg x) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - p := v.Args[0] - w3 := v.Args[1] - x := v.Args[2] - if x.Op != OpS390XSTMG3 || x.AuxInt != i-24 || x.Aux != s { - break - } - mem := x.Args[4] - if p != x.Args[0] { + e := v.Args[0] + if e.Op != OpS390XMOVWreg { break } - w0 := x.Args[1] - w1 := x.Args[2] - w2 := x.Args[3] - if !(x.Uses == 1 && is20Bit(i-24) && clobber(x)) { + x := e.Args[0] + if !(clobberIfDead(e)) { break } - v.reset(OpS390XSTMG4) - v.AuxInt = i - 24 - v.Aux = s - v.AddArg(p) - v.AddArg(w0) - v.AddArg(w1) - v.AddArg(w2) - v.AddArg(w3) - v.AddArg(mem) + v.reset(OpS390XMOVHreg) + v.AddArg(x) return true } - return false -} -func rewriteValueS390X_OpS390XMOVDstoreconst_0(v *Value) bool { - // match: (MOVDstoreconst [sc] {s} (ADDconst [off] ptr) mem) - // cond: isU12Bit(ValAndOff(sc).Off()+off) - // result: (MOVDstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) + // match: (MOVHreg e:(MOVHZreg x)) + // cond: clobberIfDead(e) + // result: (MOVHreg x) for { - sc := v.AuxInt - s := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { + e := v.Args[0] + if e.Op != OpS390XMOVHZreg { break } - off := v_0.AuxInt - ptr := v_0.Args[0] - if !(isU12Bit(ValAndOff(sc).Off() + off)) { + x := e.Args[0] + if !(clobberIfDead(e)) { break } - v.reset(OpS390XMOVDstoreconst) - v.AuxInt = ValAndOff(sc).add(off) - v.Aux = s - v.AddArg(ptr) - v.AddArg(mem) + v.reset(OpS390XMOVHreg) + v.AddArg(x) return true } - // match: (MOVDstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) - // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) - // result: (MOVDstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) + // match: (MOVHreg e:(MOVWZreg x)) + // cond: clobberIfDead(e) + // result: (MOVHreg x) for { - sc := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDaddr { + e := v.Args[0] + if e.Op != OpS390XMOVWZreg { break } - off := v_0.AuxInt - sym2 := v_0.Aux - ptr := v_0.Args[0] - if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { + x := e.Args[0] + if !(clobberIfDead(e)) { break } - v.reset(OpS390XMOVDstoreconst) - v.AuxInt = ValAndOff(sc).add(off) - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(mem) + v.reset(OpS390XMOVHreg) + v.AddArg(x) return true } - return false -} -func rewriteValueS390X_OpS390XMOVDstoreidx_0(v *Value) bool { - // match: (MOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) - // cond: is20Bit(c+d) - // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) + // match: (MOVHreg x:(MOVBload _ _)) + // cond: (x.Type.IsSigned() || x.Type.Size() == 8) + // result: x for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[3] - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { + x := v.Args[0] + if x.Op != OpS390XMOVBload { break } - d := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - val := v.Args[2] - if !(is20Bit(c + d)) { + _ = x.Args[1] + if !(x.Type.IsSigned() || x.Type.Size() == 8) { break } - v.reset(OpS390XMOVDstoreidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (MOVDstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) - // cond: is20Bit(c+d) - // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) + // match: (MOVHreg x:(MOVBloadidx _ _ _)) + // cond: (x.Type.IsSigned() || x.Type.Size() == 8) + // result: x for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[3] - idx := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XADDconst { + x := v.Args[0] + if x.Op != OpS390XMOVBloadidx { break } - d := v_1.AuxInt - ptr := v_1.Args[0] - val := v.Args[2] - if !(is20Bit(c + d)) { + _ = x.Args[2] + if !(x.Type.IsSigned() || x.Type.Size() == 8) { break } - v.reset(OpS390XMOVDstoreidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (MOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) - // cond: is20Bit(c+d) - // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) + // match: (MOVHreg x:(MOVHload _ _)) + // cond: (x.Type.IsSigned() || x.Type.Size() == 8) + // result: x for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[3] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XADDconst { + x := v.Args[0] + if x.Op != OpS390XMOVHload { break } - d := v_1.AuxInt - idx := v_1.Args[0] - val := v.Args[2] - if !(is20Bit(c + d)) { + _ = x.Args[1] + if !(x.Type.IsSigned() || x.Type.Size() == 8) { break } - v.reset(OpS390XMOVDstoreidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (MOVDstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) - // cond: is20Bit(c+d) - // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) + // match: (MOVHreg x:(MOVHloadidx _ _ _)) + // cond: (x.Type.IsSigned() || x.Type.Size() == 8) + // result: x for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[3] - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { + x := v.Args[0] + if x.Op != OpS390XMOVHloadidx { break } - d := v_0.AuxInt - idx := v_0.Args[0] - ptr := v.Args[1] - val := v.Args[2] - if !(is20Bit(c + d)) { + _ = x.Args[2] + if !(x.Type.IsSigned() || x.Type.Size() == 8) { break } - v.reset(OpS390XMOVDstoreidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - return false -} -func rewriteValueS390X_OpS390XMOVHBRstore_0(v *Value) bool { - // match: (MOVHBRstore [i] {s} p (SRDconst [16] w) x:(MOVHBRstore [i-2] {s} p w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWBRstore [i-2] {s} p w mem) + // match: (MOVHreg x:(MOVBZload _ _)) + // cond: (!x.Type.IsSigned() || x.Type.Size() > 1) + // result: x for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - p := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XSRDconst || v_1.AuxInt != 16 { - break - } - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpS390XMOVHBRstore || x.AuxInt != i-2 || x.Aux != s { + x := v.Args[0] + if x.Op != OpS390XMOVBZload { break } - mem := x.Args[2] - if p != x.Args[0] || w != x.Args[1] || !(x.Uses == 1 && clobber(x)) { + _ = x.Args[1] + if !(!x.Type.IsSigned() || x.Type.Size() > 1) { break } - v.reset(OpS390XMOVWBRstore) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(w) - v.AddArg(mem) + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (MOVHBRstore [i] {s} p (SRDconst [j] w) x:(MOVHBRstore [i-2] {s} p w0:(SRDconst [j-16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWBRstore [i-2] {s} p w0 mem) + return false +} +func rewriteValueS390X_OpS390XMOVHreg_10(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (MOVHreg x:(MOVBZloadidx _ _ _)) + // cond: (!x.Type.IsSigned() || x.Type.Size() > 1) + // result: x for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - p := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XSRDconst { - break - } - j := v_1.AuxInt - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpS390XMOVHBRstore || x.AuxInt != i-2 || x.Aux != s { - break - } - mem := x.Args[2] - if p != x.Args[0] { + x := v.Args[0] + if x.Op != OpS390XMOVBZloadidx { break } - w0 := x.Args[1] - if w0.Op != OpS390XSRDconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + _ = x.Args[2] + if !(!x.Type.IsSigned() || x.Type.Size() > 1) { break } - v.reset(OpS390XMOVWBRstore) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(w0) - v.AddArg(mem) + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (MOVHBRstore [i] {s} p (SRWconst [16] w) x:(MOVHBRstore [i-2] {s} p w mem)) + // match: (MOVHreg x:(MOVHZload [o] {s} p mem)) // cond: x.Uses == 1 && clobber(x) - // result: (MOVWBRstore [i-2] {s} p w mem) + // result: @x.Block (MOVHload [o] {s} p mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - p := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XSRWconst || v_1.AuxInt != 16 { - break - } - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpS390XMOVHBRstore || x.AuxInt != i-2 || x.Aux != s { + t := v.Type + x := v.Args[0] + if x.Op != OpS390XMOVHZload { break } - mem := x.Args[2] - if p != x.Args[0] || w != x.Args[1] || !(x.Uses == 1 && clobber(x)) { + o := x.AuxInt + s := x.Aux + mem := x.Args[1] + p := x.Args[0] + if !(x.Uses == 1 && clobber(x)) { break } - v.reset(OpS390XMOVWBRstore) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(w) - v.AddArg(mem) + b = x.Block + v0 := b.NewValue0(x.Pos, OpS390XMOVHload, t) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = o + v0.Aux = s + v0.AddArg(p) + v0.AddArg(mem) return true } - // match: (MOVHBRstore [i] {s} p (SRWconst [j] w) x:(MOVHBRstore [i-2] {s} p w0:(SRWconst [j-16] w) mem)) + // match: (MOVHreg x:(MOVHZloadidx [o] {s} p i mem)) // cond: x.Uses == 1 && clobber(x) - // result: (MOVWBRstore [i-2] {s} p w0 mem) + // result: @x.Block (MOVHloadidx [o] {s} p i mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - p := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XSRWconst { - break - } - j := v_1.AuxInt - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpS390XMOVHBRstore || x.AuxInt != i-2 || x.Aux != s { + t := v.Type + x := v.Args[0] + if x.Op != OpS390XMOVHZloadidx { break } + o := x.AuxInt + s := x.Aux mem := x.Args[2] - if p != x.Args[0] { - break - } - w0 := x.Args[1] - if w0.Op != OpS390XSRWconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + p := x.Args[0] + i := x.Args[1] + if !(x.Uses == 1 && clobber(x)) { break } - v.reset(OpS390XMOVWBRstore) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(w0) - v.AddArg(mem) + b = x.Block + v0 := b.NewValue0(v.Pos, OpS390XMOVHloadidx, t) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = o + v0.Aux = s + v0.AddArg(p) + v0.AddArg(i) + v0.AddArg(mem) return true } - return false -} -func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool { - // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) + // match: (MOVHreg x:(Arg )) + // cond: t.IsSigned() && t.Size() <= 2 + // result: x for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRDconst || v_2.AuxInt != 16 { - break - } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVHBRstoreidx || x.AuxInt != i-2 || x.Aux != s { + x := v.Args[0] + if x.Op != OpArg { break } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + t := x.Type + if !(t.IsSigned() && t.Size() <= 2) { break } - v.reset(OpS390XMOVWBRstoreidx) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) + // match: (MOVHreg (MOVDconst [c])) + // result: (MOVDconst [int64(int16(c))]) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRDconst || v_2.AuxInt != 16 { + v_0 := v.Args[0] + if v_0.Op != OpS390XMOVDconst { break } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVHBRstoreidx || x.AuxInt != i-2 || x.Aux != s { + c := v_0.AuxInt + v.reset(OpS390XMOVDconst) + v.AuxInt = int64(int16(c)) + return true + } + // match: (MOVHreg (ANDWconst [m] x)) + // cond: int16(m) >= 0 + // result: (MOVWZreg (ANDWconst [int64(uint16(m))] x)) + for { + v_0 := v.Args[0] + if v_0.Op != OpS390XANDWconst { break } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + m := v_0.AuxInt + x := v_0.Args[0] + if !(int16(m) >= 0) { break } - v.reset(OpS390XMOVWBRstoreidx) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) + v.reset(OpS390XMOVWZreg) + v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) + v0.AuxInt = int64(uint16(m)) + v0.AddArg(x) + v.AddArg(v0) + return true + } + return false +} +func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { + // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem) + // result: (MOVHstore [off] {sym} ptr x mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpS390XMOVHreg { + break + } + x := v_1.Args[0] + v.reset(OpS390XMOVHstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(x) v.AddArg(mem) return true } - // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) + // match: (MOVHstore [off] {sym} ptr (MOVHZreg x) mem) + // result: (MOVHstore [off] {sym} ptr x mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRDconst || v_2.AuxInt != 16 { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpS390XMOVHZreg { break } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVHBRstoreidx || x.AuxInt != i-2 || x.Aux != s { + x := v_1.Args[0] + v.reset(OpS390XMOVHstore) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(x) + v.AddArg(mem) + return true + } + // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) + // cond: is20Bit(off1+off2) + // result: (MOVHstore [off1+off2] {sym} ptr val mem) + for { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpS390XADDconst { break } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + off2 := v_0.AuxInt + ptr := v_0.Args[0] + val := v.Args[1] + if !(is20Bit(off1 + off2)) { break } - v.reset(OpS390XMOVWBRstoreidx) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) + v.reset(OpS390XMOVHstore) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(ptr) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) + // match: (MOVHstore [off] {sym} ptr (MOVDconst [c]) mem) + // cond: isU12Bit(off) && ptr.Op != OpSB + // result: (MOVHstoreconst [makeValAndOff(int64(int16(c)),off)] {sym} ptr mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRDconst || v_2.AuxInt != 16 { - break - } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVHBRstoreidx || x.AuxInt != i-2 || x.Aux != s { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + ptr := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpS390XMOVDconst { break } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + c := v_1.AuxInt + if !(isU12Bit(off) && ptr.Op != OpSB) { break } - v.reset(OpS390XMOVWBRstoreidx) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) + v.reset(OpS390XMOVHstoreconst) + v.AuxInt = makeValAndOff(int64(int16(c)), off) + v.Aux = sym + v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRDconst [j-16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) + // match: (MOVHstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0)) + // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRDconst { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpS390XMOVDaddr { break } - j := v_2.AuxInt - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVHBRstoreidx || x.AuxInt != i-2 || x.Aux != s { + t := v_0.Type + off2 := v_0.AuxInt + sym2 := v_0.Aux + base := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { break } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { + v.reset(OpS390XMOVHstore) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(base) + v.AddArg(val) + v.AddArg(mem) + return true + } + // match: (MOVHstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) + // result: (MOVHstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) + for { + off1 := v.AuxInt + sym1 := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpS390XMOVDaddridx { break } - w0 := x.Args[2] - if w0.Op != OpS390XSRDconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + off2 := v_0.AuxInt + sym2 := v_0.Aux + idx := v_0.Args[1] + ptr := v_0.Args[0] + val := v.Args[1] + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(OpS390XMOVWBRstoreidx) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) + v.reset(OpS390XMOVHstoreidx) + v.AuxInt = off1 + off2 + v.Aux = mergeSym(sym1, sym2) + v.AddArg(ptr) v.AddArg(idx) - v.AddArg(w0) + v.AddArg(val) v.AddArg(mem) return true } - // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRDconst [j-16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) + // match: (MOVHstore [off] {sym} (ADD ptr idx) val mem) + // cond: ptr.Op != OpSB + // result: (MOVHstoreidx [off] {sym} ptr idx val mem) + for { + off := v.AuxInt + sym := v.Aux + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpS390XADD { + break + } + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + val := v.Args[1] + if !(ptr.Op != OpSB) { + continue + } + v.reset(OpS390XMOVHstoreidx) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true + } + break + } + // match: (MOVHstore [i] {s} p w x:(MOVHstore [i-2] {s} p (SRDconst [16] w) mem)) + // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) + // result: (MOVWstore [i-2] {s} p w mem) for { i := v.AuxInt s := v.Aux - _ = v.Args[3] + _ = v.Args[2] p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRDconst { - break - } - j := v_2.AuxInt - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVHBRstoreidx || x.AuxInt != i-2 || x.Aux != s { + w := v.Args[1] + x := v.Args[2] + if x.Op != OpS390XMOVHstore || x.AuxInt != i-2 || x.Aux != s { break } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { + mem := x.Args[2] + if p != x.Args[0] { break } - w0 := x.Args[2] - if w0.Op != OpS390XSRDconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + x_1 := x.Args[1] + if x_1.Op != OpS390XSRDconst || x_1.AuxInt != 16 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } - v.reset(OpS390XMOVWBRstoreidx) + v.reset(OpS390XMOVWstore) v.AuxInt = i - 2 v.Aux = s v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) + v.AddArg(w) v.AddArg(mem) return true } - // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRDconst [j-16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) + // match: (MOVHstore [i] {s} p w0:(SRDconst [j] w) x:(MOVHstore [i-2] {s} p (SRDconst [j+16] w) mem)) + // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) + // result: (MOVWstore [i-2] {s} p w0 mem) for { i := v.AuxInt s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRDconst { + _ = v.Args[2] + p := v.Args[0] + w0 := v.Args[1] + if w0.Op != OpS390XSRDconst { break } - j := v_2.AuxInt - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVHBRstoreidx || x.AuxInt != i-2 || x.Aux != s { + j := w0.AuxInt + w := w0.Args[0] + x := v.Args[2] + if x.Op != OpS390XMOVHstore || x.AuxInt != i-2 || x.Aux != s { break } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { + mem := x.Args[2] + if p != x.Args[0] { break } - w0 := x.Args[2] - if w0.Op != OpS390XSRDconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + x_1 := x.Args[1] + if x_1.Op != OpS390XSRDconst || x_1.AuxInt != j+16 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } - v.reset(OpS390XMOVWBRstoreidx) + v.reset(OpS390XMOVWstore) v.AuxInt = i - 2 v.Aux = s v.AddArg(p) - v.AddArg(idx) v.AddArg(w0) v.AddArg(mem) return true } - // match: (MOVHBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRDconst [j-16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) + // match: (MOVHstore [i] {s} p w x:(MOVHstore [i-2] {s} p (SRWconst [16] w) mem)) + // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) + // result: (MOVWstore [i-2] {s} p w mem) for { i := v.AuxInt s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRDconst { - break - } - j := v_2.AuxInt - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVHBRstoreidx || x.AuxInt != i-2 || x.Aux != s { + _ = v.Args[2] + p := v.Args[0] + w := v.Args[1] + x := v.Args[2] + if x.Op != OpS390XMOVHstore || x.AuxInt != i-2 || x.Aux != s { break } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { + mem := x.Args[2] + if p != x.Args[0] { break } - w0 := x.Args[2] - if w0.Op != OpS390XSRDconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + x_1 := x.Args[1] + if x_1.Op != OpS390XSRWconst || x_1.AuxInt != 16 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } - v.reset(OpS390XMOVWBRstoreidx) + v.reset(OpS390XMOVWstore) v.AuxInt = i - 2 v.Aux = s v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) + v.AddArg(w) v.AddArg(mem) return true } - // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) + return false +} +func rewriteValueS390X_OpS390XMOVHstore_10(v *Value) bool { + // match: (MOVHstore [i] {s} p w0:(SRWconst [j] w) x:(MOVHstore [i-2] {s} p (SRWconst [j+16] w) mem)) + // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) + // result: (MOVWstore [i-2] {s} p w0 mem) for { i := v.AuxInt s := v.Aux - _ = v.Args[3] + _ = v.Args[2] p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRWconst || v_2.AuxInt != 16 { + w0 := v.Args[1] + if w0.Op != OpS390XSRWconst { break } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVHBRstoreidx || x.AuxInt != i-2 || x.Aux != s { + j := w0.AuxInt + w := w0.Args[0] + x := v.Args[2] + if x.Op != OpS390XMOVHstore || x.AuxInt != i-2 || x.Aux != s { break } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + mem := x.Args[2] + if p != x.Args[0] { + break + } + x_1 := x.Args[1] + if x_1.Op != OpS390XSRWconst || x_1.AuxInt != j+16 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } - v.reset(OpS390XMOVWBRstoreidx) + v.reset(OpS390XMOVWstore) v.AuxInt = i - 2 v.Aux = s v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) + v.AddArg(w0) v.AddArg(mem) return true } - // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) + return false +} +func rewriteValueS390X_OpS390XMOVHstoreconst_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (MOVHstoreconst [sc] {s} (ADDconst [off] ptr) mem) + // cond: isU12Bit(ValAndOff(sc).Off()+off) + // result: (MOVHstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) for { - i := v.AuxInt + sc := v.AuxInt s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRWconst || v_2.AuxInt != 16 { + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpS390XADDconst { break } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVHBRstoreidx || x.AuxInt != i-2 || x.Aux != s { + off := v_0.AuxInt + ptr := v_0.Args[0] + if !(isU12Bit(ValAndOff(sc).Off() + off)) { break } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + v.reset(OpS390XMOVHstoreconst) + v.AuxInt = ValAndOff(sc).add(off) + v.Aux = s + v.AddArg(ptr) + v.AddArg(mem) + return true + } + // match: (MOVHstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) + // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) + // result: (MOVHstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) + for { + sc := v.AuxInt + sym1 := v.Aux + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpS390XMOVDaddr { break } - v.reset(OpS390XMOVWBRstoreidx) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) + off := v_0.AuxInt + sym2 := v_0.Aux + ptr := v_0.Args[0] + if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { + break + } + v.reset(OpS390XMOVHstoreconst) + v.AuxInt = ValAndOff(sc).add(off) + v.Aux = mergeSym(sym1, sym2) + v.AddArg(ptr) v.AddArg(mem) return true } - return false -} -func rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v *Value) bool { - // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) + // match: (MOVHstoreconst [c] {s} p x:(MOVHstoreconst [a] {s} p mem)) + // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) + // result: (MOVWstore [ValAndOff(a).Off()] {s} p (MOVDconst [int64(int32(ValAndOff(c).Val()&0xffff | ValAndOff(a).Val()<<16))]) mem) for { - i := v.AuxInt + c := v.AuxInt s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRWconst || v_2.AuxInt != 16 { + _ = v.Args[1] + p := v.Args[0] + x := v.Args[1] + if x.Op != OpS390XMOVHstoreconst { break } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVHBRstoreidx || x.AuxInt != i-2 || x.Aux != s { + a := x.AuxInt + if x.Aux != s { break } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + mem := x.Args[1] + if p != x.Args[0] || !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { break } - v.reset(OpS390XMOVWBRstoreidx) - v.AuxInt = i - 2 + v.reset(OpS390XMOVWstore) + v.AuxInt = ValAndOff(a).Off() v.Aux = s v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) + v0 := b.NewValue0(x.Pos, OpS390XMOVDconst, typ.UInt64) + v0.AuxInt = int64(int32(ValAndOff(c).Val()&0xffff | ValAndOff(a).Val()<<16)) + v.AddArg(v0) v.AddArg(mem) return true } - // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} idx p w mem)) + return false +} +func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool { + // match: (MOVHstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) + // cond: is20Bit(c+d) + // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) + for { + c := v.AuxInt + sym := v.Aux + mem := v.Args[3] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpS390XADDconst { + continue + } + d := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1^_i0] + val := v.Args[2] + if !(is20Bit(c + d)) { + continue + } + v.reset(OpS390XMOVHstoreidx) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true + } + break + } + // match: (MOVHstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) + // cond: is20Bit(c+d) + // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) + for { + c := v.AuxInt + sym := v.Aux + mem := v.Args[3] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XADDconst { + continue + } + d := v_1.AuxInt + idx := v_1.Args[0] + val := v.Args[2] + if !(is20Bit(c + d)) { + continue + } + v.reset(OpS390XMOVHstoreidx) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true + } + break + } + // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [16] w) mem)) // cond: x.Uses == 1 && clobber(x) - // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) + // result: (MOVWstoreidx [i-2] {s} p idx w mem) for { i := v.AuxInt s := v.Aux _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRWconst || v_2.AuxInt != 16 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + idx := v.Args[1^_i0] + w := v.Args[2] + x := v.Args[3] + if x.Op != OpS390XMOVHstoreidx || x.AuxInt != i-2 || x.Aux != s { + continue + } + mem := x.Args[3] + for _i1 := 0; _i1 <= 1; _i1++ { + if p != x.Args[_i1] || idx != x.Args[1^_i1] { + continue + } + x_2 := x.Args[2] + if x_2.Op != OpS390XSRDconst || x_2.AuxInt != 16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + continue + } + v.reset(OpS390XMOVWstoreidx) + v.AuxInt = i - 2 + v.Aux = s + v.AddArg(p) + v.AddArg(idx) + v.AddArg(w) + v.AddArg(mem) + return true + } } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVHBRstoreidx || x.AuxInt != i-2 || x.Aux != s { - break + break + } + // match: (MOVHstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [j+16] w) mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) + for { + i := v.AuxInt + s := v.Aux + _ = v.Args[3] + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + idx := v.Args[1^_i0] + w0 := v.Args[2] + if w0.Op != OpS390XSRDconst { + continue + } + j := w0.AuxInt + w := w0.Args[0] + x := v.Args[3] + if x.Op != OpS390XMOVHstoreidx || x.AuxInt != i-2 || x.Aux != s { + continue + } + mem := x.Args[3] + for _i1 := 0; _i1 <= 1; _i1++ { + if p != x.Args[_i1] || idx != x.Args[1^_i1] { + continue + } + x_2 := x.Args[2] + if x_2.Op != OpS390XSRDconst || x_2.AuxInt != j+16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + continue + } + v.reset(OpS390XMOVWstoreidx) + v.AuxInt = i - 2 + v.Aux = s + v.AddArg(p) + v.AddArg(idx) + v.AddArg(w0) + v.AddArg(mem) + return true + } } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { - break + break + } + // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [16] w) mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVWstoreidx [i-2] {s} p idx w mem) + for { + i := v.AuxInt + s := v.Aux + _ = v.Args[3] + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + idx := v.Args[1^_i0] + w := v.Args[2] + x := v.Args[3] + if x.Op != OpS390XMOVHstoreidx || x.AuxInt != i-2 || x.Aux != s { + continue + } + mem := x.Args[3] + for _i1 := 0; _i1 <= 1; _i1++ { + if p != x.Args[_i1] || idx != x.Args[1^_i1] { + continue + } + x_2 := x.Args[2] + if x_2.Op != OpS390XSRWconst || x_2.AuxInt != 16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + continue + } + v.reset(OpS390XMOVWstoreidx) + v.AuxInt = i - 2 + v.Aux = s + v.AddArg(p) + v.AddArg(idx) + v.AddArg(w) + v.AddArg(mem) + return true + } } - v.reset(OpS390XMOVWBRstoreidx) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) - return true + break } - // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRWconst [j-16] w) mem)) + // match: (MOVHstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [j+16] w) mem)) // cond: x.Uses == 1 && clobber(x) - // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) + // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) for { i := v.AuxInt s := v.Aux _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRWconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + idx := v.Args[1^_i0] + w0 := v.Args[2] + if w0.Op != OpS390XSRWconst { + continue + } + j := w0.AuxInt + w := w0.Args[0] + x := v.Args[3] + if x.Op != OpS390XMOVHstoreidx || x.AuxInt != i-2 || x.Aux != s { + continue + } + mem := x.Args[3] + for _i1 := 0; _i1 <= 1; _i1++ { + if p != x.Args[_i1] || idx != x.Args[1^_i1] { + continue + } + x_2 := x.Args[2] + if x_2.Op != OpS390XSRWconst || x_2.AuxInt != j+16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + continue + } + v.reset(OpS390XMOVWstoreidx) + v.AuxInt = i - 2 + v.Aux = s + v.AddArg(p) + v.AddArg(idx) + v.AddArg(w0) + v.AddArg(mem) + return true + } } - j := v_2.AuxInt - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVHBRstoreidx || x.AuxInt != i-2 || x.Aux != s { + break + } + return false +} +func rewriteValueS390X_OpS390XMOVWBRstore_0(v *Value) bool { + // match: (MOVWBRstore [i] {s} p (SRDconst [32] w) x:(MOVWBRstore [i-4] {s} p w mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVDBRstore [i-4] {s} p w mem) + for { + i := v.AuxInt + s := v.Aux + _ = v.Args[2] + p := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpS390XSRDconst || v_1.AuxInt != 32 { break } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { + w := v_1.Args[0] + x := v.Args[2] + if x.Op != OpS390XMOVWBRstore || x.AuxInt != i-4 || x.Aux != s { break } - w0 := x.Args[2] - if w0.Op != OpS390XSRWconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + mem := x.Args[2] + if p != x.Args[0] || w != x.Args[1] || !(x.Uses == 1 && clobber(x)) { break } - v.reset(OpS390XMOVWBRstoreidx) - v.AuxInt = i - 2 + v.reset(OpS390XMOVDBRstore) + v.AuxInt = i - 4 v.Aux = s v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) + v.AddArg(w) v.AddArg(mem) return true } - // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRWconst [j-16] w) mem)) + // match: (MOVWBRstore [i] {s} p (SRDconst [j] w) x:(MOVWBRstore [i-4] {s} p w0:(SRDconst [j-32] w) mem)) // cond: x.Uses == 1 && clobber(x) - // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) + // result: (MOVDBRstore [i-4] {s} p w0 mem) for { i := v.AuxInt s := v.Aux - _ = v.Args[3] + _ = v.Args[2] p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRWconst { + v_1 := v.Args[1] + if v_1.Op != OpS390XSRDconst { break } - j := v_2.AuxInt - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVHBRstoreidx || x.AuxInt != i-2 || x.Aux != s { + j := v_1.AuxInt + w := v_1.Args[0] + x := v.Args[2] + if x.Op != OpS390XMOVWBRstore || x.AuxInt != i-4 || x.Aux != s { break } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { + mem := x.Args[2] + if p != x.Args[0] { break } - w0 := x.Args[2] - if w0.Op != OpS390XSRWconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + w0 := x.Args[1] + if w0.Op != OpS390XSRDconst || w0.AuxInt != j-32 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { break } - v.reset(OpS390XMOVWBRstoreidx) - v.AuxInt = i - 2 + v.reset(OpS390XMOVDBRstore) + v.AuxInt = i - 4 v.Aux = s v.AddArg(p) - v.AddArg(idx) v.AddArg(w0) v.AddArg(mem) return true } - // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRWconst [j-16] w) mem)) + return false +} +func rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v *Value) bool { + // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} p idx w mem)) // cond: x.Uses == 1 && clobber(x) - // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) + // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) for { i := v.AuxInt s := v.Aux _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRWconst { - break - } - j := v_2.AuxInt - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVHBRstoreidx || x.AuxInt != i-2 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { - break - } - w0 := x.Args[2] - if w0.Op != OpS390XSRWconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + idx := v.Args[1^_i0] + v_2 := v.Args[2] + if v_2.Op != OpS390XSRDconst || v_2.AuxInt != 32 { + continue + } + w := v_2.Args[0] + x := v.Args[3] + if x.Op != OpS390XMOVWBRstoreidx || x.AuxInt != i-4 || x.Aux != s { + continue + } + mem := x.Args[3] + for _i1 := 0; _i1 <= 1; _i1++ { + if p != x.Args[_i1] || idx != x.Args[1^_i1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { + continue + } + v.reset(OpS390XMOVDBRstoreidx) + v.AuxInt = i - 4 + v.Aux = s + v.AddArg(p) + v.AddArg(idx) + v.AddArg(w) + v.AddArg(mem) + return true + } } - v.reset(OpS390XMOVWBRstoreidx) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) - v.AddArg(mem) - return true + break } - // match: (MOVHBRstoreidx [i] {s} idx p (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} idx p w0:(SRWconst [j-16] w) mem)) + // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} p idx w0:(SRDconst [j-32] w) mem)) // cond: x.Uses == 1 && clobber(x) - // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) + // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) for { i := v.AuxInt s := v.Aux _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRWconst { - break - } - j := v_2.AuxInt - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVHBRstoreidx || x.AuxInt != i-2 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { - break - } - w0 := x.Args[2] - if w0.Op != OpS390XSRWconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + idx := v.Args[1^_i0] + v_2 := v.Args[2] + if v_2.Op != OpS390XSRDconst { + continue + } + j := v_2.AuxInt + w := v_2.Args[0] + x := v.Args[3] + if x.Op != OpS390XMOVWBRstoreidx || x.AuxInt != i-4 || x.Aux != s { + continue + } + mem := x.Args[3] + for _i1 := 0; _i1 <= 1; _i1++ { + if p != x.Args[_i1] || idx != x.Args[1^_i1] { + continue + } + w0 := x.Args[2] + if w0.Op != OpS390XSRDconst || w0.AuxInt != j-32 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + continue + } + v.reset(OpS390XMOVDBRstoreidx) + v.AuxInt = i - 4 + v.Aux = s + v.AddArg(p) + v.AddArg(idx) + v.AddArg(w0) + v.AddArg(mem) + return true + } } - v.reset(OpS390XMOVWBRstoreidx) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) - v.AddArg(mem) - return true + break } return false } -func rewriteValueS390X_OpS390XMOVHZload_0(v *Value) bool { - // match: (MOVHZload [off] {sym} ptr1 (MOVHstore [off] {sym} ptr2 x _)) +func rewriteValueS390X_OpS390XMOVWZload_0(v *Value) bool { + // match: (MOVWZload [off] {sym} ptr1 (MOVWstore [off] {sym} ptr2 x _)) // cond: isSamePtr(ptr1, ptr2) - // result: (MOVHZreg x) + // result: (MOVWZreg x) for { off := v.AuxInt sym := v.Aux _ = v.Args[1] ptr1 := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpS390XMOVHstore || v_1.AuxInt != off || v_1.Aux != sym { + if v_1.Op != OpS390XMOVWstore || v_1.AuxInt != off || v_1.Aux != sym { break } _ = v_1.Args[2] @@ -14667,13 +14337,13 @@ func rewriteValueS390X_OpS390XMOVHZload_0(v *Value) bool { if !(isSamePtr(ptr1, ptr2)) { break } - v.reset(OpS390XMOVHZreg) + v.reset(OpS390XMOVWZreg) v.AddArg(x) return true } - // match: (MOVHZload [off1] {sym} (ADDconst [off2] ptr) mem) + // match: (MOVWZload [off1] {sym} (ADDconst [off2] ptr) mem) // cond: is20Bit(off1+off2) - // result: (MOVHZload [off1+off2] {sym} ptr mem) + // result: (MOVWZload [off1+off2] {sym} ptr mem) for { off1 := v.AuxInt sym := v.Aux @@ -14687,16 +14357,16 @@ func rewriteValueS390X_OpS390XMOVHZload_0(v *Value) bool { if !(is20Bit(off1 + off2)) { break } - v.reset(OpS390XMOVHZload) + v.reset(OpS390XMOVWZload) v.AuxInt = off1 + off2 v.Aux = sym v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVHZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0)) - // result: (MOVHZload [off1+off2] {mergeSym(sym1,sym2)} base mem) + // match: (MOVWZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0)) + // result: (MOVWZload [off1+off2] {mergeSym(sym1,sym2)} base mem) for { off1 := v.AuxInt sym1 := v.Aux @@ -14709,19 +14379,19 @@ func rewriteValueS390X_OpS390XMOVHZload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { break } - v.reset(OpS390XMOVHZload) + v.reset(OpS390XMOVWZload) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) v.AddArg(base) v.AddArg(mem) return true } - // match: (MOVHZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) + // match: (MOVWZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVHZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) + // result: (MOVWZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) for { off1 := v.AuxInt sym1 := v.Aux @@ -14737,7 +14407,7 @@ func rewriteValueS390X_OpS390XMOVHZload_0(v *Value) bool { if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(OpS390XMOVHZloadidx) + v.reset(OpS390XMOVWZloadidx) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) v.AddArg(ptr) @@ -14745,33 +14415,9 @@ func rewriteValueS390X_OpS390XMOVHZload_0(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVHZload [off] {sym} (ADD ptr idx) mem) - // cond: ptr.Op != OpSB - // result: (MOVHZloadidx [off] {sym} ptr idx mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XADD { - break - } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(ptr.Op != OpSB) { - break - } - v.reset(OpS390XMOVHZloadidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVHZload [off] {sym} (ADD idx ptr) mem) + // match: (MOVWZload [off] {sym} (ADD ptr idx) mem) // cond: ptr.Op != OpSB - // result: (MOVHZloadidx [off] {sym} ptr idx mem) + // result: (MOVWZloadidx [off] {sym} ptr idx mem) for { off := v.AuxInt sym := v.Aux @@ -14780,127 +14426,86 @@ func rewriteValueS390X_OpS390XMOVHZload_0(v *Value) bool { if v_0.Op != OpS390XADD { break } - ptr := v_0.Args[1] - idx := v_0.Args[0] - if !(ptr.Op != OpSB) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + if !(ptr.Op != OpSB) { + continue + } + v.reset(OpS390XMOVWZloadidx) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpS390XMOVHZloadidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } return false } -func rewriteValueS390X_OpS390XMOVHZloadidx_0(v *Value) bool { - // match: (MOVHZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) - // cond: is20Bit(c+d) - // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { - break - } - d := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - if !(is20Bit(c + d)) { - break - } - v.reset(OpS390XMOVHZloadidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVHZloadidx [c] {sym} idx (ADDconst [d] ptr) mem) - // cond: is20Bit(c+d) - // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - idx := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XADDconst { - break - } - d := v_1.AuxInt - ptr := v_1.Args[0] - if !(is20Bit(c + d)) { - break - } - v.reset(OpS390XMOVHZloadidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVHZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) +func rewriteValueS390X_OpS390XMOVWZloadidx_0(v *Value) bool { + // match: (MOVWZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) // cond: is20Bit(c+d) - // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) + // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) for { c := v.AuxInt sym := v.Aux mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XADDconst { - break - } - d := v_1.AuxInt - idx := v_1.Args[0] - if !(is20Bit(c + d)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpS390XADDconst { + continue + } + d := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1^_i0] + if !(is20Bit(c + d)) { + continue + } + v.reset(OpS390XMOVWZloadidx) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpS390XMOVHZloadidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } - // match: (MOVHZloadidx [c] {sym} (ADDconst [d] idx) ptr mem) + // match: (MOVWZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) // cond: is20Bit(c+d) - // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) + // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) for { c := v.AuxInt sym := v.Aux mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { - break - } - d := v_0.AuxInt - idx := v_0.Args[0] - ptr := v.Args[1] - if !(is20Bit(c + d)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XADDconst { + continue + } + d := v_1.AuxInt + idx := v_1.Args[0] + if !(is20Bit(c + d)) { + continue + } + v.reset(OpS390XMOVWZloadidx) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpS390XMOVHZloadidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } return false } -func rewriteValueS390X_OpS390XMOVHZreg_0(v *Value) bool { - b := v.Block - // match: (MOVHZreg e:(MOVBZreg x)) +func rewriteValueS390X_OpS390XMOVWZreg_0(v *Value) bool { + // match: (MOVWZreg e:(MOVBZreg x)) // cond: clobberIfDead(e) // result: (MOVBZreg x) for { @@ -14916,12 +14521,12 @@ func rewriteValueS390X_OpS390XMOVHZreg_0(v *Value) bool { v.AddArg(x) return true } - // match: (MOVHZreg e:(MOVHreg x)) + // match: (MOVWZreg e:(MOVHZreg x)) // cond: clobberIfDead(e) // result: (MOVHZreg x) for { e := v.Args[0] - if e.Op != OpS390XMOVHreg { + if e.Op != OpS390XMOVHZreg { break } x := e.Args[0] @@ -14932,9 +14537,9 @@ func rewriteValueS390X_OpS390XMOVHZreg_0(v *Value) bool { v.AddArg(x) return true } - // match: (MOVHZreg e:(MOVWreg x)) + // match: (MOVWZreg e:(MOVWreg x)) // cond: clobberIfDead(e) - // result: (MOVHZreg x) + // result: (MOVWZreg x) for { e := v.Args[0] if e.Op != OpS390XMOVWreg { @@ -14944,29 +14549,13 @@ func rewriteValueS390X_OpS390XMOVHZreg_0(v *Value) bool { if !(clobberIfDead(e)) { break } - v.reset(OpS390XMOVHZreg) - v.AddArg(x) - return true - } - // match: (MOVHZreg e:(MOVHZreg x)) - // cond: clobberIfDead(e) - // result: (MOVHZreg x) - for { - e := v.Args[0] - if e.Op != OpS390XMOVHZreg { - break - } - x := e.Args[0] - if !(clobberIfDead(e)) { - break - } - v.reset(OpS390XMOVHZreg) + v.reset(OpS390XMOVWZreg) v.AddArg(x) return true } - // match: (MOVHZreg e:(MOVWZreg x)) + // match: (MOVWZreg e:(MOVWZreg x)) // cond: clobberIfDead(e) - // result: (MOVHZreg x) + // result: (MOVWZreg x) for { e := v.Args[0] if e.Op != OpS390XMOVWZreg { @@ -14976,11 +14565,11 @@ func rewriteValueS390X_OpS390XMOVHZreg_0(v *Value) bool { if !(clobberIfDead(e)) { break } - v.reset(OpS390XMOVHZreg) + v.reset(OpS390XMOVWZreg) v.AddArg(x) return true } - // match: (MOVHZreg x:(MOVBZload _ _)) + // match: (MOVWZreg x:(MOVBZload _ _)) // cond: (!x.Type.IsSigned() || x.Type.Size() > 1) // result: x for { @@ -14997,7 +14586,7 @@ func rewriteValueS390X_OpS390XMOVHZreg_0(v *Value) bool { v.AddArg(x) return true } - // match: (MOVHZreg x:(MOVBZloadidx _ _ _)) + // match: (MOVWZreg x:(MOVBZloadidx _ _ _)) // cond: (!x.Type.IsSigned() || x.Type.Size() > 1) // result: x for { @@ -15014,7 +14603,7 @@ func rewriteValueS390X_OpS390XMOVHZreg_0(v *Value) bool { v.AddArg(x) return true } - // match: (MOVHZreg x:(MOVHZload _ _)) + // match: (MOVWZreg x:(MOVHZload _ _)) // cond: (!x.Type.IsSigned() || x.Type.Size() > 2) // result: x for { @@ -15031,7 +14620,7 @@ func rewriteValueS390X_OpS390XMOVHZreg_0(v *Value) bool { v.AddArg(x) return true } - // match: (MOVHZreg x:(MOVHZloadidx _ _ _)) + // match: (MOVWZreg x:(MOVHZloadidx _ _ _)) // cond: (!x.Type.IsSigned() || x.Type.Size() > 2) // result: x for { @@ -15048,13 +14637,51 @@ func rewriteValueS390X_OpS390XMOVHZreg_0(v *Value) bool { v.AddArg(x) return true } - // match: (MOVHZreg x:(MOVHload [o] {s} p mem)) - // cond: x.Uses == 1 && clobber(x) - // result: @x.Block (MOVHZload [o] {s} p mem) + // match: (MOVWZreg x:(MOVWZload _ _)) + // cond: (!x.Type.IsSigned() || x.Type.Size() > 4) + // result: x + for { + x := v.Args[0] + if x.Op != OpS390XMOVWZload { + break + } + _ = x.Args[1] + if !(!x.Type.IsSigned() || x.Type.Size() > 4) { + break + } + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + // match: (MOVWZreg x:(MOVWZloadidx _ _ _)) + // cond: (!x.Type.IsSigned() || x.Type.Size() > 4) + // result: x + for { + x := v.Args[0] + if x.Op != OpS390XMOVWZloadidx { + break + } + _ = x.Args[2] + if !(!x.Type.IsSigned() || x.Type.Size() > 4) { + break + } + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + return false +} +func rewriteValueS390X_OpS390XMOVWZreg_10(v *Value) bool { + b := v.Block + // match: (MOVWZreg x:(MOVWload [o] {s} p mem)) + // cond: x.Uses == 1 && clobber(x) + // result: @x.Block (MOVWZload [o] {s} p mem) for { t := v.Type x := v.Args[0] - if x.Op != OpS390XMOVHload { + if x.Op != OpS390XMOVWload { break } o := x.AuxInt @@ -15065,7 +14692,7 @@ func rewriteValueS390X_OpS390XMOVHZreg_0(v *Value) bool { break } b = x.Block - v0 := b.NewValue0(x.Pos, OpS390XMOVHZload, t) + v0 := b.NewValue0(x.Pos, OpS390XMOVWZload, t) v.reset(OpCopy) v.AddArg(v0) v0.AuxInt = o @@ -15074,18 +14701,13 @@ func rewriteValueS390X_OpS390XMOVHZreg_0(v *Value) bool { v0.AddArg(mem) return true } - return false -} -func rewriteValueS390X_OpS390XMOVHZreg_10(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (MOVHZreg x:(MOVHloadidx [o] {s} p i mem)) + // match: (MOVWZreg x:(MOVWloadidx [o] {s} p i mem)) // cond: x.Uses == 1 && clobber(x) - // result: @x.Block (MOVHZloadidx [o] {s} p i mem) + // result: @x.Block (MOVWZloadidx [o] {s} p i mem) for { t := v.Type x := v.Args[0] - if x.Op != OpS390XMOVHloadidx { + if x.Op != OpS390XMOVWloadidx { break } o := x.AuxInt @@ -15097,7 +14719,7 @@ func rewriteValueS390X_OpS390XMOVHZreg_10(v *Value) bool { break } b = x.Block - v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, t) + v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, t) v.reset(OpCopy) v.AddArg(v0) v0.AuxInt = o @@ -15107,8 +14729,8 @@ func rewriteValueS390X_OpS390XMOVHZreg_10(v *Value) bool { v0.AddArg(mem) return true } - // match: (MOVHZreg x:(Arg )) - // cond: !t.IsSigned() && t.Size() <= 2 + // match: (MOVWZreg x:(Arg )) + // cond: !t.IsSigned() && t.Size() <= 4 // result: x for { x := v.Args[0] @@ -15116,7 +14738,7 @@ func rewriteValueS390X_OpS390XMOVHZreg_10(v *Value) bool { break } t := x.Type - if !(!t.IsSigned() && t.Size() <= 2) { + if !(!t.IsSigned() && t.Size() <= 4) { break } v.reset(OpCopy) @@ -15124,8 +14746,8 @@ func rewriteValueS390X_OpS390XMOVHZreg_10(v *Value) bool { v.AddArg(x) return true } - // match: (MOVHZreg (MOVDconst [c])) - // result: (MOVDconst [int64(uint16(c))]) + // match: (MOVWZreg (MOVDconst [c])) + // result: (MOVDconst [int64(uint32(c))]) for { v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { @@ -15133,38 +14755,22 @@ func rewriteValueS390X_OpS390XMOVHZreg_10(v *Value) bool { } c := v_0.AuxInt v.reset(OpS390XMOVDconst) - v.AuxInt = int64(uint16(c)) - return true - } - // match: (MOVHZreg (ANDWconst [m] x)) - // result: (MOVWZreg (ANDWconst [int64(uint16(m))] x)) - for { - v_0 := v.Args[0] - if v_0.Op != OpS390XANDWconst { - break - } - m := v_0.AuxInt - x := v_0.Args[0] - v.reset(OpS390XMOVWZreg) - v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) - v0.AuxInt = int64(uint16(m)) - v0.AddArg(x) - v.AddArg(v0) + v.AuxInt = int64(uint32(c)) return true } return false } -func rewriteValueS390X_OpS390XMOVHload_0(v *Value) bool { - // match: (MOVHload [off] {sym} ptr1 (MOVHstore [off] {sym} ptr2 x _)) +func rewriteValueS390X_OpS390XMOVWload_0(v *Value) bool { + // match: (MOVWload [off] {sym} ptr1 (MOVWstore [off] {sym} ptr2 x _)) // cond: isSamePtr(ptr1, ptr2) - // result: (MOVHreg x) + // result: (MOVWreg x) for { off := v.AuxInt sym := v.Aux _ = v.Args[1] ptr1 := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpS390XMOVHstore || v_1.AuxInt != off || v_1.Aux != sym { + if v_1.Op != OpS390XMOVWstore || v_1.AuxInt != off || v_1.Aux != sym { break } _ = v_1.Args[2] @@ -15173,13 +14779,13 @@ func rewriteValueS390X_OpS390XMOVHload_0(v *Value) bool { if !(isSamePtr(ptr1, ptr2)) { break } - v.reset(OpS390XMOVHreg) + v.reset(OpS390XMOVWreg) v.AddArg(x) return true } - // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) + // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) // cond: is20Bit(off1+off2) - // result: (MOVHload [off1+off2] {sym} ptr mem) + // result: (MOVWload [off1+off2] {sym} ptr mem) for { off1 := v.AuxInt sym := v.Aux @@ -15193,16 +14799,16 @@ func rewriteValueS390X_OpS390XMOVHload_0(v *Value) bool { if !(is20Bit(off1 + off2)) { break } - v.reset(OpS390XMOVHload) + v.reset(OpS390XMOVWload) v.AuxInt = off1 + off2 v.Aux = sym v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVHload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0)) - // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} base mem) + // match: (MOVWload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0)) + // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} base mem) for { off1 := v.AuxInt sym1 := v.Aux @@ -15215,19 +14821,19 @@ func rewriteValueS390X_OpS390XMOVHload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { break } - v.reset(OpS390XMOVHload) + v.reset(OpS390XMOVWload) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) v.AddArg(base) v.AddArg(mem) return true } - // match: (MOVHload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) + // match: (MOVWload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVHloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) + // result: (MOVWloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) for { off1 := v.AuxInt sym1 := v.Aux @@ -15243,7 +14849,7 @@ func rewriteValueS390X_OpS390XMOVHload_0(v *Value) bool { if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(OpS390XMOVHloadidx) + v.reset(OpS390XMOVWloadidx) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) v.AddArg(ptr) @@ -15251,33 +14857,9 @@ func rewriteValueS390X_OpS390XMOVHload_0(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVHload [off] {sym} (ADD ptr idx) mem) - // cond: ptr.Op != OpSB - // result: (MOVHloadidx [off] {sym} ptr idx mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XADD { - break - } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(ptr.Op != OpSB) { - break - } - v.reset(OpS390XMOVHloadidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVHload [off] {sym} (ADD idx ptr) mem) + // match: (MOVWload [off] {sym} (ADD ptr idx) mem) // cond: ptr.Op != OpSB - // result: (MOVHloadidx [off] {sym} ptr idx mem) + // result: (MOVWloadidx [off] {sym} ptr idx mem) for { off := v.AuxInt sym := v.Aux @@ -15286,126 +14868,86 @@ func rewriteValueS390X_OpS390XMOVHload_0(v *Value) bool { if v_0.Op != OpS390XADD { break } - ptr := v_0.Args[1] - idx := v_0.Args[0] - if !(ptr.Op != OpSB) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + if !(ptr.Op != OpSB) { + continue + } + v.reset(OpS390XMOVWloadidx) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpS390XMOVHloadidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } return false } -func rewriteValueS390X_OpS390XMOVHloadidx_0(v *Value) bool { - // match: (MOVHloadidx [c] {sym} (ADDconst [d] ptr) idx mem) - // cond: is20Bit(c+d) - // result: (MOVHloadidx [c+d] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { - break - } - d := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - if !(is20Bit(c + d)) { - break - } - v.reset(OpS390XMOVHloadidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVHloadidx [c] {sym} idx (ADDconst [d] ptr) mem) - // cond: is20Bit(c+d) - // result: (MOVHloadidx [c+d] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - idx := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XADDconst { - break - } - d := v_1.AuxInt - ptr := v_1.Args[0] - if !(is20Bit(c + d)) { - break - } - v.reset(OpS390XMOVHloadidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVHloadidx [c] {sym} ptr (ADDconst [d] idx) mem) +func rewriteValueS390X_OpS390XMOVWloadidx_0(v *Value) bool { + // match: (MOVWloadidx [c] {sym} (ADDconst [d] ptr) idx mem) // cond: is20Bit(c+d) - // result: (MOVHloadidx [c+d] {sym} ptr idx mem) + // result: (MOVWloadidx [c+d] {sym} ptr idx mem) for { c := v.AuxInt sym := v.Aux mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XADDconst { - break - } - d := v_1.AuxInt - idx := v_1.Args[0] - if !(is20Bit(c + d)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpS390XADDconst { + continue + } + d := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1^_i0] + if !(is20Bit(c + d)) { + continue + } + v.reset(OpS390XMOVWloadidx) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpS390XMOVHloadidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } - // match: (MOVHloadidx [c] {sym} (ADDconst [d] idx) ptr mem) + // match: (MOVWloadidx [c] {sym} ptr (ADDconst [d] idx) mem) // cond: is20Bit(c+d) - // result: (MOVHloadidx [c+d] {sym} ptr idx mem) + // result: (MOVWloadidx [c+d] {sym} ptr idx mem) for { c := v.AuxInt sym := v.Aux mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { - break - } - d := v_0.AuxInt - idx := v_0.Args[0] - ptr := v.Args[1] - if !(is20Bit(c + d)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XADDconst { + continue + } + d := v_1.AuxInt + idx := v_1.Args[0] + if !(is20Bit(c + d)) { + continue + } + v.reset(OpS390XMOVWloadidx) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(mem) + return true } - v.reset(OpS390XMOVHloadidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true + break } return false } -func rewriteValueS390X_OpS390XMOVHreg_0(v *Value) bool { - // match: (MOVHreg e:(MOVBreg x)) +func rewriteValueS390X_OpS390XMOVWreg_0(v *Value) bool { + // match: (MOVWreg e:(MOVBreg x)) // cond: clobberIfDead(e) // result: (MOVBreg x) for { @@ -15421,7 +14963,7 @@ func rewriteValueS390X_OpS390XMOVHreg_0(v *Value) bool { v.AddArg(x) return true } - // match: (MOVHreg e:(MOVHreg x)) + // match: (MOVWreg e:(MOVHreg x)) // cond: clobberIfDead(e) // result: (MOVHreg x) for { @@ -15437,9 +14979,9 @@ func rewriteValueS390X_OpS390XMOVHreg_0(v *Value) bool { v.AddArg(x) return true } - // match: (MOVHreg e:(MOVWreg x)) + // match: (MOVWreg e:(MOVWreg x)) // cond: clobberIfDead(e) - // result: (MOVHreg x) + // result: (MOVWreg x) for { e := v.Args[0] if e.Op != OpS390XMOVWreg { @@ -15449,48 +14991,66 @@ func rewriteValueS390X_OpS390XMOVHreg_0(v *Value) bool { if !(clobberIfDead(e)) { break } - v.reset(OpS390XMOVHreg) + v.reset(OpS390XMOVWreg) v.AddArg(x) return true } - // match: (MOVHreg e:(MOVHZreg x)) + // match: (MOVWreg e:(MOVWZreg x)) // cond: clobberIfDead(e) - // result: (MOVHreg x) + // result: (MOVWreg x) for { e := v.Args[0] - if e.Op != OpS390XMOVHZreg { + if e.Op != OpS390XMOVWZreg { break } x := e.Args[0] if !(clobberIfDead(e)) { break } - v.reset(OpS390XMOVHreg) + v.reset(OpS390XMOVWreg) v.AddArg(x) return true } - // match: (MOVHreg e:(MOVWZreg x)) - // cond: clobberIfDead(e) - // result: (MOVHreg x) + // match: (MOVWreg x:(MOVBload _ _)) + // cond: (x.Type.IsSigned() || x.Type.Size() == 8) + // result: x for { - e := v.Args[0] - if e.Op != OpS390XMOVWZreg { + x := v.Args[0] + if x.Op != OpS390XMOVBload { break } - x := e.Args[0] - if !(clobberIfDead(e)) { + _ = x.Args[1] + if !(x.Type.IsSigned() || x.Type.Size() == 8) { break } - v.reset(OpS390XMOVHreg) + v.reset(OpCopy) + v.Type = x.Type v.AddArg(x) return true } - // match: (MOVHreg x:(MOVBload _ _)) + // match: (MOVWreg x:(MOVBloadidx _ _ _)) // cond: (x.Type.IsSigned() || x.Type.Size() == 8) // result: x for { x := v.Args[0] - if x.Op != OpS390XMOVBload { + if x.Op != OpS390XMOVBloadidx { + break + } + _ = x.Args[2] + if !(x.Type.IsSigned() || x.Type.Size() == 8) { + break + } + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + // match: (MOVWreg x:(MOVHload _ _)) + // cond: (x.Type.IsSigned() || x.Type.Size() == 8) + // result: x + for { + x := v.Args[0] + if x.Op != OpS390XMOVHload { break } _ = x.Args[1] @@ -15502,12 +15062,12 @@ func rewriteValueS390X_OpS390XMOVHreg_0(v *Value) bool { v.AddArg(x) return true } - // match: (MOVHreg x:(MOVBloadidx _ _ _)) + // match: (MOVWreg x:(MOVHloadidx _ _ _)) // cond: (x.Type.IsSigned() || x.Type.Size() == 8) // result: x for { x := v.Args[0] - if x.Op != OpS390XMOVBloadidx { + if x.Op != OpS390XMOVHloadidx { break } _ = x.Args[2] @@ -15519,12 +15079,12 @@ func rewriteValueS390X_OpS390XMOVHreg_0(v *Value) bool { v.AddArg(x) return true } - // match: (MOVHreg x:(MOVHload _ _)) + // match: (MOVWreg x:(MOVWload _ _)) // cond: (x.Type.IsSigned() || x.Type.Size() == 8) // result: x for { x := v.Args[0] - if x.Op != OpS390XMOVHload { + if x.Op != OpS390XMOVWload { break } _ = x.Args[1] @@ -15536,12 +15096,12 @@ func rewriteValueS390X_OpS390XMOVHreg_0(v *Value) bool { v.AddArg(x) return true } - // match: (MOVHreg x:(MOVHloadidx _ _ _)) + // match: (MOVWreg x:(MOVWloadidx _ _ _)) // cond: (x.Type.IsSigned() || x.Type.Size() == 8) // result: x for { x := v.Args[0] - if x.Op != OpS390XMOVHloadidx { + if x.Op != OpS390XMOVWloadidx { break } _ = x.Args[2] @@ -15553,7 +15113,11 @@ func rewriteValueS390X_OpS390XMOVHreg_0(v *Value) bool { v.AddArg(x) return true } - // match: (MOVHreg x:(MOVBZload _ _)) + return false +} +func rewriteValueS390X_OpS390XMOVWreg_10(v *Value) bool { + b := v.Block + // match: (MOVWreg x:(MOVBZload _ _)) // cond: (!x.Type.IsSigned() || x.Type.Size() > 1) // result: x for { @@ -15570,12 +15134,7 @@ func rewriteValueS390X_OpS390XMOVHreg_0(v *Value) bool { v.AddArg(x) return true } - return false -} -func rewriteValueS390X_OpS390XMOVHreg_10(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (MOVHreg x:(MOVBZloadidx _ _ _)) + // match: (MOVWreg x:(MOVBZloadidx _ _ _)) // cond: (!x.Type.IsSigned() || x.Type.Size() > 1) // result: x for { @@ -15592,13 +15151,47 @@ func rewriteValueS390X_OpS390XMOVHreg_10(v *Value) bool { v.AddArg(x) return true } - // match: (MOVHreg x:(MOVHZload [o] {s} p mem)) + // match: (MOVWreg x:(MOVHZload _ _)) + // cond: (!x.Type.IsSigned() || x.Type.Size() > 2) + // result: x + for { + x := v.Args[0] + if x.Op != OpS390XMOVHZload { + break + } + _ = x.Args[1] + if !(!x.Type.IsSigned() || x.Type.Size() > 2) { + break + } + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + // match: (MOVWreg x:(MOVHZloadidx _ _ _)) + // cond: (!x.Type.IsSigned() || x.Type.Size() > 2) + // result: x + for { + x := v.Args[0] + if x.Op != OpS390XMOVHZloadidx { + break + } + _ = x.Args[2] + if !(!x.Type.IsSigned() || x.Type.Size() > 2) { + break + } + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + // match: (MOVWreg x:(MOVWZload [o] {s} p mem)) // cond: x.Uses == 1 && clobber(x) - // result: @x.Block (MOVHload [o] {s} p mem) + // result: @x.Block (MOVWload [o] {s} p mem) for { t := v.Type x := v.Args[0] - if x.Op != OpS390XMOVHZload { + if x.Op != OpS390XMOVWZload { break } o := x.AuxInt @@ -15609,7 +15202,7 @@ func rewriteValueS390X_OpS390XMOVHreg_10(v *Value) bool { break } b = x.Block - v0 := b.NewValue0(x.Pos, OpS390XMOVHload, t) + v0 := b.NewValue0(x.Pos, OpS390XMOVWload, t) v.reset(OpCopy) v.AddArg(v0) v0.AuxInt = o @@ -15618,13 +15211,13 @@ func rewriteValueS390X_OpS390XMOVHreg_10(v *Value) bool { v0.AddArg(mem) return true } - // match: (MOVHreg x:(MOVHZloadidx [o] {s} p i mem)) + // match: (MOVWreg x:(MOVWZloadidx [o] {s} p i mem)) // cond: x.Uses == 1 && clobber(x) - // result: @x.Block (MOVHloadidx [o] {s} p i mem) + // result: @x.Block (MOVWloadidx [o] {s} p i mem) for { t := v.Type x := v.Args[0] - if x.Op != OpS390XMOVHZloadidx { + if x.Op != OpS390XMOVWZloadidx { break } o := x.AuxInt @@ -15636,7 +15229,7 @@ func rewriteValueS390X_OpS390XMOVHreg_10(v *Value) bool { break } b = x.Block - v0 := b.NewValue0(v.Pos, OpS390XMOVHloadidx, t) + v0 := b.NewValue0(v.Pos, OpS390XMOVWloadidx, t) v.reset(OpCopy) v.AddArg(v0) v0.AuxInt = o @@ -15646,8 +15239,8 @@ func rewriteValueS390X_OpS390XMOVHreg_10(v *Value) bool { v0.AddArg(mem) return true } - // match: (MOVHreg x:(Arg )) - // cond: t.IsSigned() && t.Size() <= 2 + // match: (MOVWreg x:(Arg )) + // cond: t.IsSigned() && t.Size() <= 4 // result: x for { x := v.Args[0] @@ -15655,7 +15248,7 @@ func rewriteValueS390X_OpS390XMOVHreg_10(v *Value) bool { break } t := x.Type - if !(t.IsSigned() && t.Size() <= 2) { + if !(t.IsSigned() && t.Size() <= 4) { break } v.reset(OpCopy) @@ -15663,8 +15256,8 @@ func rewriteValueS390X_OpS390XMOVHreg_10(v *Value) bool { v.AddArg(x) return true } - // match: (MOVHreg (MOVDconst [c])) - // result: (MOVDconst [int64(int16(c))]) + // match: (MOVWreg (MOVDconst [c])) + // result: (MOVDconst [int64(int32(c))]) for { v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { @@ -15672,45 +15265,25 @@ func rewriteValueS390X_OpS390XMOVHreg_10(v *Value) bool { } c := v_0.AuxInt v.reset(OpS390XMOVDconst) - v.AuxInt = int64(int16(c)) - return true - } - // match: (MOVHreg (ANDWconst [m] x)) - // cond: int16(m) >= 0 - // result: (MOVWZreg (ANDWconst [int64(uint16(m))] x)) - for { - v_0 := v.Args[0] - if v_0.Op != OpS390XANDWconst { - break - } - m := v_0.AuxInt - x := v_0.Args[0] - if !(int16(m) >= 0) { - break - } - v.reset(OpS390XMOVWZreg) - v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) - v0.AuxInt = int64(uint16(m)) - v0.AddArg(x) - v.AddArg(v0) + v.AuxInt = int64(int32(c)) return true } return false } -func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { - // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem) - // result: (MOVHstore [off] {sym} ptr x mem) +func rewriteValueS390X_OpS390XMOVWstore_0(v *Value) bool { + // match: (MOVWstore [off] {sym} ptr (MOVWreg x) mem) + // result: (MOVWstore [off] {sym} ptr x mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpS390XMOVHreg { + if v_1.Op != OpS390XMOVWreg { break } x := v_1.Args[0] - v.reset(OpS390XMOVHstore) + v.reset(OpS390XMOVWstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) @@ -15718,19 +15291,19 @@ func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVHstore [off] {sym} ptr (MOVHZreg x) mem) - // result: (MOVHstore [off] {sym} ptr x mem) + // match: (MOVWstore [off] {sym} ptr (MOVWZreg x) mem) + // result: (MOVWstore [off] {sym} ptr x mem) for { off := v.AuxInt sym := v.Aux mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpS390XMOVHZreg { + if v_1.Op != OpS390XMOVWZreg { break } x := v_1.Args[0] - v.reset(OpS390XMOVHstore) + v.reset(OpS390XMOVWstore) v.AuxInt = off v.Aux = sym v.AddArg(ptr) @@ -15738,9 +15311,9 @@ func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) + // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) // cond: is20Bit(off1+off2) - // result: (MOVHstore [off1+off2] {sym} ptr val mem) + // result: (MOVWstore [off1+off2] {sym} ptr val mem) for { off1 := v.AuxInt sym := v.Aux @@ -15755,7 +15328,7 @@ func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { if !(is20Bit(off1 + off2)) { break } - v.reset(OpS390XMOVHstore) + v.reset(OpS390XMOVWstore) v.AuxInt = off1 + off2 v.Aux = sym v.AddArg(ptr) @@ -15763,9 +15336,9 @@ func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVHstore [off] {sym} ptr (MOVDconst [c]) mem) - // cond: isU12Bit(off) && ptr.Op != OpSB - // result: (MOVHstoreconst [makeValAndOff(int64(int16(c)),off)] {sym} ptr mem) + // match: (MOVWstore [off] {sym} ptr (MOVDconst [c]) mem) + // cond: is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB + // result: (MOVWstoreconst [makeValAndOff(int64(int32(c)),off)] {sym} ptr mem) for { off := v.AuxInt sym := v.Aux @@ -15776,19 +15349,19 @@ func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { break } c := v_1.AuxInt - if !(isU12Bit(off) && ptr.Op != OpSB) { + if !(is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB) { break } - v.reset(OpS390XMOVHstoreconst) - v.AuxInt = makeValAndOff(int64(int16(c)), off) + v.reset(OpS390XMOVWstoreconst) + v.AuxInt = makeValAndOff(int64(int32(c)), off) v.Aux = sym v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVHstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0)) - // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) + // match: (MOVWstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) + // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0)) + // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) for { off1 := v.AuxInt sym1 := v.Aux @@ -15802,10 +15375,10 @@ func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { + if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { break } - v.reset(OpS390XMOVHstore) + v.reset(OpS390XMOVWstore) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) v.AddArg(base) @@ -15813,9 +15386,9 @@ func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVHstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) + // match: (MOVWstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVHstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) + // result: (MOVWstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) for { off1 := v.AuxInt sym1 := v.Aux @@ -15832,7 +15405,7 @@ func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } - v.reset(OpS390XMOVHstoreidx) + v.reset(OpS390XMOVWstoreidx) v.AuxInt = off1 + off2 v.Aux = mergeSym(sym1, sym2) v.AddArg(ptr) @@ -15841,35 +15414,9 @@ func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVHstore [off] {sym} (ADD ptr idx) val mem) - // cond: ptr.Op != OpSB - // result: (MOVHstoreidx [off] {sym} ptr idx val mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpS390XADD { - break - } - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { - break - } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVHstore [off] {sym} (ADD idx ptr) val mem) + // match: (MOVWstore [off] {sym} (ADD ptr idx) val mem) // cond: ptr.Op != OpSB - // result: (MOVHstoreidx [off] {sym} ptr idx val mem) + // result: (MOVWstoreidx [off] {sym} ptr idx val mem) for { off := v.AuxInt sym := v.Aux @@ -15878,53 +15425,57 @@ func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { if v_0.Op != OpS390XADD { break } - ptr := v_0.Args[1] - idx := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v_0.Args[_i0] + idx := v_0.Args[1^_i0] + val := v.Args[1] + if !(ptr.Op != OpSB) { + continue + } + v.reset(OpS390XMOVWstoreidx) + v.AuxInt = off + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true + break } - // match: (MOVHstore [i] {s} p w x:(MOVHstore [i-2] {s} p (SRDconst [16] w) mem)) + // match: (MOVWstore [i] {s} p (SRDconst [32] w) x:(MOVWstore [i-4] {s} p w mem)) // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) - // result: (MOVWstore [i-2] {s} p w mem) + // result: (MOVDstore [i-4] {s} p w mem) for { i := v.AuxInt s := v.Aux _ = v.Args[2] p := v.Args[0] - w := v.Args[1] - x := v.Args[2] - if x.Op != OpS390XMOVHstore || x.AuxInt != i-2 || x.Aux != s { + v_1 := v.Args[1] + if v_1.Op != OpS390XSRDconst || v_1.AuxInt != 32 { break } - mem := x.Args[2] - if p != x.Args[0] { + w := v_1.Args[0] + x := v.Args[2] + if x.Op != OpS390XMOVWstore || x.AuxInt != i-4 || x.Aux != s { break } - x_1 := x.Args[1] - if x_1.Op != OpS390XSRDconst || x_1.AuxInt != 16 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { + mem := x.Args[2] + if p != x.Args[0] || w != x.Args[1] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } - v.reset(OpS390XMOVWstore) - v.AuxInt = i - 2 + v.reset(OpS390XMOVDstore) + v.AuxInt = i - 4 v.Aux = s v.AddArg(p) v.AddArg(w) v.AddArg(mem) return true } - // match: (MOVHstore [i] {s} p w0:(SRDconst [j] w) x:(MOVHstore [i-2] {s} p (SRDconst [j+16] w) mem)) + // match: (MOVWstore [i] {s} p w0:(SRDconst [j] w) x:(MOVWstore [i-4] {s} p (SRDconst [j+32] w) mem)) // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) - // result: (MOVWstore [i-2] {s} p w0 mem) + // result: (MOVDstore [i-4] {s} p w0 mem) for { i := v.AuxInt s := v.Aux @@ -15937,7 +15488,7 @@ func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { j := w0.AuxInt w := w0.Args[0] x := v.Args[2] - if x.Op != OpS390XMOVHstore || x.AuxInt != i-2 || x.Aux != s { + if x.Op != OpS390XMOVWstore || x.AuxInt != i-4 || x.Aux != s { break } mem := x.Args[2] @@ -15945,91 +15496,124 @@ func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { break } x_1 := x.Args[1] - if x_1.Op != OpS390XSRDconst || x_1.AuxInt != j+16 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { + if x_1.Op != OpS390XSRDconst || x_1.AuxInt != j+32 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } - v.reset(OpS390XMOVWstore) - v.AuxInt = i - 2 + v.reset(OpS390XMOVDstore) + v.AuxInt = i - 4 v.Aux = s v.AddArg(p) v.AddArg(w0) v.AddArg(mem) return true } - return false -} -func rewriteValueS390X_OpS390XMOVHstore_10(v *Value) bool { - // match: (MOVHstore [i] {s} p w x:(MOVHstore [i-2] {s} p (SRWconst [16] w) mem)) - // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) - // result: (MOVWstore [i-2] {s} p w mem) + // match: (MOVWstore [i] {s} p w1 x:(MOVWstore [i-4] {s} p w0 mem)) + // cond: p.Op != OpSB && x.Uses == 1 && is20Bit(i-4) && clobber(x) + // result: (STM2 [i-4] {s} p w0 w1 mem) for { i := v.AuxInt s := v.Aux _ = v.Args[2] p := v.Args[0] - w := v.Args[1] + w1 := v.Args[1] x := v.Args[2] - if x.Op != OpS390XMOVHstore || x.AuxInt != i-2 || x.Aux != s { + if x.Op != OpS390XMOVWstore || x.AuxInt != i-4 || x.Aux != s { break } mem := x.Args[2] if p != x.Args[0] { break } - x_1 := x.Args[1] - if x_1.Op != OpS390XSRWconst || x_1.AuxInt != 16 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { + w0 := x.Args[1] + if !(p.Op != OpSB && x.Uses == 1 && is20Bit(i-4) && clobber(x)) { break } - v.reset(OpS390XMOVWstore) - v.AuxInt = i - 2 + v.reset(OpS390XSTM2) + v.AuxInt = i - 4 v.Aux = s v.AddArg(p) - v.AddArg(w) + v.AddArg(w0) + v.AddArg(w1) v.AddArg(mem) return true } - // match: (MOVHstore [i] {s} p w0:(SRWconst [j] w) x:(MOVHstore [i-2] {s} p (SRWconst [j+16] w) mem)) - // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) - // result: (MOVWstore [i-2] {s} p w0 mem) + return false +} +func rewriteValueS390X_OpS390XMOVWstore_10(v *Value) bool { + // match: (MOVWstore [i] {s} p w2 x:(STM2 [i-8] {s} p w0 w1 mem)) + // cond: x.Uses == 1 && is20Bit(i-8) && clobber(x) + // result: (STM3 [i-8] {s} p w0 w1 w2 mem) for { i := v.AuxInt s := v.Aux _ = v.Args[2] p := v.Args[0] - w0 := v.Args[1] - if w0.Op != OpS390XSRWconst { + w2 := v.Args[1] + x := v.Args[2] + if x.Op != OpS390XSTM2 || x.AuxInt != i-8 || x.Aux != s { break } - j := w0.AuxInt - w := w0.Args[0] + mem := x.Args[3] + if p != x.Args[0] { + break + } + w0 := x.Args[1] + w1 := x.Args[2] + if !(x.Uses == 1 && is20Bit(i-8) && clobber(x)) { + break + } + v.reset(OpS390XSTM3) + v.AuxInt = i - 8 + v.Aux = s + v.AddArg(p) + v.AddArg(w0) + v.AddArg(w1) + v.AddArg(w2) + v.AddArg(mem) + return true + } + // match: (MOVWstore [i] {s} p w3 x:(STM3 [i-12] {s} p w0 w1 w2 mem)) + // cond: x.Uses == 1 && is20Bit(i-12) && clobber(x) + // result: (STM4 [i-12] {s} p w0 w1 w2 w3 mem) + for { + i := v.AuxInt + s := v.Aux + _ = v.Args[2] + p := v.Args[0] + w3 := v.Args[1] x := v.Args[2] - if x.Op != OpS390XMOVHstore || x.AuxInt != i-2 || x.Aux != s { + if x.Op != OpS390XSTM3 || x.AuxInt != i-12 || x.Aux != s { break } - mem := x.Args[2] + mem := x.Args[4] if p != x.Args[0] { break } - x_1 := x.Args[1] - if x_1.Op != OpS390XSRWconst || x_1.AuxInt != j+16 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { + w0 := x.Args[1] + w1 := x.Args[2] + w2 := x.Args[3] + if !(x.Uses == 1 && is20Bit(i-12) && clobber(x)) { break } - v.reset(OpS390XMOVWstore) - v.AuxInt = i - 2 + v.reset(OpS390XSTM4) + v.AuxInt = i - 12 v.Aux = s v.AddArg(p) v.AddArg(w0) + v.AddArg(w1) + v.AddArg(w2) + v.AddArg(w3) v.AddArg(mem) return true } return false } -func rewriteValueS390X_OpS390XMOVHstoreconst_0(v *Value) bool { +func rewriteValueS390X_OpS390XMOVWstoreconst_0(v *Value) bool { b := v.Block typ := &b.Func.Config.Types - // match: (MOVHstoreconst [sc] {s} (ADDconst [off] ptr) mem) + // match: (MOVWstoreconst [sc] {s} (ADDconst [off] ptr) mem) // cond: isU12Bit(ValAndOff(sc).Off()+off) - // result: (MOVHstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) + // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) for { sc := v.AuxInt s := v.Aux @@ -16043,16 +15627,16 @@ func rewriteValueS390X_OpS390XMOVHstoreconst_0(v *Value) bool { if !(isU12Bit(ValAndOff(sc).Off() + off)) { break } - v.reset(OpS390XMOVHstoreconst) + v.reset(OpS390XMOVWstoreconst) v.AuxInt = ValAndOff(sc).add(off) v.Aux = s v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVHstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) + // match: (MOVWstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) - // result: (MOVHstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) + // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) for { sc := v.AuxInt sym1 := v.Aux @@ -16067,23 +15651,23 @@ func rewriteValueS390X_OpS390XMOVHstoreconst_0(v *Value) bool { if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { break } - v.reset(OpS390XMOVHstoreconst) + v.reset(OpS390XMOVWstoreconst) v.AuxInt = ValAndOff(sc).add(off) v.Aux = mergeSym(sym1, sym2) v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVHstoreconst [c] {s} p x:(MOVHstoreconst [a] {s} p mem)) - // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) - // result: (MOVWstore [ValAndOff(a).Off()] {s} p (MOVDconst [int64(int32(ValAndOff(c).Val()&0xffff | ValAndOff(a).Val()<<16))]) mem) + // match: (MOVWstoreconst [c] {s} p x:(MOVWstoreconst [a] {s} p mem)) + // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 4 == ValAndOff(c).Off() && clobber(x) + // result: (MOVDstore [ValAndOff(a).Off()] {s} p (MOVDconst [ValAndOff(c).Val()&0xffffffff | ValAndOff(a).Val()<<32]) mem) for { c := v.AuxInt s := v.Aux _ = v.Args[1] p := v.Args[0] x := v.Args[1] - if x.Op != OpS390XMOVHstoreconst { + if x.Op != OpS390XMOVWstoreconst { break } a := x.AuxInt @@ -16091,16142 +15675,2951 @@ func rewriteValueS390X_OpS390XMOVHstoreconst_0(v *Value) bool { break } mem := x.Args[1] - if p != x.Args[0] || !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { + if p != x.Args[0] || !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+4 == ValAndOff(c).Off() && clobber(x)) { break } - v.reset(OpS390XMOVWstore) + v.reset(OpS390XMOVDstore) v.AuxInt = ValAndOff(a).Off() v.Aux = s v.AddArg(p) v0 := b.NewValue0(x.Pos, OpS390XMOVDconst, typ.UInt64) - v0.AuxInt = int64(int32(ValAndOff(c).Val()&0xffff | ValAndOff(a).Val()<<16)) + v0.AuxInt = ValAndOff(c).Val()&0xffffffff | ValAndOff(a).Val()<<32 v.AddArg(v0) v.AddArg(mem) return true } return false } -func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool { - // match: (MOVHstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) - // cond: is20Bit(c+d) - // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[3] - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { - break - } - d := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - val := v.Args[2] - if !(is20Bit(c + d)) { - break - } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVHstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) +func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool { + // match: (MOVWstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) // cond: is20Bit(c+d) - // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) + // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) for { c := v.AuxInt sym := v.Aux mem := v.Args[3] - idx := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XADDconst { - break - } - d := v_1.AuxInt - ptr := v_1.Args[0] - val := v.Args[2] - if !(is20Bit(c + d)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpS390XADDconst { + continue + } + d := v_0.AuxInt + ptr := v_0.Args[0] + idx := v.Args[1^_i0] + val := v.Args[2] + if !(is20Bit(c + d)) { + continue + } + v.reset(OpS390XMOVWstoreidx) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true + break } - // match: (MOVHstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) + // match: (MOVWstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) // cond: is20Bit(c+d) - // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) + // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) for { c := v.AuxInt sym := v.Aux mem := v.Args[3] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XADDconst { - break - } - d := v_1.AuxInt - idx := v_1.Args[0] - val := v.Args[2] - if !(is20Bit(c + d)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + ptr := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XADDconst { + continue + } + d := v_1.AuxInt + idx := v_1.Args[0] + val := v.Args[2] + if !(is20Bit(c + d)) { + continue + } + v.reset(OpS390XMOVWstoreidx) + v.AuxInt = c + d + v.Aux = sym + v.AddArg(ptr) + v.AddArg(idx) + v.AddArg(val) + v.AddArg(mem) + return true } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true + break } - // match: (MOVHstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) - // cond: is20Bit(c+d) - // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) + // match: (MOVWstoreidx [i] {s} p idx w x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [32] w) mem)) + // cond: x.Uses == 1 && clobber(x) + // result: (MOVDstoreidx [i-4] {s} p idx w mem) for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[3] - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { - break - } - d := v_0.AuxInt - idx := v_0.Args[0] - ptr := v.Args[1] - val := v.Args[2] - if !(is20Bit(c + d)) { - break + i := v.AuxInt + s := v.Aux + _ = v.Args[3] + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + idx := v.Args[1^_i0] + w := v.Args[2] + x := v.Args[3] + if x.Op != OpS390XMOVWstoreidx || x.AuxInt != i-4 || x.Aux != s { + continue + } + mem := x.Args[3] + for _i1 := 0; _i1 <= 1; _i1++ { + if p != x.Args[_i1] || idx != x.Args[1^_i1] { + continue + } + x_2 := x.Args[2] + if x_2.Op != OpS390XSRDconst || x_2.AuxInt != 32 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + continue + } + v.reset(OpS390XMOVDstoreidx) + v.AuxInt = i - 4 + v.Aux = s + v.AddArg(p) + v.AddArg(idx) + v.AddArg(w) + v.AddArg(mem) + return true + } } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true + break } - // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [16] w) mem)) + // match: (MOVWstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [j+32] w) mem)) // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx [i-2] {s} p idx w mem) + // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) for { i := v.AuxInt s := v.Aux _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - w := v.Args[2] - x := v.Args[3] - if x.Op != OpS390XMOVHstoreidx || x.AuxInt != i-2 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { - break - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != 16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + p := v.Args[_i0] + idx := v.Args[1^_i0] + w0 := v.Args[2] + if w0.Op != OpS390XSRDconst { + continue + } + j := w0.AuxInt + w := w0.Args[0] + x := v.Args[3] + if x.Op != OpS390XMOVWstoreidx || x.AuxInt != i-4 || x.Aux != s { + continue + } + mem := x.Args[3] + for _i1 := 0; _i1 <= 1; _i1++ { + if p != x.Args[_i1] || idx != x.Args[1^_i1] { + continue + } + x_2 := x.Args[2] + if x_2.Op != OpS390XSRDconst || x_2.AuxInt != j+32 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + continue + } + v.reset(OpS390XMOVDstoreidx) + v.AuxInt = i - 4 + v.Aux = s + v.AddArg(p) + v.AddArg(idx) + v.AddArg(w0) + v.AddArg(mem) + return true + } } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) - return true + break } - // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx [i-2] {s} p idx w mem) + return false +} +func rewriteValueS390X_OpS390XMULLD_0(v *Value) bool { + // match: (MULLD x (MOVDconst [c])) + // cond: is32Bit(c) + // result: (MULLDconst [c] x) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - w := v.Args[2] - x := v.Args[3] - if x.Op != OpS390XMOVHstoreidx || x.AuxInt != i-2 || x.Aux != s { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XMOVDconst { + continue + } + c := v_1.AuxInt + if !(is32Bit(c)) { + continue + } + v.reset(OpS390XMULLDconst) + v.AuxInt = c + v.AddArg(x) + return true } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { - break + break + } + // match: (MULLD x g:(MOVDload [off] {sym} ptr mem)) + // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) + // result: (MULLDload [off] {sym} x ptr mem) + for { + t := v.Type + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + g := v.Args[1^_i0] + if g.Op != OpS390XMOVDload { + continue + } + off := g.AuxInt + sym := g.Aux + mem := g.Args[1] + ptr := g.Args[0] + if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + continue + } + v.reset(OpS390XMULLDload) + v.Type = t + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != 16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + break + } + return false +} +func rewriteValueS390X_OpS390XMULLDconst_0(v *Value) bool { + b := v.Block + // match: (MULLDconst [-1] x) + // result: (NEG x) + for { + if v.AuxInt != -1 { break } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) + x := v.Args[0] + v.reset(OpS390XNEG) + v.AddArg(x) return true } - // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx [i-2] {s} p idx w mem) + // match: (MULLDconst [0] _) + // result: (MOVDconst [0]) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - w := v.Args[2] - x := v.Args[3] - if x.Op != OpS390XMOVHstoreidx || x.AuxInt != i-2 || x.Aux != s { + if v.AuxInt != 0 { break } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { + v.reset(OpS390XMOVDconst) + v.AuxInt = 0 + return true + } + // match: (MULLDconst [1] x) + // result: x + for { + if v.AuxInt != 1 { break } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != 16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + x := v.Args[0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + // match: (MULLDconst [c] x) + // cond: isPowerOfTwo(c) + // result: (SLDconst [log2(c)] x) + for { + c := v.AuxInt + x := v.Args[0] + if !(isPowerOfTwo(c)) { break } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) + v.reset(OpS390XSLDconst) + v.AuxInt = log2(c) + v.AddArg(x) return true } - // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx [i-2] {s} p idx w mem) + // match: (MULLDconst [c] x) + // cond: isPowerOfTwo(c+1) && c >= 15 + // result: (SUB (SLDconst [log2(c+1)] x) x) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - w := v.Args[2] - x := v.Args[3] - if x.Op != OpS390XMOVHstoreidx || x.AuxInt != i-2 || x.Aux != s { + c := v.AuxInt + x := v.Args[0] + if !(isPowerOfTwo(c+1) && c >= 15) { break } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { + v.reset(OpS390XSUB) + v0 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) + v0.AuxInt = log2(c + 1) + v0.AddArg(x) + v.AddArg(v0) + v.AddArg(x) + return true + } + // match: (MULLDconst [c] x) + // cond: isPowerOfTwo(c-1) && c >= 17 + // result: (ADD (SLDconst [log2(c-1)] x) x) + for { + c := v.AuxInt + x := v.Args[0] + if !(isPowerOfTwo(c-1) && c >= 17) { break } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != 16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + v.reset(OpS390XADD) + v0 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) + v0.AuxInt = log2(c - 1) + v0.AddArg(x) + v.AddArg(v0) + v.AddArg(x) + return true + } + // match: (MULLDconst [c] (MOVDconst [d])) + // result: (MOVDconst [c*d]) + for { + c := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpS390XMOVDconst { break } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) + d := v_0.AuxInt + v.reset(OpS390XMOVDconst) + v.AuxInt = c * d return true } - // match: (MOVHstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [j+16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) + return false +} +func rewriteValueS390X_OpS390XMULLDload_0(v *Value) bool { + b := v.Block + // match: (MULLDload [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _)) + // cond: isSamePtr(ptr1, ptr2) + // result: (MULLD x (LGDR y)) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - w0 := v.Args[2] - if w0.Op != OpS390XSRDconst { + t := v.Type + off := v.AuxInt + sym := v.Aux + _ = v.Args[2] + x := v.Args[0] + ptr1 := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpS390XFMOVDstore || v_2.AuxInt != off || v_2.Aux != sym { break } - j := w0.AuxInt - w := w0.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVHstoreidx || x.AuxInt != i-2 || x.Aux != s { + _ = v_2.Args[2] + ptr2 := v_2.Args[0] + y := v_2.Args[1] + if !(isSamePtr(ptr1, ptr2)) { break } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { + v.reset(OpS390XMULLD) + v.AddArg(x) + v0 := b.NewValue0(v_2.Pos, OpS390XLGDR, t) + v0.AddArg(y) + v.AddArg(v0) + return true + } + // match: (MULLDload [off1] {sym} x (ADDconst [off2] ptr) mem) + // cond: ptr.Op != OpSB && is20Bit(off1+off2) + // result: (MULLDload [off1+off2] {sym} x ptr mem) + for { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[2] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpS390XADDconst { break } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != j+16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + off2 := v_1.AuxInt + ptr := v_1.Args[0] + if !(ptr.Op != OpSB && is20Bit(off1+off2)) { break } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) + v.reset(OpS390XMULLDload) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVHstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [j+16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) + // match: (MULLDload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) + // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) + // result: (MULLDload [o1+o2] {mergeSym(s1, s2)} x ptr mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - w0 := v.Args[2] - if w0.Op != OpS390XSRDconst { - break - } - j := w0.AuxInt - w := w0.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVHstoreidx || x.AuxInt != i-2 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { + o1 := v.AuxInt + s1 := v.Aux + mem := v.Args[2] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpS390XMOVDaddr { break } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != j+16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + o2 := v_1.AuxInt + s2 := v_1.Aux + ptr := v_1.Args[0] + if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { break } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) + v.reset(OpS390XMULLDload) + v.AuxInt = o1 + o2 + v.Aux = mergeSym(s1, s2) + v.AddArg(x) + v.AddArg(ptr) v.AddArg(mem) return true } return false } -func rewriteValueS390X_OpS390XMOVHstoreidx_10(v *Value) bool { - // match: (MOVHstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [j+16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) +func rewriteValueS390X_OpS390XMULLW_0(v *Value) bool { + // match: (MULLW x (MOVDconst [c])) + // result: (MULLWconst [int64(int32(c))] x) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - w0 := v.Args[2] - if w0.Op != OpS390XSRDconst { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XMOVDconst { + continue + } + c := v_1.AuxInt + v.reset(OpS390XMULLWconst) + v.AuxInt = int64(int32(c)) + v.AddArg(x) + return true } - j := w0.AuxInt - w := w0.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVHstoreidx || x.AuxInt != i-2 || x.Aux != s { - break + break + } + // match: (MULLW x g:(MOVWload [off] {sym} ptr mem)) + // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) + // result: (MULLWload [off] {sym} x ptr mem) + for { + t := v.Type + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + g := v.Args[1^_i0] + if g.Op != OpS390XMOVWload { + continue + } + off := g.AuxInt + sym := g.Aux + mem := g.Args[1] + ptr := g.Args[0] + if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + continue + } + v.reset(OpS390XMULLWload) + v.Type = t + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { + break + } + // match: (MULLW x g:(MOVWZload [off] {sym} ptr mem)) + // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) + // result: (MULLWload [off] {sym} x ptr mem) + for { + t := v.Type + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + g := v.Args[1^_i0] + if g.Op != OpS390XMOVWZload { + continue + } + off := g.AuxInt + sym := g.Aux + mem := g.Args[1] + ptr := g.Args[0] + if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + continue + } + v.reset(OpS390XMULLWload) + v.Type = t + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true + } + break + } + return false +} +func rewriteValueS390X_OpS390XMULLWconst_0(v *Value) bool { + b := v.Block + // match: (MULLWconst [-1] x) + // result: (NEGW x) + for { + if v.AuxInt != -1 { break } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != j+16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + x := v.Args[0] + v.reset(OpS390XNEGW) + v.AddArg(x) + return true + } + // match: (MULLWconst [0] _) + // result: (MOVDconst [0]) + for { + if v.AuxInt != 0 { break } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) - v.AddArg(mem) + v.reset(OpS390XMOVDconst) + v.AuxInt = 0 return true } - // match: (MOVHstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRDconst [j+16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) + // match: (MULLWconst [1] x) + // result: x for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - w0 := v.Args[2] - if w0.Op != OpS390XSRDconst { + if v.AuxInt != 1 { break } - j := w0.AuxInt - w := w0.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVHstoreidx || x.AuxInt != i-2 || x.Aux != s { + x := v.Args[0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + // match: (MULLWconst [c] x) + // cond: isPowerOfTwo(c) + // result: (SLWconst [log2(c)] x) + for { + c := v.AuxInt + x := v.Args[0] + if !(isPowerOfTwo(c)) { break } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { + v.reset(OpS390XSLWconst) + v.AuxInt = log2(c) + v.AddArg(x) + return true + } + // match: (MULLWconst [c] x) + // cond: isPowerOfTwo(c+1) && c >= 15 + // result: (SUBW (SLWconst [log2(c+1)] x) x) + for { + c := v.AuxInt + x := v.Args[0] + if !(isPowerOfTwo(c+1) && c >= 15) { break } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != j+16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + v.reset(OpS390XSUBW) + v0 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) + v0.AuxInt = log2(c + 1) + v0.AddArg(x) + v.AddArg(v0) + v.AddArg(x) + return true + } + // match: (MULLWconst [c] x) + // cond: isPowerOfTwo(c-1) && c >= 17 + // result: (ADDW (SLWconst [log2(c-1)] x) x) + for { + c := v.AuxInt + x := v.Args[0] + if !(isPowerOfTwo(c-1) && c >= 17) { break } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) - v.AddArg(mem) + v.reset(OpS390XADDW) + v0 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) + v0.AuxInt = log2(c - 1) + v0.AddArg(x) + v.AddArg(v0) + v.AddArg(x) return true } - // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx [i-2] {s} p idx w mem) + // match: (MULLWconst [c] (MOVDconst [d])) + // result: (MOVDconst [int64(int32(c*d))]) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - w := v.Args[2] - x := v.Args[3] - if x.Op != OpS390XMOVHstoreidx || x.AuxInt != i-2 || x.Aux != s { + c := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpS390XMOVDconst { break } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { + d := v_0.AuxInt + v.reset(OpS390XMOVDconst) + v.AuxInt = int64(int32(c * d)) + return true + } + return false +} +func rewriteValueS390X_OpS390XMULLWload_0(v *Value) bool { + // match: (MULLWload [off1] {sym} x (ADDconst [off2] ptr) mem) + // cond: ptr.Op != OpSB && is20Bit(off1+off2) + // result: (MULLWload [off1+off2] {sym} x ptr mem) + for { + off1 := v.AuxInt + sym := v.Aux + mem := v.Args[2] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpS390XADDconst { break } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRWconst || x_2.AuxInt != 16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + off2 := v_1.AuxInt + ptr := v_1.Args[0] + if !(ptr.Op != OpSB && is20Bit(off1+off2)) { break } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) + v.reset(OpS390XMULLWload) + v.AuxInt = off1 + off2 + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) v.AddArg(mem) return true } - // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx [i-2] {s} p idx w mem) + // match: (MULLWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) + // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) + // result: (MULLWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - w := v.Args[2] - x := v.Args[3] - if x.Op != OpS390XMOVHstoreidx || x.AuxInt != i-2 || x.Aux != s { + o1 := v.AuxInt + s1 := v.Aux + mem := v.Args[2] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpS390XMOVDaddr { break } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { + o2 := v_1.AuxInt + s2 := v_1.Aux + ptr := v_1.Args[0] + if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { break } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRWconst || x_2.AuxInt != 16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + v.reset(OpS390XMULLWload) + v.AuxInt = o1 + o2 + v.Aux = mergeSym(s1, s2) + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true + } + return false +} +func rewriteValueS390X_OpS390XNEG_0(v *Value) bool { + // match: (NEG (MOVDconst [c])) + // result: (MOVDconst [-c]) + for { + v_0 := v.Args[0] + if v_0.Op != OpS390XMOVDconst { break } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) + c := v_0.AuxInt + v.reset(OpS390XMOVDconst) + v.AuxInt = -c return true } - // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx [i-2] {s} p idx w mem) + // match: (NEG (ADDconst [c] (NEG x))) + // cond: c != -(1<<31) + // result: (ADDconst [-c] x) for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - w := v.Args[2] - x := v.Args[3] - if x.Op != OpS390XMOVHstoreidx || x.AuxInt != i-2 || x.Aux != s { + v_0 := v.Args[0] + if v_0.Op != OpS390XADDconst { break } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { + c := v_0.AuxInt + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpS390XNEG { break } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRWconst || x_2.AuxInt != 16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + x := v_0_0.Args[0] + if !(c != -(1 << 31)) { break } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) - return true - } - // match: (MOVHstoreidx [i] {s} idx p w x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx [i-2] {s} p idx w mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - w := v.Args[2] - x := v.Args[3] - if x.Op != OpS390XMOVHstoreidx || x.AuxInt != i-2 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { - break - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRWconst || x_2.AuxInt != 16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) - return true - } - // match: (MOVHstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [j+16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - w0 := v.Args[2] - if w0.Op != OpS390XSRWconst { - break - } - j := w0.AuxInt - w := w0.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVHstoreidx || x.AuxInt != i-2 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { - break - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRWconst || x_2.AuxInt != j+16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) - v.AddArg(mem) - return true - } - // match: (MOVHstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [j+16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - w0 := v.Args[2] - if w0.Op != OpS390XSRWconst { - break - } - j := w0.AuxInt - w := w0.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVHstoreidx || x.AuxInt != i-2 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { - break - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRWconst || x_2.AuxInt != j+16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) - v.AddArg(mem) - return true - } - // match: (MOVHstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [j+16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - w0 := v.Args[2] - if w0.Op != OpS390XSRWconst { - break - } - j := w0.AuxInt - w := w0.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVHstoreidx || x.AuxInt != i-2 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { - break - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRWconst || x_2.AuxInt != j+16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) - v.AddArg(mem) - return true - } - // match: (MOVHstoreidx [i] {s} idx p w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} idx p (SRWconst [j+16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - w0 := v.Args[2] - if w0.Op != OpS390XSRWconst { - break - } - j := w0.AuxInt - w := w0.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVHstoreidx || x.AuxInt != i-2 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { - break - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRWconst || x_2.AuxInt != j+16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = i - 2 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueS390X_OpS390XMOVWBRstore_0(v *Value) bool { - // match: (MOVWBRstore [i] {s} p (SRDconst [32] w) x:(MOVWBRstore [i-4] {s} p w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVDBRstore [i-4] {s} p w mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - p := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XSRDconst || v_1.AuxInt != 32 { - break - } - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpS390XMOVWBRstore || x.AuxInt != i-4 || x.Aux != s { - break - } - mem := x.Args[2] - if p != x.Args[0] || w != x.Args[1] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpS390XMOVDBRstore) - v.AuxInt = i - 4 - v.Aux = s - v.AddArg(p) - v.AddArg(w) - v.AddArg(mem) - return true - } - // match: (MOVWBRstore [i] {s} p (SRDconst [j] w) x:(MOVWBRstore [i-4] {s} p w0:(SRDconst [j-32] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVDBRstore [i-4] {s} p w0 mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - p := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XSRDconst { - break - } - j := v_1.AuxInt - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpS390XMOVWBRstore || x.AuxInt != i-4 || x.Aux != s { - break - } - mem := x.Args[2] - if p != x.Args[0] { - break - } - w0 := x.Args[1] - if w0.Op != OpS390XSRDconst || w0.AuxInt != j-32 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpS390XMOVDBRstore) - v.AuxInt = i - 4 - v.Aux = s - v.AddArg(p) - v.AddArg(w0) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v *Value) bool { - // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} p idx w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRDconst || v_2.AuxInt != 32 { - break - } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVWBRstoreidx || x.AuxInt != i-4 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpS390XMOVDBRstoreidx) - v.AuxInt = i - 4 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) - return true - } - // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} idx p w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRDconst || v_2.AuxInt != 32 { - break - } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVWBRstoreidx || x.AuxInt != i-4 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpS390XMOVDBRstoreidx) - v.AuxInt = i - 4 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) - return true - } - // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} p idx w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRDconst || v_2.AuxInt != 32 { - break - } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVWBRstoreidx || x.AuxInt != i-4 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpS390XMOVDBRstoreidx) - v.AuxInt = i - 4 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) - return true - } - // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} idx p w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRDconst || v_2.AuxInt != 32 { - break - } - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVWBRstoreidx || x.AuxInt != i-4 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpS390XMOVDBRstoreidx) - v.AuxInt = i - 4 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) - return true - } - // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} p idx w0:(SRDconst [j-32] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRDconst { - break - } - j := v_2.AuxInt - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVWBRstoreidx || x.AuxInt != i-4 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { - break - } - w0 := x.Args[2] - if w0.Op != OpS390XSRDconst || w0.AuxInt != j-32 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpS390XMOVDBRstoreidx) - v.AuxInt = i - 4 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) - v.AddArg(mem) - return true - } - // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} idx p w0:(SRDconst [j-32] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRDconst { - break - } - j := v_2.AuxInt - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVWBRstoreidx || x.AuxInt != i-4 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { - break - } - w0 := x.Args[2] - if w0.Op != OpS390XSRDconst || w0.AuxInt != j-32 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpS390XMOVDBRstoreidx) - v.AuxInt = i - 4 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) - v.AddArg(mem) - return true - } - // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} p idx w0:(SRDconst [j-32] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRDconst { - break - } - j := v_2.AuxInt - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVWBRstoreidx || x.AuxInt != i-4 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { - break - } - w0 := x.Args[2] - if w0.Op != OpS390XSRDconst || w0.AuxInt != j-32 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpS390XMOVDBRstoreidx) - v.AuxInt = i - 4 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) - v.AddArg(mem) - return true - } - // match: (MOVWBRstoreidx [i] {s} idx p (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} idx p w0:(SRDconst [j-32] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XSRDconst { - break - } - j := v_2.AuxInt - w := v_2.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVWBRstoreidx || x.AuxInt != i-4 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { - break - } - w0 := x.Args[2] - if w0.Op != OpS390XSRDconst || w0.AuxInt != j-32 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpS390XMOVDBRstoreidx) - v.AuxInt = i - 4 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueS390X_OpS390XMOVWZload_0(v *Value) bool { - // match: (MOVWZload [off] {sym} ptr1 (MOVWstore [off] {sym} ptr2 x _)) - // cond: isSamePtr(ptr1, ptr2) - // result: (MOVWZreg x) - for { - off := v.AuxInt - sym := v.Aux - _ = v.Args[1] - ptr1 := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVWstore || v_1.AuxInt != off || v_1.Aux != sym { - break - } - _ = v_1.Args[2] - ptr2 := v_1.Args[0] - x := v_1.Args[1] - if !(isSamePtr(ptr1, ptr2)) { - break - } - v.reset(OpS390XMOVWZreg) - v.AddArg(x) - return true - } - // match: (MOVWZload [off1] {sym} (ADDconst [off2] ptr) mem) - // cond: is20Bit(off1+off2) - // result: (MOVWZload [off1+off2] {sym} ptr mem) - for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { - break - } - off2 := v_0.AuxInt - ptr := v_0.Args[0] - if !(is20Bit(off1 + off2)) { - break - } - v.reset(OpS390XMOVWZload) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MOVWZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0)) - // result: (MOVWZload [off1+off2] {mergeSym(sym1,sym2)} base mem) - for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDaddr { - break - } - t := v_0.Type - off2 := v_0.AuxInt - sym2 := v_0.Aux - base := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { - break - } - v.reset(OpS390XMOVWZload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(base) - v.AddArg(mem) - return true - } - // match: (MOVWZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVWZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) - for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDaddridx { - break - } - off2 := v_0.AuxInt - sym2 := v_0.Aux - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { - break - } - v.reset(OpS390XMOVWZloadidx) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWZload [off] {sym} (ADD ptr idx) mem) - // cond: ptr.Op != OpSB - // result: (MOVWZloadidx [off] {sym} ptr idx mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XADD { - break - } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(ptr.Op != OpSB) { - break - } - v.reset(OpS390XMOVWZloadidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWZload [off] {sym} (ADD idx ptr) mem) - // cond: ptr.Op != OpSB - // result: (MOVWZloadidx [off] {sym} ptr idx mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XADD { - break - } - ptr := v_0.Args[1] - idx := v_0.Args[0] - if !(ptr.Op != OpSB) { - break - } - v.reset(OpS390XMOVWZloadidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueS390X_OpS390XMOVWZloadidx_0(v *Value) bool { - // match: (MOVWZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) - // cond: is20Bit(c+d) - // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { - break - } - d := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - if !(is20Bit(c + d)) { - break - } - v.reset(OpS390XMOVWZloadidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWZloadidx [c] {sym} idx (ADDconst [d] ptr) mem) - // cond: is20Bit(c+d) - // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - idx := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XADDconst { - break - } - d := v_1.AuxInt - ptr := v_1.Args[0] - if !(is20Bit(c + d)) { - break - } - v.reset(OpS390XMOVWZloadidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) - // cond: is20Bit(c+d) - // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XADDconst { - break - } - d := v_1.AuxInt - idx := v_1.Args[0] - if !(is20Bit(c + d)) { - break - } - v.reset(OpS390XMOVWZloadidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWZloadidx [c] {sym} (ADDconst [d] idx) ptr mem) - // cond: is20Bit(c+d) - // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { - break - } - d := v_0.AuxInt - idx := v_0.Args[0] - ptr := v.Args[1] - if !(is20Bit(c + d)) { - break - } - v.reset(OpS390XMOVWZloadidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueS390X_OpS390XMOVWZreg_0(v *Value) bool { - // match: (MOVWZreg e:(MOVBZreg x)) - // cond: clobberIfDead(e) - // result: (MOVBZreg x) - for { - e := v.Args[0] - if e.Op != OpS390XMOVBZreg { - break - } - x := e.Args[0] - if !(clobberIfDead(e)) { - break - } - v.reset(OpS390XMOVBZreg) - v.AddArg(x) - return true - } - // match: (MOVWZreg e:(MOVHZreg x)) - // cond: clobberIfDead(e) - // result: (MOVHZreg x) - for { - e := v.Args[0] - if e.Op != OpS390XMOVHZreg { - break - } - x := e.Args[0] - if !(clobberIfDead(e)) { - break - } - v.reset(OpS390XMOVHZreg) - v.AddArg(x) - return true - } - // match: (MOVWZreg e:(MOVWreg x)) - // cond: clobberIfDead(e) - // result: (MOVWZreg x) - for { - e := v.Args[0] - if e.Op != OpS390XMOVWreg { - break - } - x := e.Args[0] - if !(clobberIfDead(e)) { - break - } - v.reset(OpS390XMOVWZreg) - v.AddArg(x) - return true - } - // match: (MOVWZreg e:(MOVWZreg x)) - // cond: clobberIfDead(e) - // result: (MOVWZreg x) - for { - e := v.Args[0] - if e.Op != OpS390XMOVWZreg { - break - } - x := e.Args[0] - if !(clobberIfDead(e)) { - break - } - v.reset(OpS390XMOVWZreg) - v.AddArg(x) - return true - } - // match: (MOVWZreg x:(MOVBZload _ _)) - // cond: (!x.Type.IsSigned() || x.Type.Size() > 1) - // result: x - for { - x := v.Args[0] - if x.Op != OpS390XMOVBZload { - break - } - _ = x.Args[1] - if !(!x.Type.IsSigned() || x.Type.Size() > 1) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (MOVWZreg x:(MOVBZloadidx _ _ _)) - // cond: (!x.Type.IsSigned() || x.Type.Size() > 1) - // result: x - for { - x := v.Args[0] - if x.Op != OpS390XMOVBZloadidx { - break - } - _ = x.Args[2] - if !(!x.Type.IsSigned() || x.Type.Size() > 1) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (MOVWZreg x:(MOVHZload _ _)) - // cond: (!x.Type.IsSigned() || x.Type.Size() > 2) - // result: x - for { - x := v.Args[0] - if x.Op != OpS390XMOVHZload { - break - } - _ = x.Args[1] - if !(!x.Type.IsSigned() || x.Type.Size() > 2) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (MOVWZreg x:(MOVHZloadidx _ _ _)) - // cond: (!x.Type.IsSigned() || x.Type.Size() > 2) - // result: x - for { - x := v.Args[0] - if x.Op != OpS390XMOVHZloadidx { - break - } - _ = x.Args[2] - if !(!x.Type.IsSigned() || x.Type.Size() > 2) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (MOVWZreg x:(MOVWZload _ _)) - // cond: (!x.Type.IsSigned() || x.Type.Size() > 4) - // result: x - for { - x := v.Args[0] - if x.Op != OpS390XMOVWZload { - break - } - _ = x.Args[1] - if !(!x.Type.IsSigned() || x.Type.Size() > 4) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (MOVWZreg x:(MOVWZloadidx _ _ _)) - // cond: (!x.Type.IsSigned() || x.Type.Size() > 4) - // result: x - for { - x := v.Args[0] - if x.Op != OpS390XMOVWZloadidx { - break - } - _ = x.Args[2] - if !(!x.Type.IsSigned() || x.Type.Size() > 4) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - return false -} -func rewriteValueS390X_OpS390XMOVWZreg_10(v *Value) bool { - b := v.Block - // match: (MOVWZreg x:(MOVWload [o] {s} p mem)) - // cond: x.Uses == 1 && clobber(x) - // result: @x.Block (MOVWZload [o] {s} p mem) - for { - t := v.Type - x := v.Args[0] - if x.Op != OpS390XMOVWload { - break - } - o := x.AuxInt - s := x.Aux - mem := x.Args[1] - p := x.Args[0] - if !(x.Uses == 1 && clobber(x)) { - break - } - b = x.Block - v0 := b.NewValue0(x.Pos, OpS390XMOVWZload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = o - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (MOVWZreg x:(MOVWloadidx [o] {s} p i mem)) - // cond: x.Uses == 1 && clobber(x) - // result: @x.Block (MOVWZloadidx [o] {s} p i mem) - for { - t := v.Type - x := v.Args[0] - if x.Op != OpS390XMOVWloadidx { - break - } - o := x.AuxInt - s := x.Aux - mem := x.Args[2] - p := x.Args[0] - i := x.Args[1] - if !(x.Uses == 1 && clobber(x)) { - break - } - b = x.Block - v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = o - v0.Aux = s - v0.AddArg(p) - v0.AddArg(i) - v0.AddArg(mem) - return true - } - // match: (MOVWZreg x:(Arg )) - // cond: !t.IsSigned() && t.Size() <= 4 - // result: x - for { - x := v.Args[0] - if x.Op != OpArg { - break - } - t := x.Type - if !(!t.IsSigned() && t.Size() <= 4) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (MOVWZreg (MOVDconst [c])) - // result: (MOVDconst [int64(uint32(c))]) - for { - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst { - break - } - c := v_0.AuxInt - v.reset(OpS390XMOVDconst) - v.AuxInt = int64(uint32(c)) - return true - } - return false -} -func rewriteValueS390X_OpS390XMOVWload_0(v *Value) bool { - // match: (MOVWload [off] {sym} ptr1 (MOVWstore [off] {sym} ptr2 x _)) - // cond: isSamePtr(ptr1, ptr2) - // result: (MOVWreg x) - for { - off := v.AuxInt - sym := v.Aux - _ = v.Args[1] - ptr1 := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVWstore || v_1.AuxInt != off || v_1.Aux != sym { - break - } - _ = v_1.Args[2] - ptr2 := v_1.Args[0] - x := v_1.Args[1] - if !(isSamePtr(ptr1, ptr2)) { - break - } - v.reset(OpS390XMOVWreg) - v.AddArg(x) - return true - } - // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) - // cond: is20Bit(off1+off2) - // result: (MOVWload [off1+off2] {sym} ptr mem) - for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { - break - } - off2 := v_0.AuxInt - ptr := v_0.Args[0] - if !(is20Bit(off1 + off2)) { - break - } - v.reset(OpS390XMOVWload) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MOVWload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0)) - // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} base mem) - for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDaddr { - break - } - t := v_0.Type - off2 := v_0.AuxInt - sym2 := v_0.Aux - base := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { - break - } - v.reset(OpS390XMOVWload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(base) - v.AddArg(mem) - return true - } - // match: (MOVWload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVWloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) - for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDaddridx { - break - } - off2 := v_0.AuxInt - sym2 := v_0.Aux - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { - break - } - v.reset(OpS390XMOVWloadidx) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWload [off] {sym} (ADD ptr idx) mem) - // cond: ptr.Op != OpSB - // result: (MOVWloadidx [off] {sym} ptr idx mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XADD { - break - } - idx := v_0.Args[1] - ptr := v_0.Args[0] - if !(ptr.Op != OpSB) { - break - } - v.reset(OpS390XMOVWloadidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWload [off] {sym} (ADD idx ptr) mem) - // cond: ptr.Op != OpSB - // result: (MOVWloadidx [off] {sym} ptr idx mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XADD { - break - } - ptr := v_0.Args[1] - idx := v_0.Args[0] - if !(ptr.Op != OpSB) { - break - } - v.reset(OpS390XMOVWloadidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueS390X_OpS390XMOVWloadidx_0(v *Value) bool { - // match: (MOVWloadidx [c] {sym} (ADDconst [d] ptr) idx mem) - // cond: is20Bit(c+d) - // result: (MOVWloadidx [c+d] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { - break - } - d := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - if !(is20Bit(c + d)) { - break - } - v.reset(OpS390XMOVWloadidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWloadidx [c] {sym} idx (ADDconst [d] ptr) mem) - // cond: is20Bit(c+d) - // result: (MOVWloadidx [c+d] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - idx := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XADDconst { - break - } - d := v_1.AuxInt - ptr := v_1.Args[0] - if !(is20Bit(c + d)) { - break - } - v.reset(OpS390XMOVWloadidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWloadidx [c] {sym} ptr (ADDconst [d] idx) mem) - // cond: is20Bit(c+d) - // result: (MOVWloadidx [c+d] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XADDconst { - break - } - d := v_1.AuxInt - idx := v_1.Args[0] - if !(is20Bit(c + d)) { - break - } - v.reset(OpS390XMOVWloadidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - // match: (MOVWloadidx [c] {sym} (ADDconst [d] idx) ptr mem) - // cond: is20Bit(c+d) - // result: (MOVWloadidx [c+d] {sym} ptr idx mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { - break - } - d := v_0.AuxInt - idx := v_0.Args[0] - ptr := v.Args[1] - if !(is20Bit(c + d)) { - break - } - v.reset(OpS390XMOVWloadidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueS390X_OpS390XMOVWreg_0(v *Value) bool { - // match: (MOVWreg e:(MOVBreg x)) - // cond: clobberIfDead(e) - // result: (MOVBreg x) - for { - e := v.Args[0] - if e.Op != OpS390XMOVBreg { - break - } - x := e.Args[0] - if !(clobberIfDead(e)) { - break - } - v.reset(OpS390XMOVBreg) - v.AddArg(x) - return true - } - // match: (MOVWreg e:(MOVHreg x)) - // cond: clobberIfDead(e) - // result: (MOVHreg x) - for { - e := v.Args[0] - if e.Op != OpS390XMOVHreg { - break - } - x := e.Args[0] - if !(clobberIfDead(e)) { - break - } - v.reset(OpS390XMOVHreg) - v.AddArg(x) - return true - } - // match: (MOVWreg e:(MOVWreg x)) - // cond: clobberIfDead(e) - // result: (MOVWreg x) - for { - e := v.Args[0] - if e.Op != OpS390XMOVWreg { - break - } - x := e.Args[0] - if !(clobberIfDead(e)) { - break - } - v.reset(OpS390XMOVWreg) - v.AddArg(x) - return true - } - // match: (MOVWreg e:(MOVWZreg x)) - // cond: clobberIfDead(e) - // result: (MOVWreg x) - for { - e := v.Args[0] - if e.Op != OpS390XMOVWZreg { - break - } - x := e.Args[0] - if !(clobberIfDead(e)) { - break - } - v.reset(OpS390XMOVWreg) - v.AddArg(x) - return true - } - // match: (MOVWreg x:(MOVBload _ _)) - // cond: (x.Type.IsSigned() || x.Type.Size() == 8) - // result: x - for { - x := v.Args[0] - if x.Op != OpS390XMOVBload { - break - } - _ = x.Args[1] - if !(x.Type.IsSigned() || x.Type.Size() == 8) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (MOVWreg x:(MOVBloadidx _ _ _)) - // cond: (x.Type.IsSigned() || x.Type.Size() == 8) - // result: x - for { - x := v.Args[0] - if x.Op != OpS390XMOVBloadidx { - break - } - _ = x.Args[2] - if !(x.Type.IsSigned() || x.Type.Size() == 8) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (MOVWreg x:(MOVHload _ _)) - // cond: (x.Type.IsSigned() || x.Type.Size() == 8) - // result: x - for { - x := v.Args[0] - if x.Op != OpS390XMOVHload { - break - } - _ = x.Args[1] - if !(x.Type.IsSigned() || x.Type.Size() == 8) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (MOVWreg x:(MOVHloadidx _ _ _)) - // cond: (x.Type.IsSigned() || x.Type.Size() == 8) - // result: x - for { - x := v.Args[0] - if x.Op != OpS390XMOVHloadidx { - break - } - _ = x.Args[2] - if !(x.Type.IsSigned() || x.Type.Size() == 8) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (MOVWreg x:(MOVWload _ _)) - // cond: (x.Type.IsSigned() || x.Type.Size() == 8) - // result: x - for { - x := v.Args[0] - if x.Op != OpS390XMOVWload { - break - } - _ = x.Args[1] - if !(x.Type.IsSigned() || x.Type.Size() == 8) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (MOVWreg x:(MOVWloadidx _ _ _)) - // cond: (x.Type.IsSigned() || x.Type.Size() == 8) - // result: x - for { - x := v.Args[0] - if x.Op != OpS390XMOVWloadidx { - break - } - _ = x.Args[2] - if !(x.Type.IsSigned() || x.Type.Size() == 8) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - return false -} -func rewriteValueS390X_OpS390XMOVWreg_10(v *Value) bool { - b := v.Block - // match: (MOVWreg x:(MOVBZload _ _)) - // cond: (!x.Type.IsSigned() || x.Type.Size() > 1) - // result: x - for { - x := v.Args[0] - if x.Op != OpS390XMOVBZload { - break - } - _ = x.Args[1] - if !(!x.Type.IsSigned() || x.Type.Size() > 1) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (MOVWreg x:(MOVBZloadidx _ _ _)) - // cond: (!x.Type.IsSigned() || x.Type.Size() > 1) - // result: x - for { - x := v.Args[0] - if x.Op != OpS390XMOVBZloadidx { - break - } - _ = x.Args[2] - if !(!x.Type.IsSigned() || x.Type.Size() > 1) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (MOVWreg x:(MOVHZload _ _)) - // cond: (!x.Type.IsSigned() || x.Type.Size() > 2) - // result: x - for { - x := v.Args[0] - if x.Op != OpS390XMOVHZload { - break - } - _ = x.Args[1] - if !(!x.Type.IsSigned() || x.Type.Size() > 2) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (MOVWreg x:(MOVHZloadidx _ _ _)) - // cond: (!x.Type.IsSigned() || x.Type.Size() > 2) - // result: x - for { - x := v.Args[0] - if x.Op != OpS390XMOVHZloadidx { - break - } - _ = x.Args[2] - if !(!x.Type.IsSigned() || x.Type.Size() > 2) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (MOVWreg x:(MOVWZload [o] {s} p mem)) - // cond: x.Uses == 1 && clobber(x) - // result: @x.Block (MOVWload [o] {s} p mem) - for { - t := v.Type - x := v.Args[0] - if x.Op != OpS390XMOVWZload { - break - } - o := x.AuxInt - s := x.Aux - mem := x.Args[1] - p := x.Args[0] - if !(x.Uses == 1 && clobber(x)) { - break - } - b = x.Block - v0 := b.NewValue0(x.Pos, OpS390XMOVWload, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = o - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (MOVWreg x:(MOVWZloadidx [o] {s} p i mem)) - // cond: x.Uses == 1 && clobber(x) - // result: @x.Block (MOVWloadidx [o] {s} p i mem) - for { - t := v.Type - x := v.Args[0] - if x.Op != OpS390XMOVWZloadidx { - break - } - o := x.AuxInt - s := x.Aux - mem := x.Args[2] - p := x.Args[0] - i := x.Args[1] - if !(x.Uses == 1 && clobber(x)) { - break - } - b = x.Block - v0 := b.NewValue0(v.Pos, OpS390XMOVWloadidx, t) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = o - v0.Aux = s - v0.AddArg(p) - v0.AddArg(i) - v0.AddArg(mem) - return true - } - // match: (MOVWreg x:(Arg )) - // cond: t.IsSigned() && t.Size() <= 4 - // result: x - for { - x := v.Args[0] - if x.Op != OpArg { - break - } - t := x.Type - if !(t.IsSigned() && t.Size() <= 4) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (MOVWreg (MOVDconst [c])) - // result: (MOVDconst [int64(int32(c))]) - for { - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst { - break - } - c := v_0.AuxInt - v.reset(OpS390XMOVDconst) - v.AuxInt = int64(int32(c)) - return true - } - return false -} -func rewriteValueS390X_OpS390XMOVWstore_0(v *Value) bool { - // match: (MOVWstore [off] {sym} ptr (MOVWreg x) mem) - // result: (MOVWstore [off] {sym} ptr x mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVWreg { - break - } - x := v_1.Args[0] - v.reset(OpS390XMOVWstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true - } - // match: (MOVWstore [off] {sym} ptr (MOVWZreg x) mem) - // result: (MOVWstore [off] {sym} ptr x mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVWZreg { - break - } - x := v_1.Args[0] - v.reset(OpS390XMOVWstore) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(x) - v.AddArg(mem) - return true - } - // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) - // cond: is20Bit(off1+off2) - // result: (MOVWstore [off1+off2] {sym} ptr val mem) - for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { - break - } - off2 := v_0.AuxInt - ptr := v_0.Args[0] - val := v.Args[1] - if !(is20Bit(off1 + off2)) { - break - } - v.reset(OpS390XMOVWstore) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(ptr) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstore [off] {sym} ptr (MOVDconst [c]) mem) - // cond: is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB - // result: (MOVWstoreconst [makeValAndOff(int64(int32(c)),off)] {sym} ptr mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDconst { - break - } - c := v_1.AuxInt - if !(is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB) { - break - } - v.reset(OpS390XMOVWstoreconst) - v.AuxInt = makeValAndOff(int64(int32(c)), off) - v.Aux = sym - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MOVWstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0)) - // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) - for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDaddr { - break - } - t := v_0.Type - off2 := v_0.AuxInt - sym2 := v_0.Aux - base := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { - break - } - v.reset(OpS390XMOVWstore) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(base) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVWstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) - for { - off1 := v.AuxInt - sym1 := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDaddridx { - break - } - off2 := v_0.AuxInt - sym2 := v_0.Aux - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v.Args[1] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { - break - } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstore [off] {sym} (ADD ptr idx) val mem) - // cond: ptr.Op != OpSB - // result: (MOVWstoreidx [off] {sym} ptr idx val mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpS390XADD { - break - } - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { - break - } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstore [off] {sym} (ADD idx ptr) val mem) - // cond: ptr.Op != OpSB - // result: (MOVWstoreidx [off] {sym} ptr idx val mem) - for { - off := v.AuxInt - sym := v.Aux - mem := v.Args[2] - v_0 := v.Args[0] - if v_0.Op != OpS390XADD { - break - } - ptr := v_0.Args[1] - idx := v_0.Args[0] - val := v.Args[1] - if !(ptr.Op != OpSB) { - break - } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = off - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstore [i] {s} p (SRDconst [32] w) x:(MOVWstore [i-4] {s} p w mem)) - // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) - // result: (MOVDstore [i-4] {s} p w mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - p := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XSRDconst || v_1.AuxInt != 32 { - break - } - w := v_1.Args[0] - x := v.Args[2] - if x.Op != OpS390XMOVWstore || x.AuxInt != i-4 || x.Aux != s { - break - } - mem := x.Args[2] - if p != x.Args[0] || w != x.Args[1] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpS390XMOVDstore) - v.AuxInt = i - 4 - v.Aux = s - v.AddArg(p) - v.AddArg(w) - v.AddArg(mem) - return true - } - // match: (MOVWstore [i] {s} p w0:(SRDconst [j] w) x:(MOVWstore [i-4] {s} p (SRDconst [j+32] w) mem)) - // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) - // result: (MOVDstore [i-4] {s} p w0 mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - p := v.Args[0] - w0 := v.Args[1] - if w0.Op != OpS390XSRDconst { - break - } - j := w0.AuxInt - w := w0.Args[0] - x := v.Args[2] - if x.Op != OpS390XMOVWstore || x.AuxInt != i-4 || x.Aux != s { - break - } - mem := x.Args[2] - if p != x.Args[0] { - break - } - x_1 := x.Args[1] - if x_1.Op != OpS390XSRDconst || x_1.AuxInt != j+32 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpS390XMOVDstore) - v.AuxInt = i - 4 - v.Aux = s - v.AddArg(p) - v.AddArg(w0) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueS390X_OpS390XMOVWstore_10(v *Value) bool { - // match: (MOVWstore [i] {s} p w1 x:(MOVWstore [i-4] {s} p w0 mem)) - // cond: p.Op != OpSB && x.Uses == 1 && is20Bit(i-4) && clobber(x) - // result: (STM2 [i-4] {s} p w0 w1 mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - p := v.Args[0] - w1 := v.Args[1] - x := v.Args[2] - if x.Op != OpS390XMOVWstore || x.AuxInt != i-4 || x.Aux != s { - break - } - mem := x.Args[2] - if p != x.Args[0] { - break - } - w0 := x.Args[1] - if !(p.Op != OpSB && x.Uses == 1 && is20Bit(i-4) && clobber(x)) { - break - } - v.reset(OpS390XSTM2) - v.AuxInt = i - 4 - v.Aux = s - v.AddArg(p) - v.AddArg(w0) - v.AddArg(w1) - v.AddArg(mem) - return true - } - // match: (MOVWstore [i] {s} p w2 x:(STM2 [i-8] {s} p w0 w1 mem)) - // cond: x.Uses == 1 && is20Bit(i-8) && clobber(x) - // result: (STM3 [i-8] {s} p w0 w1 w2 mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - p := v.Args[0] - w2 := v.Args[1] - x := v.Args[2] - if x.Op != OpS390XSTM2 || x.AuxInt != i-8 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] { - break - } - w0 := x.Args[1] - w1 := x.Args[2] - if !(x.Uses == 1 && is20Bit(i-8) && clobber(x)) { - break - } - v.reset(OpS390XSTM3) - v.AuxInt = i - 8 - v.Aux = s - v.AddArg(p) - v.AddArg(w0) - v.AddArg(w1) - v.AddArg(w2) - v.AddArg(mem) - return true - } - // match: (MOVWstore [i] {s} p w3 x:(STM3 [i-12] {s} p w0 w1 w2 mem)) - // cond: x.Uses == 1 && is20Bit(i-12) && clobber(x) - // result: (STM4 [i-12] {s} p w0 w1 w2 w3 mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[2] - p := v.Args[0] - w3 := v.Args[1] - x := v.Args[2] - if x.Op != OpS390XSTM3 || x.AuxInt != i-12 || x.Aux != s { - break - } - mem := x.Args[4] - if p != x.Args[0] { - break - } - w0 := x.Args[1] - w1 := x.Args[2] - w2 := x.Args[3] - if !(x.Uses == 1 && is20Bit(i-12) && clobber(x)) { - break - } - v.reset(OpS390XSTM4) - v.AuxInt = i - 12 - v.Aux = s - v.AddArg(p) - v.AddArg(w0) - v.AddArg(w1) - v.AddArg(w2) - v.AddArg(w3) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueS390X_OpS390XMOVWstoreconst_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (MOVWstoreconst [sc] {s} (ADDconst [off] ptr) mem) - // cond: isU12Bit(ValAndOff(sc).Off()+off) - // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) - for { - sc := v.AuxInt - s := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { - break - } - off := v_0.AuxInt - ptr := v_0.Args[0] - if !(isU12Bit(ValAndOff(sc).Off() + off)) { - break - } - v.reset(OpS390XMOVWstoreconst) - v.AuxInt = ValAndOff(sc).add(off) - v.Aux = s - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MOVWstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) - // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) - // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) - for { - sc := v.AuxInt - sym1 := v.Aux - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDaddr { - break - } - off := v_0.AuxInt - sym2 := v_0.Aux - ptr := v_0.Args[0] - if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { - break - } - v.reset(OpS390XMOVWstoreconst) - v.AuxInt = ValAndOff(sc).add(off) - v.Aux = mergeSym(sym1, sym2) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MOVWstoreconst [c] {s} p x:(MOVWstoreconst [a] {s} p mem)) - // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 4 == ValAndOff(c).Off() && clobber(x) - // result: (MOVDstore [ValAndOff(a).Off()] {s} p (MOVDconst [ValAndOff(c).Val()&0xffffffff | ValAndOff(a).Val()<<32]) mem) - for { - c := v.AuxInt - s := v.Aux - _ = v.Args[1] - p := v.Args[0] - x := v.Args[1] - if x.Op != OpS390XMOVWstoreconst { - break - } - a := x.AuxInt - if x.Aux != s { - break - } - mem := x.Args[1] - if p != x.Args[0] || !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+4 == ValAndOff(c).Off() && clobber(x)) { - break - } - v.reset(OpS390XMOVDstore) - v.AuxInt = ValAndOff(a).Off() - v.Aux = s - v.AddArg(p) - v0 := b.NewValue0(x.Pos, OpS390XMOVDconst, typ.UInt64) - v0.AuxInt = ValAndOff(c).Val()&0xffffffff | ValAndOff(a).Val()<<32 - v.AddArg(v0) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool { - // match: (MOVWstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) - // cond: is20Bit(c+d) - // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[3] - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { - break - } - d := v_0.AuxInt - ptr := v_0.Args[0] - idx := v.Args[1] - val := v.Args[2] - if !(is20Bit(c + d)) { - break - } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx [c] {sym} idx (ADDconst [d] ptr) val mem) - // cond: is20Bit(c+d) - // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[3] - idx := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XADDconst { - break - } - d := v_1.AuxInt - ptr := v_1.Args[0] - val := v.Args[2] - if !(is20Bit(c + d)) { - break - } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) - // cond: is20Bit(c+d) - // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[3] - ptr := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XADDconst { - break - } - d := v_1.AuxInt - idx := v_1.Args[0] - val := v.Args[2] - if !(is20Bit(c + d)) { - break - } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx [c] {sym} (ADDconst [d] idx) ptr val mem) - // cond: is20Bit(c+d) - // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) - for { - c := v.AuxInt - sym := v.Aux - mem := v.Args[3] - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { - break - } - d := v_0.AuxInt - idx := v_0.Args[0] - ptr := v.Args[1] - val := v.Args[2] - if !(is20Bit(c + d)) { - break - } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = c + d - v.Aux = sym - v.AddArg(ptr) - v.AddArg(idx) - v.AddArg(val) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx [i] {s} p idx w x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [32] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVDstoreidx [i-4] {s} p idx w mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - w := v.Args[2] - x := v.Args[3] - if x.Op != OpS390XMOVWstoreidx || x.AuxInt != i-4 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { - break - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != 32 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpS390XMOVDstoreidx) - v.AuxInt = i - 4 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx [i] {s} p idx w x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [32] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVDstoreidx [i-4] {s} p idx w mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - w := v.Args[2] - x := v.Args[3] - if x.Op != OpS390XMOVWstoreidx || x.AuxInt != i-4 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { - break - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != 32 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpS390XMOVDstoreidx) - v.AuxInt = i - 4 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx [i] {s} idx p w x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [32] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVDstoreidx [i-4] {s} p idx w mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - w := v.Args[2] - x := v.Args[3] - if x.Op != OpS390XMOVWstoreidx || x.AuxInt != i-4 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { - break - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != 32 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpS390XMOVDstoreidx) - v.AuxInt = i - 4 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx [i] {s} idx p w x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [32] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVDstoreidx [i-4] {s} p idx w mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - w := v.Args[2] - x := v.Args[3] - if x.Op != OpS390XMOVWstoreidx || x.AuxInt != i-4 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { - break - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != 32 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpS390XMOVDstoreidx) - v.AuxInt = i - 4 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [j+32] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - w0 := v.Args[2] - if w0.Op != OpS390XSRDconst { - break - } - j := w0.AuxInt - w := w0.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVWstoreidx || x.AuxInt != i-4 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { - break - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != j+32 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpS390XMOVDstoreidx) - v.AuxInt = i - 4 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [j+32] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - p := v.Args[0] - idx := v.Args[1] - w0 := v.Args[2] - if w0.Op != OpS390XSRDconst { - break - } - j := w0.AuxInt - w := w0.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVWstoreidx || x.AuxInt != i-4 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { - break - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != j+32 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpS390XMOVDstoreidx) - v.AuxInt = i - 4 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueS390X_OpS390XMOVWstoreidx_10(v *Value) bool { - // match: (MOVWstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [j+32] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - w0 := v.Args[2] - if w0.Op != OpS390XSRDconst { - break - } - j := w0.AuxInt - w := w0.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVWstoreidx || x.AuxInt != i-4 || x.Aux != s { - break - } - mem := x.Args[3] - if p != x.Args[0] || idx != x.Args[1] { - break - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != j+32 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpS390XMOVDstoreidx) - v.AuxInt = i - 4 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) - v.AddArg(mem) - return true - } - // match: (MOVWstoreidx [i] {s} idx p w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} idx p (SRDconst [j+32] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) - for { - i := v.AuxInt - s := v.Aux - _ = v.Args[3] - idx := v.Args[0] - p := v.Args[1] - w0 := v.Args[2] - if w0.Op != OpS390XSRDconst { - break - } - j := w0.AuxInt - w := w0.Args[0] - x := v.Args[3] - if x.Op != OpS390XMOVWstoreidx || x.AuxInt != i-4 || x.Aux != s { - break - } - mem := x.Args[3] - if idx != x.Args[0] || p != x.Args[1] { - break - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != j+32 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - break - } - v.reset(OpS390XMOVDstoreidx) - v.AuxInt = i - 4 - v.Aux = s - v.AddArg(p) - v.AddArg(idx) - v.AddArg(w0) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueS390X_OpS390XMULLD_0(v *Value) bool { - // match: (MULLD x (MOVDconst [c])) - // cond: is32Bit(c) - // result: (MULLDconst [c] x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDconst { - break - } - c := v_1.AuxInt - if !(is32Bit(c)) { - break - } - v.reset(OpS390XMULLDconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (MULLD (MOVDconst [c]) x) - // cond: is32Bit(c) - // result: (MULLDconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst { - break - } - c := v_0.AuxInt - if !(is32Bit(c)) { - break - } - v.reset(OpS390XMULLDconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (MULLD x g:(MOVDload [off] {sym} ptr mem)) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) - // result: (MULLDload [off] {sym} x ptr mem) - for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - g := v.Args[1] - if g.Op != OpS390XMOVDload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break - } - v.reset(OpS390XMULLDload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MULLD g:(MOVDload [off] {sym} ptr mem) x) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) - // result: (MULLDload [off] {sym} x ptr mem) - for { - t := v.Type - x := v.Args[1] - g := v.Args[0] - if g.Op != OpS390XMOVDload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break - } - v.reset(OpS390XMULLDload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueS390X_OpS390XMULLDconst_0(v *Value) bool { - b := v.Block - // match: (MULLDconst [-1] x) - // result: (NEG x) - for { - if v.AuxInt != -1 { - break - } - x := v.Args[0] - v.reset(OpS390XNEG) - v.AddArg(x) - return true - } - // match: (MULLDconst [0] _) - // result: (MOVDconst [0]) - for { - if v.AuxInt != 0 { - break - } - v.reset(OpS390XMOVDconst) - v.AuxInt = 0 - return true - } - // match: (MULLDconst [1] x) - // result: x - for { - if v.AuxInt != 1 { - break - } - x := v.Args[0] - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (MULLDconst [c] x) - // cond: isPowerOfTwo(c) - // result: (SLDconst [log2(c)] x) - for { - c := v.AuxInt - x := v.Args[0] - if !(isPowerOfTwo(c)) { - break - } - v.reset(OpS390XSLDconst) - v.AuxInt = log2(c) - v.AddArg(x) - return true - } - // match: (MULLDconst [c] x) - // cond: isPowerOfTwo(c+1) && c >= 15 - // result: (SUB (SLDconst [log2(c+1)] x) x) - for { - c := v.AuxInt - x := v.Args[0] - if !(isPowerOfTwo(c+1) && c >= 15) { - break - } - v.reset(OpS390XSUB) - v0 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v0.AuxInt = log2(c + 1) - v0.AddArg(x) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (MULLDconst [c] x) - // cond: isPowerOfTwo(c-1) && c >= 17 - // result: (ADD (SLDconst [log2(c-1)] x) x) - for { - c := v.AuxInt - x := v.Args[0] - if !(isPowerOfTwo(c-1) && c >= 17) { - break - } - v.reset(OpS390XADD) - v0 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v0.AuxInt = log2(c - 1) - v0.AddArg(x) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (MULLDconst [c] (MOVDconst [d])) - // result: (MOVDconst [c*d]) - for { - c := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst { - break - } - d := v_0.AuxInt - v.reset(OpS390XMOVDconst) - v.AuxInt = c * d - return true - } - return false -} -func rewriteValueS390X_OpS390XMULLDload_0(v *Value) bool { - b := v.Block - // match: (MULLDload [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _)) - // cond: isSamePtr(ptr1, ptr2) - // result: (MULLD x (LGDR y)) - for { - t := v.Type - off := v.AuxInt - sym := v.Aux - _ = v.Args[2] - x := v.Args[0] - ptr1 := v.Args[1] - v_2 := v.Args[2] - if v_2.Op != OpS390XFMOVDstore || v_2.AuxInt != off || v_2.Aux != sym { - break - } - _ = v_2.Args[2] - ptr2 := v_2.Args[0] - y := v_2.Args[1] - if !(isSamePtr(ptr1, ptr2)) { - break - } - v.reset(OpS390XMULLD) - v.AddArg(x) - v0 := b.NewValue0(v_2.Pos, OpS390XLGDR, t) - v0.AddArg(y) - v.AddArg(v0) - return true - } - // match: (MULLDload [off1] {sym} x (ADDconst [off2] ptr) mem) - // cond: ptr.Op != OpSB && is20Bit(off1+off2) - // result: (MULLDload [off1+off2] {sym} x ptr mem) - for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[2] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XADDconst { - break - } - off2 := v_1.AuxInt - ptr := v_1.Args[0] - if !(ptr.Op != OpSB && is20Bit(off1+off2)) { - break - } - v.reset(OpS390XMULLDload) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MULLDload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) - // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) - // result: (MULLDload [o1+o2] {mergeSym(s1, s2)} x ptr mem) - for { - o1 := v.AuxInt - s1 := v.Aux - mem := v.Args[2] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDaddr { - break - } - o2 := v_1.AuxInt - s2 := v_1.Aux - ptr := v_1.Args[0] - if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { - break - } - v.reset(OpS390XMULLDload) - v.AuxInt = o1 + o2 - v.Aux = mergeSym(s1, s2) - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueS390X_OpS390XMULLW_0(v *Value) bool { - // match: (MULLW x (MOVDconst [c])) - // result: (MULLWconst [int64(int32(c))] x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDconst { - break - } - c := v_1.AuxInt - v.reset(OpS390XMULLWconst) - v.AuxInt = int64(int32(c)) - v.AddArg(x) - return true - } - // match: (MULLW (MOVDconst [c]) x) - // result: (MULLWconst [int64(int32(c))] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst { - break - } - c := v_0.AuxInt - v.reset(OpS390XMULLWconst) - v.AuxInt = int64(int32(c)) - v.AddArg(x) - return true - } - // match: (MULLW x g:(MOVWload [off] {sym} ptr mem)) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) - // result: (MULLWload [off] {sym} x ptr mem) - for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - g := v.Args[1] - if g.Op != OpS390XMOVWload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break - } - v.reset(OpS390XMULLWload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MULLW g:(MOVWload [off] {sym} ptr mem) x) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) - // result: (MULLWload [off] {sym} x ptr mem) - for { - t := v.Type - x := v.Args[1] - g := v.Args[0] - if g.Op != OpS390XMOVWload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break - } - v.reset(OpS390XMULLWload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MULLW x g:(MOVWZload [off] {sym} ptr mem)) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) - // result: (MULLWload [off] {sym} x ptr mem) - for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - g := v.Args[1] - if g.Op != OpS390XMOVWZload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break - } - v.reset(OpS390XMULLWload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MULLW g:(MOVWZload [off] {sym} ptr mem) x) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) - // result: (MULLWload [off] {sym} x ptr mem) - for { - t := v.Type - x := v.Args[1] - g := v.Args[0] - if g.Op != OpS390XMOVWZload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break - } - v.reset(OpS390XMULLWload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueS390X_OpS390XMULLWconst_0(v *Value) bool { - b := v.Block - // match: (MULLWconst [-1] x) - // result: (NEGW x) - for { - if v.AuxInt != -1 { - break - } - x := v.Args[0] - v.reset(OpS390XNEGW) - v.AddArg(x) - return true - } - // match: (MULLWconst [0] _) - // result: (MOVDconst [0]) - for { - if v.AuxInt != 0 { - break - } - v.reset(OpS390XMOVDconst) - v.AuxInt = 0 - return true - } - // match: (MULLWconst [1] x) - // result: x - for { - if v.AuxInt != 1 { - break - } - x := v.Args[0] - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (MULLWconst [c] x) - // cond: isPowerOfTwo(c) - // result: (SLWconst [log2(c)] x) - for { - c := v.AuxInt - x := v.Args[0] - if !(isPowerOfTwo(c)) { - break - } - v.reset(OpS390XSLWconst) - v.AuxInt = log2(c) - v.AddArg(x) - return true - } - // match: (MULLWconst [c] x) - // cond: isPowerOfTwo(c+1) && c >= 15 - // result: (SUBW (SLWconst [log2(c+1)] x) x) - for { - c := v.AuxInt - x := v.Args[0] - if !(isPowerOfTwo(c+1) && c >= 15) { - break - } - v.reset(OpS390XSUBW) - v0 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v0.AuxInt = log2(c + 1) - v0.AddArg(x) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (MULLWconst [c] x) - // cond: isPowerOfTwo(c-1) && c >= 17 - // result: (ADDW (SLWconst [log2(c-1)] x) x) - for { - c := v.AuxInt - x := v.Args[0] - if !(isPowerOfTwo(c-1) && c >= 17) { - break - } - v.reset(OpS390XADDW) - v0 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v0.AuxInt = log2(c - 1) - v0.AddArg(x) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (MULLWconst [c] (MOVDconst [d])) - // result: (MOVDconst [int64(int32(c*d))]) - for { - c := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst { - break - } - d := v_0.AuxInt - v.reset(OpS390XMOVDconst) - v.AuxInt = int64(int32(c * d)) - return true - } - return false -} -func rewriteValueS390X_OpS390XMULLWload_0(v *Value) bool { - // match: (MULLWload [off1] {sym} x (ADDconst [off2] ptr) mem) - // cond: ptr.Op != OpSB && is20Bit(off1+off2) - // result: (MULLWload [off1+off2] {sym} x ptr mem) - for { - off1 := v.AuxInt - sym := v.Aux - mem := v.Args[2] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XADDconst { - break - } - off2 := v_1.AuxInt - ptr := v_1.Args[0] - if !(ptr.Op != OpSB && is20Bit(off1+off2)) { - break - } - v.reset(OpS390XMULLWload) - v.AuxInt = off1 + off2 - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (MULLWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) - // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) - // result: (MULLWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) - for { - o1 := v.AuxInt - s1 := v.Aux - mem := v.Args[2] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDaddr { - break - } - o2 := v_1.AuxInt - s2 := v_1.Aux - ptr := v_1.Args[0] - if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { - break - } - v.reset(OpS390XMULLWload) - v.AuxInt = o1 + o2 - v.Aux = mergeSym(s1, s2) - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - return false -} -func rewriteValueS390X_OpS390XNEG_0(v *Value) bool { - // match: (NEG (MOVDconst [c])) - // result: (MOVDconst [-c]) - for { - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst { - break - } - c := v_0.AuxInt - v.reset(OpS390XMOVDconst) - v.AuxInt = -c - return true - } - // match: (NEG (ADDconst [c] (NEG x))) - // cond: c != -(1<<31) - // result: (ADDconst [-c] x) - for { - v_0 := v.Args[0] - if v_0.Op != OpS390XADDconst { - break - } - c := v_0.AuxInt - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpS390XNEG { - break - } - x := v_0_0.Args[0] - if !(c != -(1 << 31)) { - break - } - v.reset(OpS390XADDconst) - v.AuxInt = -c - v.AddArg(x) - return true - } - return false -} -func rewriteValueS390X_OpS390XNEGW_0(v *Value) bool { - // match: (NEGW (MOVDconst [c])) - // result: (MOVDconst [int64(int32(-c))]) - for { - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst { - break - } - c := v_0.AuxInt - v.reset(OpS390XMOVDconst) - v.AuxInt = int64(int32(-c)) - return true - } - return false -} -func rewriteValueS390X_OpS390XNOT_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (NOT x) - // cond: true - // result: (XOR (MOVDconst [-1]) x) - for { - x := v.Args[0] - if !(true) { - break - } - v.reset(OpS390XXOR) - v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) - v0.AuxInt = -1 - v.AddArg(v0) - v.AddArg(x) - return true - } - return false -} -func rewriteValueS390X_OpS390XNOTW_0(v *Value) bool { - // match: (NOTW x) - // cond: true - // result: (XORWconst [-1] x) - for { - x := v.Args[0] - if !(true) { - break - } - v.reset(OpS390XXORWconst) - v.AuxInt = -1 - v.AddArg(x) - return true - } - return false -} -func rewriteValueS390X_OpS390XOR_0(v *Value) bool { - b := v.Block - // match: (OR x (MOVDconst [c])) - // cond: isU32Bit(c) - // result: (ORconst [c] x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDconst { - break - } - c := v_1.AuxInt - if !(isU32Bit(c)) { - break - } - v.reset(OpS390XORconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (OR (MOVDconst [c]) x) - // cond: isU32Bit(c) - // result: (ORconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst { - break - } - c := v_0.AuxInt - if !(isU32Bit(c)) { - break - } - v.reset(OpS390XORconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (OR (SLDconst x [c]) (SRDconst x [d])) - // cond: d == 64-c - // result: (RLLGconst [c] x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XSLDconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XSRDconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(d == 64-c) { - break - } - v.reset(OpS390XRLLGconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (OR (SRDconst x [d]) (SLDconst x [c])) - // cond: d == 64-c - // result: (RLLGconst [c] x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XSRDconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XSLDconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(d == 64-c) { - break - } - v.reset(OpS390XRLLGconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (OR (MOVDconst [-1<<63]) (LGDR x)) - // result: (LGDR (LNDFR x)) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst || v_0.AuxInt != -1<<63 { - break - } - v_1 := v.Args[1] - if v_1.Op != OpS390XLGDR { - break - } - t := v_1.Type - x := v_1.Args[0] - v.reset(OpS390XLGDR) - v.Type = t - v0 := b.NewValue0(v.Pos, OpS390XLNDFR, x.Type) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (OR (LGDR x) (MOVDconst [-1<<63])) - // result: (LGDR (LNDFR x)) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XLGDR { - break - } - t := v_0.Type - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDconst || v_1.AuxInt != -1<<63 { - break - } - v.reset(OpS390XLGDR) - v.Type = t - v0 := b.NewValue0(v.Pos, OpS390XLNDFR, x.Type) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (OR (SLDconst [63] (SRDconst [63] (LGDR x))) (LGDR (LPDFR y))) - // result: (LGDR (CPSDR y x)) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XSLDconst || v_0.AuxInt != 63 { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpS390XSRDconst || v_0_0.AuxInt != 63 { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpS390XLGDR { - break - } - x := v_0_0_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XLGDR { - break - } - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpS390XLPDFR { - break - } - t := v_1_0.Type - y := v_1_0.Args[0] - v.reset(OpS390XLGDR) - v0 := b.NewValue0(v.Pos, OpS390XCPSDR, t) - v0.AddArg(y) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (OR (LGDR (LPDFR y)) (SLDconst [63] (SRDconst [63] (LGDR x)))) - // result: (LGDR (CPSDR y x)) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XLGDR { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpS390XLPDFR { - break - } - t := v_0_0.Type - y := v_0_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XSLDconst || v_1.AuxInt != 63 { - break - } - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpS390XSRDconst || v_1_0.AuxInt != 63 { - break - } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpS390XLGDR { - break - } - x := v_1_0_0.Args[0] - v.reset(OpS390XLGDR) - v0 := b.NewValue0(v.Pos, OpS390XCPSDR, t) - v0.AddArg(y) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (OR (SLDconst [63] (SRDconst [63] (LGDR x))) (MOVDconst [c])) - // cond: c & -1<<63 == 0 - // result: (LGDR (CPSDR (FMOVDconst [c]) x)) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XSLDconst || v_0.AuxInt != 63 { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpS390XSRDconst || v_0_0.AuxInt != 63 { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpS390XLGDR { - break - } - x := v_0_0_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDconst { - break - } - c := v_1.AuxInt - if !(c&-1<<63 == 0) { - break - } - v.reset(OpS390XLGDR) - v0 := b.NewValue0(v.Pos, OpS390XCPSDR, x.Type) - v1 := b.NewValue0(v.Pos, OpS390XFMOVDconst, x.Type) - v1.AuxInt = c - v0.AddArg(v1) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (OR (MOVDconst [c]) (SLDconst [63] (SRDconst [63] (LGDR x)))) - // cond: c & -1<<63 == 0 - // result: (LGDR (CPSDR (FMOVDconst [c]) x)) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpS390XSLDconst || v_1.AuxInt != 63 { - break - } - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpS390XSRDconst || v_1_0.AuxInt != 63 { - break - } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpS390XLGDR { - break - } - x := v_1_0_0.Args[0] - if !(c&-1<<63 == 0) { - break - } - v.reset(OpS390XLGDR) - v0 := b.NewValue0(v.Pos, OpS390XCPSDR, x.Type) - v1 := b.NewValue0(v.Pos, OpS390XFMOVDconst, x.Type) - v1.AuxInt = c - v0.AddArg(v1) - v0.AddArg(x) - v.AddArg(v0) - return true - } - return false -} -func rewriteValueS390X_OpS390XOR_10(v *Value) bool { - b := v.Block - // match: (OR (AND (MOVDconst [-1<<63]) (LGDR x)) (LGDR (LPDFR y))) - // result: (LGDR (CPSDR y x)) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XAND { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpS390XMOVDconst || v_0_0.AuxInt != -1<<63 { - break - } - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpS390XLGDR { - break - } - x := v_0_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XLGDR { - break - } - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpS390XLPDFR { - break - } - t := v_1_0.Type - y := v_1_0.Args[0] - v.reset(OpS390XLGDR) - v0 := b.NewValue0(v.Pos, OpS390XCPSDR, t) - v0.AddArg(y) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (OR (AND (LGDR x) (MOVDconst [-1<<63])) (LGDR (LPDFR y))) - // result: (LGDR (CPSDR y x)) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XAND { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpS390XLGDR { - break - } - x := v_0_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpS390XMOVDconst || v_0_1.AuxInt != -1<<63 { - break - } - v_1 := v.Args[1] - if v_1.Op != OpS390XLGDR { - break - } - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpS390XLPDFR { - break - } - t := v_1_0.Type - y := v_1_0.Args[0] - v.reset(OpS390XLGDR) - v0 := b.NewValue0(v.Pos, OpS390XCPSDR, t) - v0.AddArg(y) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (OR (LGDR (LPDFR y)) (AND (MOVDconst [-1<<63]) (LGDR x))) - // result: (LGDR (CPSDR y x)) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XLGDR { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpS390XLPDFR { - break - } - t := v_0_0.Type - y := v_0_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XAND { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpS390XMOVDconst || v_1_0.AuxInt != -1<<63 { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpS390XLGDR { - break - } - x := v_1_1.Args[0] - v.reset(OpS390XLGDR) - v0 := b.NewValue0(v.Pos, OpS390XCPSDR, t) - v0.AddArg(y) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (OR (LGDR (LPDFR y)) (AND (LGDR x) (MOVDconst [-1<<63]))) - // result: (LGDR (CPSDR y x)) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XLGDR { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpS390XLPDFR { - break - } - t := v_0_0.Type - y := v_0_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XAND { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpS390XLGDR { - break - } - x := v_1_0.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpS390XMOVDconst || v_1_1.AuxInt != -1<<63 { - break - } - v.reset(OpS390XLGDR) - v0 := b.NewValue0(v.Pos, OpS390XCPSDR, t) - v0.AddArg(y) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (OR (AND (MOVDconst [-1<<63]) (LGDR x)) (MOVDconst [c])) - // cond: c & -1<<63 == 0 - // result: (LGDR (CPSDR (FMOVDconst [c]) x)) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XAND { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpS390XMOVDconst || v_0_0.AuxInt != -1<<63 { - break - } - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpS390XLGDR { - break - } - x := v_0_1.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDconst { - break - } - c := v_1.AuxInt - if !(c&-1<<63 == 0) { - break - } - v.reset(OpS390XLGDR) - v0 := b.NewValue0(v.Pos, OpS390XCPSDR, x.Type) - v1 := b.NewValue0(v.Pos, OpS390XFMOVDconst, x.Type) - v1.AuxInt = c - v0.AddArg(v1) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (OR (AND (LGDR x) (MOVDconst [-1<<63])) (MOVDconst [c])) - // cond: c & -1<<63 == 0 - // result: (LGDR (CPSDR (FMOVDconst [c]) x)) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XAND { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpS390XLGDR { - break - } - x := v_0_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpS390XMOVDconst || v_0_1.AuxInt != -1<<63 { - break - } - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDconst { - break - } - c := v_1.AuxInt - if !(c&-1<<63 == 0) { - break - } - v.reset(OpS390XLGDR) - v0 := b.NewValue0(v.Pos, OpS390XCPSDR, x.Type) - v1 := b.NewValue0(v.Pos, OpS390XFMOVDconst, x.Type) - v1.AuxInt = c - v0.AddArg(v1) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (OR (MOVDconst [c]) (AND (MOVDconst [-1<<63]) (LGDR x))) - // cond: c & -1<<63 == 0 - // result: (LGDR (CPSDR (FMOVDconst [c]) x)) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpS390XAND { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpS390XMOVDconst || v_1_0.AuxInt != -1<<63 { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpS390XLGDR { - break - } - x := v_1_1.Args[0] - if !(c&-1<<63 == 0) { - break - } - v.reset(OpS390XLGDR) - v0 := b.NewValue0(v.Pos, OpS390XCPSDR, x.Type) - v1 := b.NewValue0(v.Pos, OpS390XFMOVDconst, x.Type) - v1.AuxInt = c - v0.AddArg(v1) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (OR (MOVDconst [c]) (AND (LGDR x) (MOVDconst [-1<<63]))) - // cond: c & -1<<63 == 0 - // result: (LGDR (CPSDR (FMOVDconst [c]) x)) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpS390XAND { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpS390XLGDR { - break - } - x := v_1_0.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpS390XMOVDconst || v_1_1.AuxInt != -1<<63 || !(c&-1<<63 == 0) { - break - } - v.reset(OpS390XLGDR) - v0 := b.NewValue0(v.Pos, OpS390XCPSDR, x.Type) - v1 := b.NewValue0(v.Pos, OpS390XFMOVDconst, x.Type) - v1.AuxInt = c - v0.AddArg(v1) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (OR (MOVDconst [c]) (MOVDconst [d])) - // result: (MOVDconst [c|d]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDconst { - break - } - d := v_1.AuxInt - v.reset(OpS390XMOVDconst) - v.AuxInt = c | d - return true - } - // match: (OR (MOVDconst [d]) (MOVDconst [c])) - // result: (MOVDconst [c|d]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDconst { - break - } - c := v_1.AuxInt - v.reset(OpS390XMOVDconst) - v.AuxInt = c | d - return true - } - return false -} -func rewriteValueS390X_OpS390XOR_20(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (OR x x) - // result: x - for { - x := v.Args[1] - if x != v.Args[0] { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (OR x g:(MOVDload [off] {sym} ptr mem)) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) - // result: (ORload [off] {sym} x ptr mem) - for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - g := v.Args[1] - if g.Op != OpS390XMOVDload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break - } - v.reset(OpS390XORload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (OR g:(MOVDload [off] {sym} ptr mem) x) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) - // result: (ORload [off] {sym} x ptr mem) - for { - t := v.Type - x := v.Args[1] - g := v.Args[0] - if g.Op != OpS390XMOVDload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break - } - v.reset(OpS390XORload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (OR x1:(MOVBZload [i1] {s} p mem) sh:(SLDconst [8] x0:(MOVBZload [i0] {s} p mem))) - // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpS390XMOVBZload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVBZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x0.Pos, OpS390XMOVHZload, typ.UInt16) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (OR sh:(SLDconst [8] x0:(MOVBZload [i0] {s} p mem)) x1:(MOVBZload [i1] {s} p mem)) - // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVBZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - x1 := v.Args[1] - if x1.Op != OpS390XMOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpS390XMOVHZload, typ.UInt16) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (OR x1:(MOVHZload [i1] {s} p mem) sh:(SLDconst [16] x0:(MOVHZload [i0] {s} p mem))) - // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpS390XMOVHZload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 16 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVHZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x0.Pos, OpS390XMOVWZload, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (OR sh:(SLDconst [16] x0:(MOVHZload [i0] {s} p mem)) x1:(MOVHZload [i1] {s} p mem)) - // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 16 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVHZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - x1 := v.Args[1] - if x1.Op != OpS390XMOVHZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpS390XMOVWZload, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (OR x1:(MOVWZload [i1] {s} p mem) sh:(SLDconst [32] x0:(MOVWZload [i0] {s} p mem))) - // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVDload [i0] {s} p mem) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpS390XMOVWZload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 32 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVWZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x0.Pos, OpS390XMOVDload, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (OR sh:(SLDconst [32] x0:(MOVWZload [i0] {s} p mem)) x1:(MOVWZload [i1] {s} p mem)) - // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVDload [i0] {s} p mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 32 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVWZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - x1 := v.Args[1] - if x1.Op != OpS390XMOVWZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpS390XMOVDload, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) y)) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVHZload [i0] {s} p mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x1.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(x1.Pos, OpS390XMOVHZload, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - return false -} -func rewriteValueS390X_OpS390XOR_30(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVHZload [i0] {s} p mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x1.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(x1.Pos, OpS390XMOVHZload, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) y) s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVHZload [i0] {s} p mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - s0 := v.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x0.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(x0.Pos, OpS390XMOVHZload, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))) s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVHZload [i0] {s} p mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - s0 := v.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x0.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(x0.Pos, OpS390XMOVHZload, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)) y)) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVWZload [i0] {s} p mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVHZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVHZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x1.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(x1.Pos, OpS390XMOVWZload, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVWZload [i0] {s} p mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVHZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVHZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x1.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(x1.Pos, OpS390XMOVWZload, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)) y) s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVWZload [i0] {s} p mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVHZload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - s0 := v.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVHZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x0.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(x0.Pos, OpS390XMOVWZload, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem))) s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVWZload [i0] {s} p mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVHZload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - s0 := v.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVHZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x0.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(x0.Pos, OpS390XMOVWZload, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) - // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) - // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) - // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - return false -} -func rewriteValueS390X_OpS390XOR_40(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (OR x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) - // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) - // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - x1 := v.Args[1] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) - // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - x1 := v.Args[1] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) - // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - x1 := v.Args[1] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) - // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - x1 := v.Args[1] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) - // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 16 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) - // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 16 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) - // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 16 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) - // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 16 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) - // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 16 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - x1 := v.Args[1] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - return false -} -func rewriteValueS390X_OpS390XOR_50(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) - // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 16 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - x1 := v.Args[1] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) - // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 16 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - x1 := v.Args[1] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) - // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 16 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - x1 := v.Args[1] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR x1:(MOVWZloadidx [i1] {s} p idx mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem))) - // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpS390XMOVWZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 32 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVWZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR x1:(MOVWZloadidx [i1] {s} idx p mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem))) - // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpS390XMOVWZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 32 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVWZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR x1:(MOVWZloadidx [i1] {s} p idx mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem))) - // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpS390XMOVWZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 32 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVWZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR x1:(MOVWZloadidx [i1] {s} idx p mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem))) - // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpS390XMOVWZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 32 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVWZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem)) x1:(MOVWZloadidx [i1] {s} p idx mem)) - // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 32 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVWZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - x1 := v.Args[1] - if x1.Op != OpS390XMOVWZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem)) x1:(MOVWZloadidx [i1] {s} p idx mem)) - // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 32 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVWZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - x1 := v.Args[1] - if x1.Op != OpS390XMOVWZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem)) x1:(MOVWZloadidx [i1] {s} idx p mem)) - // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 32 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVWZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - x1 := v.Args[1] - if x1.Op != OpS390XMOVWZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - return false -} -func rewriteValueS390X_OpS390XOR_60(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (OR sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem)) x1:(MOVWZloadidx [i1] {s} idx p mem)) - // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 32 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVWZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - x1 := v.Args[1] - if x1.Op != OpS390XMOVWZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) or:(OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) y)) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) y)) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) or:(OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) y)) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) y)) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) y) s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - return false -} -func rewriteValueS390X_OpS390XOR_70(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) y) s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) y) s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) y) s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem)) or:(OR s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} p idx mem)) y)) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} idx p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} p idx mem)) y)) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem)) or:(OR s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} idx p mem)) y)) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - return false -} -func rewriteValueS390X_OpS390XOR_80(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (OR s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} idx p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} idx p mem)) y)) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} p idx mem)))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} idx p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} p idx mem)))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} idx p mem)))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} idx p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} idx p mem)))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} p idx mem)) y) s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} idx p mem)) y) s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} p idx mem))) s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} idx p mem))) s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} p idx mem)) y) s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} idx p mem))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - return false -} -func rewriteValueS390X_OpS390XOR_90(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} idx p mem)) y) s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} idx p mem))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} p idx mem))) s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} idx p mem))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} idx p mem))) s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} idx p mem))) - // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR x0:(MOVBZload [i0] {s} p mem) sh:(SLDconst [8] x1:(MOVBZload [i1] {s} p mem))) - // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpS390XMOVBZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpS390XMOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpS390XMOVHZreg, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpS390XMOVHBRload, typ.UInt16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR sh:(SLDconst [8] x1:(MOVBZload [i1] {s} p mem)) x0:(MOVBZload [i0] {s} p mem)) - // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpS390XMOVBZload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - x0 := v.Args[1] - if x0.Op != OpS390XMOVBZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x0.Pos, OpS390XMOVHZreg, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpS390XMOVHBRload, typ.UInt16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRload [i0] {s} p mem)) - for { - _ = v.Args[1] - r0 := v.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 16 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpS390XMOVWZreg, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpS390XMOVWBRload, typ.UInt32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRload [i0] {s} p mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 16 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - r0 := v.Args[1] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x0.Pos, OpS390XMOVWZreg, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpS390XMOVWBRload, typ.UInt32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR r0:(MOVWZreg x0:(MOVWBRload [i0] {s} p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRload [i1] {s} p mem)))) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVDBRload [i0] {s} p mem) - for { - _ = v.Args[1] - r0 := v.Args[0] - if r0.Op != OpS390XMOVWZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVWBRload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 32 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVWZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVWBRload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpS390XMOVDBRload, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRload [i1] {s} p mem))) r0:(MOVWZreg x0:(MOVWBRload [i0] {s} p mem))) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVDBRload [i0] {s} p mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 32 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVWZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVWBRload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - r0 := v.Args[1] - if r0.Op != OpS390XMOVWZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVWBRload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x0.Pos, OpS390XMOVDBRload, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) y)) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x0.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(x0.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(x0.Pos, OpS390XMOVHBRload, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - return false -} -func rewriteValueS390X_OpS390XOR_100(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(OR y s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)))) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x0.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(x0.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(x0.Pos, OpS390XMOVHBRload, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) y) s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - s1 := v.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x1.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(x1.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(x1.Pos, OpS390XMOVHBRload, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR y s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem))) s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem))) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - s1 := v.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x1.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(x1.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(x1.Pos, OpS390XMOVHBRload, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))) y)) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x0.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(x0.Pos, OpS390XMOVWZreg, typ.UInt64) - v3 := b.NewValue0(x0.Pos, OpS390XMOVWBRload, typ.UInt32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x0.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(x0.Pos, OpS390XMOVWZreg, typ.UInt64) - v3 := b.NewValue0(x0.Pos, OpS390XMOVWBRload, typ.UInt32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))) y) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - s1 := v.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x1.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(x1.Pos, OpS390XMOVWZreg, typ.UInt64) - v3 := b.NewValue0(x1.Pos, OpS390XMOVWBRload, typ.UInt32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)))) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - s1 := v.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x1.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(x1.Pos, OpS390XMOVWZreg, typ.UInt64) - v3 := b.NewValue0(x1.Pos, OpS390XMOVWBRload, typ.UInt32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) - // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) - // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) - // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - return false -} -func rewriteValueS390X_OpS390XOR_110(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (OR x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) - // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) - // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - x0 := v.Args[1] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) - // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - x0 := v.Args[1] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) - // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - x0 := v.Args[1] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) - // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - x0 := v.Args[1] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) - for { - _ = v.Args[1] - r0 := v.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 16 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) - for { - _ = v.Args[1] - r0 := v.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 16 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) - for { - _ = v.Args[1] - r0 := v.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 16 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) - for { - _ = v.Args[1] - r0 := v.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 16 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 16 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - r0 := v.Args[1] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - return false -} -func rewriteValueS390X_OpS390XOR_120(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 16 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - r0 := v.Args[1] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 16 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - r0 := v.Args[1] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 16 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - r0 := v.Args[1] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem)))) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - r0 := v.Args[0] - if r0.Op != OpS390XMOVWZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVWBRloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 32 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVWZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVWBRloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem)))) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - r0 := v.Args[0] - if r0.Op != OpS390XMOVWZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVWBRloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 32 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVWZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVWBRloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem)))) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - r0 := v.Args[0] - if r0.Op != OpS390XMOVWZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVWBRloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 32 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVWZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVWBRloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem)))) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - r0 := v.Args[0] - if r0.Op != OpS390XMOVWZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVWBRloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 32 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVWZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVWBRloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem))) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 32 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVWZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVWBRloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - r0 := v.Args[1] - if r0.Op != OpS390XMOVWZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVWBRloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem))) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 32 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVWZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVWBRloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - r0 := v.Args[1] - if r0.Op != OpS390XMOVWZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVWBRloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem))) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 32 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVWZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVWBRloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - r0 := v.Args[1] - if r0.Op != OpS390XMOVWZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVWBRloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - return false -} -func rewriteValueS390X_OpS390XOR_130(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (OR sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem))) r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem))) - // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLDconst || sh.AuxInt != 32 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVWZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVWBRloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - r0 := v.Args[1] - if r0.Op != OpS390XMOVWZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVWBRloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) or:(OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) y)) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) or:(OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) y)) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) or:(OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) y)) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) or:(OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) y)) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) or:(OR y s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)))) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) or:(OR y s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)))) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) or:(OR y s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)))) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) or:(OR y s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)))) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) y) s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - return false -} -func rewriteValueS390X_OpS390XOR_140(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (OR or:(OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) y) s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR y s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR y s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) y) s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) y) s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR y s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR y s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) y)) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) y)) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) y)) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - return false -} -func rewriteValueS390X_OpS390XOR_150(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) y)) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - or := v.Args[1] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) y) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) y) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)))) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)))) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) y) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - return false -} -func rewriteValueS390X_OpS390XOR_160(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (OR or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) y) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)))) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (OR or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)))) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) - // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XOR { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLDconst { - break - } - j0 := s0.AuxInt - r0 := s0.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpS390XSLDconst { - break - } - j1 := s1.AuxInt - r1 := s1.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - return false -} -func rewriteValueS390X_OpS390XORW_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORW x (MOVDconst [c])) - // result: (ORWconst [int64(int32(c))] x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDconst { - break - } - c := v_1.AuxInt - v.reset(OpS390XORWconst) - v.AuxInt = int64(int32(c)) - v.AddArg(x) - return true - } - // match: (ORW (MOVDconst [c]) x) - // result: (ORWconst [int64(int32(c))] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst { - break - } - c := v_0.AuxInt - v.reset(OpS390XORWconst) - v.AuxInt = int64(int32(c)) - v.AddArg(x) - return true - } - // match: (ORW (SLWconst x [c]) (SRWconst x [d])) - // cond: d == 32-c - // result: (RLLconst [c] x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XSLWconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XSRWconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(d == 32-c) { - break - } - v.reset(OpS390XRLLconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ORW (SRWconst x [d]) (SLWconst x [c])) - // cond: d == 32-c - // result: (RLLconst [c] x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XSRWconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XSLWconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(d == 32-c) { - break - } - v.reset(OpS390XRLLconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (ORW x x) - // result: x - for { - x := v.Args[1] - if x != v.Args[0] { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (ORW x g:(MOVWload [off] {sym} ptr mem)) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) - // result: (ORWload [off] {sym} x ptr mem) - for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - g := v.Args[1] - if g.Op != OpS390XMOVWload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break - } - v.reset(OpS390XORWload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (ORW g:(MOVWload [off] {sym} ptr mem) x) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) - // result: (ORWload [off] {sym} x ptr mem) - for { - t := v.Type - x := v.Args[1] - g := v.Args[0] - if g.Op != OpS390XMOVWload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break - } - v.reset(OpS390XORWload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (ORW x g:(MOVWZload [off] {sym} ptr mem)) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) - // result: (ORWload [off] {sym} x ptr mem) - for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - g := v.Args[1] - if g.Op != OpS390XMOVWZload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break - } - v.reset(OpS390XORWload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (ORW g:(MOVWZload [off] {sym} ptr mem) x) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) - // result: (ORWload [off] {sym} x ptr mem) - for { - t := v.Type - x := v.Args[1] - g := v.Args[0] - if g.Op != OpS390XMOVWZload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break - } - v.reset(OpS390XORWload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (ORW x1:(MOVBZload [i1] {s} p mem) sh:(SLWconst [8] x0:(MOVBZload [i0] {s} p mem))) - // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpS390XMOVBZload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - sh := v.Args[1] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVBZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x0.Pos, OpS390XMOVHZload, typ.UInt16) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - return false -} -func rewriteValueS390X_OpS390XORW_10(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORW sh:(SLWconst [8] x0:(MOVBZload [i0] {s} p mem)) x1:(MOVBZload [i1] {s} p mem)) - // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVBZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - x1 := v.Args[1] - if x1.Op != OpS390XMOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpS390XMOVHZload, typ.UInt16) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (ORW x1:(MOVHZload [i1] {s} p mem) sh:(SLWconst [16] x0:(MOVHZload [i0] {s} p mem))) - // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpS390XMOVHZload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - sh := v.Args[1] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 16 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVHZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x0.Pos, OpS390XMOVWZload, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (ORW sh:(SLWconst [16] x0:(MOVHZload [i0] {s} p mem)) x1:(MOVHZload [i1] {s} p mem)) - // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 16 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVHZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - x1 := v.Args[1] - if x1.Op != OpS390XMOVHZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpS390XMOVWZload, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) y)) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j1] (MOVHZload [i0] {s} p mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - or := v.Args[1] - if or.Op != OpS390XORW { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x1.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(x1.Pos, OpS390XMOVHZload, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(ORW y s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j1] (MOVHZload [i0] {s} p mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - or := v.Args[1] - if or.Op != OpS390XORW { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x1.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(x1.Pos, OpS390XMOVHZload, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORW or:(ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) y) s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j1] (MOVHZload [i0] {s} p mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XORW { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - s0 := v.Args[1] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x0.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(x0.Pos, OpS390XMOVHZload, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORW or:(ORW y s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j1] (MOVHZload [i0] {s} p mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XORW { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - s0 := v.Args[1] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x0.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(x0.Pos, OpS390XMOVHZload, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORW x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) - // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORW x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) - // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORW x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) - // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - return false -} -func rewriteValueS390X_OpS390XORW_20(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORW x1:(MOVBZloadidx [i1] {s} idx p mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem))) - // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) - // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - x1 := v.Args[1] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} p idx mem)) - // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - x1 := v.Args[1] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) - // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - x1 := v.Args[1] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORW sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} idx p mem)) x1:(MOVBZloadidx [i1] {s} idx p mem)) - // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 8 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - x1 := v.Args[1] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORW x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) - // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 16 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORW x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) - // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 16 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORW x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) - // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 16 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORW x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem))) - // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - x1 := v.Args[0] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 16 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) - // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 16 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - x1 := v.Args[1] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - return false -} -func rewriteValueS390X_OpS390XORW_30(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} p idx mem)) - // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 16 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - x1 := v.Args[1] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) - // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 16 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - x1 := v.Args[1] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORW sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} idx p mem)) x1:(MOVHZloadidx [i1] {s} idx p mem)) - // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 16 { - break - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - x1 := v.Args[1] - if x1.Op != OpS390XMOVHZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true - } - // match: (ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) or:(ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) y)) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - or := v.Args[1] - if or.Op != OpS390XORW { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) or:(ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) y)) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - or := v.Args[1] - if or.Op != OpS390XORW { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) or:(ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) y)) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - or := v.Args[1] - if or.Op != OpS390XORW { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) or:(ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) y)) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - or := v.Args[1] - if or.Op != OpS390XORW { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) or:(ORW y s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - or := v.Args[1] - if or.Op != OpS390XORW { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) or:(ORW y s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - or := v.Args[1] - if or.Op != OpS390XORW { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) or:(ORW y s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - or := v.Args[1] - if or.Op != OpS390XORW { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - return false -} -func rewriteValueS390X_OpS390XORW_40(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) or:(ORW y s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - s0 := v.Args[0] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - or := v.Args[1] - if or.Op != OpS390XORW { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORW or:(ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) y) s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XORW { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORW or:(ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) y) s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XORW { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORW or:(ORW y s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XORW { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORW or:(ORW y s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XORW { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORW or:(ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) y) s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XORW { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORW or:(ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) y) s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XORW { - break - } - y := or.Args[1] - s1 := or.Args[0] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORW or:(ORW y s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XORW { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORW or:(ORW y s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) - // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XORW { - break - } - _ = or.Args[1] - y := or.Args[0] - s1 := or.Args[1] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - s0 := v.Args[1] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j1 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s - v2.AddArg(p) - v2.AddArg(idx) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORW x0:(MOVBZload [i0] {s} p mem) sh:(SLWconst [8] x1:(MOVBZload [i1] {s} p mem))) - // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpS390XMOVBZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - sh := v.Args[1] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpS390XMOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpS390XMOVHZreg, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpS390XMOVHBRload, typ.UInt16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - return false -} -func rewriteValueS390X_OpS390XORW_50(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ORW sh:(SLWconst [8] x1:(MOVBZload [i1] {s} p mem)) x0:(MOVBZload [i0] {s} p mem)) - // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpS390XMOVBZload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - x0 := v.Args[1] - if x0.Op != OpS390XMOVBZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x0.Pos, OpS390XMOVHZreg, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpS390XMOVHBRload, typ.UInt16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORW r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWBRload [i0] {s} p mem) - for { - _ = v.Args[1] - r0 := v.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - sh := v.Args[1] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 16 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x1.Pos, OpS390XMOVWBRload, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWBRload [i0] {s} p mem) - for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 16 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - r0 := v.Args[1] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(x0.Pos, OpS390XMOVWBRload, typ.UInt32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(mem) - return true - } - // match: (ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) y)) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - or := v.Args[1] - if or.Op != OpS390XORW { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x0.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(x0.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(x0.Pos, OpS390XMOVHBRload, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(ORW y s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)))) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) - for { - _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZload { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[1] - p := x1.Args[0] - or := v.Args[1] - if or.Op != OpS390XORW { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZload { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[1] - if p != x0.Args[0] || mem != x0.Args[1] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x0.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x0.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(x0.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(x0.Pos, OpS390XMOVHBRload, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORW or:(ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) y) s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XORW { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - s1 := v.Args[1] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x1.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(x1.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(x1.Pos, OpS390XMOVHBRload, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORW or:(ORW y s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) - for { - _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XORW { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZload { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[1] - p := x0.Args[0] - s1 := v.Args[1] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZload { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[1] - if p != x1.Args[0] || mem != x1.Args[1] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break - } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(x1.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(x1.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(x1.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(x1.Pos, OpS390XMOVHBRload, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true - } - // match: (ORW x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) - // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORW x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) - // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) + v.reset(OpS390XADDconst) + v.AuxInt = -c + v.AddArg(x) return true } - // match: (ORW x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) - // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) + return false +} +func rewriteValueS390X_OpS390XNEGW_0(v *Value) bool { + // match: (NEGW (MOVDconst [c])) + // result: (MOVDconst [int64(int32(-c))]) for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { + v_0 := v.Args[0] + if v_0.Op != OpS390XMOVDconst { break } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) + c := v_0.AuxInt + v.reset(OpS390XMOVDconst) + v.AuxInt = int64(int32(-c)) return true } return false } -func rewriteValueS390X_OpS390XORW_60(v *Value) bool { +func rewriteValueS390X_OpS390XNOT_0(v *Value) bool { b := v.Block typ := &b.Func.Config.Types - // match: (ORW x0:(MOVBZloadidx [i0] {s} idx p mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem))) - // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) - for { - _ = v.Args[1] - x0 := v.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true - } - // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) - // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) + // match: (NOT x) + // cond: true + // result: (XOR (MOVDconst [-1]) x) for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - x0 := v.Args[1] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { + x := v.Args[0] + if !(true) { break } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v.reset(OpCopy) + v.reset(OpS390XXOR) + v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) + v0.AuxInt = -1 v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) + v.AddArg(x) return true } - // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} p idx mem)) - // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) + return false +} +func rewriteValueS390X_OpS390XNOTW_0(v *Value) bool { + // match: (NOTW x) + // cond: true + // result: (XORWconst [-1] x) for { - _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - x0 := v.Args[1] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { + x := v.Args[0] + if !(true) { break } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) + v.reset(OpS390XXORWconst) + v.AuxInt = -1 + v.AddArg(x) return true } - // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) - // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) + return false +} +func rewriteValueS390X_OpS390XOR_0(v *Value) bool { + b := v.Block + // match: (OR x (MOVDconst [c])) + // cond: isU32Bit(c) + // result: (ORconst [c] x) for { _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - x0 := v.Args[1] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XMOVDconst { + continue + } + c := v_1.AuxInt + if !(isU32Bit(c)) { + continue + } + v.reset(OpS390XORconst) + v.AuxInt = c + v.AddArg(x) + return true } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true + break } - // match: (ORW sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} idx p mem)) x0:(MOVBZloadidx [i0] {s} idx p mem)) - // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) + // match: ( OR (SLDconst x [c]) (SRDconst x [d])) + // cond: d == 64-c + // result: (RLLGconst [c] x) for { _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 8 { - break - } - x1 := sh.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - x0 := v.Args[1] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpS390XSLDconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XSRDconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(d == 64-c) { + continue + } + v.reset(OpS390XRLLGconst) + v.AuxInt = c + v.AddArg(x) + return true } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v1.AuxInt = i0 - v1.Aux = s - v1.AddArg(p) - v1.AddArg(idx) - v1.AddArg(mem) - v0.AddArg(v1) - return true + break } - // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) + // match: (OR (MOVDconst [-1<<63]) (LGDR x)) + // result: (LGDR (LNDFR x)) for { _ = v.Args[1] - r0 := v.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 16 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpS390XMOVDconst || v_0.AuxInt != -1<<63 { + continue + } + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XLGDR { + continue + } + t := v_1.Type + x := v_1.Args[0] + v.reset(OpS390XLGDR) + v.Type = t + v0 := b.NewValue0(v.Pos, OpS390XLNDFR, x.Type) + v0.AddArg(x) + v.AddArg(v0) + return true } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true + break } - // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) + // match: (OR (SLDconst [63] (SRDconst [63] (LGDR x))) (LGDR (LPDFR y))) + // result: (LGDR (CPSDR y x)) for { _ = v.Args[1] - r0 := v.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 16 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpS390XSLDconst || v_0.AuxInt != 63 { + continue + } + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpS390XSRDconst || v_0_0.AuxInt != 63 { + continue + } + v_0_0_0 := v_0_0.Args[0] + if v_0_0_0.Op != OpS390XLGDR { + continue + } + x := v_0_0_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XLGDR { + continue + } + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpS390XLPDFR { + continue + } + t := v_1_0.Type + y := v_1_0.Args[0] + v.reset(OpS390XLGDR) + v0 := b.NewValue0(v.Pos, OpS390XCPSDR, t) + v0.AddArg(y) + v0.AddArg(x) + v.AddArg(v0) + return true } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true + break } - // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) + // match: (OR (SLDconst [63] (SRDconst [63] (LGDR x))) (MOVDconst [c])) + // cond: c & -1<<63 == 0 + // result: (LGDR (CPSDR (FMOVDconst [c]) x)) for { _ = v.Args[1] - r0 := v.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 16 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break - } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpS390XSLDconst || v_0.AuxInt != 63 { + continue + } + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpS390XSRDconst || v_0_0.AuxInt != 63 { + continue + } + v_0_0_0 := v_0_0.Args[0] + if v_0_0_0.Op != OpS390XLGDR { + continue + } + x := v_0_0_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XMOVDconst { + continue + } + c := v_1.AuxInt + if !(c&-1<<63 == 0) { + continue + } + v.reset(OpS390XLGDR) + v0 := b.NewValue0(v.Pos, OpS390XCPSDR, x.Type) + v1 := b.NewValue0(v.Pos, OpS390XFMOVDconst, x.Type) + v1.AuxInt = c + v0.AddArg(v1) + v0.AddArg(x) + v.AddArg(v0) + return true + } + break } - // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem)))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) + // match: (OR (AND (MOVDconst [-1<<63]) (LGDR x)) (LGDR (LPDFR y))) + // result: (LGDR (CPSDR y x)) for { _ = v.Args[1] - r0 := v.Args[0] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - sh := v.Args[1] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 16 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVHZreg { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpS390XAND { + continue + } + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_0_0 := v_0.Args[_i1] + if v_0_0.Op != OpS390XMOVDconst || v_0_0.AuxInt != -1<<63 { + continue + } + v_0_1 := v_0.Args[1^_i1] + if v_0_1.Op != OpS390XLGDR { + continue + } + x := v_0_1.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XLGDR { + continue + } + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpS390XLPDFR { + continue + } + t := v_1_0.Type + y := v_1_0.Args[0] + v.reset(OpS390XLGDR) + v0 := b.NewValue0(v.Pos, OpS390XCPSDR, t) + v0.AddArg(y) + v0.AddArg(x) + v.AddArg(v0) + return true + } } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break + break + } + // match: (OR (AND (MOVDconst [-1<<63]) (LGDR x)) (MOVDconst [c])) + // cond: c & -1<<63 == 0 + // result: (LGDR (CPSDR (FMOVDconst [c]) x)) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpS390XAND { + continue + } + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_0_0 := v_0.Args[_i1] + if v_0_0.Op != OpS390XMOVDconst || v_0_0.AuxInt != -1<<63 { + continue + } + v_0_1 := v_0.Args[1^_i1] + if v_0_1.Op != OpS390XLGDR { + continue + } + x := v_0_1.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XMOVDconst { + continue + } + c := v_1.AuxInt + if !(c&-1<<63 == 0) { + continue + } + v.reset(OpS390XLGDR) + v0 := b.NewValue0(v.Pos, OpS390XCPSDR, x.Type) + v1 := b.NewValue0(v.Pos, OpS390XFMOVDconst, x.Type) + v1.AuxInt = c + v0.AddArg(v1) + v0.AddArg(x) + v.AddArg(v0) + return true + } } - i1 := x1.AuxInt - if x1.Aux != s { - break + break + } + // match: (OR (MOVDconst [c]) (MOVDconst [d])) + // result: (MOVDconst [c|d]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpS390XMOVDconst { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XMOVDconst { + continue + } + d := v_1.AuxInt + v.reset(OpS390XMOVDconst) + v.AuxInt = c | d + return true } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { + break + } + // match: (OR x x) + // result: x + for { + x := v.Args[1] + if x != v.Args[0] { break } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) + v.Type = x.Type + v.AddArg(x) return true } - // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) + // match: (OR x g:(MOVDload [off] {sym} ptr mem)) + // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) + // result: (ORload [off] {sym} x ptr mem) for { + t := v.Type _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 16 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - r0 := v.Args[1] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + g := v.Args[1^_i0] + if g.Op != OpS390XMOVDload { + continue + } + off := g.AuxInt + sym := g.Aux + mem := g.Args[1] + ptr := g.Args[0] + if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + continue + } + v.reset(OpS390XORload) + v.Type = t + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true + break } return false } -func rewriteValueS390X_OpS390XORW_70(v *Value) bool { +func rewriteValueS390X_OpS390XOR_10(v *Value) bool { b := v.Block typ := &b.Func.Config.Types - // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) + // match: (OR x1:(MOVBZload [i1] {s} p mem) sh:(SLDconst [8] x0:(MOVBZload [i0] {s} p mem))) + // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) for { _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 16 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - r0 := v.Args[1] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x1 := v.Args[_i0] + if x1.Op != OpS390XMOVBZload { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[1] + p := x1.Args[0] + sh := v.Args[1^_i0] + if sh.Op != OpS390XSLDconst || sh.AuxInt != 8 { + continue + } + x0 := sh.Args[0] + if x0.Op != OpS390XMOVBZload { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[1] + if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(x0.Pos, OpS390XMOVHZload, typ.UInt16) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(mem) + return true } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true + break } - // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) + // match: (OR x1:(MOVHZload [i1] {s} p mem) sh:(SLDconst [16] x0:(MOVHZload [i0] {s} p mem))) + // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) for { _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 16 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - r0 := v.Args[1] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x1 := v.Args[_i0] + if x1.Op != OpS390XMOVHZload { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[1] + p := x1.Args[0] + sh := v.Args[1^_i0] + if sh.Op != OpS390XSLDconst || sh.AuxInt != 16 { + continue + } + x0 := sh.Args[0] + if x0.Op != OpS390XMOVHZload { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[1] + if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(x0.Pos, OpS390XMOVWZload, typ.UInt32) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(mem) + return true } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true + break } - // match: (ORW sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} idx p mem))) r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) - // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) - // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) + // match: (OR x1:(MOVWZload [i1] {s} p mem) sh:(SLDconst [32] x0:(MOVWZload [i0] {s} p mem))) + // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (MOVDload [i0] {s} p mem) for { _ = v.Args[1] - sh := v.Args[0] - if sh.Op != OpS390XSLWconst || sh.AuxInt != 16 { - break - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVHZreg { - break - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - r0 := v.Args[1] - if r0.Op != OpS390XMOVHZreg { - break - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x1 := v.Args[_i0] + if x1.Op != OpS390XMOVWZload { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[1] + p := x1.Args[0] + sh := v.Args[1^_i0] + if sh.Op != OpS390XSLDconst || sh.AuxInt != 32 { + continue + } + x0 := sh.Args[0] + if x0.Op != OpS390XMOVWZload { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[1] + if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(x0.Pos, OpS390XMOVDload, typ.UInt64) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(mem) + return true } - b = mergePoint(b, x0, x1) - v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v.reset(OpCopy) - v.AddArg(v0) - v0.AuxInt = i0 - v0.Aux = s - v0.AddArg(p) - v0.AddArg(idx) - v0.AddArg(mem) - return true + break } - // match: (ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) or:(ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) y)) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) + // match: (OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) y)) + // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) + // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVHZload [i0] {s} p mem)) y) for { _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - or := v.Args[1] - if or.Op != OpS390XORW { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + s0 := v.Args[_i0] + if s0.Op != OpS390XSLDconst { + continue + } + j0 := s0.AuxInt + x0 := s0.Args[0] + if x0.Op != OpS390XMOVBZload { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + or := v.Args[1^_i0] + if or.Op != OpS390XOR { + continue + } + _ = or.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + s1 := or.Args[_i1] + if s1.Op != OpS390XSLDconst { + continue + } + j1 := s1.AuxInt + x1 := s1.Args[0] + if x1.Op != OpS390XMOVBZload { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] { + continue + } + y := or.Args[1^_i1] + if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { + continue + } + b = mergePoint(b, x0, x1, y) + v0 := b.NewValue0(x1.Pos, OpS390XOR, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x1.Pos, OpS390XSLDconst, v.Type) + v1.AuxInt = j1 + v2 := b.NewValue0(x1.Pos, OpS390XMOVHZload, typ.UInt16) + v2.AuxInt = i0 + v2.Aux = s + v2.AddArg(p) + v2.AddArg(mem) + v1.AddArg(v2) + v0.AddArg(v1) + v0.AddArg(y) + return true + } } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true + break } - // match: (ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) or:(ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) y)) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) + // match: (OR s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem)) or:(OR s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem)) y)) + // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) + // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVWZload [i0] {s} p mem)) y) for { _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - or := v.Args[1] - if or.Op != OpS390XORW { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + s0 := v.Args[_i0] + if s0.Op != OpS390XSLDconst { + continue + } + j0 := s0.AuxInt + x0 := s0.Args[0] + if x0.Op != OpS390XMOVHZload { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + or := v.Args[1^_i0] + if or.Op != OpS390XOR { + continue + } + _ = or.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + s1 := or.Args[_i1] + if s1.Op != OpS390XSLDconst { + continue + } + j1 := s1.AuxInt + x1 := s1.Args[0] + if x1.Op != OpS390XMOVHZload { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] { + continue + } + y := or.Args[1^_i1] + if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { + continue + } + b = mergePoint(b, x0, x1, y) + v0 := b.NewValue0(x1.Pos, OpS390XOR, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x1.Pos, OpS390XSLDconst, v.Type) + v1.AuxInt = j1 + v2 := b.NewValue0(x1.Pos, OpS390XMOVWZload, typ.UInt32) + v2.AuxInt = i0 + v2.Aux = s + v2.AddArg(p) + v2.AddArg(mem) + v1.AddArg(v2) + v0.AddArg(v1) + v0.AddArg(y) + return true + } } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true + break } - // match: (ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) or:(ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) y)) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) + // match: (OR x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) + // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) for { _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - or := v.Args[1] - if or.Op != OpS390XORW { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x1 := v.Args[_i0] + if x1.Op != OpS390XMOVBZloadidx { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x1.Args[_i1] + idx := x1.Args[1^_i1] + sh := v.Args[1^_i0] + if sh.Op != OpS390XSLDconst || sh.AuxInt != 8 { + continue + } + x0 := sh.Args[0] + if x0.Op != OpS390XMOVBZloadidx { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[2] + for _i2 := 0; _i2 <= 1; _i2++ { + if p != x0.Args[_i2] || idx != x0.Args[1^_i2] || mem != x0.Args[2] || !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(idx) + v0.AddArg(mem) + return true + } + } } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true + break } - // match: (ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) or:(ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) y)) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) + // match: (OR x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) + // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) for { _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - or := v.Args[1] - if or.Op != OpS390XORW { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x1 := v.Args[_i0] + if x1.Op != OpS390XMOVHZloadidx { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x1.Args[_i1] + idx := x1.Args[1^_i1] + sh := v.Args[1^_i0] + if sh.Op != OpS390XSLDconst || sh.AuxInt != 16 { + continue + } + x0 := sh.Args[0] + if x0.Op != OpS390XMOVHZloadidx { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[2] + for _i2 := 0; _i2 <= 1; _i2++ { + if p != x0.Args[_i2] || idx != x0.Args[1^_i2] || mem != x0.Args[2] || !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(idx) + v0.AddArg(mem) + return true + } + } } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true + break } - // match: (ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) or:(ORW y s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)))) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) + // match: (OR x1:(MOVWZloadidx [i1] {s} p idx mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem))) + // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) for { _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - or := v.Args[1] - if or.Op != OpS390XORW { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x1 := v.Args[_i0] + if x1.Op != OpS390XMOVWZloadidx { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x1.Args[_i1] + idx := x1.Args[1^_i1] + sh := v.Args[1^_i0] + if sh.Op != OpS390XSLDconst || sh.AuxInt != 32 { + continue + } + x0 := sh.Args[0] + if x0.Op != OpS390XMOVWZloadidx { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[2] + for _i2 := 0; _i2 <= 1; _i2++ { + if p != x0.Args[_i2] || idx != x0.Args[1^_i2] || mem != x0.Args[2] || !(i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(idx) + v0.AddArg(mem) + return true + } + } } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true + break } - // match: (ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) or:(ORW y s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)))) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) + // match: (OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) or:(OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) y)) + // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) + // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) for { _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - or := v.Args[1] - if or.Op != OpS390XORW { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if p != x0.Args[0] || idx != x0.Args[1] || mem != x0.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + s0 := v.Args[_i0] + if s0.Op != OpS390XSLDconst { + continue + } + j0 := s0.AuxInt + x0 := s0.Args[0] + if x0.Op != OpS390XMOVBZloadidx { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x0.Args[_i1] + idx := x0.Args[1^_i1] + or := v.Args[1^_i0] + if or.Op != OpS390XOR { + continue + } + _ = or.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + s1 := or.Args[_i2] + if s1.Op != OpS390XSLDconst { + continue + } + j1 := s1.AuxInt + x1 := s1.Args[0] + if x1.Op != OpS390XMOVBZloadidx { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[2] + for _i3 := 0; _i3 <= 1; _i3++ { + if p != x1.Args[_i3] || idx != x1.Args[1^_i3] || mem != x1.Args[2] { + continue + } + y := or.Args[1^_i2] + if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { + continue + } + b = mergePoint(b, x0, x1, y) + v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) + v1.AuxInt = j1 + v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) + v2.AuxInt = i0 + v2.Aux = s + v2.AddArg(p) + v2.AddArg(idx) + v2.AddArg(mem) + v1.AddArg(v2) + v0.AddArg(v1) + v0.AddArg(y) + return true + } + } + } } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true + break } - // match: (ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) or:(ORW y s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)))) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) + // match: (OR s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem)) or:(OR s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} p idx mem)) y)) + // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) + // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) for { _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - p := x1.Args[0] - idx := x1.Args[1] - or := v.Args[1] - if or.Op != OpS390XORW { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + s0 := v.Args[_i0] + if s0.Op != OpS390XSLDconst { + continue + } + j0 := s0.AuxInt + x0 := s0.Args[0] + if x0.Op != OpS390XMOVHZloadidx { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x0.Args[_i1] + idx := x0.Args[1^_i1] + or := v.Args[1^_i0] + if or.Op != OpS390XOR { + continue + } + _ = or.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + s1 := or.Args[_i2] + if s1.Op != OpS390XSLDconst { + continue + } + j1 := s1.AuxInt + x1 := s1.Args[0] + if x1.Op != OpS390XMOVHZloadidx { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[2] + for _i3 := 0; _i3 <= 1; _i3++ { + if p != x1.Args[_i3] || idx != x1.Args[1^_i3] || mem != x1.Args[2] { + continue + } + y := or.Args[1^_i2] + if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { + continue + } + b = mergePoint(b, x0, x1, y) + v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) + v1.AuxInt = j1 + v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) + v2.AuxInt = i0 + v2.Aux = s + v2.AddArg(p) + v2.AddArg(idx) + v2.AddArg(mem) + v1.AddArg(v2) + v0.AddArg(v1) + v0.AddArg(y) + return true + } + } + } } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true + break } return false } -func rewriteValueS390X_OpS390XORW_80(v *Value) bool { +func rewriteValueS390X_OpS390XOR_20(v *Value) bool { b := v.Block typ := &b.Func.Config.Types - // match: (ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) or:(ORW y s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)))) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) + // match: (OR x0:(MOVBZload [i0] {s} p mem) sh:(SLDconst [8] x1:(MOVBZload [i1] {s} p mem))) + // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) for { _ = v.Args[1] - s1 := v.Args[0] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - s := x1.Aux - mem := x1.Args[2] - idx := x1.Args[0] - p := x1.Args[1] - or := v.Args[1] - if or.Op != OpS390XORW { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - if x0.Aux != s { - break - } - _ = x0.Args[2] - if idx != x0.Args[0] || p != x0.Args[1] || mem != x0.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + if x0.Op != OpS390XMOVBZload { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + sh := v.Args[1^_i0] + if sh.Op != OpS390XSLDconst || sh.AuxInt != 8 { + continue + } + x1 := sh.Args[0] + if x1.Op != OpS390XMOVBZload { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] || !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(x1.Pos, OpS390XMOVHZreg, typ.UInt64) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x1.Pos, OpS390XMOVHBRload, typ.UInt16) + v1.AuxInt = i0 + v1.Aux = s + v1.AddArg(p) + v1.AddArg(mem) + v0.AddArg(v1) + return true } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true + break } - // match: (ORW or:(ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) y) s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) + // match: (OR r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))) + // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRload [i0] {s} p mem)) for { _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XORW { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break + for _i0 := 0; _i0 <= 1; _i0++ { + r0 := v.Args[_i0] + if r0.Op != OpS390XMOVHZreg { + continue + } + x0 := r0.Args[0] + if x0.Op != OpS390XMOVHBRload { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + sh := v.Args[1^_i0] + if sh.Op != OpS390XSLDconst || sh.AuxInt != 16 { + continue + } + r1 := sh.Args[0] + if r1.Op != OpS390XMOVHZreg { + continue + } + x1 := r1.Args[0] + if x1.Op != OpS390XMOVHBRload { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(x1.Pos, OpS390XMOVWZreg, typ.UInt64) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x1.Pos, OpS390XMOVWBRload, typ.UInt32) + v1.AuxInt = i0 + v1.Aux = s + v1.AddArg(p) + v1.AddArg(mem) + v0.AddArg(v1) + return true } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break + break + } + // match: (OR r0:(MOVWZreg x0:(MOVWBRload [i0] {s} p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRload [i1] {s} p mem)))) + // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (MOVDBRload [i0] {s} p mem) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + r0 := v.Args[_i0] + if r0.Op != OpS390XMOVWZreg { + continue + } + x0 := r0.Args[0] + if x0.Op != OpS390XMOVWBRload { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + sh := v.Args[1^_i0] + if sh.Op != OpS390XSLDconst || sh.AuxInt != 32 { + continue + } + r1 := sh.Args[0] + if r1.Op != OpS390XMOVWZreg { + continue + } + x1 := r1.Args[0] + if x1.Op != OpS390XMOVWBRload { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(x1.Pos, OpS390XMOVDBRload, typ.UInt64) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(mem) + return true } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true + break } - // match: (ORW or:(ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) y) s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) + // match: (OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) y)) // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) + // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) for { _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XORW { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpS390XSLWconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + s1 := v.Args[_i0] + if s1.Op != OpS390XSLDconst { + continue + } + j1 := s1.AuxInt + x1 := s1.Args[0] + if x1.Op != OpS390XMOVBZload { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[1] + p := x1.Args[0] + or := v.Args[1^_i0] + if or.Op != OpS390XOR { + continue + } + _ = or.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + s0 := or.Args[_i1] + if s0.Op != OpS390XSLDconst { + continue + } + j0 := s0.AuxInt + x0 := s0.Args[0] + if x0.Op != OpS390XMOVBZload { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[1] + if p != x0.Args[0] || mem != x0.Args[1] { + continue + } + y := or.Args[1^_i1] + if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { + continue + } + b = mergePoint(b, x0, x1, y) + v0 := b.NewValue0(x0.Pos, OpS390XOR, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x0.Pos, OpS390XSLDconst, v.Type) + v1.AuxInt = j0 + v2 := b.NewValue0(x0.Pos, OpS390XMOVHZreg, typ.UInt64) + v3 := b.NewValue0(x0.Pos, OpS390XMOVHBRload, typ.UInt16) + v3.AuxInt = i0 + v3.Aux = s + v3.AddArg(p) + v3.AddArg(mem) + v2.AddArg(v3) + v1.AddArg(v2) + v0.AddArg(v1) + v0.AddArg(y) + return true + } } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break + break + } + // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))) y)) + // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) + // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + s1 := v.Args[_i0] + if s1.Op != OpS390XSLDconst { + continue + } + j1 := s1.AuxInt + r1 := s1.Args[0] + if r1.Op != OpS390XMOVHZreg { + continue + } + x1 := r1.Args[0] + if x1.Op != OpS390XMOVHBRload { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[1] + p := x1.Args[0] + or := v.Args[1^_i0] + if or.Op != OpS390XOR { + continue + } + _ = or.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + s0 := or.Args[_i1] + if s0.Op != OpS390XSLDconst { + continue + } + j0 := s0.AuxInt + r0 := s0.Args[0] + if r0.Op != OpS390XMOVHZreg { + continue + } + x0 := r0.Args[0] + if x0.Op != OpS390XMOVHBRload { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[1] + if p != x0.Args[0] || mem != x0.Args[1] { + continue + } + y := or.Args[1^_i1] + if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { + continue + } + b = mergePoint(b, x0, x1, y) + v0 := b.NewValue0(x0.Pos, OpS390XOR, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x0.Pos, OpS390XSLDconst, v.Type) + v1.AuxInt = j0 + v2 := b.NewValue0(x0.Pos, OpS390XMOVWZreg, typ.UInt64) + v3 := b.NewValue0(x0.Pos, OpS390XMOVWBRload, typ.UInt32) + v3.AuxInt = i0 + v3.Aux = s + v3.AddArg(p) + v3.AddArg(mem) + v2.AddArg(v3) + v1.AddArg(v2) + v0.AddArg(v1) + v0.AddArg(y) + return true + } } - i1 := x1.AuxInt - if x1.Aux != s { - break + break + } + // match: (OR x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) + // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + if x0.Op != OpS390XMOVBZloadidx { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x0.Args[_i1] + idx := x0.Args[1^_i1] + sh := v.Args[1^_i0] + if sh.Op != OpS390XSLDconst || sh.AuxInt != 8 { + continue + } + x1 := sh.Args[0] + if x1.Op != OpS390XMOVBZloadidx { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[2] + for _i2 := 0; _i2 <= 1; _i2++ { + if p != x1.Args[_i2] || idx != x1.Args[1^_i2] || mem != x1.Args[2] || !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) + v1.AuxInt = i0 + v1.Aux = s + v1.AddArg(p) + v1.AddArg(idx) + v1.AddArg(mem) + v0.AddArg(v1) + return true + } + } } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break + break + } + // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) + // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + r0 := v.Args[_i0] + if r0.Op != OpS390XMOVHZreg { + continue + } + x0 := r0.Args[0] + if x0.Op != OpS390XMOVHBRloadidx { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x0.Args[_i1] + idx := x0.Args[1^_i1] + sh := v.Args[1^_i0] + if sh.Op != OpS390XSLDconst || sh.AuxInt != 16 { + continue + } + r1 := sh.Args[0] + if r1.Op != OpS390XMOVHZreg { + continue + } + x1 := r1.Args[0] + if x1.Op != OpS390XMOVHBRloadidx { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[2] + for _i2 := 0; _i2 <= 1; _i2++ { + if p != x1.Args[_i2] || idx != x1.Args[1^_i2] || mem != x1.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) + v1.AuxInt = i0 + v1.Aux = s + v1.AddArg(p) + v1.AddArg(idx) + v1.AddArg(mem) + v0.AddArg(v1) + return true + } + } } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true + break + } + // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem)))) + // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + r0 := v.Args[_i0] + if r0.Op != OpS390XMOVWZreg { + continue + } + x0 := r0.Args[0] + if x0.Op != OpS390XMOVWBRloadidx { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x0.Args[_i1] + idx := x0.Args[1^_i1] + sh := v.Args[1^_i0] + if sh.Op != OpS390XSLDconst || sh.AuxInt != 32 { + continue + } + r1 := sh.Args[0] + if r1.Op != OpS390XMOVWZreg { + continue + } + x1 := r1.Args[0] + if x1.Op != OpS390XMOVWBRloadidx { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[2] + for _i2 := 0; _i2 <= 1; _i2++ { + if p != x1.Args[_i2] || idx != x1.Args[1^_i2] || mem != x1.Args[2] || !(i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(idx) + v0.AddArg(mem) + return true + } + } + } + break } - // match: (ORW or:(ORW y s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) + // match: (OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) or:(OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) y)) // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) + // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) for { _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XORW { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + s1 := v.Args[_i0] + if s1.Op != OpS390XSLDconst { + continue + } + j1 := s1.AuxInt + x1 := s1.Args[0] + if x1.Op != OpS390XMOVBZloadidx { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x1.Args[_i1] + idx := x1.Args[1^_i1] + or := v.Args[1^_i0] + if or.Op != OpS390XOR { + continue + } + _ = or.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + s0 := or.Args[_i2] + if s0.Op != OpS390XSLDconst { + continue + } + j0 := s0.AuxInt + x0 := s0.Args[0] + if x0.Op != OpS390XMOVBZloadidx { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[2] + for _i3 := 0; _i3 <= 1; _i3++ { + if p != x0.Args[_i3] || idx != x0.Args[1^_i3] || mem != x0.Args[2] { + continue + } + y := or.Args[1^_i2] + if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { + continue + } + b = mergePoint(b, x0, x1, y) + v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) + v1.AuxInt = j0 + v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) + v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) + v3.AuxInt = i0 + v3.Aux = s + v3.AddArg(p) + v3.AddArg(idx) + v3.AddArg(mem) + v2.AddArg(v3) + v1.AddArg(v2) + v0.AddArg(v1) + v0.AddArg(y) + return true + } + } + } } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true + break } - // match: (ORW or:(ORW y s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem))) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) + // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem))) y)) + // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) + // result: @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) for { _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XORW { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpS390XSLWconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + s1 := v.Args[_i0] + if s1.Op != OpS390XSLDconst { + continue + } + j1 := s1.AuxInt + r1 := s1.Args[0] + if r1.Op != OpS390XMOVHZreg { + continue + } + x1 := r1.Args[0] + if x1.Op != OpS390XMOVHBRloadidx { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x1.Args[_i1] + idx := x1.Args[1^_i1] + or := v.Args[1^_i0] + if or.Op != OpS390XOR { + continue + } + _ = or.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + s0 := or.Args[_i2] + if s0.Op != OpS390XSLDconst { + continue + } + j0 := s0.AuxInt + r0 := s0.Args[0] + if r0.Op != OpS390XMOVHZreg { + continue + } + x0 := r0.Args[0] + if x0.Op != OpS390XMOVHBRloadidx { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[2] + for _i3 := 0; _i3 <= 1; _i3++ { + if p != x0.Args[_i3] || idx != x0.Args[1^_i3] || mem != x0.Args[2] { + continue + } + y := or.Args[1^_i2] + if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { + continue + } + b = mergePoint(b, x0, x1, y) + v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) + v1.AuxInt = j0 + v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) + v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) + v3.AuxInt = i0 + v3.Aux = s + v3.AddArg(p) + v3.AddArg(idx) + v3.AddArg(mem) + v2.AddArg(v3) + v1.AddArg(v2) + v0.AddArg(v1) + v0.AddArg(y) + return true + } + } + } } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break + break + } + return false +} +func rewriteValueS390X_OpS390XORW_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (ORW x (MOVDconst [c])) + // result: (ORWconst [int64(int32(c))] x) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XMOVDconst { + continue + } + c := v_1.AuxInt + v.reset(OpS390XORWconst) + v.AuxInt = int64(int32(c)) + v.AddArg(x) + return true } - i1 := x1.AuxInt - if x1.Aux != s { - break + break + } + // match: ( ORW (SLWconst x [c]) (SRWconst x [d])) + // cond: d == 32-c + // result: (RLLconst [c] x) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpS390XSLWconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XSRWconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(d == 32-c) { + continue + } + v.reset(OpS390XRLLconst) + v.AuxInt = c + v.AddArg(x) + return true } - _ = x1.Args[2] - if p != x1.Args[0] || idx != x1.Args[1] || mem != x1.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { + break + } + // match: (ORW x x) + // result: x + for { + x := v.Args[1] + if x != v.Args[0] { break } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) + v.Type = x.Type + v.AddArg(x) return true } - // match: (ORW or:(ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) y) s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) + // match: (ORW x g:(MOVWload [off] {sym} ptr mem)) + // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) + // result: (ORWload [off] {sym} x ptr mem) for { + t := v.Type _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XORW { - break - } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + g := v.Args[1^_i0] + if g.Op != OpS390XMOVWload { + continue + } + off := g.AuxInt + sym := g.Aux + mem := g.Args[1] + ptr := g.Args[0] + if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + continue + } + v.reset(OpS390XORWload) + v.Type = t + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - i1 := x1.AuxInt - if x1.Aux != s { - break + break + } + // match: (ORW x g:(MOVWZload [off] {sym} ptr mem)) + // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) + // result: (ORWload [off] {sym} x ptr mem) + for { + t := v.Type + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + g := v.Args[1^_i0] + if g.Op != OpS390XMOVWZload { + continue + } + off := g.AuxInt + sym := g.Aux + mem := g.Args[1] + ptr := g.Args[0] + if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + continue + } + v.reset(OpS390XORWload) + v.Type = t + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break + break + } + // match: (ORW x1:(MOVBZload [i1] {s} p mem) sh:(SLWconst [8] x0:(MOVBZload [i0] {s} p mem))) + // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x1 := v.Args[_i0] + if x1.Op != OpS390XMOVBZload { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[1] + p := x1.Args[0] + sh := v.Args[1^_i0] + if sh.Op != OpS390XSLWconst || sh.AuxInt != 8 { + continue + } + x0 := sh.Args[0] + if x0.Op != OpS390XMOVBZload { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[1] + if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(x0.Pos, OpS390XMOVHZload, typ.UInt16) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(mem) + return true } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true + break } - // match: (ORW or:(ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) y) s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) - // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) + // match: (ORW x1:(MOVHZload [i1] {s} p mem) sh:(SLWconst [16] x0:(MOVHZload [i0] {s} p mem))) + // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) for { _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XORW { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x1 := v.Args[_i0] + if x1.Op != OpS390XMOVHZload { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[1] + p := x1.Args[0] + sh := v.Args[1^_i0] + if sh.Op != OpS390XSLWconst || sh.AuxInt != 16 { + continue + } + x0 := sh.Args[0] + if x0.Op != OpS390XMOVHZload { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[1] + if p != x0.Args[0] || mem != x0.Args[1] || !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(x0.Pos, OpS390XMOVWZload, typ.UInt32) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(mem) + return true } - y := or.Args[1] - s0 := or.Args[0] - if s0.Op != OpS390XSLWconst { - break + break + } + // match: (ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) or:(ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) y)) + // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) + // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j1] (MOVHZload [i0] {s} p mem)) y) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + s0 := v.Args[_i0] + if s0.Op != OpS390XSLWconst { + continue + } + j0 := s0.AuxInt + x0 := s0.Args[0] + if x0.Op != OpS390XMOVBZload { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + or := v.Args[1^_i0] + if or.Op != OpS390XORW { + continue + } + _ = or.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + s1 := or.Args[_i1] + if s1.Op != OpS390XSLWconst { + continue + } + j1 := s1.AuxInt + x1 := s1.Args[0] + if x1.Op != OpS390XMOVBZload { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] { + continue + } + y := or.Args[1^_i1] + if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { + continue + } + b = mergePoint(b, x0, x1, y) + v0 := b.NewValue0(x1.Pos, OpS390XORW, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x1.Pos, OpS390XSLWconst, v.Type) + v1.AuxInt = j1 + v2 := b.NewValue0(x1.Pos, OpS390XMOVHZload, typ.UInt16) + v2.AuxInt = i0 + v2.Aux = s + v2.AddArg(p) + v2.AddArg(mem) + v1.AddArg(v2) + v0.AddArg(v1) + v0.AddArg(y) + return true + } } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break + break + } + // match: (ORW x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) + // cond: i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x1 := v.Args[_i0] + if x1.Op != OpS390XMOVBZloadidx { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x1.Args[_i1] + idx := x1.Args[1^_i1] + sh := v.Args[1^_i0] + if sh.Op != OpS390XSLWconst || sh.AuxInt != 8 { + continue + } + x0 := sh.Args[0] + if x0.Op != OpS390XMOVBZloadidx { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[2] + for _i2 := 0; _i2 <= 1; _i2++ { + if p != x0.Args[_i2] || idx != x0.Args[1^_i2] || mem != x0.Args[2] || !(i1 == i0+1 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(idx) + v0.AddArg(mem) + return true + } + } } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpS390XSLWconst { - break + break + } + // match: (ORW x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) + // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x1 := v.Args[_i0] + if x1.Op != OpS390XMOVHZloadidx { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x1.Args[_i1] + idx := x1.Args[1^_i1] + sh := v.Args[1^_i0] + if sh.Op != OpS390XSLWconst || sh.AuxInt != 16 { + continue + } + x0 := sh.Args[0] + if x0.Op != OpS390XMOVHZloadidx { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[2] + for _i2 := 0; _i2 <= 1; _i2++ { + if p != x0.Args[_i2] || idx != x0.Args[1^_i2] || mem != x0.Args[2] || !(i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(idx) + v0.AddArg(mem) + return true + } + } } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break + break + } + return false +} +func rewriteValueS390X_OpS390XORW_10(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) or:(ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) y)) + // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) + // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + s0 := v.Args[_i0] + if s0.Op != OpS390XSLWconst { + continue + } + j0 := s0.AuxInt + x0 := s0.Args[0] + if x0.Op != OpS390XMOVBZloadidx { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x0.Args[_i1] + idx := x0.Args[1^_i1] + or := v.Args[1^_i0] + if or.Op != OpS390XORW { + continue + } + _ = or.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + s1 := or.Args[_i2] + if s1.Op != OpS390XSLWconst { + continue + } + j1 := s1.AuxInt + x1 := s1.Args[0] + if x1.Op != OpS390XMOVBZloadidx { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[2] + for _i3 := 0; _i3 <= 1; _i3++ { + if p != x1.Args[_i3] || idx != x1.Args[1^_i3] || mem != x1.Args[2] { + continue + } + y := or.Args[1^_i2] + if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { + continue + } + b = mergePoint(b, x0, x1, y) + v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) + v1.AuxInt = j1 + v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) + v2.AuxInt = i0 + v2.Aux = s + v2.AddArg(p) + v2.AddArg(idx) + v2.AddArg(mem) + v1.AddArg(v2) + v0.AddArg(v1) + v0.AddArg(y) + return true + } + } + } } - i1 := x1.AuxInt - if x1.Aux != s { - break + break + } + // match: (ORW x0:(MOVBZload [i0] {s} p mem) sh:(SLWconst [8] x1:(MOVBZload [i1] {s} p mem))) + // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + if x0.Op != OpS390XMOVBZload { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + sh := v.Args[1^_i0] + if sh.Op != OpS390XSLWconst || sh.AuxInt != 8 { + continue + } + x1 := sh.Args[0] + if x1.Op != OpS390XMOVBZload { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] || !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(x1.Pos, OpS390XMOVHZreg, typ.UInt64) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x1.Pos, OpS390XMOVHBRload, typ.UInt16) + v1.AuxInt = i0 + v1.Aux = s + v1.AddArg(p) + v1.AddArg(mem) + v0.AddArg(v1) + return true } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break + break + } + // match: (ORW r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))) + // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (MOVWBRload [i0] {s} p mem) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + r0 := v.Args[_i0] + if r0.Op != OpS390XMOVHZreg { + continue + } + x0 := r0.Args[0] + if x0.Op != OpS390XMOVHBRload { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[1] + p := x0.Args[0] + sh := v.Args[1^_i0] + if sh.Op != OpS390XSLWconst || sh.AuxInt != 16 { + continue + } + r1 := sh.Args[0] + if r1.Op != OpS390XMOVHZreg { + continue + } + x1 := r1.Args[0] + if x1.Op != OpS390XMOVHBRload { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[1] + if p != x1.Args[0] || mem != x1.Args[1] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(x1.Pos, OpS390XMOVWBRload, typ.UInt32) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(mem) + return true } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true + break } - // match: (ORW or:(ORW y s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem))) s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) + // match: (ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) or:(ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) y)) // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) - // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) + // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) for { _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XORW { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - p := x0.Args[0] - idx := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break + for _i0 := 0; _i0 <= 1; _i0++ { + s1 := v.Args[_i0] + if s1.Op != OpS390XSLWconst { + continue + } + j1 := s1.AuxInt + x1 := s1.Args[0] + if x1.Op != OpS390XMOVBZload { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[1] + p := x1.Args[0] + or := v.Args[1^_i0] + if or.Op != OpS390XORW { + continue + } + _ = or.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + s0 := or.Args[_i1] + if s0.Op != OpS390XSLWconst { + continue + } + j0 := s0.AuxInt + x0 := s0.Args[0] + if x0.Op != OpS390XMOVBZload { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[1] + if p != x0.Args[0] || mem != x0.Args[1] { + continue + } + y := or.Args[1^_i1] + if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { + continue + } + b = mergePoint(b, x0, x1, y) + v0 := b.NewValue0(x0.Pos, OpS390XORW, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(x0.Pos, OpS390XSLWconst, v.Type) + v1.AuxInt = j0 + v2 := b.NewValue0(x0.Pos, OpS390XMOVHZreg, typ.UInt64) + v3 := b.NewValue0(x0.Pos, OpS390XMOVHBRload, typ.UInt16) + v3.AuxInt = i0 + v3.Aux = s + v3.AddArg(p) + v3.AddArg(mem) + v2.AddArg(v3) + v1.AddArg(v2) + v0.AddArg(v1) + v0.AddArg(y) + return true + } } - i1 := x1.AuxInt - if x1.Aux != s { - break + break + } + // match: (ORW x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) + // cond: p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x0 := v.Args[_i0] + if x0.Op != OpS390XMOVBZloadidx { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x0.Args[_i1] + idx := x0.Args[1^_i1] + sh := v.Args[1^_i0] + if sh.Op != OpS390XSLWconst || sh.AuxInt != 8 { + continue + } + x1 := sh.Args[0] + if x1.Op != OpS390XMOVBZloadidx { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[2] + for _i2 := 0; _i2 <= 1; _i2++ { + if p != x1.Args[_i2] || idx != x1.Args[1^_i2] || mem != x1.Args[2] || !(p.Op != OpSB && i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) + v1.AuxInt = i0 + v1.Aux = s + v1.AddArg(p) + v1.AddArg(idx) + v1.AddArg(mem) + v0.AddArg(v1) + return true + } + } } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break + break + } + // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) + // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) + // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + r0 := v.Args[_i0] + if r0.Op != OpS390XMOVHZreg { + continue + } + x0 := r0.Args[0] + if x0.Op != OpS390XMOVHBRloadidx { + continue + } + i0 := x0.AuxInt + s := x0.Aux + mem := x0.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x0.Args[_i1] + idx := x0.Args[1^_i1] + sh := v.Args[1^_i0] + if sh.Op != OpS390XSLWconst || sh.AuxInt != 16 { + continue + } + r1 := sh.Args[0] + if r1.Op != OpS390XMOVHZreg { + continue + } + x1 := r1.Args[0] + if x1.Op != OpS390XMOVHBRloadidx { + continue + } + i1 := x1.AuxInt + if x1.Aux != s { + continue + } + _ = x1.Args[2] + for _i2 := 0; _i2 <= 1; _i2++ { + if p != x1.Args[_i2] || idx != x1.Args[1^_i2] || mem != x1.Args[2] || !(i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh)) { + continue + } + b = mergePoint(b, x0, x1) + v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) + v.reset(OpCopy) + v.AddArg(v0) + v0.AuxInt = i0 + v0.Aux = s + v0.AddArg(p) + v0.AddArg(idx) + v0.AddArg(mem) + return true + } + } } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true + break } - // match: (ORW or:(ORW y s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) + // match: (ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) or:(ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) y)) // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) // result: @mergePoint(b,x0,x1,y) (ORW (SLWconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) for { _ = v.Args[1] - or := v.Args[0] - if or.Op != OpS390XORW { - break - } - _ = or.Args[1] - y := or.Args[0] - s0 := or.Args[1] - if s0.Op != OpS390XSLWconst { - break - } - j0 := s0.AuxInt - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - break - } - i0 := x0.AuxInt - s := x0.Aux - mem := x0.Args[2] - idx := x0.Args[0] - p := x0.Args[1] - s1 := v.Args[1] - if s1.Op != OpS390XSLWconst { - break - } - j1 := s1.AuxInt - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - break - } - i1 := x1.AuxInt - if x1.Aux != s { - break - } - _ = x1.Args[2] - if idx != x1.Args[0] || p != x1.Args[1] || mem != x1.Args[2] || !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + s1 := v.Args[_i0] + if s1.Op != OpS390XSLWconst { + continue + } + j1 := s1.AuxInt + x1 := s1.Args[0] + if x1.Op != OpS390XMOVBZloadidx { + continue + } + i1 := x1.AuxInt + s := x1.Aux + mem := x1.Args[2] + for _i1 := 0; _i1 <= 1; _i1++ { + p := x1.Args[_i1] + idx := x1.Args[1^_i1] + or := v.Args[1^_i0] + if or.Op != OpS390XORW { + continue + } + _ = or.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + s0 := or.Args[_i2] + if s0.Op != OpS390XSLWconst { + continue + } + j0 := s0.AuxInt + x0 := s0.Args[0] + if x0.Op != OpS390XMOVBZloadidx { + continue + } + i0 := x0.AuxInt + if x0.Aux != s { + continue + } + _ = x0.Args[2] + for _i3 := 0; _i3 <= 1; _i3++ { + if p != x0.Args[_i3] || idx != x0.Args[1^_i3] || mem != x0.Args[2] { + continue + } + y := or.Args[1^_i2] + if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1, y) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { + continue + } + b = mergePoint(b, x0, x1, y) + v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) + v1.AuxInt = j0 + v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) + v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) + v3.AuxInt = i0 + v3.Aux = s + v3.AddArg(p) + v3.AddArg(idx) + v3.AddArg(mem) + v2.AddArg(v3) + v1.AddArg(v2) + v0.AddArg(v1) + v0.AddArg(y) + return true + } + } + } } - b = mergePoint(b, x0, x1, y) - v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j0 - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s - v3.AddArg(p) - v3.AddArg(idx) - v3.AddArg(mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg(v1) - v0.AddArg(y) - return true + break } return false } @@ -32502,29 +18895,6 @@ func rewriteValueS390X_OpS390XSLD_0(v *Value) bool { } // match: (SLD x (AND (MOVDconst [c]) y)) // result: (SLD x (ANDWconst [c&63] y)) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XAND { - break - } - y := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpS390XMOVDconst { - break - } - c := v_1_0.AuxInt - v.reset(OpS390XSLD) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) - v0.AuxInt = c & 63 - v0.AddArg(y) - v.AddArg(v0) - return true - } - // match: (SLD x (AND y (MOVDconst [c]))) - // result: (SLD x (ANDWconst [c&63] y)) for { _ = v.Args[1] x := v.Args[0] @@ -32533,19 +18903,22 @@ func rewriteValueS390X_OpS390XSLD_0(v *Value) bool { break } _ = v_1.Args[1] - y := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpS390XMOVDconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_1_0 := v_1.Args[_i0] + if v_1_0.Op != OpS390XMOVDconst { + continue + } + c := v_1_0.AuxInt + y := v_1.Args[1^_i0] + v.reset(OpS390XSLD) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) + v0.AuxInt = c & 63 + v0.AddArg(y) + v.AddArg(v0) + return true } - c := v_1_1.AuxInt - v.reset(OpS390XSLD) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) - v0.AuxInt = c & 63 - v0.AddArg(y) - v.AddArg(v0) - return true + break } // match: (SLD x (ANDWconst [c] y)) // cond: c&63 == 63 @@ -32679,29 +19052,6 @@ func rewriteValueS390X_OpS390XSLW_0(v *Value) bool { } // match: (SLW x (AND (MOVDconst [c]) y)) // result: (SLW x (ANDWconst [c&63] y)) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XAND { - break - } - y := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpS390XMOVDconst { - break - } - c := v_1_0.AuxInt - v.reset(OpS390XSLW) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) - v0.AuxInt = c & 63 - v0.AddArg(y) - v.AddArg(v0) - return true - } - // match: (SLW x (AND y (MOVDconst [c]))) - // result: (SLW x (ANDWconst [c&63] y)) for { _ = v.Args[1] x := v.Args[0] @@ -32710,19 +19060,22 @@ func rewriteValueS390X_OpS390XSLW_0(v *Value) bool { break } _ = v_1.Args[1] - y := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpS390XMOVDconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_1_0 := v_1.Args[_i0] + if v_1_0.Op != OpS390XMOVDconst { + continue + } + c := v_1_0.AuxInt + y := v_1.Args[1^_i0] + v.reset(OpS390XSLW) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) + v0.AuxInt = c & 63 + v0.AddArg(y) + v.AddArg(v0) + return true } - c := v_1_1.AuxInt - v.reset(OpS390XSLW) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) - v0.AuxInt = c & 63 - v0.AddArg(y) - v.AddArg(v0) - return true + break } // match: (SLW x (ANDWconst [c] y)) // cond: c&63 == 63 @@ -32856,29 +19209,6 @@ func rewriteValueS390X_OpS390XSRAD_0(v *Value) bool { } // match: (SRAD x (AND (MOVDconst [c]) y)) // result: (SRAD x (ANDWconst [c&63] y)) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XAND { - break - } - y := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpS390XMOVDconst { - break - } - c := v_1_0.AuxInt - v.reset(OpS390XSRAD) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) - v0.AuxInt = c & 63 - v0.AddArg(y) - v.AddArg(v0) - return true - } - // match: (SRAD x (AND y (MOVDconst [c]))) - // result: (SRAD x (ANDWconst [c&63] y)) for { _ = v.Args[1] x := v.Args[0] @@ -32887,19 +19217,22 @@ func rewriteValueS390X_OpS390XSRAD_0(v *Value) bool { break } _ = v_1.Args[1] - y := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpS390XMOVDconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_1_0 := v_1.Args[_i0] + if v_1_0.Op != OpS390XMOVDconst { + continue + } + c := v_1_0.AuxInt + y := v_1.Args[1^_i0] + v.reset(OpS390XSRAD) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) + v0.AuxInt = c & 63 + v0.AddArg(y) + v.AddArg(v0) + return true } - c := v_1_1.AuxInt - v.reset(OpS390XSRAD) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) - v0.AuxInt = c & 63 - v0.AddArg(y) - v.AddArg(v0) - return true + break } // match: (SRAD x (ANDWconst [c] y)) // cond: c&63 == 63 @@ -33049,29 +19382,6 @@ func rewriteValueS390X_OpS390XSRAW_0(v *Value) bool { } // match: (SRAW x (AND (MOVDconst [c]) y)) // result: (SRAW x (ANDWconst [c&63] y)) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XAND { - break - } - y := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpS390XMOVDconst { - break - } - c := v_1_0.AuxInt - v.reset(OpS390XSRAW) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) - v0.AuxInt = c & 63 - v0.AddArg(y) - v.AddArg(v0) - return true - } - // match: (SRAW x (AND y (MOVDconst [c]))) - // result: (SRAW x (ANDWconst [c&63] y)) for { _ = v.Args[1] x := v.Args[0] @@ -33080,19 +19390,22 @@ func rewriteValueS390X_OpS390XSRAW_0(v *Value) bool { break } _ = v_1.Args[1] - y := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpS390XMOVDconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_1_0 := v_1.Args[_i0] + if v_1_0.Op != OpS390XMOVDconst { + continue + } + c := v_1_0.AuxInt + y := v_1.Args[1^_i0] + v.reset(OpS390XSRAW) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) + v0.AuxInt = c & 63 + v0.AddArg(y) + v.AddArg(v0) + return true } - c := v_1_1.AuxInt - v.reset(OpS390XSRAW) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) - v0.AuxInt = c & 63 - v0.AddArg(y) - v.AddArg(v0) - return true + break } // match: (SRAW x (ANDWconst [c] y)) // cond: c&63 == 63 @@ -33242,29 +19555,6 @@ func rewriteValueS390X_OpS390XSRD_0(v *Value) bool { } // match: (SRD x (AND (MOVDconst [c]) y)) // result: (SRD x (ANDWconst [c&63] y)) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XAND { - break - } - y := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpS390XMOVDconst { - break - } - c := v_1_0.AuxInt - v.reset(OpS390XSRD) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) - v0.AuxInt = c & 63 - v0.AddArg(y) - v.AddArg(v0) - return true - } - // match: (SRD x (AND y (MOVDconst [c]))) - // result: (SRD x (ANDWconst [c&63] y)) for { _ = v.Args[1] x := v.Args[0] @@ -33273,19 +19563,22 @@ func rewriteValueS390X_OpS390XSRD_0(v *Value) bool { break } _ = v_1.Args[1] - y := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpS390XMOVDconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_1_0 := v_1.Args[_i0] + if v_1_0.Op != OpS390XMOVDconst { + continue + } + c := v_1_0.AuxInt + y := v_1.Args[1^_i0] + v.reset(OpS390XSRD) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) + v0.AuxInt = c & 63 + v0.AddArg(y) + v.AddArg(v0) + return true } - c := v_1_1.AuxInt - v.reset(OpS390XSRD) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) - v0.AuxInt = c & 63 - v0.AddArg(y) - v.AddArg(v0) - return true + break } // match: (SRD x (ANDWconst [c] y)) // cond: c&63 == 63 @@ -33446,29 +19739,6 @@ func rewriteValueS390X_OpS390XSRW_0(v *Value) bool { } // match: (SRW x (AND (MOVDconst [c]) y)) // result: (SRW x (ANDWconst [c&63] y)) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XAND { - break - } - y := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpS390XMOVDconst { - break - } - c := v_1_0.AuxInt - v.reset(OpS390XSRW) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) - v0.AuxInt = c & 63 - v0.AddArg(y) - v.AddArg(v0) - return true - } - // match: (SRW x (AND y (MOVDconst [c]))) - // result: (SRW x (ANDWconst [c&63] y)) for { _ = v.Args[1] x := v.Args[0] @@ -33477,19 +19747,22 @@ func rewriteValueS390X_OpS390XSRW_0(v *Value) bool { break } _ = v_1.Args[1] - y := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpS390XMOVDconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_1_0 := v_1.Args[_i0] + if v_1_0.Op != OpS390XMOVDconst { + continue + } + c := v_1_0.AuxInt + y := v_1.Args[1^_i0] + v.reset(OpS390XSRW) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) + v0.AuxInt = c & 63 + v0.AddArg(y) + v.AddArg(v0) + return true } - c := v_1_1.AuxInt - v.reset(OpS390XSRW) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) - v0.AuxInt = c & 63 - v0.AddArg(y) - v.AddArg(v0) - return true + break } // match: (SRW x (ANDWconst [c] y)) // cond: c&63 == 63 @@ -34241,121 +20514,70 @@ func rewriteValueS390X_OpS390XXOR_0(v *Value) bool { // result: (XORconst [c] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDconst { - break - } - c := v_1.AuxInt - if !(isU32Bit(c)) { - break - } - v.reset(OpS390XXORconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (XOR (MOVDconst [c]) x) - // cond: isU32Bit(c) - // result: (XORconst [c] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst { - break - } - c := v_0.AuxInt - if !(isU32Bit(c)) { - break - } - v.reset(OpS390XXORconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (XOR (SLDconst x [c]) (SRDconst x [d])) - // cond: d == 64-c - // result: (RLLGconst [c] x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XSLDconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XSRDconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(d == 64-c) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XMOVDconst { + continue + } + c := v_1.AuxInt + if !(isU32Bit(c)) { + continue + } + v.reset(OpS390XXORconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpS390XRLLGconst) - v.AuxInt = c - v.AddArg(x) - return true + break } - // match: (XOR (SRDconst x [d]) (SLDconst x [c])) + // match: (XOR (SLDconst x [c]) (SRDconst x [d])) // cond: d == 64-c // result: (RLLGconst [c] x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XSRDconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XSLDconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(d == 64-c) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpS390XSLDconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XSRDconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(d == 64-c) { + continue + } + v.reset(OpS390XRLLGconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpS390XRLLGconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (XOR (MOVDconst [c]) (MOVDconst [d])) // result: (MOVDconst [c^d]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDconst { - break - } - d := v_1.AuxInt - v.reset(OpS390XMOVDconst) - v.AuxInt = c ^ d - return true - } - // match: (XOR (MOVDconst [d]) (MOVDconst [c])) - // result: (MOVDconst [c^d]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpS390XMOVDconst { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XMOVDconst { + continue + } + d := v_1.AuxInt + v.reset(OpS390XMOVDconst) + v.AuxInt = c ^ d + return true } - c := v_1.AuxInt - v.reset(OpS390XMOVDconst) - v.AuxInt = c ^ d - return true + break } // match: (XOR x x) // result: (MOVDconst [0]) @@ -34374,52 +20596,29 @@ func rewriteValueS390X_OpS390XXOR_0(v *Value) bool { for { t := v.Type _ = v.Args[1] - x := v.Args[0] - g := v.Args[1] - if g.Op != OpS390XMOVDload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break - } - v.reset(OpS390XXORload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (XOR g:(MOVDload [off] {sym} ptr mem) x) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) - // result: (XORload [off] {sym} x ptr mem) - for { - t := v.Type - x := v.Args[1] - g := v.Args[0] - if g.Op != OpS390XMOVDload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + g := v.Args[1^_i0] + if g.Op != OpS390XMOVDload { + continue + } + off := g.AuxInt + sym := g.Aux + mem := g.Args[1] + ptr := g.Args[0] + if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + continue + } + v.reset(OpS390XXORload) + v.Type = t + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - v.reset(OpS390XXORload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true + break } return false } @@ -34428,78 +20627,46 @@ func rewriteValueS390X_OpS390XXORW_0(v *Value) bool { // result: (XORWconst [int64(int32(c))] x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XMOVDconst { - break - } - c := v_1.AuxInt - v.reset(OpS390XXORWconst) - v.AuxInt = int64(int32(c)) - v.AddArg(x) - return true - } - // match: (XORW (MOVDconst [c]) x) - // result: (XORWconst [int64(int32(c))] x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XMOVDconst { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XMOVDconst { + continue + } + c := v_1.AuxInt + v.reset(OpS390XXORWconst) + v.AuxInt = int64(int32(c)) + v.AddArg(x) + return true } - c := v_0.AuxInt - v.reset(OpS390XXORWconst) - v.AuxInt = int64(int32(c)) - v.AddArg(x) - return true + break } // match: (XORW (SLWconst x [c]) (SRWconst x [d])) // cond: d == 32-c // result: (RLLconst [c] x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XSLWconst { - break - } - c := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XSRWconst { - break - } - d := v_1.AuxInt - if x != v_1.Args[0] || !(d == 32-c) { - break - } - v.reset(OpS390XRLLconst) - v.AuxInt = c - v.AddArg(x) - return true - } - // match: (XORW (SRWconst x [d]) (SLWconst x [c])) - // cond: d == 32-c - // result: (RLLconst [c] x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpS390XSRWconst { - break - } - d := v_0.AuxInt - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpS390XSLWconst { - break - } - c := v_1.AuxInt - if x != v_1.Args[0] || !(d == 32-c) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpS390XSLWconst { + continue + } + c := v_0.AuxInt + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpS390XSRWconst { + continue + } + d := v_1.AuxInt + if x != v_1.Args[0] || !(d == 32-c) { + continue + } + v.reset(OpS390XRLLconst) + v.AuxInt = c + v.AddArg(x) + return true } - v.reset(OpS390XRLLconst) - v.AuxInt = c - v.AddArg(x) - return true + break } // match: (XORW x x) // result: (MOVDconst [0]) @@ -34518,52 +20685,29 @@ func rewriteValueS390X_OpS390XXORW_0(v *Value) bool { for { t := v.Type _ = v.Args[1] - x := v.Args[0] - g := v.Args[1] - if g.Op != OpS390XMOVWload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break - } - v.reset(OpS390XXORWload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (XORW g:(MOVWload [off] {sym} ptr mem) x) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) - // result: (XORWload [off] {sym} x ptr mem) - for { - t := v.Type - x := v.Args[1] - g := v.Args[0] - if g.Op != OpS390XMOVWload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + g := v.Args[1^_i0] + if g.Op != OpS390XMOVWload { + continue + } + off := g.AuxInt + sym := g.Aux + mem := g.Args[1] + ptr := g.Args[0] + if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + continue + } + v.reset(OpS390XXORWload) + v.Type = t + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - v.reset(OpS390XXORWload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true + break } // match: (XORW x g:(MOVWZload [off] {sym} ptr mem)) // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) @@ -34571,52 +20715,29 @@ func rewriteValueS390X_OpS390XXORW_0(v *Value) bool { for { t := v.Type _ = v.Args[1] - x := v.Args[0] - g := v.Args[1] - if g.Op != OpS390XMOVWZload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break - } - v.reset(OpS390XXORWload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true - } - // match: (XORW g:(MOVWZload [off] {sym} ptr mem) x) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) - // result: (XORWload [off] {sym} x ptr mem) - for { - t := v.Type - x := v.Args[1] - g := v.Args[0] - if g.Op != OpS390XMOVWZload { - break - } - off := g.AuxInt - sym := g.Aux - mem := g.Args[1] - ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + g := v.Args[1^_i0] + if g.Op != OpS390XMOVWZload { + continue + } + off := g.AuxInt + sym := g.Aux + mem := g.Args[1] + ptr := g.Args[0] + if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + continue + } + v.reset(OpS390XXORWload) + v.Type = t + v.AuxInt = off + v.Aux = sym + v.AddArg(x) + v.AddArg(ptr) + v.AddArg(mem) + return true } - v.reset(OpS390XXORWload) - v.Type = t - v.AuxInt = off - v.Aux = sym - v.AddArg(x) - v.AddArg(ptr) - v.AddArg(mem) - return true + break } return false } diff --git a/src/cmd/compile/internal/ssa/rewrite_rule_idea.txt b/src/cmd/compile/internal/ssa/rewrite_rule_idea.txt new file mode 100644 index 0000000000..003e4c02cd --- /dev/null +++ b/src/cmd/compile/internal/ssa/rewrite_rule_idea.txt @@ -0,0 +1,17 @@ +idea: pack info about value substructure into an int64 +all values should be encoded as 1< (Mul16 x y) (Mul16 x z)) // result: (Mul16 x (Add16 y z)) for { t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul16 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - z := v_1.Args[1] - if x != v_1.Args[0] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpMul16 { + continue + } + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + x := v_0.Args[_i1] + y := v_0.Args[1^_i1] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMul16 { + continue + } + _ = v_1.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + if x != v_1.Args[_i2] { + continue + } + z := v_1.Args[1^_i2] + v.reset(OpMul16) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpAdd16, t) + v0.AddArg(y) + v0.AddArg(z) + v.AddArg(v0) + return true + } + } } - v.reset(OpMul16) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd16, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) - return true + break } - // match: (Add16 (Mul16 y x) (Mul16 x z)) - // result: (Mul16 x (Add16 y z)) + // match: (Add16 (Const16 [0]) x) + // result: x for { - t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul16 { - break - } - x := v_0.Args[1] - y := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - z := v_1.Args[1] - if x != v_1.Args[0] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst16 || v_0.AuxInt != 0 { + continue + } + x := v.Args[1^_i0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - v.reset(OpMul16) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd16, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) - return true + break } - // match: (Add16 (Mul16 x y) (Mul16 z x)) - // result: (Mul16 x (Add16 y z)) + // match: (Add16 (Const16 [1]) (Com16 x)) + // result: (Neg16 x) for { - t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul16 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - _ = v_1.Args[1] - z := v_1.Args[0] - if x != v_1.Args[1] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst16 || v_0.AuxInt != 1 { + continue + } + v_1 := v.Args[1^_i0] + if v_1.Op != OpCom16 { + continue + } + x := v_1.Args[0] + v.reset(OpNeg16) + v.AddArg(x) + return true } - v.reset(OpMul16) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd16, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) - return true + break } - // match: (Add16 (Mul16 y x) (Mul16 z x)) - // result: (Mul16 x (Add16 y z)) + // match: (Add16 (Add16 i:(Const16 ) z) x) + // cond: (z.Op != OpConst16 && x.Op != OpConst16) + // result: (Add16 i (Add16 z x)) for { - t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul16 { - break - } - x := v_0.Args[1] - y := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - _ = v_1.Args[1] - z := v_1.Args[0] - if x != v_1.Args[1] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAdd16 { + continue + } + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + i := v_0.Args[_i1] + if i.Op != OpConst16 { + continue + } + t := i.Type + z := v_0.Args[1^_i1] + x := v.Args[1^_i0] + if !(z.Op != OpConst16 && x.Op != OpConst16) { + continue + } + v.reset(OpAdd16) + v.AddArg(i) + v0 := b.NewValue0(v.Pos, OpAdd16, t) + v0.AddArg(z) + v0.AddArg(x) + v.AddArg(v0) + return true + } } - v.reset(OpMul16) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd16, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) - return true + break } - // match: (Add16 (Mul16 x z) (Mul16 x y)) - // result: (Mul16 x (Add16 y z)) + // match: (Add16 (Sub16 i:(Const16 ) z) x) + // cond: (z.Op != OpConst16 && x.Op != OpConst16) + // result: (Add16 i (Sub16 x z)) for { - t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul16 { - break - } - z := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - y := v_1.Args[1] - if x != v_1.Args[0] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpSub16 { + continue + } + z := v_0.Args[1] + i := v_0.Args[0] + if i.Op != OpConst16 { + continue + } + t := i.Type + x := v.Args[1^_i0] + if !(z.Op != OpConst16 && x.Op != OpConst16) { + continue + } + v.reset(OpAdd16) + v.AddArg(i) + v0 := b.NewValue0(v.Pos, OpSub16, t) + v0.AddArg(x) + v0.AddArg(z) + v.AddArg(v0) + return true } - v.reset(OpMul16) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd16, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) - return true + break } - // match: (Add16 (Mul16 z x) (Mul16 x y)) - // result: (Mul16 x (Add16 y z)) + // match: (Add16 (Sub16 z i:(Const16 )) x) + // cond: (z.Op != OpConst16 && x.Op != OpConst16) + // result: (Sub16 (Add16 x z) i) for { - t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul16 { - break - } - x := v_0.Args[1] - z := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - y := v_1.Args[1] - if x != v_1.Args[0] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpSub16 { + continue + } + _ = v_0.Args[1] + z := v_0.Args[0] + i := v_0.Args[1] + if i.Op != OpConst16 { + continue + } + t := i.Type + x := v.Args[1^_i0] + if !(z.Op != OpConst16 && x.Op != OpConst16) { + continue + } + v.reset(OpSub16) + v0 := b.NewValue0(v.Pos, OpAdd16, t) + v0.AddArg(x) + v0.AddArg(z) + v.AddArg(v0) + v.AddArg(i) + return true } - v.reset(OpMul16) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd16, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) - return true + break } - // match: (Add16 (Mul16 x z) (Mul16 y x)) - // result: (Mul16 x (Add16 y z)) + // match: (Add16 (Const16 [c]) (Add16 (Const16 [d]) x)) + // result: (Add16 (Const16 [int64(int16(c+d))]) x) for { - t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul16 { - break - } - z := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - _ = v_1.Args[1] - y := v_1.Args[0] - if x != v_1.Args[1] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst16 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpAdd16 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst16 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpAdd16) + v0 := b.NewValue0(v.Pos, OpConst16, t) + v0.AuxInt = int64(int16(c + d)) + v.AddArg(v0) + v.AddArg(x) + return true + } } - v.reset(OpMul16) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd16, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) - return true + break } - // match: (Add16 (Mul16 z x) (Mul16 y x)) - // result: (Mul16 x (Add16 y z)) + // match: (Add16 (Const16 [c]) (Sub16 (Const16 [d]) x)) + // result: (Sub16 (Const16 [int64(int16(c+d))]) x) for { - t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul16 { - break - } - x := v_0.Args[1] - z := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst16 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpSub16 { + continue + } + x := v_1.Args[1] + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpConst16 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + v.reset(OpSub16) + v0 := b.NewValue0(v.Pos, OpConst16, t) + v0.AuxInt = int64(int16(c + d)) + v.AddArg(v0) + v.AddArg(x) + return true } - _ = v_1.Args[1] - y := v_1.Args[0] - if x != v_1.Args[1] { - break + break + } + // match: (Add16 (Const16 [c]) (Sub16 x (Const16 [d]))) + // result: (Add16 (Const16 [int64(int16(c-d))]) x) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst16 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpSub16 { + continue + } + _ = v_1.Args[1] + x := v_1.Args[0] + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpConst16 || v_1_1.Type != t { + continue + } + d := v_1_1.AuxInt + v.reset(OpAdd16) + v0 := b.NewValue0(v.Pos, OpConst16, t) + v0.AuxInt = int64(int16(c - d)) + v.AddArg(v0) + v.AddArg(x) + return true } - v.reset(OpMul16) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd16, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) - return true + break } return false } -func rewriteValuegeneric_OpAdd16_10(v *Value) bool { +func rewriteValuegeneric_OpAdd32_0(v *Value) bool { b := v.Block - // match: (Add16 (Const16 [0]) x) - // result: x + // match: (Add32 (Const32 [c]) (Const32 [d])) + // result: (Const32 [int64(int32(c+d))]) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 || v_0.AuxInt != 0 { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst32 { + continue + } + d := v_1.AuxInt + v.reset(OpConst32) + v.AuxInt = int64(int32(c + d)) + return true } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true + break } - // match: (Add16 x (Const16 [0])) - // result: x + // match: (Add32 (Mul32 x y) (Mul32 x z)) + // result: (Mul32 x (Add32 y z)) for { + t := v.Type _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.AuxInt != 0 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpMul32 { + continue + } + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + x := v_0.Args[_i1] + y := v_0.Args[1^_i1] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMul32 { + continue + } + _ = v_1.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + if x != v_1.Args[_i2] { + continue + } + z := v_1.Args[1^_i2] + v.reset(OpMul32) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpAdd32, t) + v0.AddArg(y) + v0.AddArg(z) + v.AddArg(v0) + return true + } + } } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true + break } - // match: (Add16 (Const16 [1]) (Com16 x)) - // result: (Neg16 x) + // match: (Add32 (Const32 [0]) x) + // result: x for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 || v_0.AuxInt != 1 { - break - } - v_1 := v.Args[1] - if v_1.Op != OpCom16 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 || v_0.AuxInt != 0 { + continue + } + x := v.Args[1^_i0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - x := v_1.Args[0] - v.reset(OpNeg16) - v.AddArg(x) - return true + break } - // match: (Add16 (Com16 x) (Const16 [1])) - // result: (Neg16 x) + // match: (Add32 (Const32 [1]) (Com32 x)) + // result: (Neg32 x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpCom16 { - break - } - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.AuxInt != 1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 || v_0.AuxInt != 1 { + continue + } + v_1 := v.Args[1^_i0] + if v_1.Op != OpCom32 { + continue + } + x := v_1.Args[0] + v.reset(OpNeg32) + v.AddArg(x) + return true } - v.reset(OpNeg16) - v.AddArg(x) - return true + break } - // match: (Add16 (Add16 i:(Const16 ) z) x) - // cond: (z.Op != OpConst16 && x.Op != OpConst16) - // result: (Add16 i (Add16 z x)) + // match: (Add32 (Add32 i:(Const32 ) z) x) + // cond: (z.Op != OpConst32 && x.Op != OpConst32) + // result: (Add32 i (Add32 z x)) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd16 { - break - } - z := v_0.Args[1] - i := v_0.Args[0] - if i.Op != OpConst16 { - break - } - t := i.Type - if !(z.Op != OpConst16 && x.Op != OpConst16) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAdd32 { + continue + } + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + i := v_0.Args[_i1] + if i.Op != OpConst32 { + continue + } + t := i.Type + z := v_0.Args[1^_i1] + x := v.Args[1^_i0] + if !(z.Op != OpConst32 && x.Op != OpConst32) { + continue + } + v.reset(OpAdd32) + v.AddArg(i) + v0 := b.NewValue0(v.Pos, OpAdd32, t) + v0.AddArg(z) + v0.AddArg(x) + v.AddArg(v0) + return true + } } - v.reset(OpAdd16) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAdd16, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (Add16 (Add16 z i:(Const16 )) x) - // cond: (z.Op != OpConst16 && x.Op != OpConst16) - // result: (Add16 i (Add16 z x)) + // match: (Add32 (Sub32 i:(Const32 ) z) x) + // cond: (z.Op != OpConst32 && x.Op != OpConst32) + // result: (Add32 i (Sub32 x z)) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd16 { - break - } - _ = v_0.Args[1] - z := v_0.Args[0] - i := v_0.Args[1] - if i.Op != OpConst16 { - break - } - t := i.Type - if !(z.Op != OpConst16 && x.Op != OpConst16) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpSub32 { + continue + } + z := v_0.Args[1] + i := v_0.Args[0] + if i.Op != OpConst32 { + continue + } + t := i.Type + x := v.Args[1^_i0] + if !(z.Op != OpConst32 && x.Op != OpConst32) { + continue + } + v.reset(OpAdd32) + v.AddArg(i) + v0 := b.NewValue0(v.Pos, OpSub32, t) + v0.AddArg(x) + v0.AddArg(z) + v.AddArg(v0) + return true } - v.reset(OpAdd16) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAdd16, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (Add16 x (Add16 i:(Const16 ) z)) - // cond: (z.Op != OpConst16 && x.Op != OpConst16) - // result: (Add16 i (Add16 z x)) + // match: (Add32 (Sub32 z i:(Const32 )) x) + // cond: (z.Op != OpConst32 && x.Op != OpConst32) + // result: (Sub32 (Add32 x z) i) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAdd16 { - break - } - z := v_1.Args[1] - i := v_1.Args[0] - if i.Op != OpConst16 { - break - } - t := i.Type - if !(z.Op != OpConst16 && x.Op != OpConst16) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpSub32 { + continue + } + _ = v_0.Args[1] + z := v_0.Args[0] + i := v_0.Args[1] + if i.Op != OpConst32 { + continue + } + t := i.Type + x := v.Args[1^_i0] + if !(z.Op != OpConst32 && x.Op != OpConst32) { + continue + } + v.reset(OpSub32) + v0 := b.NewValue0(v.Pos, OpAdd32, t) + v0.AddArg(x) + v0.AddArg(z) + v.AddArg(v0) + v.AddArg(i) + return true } - v.reset(OpAdd16) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAdd16, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (Add16 x (Add16 z i:(Const16 ))) - // cond: (z.Op != OpConst16 && x.Op != OpConst16) - // result: (Add16 i (Add16 z x)) + // match: (Add32 (Const32 [c]) (Add32 (Const32 [d]) x)) + // result: (Add32 (Const32 [int64(int32(c+d))]) x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAdd16 { - break - } - _ = v_1.Args[1] - z := v_1.Args[0] - i := v_1.Args[1] - if i.Op != OpConst16 { - break - } - t := i.Type - if !(z.Op != OpConst16 && x.Op != OpConst16) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpAdd32 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst32 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpAdd32) + v0 := b.NewValue0(v.Pos, OpConst32, t) + v0.AuxInt = int64(int32(c + d)) + v.AddArg(v0) + v.AddArg(x) + return true + } } - v.reset(OpAdd16) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAdd16, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (Add16 (Sub16 i:(Const16 ) z) x) - // cond: (z.Op != OpConst16 && x.Op != OpConst16) - // result: (Add16 i (Sub16 x z)) + // match: (Add32 (Const32 [c]) (Sub32 (Const32 [d]) x)) + // result: (Sub32 (Const32 [int64(int32(c+d))]) x) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpSub16 { - break - } - z := v_0.Args[1] - i := v_0.Args[0] - if i.Op != OpConst16 { - break - } - t := i.Type - if !(z.Op != OpConst16 && x.Op != OpConst16) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpSub32 { + continue + } + x := v_1.Args[1] + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpConst32 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + v.reset(OpSub32) + v0 := b.NewValue0(v.Pos, OpConst32, t) + v0.AuxInt = int64(int32(c + d)) + v.AddArg(v0) + v.AddArg(x) + return true } - v.reset(OpAdd16) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpSub16, t) - v0.AddArg(x) - v0.AddArg(z) - v.AddArg(v0) - return true + break } - // match: (Add16 x (Sub16 i:(Const16 ) z)) - // cond: (z.Op != OpConst16 && x.Op != OpConst16) - // result: (Add16 i (Sub16 x z)) + // match: (Add32 (Const32 [c]) (Sub32 x (Const32 [d]))) + // result: (Add32 (Const32 [int64(int32(c-d))]) x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpSub16 { - break - } - z := v_1.Args[1] - i := v_1.Args[0] - if i.Op != OpConst16 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpSub32 { + continue + } + _ = v_1.Args[1] + x := v_1.Args[0] + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpConst32 || v_1_1.Type != t { + continue + } + d := v_1_1.AuxInt + v.reset(OpAdd32) + v0 := b.NewValue0(v.Pos, OpConst32, t) + v0.AuxInt = int64(int32(c - d)) + v.AddArg(v0) + v.AddArg(x) + return true } - t := i.Type - if !(z.Op != OpConst16 && x.Op != OpConst16) { - break + break + } + return false +} +func rewriteValuegeneric_OpAdd32F_0(v *Value) bool { + // match: (Add32F (Const32F [c]) (Const32F [d])) + // result: (Const32F [auxFrom32F(auxTo32F(c) + auxTo32F(d))]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32F { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst32F { + continue + } + d := v_1.AuxInt + v.reset(OpConst32F) + v.AuxInt = auxFrom32F(auxTo32F(c) + auxTo32F(d)) + return true } - v.reset(OpAdd16) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpSub16, t) - v0.AddArg(x) - v0.AddArg(z) - v.AddArg(v0) - return true + break } return false } -func rewriteValuegeneric_OpAdd16_20(v *Value) bool { +func rewriteValuegeneric_OpAdd64_0(v *Value) bool { b := v.Block - // match: (Add16 (Sub16 z i:(Const16 )) x) - // cond: (z.Op != OpConst16 && x.Op != OpConst16) - // result: (Sub16 (Add16 x z) i) + // match: (Add64 (Const64 [c]) (Const64 [d])) + // result: (Const64 [c+d]) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpSub16 { - break - } - _ = v_0.Args[1] - z := v_0.Args[0] - i := v_0.Args[1] - if i.Op != OpConst16 { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst64 { + continue + } + d := v_1.AuxInt + v.reset(OpConst64) + v.AuxInt = c + d + return true } - t := i.Type - if !(z.Op != OpConst16 && x.Op != OpConst16) { - break + break + } + // match: (Add64 (Mul64 x y) (Mul64 x z)) + // result: (Mul64 x (Add64 y z)) + for { + t := v.Type + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpMul64 { + continue + } + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + x := v_0.Args[_i1] + y := v_0.Args[1^_i1] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMul64 { + continue + } + _ = v_1.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + if x != v_1.Args[_i2] { + continue + } + z := v_1.Args[1^_i2] + v.reset(OpMul64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpAdd64, t) + v0.AddArg(y) + v0.AddArg(z) + v.AddArg(v0) + return true + } + } } - v.reset(OpSub16) - v0 := b.NewValue0(v.Pos, OpAdd16, t) - v0.AddArg(x) - v0.AddArg(z) - v.AddArg(v0) - v.AddArg(i) - return true + break } - // match: (Add16 x (Sub16 z i:(Const16 ))) - // cond: (z.Op != OpConst16 && x.Op != OpConst16) - // result: (Sub16 (Add16 x z) i) + // match: (Add64 (Const64 [0]) x) + // result: x for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpSub16 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 || v_0.AuxInt != 0 { + continue + } + x := v.Args[1^_i0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - _ = v_1.Args[1] - z := v_1.Args[0] - i := v_1.Args[1] - if i.Op != OpConst16 { - break - } - t := i.Type - if !(z.Op != OpConst16 && x.Op != OpConst16) { - break - } - v.reset(OpSub16) - v0 := b.NewValue0(v.Pos, OpAdd16, t) - v0.AddArg(x) - v0.AddArg(z) - v.AddArg(v0) - v.AddArg(i) - return true + break } - // match: (Add16 (Const16 [c]) (Add16 (Const16 [d]) x)) - // result: (Add16 (Const16 [int64(int16(c+d))]) x) + // match: (Add64 (Const64 [1]) (Com64 x)) + // result: (Neg64 x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAdd16 { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst16 || v_1_0.Type != t { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 || v_0.AuxInt != 1 { + continue + } + v_1 := v.Args[1^_i0] + if v_1.Op != OpCom64 { + continue + } + x := v_1.Args[0] + v.reset(OpNeg64) + v.AddArg(x) + return true } - d := v_1_0.AuxInt - v.reset(OpAdd16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c + d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (Add16 (Const16 [c]) (Add16 x (Const16 [d]))) - // result: (Add16 (Const16 [int64(int16(c+d))]) x) + // match: (Add64 (Add64 i:(Const64 ) z) x) + // cond: (z.Op != OpConst64 && x.Op != OpConst64) + // result: (Add64 i (Add64 z x)) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAdd16 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst16 || v_1_1.Type != t { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAdd64 { + continue + } + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + i := v_0.Args[_i1] + if i.Op != OpConst64 { + continue + } + t := i.Type + z := v_0.Args[1^_i1] + x := v.Args[1^_i0] + if !(z.Op != OpConst64 && x.Op != OpConst64) { + continue + } + v.reset(OpAdd64) + v.AddArg(i) + v0 := b.NewValue0(v.Pos, OpAdd64, t) + v0.AddArg(z) + v0.AddArg(x) + v.AddArg(v0) + return true + } } - d := v_1_1.AuxInt - v.reset(OpAdd16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c + d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (Add16 (Add16 (Const16 [d]) x) (Const16 [c])) - // result: (Add16 (Const16 [int64(int16(c+d))]) x) + // match: (Add64 (Sub64 i:(Const64 ) z) x) + // cond: (z.Op != OpConst64 && x.Op != OpConst64) + // result: (Add64 i (Sub64 x z)) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd16 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst16 { - break - } - t := v_0_0.Type - d := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.Type != t { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpSub64 { + continue + } + z := v_0.Args[1] + i := v_0.Args[0] + if i.Op != OpConst64 { + continue + } + t := i.Type + x := v.Args[1^_i0] + if !(z.Op != OpConst64 && x.Op != OpConst64) { + continue + } + v.reset(OpAdd64) + v.AddArg(i) + v0 := b.NewValue0(v.Pos, OpSub64, t) + v0.AddArg(x) + v0.AddArg(z) + v.AddArg(v0) + return true } - c := v_1.AuxInt - v.reset(OpAdd16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c + d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (Add16 (Add16 x (Const16 [d])) (Const16 [c])) - // result: (Add16 (Const16 [int64(int16(c+d))]) x) + // match: (Add64 (Sub64 z i:(Const64 )) x) + // cond: (z.Op != OpConst64 && x.Op != OpConst64) + // result: (Sub64 (Add64 x z) i) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd16 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst16 { - break - } - t := v_0_1.Type - d := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.Type != t { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpSub64 { + continue + } + _ = v_0.Args[1] + z := v_0.Args[0] + i := v_0.Args[1] + if i.Op != OpConst64 { + continue + } + t := i.Type + x := v.Args[1^_i0] + if !(z.Op != OpConst64 && x.Op != OpConst64) { + continue + } + v.reset(OpSub64) + v0 := b.NewValue0(v.Pos, OpAdd64, t) + v0.AddArg(x) + v0.AddArg(z) + v.AddArg(v0) + v.AddArg(i) + return true } - c := v_1.AuxInt - v.reset(OpAdd16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c + d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (Add16 (Const16 [c]) (Sub16 (Const16 [d]) x)) - // result: (Sub16 (Const16 [int64(int16(c+d))]) x) + // match: (Add64 (Const64 [c]) (Add64 (Const64 [d]) x)) + // result: (Add64 (Const64 [c+d]) x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpSub16 { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst16 || v_1_0.Type != t { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpAdd64 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst64 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpAdd64) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = c + d + v.AddArg(v0) + v.AddArg(x) + return true + } } - d := v_1_0.AuxInt - v.reset(OpSub16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c + d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (Add16 (Sub16 (Const16 [d]) x) (Const16 [c])) - // result: (Sub16 (Const16 [int64(int16(c+d))]) x) + // match: (Add64 (Const64 [c]) (Sub64 (Const64 [d]) x)) + // result: (Sub64 (Const64 [c+d]) x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpSub16 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst16 { - break - } - t := v_0_0.Type - d := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.Type != t { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpSub64 { + continue + } + x := v_1.Args[1] + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpConst64 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + v.reset(OpSub64) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = c + d + v.AddArg(v0) + v.AddArg(x) + return true } - c := v_1.AuxInt - v.reset(OpSub16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c + d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (Add16 (Const16 [c]) (Sub16 x (Const16 [d]))) - // result: (Add16 (Const16 [int64(int16(c-d))]) x) + // match: (Add64 (Const64 [c]) (Sub64 x (Const64 [d]))) + // result: (Add64 (Const64 [c-d]) x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpSub16 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst16 || v_1_1.Type != t { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpSub64 { + continue + } + _ = v_1.Args[1] + x := v_1.Args[0] + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpConst64 || v_1_1.Type != t { + continue + } + d := v_1_1.AuxInt + v.reset(OpAdd64) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = c - d + v.AddArg(v0) + v.AddArg(x) + return true } - d := v_1_1.AuxInt - v.reset(OpAdd16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c - d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (Add16 (Sub16 x (Const16 [d])) (Const16 [c])) - // result: (Add16 (Const16 [int64(int16(c-d))]) x) + return false +} +func rewriteValuegeneric_OpAdd64F_0(v *Value) bool { + // match: (Add64F (Const64F [c]) (Const64F [d])) + // result: (Const64F [auxFrom64F(auxTo64F(c) + auxTo64F(d))]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpSub16 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst16 { - break - } - t := v_0_1.Type - d := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.Type != t { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64F { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst64F { + continue + } + d := v_1.AuxInt + v.reset(OpConst64F) + v.AuxInt = auxFrom64F(auxTo64F(c) + auxTo64F(d)) + return true } - c := v_1.AuxInt - v.reset(OpAdd16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c - d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } return false } -func rewriteValuegeneric_OpAdd32_0(v *Value) bool { +func rewriteValuegeneric_OpAdd8_0(v *Value) bool { b := v.Block - // match: (Add32 (Const32 [c]) (Const32 [d])) - // result: (Const32 [int64(int32(c+d))]) + // match: (Add8 (Const8 [c]) (Const8 [d])) + // result: (Const8 [int64(int8(c+d))]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst8 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst8 { + continue + } + d := v_1.AuxInt + v.reset(OpConst8) + v.AuxInt = int64(int8(c + d)) + return true } - d := v_1.AuxInt - v.reset(OpConst32) - v.AuxInt = int64(int32(c + d)) - return true + break } - // match: (Add32 (Const32 [d]) (Const32 [c])) - // result: (Const32 [int64(int32(c+d))]) + // match: (Add8 (Mul8 x y) (Mul8 x z)) + // result: (Mul8 x (Add8 y z)) for { + t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpMul8 { + continue + } + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + x := v_0.Args[_i1] + y := v_0.Args[1^_i1] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMul8 { + continue + } + _ = v_1.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + if x != v_1.Args[_i2] { + continue + } + z := v_1.Args[1^_i2] + v.reset(OpMul8) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpAdd8, t) + v0.AddArg(y) + v0.AddArg(z) + v.AddArg(v0) + return true + } + } } - c := v_1.AuxInt - v.reset(OpConst32) - v.AuxInt = int64(int32(c + d)) - return true + break } - // match: (Add32 (Mul32 x y) (Mul32 x z)) - // result: (Mul32 x (Add32 y z)) + // match: (Add8 (Const8 [0]) x) + // result: x for { - t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - z := v_1.Args[1] - if x != v_1.Args[0] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst8 || v_0.AuxInt != 0 { + continue + } + x := v.Args[1^_i0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - v.reset(OpMul32) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd32, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) - return true + break } - // match: (Add32 (Mul32 y x) (Mul32 x z)) - // result: (Mul32 x (Add32 y z)) + // match: (Add8 (Const8 [1]) (Com8 x)) + // result: (Neg8 x) for { - t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - x := v_0.Args[1] - y := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - z := v_1.Args[1] - if x != v_1.Args[0] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst8 || v_0.AuxInt != 1 { + continue + } + v_1 := v.Args[1^_i0] + if v_1.Op != OpCom8 { + continue + } + x := v_1.Args[0] + v.reset(OpNeg8) + v.AddArg(x) + return true } - v.reset(OpMul32) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd32, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) - return true + break } - // match: (Add32 (Mul32 x y) (Mul32 z x)) - // result: (Mul32 x (Add32 y z)) + // match: (Add8 (Add8 i:(Const8 ) z) x) + // cond: (z.Op != OpConst8 && x.Op != OpConst8) + // result: (Add8 i (Add8 z x)) for { - t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - z := v_1.Args[0] - if x != v_1.Args[1] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAdd8 { + continue + } + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + i := v_0.Args[_i1] + if i.Op != OpConst8 { + continue + } + t := i.Type + z := v_0.Args[1^_i1] + x := v.Args[1^_i0] + if !(z.Op != OpConst8 && x.Op != OpConst8) { + continue + } + v.reset(OpAdd8) + v.AddArg(i) + v0 := b.NewValue0(v.Pos, OpAdd8, t) + v0.AddArg(z) + v0.AddArg(x) + v.AddArg(v0) + return true + } } - v.reset(OpMul32) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd32, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) - return true + break } - // match: (Add32 (Mul32 y x) (Mul32 z x)) - // result: (Mul32 x (Add32 y z)) + // match: (Add8 (Sub8 i:(Const8 ) z) x) + // cond: (z.Op != OpConst8 && x.Op != OpConst8) + // result: (Add8 i (Sub8 x z)) for { - t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - x := v_0.Args[1] - y := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - z := v_1.Args[0] - if x != v_1.Args[1] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpSub8 { + continue + } + z := v_0.Args[1] + i := v_0.Args[0] + if i.Op != OpConst8 { + continue + } + t := i.Type + x := v.Args[1^_i0] + if !(z.Op != OpConst8 && x.Op != OpConst8) { + continue + } + v.reset(OpAdd8) + v.AddArg(i) + v0 := b.NewValue0(v.Pos, OpSub8, t) + v0.AddArg(x) + v0.AddArg(z) + v.AddArg(v0) + return true } - v.reset(OpMul32) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd32, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) - return true + break } - // match: (Add32 (Mul32 x z) (Mul32 x y)) - // result: (Mul32 x (Add32 y z)) + // match: (Add8 (Sub8 z i:(Const8 )) x) + // cond: (z.Op != OpConst8 && x.Op != OpConst8) + // result: (Sub8 (Add8 x z) i) for { - t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - z := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - y := v_1.Args[1] - if x != v_1.Args[0] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpSub8 { + continue + } + _ = v_0.Args[1] + z := v_0.Args[0] + i := v_0.Args[1] + if i.Op != OpConst8 { + continue + } + t := i.Type + x := v.Args[1^_i0] + if !(z.Op != OpConst8 && x.Op != OpConst8) { + continue + } + v.reset(OpSub8) + v0 := b.NewValue0(v.Pos, OpAdd8, t) + v0.AddArg(x) + v0.AddArg(z) + v.AddArg(v0) + v.AddArg(i) + return true } - v.reset(OpMul32) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd32, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) - return true + break } - // match: (Add32 (Mul32 z x) (Mul32 x y)) - // result: (Mul32 x (Add32 y z)) + // match: (Add8 (Const8 [c]) (Add8 (Const8 [d]) x)) + // result: (Add8 (Const8 [int64(int8(c+d))]) x) for { - t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst8 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpAdd8 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst8 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpAdd8) + v0 := b.NewValue0(v.Pos, OpConst8, t) + v0.AuxInt = int64(int8(c + d)) + v.AddArg(v0) + v.AddArg(x) + return true + } } - x := v_0.Args[1] - z := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break + break + } + // match: (Add8 (Const8 [c]) (Sub8 (Const8 [d]) x)) + // result: (Sub8 (Const8 [int64(int8(c+d))]) x) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst8 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpSub8 { + continue + } + x := v_1.Args[1] + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpConst8 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + v.reset(OpSub8) + v0 := b.NewValue0(v.Pos, OpConst8, t) + v0.AuxInt = int64(int8(c + d)) + v.AddArg(v0) + v.AddArg(x) + return true } - y := v_1.Args[1] - if x != v_1.Args[0] { - break + break + } + // match: (Add8 (Const8 [c]) (Sub8 x (Const8 [d]))) + // result: (Add8 (Const8 [int64(int8(c-d))]) x) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst8 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpSub8 { + continue + } + _ = v_1.Args[1] + x := v_1.Args[0] + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpConst8 || v_1_1.Type != t { + continue + } + d := v_1_1.AuxInt + v.reset(OpAdd8) + v0 := b.NewValue0(v.Pos, OpConst8, t) + v0.AuxInt = int64(int8(c - d)) + v.AddArg(v0) + v.AddArg(x) + return true } - v.reset(OpMul32) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd32, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) - return true + break } - // match: (Add32 (Mul32 x z) (Mul32 y x)) - // result: (Mul32 x (Add32 y z)) + return false +} +func rewriteValuegeneric_OpAddPtr_0(v *Value) bool { + // match: (AddPtr x (Const64 [c])) + // result: (OffPtr x [c]) for { t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - z := v_0.Args[1] - x := v_0.Args[0] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - y := v_1.Args[0] - if x != v_1.Args[1] { + if v_1.Op != OpConst64 { break } - v.reset(OpMul32) + c := v_1.AuxInt + v.reset(OpOffPtr) + v.Type = t + v.AuxInt = c v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd32, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) return true } - // match: (Add32 (Mul32 z x) (Mul32 y x)) - // result: (Mul32 x (Add32 y z)) + // match: (AddPtr x (Const32 [c])) + // result: (OffPtr x [c]) for { t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - x := v_0.Args[1] - z := v_0.Args[0] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - y := v_1.Args[0] - if x != v_1.Args[1] { + if v_1.Op != OpConst32 { break } - v.reset(OpMul32) + c := v_1.AuxInt + v.reset(OpOffPtr) + v.Type = t + v.AuxInt = c v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd32, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) return true } return false } -func rewriteValuegeneric_OpAdd32_10(v *Value) bool { +func rewriteValuegeneric_OpAnd16_0(v *Value) bool { b := v.Block - // match: (Add32 (Const32 [0]) x) + // match: (And16 (Const16 [c]) (Const16 [d])) + // result: (Const16 [int64(int16(c&d))]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst16 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst16 { + continue + } + d := v_1.AuxInt + v.reset(OpConst16) + v.AuxInt = int64(int16(c & d)) + return true + } + break + } + // match: (And16 (Const16 [m]) (Rsh16Ux64 _ (Const64 [c]))) + // cond: c >= 64-ntz(m) + // result: (Const16 [0]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst16 { + continue + } + m := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpRsh16Ux64 { + continue + } + _ = v_1.Args[1] + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpConst64 { + continue + } + c := v_1_1.AuxInt + if !(c >= 64-ntz(m)) { + continue + } + v.reset(OpConst16) + v.AuxInt = 0 + return true + } + break + } + // match: (And16 (Const16 [m]) (Lsh16x64 _ (Const64 [c]))) + // cond: c >= 64-nlz(m) + // result: (Const16 [0]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst16 { + continue + } + m := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpLsh16x64 { + continue + } + _ = v_1.Args[1] + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpConst64 { + continue + } + c := v_1_1.AuxInt + if !(c >= 64-nlz(m)) { + continue + } + v.reset(OpConst16) + v.AuxInt = 0 + return true + } + break + } + // match: (And16 x x) // result: x for { x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 || v_0.AuxInt != 0 { + if x != v.Args[0] { break } v.reset(OpCopy) @@ -1513,2107 +1797,2398 @@ func rewriteValuegeneric_OpAdd32_10(v *Value) bool { v.AddArg(x) return true } - // match: (Add32 x (Const32 [0])) + // match: (And16 (Const16 [-1]) x) // result: x for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.AuxInt != 0 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst16 || v_0.AuxInt != -1 { + continue + } + x := v.Args[1^_i0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true + break } - // match: (Add32 (Const32 [1]) (Com32 x)) - // result: (Neg32 x) + // match: (And16 (Const16 [0]) _) + // result: (Const16 [0]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 || v_0.AuxInt != 1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst16 || v_0.AuxInt != 0 { + continue + } + v.reset(OpConst16) + v.AuxInt = 0 + return true } - v_1 := v.Args[1] - if v_1.Op != OpCom32 { - break + break + } + // match: (And16 x (And16 x y)) + // result: (And16 x y) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAnd16 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + if x != v_1.Args[_i1] { + continue + } + y := v_1.Args[1^_i1] + v.reset(OpAnd16) + v.AddArg(x) + v.AddArg(y) + return true + } } - x := v_1.Args[0] - v.reset(OpNeg32) - v.AddArg(x) - return true + break } - // match: (Add32 (Com32 x) (Const32 [1])) - // result: (Neg32 x) + // match: (And16 (And16 i:(Const16 ) z) x) + // cond: (z.Op != OpConst16 && x.Op != OpConst16) + // result: (And16 i (And16 z x)) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpCom32 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAnd16 { + continue + } + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + i := v_0.Args[_i1] + if i.Op != OpConst16 { + continue + } + t := i.Type + z := v_0.Args[1^_i1] + x := v.Args[1^_i0] + if !(z.Op != OpConst16 && x.Op != OpConst16) { + continue + } + v.reset(OpAnd16) + v.AddArg(i) + v0 := b.NewValue0(v.Pos, OpAnd16, t) + v0.AddArg(z) + v0.AddArg(x) + v.AddArg(v0) + return true + } } - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.AuxInt != 1 { - break + break + } + // match: (And16 (Const16 [c]) (And16 (Const16 [d]) x)) + // result: (And16 (Const16 [int64(int16(c&d))]) x) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst16 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpAnd16 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst16 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpAnd16) + v0 := b.NewValue0(v.Pos, OpConst16, t) + v0.AuxInt = int64(int16(c & d)) + v.AddArg(v0) + v.AddArg(x) + return true + } } - v.reset(OpNeg32) - v.AddArg(x) - return true + break } - // match: (Add32 (Add32 i:(Const32 ) z) x) - // cond: (z.Op != OpConst32 && x.Op != OpConst32) - // result: (Add32 i (Add32 z x)) + return false +} +func rewriteValuegeneric_OpAnd32_0(v *Value) bool { + b := v.Block + // match: (And32 (Const32 [c]) (Const32 [d])) + // result: (Const32 [int64(int32(c&d))]) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd32 { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst32 { + continue + } + d := v_1.AuxInt + v.reset(OpConst32) + v.AuxInt = int64(int32(c & d)) + return true } - z := v_0.Args[1] - i := v_0.Args[0] - if i.Op != OpConst32 { - break + break + } + // match: (And32 (Const32 [m]) (Rsh32Ux64 _ (Const64 [c]))) + // cond: c >= 64-ntz(m) + // result: (Const32 [0]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 { + continue + } + m := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpRsh32Ux64 { + continue + } + _ = v_1.Args[1] + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpConst64 { + continue + } + c := v_1_1.AuxInt + if !(c >= 64-ntz(m)) { + continue + } + v.reset(OpConst32) + v.AuxInt = 0 + return true } - t := i.Type - if !(z.Op != OpConst32 && x.Op != OpConst32) { - break + break + } + // match: (And32 (Const32 [m]) (Lsh32x64 _ (Const64 [c]))) + // cond: c >= 64-nlz(m) + // result: (Const32 [0]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 { + continue + } + m := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpLsh32x64 { + continue + } + _ = v_1.Args[1] + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpConst64 { + continue + } + c := v_1_1.AuxInt + if !(c >= 64-nlz(m)) { + continue + } + v.reset(OpConst32) + v.AuxInt = 0 + return true } - v.reset(OpAdd32) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAdd32, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (Add32 (Add32 z i:(Const32 )) x) - // cond: (z.Op != OpConst32 && x.Op != OpConst32) - // result: (Add32 i (Add32 z x)) + // match: (And32 x x) + // result: x for { x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd32 { - break - } - _ = v_0.Args[1] - z := v_0.Args[0] - i := v_0.Args[1] - if i.Op != OpConst32 { - break - } - t := i.Type - if !(z.Op != OpConst32 && x.Op != OpConst32) { + if x != v.Args[0] { break } - v.reset(OpAdd32) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAdd32, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (Add32 x (Add32 i:(Const32 ) z)) - // cond: (z.Op != OpConst32 && x.Op != OpConst32) - // result: (Add32 i (Add32 z x)) + // match: (And32 (Const32 [-1]) x) + // result: x for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAdd32 { - break - } - z := v_1.Args[1] - i := v_1.Args[0] - if i.Op != OpConst32 { - break - } - t := i.Type - if !(z.Op != OpConst32 && x.Op != OpConst32) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 || v_0.AuxInt != -1 { + continue + } + x := v.Args[1^_i0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - v.reset(OpAdd32) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAdd32, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (Add32 x (Add32 z i:(Const32 ))) - // cond: (z.Op != OpConst32 && x.Op != OpConst32) - // result: (Add32 i (Add32 z x)) + // match: (And32 (Const32 [0]) _) + // result: (Const32 [0]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAdd32 { - break - } - _ = v_1.Args[1] - z := v_1.Args[0] - i := v_1.Args[1] - if i.Op != OpConst32 { - break - } - t := i.Type - if !(z.Op != OpConst32 && x.Op != OpConst32) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 || v_0.AuxInt != 0 { + continue + } + v.reset(OpConst32) + v.AuxInt = 0 + return true } - v.reset(OpAdd32) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAdd32, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (Add32 (Sub32 i:(Const32 ) z) x) - // cond: (z.Op != OpConst32 && x.Op != OpConst32) - // result: (Add32 i (Sub32 x z)) + // match: (And32 x (And32 x y)) + // result: (And32 x y) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpSub32 { - break - } - z := v_0.Args[1] - i := v_0.Args[0] - if i.Op != OpConst32 { - break - } - t := i.Type - if !(z.Op != OpConst32 && x.Op != OpConst32) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAnd32 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + if x != v_1.Args[_i1] { + continue + } + y := v_1.Args[1^_i1] + v.reset(OpAnd32) + v.AddArg(x) + v.AddArg(y) + return true + } } - v.reset(OpAdd32) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpSub32, t) - v0.AddArg(x) - v0.AddArg(z) - v.AddArg(v0) - return true + break } - // match: (Add32 x (Sub32 i:(Const32 ) z)) + // match: (And32 (And32 i:(Const32 ) z) x) // cond: (z.Op != OpConst32 && x.Op != OpConst32) - // result: (Add32 i (Sub32 x z)) + // result: (And32 i (And32 z x)) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpSub32 { - break - } - z := v_1.Args[1] - i := v_1.Args[0] - if i.Op != OpConst32 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAnd32 { + continue + } + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + i := v_0.Args[_i1] + if i.Op != OpConst32 { + continue + } + t := i.Type + z := v_0.Args[1^_i1] + x := v.Args[1^_i0] + if !(z.Op != OpConst32 && x.Op != OpConst32) { + continue + } + v.reset(OpAnd32) + v.AddArg(i) + v0 := b.NewValue0(v.Pos, OpAnd32, t) + v0.AddArg(z) + v0.AddArg(x) + v.AddArg(v0) + return true + } } - t := i.Type - if !(z.Op != OpConst32 && x.Op != OpConst32) { - break + break + } + // match: (And32 (Const32 [c]) (And32 (Const32 [d]) x)) + // result: (And32 (Const32 [int64(int32(c&d))]) x) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpAnd32 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst32 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpAnd32) + v0 := b.NewValue0(v.Pos, OpConst32, t) + v0.AuxInt = int64(int32(c & d)) + v.AddArg(v0) + v.AddArg(x) + return true + } } - v.reset(OpAdd32) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpSub32, t) - v0.AddArg(x) - v0.AddArg(z) - v.AddArg(v0) - return true + break } return false } -func rewriteValuegeneric_OpAdd32_20(v *Value) bool { +func rewriteValuegeneric_OpAnd64_0(v *Value) bool { b := v.Block - // match: (Add32 (Sub32 z i:(Const32 )) x) - // cond: (z.Op != OpConst32 && x.Op != OpConst32) - // result: (Sub32 (Add32 x z) i) + // match: (And64 (Const64 [c]) (Const64 [d])) + // result: (Const64 [c&d]) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpSub32 { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst64 { + continue + } + d := v_1.AuxInt + v.reset(OpConst64) + v.AuxInt = c & d + return true } - _ = v_0.Args[1] - z := v_0.Args[0] - i := v_0.Args[1] - if i.Op != OpConst32 { - break - } - t := i.Type - if !(z.Op != OpConst32 && x.Op != OpConst32) { - break - } - v.reset(OpSub32) - v0 := b.NewValue0(v.Pos, OpAdd32, t) - v0.AddArg(x) - v0.AddArg(z) - v.AddArg(v0) - v.AddArg(i) - return true + break } - // match: (Add32 x (Sub32 z i:(Const32 ))) - // cond: (z.Op != OpConst32 && x.Op != OpConst32) - // result: (Sub32 (Add32 x z) i) + // match: (And64 (Const64 [m]) (Rsh64Ux64 _ (Const64 [c]))) + // cond: c >= 64-ntz(m) + // result: (Const64 [0]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpSub32 { - break - } - _ = v_1.Args[1] - z := v_1.Args[0] - i := v_1.Args[1] - if i.Op != OpConst32 { - break - } - t := i.Type - if !(z.Op != OpConst32 && x.Op != OpConst32) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 { + continue + } + m := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpRsh64Ux64 { + continue + } + _ = v_1.Args[1] + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpConst64 { + continue + } + c := v_1_1.AuxInt + if !(c >= 64-ntz(m)) { + continue + } + v.reset(OpConst64) + v.AuxInt = 0 + return true } - v.reset(OpSub32) - v0 := b.NewValue0(v.Pos, OpAdd32, t) - v0.AddArg(x) - v0.AddArg(z) - v.AddArg(v0) - v.AddArg(i) - return true + break } - // match: (Add32 (Const32 [c]) (Add32 (Const32 [d]) x)) - // result: (Add32 (Const32 [int64(int32(c+d))]) x) + // match: (And64 (Const64 [m]) (Lsh64x64 _ (Const64 [c]))) + // cond: c >= 64-nlz(m) + // result: (Const64 [0]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAdd32 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 { + continue + } + m := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpLsh64x64 { + continue + } + _ = v_1.Args[1] + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpConst64 { + continue + } + c := v_1_1.AuxInt + if !(c >= 64-nlz(m)) { + continue + } + v.reset(OpConst64) + v.AuxInt = 0 + return true } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 || v_1_0.Type != t { + break + } + // match: (And64 x x) + // result: x + for { + x := v.Args[1] + if x != v.Args[0] { break } - d := v_1_0.AuxInt - v.reset(OpAdd32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c + d)) - v.AddArg(v0) + v.reset(OpCopy) + v.Type = x.Type v.AddArg(x) return true } - // match: (Add32 (Const32 [c]) (Add32 x (Const32 [d]))) - // result: (Add32 (Const32 [int64(int32(c+d))]) x) + // match: (And64 (Const64 [-1]) x) + // result: x for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAdd32 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 || v_1_1.Type != t { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 || v_0.AuxInt != -1 { + continue + } + x := v.Args[1^_i0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - d := v_1_1.AuxInt - v.reset(OpAdd32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c + d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (Add32 (Add32 (Const32 [d]) x) (Const32 [c])) - // result: (Add32 (Const32 [int64(int32(c+d))]) x) + // match: (And64 (Const64 [0]) _) + // result: (Const64 [0]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd32 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break - } - t := v_0_0.Type - d := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.Type != t { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 || v_0.AuxInt != 0 { + continue + } + v.reset(OpConst64) + v.AuxInt = 0 + return true } - c := v_1.AuxInt - v.reset(OpAdd32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c + d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (Add32 (Add32 x (Const32 [d])) (Const32 [c])) - // result: (Add32 (Const32 [int64(int32(c+d))]) x) + // match: (And64 x (And64 x y)) + // result: (And64 x y) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd32 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { - break - } - t := v_0_1.Type - d := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.Type != t { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAnd64 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + if x != v_1.Args[_i1] { + continue + } + y := v_1.Args[1^_i1] + v.reset(OpAnd64) + v.AddArg(x) + v.AddArg(y) + return true + } } - c := v_1.AuxInt - v.reset(OpAdd32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c + d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (Add32 (Const32 [c]) (Sub32 (Const32 [d]) x)) - // result: (Sub32 (Const32 [int64(int32(c+d))]) x) + // match: (And64 (And64 i:(Const64 ) z) x) + // cond: (z.Op != OpConst64 && x.Op != OpConst64) + // result: (And64 i (And64 z x)) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAnd64 { + continue + } + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + i := v_0.Args[_i1] + if i.Op != OpConst64 { + continue + } + t := i.Type + z := v_0.Args[1^_i1] + x := v.Args[1^_i0] + if !(z.Op != OpConst64 && x.Op != OpConst64) { + continue + } + v.reset(OpAnd64) + v.AddArg(i) + v0 := b.NewValue0(v.Pos, OpAnd64, t) + v0.AddArg(z) + v0.AddArg(x) + v.AddArg(v0) + return true + } } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpSub32 { - break + break + } + // match: (And64 (Const64 [c]) (And64 (Const64 [d]) x)) + // result: (And64 (Const64 [c&d]) x) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpAnd64 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst64 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpAnd64) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = c & d + v.AddArg(v0) + v.AddArg(x) + return true + } } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 || v_1_0.Type != t { - break + break + } + return false +} +func rewriteValuegeneric_OpAnd8_0(v *Value) bool { + b := v.Block + // match: (And8 (Const8 [c]) (Const8 [d])) + // result: (Const8 [int64(int8(c&d))]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst8 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst8 { + continue + } + d := v_1.AuxInt + v.reset(OpConst8) + v.AuxInt = int64(int8(c & d)) + return true } - d := v_1_0.AuxInt - v.reset(OpSub32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c + d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (Add32 (Sub32 (Const32 [d]) x) (Const32 [c])) - // result: (Sub32 (Const32 [int64(int32(c+d))]) x) + // match: (And8 (Const8 [m]) (Rsh8Ux64 _ (Const64 [c]))) + // cond: c >= 64-ntz(m) + // result: (Const8 [0]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpSub32 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst8 { + continue + } + m := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpRsh8Ux64 { + continue + } + _ = v_1.Args[1] + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpConst64 { + continue + } + c := v_1_1.AuxInt + if !(c >= 64-ntz(m)) { + continue + } + v.reset(OpConst8) + v.AuxInt = 0 + return true } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break + break + } + // match: (And8 (Const8 [m]) (Lsh8x64 _ (Const64 [c]))) + // cond: c >= 64-nlz(m) + // result: (Const8 [0]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst8 { + continue + } + m := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpLsh8x64 { + continue + } + _ = v_1.Args[1] + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpConst64 { + continue + } + c := v_1_1.AuxInt + if !(c >= 64-nlz(m)) { + continue + } + v.reset(OpConst8) + v.AuxInt = 0 + return true } - t := v_0_0.Type - d := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.Type != t { + break + } + // match: (And8 x x) + // result: x + for { + x := v.Args[1] + if x != v.Args[0] { break } - c := v_1.AuxInt - v.reset(OpSub32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c + d)) - v.AddArg(v0) + v.reset(OpCopy) + v.Type = x.Type v.AddArg(x) return true } - // match: (Add32 (Const32 [c]) (Sub32 x (Const32 [d]))) - // result: (Add32 (Const32 [int64(int32(c-d))]) x) + // match: (And8 (Const8 [-1]) x) + // result: x for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst8 || v_0.AuxInt != -1 { + continue + } + x := v.Args[1^_i0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpSub32 { - break + break + } + // match: (And8 (Const8 [0]) _) + // result: (Const8 [0]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst8 || v_0.AuxInt != 0 { + continue + } + v.reset(OpConst8) + v.AuxInt = 0 + return true } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 || v_1_1.Type != t { - break + break + } + // match: (And8 x (And8 x y)) + // result: (And8 x y) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAnd8 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + if x != v_1.Args[_i1] { + continue + } + y := v_1.Args[1^_i1] + v.reset(OpAnd8) + v.AddArg(x) + v.AddArg(y) + return true + } } - d := v_1_1.AuxInt - v.reset(OpAdd32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c - d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (Add32 (Sub32 x (Const32 [d])) (Const32 [c])) - // result: (Add32 (Const32 [int64(int32(c-d))]) x) + // match: (And8 (And8 i:(Const8 ) z) x) + // cond: (z.Op != OpConst8 && x.Op != OpConst8) + // result: (And8 i (And8 z x)) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAnd8 { + continue + } + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + i := v_0.Args[_i1] + if i.Op != OpConst8 { + continue + } + t := i.Type + z := v_0.Args[1^_i1] + x := v.Args[1^_i0] + if !(z.Op != OpConst8 && x.Op != OpConst8) { + continue + } + v.reset(OpAnd8) + v.AddArg(i) + v0 := b.NewValue0(v.Pos, OpAnd8, t) + v0.AddArg(z) + v0.AddArg(x) + v.AddArg(v0) + return true + } + } + break + } + // match: (And8 (Const8 [c]) (And8 (Const8 [d]) x)) + // result: (And8 (Const8 [int64(int8(c&d))]) x) for { _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst8 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpAnd8 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst8 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpAnd8) + v0 := b.NewValue0(v.Pos, OpConst8, t) + v0.AuxInt = int64(int8(c & d)) + v.AddArg(v0) + v.AddArg(x) + return true + } + } + break + } + return false +} +func rewriteValuegeneric_OpArraySelect_0(v *Value) bool { + // match: (ArraySelect (ArrayMake1 x)) + // result: x + for { v_0 := v.Args[0] - if v_0.Op != OpSub32 { + if v_0.Op != OpArrayMake1 { break } - _ = v_0.Args[1] x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + // match: (ArraySelect [0] (IData x)) + // result: (IData x) + for { + if v.AuxInt != 0 { break } - t := v_0_1.Type - d := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.Type != t { + v_0 := v.Args[0] + if v_0.Op != OpIData { break } - c := v_1.AuxInt - v.reset(OpAdd32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c - d)) - v.AddArg(v0) + x := v_0.Args[0] + v.reset(OpIData) v.AddArg(x) return true } return false } -func rewriteValuegeneric_OpAdd32F_0(v *Value) bool { - // match: (Add32F (Const32F [c]) (Const32F [d])) - // result: (Const32F [auxFrom32F(auxTo32F(c) + auxTo32F(d))]) +func rewriteValuegeneric_OpCom16_0(v *Value) bool { + // match: (Com16 (Com16 x)) + // result: x for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst32F { + if v_0.Op != OpCom16 { break } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32F { + x := v_0.Args[0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + // match: (Com16 (Const16 [c])) + // result: (Const16 [^c]) + for { + v_0 := v.Args[0] + if v_0.Op != OpConst16 { break } - d := v_1.AuxInt - v.reset(OpConst32F) - v.AuxInt = auxFrom32F(auxTo32F(c) + auxTo32F(d)) + c := v_0.AuxInt + v.reset(OpConst16) + v.AuxInt = ^c return true } - // match: (Add32F (Const32F [d]) (Const32F [c])) - // result: (Const32F [auxFrom32F(auxTo32F(c) + auxTo32F(d))]) + // match: (Com16 (Add16 (Const16 [-1]) x)) + // result: (Neg16 x) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst32F { + if v_0.Op != OpAdd16 { break } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32F { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpConst16 || v_0_0.AuxInt != -1 { + continue + } + x := v_0.Args[1^_i0] + v.reset(OpNeg16) + v.AddArg(x) + return true } - c := v_1.AuxInt - v.reset(OpConst32F) - v.AuxInt = auxFrom32F(auxTo32F(c) + auxTo32F(d)) - return true + break } return false } -func rewriteValuegeneric_OpAdd64_0(v *Value) bool { - b := v.Block - // match: (Add64 (Const64 [c]) (Const64 [d])) - // result: (Const64 [c+d]) +func rewriteValuegeneric_OpCom32_0(v *Value) bool { + // match: (Com32 (Com32 x)) + // result: x for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { + if v_0.Op != OpCom32 { break } - d := v_1.AuxInt - v.reset(OpConst64) - v.AuxInt = c + d + x := v_0.Args[0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (Add64 (Const64 [d]) (Const64 [c])) - // result: (Const64 [c+d]) + // match: (Com32 (Const32 [c])) + // result: (Const32 [^c]) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { + if v_0.Op != OpConst32 { break } - c := v_1.AuxInt - v.reset(OpConst64) - v.AuxInt = c + d + c := v_0.AuxInt + v.reset(OpConst32) + v.AuxInt = ^c return true } - // match: (Add64 (Mul64 x y) (Mul64 x z)) - // result: (Mul64 x (Add64 y z)) + // match: (Com32 (Add32 (Const32 [-1]) x)) + // result: (Neg32 x) for { - t := v.Type - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpMul64 { + if v_0.Op != OpAdd32 { break } - y := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpConst32 || v_0_0.AuxInt != -1 { + continue + } + x := v_0.Args[1^_i0] + v.reset(OpNeg32) + v.AddArg(x) + return true } - z := v_1.Args[1] - if x != v_1.Args[0] { + break + } + return false +} +func rewriteValuegeneric_OpCom64_0(v *Value) bool { + // match: (Com64 (Com64 x)) + // result: x + for { + v_0 := v.Args[0] + if v_0.Op != OpCom64 { break } - v.reset(OpMul64) + x := v_0.Args[0] + v.reset(OpCopy) + v.Type = x.Type v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd64, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) return true } - // match: (Add64 (Mul64 y x) (Mul64 x z)) - // result: (Mul64 x (Add64 y z)) + // match: (Com64 (Const64 [c])) + // result: (Const64 [^c]) for { - t := v.Type - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpMul64 { + if v_0.Op != OpConst64 { break } - x := v_0.Args[1] - y := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { + c := v_0.AuxInt + v.reset(OpConst64) + v.AuxInt = ^c + return true + } + // match: (Com64 (Add64 (Const64 [-1]) x)) + // result: (Neg64 x) + for { + v_0 := v.Args[0] + if v_0.Op != OpAdd64 { break } - z := v_1.Args[1] - if x != v_1.Args[0] { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpConst64 || v_0_0.AuxInt != -1 { + continue + } + x := v_0.Args[1^_i0] + v.reset(OpNeg64) + v.AddArg(x) + return true } - v.reset(OpMul64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd64, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) - return true + break } - // match: (Add64 (Mul64 x y) (Mul64 z x)) - // result: (Mul64 x (Add64 y z)) + return false +} +func rewriteValuegeneric_OpCom8_0(v *Value) bool { + // match: (Com8 (Com8 x)) + // result: x for { - t := v.Type - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpMul64 { + if v_0.Op != OpCom8 { break } - y := v_0.Args[1] x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - z := v_1.Args[0] - if x != v_1.Args[1] { + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + // match: (Com8 (Const8 [c])) + // result: (Const8 [^c]) + for { + v_0 := v.Args[0] + if v_0.Op != OpConst8 { break } - v.reset(OpMul64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd64, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) + c := v_0.AuxInt + v.reset(OpConst8) + v.AuxInt = ^c return true } - // match: (Add64 (Mul64 y x) (Mul64 z x)) - // result: (Mul64 x (Add64 y z)) + // match: (Com8 (Add8 (Const8 [-1]) x)) + // result: (Neg8 x) for { - t := v.Type - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpMul64 { + if v_0.Op != OpAdd8 { break } - x := v_0.Args[1] - y := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - z := v_1.Args[0] - if x != v_1.Args[1] { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpConst8 || v_0_0.AuxInt != -1 { + continue + } + x := v_0.Args[1^_i0] + v.reset(OpNeg8) + v.AddArg(x) + return true } - v.reset(OpMul64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd64, t) - v0.AddArg(y) - v0.AddArg(z) + break + } + return false +} +func rewriteValuegeneric_OpConstInterface_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (ConstInterface) + // result: (IMake (ConstNil ) (ConstNil )) + for { + v.reset(OpIMake) + v0 := b.NewValue0(v.Pos, OpConstNil, typ.Uintptr) v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) + v.AddArg(v1) return true } - // match: (Add64 (Mul64 x z) (Mul64 x y)) - // result: (Mul64 x (Add64 y z)) +} +func rewriteValuegeneric_OpConstSlice_0(v *Value) bool { + b := v.Block + config := b.Func.Config + typ := &b.Func.Config.Types + // match: (ConstSlice) + // cond: config.PtrSize == 4 + // result: (SliceMake (ConstNil ) (Const32 [0]) (Const32 [0])) for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - z := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - y := v_1.Args[1] - if x != v_1.Args[0] { + if !(config.PtrSize == 4) { break } - v.reset(OpMul64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd64, t) - v0.AddArg(y) - v0.AddArg(z) + v.reset(OpSliceMake) + v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.Elem().PtrTo()) v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpConst32, typ.Int) + v1.AuxInt = 0 + v.AddArg(v1) + v2 := b.NewValue0(v.Pos, OpConst32, typ.Int) + v2.AuxInt = 0 + v.AddArg(v2) return true } - // match: (Add64 (Mul64 z x) (Mul64 x y)) - // result: (Mul64 x (Add64 y z)) + // match: (ConstSlice) + // cond: config.PtrSize == 8 + // result: (SliceMake (ConstNil ) (Const64 [0]) (Const64 [0])) for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - x := v_0.Args[1] - z := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - y := v_1.Args[1] - if x != v_1.Args[0] { + if !(config.PtrSize == 8) { break } - v.reset(OpMul64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd64, t) - v0.AddArg(y) - v0.AddArg(z) + v.reset(OpSliceMake) + v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.Elem().PtrTo()) v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpConst64, typ.Int) + v1.AuxInt = 0 + v.AddArg(v1) + v2 := b.NewValue0(v.Pos, OpConst64, typ.Int) + v2.AuxInt = 0 + v.AddArg(v2) return true } - // match: (Add64 (Mul64 x z) (Mul64 y x)) - // result: (Mul64 x (Add64 y z)) + return false +} +func rewriteValuegeneric_OpConstString_0(v *Value) bool { + b := v.Block + config := b.Func.Config + fe := b.Func.fe + typ := &b.Func.Config.Types + // match: (ConstString {s}) + // cond: config.PtrSize == 4 && s.(string) == "" + // result: (StringMake (ConstNil) (Const32 [0])) for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - z := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - y := v_1.Args[0] - if x != v_1.Args[1] { + s := v.Aux + if !(config.PtrSize == 4 && s.(string) == "") { break } - v.reset(OpMul64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd64, t) - v0.AddArg(y) - v0.AddArg(z) + v.reset(OpStringMake) + v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpConst32, typ.Int) + v1.AuxInt = 0 + v.AddArg(v1) return true } - // match: (Add64 (Mul64 z x) (Mul64 y x)) - // result: (Mul64 x (Add64 y z)) + // match: (ConstString {s}) + // cond: config.PtrSize == 8 && s.(string) == "" + // result: (StringMake (ConstNil) (Const64 [0])) for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { + s := v.Aux + if !(config.PtrSize == 8 && s.(string) == "") { break } - x := v_0.Args[1] - z := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { + v.reset(OpStringMake) + v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpConst64, typ.Int) + v1.AuxInt = 0 + v.AddArg(v1) + return true + } + // match: (ConstString {s}) + // cond: config.PtrSize == 4 && s.(string) != "" + // result: (StringMake (Addr {fe.StringData(s.(string))} (SB)) (Const32 [int64(len(s.(string)))])) + for { + s := v.Aux + if !(config.PtrSize == 4 && s.(string) != "") { break } - _ = v_1.Args[1] - y := v_1.Args[0] - if x != v_1.Args[1] { + v.reset(OpStringMake) + v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr) + v0.Aux = fe.StringData(s.(string)) + v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr) + v0.AddArg(v1) + v.AddArg(v0) + v2 := b.NewValue0(v.Pos, OpConst32, typ.Int) + v2.AuxInt = int64(len(s.(string))) + v.AddArg(v2) + return true + } + // match: (ConstString {s}) + // cond: config.PtrSize == 8 && s.(string) != "" + // result: (StringMake (Addr {fe.StringData(s.(string))} (SB)) (Const64 [int64(len(s.(string)))])) + for { + s := v.Aux + if !(config.PtrSize == 8 && s.(string) != "") { break } - v.reset(OpMul64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd64, t) - v0.AddArg(y) - v0.AddArg(z) + v.reset(OpStringMake) + v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr) + v0.Aux = fe.StringData(s.(string)) + v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr) + v0.AddArg(v1) v.AddArg(v0) + v2 := b.NewValue0(v.Pos, OpConst64, typ.Int) + v2.AuxInt = int64(len(s.(string))) + v.AddArg(v2) return true } return false } -func rewriteValuegeneric_OpAdd64_10(v *Value) bool { - b := v.Block - // match: (Add64 (Const64 [0]) x) - // result: x +func rewriteValuegeneric_OpConvert_0(v *Value) bool { + // match: (Convert (Add64 (Convert ptr mem) off) mem) + // result: (Add64 ptr off) for { - x := v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst64 || v_0.AuxInt != 0 { + if v_0.Op != OpAdd64 { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpConvert { + continue + } + _ = v_0_0.Args[1] + ptr := v_0_0.Args[0] + if mem != v_0_0.Args[1] { + continue + } + off := v_0.Args[1^_i0] + v.reset(OpAdd64) + v.AddArg(ptr) + v.AddArg(off) + return true + } + break } - // match: (Add64 x (Const64 [0])) - // result: x + // match: (Convert (Add32 (Convert ptr mem) off) mem) + // result: (Add32 ptr off) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 0 { + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpAdd32 { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpConvert { + continue + } + _ = v_0_0.Args[1] + ptr := v_0_0.Args[0] + if mem != v_0_0.Args[1] { + continue + } + off := v_0.Args[1^_i0] + v.reset(OpAdd32) + v.AddArg(ptr) + v.AddArg(off) + return true + } + break } - // match: (Add64 (Const64 [1]) (Com64 x)) - // result: (Neg64 x) + // match: (Convert (Convert ptr mem) mem) + // result: ptr for { - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst64 || v_0.AuxInt != 1 { + if v_0.Op != OpConvert { break } - v_1 := v.Args[1] - if v_1.Op != OpCom64 { + _ = v_0.Args[1] + ptr := v_0.Args[0] + if mem != v_0.Args[1] { break } - x := v_1.Args[0] - v.reset(OpNeg64) - v.AddArg(x) + v.reset(OpCopy) + v.Type = ptr.Type + v.AddArg(ptr) return true } - // match: (Add64 (Com64 x) (Const64 [1])) - // result: (Neg64 x) + return false +} +func rewriteValuegeneric_OpCvt32Fto32_0(v *Value) bool { + // match: (Cvt32Fto32 (Const32F [c])) + // result: (Const32 [int64(int32(auxTo32F(c)))]) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpCom64 { - break - } - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 1 { + if v_0.Op != OpConst32F { break } - v.reset(OpNeg64) - v.AddArg(x) + c := v_0.AuxInt + v.reset(OpConst32) + v.AuxInt = int64(int32(auxTo32F(c))) return true } - // match: (Add64 (Add64 i:(Const64 ) z) x) - // cond: (z.Op != OpConst64 && x.Op != OpConst64) - // result: (Add64 i (Add64 z x)) + return false +} +func rewriteValuegeneric_OpCvt32Fto64_0(v *Value) bool { + // match: (Cvt32Fto64 (Const32F [c])) + // result: (Const64 [int64(auxTo32F(c))]) for { - x := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpAdd64 { - break - } - z := v_0.Args[1] - i := v_0.Args[0] - if i.Op != OpConst64 { + if v_0.Op != OpConst32F { break } - t := i.Type - if !(z.Op != OpConst64 && x.Op != OpConst64) { - break - } - v.reset(OpAdd64) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAdd64, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) + c := v_0.AuxInt + v.reset(OpConst64) + v.AuxInt = int64(auxTo32F(c)) return true } - // match: (Add64 (Add64 z i:(Const64 )) x) - // cond: (z.Op != OpConst64 && x.Op != OpConst64) - // result: (Add64 i (Add64 z x)) + return false +} +func rewriteValuegeneric_OpCvt32Fto64F_0(v *Value) bool { + // match: (Cvt32Fto64F (Const32F [c])) + // result: (Const64F [c]) for { - x := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpAdd64 { - break - } - _ = v_0.Args[1] - z := v_0.Args[0] - i := v_0.Args[1] - if i.Op != OpConst64 { - break - } - t := i.Type - if !(z.Op != OpConst64 && x.Op != OpConst64) { + if v_0.Op != OpConst32F { break } - v.reset(OpAdd64) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAdd64, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) + c := v_0.AuxInt + v.reset(OpConst64F) + v.AuxInt = c return true } - // match: (Add64 x (Add64 i:(Const64 ) z)) - // cond: (z.Op != OpConst64 && x.Op != OpConst64) - // result: (Add64 i (Add64 z x)) + return false +} +func rewriteValuegeneric_OpCvt32to32F_0(v *Value) bool { + // match: (Cvt32to32F (Const32 [c])) + // result: (Const32F [auxFrom32F(float32(int32(c)))]) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAdd64 { - break - } - z := v_1.Args[1] - i := v_1.Args[0] - if i.Op != OpConst64 { - break - } - t := i.Type - if !(z.Op != OpConst64 && x.Op != OpConst64) { + v_0 := v.Args[0] + if v_0.Op != OpConst32 { break } - v.reset(OpAdd64) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAdd64, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) + c := v_0.AuxInt + v.reset(OpConst32F) + v.AuxInt = auxFrom32F(float32(int32(c))) return true } - // match: (Add64 x (Add64 z i:(Const64 ))) - // cond: (z.Op != OpConst64 && x.Op != OpConst64) - // result: (Add64 i (Add64 z x)) + return false +} +func rewriteValuegeneric_OpCvt32to64F_0(v *Value) bool { + // match: (Cvt32to64F (Const32 [c])) + // result: (Const64F [auxFrom64F(float64(int32(c)))]) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAdd64 { - break - } - _ = v_1.Args[1] - z := v_1.Args[0] - i := v_1.Args[1] - if i.Op != OpConst64 { - break - } - t := i.Type - if !(z.Op != OpConst64 && x.Op != OpConst64) { + v_0 := v.Args[0] + if v_0.Op != OpConst32 { break } - v.reset(OpAdd64) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAdd64, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) + c := v_0.AuxInt + v.reset(OpConst64F) + v.AuxInt = auxFrom64F(float64(int32(c))) return true } - // match: (Add64 (Sub64 i:(Const64 ) z) x) - // cond: (z.Op != OpConst64 && x.Op != OpConst64) - // result: (Add64 i (Sub64 x z)) + return false +} +func rewriteValuegeneric_OpCvt64Fto32_0(v *Value) bool { + // match: (Cvt64Fto32 (Const64F [c])) + // result: (Const32 [int64(int32(auxTo64F(c)))]) for { - x := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpSub64 { - break - } - z := v_0.Args[1] - i := v_0.Args[0] - if i.Op != OpConst64 { + if v_0.Op != OpConst64F { break } - t := i.Type - if !(z.Op != OpConst64 && x.Op != OpConst64) { + c := v_0.AuxInt + v.reset(OpConst32) + v.AuxInt = int64(int32(auxTo64F(c))) + return true + } + return false +} +func rewriteValuegeneric_OpCvt64Fto32F_0(v *Value) bool { + // match: (Cvt64Fto32F (Const64F [c])) + // result: (Const32F [auxFrom32F(float32(auxTo64F(c)))]) + for { + v_0 := v.Args[0] + if v_0.Op != OpConst64F { break } - v.reset(OpAdd64) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpSub64, t) - v0.AddArg(x) - v0.AddArg(z) - v.AddArg(v0) + c := v_0.AuxInt + v.reset(OpConst32F) + v.AuxInt = auxFrom32F(float32(auxTo64F(c))) return true } - // match: (Add64 x (Sub64 i:(Const64 ) z)) - // cond: (z.Op != OpConst64 && x.Op != OpConst64) - // result: (Add64 i (Sub64 x z)) + return false +} +func rewriteValuegeneric_OpCvt64Fto64_0(v *Value) bool { + // match: (Cvt64Fto64 (Const64F [c])) + // result: (Const64 [int64(auxTo64F(c))]) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpSub64 { + v_0 := v.Args[0] + if v_0.Op != OpConst64F { break } - z := v_1.Args[1] - i := v_1.Args[0] - if i.Op != OpConst64 { + c := v_0.AuxInt + v.reset(OpConst64) + v.AuxInt = int64(auxTo64F(c)) + return true + } + return false +} +func rewriteValuegeneric_OpCvt64to32F_0(v *Value) bool { + // match: (Cvt64to32F (Const64 [c])) + // result: (Const32F [auxFrom32F(float32(c))]) + for { + v_0 := v.Args[0] + if v_0.Op != OpConst64 { break } - t := i.Type - if !(z.Op != OpConst64 && x.Op != OpConst64) { + c := v_0.AuxInt + v.reset(OpConst32F) + v.AuxInt = auxFrom32F(float32(c)) + return true + } + return false +} +func rewriteValuegeneric_OpCvt64to64F_0(v *Value) bool { + // match: (Cvt64to64F (Const64 [c])) + // result: (Const64F [auxFrom64F(float64(c))]) + for { + v_0 := v.Args[0] + if v_0.Op != OpConst64 { break } - v.reset(OpAdd64) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpSub64, t) - v0.AddArg(x) - v0.AddArg(z) - v.AddArg(v0) + c := v_0.AuxInt + v.reset(OpConst64F) + v.AuxInt = auxFrom64F(float64(c)) return true } return false } -func rewriteValuegeneric_OpAdd64_20(v *Value) bool { +func rewriteValuegeneric_OpDiv16_0(v *Value) bool { b := v.Block - // match: (Add64 (Sub64 z i:(Const64 )) x) - // cond: (z.Op != OpConst64 && x.Op != OpConst64) - // result: (Sub64 (Add64 x z) i) + typ := &b.Func.Config.Types + // match: (Div16 (Const16 [c]) (Const16 [d])) + // cond: d != 0 + // result: (Const16 [int64(int16(c)/int16(d))]) for { - x := v.Args[1] + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpSub64 { + if v_0.Op != OpConst16 { break } - _ = v_0.Args[1] - z := v_0.Args[0] - i := v_0.Args[1] - if i.Op != OpConst64 { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst16 { break } - t := i.Type - if !(z.Op != OpConst64 && x.Op != OpConst64) { + d := v_1.AuxInt + if !(d != 0) { break } - v.reset(OpSub64) - v0 := b.NewValue0(v.Pos, OpAdd64, t) - v0.AddArg(x) - v0.AddArg(z) - v.AddArg(v0) - v.AddArg(i) + v.reset(OpConst16) + v.AuxInt = int64(int16(c) / int16(d)) return true } - // match: (Add64 x (Sub64 z i:(Const64 ))) - // cond: (z.Op != OpConst64 && x.Op != OpConst64) - // result: (Sub64 (Add64 x z) i) + // match: (Div16 n (Const16 [c])) + // cond: isNonNegative(n) && isPowerOfTwo(c&0xffff) + // result: (Rsh16Ux64 n (Const64 [log2(c&0xffff)])) for { _ = v.Args[1] - x := v.Args[0] + n := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpSub64 { - break - } - _ = v_1.Args[1] - z := v_1.Args[0] - i := v_1.Args[1] - if i.Op != OpConst64 { + if v_1.Op != OpConst16 { break } - t := i.Type - if !(z.Op != OpConst64 && x.Op != OpConst64) { + c := v_1.AuxInt + if !(isNonNegative(n) && isPowerOfTwo(c&0xffff)) { break } - v.reset(OpSub64) - v0 := b.NewValue0(v.Pos, OpAdd64, t) - v0.AddArg(x) - v0.AddArg(z) + v.reset(OpRsh16Ux64) + v.AddArg(n) + v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v0.AuxInt = log2(c & 0xffff) v.AddArg(v0) - v.AddArg(i) return true } - // match: (Add64 (Const64 [c]) (Add64 (Const64 [d]) x)) - // result: (Add64 (Const64 [c+d]) x) + // match: (Div16 n (Const16 [c])) + // cond: c < 0 && c != -1<<15 + // result: (Neg16 (Div16 n (Const16 [-c]))) for { + t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - t := v_0.Type - c := v_0.AuxInt + n := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAdd64 { + if v_1.Op != OpConst16 { break } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst64 || v_1_0.Type != t { + c := v_1.AuxInt + if !(c < 0 && c != -1<<15) { break } - d := v_1_0.AuxInt - v.reset(OpAdd64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c + d + v.reset(OpNeg16) + v0 := b.NewValue0(v.Pos, OpDiv16, t) + v0.AddArg(n) + v1 := b.NewValue0(v.Pos, OpConst16, t) + v1.AuxInt = -c + v0.AddArg(v1) v.AddArg(v0) - v.AddArg(x) return true } - // match: (Add64 (Const64 [c]) (Add64 x (Const64 [d]))) - // result: (Add64 (Const64 [c+d]) x) + // match: (Div16 x (Const16 [-1<<15])) + // result: (Rsh16Ux64 (And16 x (Neg16 x)) (Const64 [15])) for { + t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - t := v_0.Type - c := v_0.AuxInt + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAdd64 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != t { + if v_1.Op != OpConst16 || v_1.AuxInt != -1<<15 { break } - d := v_1_1.AuxInt - v.reset(OpAdd64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c + d + v.reset(OpRsh16Ux64) + v0 := b.NewValue0(v.Pos, OpAnd16, t) + v0.AddArg(x) + v1 := b.NewValue0(v.Pos, OpNeg16, t) + v1.AddArg(x) + v0.AddArg(v1) v.AddArg(v0) - v.AddArg(x) + v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v2.AuxInt = 15 + v.AddArg(v2) return true } - // match: (Add64 (Add64 (Const64 [d]) x) (Const64 [c])) - // result: (Add64 (Const64 [c+d]) x) + // match: (Div16 n (Const16 [c])) + // cond: isPowerOfTwo(c) + // result: (Rsh16x64 (Add16 n (Rsh16Ux64 (Rsh16x64 n (Const64 [15])) (Const64 [16-log2(c)]))) (Const64 [log2(c)])) for { + t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd64 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 { - break - } - t := v_0_0.Type - d := v_0_0.AuxInt + n := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.Type != t { + if v_1.Op != OpConst16 { break } c := v_1.AuxInt - v.reset(OpAdd64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c + d + if !(isPowerOfTwo(c)) { + break + } + v.reset(OpRsh16x64) + v0 := b.NewValue0(v.Pos, OpAdd16, t) + v0.AddArg(n) + v1 := b.NewValue0(v.Pos, OpRsh16Ux64, t) + v2 := b.NewValue0(v.Pos, OpRsh16x64, t) + v2.AddArg(n) + v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v3.AuxInt = 15 + v2.AddArg(v3) + v1.AddArg(v2) + v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v4.AuxInt = 16 - log2(c) + v1.AddArg(v4) + v0.AddArg(v1) v.AddArg(v0) - v.AddArg(x) + v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v5.AuxInt = log2(c) + v.AddArg(v5) return true } - // match: (Add64 (Add64 x (Const64 [d])) (Const64 [c])) - // result: (Add64 (Const64 [c+d]) x) + // match: (Div16 x (Const16 [c])) + // cond: smagicOK(16,c) + // result: (Sub16 (Rsh32x64 (Mul32 (Const32 [int64(smagic(16,c).m)]) (SignExt16to32 x)) (Const64 [16+smagic(16,c).s])) (Rsh32x64 (SignExt16to32 x) (Const64 [31]))) for { + t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd64 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - t := v_0_1.Type - d := v_0_1.AuxInt + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.Type != t { + if v_1.Op != OpConst16 { break } c := v_1.AuxInt - v.reset(OpAdd64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c + d + if !(smagicOK(16, c)) { + break + } + v.reset(OpSub16) + v.Type = t + v0 := b.NewValue0(v.Pos, OpRsh32x64, t) + v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) + v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v2.AuxInt = int64(smagic(16, c).m) + v1.AddArg(v2) + v3 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) + v3.AddArg(x) + v1.AddArg(v3) + v0.AddArg(v1) + v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v4.AuxInt = 16 + smagic(16, c).s + v0.AddArg(v4) v.AddArg(v0) - v.AddArg(x) + v5 := b.NewValue0(v.Pos, OpRsh32x64, t) + v6 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) + v6.AddArg(x) + v5.AddArg(v6) + v7 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v7.AuxInt = 31 + v5.AddArg(v7) + v.AddArg(v5) return true } - // match: (Add64 (Const64 [c]) (Sub64 (Const64 [d]) x)) - // result: (Sub64 (Const64 [c+d]) x) + return false +} +func rewriteValuegeneric_OpDiv16u_0(v *Value) bool { + b := v.Block + config := b.Func.Config + typ := &b.Func.Config.Types + // match: (Div16u (Const16 [c]) (Const16 [d])) + // cond: d != 0 + // result: (Const16 [int64(int16(uint16(c)/uint16(d)))]) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst64 { + if v_0.Op != OpConst16 { break } - t := v_0.Type c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpSub64 { + if v_1.Op != OpConst16 { break } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst64 || v_1_0.Type != t { + d := v_1.AuxInt + if !(d != 0) { break } - d := v_1_0.AuxInt - v.reset(OpSub64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c + d - v.AddArg(v0) - v.AddArg(x) + v.reset(OpConst16) + v.AuxInt = int64(int16(uint16(c) / uint16(d))) return true } - // match: (Add64 (Sub64 (Const64 [d]) x) (Const64 [c])) - // result: (Sub64 (Const64 [c+d]) x) + // match: (Div16u n (Const16 [c])) + // cond: isPowerOfTwo(c&0xffff) + // result: (Rsh16Ux64 n (Const64 [log2(c&0xffff)])) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpSub64 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 { - break - } - t := v_0_0.Type - d := v_0_0.AuxInt + n := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.Type != t { + if v_1.Op != OpConst16 { break } c := v_1.AuxInt - v.reset(OpSub64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c + d + if !(isPowerOfTwo(c & 0xffff)) { + break + } + v.reset(OpRsh16Ux64) + v.AddArg(n) + v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v0.AuxInt = log2(c & 0xffff) v.AddArg(v0) - v.AddArg(x) return true } - // match: (Add64 (Const64 [c]) (Sub64 x (Const64 [d]))) - // result: (Add64 (Const64 [c-d]) x) + // match: (Div16u x (Const16 [c])) + // cond: umagicOK(16, c) && config.RegSize == 8 + // result: (Trunc64to16 (Rsh64Ux64 (Mul64 (Const64 [int64(1<<16+umagic(16,c).m)]) (ZeroExt16to64 x)) (Const64 [16+umagic(16,c).s]))) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - t := v_0.Type - c := v_0.AuxInt + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpSub64 { + if v_1.Op != OpConst16 { break } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != t { + c := v_1.AuxInt + if !(umagicOK(16, c) && config.RegSize == 8) { break } - d := v_1_1.AuxInt - v.reset(OpAdd64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c - d + v.reset(OpTrunc64to16) + v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) + v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) + v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v2.AuxInt = int64(1<<16 + umagic(16, c).m) + v1.AddArg(v2) + v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) + v3.AddArg(x) + v1.AddArg(v3) + v0.AddArg(v1) + v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v4.AuxInt = 16 + umagic(16, c).s + v0.AddArg(v4) v.AddArg(v0) - v.AddArg(x) return true } - // match: (Add64 (Sub64 x (Const64 [d])) (Const64 [c])) - // result: (Add64 (Const64 [c-d]) x) + // match: (Div16u x (Const16 [c])) + // cond: umagicOK(16, c) && config.RegSize == 4 && umagic(16,c).m&1 == 0 + // result: (Trunc32to16 (Rsh32Ux64 (Mul32 (Const32 [int64(1<<15+umagic(16,c).m/2)]) (ZeroExt16to32 x)) (Const64 [16+umagic(16,c).s-1]))) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpSub64 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - t := v_0_1.Type - d := v_0_1.AuxInt + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.Type != t { + if v_1.Op != OpConst16 { break } c := v_1.AuxInt - v.reset(OpAdd64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c - d - v.AddArg(v0) - v.AddArg(x) + if !(umagicOK(16, c) && config.RegSize == 4 && umagic(16, c).m&1 == 0) { + break + } + v.reset(OpTrunc32to16) + v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) + v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) + v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v2.AuxInt = int64(1<<15 + umagic(16, c).m/2) + v1.AddArg(v2) + v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) + v3.AddArg(x) + v1.AddArg(v3) + v0.AddArg(v1) + v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v4.AuxInt = 16 + umagic(16, c).s - 1 + v0.AddArg(v4) + v.AddArg(v0) return true } - return false -} -func rewriteValuegeneric_OpAdd64F_0(v *Value) bool { - // match: (Add64F (Const64F [c]) (Const64F [d])) - // result: (Const64F [auxFrom64F(auxTo64F(c) + auxTo64F(d))]) + // match: (Div16u x (Const16 [c])) + // cond: umagicOK(16, c) && config.RegSize == 4 && c&1 == 0 + // result: (Trunc32to16 (Rsh32Ux64 (Mul32 (Const32 [int64(1<<15+(umagic(16,c).m+1)/2)]) (Rsh32Ux64 (ZeroExt16to32 x) (Const64 [1]))) (Const64 [16+umagic(16,c).s-2]))) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64F { + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst16 { break } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64F { + c := v_1.AuxInt + if !(umagicOK(16, c) && config.RegSize == 4 && c&1 == 0) { break } - d := v_1.AuxInt - v.reset(OpConst64F) - v.AuxInt = auxFrom64F(auxTo64F(c) + auxTo64F(d)) + v.reset(OpTrunc32to16) + v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) + v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) + v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v2.AuxInt = int64(1<<15 + (umagic(16, c).m+1)/2) + v1.AddArg(v2) + v3 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) + v4 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) + v4.AddArg(x) + v3.AddArg(v4) + v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v5.AuxInt = 1 + v3.AddArg(v5) + v1.AddArg(v3) + v0.AddArg(v1) + v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v6.AuxInt = 16 + umagic(16, c).s - 2 + v0.AddArg(v6) + v.AddArg(v0) return true } - // match: (Add64F (Const64F [d]) (Const64F [c])) - // result: (Const64F [auxFrom64F(auxTo64F(c) + auxTo64F(d))]) + // match: (Div16u x (Const16 [c])) + // cond: umagicOK(16, c) && config.RegSize == 4 && config.useAvg + // result: (Trunc32to16 (Rsh32Ux64 (Avg32u (Lsh32x64 (ZeroExt16to32 x) (Const64 [16])) (Mul32 (Const32 [int64(umagic(16,c).m)]) (ZeroExt16to32 x))) (Const64 [16+umagic(16,c).s-1]))) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64F { - break - } - d := v_0.AuxInt + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpConst64F { + if v_1.Op != OpConst16 { break } c := v_1.AuxInt - v.reset(OpConst64F) - v.AuxInt = auxFrom64F(auxTo64F(c) + auxTo64F(d)) + if !(umagicOK(16, c) && config.RegSize == 4 && config.useAvg) { + break + } + v.reset(OpTrunc32to16) + v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) + v1 := b.NewValue0(v.Pos, OpAvg32u, typ.UInt32) + v2 := b.NewValue0(v.Pos, OpLsh32x64, typ.UInt32) + v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) + v3.AddArg(x) + v2.AddArg(v3) + v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v4.AuxInt = 16 + v2.AddArg(v4) + v1.AddArg(v2) + v5 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) + v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v6.AuxInt = int64(umagic(16, c).m) + v5.AddArg(v6) + v7 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) + v7.AddArg(x) + v5.AddArg(v7) + v1.AddArg(v5) + v0.AddArg(v1) + v8 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v8.AuxInt = 16 + umagic(16, c).s - 1 + v0.AddArg(v8) + v.AddArg(v0) return true } return false } -func rewriteValuegeneric_OpAdd8_0(v *Value) bool { +func rewriteValuegeneric_OpDiv32_0(v *Value) bool { b := v.Block - // match: (Add8 (Const8 [c]) (Const8 [d])) - // result: (Const8 [int64(int8(c+d))]) + config := b.Func.Config + typ := &b.Func.Config.Types + // match: (Div32 (Const32 [c]) (Const32 [d])) + // cond: d != 0 + // result: (Const32 [int64(int32(c)/int32(d))]) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst8 { + if v_0.Op != OpConst32 { break } c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpConst8 { + if v_1.Op != OpConst32 { break } d := v_1.AuxInt - v.reset(OpConst8) - v.AuxInt = int64(int8(c + d)) - return true - } - // match: (Add8 (Const8 [d]) (Const8 [c])) - // result: (Const8 [int64(int8(c+d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 { + if !(d != 0) { break } - c := v_1.AuxInt - v.reset(OpConst8) - v.AuxInt = int64(int8(c + d)) + v.reset(OpConst32) + v.AuxInt = int64(int32(c) / int32(d)) return true } - // match: (Add8 (Mul8 x y) (Mul8 x z)) - // result: (Mul8 x (Add8 y z)) + // match: (Div32 n (Const32 [c])) + // cond: isNonNegative(n) && isPowerOfTwo(c&0xffffffff) + // result: (Rsh32Ux64 n (Const64 [log2(c&0xffffffff)])) for { - t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul8 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] + n := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpMul8 { + if v_1.Op != OpConst32 { break } - z := v_1.Args[1] - if x != v_1.Args[0] { + c := v_1.AuxInt + if !(isNonNegative(n) && isPowerOfTwo(c&0xffffffff)) { break } - v.reset(OpMul8) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd8, t) - v0.AddArg(y) - v0.AddArg(z) + v.reset(OpRsh32Ux64) + v.AddArg(n) + v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v0.AuxInt = log2(c & 0xffffffff) v.AddArg(v0) return true } - // match: (Add8 (Mul8 y x) (Mul8 x z)) - // result: (Mul8 x (Add8 y z)) + // match: (Div32 n (Const32 [c])) + // cond: c < 0 && c != -1<<31 + // result: (Neg32 (Div32 n (Const32 [-c]))) for { t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul8 { - break - } - x := v_0.Args[1] - y := v_0.Args[0] + n := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpMul8 { + if v_1.Op != OpConst32 { break } - z := v_1.Args[1] - if x != v_1.Args[0] { + c := v_1.AuxInt + if !(c < 0 && c != -1<<31) { break } - v.reset(OpMul8) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd8, t) - v0.AddArg(y) - v0.AddArg(z) + v.reset(OpNeg32) + v0 := b.NewValue0(v.Pos, OpDiv32, t) + v0.AddArg(n) + v1 := b.NewValue0(v.Pos, OpConst32, t) + v1.AuxInt = -c + v0.AddArg(v1) v.AddArg(v0) return true } - // match: (Add8 (Mul8 x y) (Mul8 z x)) - // result: (Mul8 x (Add8 y z)) + // match: (Div32 x (Const32 [-1<<31])) + // result: (Rsh32Ux64 (And32 x (Neg32 x)) (Const64 [31])) for { t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul8 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpMul8 { - break - } - _ = v_1.Args[1] - z := v_1.Args[0] - if x != v_1.Args[1] { + if v_1.Op != OpConst32 || v_1.AuxInt != -1<<31 { break } - v.reset(OpMul8) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd8, t) - v0.AddArg(y) - v0.AddArg(z) + v.reset(OpRsh32Ux64) + v0 := b.NewValue0(v.Pos, OpAnd32, t) + v0.AddArg(x) + v1 := b.NewValue0(v.Pos, OpNeg32, t) + v1.AddArg(x) + v0.AddArg(v1) v.AddArg(v0) + v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v2.AuxInt = 31 + v.AddArg(v2) return true } - // match: (Add8 (Mul8 y x) (Mul8 z x)) - // result: (Mul8 x (Add8 y z)) + // match: (Div32 n (Const32 [c])) + // cond: isPowerOfTwo(c) + // result: (Rsh32x64 (Add32 n (Rsh32Ux64 (Rsh32x64 n (Const64 [31])) (Const64 [32-log2(c)]))) (Const64 [log2(c)])) for { t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul8 { - break - } - x := v_0.Args[1] - y := v_0.Args[0] + n := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpMul8 { + if v_1.Op != OpConst32 { break } - _ = v_1.Args[1] - z := v_1.Args[0] - if x != v_1.Args[1] { + c := v_1.AuxInt + if !(isPowerOfTwo(c)) { break } - v.reset(OpMul8) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd8, t) - v0.AddArg(y) - v0.AddArg(z) + v.reset(OpRsh32x64) + v0 := b.NewValue0(v.Pos, OpAdd32, t) + v0.AddArg(n) + v1 := b.NewValue0(v.Pos, OpRsh32Ux64, t) + v2 := b.NewValue0(v.Pos, OpRsh32x64, t) + v2.AddArg(n) + v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v3.AuxInt = 31 + v2.AddArg(v3) + v1.AddArg(v2) + v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v4.AuxInt = 32 - log2(c) + v1.AddArg(v4) + v0.AddArg(v1) v.AddArg(v0) + v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v5.AuxInt = log2(c) + v.AddArg(v5) return true } - // match: (Add8 (Mul8 x z) (Mul8 x y)) - // result: (Mul8 x (Add8 y z)) + // match: (Div32 x (Const32 [c])) + // cond: smagicOK(32,c) && config.RegSize == 8 + // result: (Sub32 (Rsh64x64 (Mul64 (Const64 [int64(smagic(32,c).m)]) (SignExt32to64 x)) (Const64 [32+smagic(32,c).s])) (Rsh64x64 (SignExt32to64 x) (Const64 [63]))) for { t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul8 { - break - } - z := v_0.Args[1] - x := v_0.Args[0] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpMul8 { + if v_1.Op != OpConst32 { break } - y := v_1.Args[1] - if x != v_1.Args[0] { + c := v_1.AuxInt + if !(smagicOK(32, c) && config.RegSize == 8) { break } - v.reset(OpMul8) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd8, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) - return true - } - // match: (Add8 (Mul8 z x) (Mul8 x y)) - // result: (Mul8 x (Add8 y z)) - for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul8 { - break - } - x := v_0.Args[1] - z := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul8 { - break - } - y := v_1.Args[1] - if x != v_1.Args[0] { - break - } - v.reset(OpMul8) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd8, t) - v0.AddArg(y) - v0.AddArg(z) + v.reset(OpSub32) + v.Type = t + v0 := b.NewValue0(v.Pos, OpRsh64x64, t) + v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) + v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v2.AuxInt = int64(smagic(32, c).m) + v1.AddArg(v2) + v3 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) + v3.AddArg(x) + v1.AddArg(v3) + v0.AddArg(v1) + v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v4.AuxInt = 32 + smagic(32, c).s + v0.AddArg(v4) v.AddArg(v0) + v5 := b.NewValue0(v.Pos, OpRsh64x64, t) + v6 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) + v6.AddArg(x) + v5.AddArg(v6) + v7 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v7.AuxInt = 63 + v5.AddArg(v7) + v.AddArg(v5) return true } - // match: (Add8 (Mul8 x z) (Mul8 y x)) - // result: (Mul8 x (Add8 y z)) + // match: (Div32 x (Const32 [c])) + // cond: smagicOK(32,c) && config.RegSize == 4 && smagic(32,c).m&1 == 0 && config.useHmul + // result: (Sub32 (Rsh32x64 (Hmul32 (Const32 [int64(int32(smagic(32,c).m/2))]) x) (Const64 [smagic(32,c).s-1])) (Rsh32x64 x (Const64 [31]))) for { t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul8 { - break - } - z := v_0.Args[1] - x := v_0.Args[0] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpMul8 { + if v_1.Op != OpConst32 { break } - _ = v_1.Args[1] - y := v_1.Args[0] - if x != v_1.Args[1] { + c := v_1.AuxInt + if !(smagicOK(32, c) && config.RegSize == 4 && smagic(32, c).m&1 == 0 && config.useHmul) { break } - v.reset(OpMul8) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd8, t) - v0.AddArg(y) - v0.AddArg(z) + v.reset(OpSub32) + v.Type = t + v0 := b.NewValue0(v.Pos, OpRsh32x64, t) + v1 := b.NewValue0(v.Pos, OpHmul32, t) + v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v2.AuxInt = int64(int32(smagic(32, c).m / 2)) + v1.AddArg(v2) + v1.AddArg(x) + v0.AddArg(v1) + v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v3.AuxInt = smagic(32, c).s - 1 + v0.AddArg(v3) v.AddArg(v0) + v4 := b.NewValue0(v.Pos, OpRsh32x64, t) + v4.AddArg(x) + v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v5.AuxInt = 31 + v4.AddArg(v5) + v.AddArg(v4) return true } - // match: (Add8 (Mul8 z x) (Mul8 y x)) - // result: (Mul8 x (Add8 y z)) + // match: (Div32 x (Const32 [c])) + // cond: smagicOK(32,c) && config.RegSize == 4 && smagic(32,c).m&1 != 0 && config.useHmul + // result: (Sub32 (Rsh32x64 (Add32 (Hmul32 (Const32 [int64(int32(smagic(32,c).m))]) x) x) (Const64 [smagic(32,c).s])) (Rsh32x64 x (Const64 [31]))) for { t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul8 { - break - } - x := v_0.Args[1] - z := v_0.Args[0] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpMul8 { + if v_1.Op != OpConst32 { break } - _ = v_1.Args[1] - y := v_1.Args[0] - if x != v_1.Args[1] { + c := v_1.AuxInt + if !(smagicOK(32, c) && config.RegSize == 4 && smagic(32, c).m&1 != 0 && config.useHmul) { break } - v.reset(OpMul8) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpAdd8, t) - v0.AddArg(y) - v0.AddArg(z) + v.reset(OpSub32) + v.Type = t + v0 := b.NewValue0(v.Pos, OpRsh32x64, t) + v1 := b.NewValue0(v.Pos, OpAdd32, t) + v2 := b.NewValue0(v.Pos, OpHmul32, t) + v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v3.AuxInt = int64(int32(smagic(32, c).m)) + v2.AddArg(v3) + v2.AddArg(x) + v1.AddArg(v2) + v1.AddArg(x) + v0.AddArg(v1) + v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v4.AuxInt = smagic(32, c).s + v0.AddArg(v4) v.AddArg(v0) + v5 := b.NewValue0(v.Pos, OpRsh32x64, t) + v5.AddArg(x) + v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v6.AuxInt = 31 + v5.AddArg(v6) + v.AddArg(v5) return true } return false } -func rewriteValuegeneric_OpAdd8_10(v *Value) bool { +func rewriteValuegeneric_OpDiv32F_0(v *Value) bool { b := v.Block - // match: (Add8 (Const8 [0]) x) - // result: x + // match: (Div32F (Const32F [c]) (Const32F [d])) + // result: (Const32F [auxFrom32F(auxTo32F(c) / auxTo32F(d))]) for { - x := v.Args[1] + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst8 || v_0.AuxInt != 0 { + if v_0.Op != OpConst32F { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Add8 x (Const8 [0])) - // result: x - for { - _ = v.Args[1] - x := v.Args[0] + c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.AuxInt != 0 { + if v_1.Op != OpConst32F { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + d := v_1.AuxInt + v.reset(OpConst32F) + v.AuxInt = auxFrom32F(auxTo32F(c) / auxTo32F(d)) return true } - // match: (Add8 (Const8 [1]) (Com8 x)) - // result: (Neg8 x) + // match: (Div32F x (Const32F [c])) + // cond: reciprocalExact32(auxTo32F(c)) + // result: (Mul32F x (Const32F [auxFrom32F(1/auxTo32F(c))])) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 || v_0.AuxInt != 1 { + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst32F { break } - v_1 := v.Args[1] - if v_1.Op != OpCom8 { + t := v_1.Type + c := v_1.AuxInt + if !(reciprocalExact32(auxTo32F(c))) { break } - x := v_1.Args[0] - v.reset(OpNeg8) + v.reset(OpMul32F) v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst32F, t) + v0.AuxInt = auxFrom32F(1 / auxTo32F(c)) + v.AddArg(v0) return true } - // match: (Add8 (Com8 x) (Const8 [1])) - // result: (Neg8 x) + return false +} +func rewriteValuegeneric_OpDiv32u_0(v *Value) bool { + b := v.Block + config := b.Func.Config + typ := &b.Func.Config.Types + // match: (Div32u (Const32 [c]) (Const32 [d])) + // cond: d != 0 + // result: (Const32 [int64(int32(uint32(c)/uint32(d)))]) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpCom8 { + if v_0.Op != OpConst32 { break } - x := v_0.Args[0] + c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.AuxInt != 1 { + if v_1.Op != OpConst32 { break } - v.reset(OpNeg8) - v.AddArg(x) + d := v_1.AuxInt + if !(d != 0) { + break + } + v.reset(OpConst32) + v.AuxInt = int64(int32(uint32(c) / uint32(d))) return true } - // match: (Add8 (Add8 i:(Const8 ) z) x) - // cond: (z.Op != OpConst8 && x.Op != OpConst8) - // result: (Add8 i (Add8 z x)) + // match: (Div32u n (Const32 [c])) + // cond: isPowerOfTwo(c&0xffffffff) + // result: (Rsh32Ux64 n (Const64 [log2(c&0xffffffff)])) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd8 { - break - } - z := v_0.Args[1] - i := v_0.Args[0] - if i.Op != OpConst8 { + _ = v.Args[1] + n := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst32 { break } - t := i.Type - if !(z.Op != OpConst8 && x.Op != OpConst8) { + c := v_1.AuxInt + if !(isPowerOfTwo(c & 0xffffffff)) { break } - v.reset(OpAdd8) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAdd8, t) - v0.AddArg(z) - v0.AddArg(x) + v.reset(OpRsh32Ux64) + v.AddArg(n) + v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v0.AuxInt = log2(c & 0xffffffff) v.AddArg(v0) return true } - // match: (Add8 (Add8 z i:(Const8 )) x) - // cond: (z.Op != OpConst8 && x.Op != OpConst8) - // result: (Add8 i (Add8 z x)) + // match: (Div32u x (Const32 [c])) + // cond: umagicOK(32, c) && config.RegSize == 4 && umagic(32,c).m&1 == 0 && config.useHmul + // result: (Rsh32Ux64 (Hmul32u (Const32 [int64(int32(1<<31+umagic(32,c).m/2))]) x) (Const64 [umagic(32,c).s-1])) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd8 { - break - } - _ = v_0.Args[1] - z := v_0.Args[0] - i := v_0.Args[1] - if i.Op != OpConst8 { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst32 { break } - t := i.Type - if !(z.Op != OpConst8 && x.Op != OpConst8) { + c := v_1.AuxInt + if !(umagicOK(32, c) && config.RegSize == 4 && umagic(32, c).m&1 == 0 && config.useHmul) { break } - v.reset(OpAdd8) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAdd8, t) - v0.AddArg(z) + v.reset(OpRsh32Ux64) + v.Type = typ.UInt32 + v0 := b.NewValue0(v.Pos, OpHmul32u, typ.UInt32) + v1 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v1.AuxInt = int64(int32(1<<31 + umagic(32, c).m/2)) + v0.AddArg(v1) v0.AddArg(x) v.AddArg(v0) + v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v2.AuxInt = umagic(32, c).s - 1 + v.AddArg(v2) return true } - // match: (Add8 x (Add8 i:(Const8 ) z)) - // cond: (z.Op != OpConst8 && x.Op != OpConst8) - // result: (Add8 i (Add8 z x)) + // match: (Div32u x (Const32 [c])) + // cond: umagicOK(32, c) && config.RegSize == 4 && c&1 == 0 && config.useHmul + // result: (Rsh32Ux64 (Hmul32u (Const32 [int64(int32(1<<31+(umagic(32,c).m+1)/2))]) (Rsh32Ux64 x (Const64 [1]))) (Const64 [umagic(32,c).s-2])) for { _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAdd8 { - break - } - z := v_1.Args[1] - i := v_1.Args[0] - if i.Op != OpConst8 { + if v_1.Op != OpConst32 { break } - t := i.Type - if !(z.Op != OpConst8 && x.Op != OpConst8) { + c := v_1.AuxInt + if !(umagicOK(32, c) && config.RegSize == 4 && c&1 == 0 && config.useHmul) { break } - v.reset(OpAdd8) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAdd8, t) - v0.AddArg(z) - v0.AddArg(x) + v.reset(OpRsh32Ux64) + v.Type = typ.UInt32 + v0 := b.NewValue0(v.Pos, OpHmul32u, typ.UInt32) + v1 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v1.AuxInt = int64(int32(1<<31 + (umagic(32, c).m+1)/2)) + v0.AddArg(v1) + v2 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) + v2.AddArg(x) + v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v3.AuxInt = 1 + v2.AddArg(v3) + v0.AddArg(v2) v.AddArg(v0) + v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v4.AuxInt = umagic(32, c).s - 2 + v.AddArg(v4) return true } - // match: (Add8 x (Add8 z i:(Const8 ))) - // cond: (z.Op != OpConst8 && x.Op != OpConst8) - // result: (Add8 i (Add8 z x)) + // match: (Div32u x (Const32 [c])) + // cond: umagicOK(32, c) && config.RegSize == 4 && config.useAvg && config.useHmul + // result: (Rsh32Ux64 (Avg32u x (Hmul32u (Const32 [int64(int32(umagic(32,c).m))]) x)) (Const64 [umagic(32,c).s-1])) for { _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAdd8 { - break - } - _ = v_1.Args[1] - z := v_1.Args[0] - i := v_1.Args[1] - if i.Op != OpConst8 { - break - } - t := i.Type - if !(z.Op != OpConst8 && x.Op != OpConst8) { - break - } - v.reset(OpAdd8) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAdd8, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (Add8 (Sub8 i:(Const8 ) z) x) - // cond: (z.Op != OpConst8 && x.Op != OpConst8) - // result: (Add8 i (Sub8 x z)) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpSub8 { - break - } - z := v_0.Args[1] - i := v_0.Args[0] - if i.Op != OpConst8 { + if v_1.Op != OpConst32 { break } - t := i.Type - if !(z.Op != OpConst8 && x.Op != OpConst8) { + c := v_1.AuxInt + if !(umagicOK(32, c) && config.RegSize == 4 && config.useAvg && config.useHmul) { break } - v.reset(OpAdd8) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpSub8, t) + v.reset(OpRsh32Ux64) + v.Type = typ.UInt32 + v0 := b.NewValue0(v.Pos, OpAvg32u, typ.UInt32) v0.AddArg(x) - v0.AddArg(z) + v1 := b.NewValue0(v.Pos, OpHmul32u, typ.UInt32) + v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v2.AuxInt = int64(int32(umagic(32, c).m)) + v1.AddArg(v2) + v1.AddArg(x) + v0.AddArg(v1) v.AddArg(v0) + v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v3.AuxInt = umagic(32, c).s - 1 + v.AddArg(v3) return true } - // match: (Add8 x (Sub8 i:(Const8 ) z)) - // cond: (z.Op != OpConst8 && x.Op != OpConst8) - // result: (Add8 i (Sub8 x z)) + // match: (Div32u x (Const32 [c])) + // cond: umagicOK(32, c) && config.RegSize == 8 && umagic(32,c).m&1 == 0 + // result: (Trunc64to32 (Rsh64Ux64 (Mul64 (Const64 [int64(1<<31+umagic(32,c).m/2)]) (ZeroExt32to64 x)) (Const64 [32+umagic(32,c).s-1]))) for { _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpSub8 { - break - } - z := v_1.Args[1] - i := v_1.Args[0] - if i.Op != OpConst8 { + if v_1.Op != OpConst32 { break } - t := i.Type - if !(z.Op != OpConst8 && x.Op != OpConst8) { + c := v_1.AuxInt + if !(umagicOK(32, c) && config.RegSize == 8 && umagic(32, c).m&1 == 0) { break } - v.reset(OpAdd8) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpSub8, t) - v0.AddArg(x) - v0.AddArg(z) + v.reset(OpTrunc64to32) + v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) + v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) + v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v2.AuxInt = int64(1<<31 + umagic(32, c).m/2) + v1.AddArg(v2) + v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) + v3.AddArg(x) + v1.AddArg(v3) + v0.AddArg(v1) + v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v4.AuxInt = 32 + umagic(32, c).s - 1 + v0.AddArg(v4) v.AddArg(v0) return true } - return false -} -func rewriteValuegeneric_OpAdd8_20(v *Value) bool { - b := v.Block - // match: (Add8 (Sub8 z i:(Const8 )) x) - // cond: (z.Op != OpConst8 && x.Op != OpConst8) - // result: (Sub8 (Add8 x z) i) + // match: (Div32u x (Const32 [c])) + // cond: umagicOK(32, c) && config.RegSize == 8 && c&1 == 0 + // result: (Trunc64to32 (Rsh64Ux64 (Mul64 (Const64 [int64(1<<31+(umagic(32,c).m+1)/2)]) (Rsh64Ux64 (ZeroExt32to64 x) (Const64 [1]))) (Const64 [32+umagic(32,c).s-2]))) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpSub8 { - break - } - _ = v_0.Args[1] - z := v_0.Args[0] - i := v_0.Args[1] - if i.Op != OpConst8 { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst32 { break } - t := i.Type - if !(z.Op != OpConst8 && x.Op != OpConst8) { + c := v_1.AuxInt + if !(umagicOK(32, c) && config.RegSize == 8 && c&1 == 0) { break } - v.reset(OpSub8) - v0 := b.NewValue0(v.Pos, OpAdd8, t) - v0.AddArg(x) - v0.AddArg(z) + v.reset(OpTrunc64to32) + v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) + v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) + v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v2.AuxInt = int64(1<<31 + (umagic(32, c).m+1)/2) + v1.AddArg(v2) + v3 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) + v4 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) + v4.AddArg(x) + v3.AddArg(v4) + v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v5.AuxInt = 1 + v3.AddArg(v5) + v1.AddArg(v3) + v0.AddArg(v1) + v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v6.AuxInt = 32 + umagic(32, c).s - 2 + v0.AddArg(v6) v.AddArg(v0) - v.AddArg(i) return true } - // match: (Add8 x (Sub8 z i:(Const8 ))) - // cond: (z.Op != OpConst8 && x.Op != OpConst8) - // result: (Sub8 (Add8 x z) i) + // match: (Div32u x (Const32 [c])) + // cond: umagicOK(32, c) && config.RegSize == 8 && config.useAvg + // result: (Trunc64to32 (Rsh64Ux64 (Avg64u (Lsh64x64 (ZeroExt32to64 x) (Const64 [32])) (Mul64 (Const64 [int64(umagic(32,c).m)]) (ZeroExt32to64 x))) (Const64 [32+umagic(32,c).s-1]))) for { _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpSub8 { - break - } - _ = v_1.Args[1] - z := v_1.Args[0] - i := v_1.Args[1] - if i.Op != OpConst8 { + if v_1.Op != OpConst32 { break } - t := i.Type - if !(z.Op != OpConst8 && x.Op != OpConst8) { + c := v_1.AuxInt + if !(umagicOK(32, c) && config.RegSize == 8 && config.useAvg) { break } - v.reset(OpSub8) - v0 := b.NewValue0(v.Pos, OpAdd8, t) - v0.AddArg(x) - v0.AddArg(z) + v.reset(OpTrunc64to32) + v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) + v1 := b.NewValue0(v.Pos, OpAvg64u, typ.UInt64) + v2 := b.NewValue0(v.Pos, OpLsh64x64, typ.UInt64) + v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) + v3.AddArg(x) + v2.AddArg(v3) + v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v4.AuxInt = 32 + v2.AddArg(v4) + v1.AddArg(v2) + v5 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) + v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt32) + v6.AuxInt = int64(umagic(32, c).m) + v5.AddArg(v6) + v7 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) + v7.AddArg(x) + v5.AddArg(v7) + v1.AddArg(v5) + v0.AddArg(v1) + v8 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v8.AuxInt = 32 + umagic(32, c).s - 1 + v0.AddArg(v8) v.AddArg(v0) - v.AddArg(i) return true } - // match: (Add8 (Const8 [c]) (Add8 (Const8 [d]) x)) - // result: (Add8 (Const8 [int64(int8(c+d))]) x) + return false +} +func rewriteValuegeneric_OpDiv64_0(v *Value) bool { + b := v.Block + config := b.Func.Config + typ := &b.Func.Config.Types + // match: (Div64 (Const64 [c]) (Const64 [d])) + // cond: d != 0 + // result: (Const64 [c/d]) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst8 { + if v_0.Op != OpConst64 { break } - t := v_0.Type c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpAdd8 { + if v_1.Op != OpConst64 { break } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst8 || v_1_0.Type != t { + d := v_1.AuxInt + if !(d != 0) { break } - d := v_1_0.AuxInt - v.reset(OpAdd8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c + d)) - v.AddArg(v0) - v.AddArg(x) + v.reset(OpConst64) + v.AuxInt = c / d return true } - // match: (Add8 (Const8 [c]) (Add8 x (Const8 [d]))) - // result: (Add8 (Const8 [int64(int8(c+d))]) x) + // match: (Div64 n (Const64 [c])) + // cond: isNonNegative(n) && isPowerOfTwo(c) + // result: (Rsh64Ux64 n (Const64 [log2(c)])) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - t := v_0.Type - c := v_0.AuxInt + n := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAdd8 { + if v_1.Op != OpConst64 { break } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst8 || v_1_1.Type != t { + c := v_1.AuxInt + if !(isNonNegative(n) && isPowerOfTwo(c)) { break } - d := v_1_1.AuxInt - v.reset(OpAdd8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c + d)) + v.reset(OpRsh64Ux64) + v.AddArg(n) + v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v0.AuxInt = log2(c) v.AddArg(v0) - v.AddArg(x) return true } - // match: (Add8 (Add8 (Const8 [d]) x) (Const8 [c])) - // result: (Add8 (Const8 [int64(int8(c+d))]) x) + // match: (Div64 n (Const64 [-1<<63])) + // cond: isNonNegative(n) + // result: (Const64 [0]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd8 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst8 { - break - } - t := v_0_0.Type - d := v_0_0.AuxInt + n := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.Type != t { + if v_1.Op != OpConst64 || v_1.AuxInt != -1<<63 || !(isNonNegative(n)) { break } - c := v_1.AuxInt - v.reset(OpAdd8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c + d)) - v.AddArg(v0) - v.AddArg(x) + v.reset(OpConst64) + v.AuxInt = 0 return true } - // match: (Add8 (Add8 x (Const8 [d])) (Const8 [c])) - // result: (Add8 (Const8 [int64(int8(c+d))]) x) + // match: (Div64 n (Const64 [c])) + // cond: c < 0 && c != -1<<63 + // result: (Neg64 (Div64 n (Const64 [-c]))) for { + t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd8 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst8 { - break - } - t := v_0_1.Type - d := v_0_1.AuxInt + n := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.Type != t { + if v_1.Op != OpConst64 { break } c := v_1.AuxInt - v.reset(OpAdd8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c + d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Add8 (Const8 [c]) (Sub8 (Const8 [d]) x)) - // result: (Sub8 (Const8 [int64(int8(c+d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpSub8 { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst8 || v_1_0.Type != t { + if !(c < 0 && c != -1<<63) { break } - d := v_1_0.AuxInt - v.reset(OpSub8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c + d)) + v.reset(OpNeg64) + v0 := b.NewValue0(v.Pos, OpDiv64, t) + v0.AddArg(n) + v1 := b.NewValue0(v.Pos, OpConst64, t) + v1.AuxInt = -c + v0.AddArg(v1) v.AddArg(v0) - v.AddArg(x) return true } - // match: (Add8 (Sub8 (Const8 [d]) x) (Const8 [c])) - // result: (Sub8 (Const8 [int64(int8(c+d))]) x) + // match: (Div64 x (Const64 [-1<<63])) + // result: (Rsh64Ux64 (And64 x (Neg64 x)) (Const64 [63])) for { + t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpSub8 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst8 { - break - } - t := v_0_0.Type - d := v_0_0.AuxInt + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.Type != t { + if v_1.Op != OpConst64 || v_1.AuxInt != -1<<63 { break } - c := v_1.AuxInt - v.reset(OpSub8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c + d)) + v.reset(OpRsh64Ux64) + v0 := b.NewValue0(v.Pos, OpAnd64, t) + v0.AddArg(x) + v1 := b.NewValue0(v.Pos, OpNeg64, t) + v1.AddArg(x) + v0.AddArg(v1) v.AddArg(v0) - v.AddArg(x) + v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v2.AuxInt = 63 + v.AddArg(v2) return true } - // match: (Add8 (Const8 [c]) (Sub8 x (Const8 [d]))) - // result: (Add8 (Const8 [int64(int8(c-d))]) x) + // match: (Div64 n (Const64 [c])) + // cond: isPowerOfTwo(c) + // result: (Rsh64x64 (Add64 n (Rsh64Ux64 (Rsh64x64 n (Const64 [63])) (Const64 [64-log2(c)]))) (Const64 [log2(c)])) for { + t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - t := v_0.Type - c := v_0.AuxInt + n := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpSub8 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst8 || v_1_1.Type != t { - break - } - d := v_1_1.AuxInt - v.reset(OpAdd8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c - d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Add8 (Sub8 x (Const8 [d])) (Const8 [c])) - // result: (Add8 (Const8 [int64(int8(c-d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpSub8 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst8 { + if v_1.Op != OpConst64 { break } - t := v_0_1.Type - d := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.Type != t { + c := v_1.AuxInt + if !(isPowerOfTwo(c)) { break } - c := v_1.AuxInt - v.reset(OpAdd8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c - d)) + v.reset(OpRsh64x64) + v0 := b.NewValue0(v.Pos, OpAdd64, t) + v0.AddArg(n) + v1 := b.NewValue0(v.Pos, OpRsh64Ux64, t) + v2 := b.NewValue0(v.Pos, OpRsh64x64, t) + v2.AddArg(n) + v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v3.AuxInt = 63 + v2.AddArg(v3) + v1.AddArg(v2) + v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v4.AuxInt = 64 - log2(c) + v1.AddArg(v4) + v0.AddArg(v1) v.AddArg(v0) - v.AddArg(x) + v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v5.AuxInt = log2(c) + v.AddArg(v5) return true } - return false -} -func rewriteValuegeneric_OpAddPtr_0(v *Value) bool { - // match: (AddPtr x (Const64 [c])) - // result: (OffPtr x [c]) + // match: (Div64 x (Const64 [c])) + // cond: smagicOK(64,c) && smagic(64,c).m&1 == 0 && config.useHmul + // result: (Sub64 (Rsh64x64 (Hmul64 (Const64 [int64(smagic(64,c).m/2)]) x) (Const64 [smagic(64,c).s-1])) (Rsh64x64 x (Const64 [63]))) for { t := v.Type _ = v.Args[1] @@ -3623,3385 +4198,5322 @@ func rewriteValuegeneric_OpAddPtr_0(v *Value) bool { break } c := v_1.AuxInt - v.reset(OpOffPtr) + if !(smagicOK(64, c) && smagic(64, c).m&1 == 0 && config.useHmul) { + break + } + v.reset(OpSub64) v.Type = t - v.AuxInt = c - v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpRsh64x64, t) + v1 := b.NewValue0(v.Pos, OpHmul64, t) + v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v2.AuxInt = int64(smagic(64, c).m / 2) + v1.AddArg(v2) + v1.AddArg(x) + v0.AddArg(v1) + v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v3.AuxInt = smagic(64, c).s - 1 + v0.AddArg(v3) + v.AddArg(v0) + v4 := b.NewValue0(v.Pos, OpRsh64x64, t) + v4.AddArg(x) + v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v5.AuxInt = 63 + v4.AddArg(v5) + v.AddArg(v4) return true } - // match: (AddPtr x (Const32 [c])) - // result: (OffPtr x [c]) + // match: (Div64 x (Const64 [c])) + // cond: smagicOK(64,c) && smagic(64,c).m&1 != 0 && config.useHmul + // result: (Sub64 (Rsh64x64 (Add64 (Hmul64 (Const64 [int64(smagic(64,c).m)]) x) x) (Const64 [smagic(64,c).s])) (Rsh64x64 x (Const64 [63]))) for { t := v.Type _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpConst32 { + if v_1.Op != OpConst64 { break } c := v_1.AuxInt - v.reset(OpOffPtr) + if !(smagicOK(64, c) && smagic(64, c).m&1 != 0 && config.useHmul) { + break + } + v.reset(OpSub64) v.Type = t - v.AuxInt = c - v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpRsh64x64, t) + v1 := b.NewValue0(v.Pos, OpAdd64, t) + v2 := b.NewValue0(v.Pos, OpHmul64, t) + v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v3.AuxInt = int64(smagic(64, c).m) + v2.AddArg(v3) + v2.AddArg(x) + v1.AddArg(v2) + v1.AddArg(x) + v0.AddArg(v1) + v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v4.AuxInt = smagic(64, c).s + v0.AddArg(v4) + v.AddArg(v0) + v5 := b.NewValue0(v.Pos, OpRsh64x64, t) + v5.AddArg(x) + v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v6.AuxInt = 63 + v5.AddArg(v6) + v.AddArg(v5) return true } return false } -func rewriteValuegeneric_OpAnd16_0(v *Value) bool { - // match: (And16 (Const16 [c]) (Const16 [d])) - // result: (Const16 [int64(int16(c&d))]) +func rewriteValuegeneric_OpDiv64F_0(v *Value) bool { + b := v.Block + // match: (Div64F (Const64F [c]) (Const64F [d])) + // result: (Const64F [auxFrom64F(auxTo64F(c) / auxTo64F(d))]) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst16 { + if v_0.Op != OpConst64F { break } c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpConst16 { + if v_1.Op != OpConst64F { break } d := v_1.AuxInt - v.reset(OpConst16) - v.AuxInt = int64(int16(c & d)) + v.reset(OpConst64F) + v.AuxInt = auxFrom64F(auxTo64F(c) / auxTo64F(d)) return true } - // match: (And16 (Const16 [d]) (Const16 [c])) - // result: (Const16 [int64(int16(c&d))]) + // match: (Div64F x (Const64F [c])) + // cond: reciprocalExact64(auxTo64F(c)) + // result: (Mul64F x (Const64F [auxFrom64F(1/auxTo64F(c))])) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - d := v_0.AuxInt + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpConst16 { + if v_1.Op != OpConst64F { break } + t := v_1.Type c := v_1.AuxInt - v.reset(OpConst16) - v.AuxInt = int64(int16(c & d)) + if !(reciprocalExact64(auxTo64F(c))) { + break + } + v.reset(OpMul64F) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64F, t) + v0.AuxInt = auxFrom64F(1 / auxTo64F(c)) + v.AddArg(v0) return true } - // match: (And16 (Const16 [m]) (Rsh16Ux64 _ (Const64 [c]))) - // cond: c >= 64-ntz(m) - // result: (Const16 [0]) + return false +} +func rewriteValuegeneric_OpDiv64u_0(v *Value) bool { + b := v.Block + config := b.Func.Config + typ := &b.Func.Config.Types + // match: (Div64u (Const64 [c]) (Const64 [d])) + // cond: d != 0 + // result: (Const64 [int64(uint64(c)/uint64(d))]) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst16 { + if v_0.Op != OpConst64 { break } - m := v_0.AuxInt + c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpRsh16Ux64 { - break - } - _ = v_1.Args[1] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 { + if v_1.Op != OpConst64 { break } - c := v_1_1.AuxInt - if !(c >= 64-ntz(m)) { + d := v_1.AuxInt + if !(d != 0) { break } - v.reset(OpConst16) - v.AuxInt = 0 + v.reset(OpConst64) + v.AuxInt = int64(uint64(c) / uint64(d)) return true } - // match: (And16 (Rsh16Ux64 _ (Const64 [c])) (Const16 [m])) - // cond: c >= 64-ntz(m) - // result: (Const16 [0]) + // match: (Div64u n (Const64 [c])) + // cond: isPowerOfTwo(c) + // result: (Rsh64Ux64 n (Const64 [log2(c)])) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpRsh16Ux64 { - break - } - _ = v_0.Args[1] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt + n := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpConst16 { + if v_1.Op != OpConst64 { break } - m := v_1.AuxInt - if !(c >= 64-ntz(m)) { + c := v_1.AuxInt + if !(isPowerOfTwo(c)) { break } - v.reset(OpConst16) - v.AuxInt = 0 + v.reset(OpRsh64Ux64) + v.AddArg(n) + v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v0.AuxInt = log2(c) + v.AddArg(v0) return true } - // match: (And16 (Const16 [m]) (Lsh16x64 _ (Const64 [c]))) - // cond: c >= 64-nlz(m) - // result: (Const16 [0]) + // match: (Div64u n (Const64 [-1<<63])) + // result: (Rsh64Ux64 n (Const64 [63])) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - m := v_0.AuxInt + n := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpLsh16x64 { - break - } - _ = v_1.Args[1] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 { - break - } - c := v_1_1.AuxInt - if !(c >= 64-nlz(m)) { + if v_1.Op != OpConst64 || v_1.AuxInt != -1<<63 { break } - v.reset(OpConst16) - v.AuxInt = 0 + v.reset(OpRsh64Ux64) + v.AddArg(n) + v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v0.AuxInt = 63 + v.AddArg(v0) return true } - // match: (And16 (Lsh16x64 _ (Const64 [c])) (Const16 [m])) - // cond: c >= 64-nlz(m) - // result: (Const16 [0]) + // match: (Div64u x (Const64 [c])) + // cond: umagicOK(64, c) && config.RegSize == 8 && umagic(64,c).m&1 == 0 && config.useHmul + // result: (Rsh64Ux64 (Hmul64u (Const64 [int64(1<<63+umagic(64,c).m/2)]) x) (Const64 [umagic(64,c).s-1])) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh16x64 { - break - } - _ = v_0.Args[1] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpConst16 { + if v_1.Op != OpConst64 { break } - m := v_1.AuxInt - if !(c >= 64-nlz(m)) { + c := v_1.AuxInt + if !(umagicOK(64, c) && config.RegSize == 8 && umagic(64, c).m&1 == 0 && config.useHmul) { break } - v.reset(OpConst16) - v.AuxInt = 0 + v.reset(OpRsh64Ux64) + v.Type = typ.UInt64 + v0 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64) + v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v1.AuxInt = int64(1<<63 + umagic(64, c).m/2) + v0.AddArg(v1) + v0.AddArg(x) + v.AddArg(v0) + v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v2.AuxInt = umagic(64, c).s - 1 + v.AddArg(v2) return true } - // match: (And16 x x) - // result: x + // match: (Div64u x (Const64 [c])) + // cond: umagicOK(64, c) && config.RegSize == 8 && c&1 == 0 && config.useHmul + // result: (Rsh64Ux64 (Hmul64u (Const64 [int64(1<<63+(umagic(64,c).m+1)/2)]) (Rsh64Ux64 x (Const64 [1]))) (Const64 [umagic(64,c).s-2])) for { - x := v.Args[1] - if x != v.Args[0] { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (And16 (Const16 [-1]) x) - // result: x - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 || v_0.AuxInt != -1 { + c := v_1.AuxInt + if !(umagicOK(64, c) && config.RegSize == 8 && c&1 == 0 && config.useHmul) { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + v.reset(OpRsh64Ux64) + v.Type = typ.UInt64 + v0 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64) + v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v1.AuxInt = int64(1<<63 + (umagic(64, c).m+1)/2) + v0.AddArg(v1) + v2 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) + v2.AddArg(x) + v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v3.AuxInt = 1 + v2.AddArg(v3) + v0.AddArg(v2) + v.AddArg(v0) + v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v4.AuxInt = umagic(64, c).s - 2 + v.AddArg(v4) return true } - // match: (And16 x (Const16 [-1])) - // result: x + // match: (Div64u x (Const64 [c])) + // cond: umagicOK(64, c) && config.RegSize == 8 && config.useAvg && config.useHmul + // result: (Rsh64Ux64 (Avg64u x (Hmul64u (Const64 [int64(umagic(64,c).m)]) x)) (Const64 [umagic(64,c).s-1])) for { _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.AuxInt != -1 { + if v_1.Op != OpConst64 { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (And16 (Const16 [0]) _) - // result: (Const16 [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 || v_0.AuxInt != 0 { + c := v_1.AuxInt + if !(umagicOK(64, c) && config.RegSize == 8 && config.useAvg && config.useHmul) { break } - v.reset(OpConst16) - v.AuxInt = 0 + v.reset(OpRsh64Ux64) + v.Type = typ.UInt64 + v0 := b.NewValue0(v.Pos, OpAvg64u, typ.UInt64) + v0.AddArg(x) + v1 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64) + v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v2.AuxInt = int64(umagic(64, c).m) + v1.AddArg(v2) + v1.AddArg(x) + v0.AddArg(v1) + v.AddArg(v0) + v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v3.AuxInt = umagic(64, c).s - 1 + v.AddArg(v3) return true } return false } -func rewriteValuegeneric_OpAnd16_10(v *Value) bool { +func rewriteValuegeneric_OpDiv8_0(v *Value) bool { b := v.Block - // match: (And16 _ (Const16 [0])) - // result: (Const16 [0]) + typ := &b.Func.Config.Types + // match: (Div8 (Const8 [c]) (Const8 [d])) + // cond: d != 0 + // result: (Const8 [int64(int8(c)/int8(d))]) for { _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst8 { + break + } + c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.AuxInt != 0 { + if v_1.Op != OpConst8 { break } - v.reset(OpConst16) - v.AuxInt = 0 + d := v_1.AuxInt + if !(d != 0) { + break + } + v.reset(OpConst8) + v.AuxInt = int64(int8(c) / int8(d)) return true } - // match: (And16 x (And16 x y)) - // result: (And16 x y) + // match: (Div8 n (Const8 [c])) + // cond: isNonNegative(n) && isPowerOfTwo(c&0xff) + // result: (Rsh8Ux64 n (Const64 [log2(c&0xff)])) for { _ = v.Args[1] - x := v.Args[0] + n := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAnd16 { + if v_1.Op != OpConst8 { break } - y := v_1.Args[1] - if x != v_1.Args[0] { + c := v_1.AuxInt + if !(isNonNegative(n) && isPowerOfTwo(c&0xff)) { break } - v.reset(OpAnd16) - v.AddArg(x) - v.AddArg(y) + v.reset(OpRsh8Ux64) + v.AddArg(n) + v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v0.AuxInt = log2(c & 0xff) + v.AddArg(v0) return true } - // match: (And16 x (And16 y x)) - // result: (And16 x y) + // match: (Div8 n (Const8 [c])) + // cond: c < 0 && c != -1<<7 + // result: (Neg8 (Div8 n (Const8 [-c]))) for { + t := v.Type _ = v.Args[1] - x := v.Args[0] + n := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAnd16 { + if v_1.Op != OpConst8 { break } - _ = v_1.Args[1] - y := v_1.Args[0] - if x != v_1.Args[1] { + c := v_1.AuxInt + if !(c < 0 && c != -1<<7) { break } - v.reset(OpAnd16) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (And16 (And16 x y) x) - // result: (And16 x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd16 { - break - } - y := v_0.Args[1] - if x != v_0.Args[0] { - break - } - v.reset(OpAnd16) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (And16 (And16 y x) x) - // result: (And16 x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd16 { - break - } - _ = v_0.Args[1] - y := v_0.Args[0] - if x != v_0.Args[1] { - break - } - v.reset(OpAnd16) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (And16 (And16 i:(Const16 ) z) x) - // cond: (z.Op != OpConst16 && x.Op != OpConst16) - // result: (And16 i (And16 z x)) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd16 { - break - } - z := v_0.Args[1] - i := v_0.Args[0] - if i.Op != OpConst16 { - break - } - t := i.Type - if !(z.Op != OpConst16 && x.Op != OpConst16) { - break - } - v.reset(OpAnd16) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAnd16, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (And16 (And16 z i:(Const16 )) x) - // cond: (z.Op != OpConst16 && x.Op != OpConst16) - // result: (And16 i (And16 z x)) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd16 { - break - } - _ = v_0.Args[1] - z := v_0.Args[0] - i := v_0.Args[1] - if i.Op != OpConst16 { - break - } - t := i.Type - if !(z.Op != OpConst16 && x.Op != OpConst16) { - break - } - v.reset(OpAnd16) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAnd16, t) - v0.AddArg(z) - v0.AddArg(x) + v.reset(OpNeg8) + v0 := b.NewValue0(v.Pos, OpDiv8, t) + v0.AddArg(n) + v1 := b.NewValue0(v.Pos, OpConst8, t) + v1.AuxInt = -c + v0.AddArg(v1) v.AddArg(v0) return true } - // match: (And16 x (And16 i:(Const16 ) z)) - // cond: (z.Op != OpConst16 && x.Op != OpConst16) - // result: (And16 i (And16 z x)) + // match: (Div8 x (Const8 [-1<<7 ])) + // result: (Rsh8Ux64 (And8 x (Neg8 x)) (Const64 [7 ])) for { + t := v.Type _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAnd16 { - break - } - z := v_1.Args[1] - i := v_1.Args[0] - if i.Op != OpConst16 { - break - } - t := i.Type - if !(z.Op != OpConst16 && x.Op != OpConst16) { + if v_1.Op != OpConst8 || v_1.AuxInt != -1<<7 { break } - v.reset(OpAnd16) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAnd16, t) - v0.AddArg(z) + v.reset(OpRsh8Ux64) + v0 := b.NewValue0(v.Pos, OpAnd8, t) v0.AddArg(x) + v1 := b.NewValue0(v.Pos, OpNeg8, t) + v1.AddArg(x) + v0.AddArg(v1) v.AddArg(v0) + v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v2.AuxInt = 7 + v.AddArg(v2) return true } - // match: (And16 x (And16 z i:(Const16 ))) - // cond: (z.Op != OpConst16 && x.Op != OpConst16) - // result: (And16 i (And16 z x)) + // match: (Div8 n (Const8 [c])) + // cond: isPowerOfTwo(c) + // result: (Rsh8x64 (Add8 n (Rsh8Ux64 (Rsh8x64 n (Const64 [ 7])) (Const64 [ 8-log2(c)]))) (Const64 [log2(c)])) for { + t := v.Type _ = v.Args[1] - x := v.Args[0] + n := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAnd16 { - break - } - _ = v_1.Args[1] - z := v_1.Args[0] - i := v_1.Args[1] - if i.Op != OpConst16 { + if v_1.Op != OpConst8 { break } - t := i.Type - if !(z.Op != OpConst16 && x.Op != OpConst16) { + c := v_1.AuxInt + if !(isPowerOfTwo(c)) { break } - v.reset(OpAnd16) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAnd16, t) - v0.AddArg(z) - v0.AddArg(x) + v.reset(OpRsh8x64) + v0 := b.NewValue0(v.Pos, OpAdd8, t) + v0.AddArg(n) + v1 := b.NewValue0(v.Pos, OpRsh8Ux64, t) + v2 := b.NewValue0(v.Pos, OpRsh8x64, t) + v2.AddArg(n) + v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v3.AuxInt = 7 + v2.AddArg(v3) + v1.AddArg(v2) + v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v4.AuxInt = 8 - log2(c) + v1.AddArg(v4) + v0.AddArg(v1) v.AddArg(v0) + v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v5.AuxInt = log2(c) + v.AddArg(v5) return true } - // match: (And16 (Const16 [c]) (And16 (Const16 [d]) x)) - // result: (And16 (Const16 [int64(int16(c&d))]) x) + // match: (Div8 x (Const8 [c])) + // cond: smagicOK(8,c) + // result: (Sub8 (Rsh32x64 (Mul32 (Const32 [int64(smagic(8,c).m)]) (SignExt8to32 x)) (Const64 [8+smagic(8,c).s])) (Rsh32x64 (SignExt8to32 x) (Const64 [31]))) for { + t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - t := v_0.Type - c := v_0.AuxInt + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAnd16 { + if v_1.Op != OpConst8 { break } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst16 || v_1_0.Type != t { + c := v_1.AuxInt + if !(smagicOK(8, c)) { break } - d := v_1_0.AuxInt - v.reset(OpAnd16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c & d)) + v.reset(OpSub8) + v.Type = t + v0 := b.NewValue0(v.Pos, OpRsh32x64, t) + v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) + v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v2.AuxInt = int64(smagic(8, c).m) + v1.AddArg(v2) + v3 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) + v3.AddArg(x) + v1.AddArg(v3) + v0.AddArg(v1) + v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v4.AuxInt = 8 + smagic(8, c).s + v0.AddArg(v4) v.AddArg(v0) - v.AddArg(x) + v5 := b.NewValue0(v.Pos, OpRsh32x64, t) + v6 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) + v6.AddArg(x) + v5.AddArg(v6) + v7 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v7.AuxInt = 31 + v5.AddArg(v7) + v.AddArg(v5) return true } return false } -func rewriteValuegeneric_OpAnd16_20(v *Value) bool { +func rewriteValuegeneric_OpDiv8u_0(v *Value) bool { b := v.Block - // match: (And16 (Const16 [c]) (And16 x (Const16 [d]))) - // result: (And16 (Const16 [int64(int16(c&d))]) x) + typ := &b.Func.Config.Types + // match: (Div8u (Const8 [c]) (Const8 [d])) + // cond: d != 0 + // result: (Const8 [int64(int8(uint8(c)/uint8(d)))]) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst16 { + if v_0.Op != OpConst8 { break } - t := v_0.Type c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpAnd16 { + if v_1.Op != OpConst8 { break } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst16 || v_1_1.Type != t { + d := v_1.AuxInt + if !(d != 0) { break } - d := v_1_1.AuxInt - v.reset(OpAnd16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c & d)) - v.AddArg(v0) - v.AddArg(x) + v.reset(OpConst8) + v.AuxInt = int64(int8(uint8(c) / uint8(d))) return true } - // match: (And16 (And16 (Const16 [d]) x) (Const16 [c])) - // result: (And16 (Const16 [int64(int16(c&d))]) x) + // match: (Div8u n (Const8 [c])) + // cond: isPowerOfTwo(c&0xff) + // result: (Rsh8Ux64 n (Const64 [log2(c&0xff)])) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd16 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst16 { - break - } - t := v_0_0.Type - d := v_0_0.AuxInt + n := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.Type != t { + if v_1.Op != OpConst8 { break } c := v_1.AuxInt - v.reset(OpAnd16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c & d)) + if !(isPowerOfTwo(c & 0xff)) { + break + } + v.reset(OpRsh8Ux64) + v.AddArg(n) + v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v0.AuxInt = log2(c & 0xff) v.AddArg(v0) - v.AddArg(x) return true } - // match: (And16 (And16 x (Const16 [d])) (Const16 [c])) - // result: (And16 (Const16 [int64(int16(c&d))]) x) + // match: (Div8u x (Const8 [c])) + // cond: umagicOK(8, c) + // result: (Trunc32to8 (Rsh32Ux64 (Mul32 (Const32 [int64(1<<8+umagic(8,c).m)]) (ZeroExt8to32 x)) (Const64 [8+umagic(8,c).s]))) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd16 { + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst8 { break } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst16 { - break - } - t := v_0_1.Type - d := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.Type != t { + c := v_1.AuxInt + if !(umagicOK(8, c)) { break } - c := v_1.AuxInt - v.reset(OpAnd16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c & d)) + v.reset(OpTrunc32to8) + v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) + v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) + v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v2.AuxInt = int64(1<<8 + umagic(8, c).m) + v1.AddArg(v2) + v3 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) + v3.AddArg(x) + v1.AddArg(v3) + v0.AddArg(v1) + v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v4.AuxInt = 8 + umagic(8, c).s + v0.AddArg(v4) v.AddArg(v0) - v.AddArg(x) return true } return false } -func rewriteValuegeneric_OpAnd32_0(v *Value) bool { - // match: (And32 (Const32 [c]) (Const32 [d])) - // result: (Const32 [int64(int32(c&d))]) +func rewriteValuegeneric_OpEq16_0(v *Value) bool { + b := v.Block + config := b.Func.Config + typ := &b.Func.Config.Types + // match: (Eq16 x x) + // result: (ConstBool [1]) for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { + x := v.Args[1] + if x != v.Args[0] { break } - d := v_1.AuxInt - v.reset(OpConst32) - v.AuxInt = int64(int32(c & d)) + v.reset(OpConstBool) + v.AuxInt = 1 return true } - // match: (And32 (Const32 [d]) (Const32 [c])) - // result: (Const32 [int64(int32(c&d))]) + // match: (Eq16 (Const16 [c]) (Add16 (Const16 [d]) x)) + // result: (Eq16 (Const16 [int64(int16(c-d))]) x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst16 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpAdd16 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst16 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpEq16) + v0 := b.NewValue0(v.Pos, OpConst16, t) + v0.AuxInt = int64(int16(c - d)) + v.AddArg(v0) + v.AddArg(x) + return true + } } - c := v_1.AuxInt - v.reset(OpConst32) - v.AuxInt = int64(int32(c & d)) - return true + break } - // match: (And32 (Const32 [m]) (Rsh32Ux64 _ (Const64 [c]))) - // cond: c >= 64-ntz(m) - // result: (Const32 [0]) + // match: (Eq16 (Const16 [c]) (Const16 [d])) + // result: (ConstBool [b2i(c == d)]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - m := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpRsh32Ux64 { - break - } - _ = v_1.Args[1] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 { - break - } - c := v_1_1.AuxInt - if !(c >= 64-ntz(m)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst16 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst16 { + continue + } + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c == d) + return true } - v.reset(OpConst32) - v.AuxInt = 0 - return true + break } - // match: (And32 (Rsh32Ux64 _ (Const64 [c])) (Const32 [m])) - // cond: c >= 64-ntz(m) - // result: (Const32 [0]) + // match: (Eq16 (Mod16u x (Const16 [c])) (Const16 [0])) + // cond: x.Op != OpConst16 && udivisibleOK(16,c) && !hasSmallRotate(config) + // result: (Eq32 (Mod32u (ZeroExt16to32 x) (Const32 [c&0xffff])) (Const32 [0])) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpRsh32Ux64 { - break - } - _ = v_0.Args[1] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - m := v_1.AuxInt - if !(c >= 64-ntz(m)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpMod16u { + continue + } + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst16 { + continue + } + c := v_0_1.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst16 || v_1.AuxInt != 0 || !(x.Op != OpConst16 && udivisibleOK(16, c) && !hasSmallRotate(config)) { + continue + } + v.reset(OpEq32) + v0 := b.NewValue0(v.Pos, OpMod32u, typ.UInt32) + v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) + v1.AddArg(x) + v0.AddArg(v1) + v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v2.AuxInt = c & 0xffff + v0.AddArg(v2) + v.AddArg(v0) + v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v3.AuxInt = 0 + v.AddArg(v3) + return true } - v.reset(OpConst32) - v.AuxInt = 0 - return true + break } - // match: (And32 (Const32 [m]) (Lsh32x64 _ (Const64 [c]))) - // cond: c >= 64-nlz(m) - // result: (Const32 [0]) + // match: (Eq16 (Mod16 x (Const16 [c])) (Const16 [0])) + // cond: x.Op != OpConst16 && sdivisibleOK(16,c) && !hasSmallRotate(config) + // result: (Eq32 (Mod32 (SignExt16to32 x) (Const32 [c])) (Const32 [0])) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - m := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpLsh32x64 { - break - } - _ = v_1.Args[1] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 { - break - } - c := v_1_1.AuxInt - if !(c >= 64-nlz(m)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpMod16 { + continue + } + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst16 { + continue + } + c := v_0_1.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst16 || v_1.AuxInt != 0 || !(x.Op != OpConst16 && sdivisibleOK(16, c) && !hasSmallRotate(config)) { + continue + } + v.reset(OpEq32) + v0 := b.NewValue0(v.Pos, OpMod32, typ.Int32) + v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) + v1.AddArg(x) + v0.AddArg(v1) + v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32) + v2.AuxInt = c + v0.AddArg(v2) + v.AddArg(v0) + v3 := b.NewValue0(v.Pos, OpConst32, typ.Int32) + v3.AuxInt = 0 + v.AddArg(v3) + return true } - v.reset(OpConst32) - v.AuxInt = 0 - return true + break } - // match: (And32 (Lsh32x64 _ (Const64 [c])) (Const32 [m])) - // cond: c >= 64-nlz(m) - // result: (Const32 [0]) + // match: (Eq16 x (Mul16 (Const16 [c]) (Trunc64to16 (Rsh64Ux64 mul:(Mul64 (Const64 [m]) (ZeroExt16to64 x)) (Const64 [s]))) ) ) + // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<16+umagic(16,c).m) && s == 16+umagic(16,c).s && x.Op != OpConst16 && udivisibleOK(16,c) + // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh32x64 { - break - } - _ = v_0.Args[1] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - m := v_1.AuxInt - if !(c >= 64-nlz(m)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMul16 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst16 { + continue + } + c := v_1_0.AuxInt + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpTrunc64to16 { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpRsh64Ux64 { + continue + } + _ = v_1_1_0.Args[1] + mul := v_1_1_0.Args[0] + if mul.Op != OpMul64 { + continue + } + _ = mul.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + mul_0 := mul.Args[_i2] + if mul_0.Op != OpConst64 { + continue + } + m := mul_0.AuxInt + mul_1 := mul.Args[1^_i2] + if mul_1.Op != OpZeroExt16to64 || x != mul_1.Args[0] { + continue + } + v_1_1_0_1 := v_1_1_0.Args[1] + if v_1_1_0_1.Op != OpConst64 { + continue + } + s := v_1_1_0_1.AuxInt + if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<16+umagic(16, c).m) && s == 16+umagic(16, c).s && x.Op != OpConst16 && udivisibleOK(16, c)) { + continue + } + v.reset(OpLeq16U) + v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) + v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) + v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) + v2.AuxInt = int64(int16(udivisible(16, c).m)) + v1.AddArg(v2) + v1.AddArg(x) + v0.AddArg(v1) + v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) + v3.AuxInt = int64(16 - udivisible(16, c).k) + v0.AddArg(v3) + v.AddArg(v0) + v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) + v4.AuxInt = int64(int16(udivisible(16, c).max)) + v.AddArg(v4) + return true + } + } } - v.reset(OpConst32) - v.AuxInt = 0 - return true + break } - // match: (And32 x x) - // result: x + // match: (Eq16 x (Mul16 (Const16 [c]) (Trunc32to16 (Rsh32Ux64 mul:(Mul32 (Const32 [m]) (ZeroExt16to32 x)) (Const64 [s]))) ) ) + // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+umagic(16,c).m/2) && s == 16+umagic(16,c).s-1 && x.Op != OpConst16 && udivisibleOK(16,c) + // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) for { - x := v.Args[1] - if x != v.Args[0] { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMul16 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst16 { + continue + } + c := v_1_0.AuxInt + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpTrunc32to16 { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpRsh32Ux64 { + continue + } + _ = v_1_1_0.Args[1] + mul := v_1_1_0.Args[0] + if mul.Op != OpMul32 { + continue + } + _ = mul.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + mul_0 := mul.Args[_i2] + if mul_0.Op != OpConst32 { + continue + } + m := mul_0.AuxInt + mul_1 := mul.Args[1^_i2] + if mul_1.Op != OpZeroExt16to32 || x != mul_1.Args[0] { + continue + } + v_1_1_0_1 := v_1_1_0.Args[1] + if v_1_1_0_1.Op != OpConst64 { + continue + } + s := v_1_1_0_1.AuxInt + if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+umagic(16, c).m/2) && s == 16+umagic(16, c).s-1 && x.Op != OpConst16 && udivisibleOK(16, c)) { + continue + } + v.reset(OpLeq16U) + v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) + v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) + v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) + v2.AuxInt = int64(int16(udivisible(16, c).m)) + v1.AddArg(v2) + v1.AddArg(x) + v0.AddArg(v1) + v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) + v3.AuxInt = int64(16 - udivisible(16, c).k) + v0.AddArg(v3) + v.AddArg(v0) + v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) + v4.AuxInt = int64(int16(udivisible(16, c).max)) + v.AddArg(v4) + return true + } + } } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true + break } - // match: (And32 (Const32 [-1]) x) - // result: x + // match: (Eq16 x (Mul16 (Const16 [c]) (Trunc32to16 (Rsh32Ux64 mul:(Mul32 (Const32 [m]) (Rsh32Ux64 (ZeroExt16to32 x) (Const64 [1]))) (Const64 [s]))) ) ) + // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+(umagic(16,c).m+1)/2) && s == 16+umagic(16,c).s-2 && x.Op != OpConst16 && udivisibleOK(16,c) + // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 || v_0.AuxInt != -1 { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMul16 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst16 { + continue + } + c := v_1_0.AuxInt + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpTrunc32to16 { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpRsh32Ux64 { + continue + } + _ = v_1_1_0.Args[1] + mul := v_1_1_0.Args[0] + if mul.Op != OpMul32 { + continue + } + _ = mul.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + mul_0 := mul.Args[_i2] + if mul_0.Op != OpConst32 { + continue + } + m := mul_0.AuxInt + mul_1 := mul.Args[1^_i2] + if mul_1.Op != OpRsh32Ux64 { + continue + } + _ = mul_1.Args[1] + mul_1_0 := mul_1.Args[0] + if mul_1_0.Op != OpZeroExt16to32 || x != mul_1_0.Args[0] { + continue + } + mul_1_1 := mul_1.Args[1] + if mul_1_1.Op != OpConst64 || mul_1_1.AuxInt != 1 { + continue + } + v_1_1_0_1 := v_1_1_0.Args[1] + if v_1_1_0_1.Op != OpConst64 { + continue + } + s := v_1_1_0_1.AuxInt + if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+(umagic(16, c).m+1)/2) && s == 16+umagic(16, c).s-2 && x.Op != OpConst16 && udivisibleOK(16, c)) { + continue + } + v.reset(OpLeq16U) + v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) + v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) + v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) + v2.AuxInt = int64(int16(udivisible(16, c).m)) + v1.AddArg(v2) + v1.AddArg(x) + v0.AddArg(v1) + v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) + v3.AuxInt = int64(16 - udivisible(16, c).k) + v0.AddArg(v3) + v.AddArg(v0) + v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) + v4.AuxInt = int64(int16(udivisible(16, c).max)) + v.AddArg(v4) + return true + } + } } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true + break } - // match: (And32 x (Const32 [-1])) - // result: x + // match: (Eq16 x (Mul16 (Const16 [c]) (Trunc32to16 (Rsh32Ux64 (Avg32u (Lsh32x64 (ZeroExt16to32 x) (Const64 [16])) mul:(Mul32 (Const32 [m]) (ZeroExt16to32 x))) (Const64 [s]))) ) ) + // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(16,c).m) && s == 16+umagic(16,c).s-1 && x.Op != OpConst16 && udivisibleOK(16,c) + // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.AuxInt != -1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMul16 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst16 { + continue + } + c := v_1_0.AuxInt + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpTrunc32to16 { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpRsh32Ux64 { + continue + } + _ = v_1_1_0.Args[1] + v_1_1_0_0 := v_1_1_0.Args[0] + if v_1_1_0_0.Op != OpAvg32u { + continue + } + _ = v_1_1_0_0.Args[1] + v_1_1_0_0_0 := v_1_1_0_0.Args[0] + if v_1_1_0_0_0.Op != OpLsh32x64 { + continue + } + _ = v_1_1_0_0_0.Args[1] + v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] + if v_1_1_0_0_0_0.Op != OpZeroExt16to32 || x != v_1_1_0_0_0_0.Args[0] { + continue + } + v_1_1_0_0_0_1 := v_1_1_0_0_0.Args[1] + if v_1_1_0_0_0_1.Op != OpConst64 || v_1_1_0_0_0_1.AuxInt != 16 { + continue + } + mul := v_1_1_0_0.Args[1] + if mul.Op != OpMul32 { + continue + } + _ = mul.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + mul_0 := mul.Args[_i2] + if mul_0.Op != OpConst32 { + continue + } + m := mul_0.AuxInt + mul_1 := mul.Args[1^_i2] + if mul_1.Op != OpZeroExt16to32 || x != mul_1.Args[0] { + continue + } + v_1_1_0_1 := v_1_1_0.Args[1] + if v_1_1_0_1.Op != OpConst64 { + continue + } + s := v_1_1_0_1.AuxInt + if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(16, c).m) && s == 16+umagic(16, c).s-1 && x.Op != OpConst16 && udivisibleOK(16, c)) { + continue + } + v.reset(OpLeq16U) + v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) + v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) + v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) + v2.AuxInt = int64(int16(udivisible(16, c).m)) + v1.AddArg(v2) + v1.AddArg(x) + v0.AddArg(v1) + v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) + v3.AuxInt = int64(16 - udivisible(16, c).k) + v0.AddArg(v3) + v.AddArg(v0) + v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) + v4.AuxInt = int64(int16(udivisible(16, c).max)) + v.AddArg(v4) + return true + } + } } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true + break } - // match: (And32 (Const32 [0]) _) - // result: (Const32 [0]) + // match: (Eq16 x (Mul16 (Const16 [c]) (Sub16 (Rsh32x64 mul:(Mul32 (Const32 [m]) (SignExt16to32 x)) (Const64 [s])) (Rsh32x64 (SignExt16to32 x) (Const64 [31]))) ) ) + // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(16,c).m) && s == 16+smagic(16,c).s && x.Op != OpConst16 && sdivisibleOK(16,c) + // result: (Leq16U (RotateLeft16 (Add16 (Mul16 (Const16 [int64(int16(sdivisible(16,c).m))]) x) (Const16 [int64(int16(sdivisible(16,c).a))]) ) (Const16 [int64(16-sdivisible(16,c).k)]) ) (Const16 [int64(int16(sdivisible(16,c).max))]) ) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 || v_0.AuxInt != 0 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMul16 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst16 { + continue + } + c := v_1_0.AuxInt + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpSub16 { + continue + } + _ = v_1_1.Args[1] + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpRsh32x64 { + continue + } + _ = v_1_1_0.Args[1] + mul := v_1_1_0.Args[0] + if mul.Op != OpMul32 { + continue + } + _ = mul.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + mul_0 := mul.Args[_i2] + if mul_0.Op != OpConst32 { + continue + } + m := mul_0.AuxInt + mul_1 := mul.Args[1^_i2] + if mul_1.Op != OpSignExt16to32 || x != mul_1.Args[0] { + continue + } + v_1_1_0_1 := v_1_1_0.Args[1] + if v_1_1_0_1.Op != OpConst64 { + continue + } + s := v_1_1_0_1.AuxInt + v_1_1_1 := v_1_1.Args[1] + if v_1_1_1.Op != OpRsh32x64 { + continue + } + _ = v_1_1_1.Args[1] + v_1_1_1_0 := v_1_1_1.Args[0] + if v_1_1_1_0.Op != OpSignExt16to32 || x != v_1_1_1_0.Args[0] { + continue + } + v_1_1_1_1 := v_1_1_1.Args[1] + if v_1_1_1_1.Op != OpConst64 || v_1_1_1_1.AuxInt != 31 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(16, c).m) && s == 16+smagic(16, c).s && x.Op != OpConst16 && sdivisibleOK(16, c)) { + continue + } + v.reset(OpLeq16U) + v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) + v1 := b.NewValue0(v.Pos, OpAdd16, typ.UInt16) + v2 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) + v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) + v3.AuxInt = int64(int16(sdivisible(16, c).m)) + v2.AddArg(v3) + v2.AddArg(x) + v1.AddArg(v2) + v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) + v4.AuxInt = int64(int16(sdivisible(16, c).a)) + v1.AddArg(v4) + v0.AddArg(v1) + v5 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) + v5.AuxInt = int64(16 - sdivisible(16, c).k) + v0.AddArg(v5) + v.AddArg(v0) + v6 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) + v6.AuxInt = int64(int16(sdivisible(16, c).max)) + v.AddArg(v6) + return true + } + } } - v.reset(OpConst32) - v.AuxInt = 0 - return true + break } return false } -func rewriteValuegeneric_OpAnd32_10(v *Value) bool { +func rewriteValuegeneric_OpEq16_10(v *Value) bool { b := v.Block - // match: (And32 _ (Const32 [0])) - // result: (Const32 [0]) + typ := &b.Func.Config.Types + // match: (Eq16 n (Lsh16x64 (Rsh16x64 (Add16 n (Rsh16Ux64 (Rsh16x64 n (Const64 [15])) (Const64 [kbar]))) (Const64 [k])) (Const64 [k])) ) + // cond: k > 0 && k < 15 && kbar == 16 - k + // result: (Eq16 (And16 n (Const16 [int64(1< [0])) for { _ = v.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.AuxInt != 0 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + n := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpLsh16x64 { + continue + } + _ = v_1.Args[1] + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpRsh16x64 { + continue + } + _ = v_1_0.Args[1] + v_1_0_0 := v_1_0.Args[0] + if v_1_0_0.Op != OpAdd16 { + continue + } + t := v_1_0_0.Type + _ = v_1_0_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + if n != v_1_0_0.Args[_i1] { + continue + } + v_1_0_0_1 := v_1_0_0.Args[1^_i1] + if v_1_0_0_1.Op != OpRsh16Ux64 || v_1_0_0_1.Type != t { + continue + } + _ = v_1_0_0_1.Args[1] + v_1_0_0_1_0 := v_1_0_0_1.Args[0] + if v_1_0_0_1_0.Op != OpRsh16x64 || v_1_0_0_1_0.Type != t { + continue + } + _ = v_1_0_0_1_0.Args[1] + if n != v_1_0_0_1_0.Args[0] { + continue + } + v_1_0_0_1_0_1 := v_1_0_0_1_0.Args[1] + if v_1_0_0_1_0_1.Op != OpConst64 || v_1_0_0_1_0_1.Type != typ.UInt64 || v_1_0_0_1_0_1.AuxInt != 15 { + continue + } + v_1_0_0_1_1 := v_1_0_0_1.Args[1] + if v_1_0_0_1_1.Op != OpConst64 || v_1_0_0_1_1.Type != typ.UInt64 { + continue + } + kbar := v_1_0_0_1_1.AuxInt + v_1_0_1 := v_1_0.Args[1] + if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 { + continue + } + k := v_1_0_1.AuxInt + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || v_1_1.AuxInt != k || !(k > 0 && k < 15 && kbar == 16-k) { + continue + } + v.reset(OpEq16) + v0 := b.NewValue0(v.Pos, OpAnd16, t) + v0.AddArg(n) + v1 := b.NewValue0(v.Pos, OpConst16, t) + v1.AuxInt = int64(1< x (Const16 [y])) (Const16 [y])) + // cond: isPowerOfTwo(y) + // result: (Neq16 (And16 x (Const16 [y])) (Const16 [0])) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAnd32 { - break - } - _ = v_1.Args[1] - y := v_1.Args[0] - if x != v_1.Args[1] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAnd16 { + continue + } + t := v_0.Type + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + x := v_0.Args[_i1] + v_0_1 := v_0.Args[1^_i1] + if v_0_1.Op != OpConst16 || v_0_1.Type != t { + continue + } + y := v_0_1.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst16 || v_1.Type != t || v_1.AuxInt != y || !(isPowerOfTwo(y)) { + continue + } + v.reset(OpNeq16) + v0 := b.NewValue0(v.Pos, OpAnd16, t) + v0.AddArg(x) + v1 := b.NewValue0(v.Pos, OpConst16, t) + v1.AuxInt = y + v0.AddArg(v1) + v.AddArg(v0) + v2 := b.NewValue0(v.Pos, OpConst16, t) + v2.AuxInt = 0 + v.AddArg(v2) + return true + } } - v.reset(OpAnd32) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (And32 (And32 x y) x) - // result: (And32 x y) + return false +} +func rewriteValuegeneric_OpEq32_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (Eq32 x x) + // result: (ConstBool [1]) for { x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd32 { - break - } - y := v_0.Args[1] - if x != v_0.Args[0] { + if x != v.Args[0] { break } - v.reset(OpAnd32) - v.AddArg(x) - v.AddArg(y) + v.reset(OpConstBool) + v.AuxInt = 1 return true } - // match: (And32 (And32 y x) x) - // result: (And32 x y) + // match: (Eq32 (Const32 [c]) (Add32 (Const32 [d]) x)) + // result: (Eq32 (Const32 [int64(int32(c-d))]) x) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd32 { - break - } - _ = v_0.Args[1] - y := v_0.Args[0] - if x != v_0.Args[1] { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpAdd32 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst32 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpEq32) + v0 := b.NewValue0(v.Pos, OpConst32, t) + v0.AuxInt = int64(int32(c - d)) + v.AddArg(v0) + v.AddArg(x) + return true + } } - v.reset(OpAnd32) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (And32 (And32 i:(Const32 ) z) x) - // cond: (z.Op != OpConst32 && x.Op != OpConst32) - // result: (And32 i (And32 z x)) + // match: (Eq32 (Const32 [c]) (Const32 [d])) + // result: (ConstBool [b2i(c == d)]) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd32 { - break - } - z := v_0.Args[1] - i := v_0.Args[0] - if i.Op != OpConst32 { - break - } - t := i.Type - if !(z.Op != OpConst32 && x.Op != OpConst32) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst32 { + continue + } + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c == d) + return true } - v.reset(OpAnd32) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAnd32, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (And32 (And32 z i:(Const32 )) x) - // cond: (z.Op != OpConst32 && x.Op != OpConst32) - // result: (And32 i (And32 z x)) + // match: (Eq32 x (Mul32 (Const32 [c]) (Rsh32Ux64 mul:(Hmul32u (Const32 [m]) x) (Const64 [s])) ) ) + // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+umagic(32,c).m/2)) && s == umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) + // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd32 { - break - } - _ = v_0.Args[1] - z := v_0.Args[0] - i := v_0.Args[1] - if i.Op != OpConst32 { - break - } - t := i.Type - if !(z.Op != OpConst32 && x.Op != OpConst32) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMul32 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst32 { + continue + } + c := v_1_0.AuxInt + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpRsh32Ux64 { + continue + } + _ = v_1_1.Args[1] + mul := v_1_1.Args[0] + if mul.Op != OpHmul32u { + continue + } + _ = mul.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + mul_0 := mul.Args[_i2] + if mul_0.Op != OpConst32 { + continue + } + m := mul_0.AuxInt + if x != mul.Args[1^_i2] { + continue + } + v_1_1_1 := v_1_1.Args[1] + if v_1_1_1.Op != OpConst64 { + continue + } + s := v_1_1_1.AuxInt + if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+umagic(32, c).m/2)) && s == umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { + continue + } + v.reset(OpLeq32U) + v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) + v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) + v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v2.AuxInt = int64(int32(udivisible(32, c).m)) + v1.AddArg(v2) + v1.AddArg(x) + v0.AddArg(v1) + v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v3.AuxInt = int64(32 - udivisible(32, c).k) + v0.AddArg(v3) + v.AddArg(v0) + v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v4.AuxInt = int64(int32(udivisible(32, c).max)) + v.AddArg(v4) + return true + } + } } - v.reset(OpAnd32) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAnd32, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (And32 x (And32 i:(Const32 ) z)) - // cond: (z.Op != OpConst32 && x.Op != OpConst32) - // result: (And32 i (And32 z x)) + // match: (Eq32 x (Mul32 (Const32 [c]) (Rsh32Ux64 mul:(Hmul32u (Const32 [m]) (Rsh32Ux64 x (Const64 [1]))) (Const64 [s])) ) ) + // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+(umagic(32,c).m+1)/2)) && s == umagic(32,c).s-2 && x.Op != OpConst32 && udivisibleOK(32,c) + // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAnd32 { - break - } - z := v_1.Args[1] - i := v_1.Args[0] - if i.Op != OpConst32 { - break - } - t := i.Type - if !(z.Op != OpConst32 && x.Op != OpConst32) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMul32 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst32 { + continue + } + c := v_1_0.AuxInt + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpRsh32Ux64 { + continue + } + _ = v_1_1.Args[1] + mul := v_1_1.Args[0] + if mul.Op != OpHmul32u { + continue + } + _ = mul.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + mul_0 := mul.Args[_i2] + if mul_0.Op != OpConst32 || mul_0.Type != typ.UInt32 { + continue + } + m := mul_0.AuxInt + mul_1 := mul.Args[1^_i2] + if mul_1.Op != OpRsh32Ux64 { + continue + } + _ = mul_1.Args[1] + if x != mul_1.Args[0] { + continue + } + mul_1_1 := mul_1.Args[1] + if mul_1_1.Op != OpConst64 || mul_1_1.AuxInt != 1 { + continue + } + v_1_1_1 := v_1_1.Args[1] + if v_1_1_1.Op != OpConst64 { + continue + } + s := v_1_1_1.AuxInt + if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+(umagic(32, c).m+1)/2)) && s == umagic(32, c).s-2 && x.Op != OpConst32 && udivisibleOK(32, c)) { + continue + } + v.reset(OpLeq32U) + v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) + v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) + v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v2.AuxInt = int64(int32(udivisible(32, c).m)) + v1.AddArg(v2) + v1.AddArg(x) + v0.AddArg(v1) + v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v3.AuxInt = int64(32 - udivisible(32, c).k) + v0.AddArg(v3) + v.AddArg(v0) + v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v4.AuxInt = int64(int32(udivisible(32, c).max)) + v.AddArg(v4) + return true + } + } } - v.reset(OpAnd32) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAnd32, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (And32 x (And32 z i:(Const32 ))) - // cond: (z.Op != OpConst32 && x.Op != OpConst32) - // result: (And32 i (And32 z x)) + // match: (Eq32 x (Mul32 (Const32 [c]) (Rsh32Ux64 (Avg32u x mul:(Hmul32u (Const32 [m]) x)) (Const64 [s])) ) ) + // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(umagic(32,c).m)) && s == umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) + // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAnd32 { - break - } - _ = v_1.Args[1] - z := v_1.Args[0] - i := v_1.Args[1] - if i.Op != OpConst32 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMul32 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst32 { + continue + } + c := v_1_0.AuxInt + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpRsh32Ux64 { + continue + } + _ = v_1_1.Args[1] + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpAvg32u { + continue + } + _ = v_1_1_0.Args[1] + if x != v_1_1_0.Args[0] { + continue + } + mul := v_1_1_0.Args[1] + if mul.Op != OpHmul32u { + continue + } + _ = mul.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + mul_0 := mul.Args[_i2] + if mul_0.Op != OpConst32 { + continue + } + m := mul_0.AuxInt + if x != mul.Args[1^_i2] { + continue + } + v_1_1_1 := v_1_1.Args[1] + if v_1_1_1.Op != OpConst64 { + continue + } + s := v_1_1_1.AuxInt + if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(umagic(32, c).m)) && s == umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { + continue + } + v.reset(OpLeq32U) + v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) + v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) + v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v2.AuxInt = int64(int32(udivisible(32, c).m)) + v1.AddArg(v2) + v1.AddArg(x) + v0.AddArg(v1) + v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v3.AuxInt = int64(32 - udivisible(32, c).k) + v0.AddArg(v3) + v.AddArg(v0) + v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v4.AuxInt = int64(int32(udivisible(32, c).max)) + v.AddArg(v4) + return true + } + } } - t := i.Type - if !(z.Op != OpConst32 && x.Op != OpConst32) { - break + break + } + // match: (Eq32 x (Mul32 (Const32 [c]) (Trunc64to32 (Rsh64Ux64 mul:(Mul64 (Const64 [m]) (ZeroExt32to64 x)) (Const64 [s]))) ) ) + // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+umagic(32,c).m/2) && s == 32+umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) + // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMul32 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst32 { + continue + } + c := v_1_0.AuxInt + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpTrunc64to32 { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpRsh64Ux64 { + continue + } + _ = v_1_1_0.Args[1] + mul := v_1_1_0.Args[0] + if mul.Op != OpMul64 { + continue + } + _ = mul.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + mul_0 := mul.Args[_i2] + if mul_0.Op != OpConst64 { + continue + } + m := mul_0.AuxInt + mul_1 := mul.Args[1^_i2] + if mul_1.Op != OpZeroExt32to64 || x != mul_1.Args[0] { + continue + } + v_1_1_0_1 := v_1_1_0.Args[1] + if v_1_1_0_1.Op != OpConst64 { + continue + } + s := v_1_1_0_1.AuxInt + if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+umagic(32, c).m/2) && s == 32+umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { + continue + } + v.reset(OpLeq32U) + v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) + v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) + v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v2.AuxInt = int64(int32(udivisible(32, c).m)) + v1.AddArg(v2) + v1.AddArg(x) + v0.AddArg(v1) + v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v3.AuxInt = int64(32 - udivisible(32, c).k) + v0.AddArg(v3) + v.AddArg(v0) + v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v4.AuxInt = int64(int32(udivisible(32, c).max)) + v.AddArg(v4) + return true + } + } } - v.reset(OpAnd32) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAnd32, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (And32 (Const32 [c]) (And32 (Const32 [d]) x)) - // result: (And32 (Const32 [int64(int32(c&d))]) x) + // match: (Eq32 x (Mul32 (Const32 [c]) (Trunc64to32 (Rsh64Ux64 mul:(Mul64 (Const64 [m]) (Rsh64Ux64 (ZeroExt32to64 x) (Const64 [1]))) (Const64 [s]))) ) ) + // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+(umagic(32,c).m+1)/2) && s == 32+umagic(32,c).s-2 && x.Op != OpConst32 && udivisibleOK(32,c) + // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMul32 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst32 { + continue + } + c := v_1_0.AuxInt + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpTrunc64to32 { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpRsh64Ux64 { + continue + } + _ = v_1_1_0.Args[1] + mul := v_1_1_0.Args[0] + if mul.Op != OpMul64 { + continue + } + _ = mul.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + mul_0 := mul.Args[_i2] + if mul_0.Op != OpConst64 { + continue + } + m := mul_0.AuxInt + mul_1 := mul.Args[1^_i2] + if mul_1.Op != OpRsh64Ux64 { + continue + } + _ = mul_1.Args[1] + mul_1_0 := mul_1.Args[0] + if mul_1_0.Op != OpZeroExt32to64 || x != mul_1_0.Args[0] { + continue + } + mul_1_1 := mul_1.Args[1] + if mul_1_1.Op != OpConst64 || mul_1_1.AuxInt != 1 { + continue + } + v_1_1_0_1 := v_1_1_0.Args[1] + if v_1_1_0_1.Op != OpConst64 { + continue + } + s := v_1_1_0_1.AuxInt + if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+(umagic(32, c).m+1)/2) && s == 32+umagic(32, c).s-2 && x.Op != OpConst32 && udivisibleOK(32, c)) { + continue + } + v.reset(OpLeq32U) + v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) + v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) + v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v2.AuxInt = int64(int32(udivisible(32, c).m)) + v1.AddArg(v2) + v1.AddArg(x) + v0.AddArg(v1) + v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v3.AuxInt = int64(32 - udivisible(32, c).k) + v0.AddArg(v3) + v.AddArg(v0) + v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v4.AuxInt = int64(int32(udivisible(32, c).max)) + v.AddArg(v4) + return true + } + } } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAnd32 { - break + break + } + // match: (Eq32 x (Mul32 (Const32 [c]) (Trunc64to32 (Rsh64Ux64 (Avg64u (Lsh64x64 (ZeroExt32to64 x) (Const64 [32])) mul:(Mul64 (Const64 [m]) (ZeroExt32to64 x))) (Const64 [s]))) ) ) + // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(32,c).m) && s == 32+umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) + // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMul32 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst32 { + continue + } + c := v_1_0.AuxInt + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpTrunc64to32 { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpRsh64Ux64 { + continue + } + _ = v_1_1_0.Args[1] + v_1_1_0_0 := v_1_1_0.Args[0] + if v_1_1_0_0.Op != OpAvg64u { + continue + } + _ = v_1_1_0_0.Args[1] + v_1_1_0_0_0 := v_1_1_0_0.Args[0] + if v_1_1_0_0_0.Op != OpLsh64x64 { + continue + } + _ = v_1_1_0_0_0.Args[1] + v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] + if v_1_1_0_0_0_0.Op != OpZeroExt32to64 || x != v_1_1_0_0_0_0.Args[0] { + continue + } + v_1_1_0_0_0_1 := v_1_1_0_0_0.Args[1] + if v_1_1_0_0_0_1.Op != OpConst64 || v_1_1_0_0_0_1.AuxInt != 32 { + continue + } + mul := v_1_1_0_0.Args[1] + if mul.Op != OpMul64 { + continue + } + _ = mul.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + mul_0 := mul.Args[_i2] + if mul_0.Op != OpConst64 { + continue + } + m := mul_0.AuxInt + mul_1 := mul.Args[1^_i2] + if mul_1.Op != OpZeroExt32to64 || x != mul_1.Args[0] { + continue + } + v_1_1_0_1 := v_1_1_0.Args[1] + if v_1_1_0_1.Op != OpConst64 { + continue + } + s := v_1_1_0_1.AuxInt + if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(32, c).m) && s == 32+umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { + continue + } + v.reset(OpLeq32U) + v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) + v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) + v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v2.AuxInt = int64(int32(udivisible(32, c).m)) + v1.AddArg(v2) + v1.AddArg(x) + v0.AddArg(v1) + v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v3.AuxInt = int64(32 - udivisible(32, c).k) + v0.AddArg(v3) + v.AddArg(v0) + v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v4.AuxInt = int64(int32(udivisible(32, c).max)) + v.AddArg(v4) + return true + } + } } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 || v_1_0.Type != t { - break + break + } + // match: (Eq32 x (Mul32 (Const32 [c]) (Sub32 (Rsh64x64 mul:(Mul64 (Const64 [m]) (SignExt32to64 x)) (Const64 [s])) (Rsh64x64 (SignExt32to64 x) (Const64 [63]))) ) ) + // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(32,c).m) && s == 32+smagic(32,c).s && x.Op != OpConst32 && sdivisibleOK(32,c) + // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMul32 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst32 { + continue + } + c := v_1_0.AuxInt + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpSub32 { + continue + } + _ = v_1_1.Args[1] + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpRsh64x64 { + continue + } + _ = v_1_1_0.Args[1] + mul := v_1_1_0.Args[0] + if mul.Op != OpMul64 { + continue + } + _ = mul.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + mul_0 := mul.Args[_i2] + if mul_0.Op != OpConst64 { + continue + } + m := mul_0.AuxInt + mul_1 := mul.Args[1^_i2] + if mul_1.Op != OpSignExt32to64 || x != mul_1.Args[0] { + continue + } + v_1_1_0_1 := v_1_1_0.Args[1] + if v_1_1_0_1.Op != OpConst64 { + continue + } + s := v_1_1_0_1.AuxInt + v_1_1_1 := v_1_1.Args[1] + if v_1_1_1.Op != OpRsh64x64 { + continue + } + _ = v_1_1_1.Args[1] + v_1_1_1_0 := v_1_1_1.Args[0] + if v_1_1_1_0.Op != OpSignExt32to64 || x != v_1_1_1_0.Args[0] { + continue + } + v_1_1_1_1 := v_1_1_1.Args[1] + if v_1_1_1_1.Op != OpConst64 || v_1_1_1_1.AuxInt != 63 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(32, c).m) && s == 32+smagic(32, c).s && x.Op != OpConst32 && sdivisibleOK(32, c)) { + continue + } + v.reset(OpLeq32U) + v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) + v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) + v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) + v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v3.AuxInt = int64(int32(sdivisible(32, c).m)) + v2.AddArg(v3) + v2.AddArg(x) + v1.AddArg(v2) + v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v4.AuxInt = int64(int32(sdivisible(32, c).a)) + v1.AddArg(v4) + v0.AddArg(v1) + v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v5.AuxInt = int64(32 - sdivisible(32, c).k) + v0.AddArg(v5) + v.AddArg(v0) + v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v6.AuxInt = int64(int32(sdivisible(32, c).max)) + v.AddArg(v6) + return true + } + } } - d := v_1_0.AuxInt - v.reset(OpAnd32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c & d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } return false } -func rewriteValuegeneric_OpAnd32_20(v *Value) bool { +func rewriteValuegeneric_OpEq32_10(v *Value) bool { b := v.Block - // match: (And32 (Const32 [c]) (And32 x (Const32 [d]))) - // result: (And32 (Const32 [int64(int32(c&d))]) x) + typ := &b.Func.Config.Types + // match: (Eq32 x (Mul32 (Const32 [c]) (Sub32 (Rsh32x64 mul:(Hmul32 (Const32 [m]) x) (Const64 [s])) (Rsh32x64 x (Const64 [31]))) ) ) + // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32,c).m/2)) && s == smagic(32,c).s-1 && x.Op != OpConst32 && sdivisibleOK(32,c) + // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAnd32 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 || v_1_1.Type != t { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMul32 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst32 { + continue + } + c := v_1_0.AuxInt + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpSub32 { + continue + } + _ = v_1_1.Args[1] + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpRsh32x64 { + continue + } + _ = v_1_1_0.Args[1] + mul := v_1_1_0.Args[0] + if mul.Op != OpHmul32 { + continue + } + _ = mul.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + mul_0 := mul.Args[_i2] + if mul_0.Op != OpConst32 { + continue + } + m := mul_0.AuxInt + if x != mul.Args[1^_i2] { + continue + } + v_1_1_0_1 := v_1_1_0.Args[1] + if v_1_1_0_1.Op != OpConst64 { + continue + } + s := v_1_1_0_1.AuxInt + v_1_1_1 := v_1_1.Args[1] + if v_1_1_1.Op != OpRsh32x64 { + continue + } + _ = v_1_1_1.Args[1] + if x != v_1_1_1.Args[0] { + continue + } + v_1_1_1_1 := v_1_1_1.Args[1] + if v_1_1_1_1.Op != OpConst64 || v_1_1_1_1.AuxInt != 31 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32, c).m/2)) && s == smagic(32, c).s-1 && x.Op != OpConst32 && sdivisibleOK(32, c)) { + continue + } + v.reset(OpLeq32U) + v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) + v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) + v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) + v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v3.AuxInt = int64(int32(sdivisible(32, c).m)) + v2.AddArg(v3) + v2.AddArg(x) + v1.AddArg(v2) + v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v4.AuxInt = int64(int32(sdivisible(32, c).a)) + v1.AddArg(v4) + v0.AddArg(v1) + v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v5.AuxInt = int64(32 - sdivisible(32, c).k) + v0.AddArg(v5) + v.AddArg(v0) + v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v6.AuxInt = int64(int32(sdivisible(32, c).max)) + v.AddArg(v6) + return true + } + } } - d := v_1_1.AuxInt - v.reset(OpAnd32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c & d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (And32 (And32 (Const32 [d]) x) (Const32 [c])) - // result: (And32 (Const32 [int64(int32(c&d))]) x) + // match: (Eq32 x (Mul32 (Const32 [c]) (Sub32 (Rsh32x64 (Add32 mul:(Hmul32 (Const32 [m]) x) x) (Const64 [s])) (Rsh32x64 x (Const64 [31]))) ) ) + // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32,c).m)) && s == smagic(32,c).s && x.Op != OpConst32 && sdivisibleOK(32,c) + // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd32 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break - } - t := v_0_0.Type - d := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.Type != t { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMul32 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst32 { + continue + } + c := v_1_0.AuxInt + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpSub32 { + continue + } + _ = v_1_1.Args[1] + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpRsh32x64 { + continue + } + _ = v_1_1_0.Args[1] + v_1_1_0_0 := v_1_1_0.Args[0] + if v_1_1_0_0.Op != OpAdd32 { + continue + } + _ = v_1_1_0_0.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + mul := v_1_1_0_0.Args[_i2] + if mul.Op != OpHmul32 { + continue + } + _ = mul.Args[1] + for _i3 := 0; _i3 <= 1; _i3++ { + mul_0 := mul.Args[_i3] + if mul_0.Op != OpConst32 { + continue + } + m := mul_0.AuxInt + if x != mul.Args[1^_i3] || x != v_1_1_0_0.Args[1^_i2] { + continue + } + v_1_1_0_1 := v_1_1_0.Args[1] + if v_1_1_0_1.Op != OpConst64 { + continue + } + s := v_1_1_0_1.AuxInt + v_1_1_1 := v_1_1.Args[1] + if v_1_1_1.Op != OpRsh32x64 { + continue + } + _ = v_1_1_1.Args[1] + if x != v_1_1_1.Args[0] { + continue + } + v_1_1_1_1 := v_1_1_1.Args[1] + if v_1_1_1_1.Op != OpConst64 || v_1_1_1_1.AuxInt != 31 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32, c).m)) && s == smagic(32, c).s && x.Op != OpConst32 && sdivisibleOK(32, c)) { + continue + } + v.reset(OpLeq32U) + v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) + v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) + v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) + v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v3.AuxInt = int64(int32(sdivisible(32, c).m)) + v2.AddArg(v3) + v2.AddArg(x) + v1.AddArg(v2) + v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v4.AuxInt = int64(int32(sdivisible(32, c).a)) + v1.AddArg(v4) + v0.AddArg(v1) + v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v5.AuxInt = int64(32 - sdivisible(32, c).k) + v0.AddArg(v5) + v.AddArg(v0) + v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v6.AuxInt = int64(int32(sdivisible(32, c).max)) + v.AddArg(v6) + return true + } + } + } } - c := v_1.AuxInt - v.reset(OpAnd32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c & d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (And32 (And32 x (Const32 [d])) (Const32 [c])) - // result: (And32 (Const32 [int64(int32(c&d))]) x) + // match: (Eq32 n (Lsh32x64 (Rsh32x64 (Add32 n (Rsh32Ux64 (Rsh32x64 n (Const64 [31])) (Const64 [kbar]))) (Const64 [k])) (Const64 [k])) ) + // cond: k > 0 && k < 31 && kbar == 32 - k + // result: (Eq32 (And32 n (Const32 [int64(1< [0])) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd32 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + n := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpLsh32x64 { + continue + } + _ = v_1.Args[1] + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpRsh32x64 { + continue + } + _ = v_1_0.Args[1] + v_1_0_0 := v_1_0.Args[0] + if v_1_0_0.Op != OpAdd32 { + continue + } + t := v_1_0_0.Type + _ = v_1_0_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + if n != v_1_0_0.Args[_i1] { + continue + } + v_1_0_0_1 := v_1_0_0.Args[1^_i1] + if v_1_0_0_1.Op != OpRsh32Ux64 || v_1_0_0_1.Type != t { + continue + } + _ = v_1_0_0_1.Args[1] + v_1_0_0_1_0 := v_1_0_0_1.Args[0] + if v_1_0_0_1_0.Op != OpRsh32x64 || v_1_0_0_1_0.Type != t { + continue + } + _ = v_1_0_0_1_0.Args[1] + if n != v_1_0_0_1_0.Args[0] { + continue + } + v_1_0_0_1_0_1 := v_1_0_0_1_0.Args[1] + if v_1_0_0_1_0_1.Op != OpConst64 || v_1_0_0_1_0_1.Type != typ.UInt64 || v_1_0_0_1_0_1.AuxInt != 31 { + continue + } + v_1_0_0_1_1 := v_1_0_0_1.Args[1] + if v_1_0_0_1_1.Op != OpConst64 || v_1_0_0_1_1.Type != typ.UInt64 { + continue + } + kbar := v_1_0_0_1_1.AuxInt + v_1_0_1 := v_1_0.Args[1] + if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 { + continue + } + k := v_1_0_1.AuxInt + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || v_1_1.AuxInt != k || !(k > 0 && k < 31 && kbar == 32-k) { + continue + } + v.reset(OpEq32) + v0 := b.NewValue0(v.Pos, OpAnd32, t) + v0.AddArg(n) + v1 := b.NewValue0(v.Pos, OpConst32, t) + v1.AuxInt = int64(1< x (Const32 [y])) (Const32 [y])) + // cond: isPowerOfTwo(y) + // result: (Neq32 (And32 x (Const32 [y])) (Const32 [0])) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAnd32 { + continue + } + t := v_0.Type + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + x := v_0.Args[_i1] + v_0_1 := v_0.Args[1^_i1] + if v_0_1.Op != OpConst32 || v_0_1.Type != t { + continue + } + y := v_0_1.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst32 || v_1.Type != t || v_1.AuxInt != y || !(isPowerOfTwo(y)) { + continue + } + v.reset(OpNeq32) + v0 := b.NewValue0(v.Pos, OpAnd32, t) + v0.AddArg(x) + v1 := b.NewValue0(v.Pos, OpConst32, t) + v1.AuxInt = y + v0.AddArg(v1) + v.AddArg(v0) + v2 := b.NewValue0(v.Pos, OpConst32, t) + v2.AuxInt = 0 + v.AddArg(v2) + return true + } } - c := v_1.AuxInt - v.reset(OpAnd32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c & d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } return false } -func rewriteValuegeneric_OpAnd64_0(v *Value) bool { - // match: (And64 (Const64 [c]) (Const64 [d])) - // result: (Const64 [c&d]) +func rewriteValuegeneric_OpEq32F_0(v *Value) bool { + // match: (Eq32F (Const32F [c]) (Const32F [d])) + // result: (ConstBool [b2i(auxTo32F(c) == auxTo32F(d))]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32F { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst32F { + continue + } + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(auxTo32F(c) == auxTo32F(d)) + return true } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { + break + } + return false +} +func rewriteValuegeneric_OpEq64_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (Eq64 x x) + // result: (ConstBool [1]) + for { + x := v.Args[1] + if x != v.Args[0] { break } - d := v_1.AuxInt - v.reset(OpConst64) - v.AuxInt = c & d + v.reset(OpConstBool) + v.AuxInt = 1 return true } - // match: (And64 (Const64 [d]) (Const64 [c])) - // result: (Const64 [c&d]) + // match: (Eq64 (Const64 [c]) (Add64 (Const64 [d]) x)) + // result: (Eq64 (Const64 [c-d]) x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpAdd64 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst64 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpEq64) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = c - d + v.AddArg(v0) + v.AddArg(x) + return true + } } - c := v_1.AuxInt - v.reset(OpConst64) - v.AuxInt = c & d - return true + break } - // match: (And64 (Const64 [m]) (Rsh64Ux64 _ (Const64 [c]))) - // cond: c >= 64-ntz(m) - // result: (Const64 [0]) + // match: (Eq64 (Const64 [c]) (Const64 [d])) + // result: (ConstBool [b2i(c == d)]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - m := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpRsh64Ux64 { - break - } - _ = v_1.Args[1] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 { - break - } - c := v_1_1.AuxInt - if !(c >= 64-ntz(m)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst64 { + continue + } + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c == d) + return true } - v.reset(OpConst64) - v.AuxInt = 0 - return true + break } - // match: (And64 (Rsh64Ux64 _ (Const64 [c])) (Const64 [m])) - // cond: c >= 64-ntz(m) - // result: (Const64 [0]) + // match: (Eq64 x (Mul64 (Const64 [c]) (Rsh64Ux64 mul:(Hmul64u (Const64 [m]) x) (Const64 [s])) ) ) + // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+umagic(64,c).m/2) && s == umagic(64,c).s-1 && x.Op != OpConst64 && udivisibleOK(64,c) + // result: (Leq64U (RotateLeft64 (Mul64 (Const64 [int64(udivisible(64,c).m)]) x) (Const64 [int64(64-udivisible(64,c).k)]) ) (Const64 [int64(udivisible(64,c).max)]) ) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpRsh64Ux64 { - break - } - _ = v_0.Args[1] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - m := v_1.AuxInt - if !(c >= 64-ntz(m)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMul64 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst64 { + continue + } + c := v_1_0.AuxInt + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpRsh64Ux64 { + continue + } + _ = v_1_1.Args[1] + mul := v_1_1.Args[0] + if mul.Op != OpHmul64u { + continue + } + _ = mul.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + mul_0 := mul.Args[_i2] + if mul_0.Op != OpConst64 { + continue + } + m := mul_0.AuxInt + if x != mul.Args[1^_i2] { + continue + } + v_1_1_1 := v_1_1.Args[1] + if v_1_1_1.Op != OpConst64 { + continue + } + s := v_1_1_1.AuxInt + if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+umagic(64, c).m/2) && s == umagic(64, c).s-1 && x.Op != OpConst64 && udivisibleOK(64, c)) { + continue + } + v.reset(OpLeq64U) + v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) + v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) + v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v2.AuxInt = int64(udivisible(64, c).m) + v1.AddArg(v2) + v1.AddArg(x) + v0.AddArg(v1) + v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v3.AuxInt = int64(64 - udivisible(64, c).k) + v0.AddArg(v3) + v.AddArg(v0) + v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v4.AuxInt = int64(udivisible(64, c).max) + v.AddArg(v4) + return true + } + } } - v.reset(OpConst64) - v.AuxInt = 0 - return true + break } - // match: (And64 (Const64 [m]) (Lsh64x64 _ (Const64 [c]))) - // cond: c >= 64-nlz(m) - // result: (Const64 [0]) + // match: (Eq64 x (Mul64 (Const64 [c]) (Rsh64Ux64 mul:(Hmul64u (Const64 [m]) (Rsh64Ux64 x (Const64 [1]))) (Const64 [s])) ) ) + // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+(umagic(64,c).m+1)/2) && s == umagic(64,c).s-2 && x.Op != OpConst64 && udivisibleOK(64,c) + // result: (Leq64U (RotateLeft64 (Mul64 (Const64 [int64(udivisible(64,c).m)]) x) (Const64 [int64(64-udivisible(64,c).k)]) ) (Const64 [int64(udivisible(64,c).max)]) ) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - m := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpLsh64x64 { - break - } - _ = v_1.Args[1] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 { - break - } - c := v_1_1.AuxInt - if !(c >= 64-nlz(m)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMul64 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst64 { + continue + } + c := v_1_0.AuxInt + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpRsh64Ux64 { + continue + } + _ = v_1_1.Args[1] + mul := v_1_1.Args[0] + if mul.Op != OpHmul64u { + continue + } + _ = mul.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + mul_0 := mul.Args[_i2] + if mul_0.Op != OpConst64 { + continue + } + m := mul_0.AuxInt + mul_1 := mul.Args[1^_i2] + if mul_1.Op != OpRsh64Ux64 { + continue + } + _ = mul_1.Args[1] + if x != mul_1.Args[0] { + continue + } + mul_1_1 := mul_1.Args[1] + if mul_1_1.Op != OpConst64 || mul_1_1.AuxInt != 1 { + continue + } + v_1_1_1 := v_1_1.Args[1] + if v_1_1_1.Op != OpConst64 { + continue + } + s := v_1_1_1.AuxInt + if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+(umagic(64, c).m+1)/2) && s == umagic(64, c).s-2 && x.Op != OpConst64 && udivisibleOK(64, c)) { + continue + } + v.reset(OpLeq64U) + v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) + v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) + v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v2.AuxInt = int64(udivisible(64, c).m) + v1.AddArg(v2) + v1.AddArg(x) + v0.AddArg(v1) + v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v3.AuxInt = int64(64 - udivisible(64, c).k) + v0.AddArg(v3) + v.AddArg(v0) + v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v4.AuxInt = int64(udivisible(64, c).max) + v.AddArg(v4) + return true + } + } } - v.reset(OpConst64) - v.AuxInt = 0 - return true + break } - // match: (And64 (Lsh64x64 _ (Const64 [c])) (Const64 [m])) - // cond: c >= 64-nlz(m) - // result: (Const64 [0]) + // match: (Eq64 x (Mul64 (Const64 [c]) (Rsh64Ux64 (Avg64u x mul:(Hmul64u (Const64 [m]) x)) (Const64 [s])) ) ) + // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(64,c).m) && s == umagic(64,c).s-1 && x.Op != OpConst64 && udivisibleOK(64,c) + // result: (Leq64U (RotateLeft64 (Mul64 (Const64 [int64(udivisible(64,c).m)]) x) (Const64 [int64(64-udivisible(64,c).k)]) ) (Const64 [int64(udivisible(64,c).max)]) ) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh64x64 { - break - } - _ = v_0.Args[1] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - m := v_1.AuxInt - if !(c >= 64-nlz(m)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMul64 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst64 { + continue + } + c := v_1_0.AuxInt + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpRsh64Ux64 { + continue + } + _ = v_1_1.Args[1] + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpAvg64u { + continue + } + _ = v_1_1_0.Args[1] + if x != v_1_1_0.Args[0] { + continue + } + mul := v_1_1_0.Args[1] + if mul.Op != OpHmul64u { + continue + } + _ = mul.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + mul_0 := mul.Args[_i2] + if mul_0.Op != OpConst64 { + continue + } + m := mul_0.AuxInt + if x != mul.Args[1^_i2] { + continue + } + v_1_1_1 := v_1_1.Args[1] + if v_1_1_1.Op != OpConst64 { + continue + } + s := v_1_1_1.AuxInt + if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(64, c).m) && s == umagic(64, c).s-1 && x.Op != OpConst64 && udivisibleOK(64, c)) { + continue + } + v.reset(OpLeq64U) + v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) + v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) + v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v2.AuxInt = int64(udivisible(64, c).m) + v1.AddArg(v2) + v1.AddArg(x) + v0.AddArg(v1) + v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v3.AuxInt = int64(64 - udivisible(64, c).k) + v0.AddArg(v3) + v.AddArg(v0) + v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v4.AuxInt = int64(udivisible(64, c).max) + v.AddArg(v4) + return true + } + } } - v.reset(OpConst64) - v.AuxInt = 0 - return true + break } - // match: (And64 x x) - // result: x + // match: (Eq64 x (Mul64 (Const64 [c]) (Sub64 (Rsh64x64 mul:(Hmul64 (Const64 [m]) x) (Const64 [s])) (Rsh64x64 x (Const64 [63]))) ) ) + // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64,c).m/2) && s == smagic(64,c).s-1 && x.Op != OpConst64 && sdivisibleOK(64,c) + // result: (Leq64U (RotateLeft64 (Add64 (Mul64 (Const64 [int64(sdivisible(64,c).m)]) x) (Const64 [int64(sdivisible(64,c).a)]) ) (Const64 [int64(64-sdivisible(64,c).k)]) ) (Const64 [int64(sdivisible(64,c).max)]) ) for { - x := v.Args[1] - if x != v.Args[0] { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMul64 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst64 { + continue + } + c := v_1_0.AuxInt + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpSub64 { + continue + } + _ = v_1_1.Args[1] + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpRsh64x64 { + continue + } + _ = v_1_1_0.Args[1] + mul := v_1_1_0.Args[0] + if mul.Op != OpHmul64 { + continue + } + _ = mul.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + mul_0 := mul.Args[_i2] + if mul_0.Op != OpConst64 { + continue + } + m := mul_0.AuxInt + if x != mul.Args[1^_i2] { + continue + } + v_1_1_0_1 := v_1_1_0.Args[1] + if v_1_1_0_1.Op != OpConst64 { + continue + } + s := v_1_1_0_1.AuxInt + v_1_1_1 := v_1_1.Args[1] + if v_1_1_1.Op != OpRsh64x64 { + continue + } + _ = v_1_1_1.Args[1] + if x != v_1_1_1.Args[0] { + continue + } + v_1_1_1_1 := v_1_1_1.Args[1] + if v_1_1_1_1.Op != OpConst64 || v_1_1_1_1.AuxInt != 63 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64, c).m/2) && s == smagic(64, c).s-1 && x.Op != OpConst64 && sdivisibleOK(64, c)) { + continue + } + v.reset(OpLeq64U) + v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) + v1 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64) + v2 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) + v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v3.AuxInt = int64(sdivisible(64, c).m) + v2.AddArg(v3) + v2.AddArg(x) + v1.AddArg(v2) + v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v4.AuxInt = int64(sdivisible(64, c).a) + v1.AddArg(v4) + v0.AddArg(v1) + v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v5.AuxInt = int64(64 - sdivisible(64, c).k) + v0.AddArg(v5) + v.AddArg(v0) + v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v6.AuxInt = int64(sdivisible(64, c).max) + v.AddArg(v6) + return true + } + } } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true + break } - // match: (And64 (Const64 [-1]) x) - // result: x + // match: (Eq64 x (Mul64 (Const64 [c]) (Sub64 (Rsh64x64 (Add64 mul:(Hmul64 (Const64 [m]) x) x) (Const64 [s])) (Rsh64x64 x (Const64 [63]))) ) ) + // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64,c).m) && s == smagic(64,c).s && x.Op != OpConst64 && sdivisibleOK(64,c) + // result: (Leq64U (RotateLeft64 (Add64 (Mul64 (Const64 [int64(sdivisible(64,c).m)]) x) (Const64 [int64(sdivisible(64,c).a)]) ) (Const64 [int64(64-sdivisible(64,c).k)]) ) (Const64 [int64(sdivisible(64,c).max)]) ) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 || v_0.AuxInt != -1 { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMul64 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst64 { + continue + } + c := v_1_0.AuxInt + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpSub64 { + continue + } + _ = v_1_1.Args[1] + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpRsh64x64 { + continue + } + _ = v_1_1_0.Args[1] + v_1_1_0_0 := v_1_1_0.Args[0] + if v_1_1_0_0.Op != OpAdd64 { + continue + } + _ = v_1_1_0_0.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + mul := v_1_1_0_0.Args[_i2] + if mul.Op != OpHmul64 { + continue + } + _ = mul.Args[1] + for _i3 := 0; _i3 <= 1; _i3++ { + mul_0 := mul.Args[_i3] + if mul_0.Op != OpConst64 { + continue + } + m := mul_0.AuxInt + if x != mul.Args[1^_i3] || x != v_1_1_0_0.Args[1^_i2] { + continue + } + v_1_1_0_1 := v_1_1_0.Args[1] + if v_1_1_0_1.Op != OpConst64 { + continue + } + s := v_1_1_0_1.AuxInt + v_1_1_1 := v_1_1.Args[1] + if v_1_1_1.Op != OpRsh64x64 { + continue + } + _ = v_1_1_1.Args[1] + if x != v_1_1_1.Args[0] { + continue + } + v_1_1_1_1 := v_1_1_1.Args[1] + if v_1_1_1_1.Op != OpConst64 || v_1_1_1_1.AuxInt != 63 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64, c).m) && s == smagic(64, c).s && x.Op != OpConst64 && sdivisibleOK(64, c)) { + continue + } + v.reset(OpLeq64U) + v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) + v1 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64) + v2 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) + v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v3.AuxInt = int64(sdivisible(64, c).m) + v2.AddArg(v3) + v2.AddArg(x) + v1.AddArg(v2) + v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v4.AuxInt = int64(sdivisible(64, c).a) + v1.AddArg(v4) + v0.AddArg(v1) + v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v5.AuxInt = int64(64 - sdivisible(64, c).k) + v0.AddArg(v5) + v.AddArg(v0) + v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v6.AuxInt = int64(sdivisible(64, c).max) + v.AddArg(v6) + return true + } + } + } } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true + break } - // match: (And64 x (Const64 [-1])) - // result: x + // match: (Eq64 n (Lsh64x64 (Rsh64x64 (Add64 n (Rsh64Ux64 (Rsh64x64 n (Const64 [63])) (Const64 [kbar]))) (Const64 [k])) (Const64 [k])) ) + // cond: k > 0 && k < 63 && kbar == 64 - k + // result: (Eq64 (And64 n (Const64 [int64(1< [0])) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != -1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + n := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpLsh64x64 { + continue + } + _ = v_1.Args[1] + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpRsh64x64 { + continue + } + _ = v_1_0.Args[1] + v_1_0_0 := v_1_0.Args[0] + if v_1_0_0.Op != OpAdd64 { + continue + } + t := v_1_0_0.Type + _ = v_1_0_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + if n != v_1_0_0.Args[_i1] { + continue + } + v_1_0_0_1 := v_1_0_0.Args[1^_i1] + if v_1_0_0_1.Op != OpRsh64Ux64 || v_1_0_0_1.Type != t { + continue + } + _ = v_1_0_0_1.Args[1] + v_1_0_0_1_0 := v_1_0_0_1.Args[0] + if v_1_0_0_1_0.Op != OpRsh64x64 || v_1_0_0_1_0.Type != t { + continue + } + _ = v_1_0_0_1_0.Args[1] + if n != v_1_0_0_1_0.Args[0] { + continue + } + v_1_0_0_1_0_1 := v_1_0_0_1_0.Args[1] + if v_1_0_0_1_0_1.Op != OpConst64 || v_1_0_0_1_0_1.Type != typ.UInt64 || v_1_0_0_1_0_1.AuxInt != 63 { + continue + } + v_1_0_0_1_1 := v_1_0_0_1.Args[1] + if v_1_0_0_1_1.Op != OpConst64 || v_1_0_0_1_1.Type != typ.UInt64 { + continue + } + kbar := v_1_0_0_1_1.AuxInt + v_1_0_1 := v_1_0.Args[1] + if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 { + continue + } + k := v_1_0_1.AuxInt + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || v_1_1.AuxInt != k || !(k > 0 && k < 63 && kbar == 64-k) { + continue + } + v.reset(OpEq64) + v0 := b.NewValue0(v.Pos, OpAnd64, t) + v0.AddArg(n) + v1 := b.NewValue0(v.Pos, OpConst64, t) + v1.AuxInt = int64(1< x (Const64 [y])) (Const64 [y])) + // cond: isPowerOfTwo(y) + // result: (Neq64 (And64 x (Const64 [y])) (Const64 [0])) for { _ = v.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 0 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAnd64 { + continue + } + t := v_0.Type + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + x := v_0.Args[_i1] + v_0_1 := v_0.Args[1^_i1] + if v_0_1.Op != OpConst64 || v_0_1.Type != t { + continue + } + y := v_0_1.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst64 || v_1.Type != t || v_1.AuxInt != y || !(isPowerOfTwo(y)) { + continue + } + v.reset(OpNeq64) + v0 := b.NewValue0(v.Pos, OpAnd64, t) + v0.AddArg(x) + v1 := b.NewValue0(v.Pos, OpConst64, t) + v1.AuxInt = y + v0.AddArg(v1) + v.AddArg(v0) + v2 := b.NewValue0(v.Pos, OpConst64, t) + v2.AuxInt = 0 + v.AddArg(v2) + return true + } } - v.reset(OpConst64) - v.AuxInt = 0 - return true + break } - // match: (And64 x (And64 x y)) - // result: (And64 x y) + return false +} +func rewriteValuegeneric_OpEq64F_0(v *Value) bool { + // match: (Eq64F (Const64F [c]) (Const64F [d])) + // result: (ConstBool [b2i(auxTo64F(c) == auxTo64F(d))]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAnd64 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64F { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst64F { + continue + } + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(auxTo64F(c) == auxTo64F(d)) + return true } - y := v_1.Args[1] - if x != v_1.Args[0] { + break + } + return false +} +func rewriteValuegeneric_OpEq8_0(v *Value) bool { + b := v.Block + config := b.Func.Config + typ := &b.Func.Config.Types + // match: (Eq8 x x) + // result: (ConstBool [1]) + for { + x := v.Args[1] + if x != v.Args[0] { break } - v.reset(OpAnd64) - v.AddArg(x) - v.AddArg(y) + v.reset(OpConstBool) + v.AuxInt = 1 return true } - // match: (And64 x (And64 y x)) - // result: (And64 x y) + // match: (Eq8 (Const8 [c]) (Add8 (Const8 [d]) x)) + // result: (Eq8 (Const8 [int64(int8(c-d))]) x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAnd64 { - break - } - _ = v_1.Args[1] - y := v_1.Args[0] - if x != v_1.Args[1] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst8 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpAdd8 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst8 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpEq8) + v0 := b.NewValue0(v.Pos, OpConst8, t) + v0.AuxInt = int64(int8(c - d)) + v.AddArg(v0) + v.AddArg(x) + return true + } } - v.reset(OpAnd64) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (And64 (And64 x y) x) - // result: (And64 x y) + // match: (Eq8 (Const8 [c]) (Const8 [d])) + // result: (ConstBool [b2i(c == d)]) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd64 { - break - } - y := v_0.Args[1] - if x != v_0.Args[0] { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst8 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst8 { + continue + } + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c == d) + return true } - v.reset(OpAnd64) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (And64 (And64 y x) x) - // result: (And64 x y) + // match: (Eq8 (Mod8u x (Const8 [c])) (Const8 [0])) + // cond: x.Op != OpConst8 && udivisibleOK(8,c) && !hasSmallRotate(config) + // result: (Eq32 (Mod32u (ZeroExt8to32 x) (Const32 [c&0xff])) (Const32 [0])) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd64 { - break - } - _ = v_0.Args[1] - y := v_0.Args[0] - if x != v_0.Args[1] { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpMod8u { + continue + } + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst8 { + continue + } + c := v_0_1.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst8 || v_1.AuxInt != 0 || !(x.Op != OpConst8 && udivisibleOK(8, c) && !hasSmallRotate(config)) { + continue + } + v.reset(OpEq32) + v0 := b.NewValue0(v.Pos, OpMod32u, typ.UInt32) + v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) + v1.AddArg(x) + v0.AddArg(v1) + v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v2.AuxInt = c & 0xff + v0.AddArg(v2) + v.AddArg(v0) + v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) + v3.AuxInt = 0 + v.AddArg(v3) + return true } - v.reset(OpAnd64) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (And64 (And64 i:(Const64 ) z) x) - // cond: (z.Op != OpConst64 && x.Op != OpConst64) - // result: (And64 i (And64 z x)) + // match: (Eq8 (Mod8 x (Const8 [c])) (Const8 [0])) + // cond: x.Op != OpConst8 && sdivisibleOK(8,c) && !hasSmallRotate(config) + // result: (Eq32 (Mod32 (SignExt8to32 x) (Const32 [c])) (Const32 [0])) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd64 { - break - } - z := v_0.Args[1] - i := v_0.Args[0] - if i.Op != OpConst64 { - break - } - t := i.Type - if !(z.Op != OpConst64 && x.Op != OpConst64) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpMod8 { + continue + } + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst8 { + continue + } + c := v_0_1.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst8 || v_1.AuxInt != 0 || !(x.Op != OpConst8 && sdivisibleOK(8, c) && !hasSmallRotate(config)) { + continue + } + v.reset(OpEq32) + v0 := b.NewValue0(v.Pos, OpMod32, typ.Int32) + v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) + v1.AddArg(x) + v0.AddArg(v1) + v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32) + v2.AuxInt = c + v0.AddArg(v2) + v.AddArg(v0) + v3 := b.NewValue0(v.Pos, OpConst32, typ.Int32) + v3.AuxInt = 0 + v.AddArg(v3) + return true } - v.reset(OpAnd64) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAnd64, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (And64 (And64 z i:(Const64 )) x) - // cond: (z.Op != OpConst64 && x.Op != OpConst64) - // result: (And64 i (And64 z x)) + // match: (Eq8 x (Mul8 (Const8 [c]) (Trunc32to8 (Rsh32Ux64 mul:(Mul32 (Const32 [m]) (ZeroExt8to32 x)) (Const64 [s]))) ) ) + // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<8+umagic(8,c).m) && s == 8+umagic(8,c).s && x.Op != OpConst8 && udivisibleOK(8,c) + // result: (Leq8U (RotateLeft8 (Mul8 (Const8 [int64(int8(udivisible(8,c).m))]) x) (Const8 [int64(8-udivisible(8,c).k)]) ) (Const8 [int64(int8(udivisible(8,c).max))]) ) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd64 { - break - } - _ = v_0.Args[1] - z := v_0.Args[0] - i := v_0.Args[1] - if i.Op != OpConst64 { - break - } - t := i.Type - if !(z.Op != OpConst64 && x.Op != OpConst64) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMul8 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst8 { + continue + } + c := v_1_0.AuxInt + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpTrunc32to8 { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpRsh32Ux64 { + continue + } + _ = v_1_1_0.Args[1] + mul := v_1_1_0.Args[0] + if mul.Op != OpMul32 { + continue + } + _ = mul.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + mul_0 := mul.Args[_i2] + if mul_0.Op != OpConst32 { + continue + } + m := mul_0.AuxInt + mul_1 := mul.Args[1^_i2] + if mul_1.Op != OpZeroExt8to32 || x != mul_1.Args[0] { + continue + } + v_1_1_0_1 := v_1_1_0.Args[1] + if v_1_1_0_1.Op != OpConst64 { + continue + } + s := v_1_1_0_1.AuxInt + if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<8+umagic(8, c).m) && s == 8+umagic(8, c).s && x.Op != OpConst8 && udivisibleOK(8, c)) { + continue + } + v.reset(OpLeq8U) + v0 := b.NewValue0(v.Pos, OpRotateLeft8, typ.UInt8) + v1 := b.NewValue0(v.Pos, OpMul8, typ.UInt8) + v2 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) + v2.AuxInt = int64(int8(udivisible(8, c).m)) + v1.AddArg(v2) + v1.AddArg(x) + v0.AddArg(v1) + v3 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) + v3.AuxInt = int64(8 - udivisible(8, c).k) + v0.AddArg(v3) + v.AddArg(v0) + v4 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) + v4.AuxInt = int64(int8(udivisible(8, c).max)) + v.AddArg(v4) + return true + } + } } - v.reset(OpAnd64) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAnd64, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (And64 x (And64 i:(Const64 ) z)) - // cond: (z.Op != OpConst64 && x.Op != OpConst64) - // result: (And64 i (And64 z x)) + // match: (Eq8 x (Mul8 (Const8 [c]) (Sub8 (Rsh32x64 mul:(Mul32 (Const32 [m]) (SignExt8to32 x)) (Const64 [s])) (Rsh32x64 (SignExt8to32 x) (Const64 [31]))) ) ) + // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(8,c).m) && s == 8+smagic(8,c).s && x.Op != OpConst8 && sdivisibleOK(8,c) + // result: (Leq8U (RotateLeft8 (Add8 (Mul8 (Const8 [int64(int8(sdivisible(8,c).m))]) x) (Const8 [int64(int8(sdivisible(8,c).a))]) ) (Const8 [int64(8-sdivisible(8,c).k)]) ) (Const8 [int64(int8(sdivisible(8,c).max))]) ) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAnd64 { - break - } - z := v_1.Args[1] - i := v_1.Args[0] - if i.Op != OpConst64 { - break - } - t := i.Type - if !(z.Op != OpConst64 && x.Op != OpConst64) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpMul8 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst8 { + continue + } + c := v_1_0.AuxInt + v_1_1 := v_1.Args[1^_i1] + if v_1_1.Op != OpSub8 { + continue + } + _ = v_1_1.Args[1] + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpRsh32x64 { + continue + } + _ = v_1_1_0.Args[1] + mul := v_1_1_0.Args[0] + if mul.Op != OpMul32 { + continue + } + _ = mul.Args[1] + for _i2 := 0; _i2 <= 1; _i2++ { + mul_0 := mul.Args[_i2] + if mul_0.Op != OpConst32 { + continue + } + m := mul_0.AuxInt + mul_1 := mul.Args[1^_i2] + if mul_1.Op != OpSignExt8to32 || x != mul_1.Args[0] { + continue + } + v_1_1_0_1 := v_1_1_0.Args[1] + if v_1_1_0_1.Op != OpConst64 { + continue + } + s := v_1_1_0_1.AuxInt + v_1_1_1 := v_1_1.Args[1] + if v_1_1_1.Op != OpRsh32x64 { + continue + } + _ = v_1_1_1.Args[1] + v_1_1_1_0 := v_1_1_1.Args[0] + if v_1_1_1_0.Op != OpSignExt8to32 || x != v_1_1_1_0.Args[0] { + continue + } + v_1_1_1_1 := v_1_1_1.Args[1] + if v_1_1_1_1.Op != OpConst64 || v_1_1_1_1.AuxInt != 31 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(8, c).m) && s == 8+smagic(8, c).s && x.Op != OpConst8 && sdivisibleOK(8, c)) { + continue + } + v.reset(OpLeq8U) + v0 := b.NewValue0(v.Pos, OpRotateLeft8, typ.UInt8) + v1 := b.NewValue0(v.Pos, OpAdd8, typ.UInt8) + v2 := b.NewValue0(v.Pos, OpMul8, typ.UInt8) + v3 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) + v3.AuxInt = int64(int8(sdivisible(8, c).m)) + v2.AddArg(v3) + v2.AddArg(x) + v1.AddArg(v2) + v4 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) + v4.AuxInt = int64(int8(sdivisible(8, c).a)) + v1.AddArg(v4) + v0.AddArg(v1) + v5 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) + v5.AuxInt = int64(8 - sdivisible(8, c).k) + v0.AddArg(v5) + v.AddArg(v0) + v6 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) + v6.AuxInt = int64(int8(sdivisible(8, c).max)) + v.AddArg(v6) + return true + } + } } - v.reset(OpAnd64) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAnd64, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (And64 x (And64 z i:(Const64 ))) - // cond: (z.Op != OpConst64 && x.Op != OpConst64) - // result: (And64 i (And64 z x)) + // match: (Eq8 n (Lsh8x64 (Rsh8x64 (Add8 n (Rsh8Ux64 (Rsh8x64 n (Const64 [ 7])) (Const64 [kbar]))) (Const64 [k])) (Const64 [k])) ) + // cond: k > 0 && k < 7 && kbar == 8 - k + // result: (Eq8 (And8 n (Const8 [int64(1< [0])) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAnd64 { - break - } - _ = v_1.Args[1] - z := v_1.Args[0] - i := v_1.Args[1] - if i.Op != OpConst64 { - break - } - t := i.Type - if !(z.Op != OpConst64 && x.Op != OpConst64) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + n := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpLsh8x64 { + continue + } + _ = v_1.Args[1] + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpRsh8x64 { + continue + } + _ = v_1_0.Args[1] + v_1_0_0 := v_1_0.Args[0] + if v_1_0_0.Op != OpAdd8 { + continue + } + t := v_1_0_0.Type + _ = v_1_0_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + if n != v_1_0_0.Args[_i1] { + continue + } + v_1_0_0_1 := v_1_0_0.Args[1^_i1] + if v_1_0_0_1.Op != OpRsh8Ux64 || v_1_0_0_1.Type != t { + continue + } + _ = v_1_0_0_1.Args[1] + v_1_0_0_1_0 := v_1_0_0_1.Args[0] + if v_1_0_0_1_0.Op != OpRsh8x64 || v_1_0_0_1_0.Type != t { + continue + } + _ = v_1_0_0_1_0.Args[1] + if n != v_1_0_0_1_0.Args[0] { + continue + } + v_1_0_0_1_0_1 := v_1_0_0_1_0.Args[1] + if v_1_0_0_1_0_1.Op != OpConst64 || v_1_0_0_1_0_1.Type != typ.UInt64 || v_1_0_0_1_0_1.AuxInt != 7 { + continue + } + v_1_0_0_1_1 := v_1_0_0_1.Args[1] + if v_1_0_0_1_1.Op != OpConst64 || v_1_0_0_1_1.Type != typ.UInt64 { + continue + } + kbar := v_1_0_0_1_1.AuxInt + v_1_0_1 := v_1_0.Args[1] + if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 { + continue + } + k := v_1_0_1.AuxInt + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || v_1_1.AuxInt != k || !(k > 0 && k < 7 && kbar == 8-k) { + continue + } + v.reset(OpEq8) + v0 := b.NewValue0(v.Pos, OpAnd8, t) + v0.AddArg(n) + v1 := b.NewValue0(v.Pos, OpConst8, t) + v1.AuxInt = int64(1< [c]) (And64 (Const64 [d]) x)) - // result: (And64 (Const64 [c&d]) x) + // match: (Eq8 s:(Sub8 x y) (Const8 [0])) + // cond: s.Uses == 1 + // result: (Eq8 x y) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAnd64 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + s := v.Args[_i0] + if s.Op != OpSub8 { + continue + } + y := s.Args[1] + x := s.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst8 || v_1.AuxInt != 0 || !(s.Uses == 1) { + continue + } + v.reset(OpEq8) + v.AddArg(x) + v.AddArg(y) + return true } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst64 || v_1_0.Type != t { - break + break + } + // match: (Eq8 (And8 x (Const8 [y])) (Const8 [y])) + // cond: isPowerOfTwo(y) + // result: (Neq8 (And8 x (Const8 [y])) (Const8 [0])) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAnd8 { + continue + } + t := v_0.Type + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + x := v_0.Args[_i1] + v_0_1 := v_0.Args[1^_i1] + if v_0_1.Op != OpConst8 || v_0_1.Type != t { + continue + } + y := v_0_1.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst8 || v_1.Type != t || v_1.AuxInt != y || !(isPowerOfTwo(y)) { + continue + } + v.reset(OpNeq8) + v0 := b.NewValue0(v.Pos, OpAnd8, t) + v0.AddArg(x) + v1 := b.NewValue0(v.Pos, OpConst8, t) + v1.AuxInt = y + v0.AddArg(v1) + v.AddArg(v0) + v2 := b.NewValue0(v.Pos, OpConst8, t) + v2.AuxInt = 0 + v.AddArg(v2) + return true + } } - d := v_1_0.AuxInt - v.reset(OpAnd64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c & d - v.AddArg(v0) - v.AddArg(x) - return true + break } return false } -func rewriteValuegeneric_OpAnd64_20(v *Value) bool { - b := v.Block - // match: (And64 (Const64 [c]) (And64 x (Const64 [d]))) - // result: (And64 (Const64 [c&d]) x) +func rewriteValuegeneric_OpEqB_0(v *Value) bool { + // match: (EqB (ConstBool [c]) (ConstBool [d])) + // result: (ConstBool [b2i(c == d)]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAnd64 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != t { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConstBool { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConstBool { + continue + } + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c == d) + return true } - d := v_1_1.AuxInt - v.reset(OpAnd64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c & d - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (And64 (And64 (Const64 [d]) x) (Const64 [c])) - // result: (And64 (Const64 [c&d]) x) + // match: (EqB (ConstBool [0]) x) + // result: (Not x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd64 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConstBool || v_0.AuxInt != 0 { + continue + } + x := v.Args[1^_i0] + v.reset(OpNot) + v.AddArg(x) + return true } - t := v_0_0.Type - d := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpAnd64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c & d - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (And64 (And64 x (Const64 [d])) (Const64 [c])) - // result: (And64 (Const64 [c&d]) x) + // match: (EqB (ConstBool [1]) x) + // result: x for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd64 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - t := v_0_1.Type - d := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.Type != t { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConstBool || v_0.AuxInt != 1 { + continue + } + x := v.Args[1^_i0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - c := v_1.AuxInt - v.reset(OpAnd64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c & d + break + } + return false +} +func rewriteValuegeneric_OpEqInter_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (EqInter x y) + // result: (EqPtr (ITab x) (ITab y)) + for { + y := v.Args[1] + x := v.Args[0] + v.reset(OpEqPtr) + v0 := b.NewValue0(v.Pos, OpITab, typ.Uintptr) + v0.AddArg(x) v.AddArg(v0) - v.AddArg(x) + v1 := b.NewValue0(v.Pos, OpITab, typ.Uintptr) + v1.AddArg(y) + v.AddArg(v1) return true } - return false } -func rewriteValuegeneric_OpAnd8_0(v *Value) bool { - // match: (And8 (Const8 [c]) (Const8 [d])) - // result: (Const8 [int64(int8(c&d))]) +func rewriteValuegeneric_OpEqPtr_0(v *Value) bool { + // match: (EqPtr x x) + // result: (ConstBool [1]) for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 { + x := v.Args[1] + if x != v.Args[0] { break } - d := v_1.AuxInt - v.reset(OpConst8) - v.AuxInt = int64(int8(c & d)) + v.reset(OpConstBool) + v.AuxInt = 1 return true } - // match: (And8 (Const8 [d]) (Const8 [c])) - // result: (Const8 [int64(int8(c&d))]) + // match: (EqPtr (Addr {a} _) (Addr {b} _)) + // result: (ConstBool [b2i(a == b)]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAddr { + continue + } + a := v_0.Aux + v_1 := v.Args[1^_i0] + if v_1.Op != OpAddr { + continue + } + b := v_1.Aux + v.reset(OpConstBool) + v.AuxInt = b2i(a == b) + return true } - c := v_1.AuxInt - v.reset(OpConst8) - v.AuxInt = int64(int8(c & d)) - return true + break } - // match: (And8 (Const8 [m]) (Rsh8Ux64 _ (Const64 [c]))) - // cond: c >= 64-ntz(m) - // result: (Const8 [0]) + // match: (EqPtr (Addr {a} _) (OffPtr [o] (Addr {b} _))) + // result: (ConstBool [b2i(a == b && o == 0)]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - m := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpRsh8Ux64 { - break - } - _ = v_1.Args[1] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 { - break - } - c := v_1_1.AuxInt - if !(c >= 64-ntz(m)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAddr { + continue + } + a := v_0.Aux + v_1 := v.Args[1^_i0] + if v_1.Op != OpOffPtr { + continue + } + o := v_1.AuxInt + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpAddr { + continue + } + b := v_1_0.Aux + v.reset(OpConstBool) + v.AuxInt = b2i(a == b && o == 0) + return true } - v.reset(OpConst8) - v.AuxInt = 0 - return true + break } - // match: (And8 (Rsh8Ux64 _ (Const64 [c])) (Const8 [m])) - // cond: c >= 64-ntz(m) - // result: (Const8 [0]) + // match: (EqPtr (OffPtr [o1] (Addr {a} _)) (OffPtr [o2] (Addr {b} _))) + // result: (ConstBool [b2i(a == b && o1 == o2)]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpRsh8Ux64 { - break - } - _ = v_0.Args[1] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break - } - m := v_1.AuxInt - if !(c >= 64-ntz(m)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpOffPtr { + continue + } + o1 := v_0.AuxInt + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpAddr { + continue + } + a := v_0_0.Aux + v_1 := v.Args[1^_i0] + if v_1.Op != OpOffPtr { + continue + } + o2 := v_1.AuxInt + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpAddr { + continue + } + b := v_1_0.Aux + v.reset(OpConstBool) + v.AuxInt = b2i(a == b && o1 == o2) + return true } - v.reset(OpConst8) - v.AuxInt = 0 - return true + break } - // match: (And8 (Const8 [m]) (Lsh8x64 _ (Const64 [c]))) - // cond: c >= 64-nlz(m) - // result: (Const8 [0]) + // match: (EqPtr (LocalAddr {a} _ _) (LocalAddr {b} _ _)) + // result: (ConstBool [b2i(a == b)]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - m := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpLsh8x64 { - break - } - _ = v_1.Args[1] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 { - break - } - c := v_1_1.AuxInt - if !(c >= 64-nlz(m)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpLocalAddr { + continue + } + a := v_0.Aux + _ = v_0.Args[1] + v_1 := v.Args[1^_i0] + if v_1.Op != OpLocalAddr { + continue + } + b := v_1.Aux + _ = v_1.Args[1] + v.reset(OpConstBool) + v.AuxInt = b2i(a == b) + return true } - v.reset(OpConst8) - v.AuxInt = 0 - return true + break } - // match: (And8 (Lsh8x64 _ (Const64 [c])) (Const8 [m])) - // cond: c >= 64-nlz(m) - // result: (Const8 [0]) + // match: (EqPtr (LocalAddr {a} _ _) (OffPtr [o] (LocalAddr {b} _ _))) + // result: (ConstBool [b2i(a == b && o == 0)]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh8x64 { - break - } - _ = v_0.Args[1] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break - } - m := v_1.AuxInt - if !(c >= 64-nlz(m)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpLocalAddr { + continue + } + a := v_0.Aux + _ = v_0.Args[1] + v_1 := v.Args[1^_i0] + if v_1.Op != OpOffPtr { + continue + } + o := v_1.AuxInt + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpLocalAddr { + continue + } + b := v_1_0.Aux + _ = v_1_0.Args[1] + v.reset(OpConstBool) + v.AuxInt = b2i(a == b && o == 0) + return true } - v.reset(OpConst8) - v.AuxInt = 0 - return true + break } - // match: (And8 x x) - // result: x + // match: (EqPtr (OffPtr [o1] (LocalAddr {a} _ _)) (OffPtr [o2] (LocalAddr {b} _ _))) + // result: (ConstBool [b2i(a == b && o1 == o2)]) for { - x := v.Args[1] - if x != v.Args[0] { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpOffPtr { + continue + } + o1 := v_0.AuxInt + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpLocalAddr { + continue + } + a := v_0_0.Aux + _ = v_0_0.Args[1] + v_1 := v.Args[1^_i0] + if v_1.Op != OpOffPtr { + continue + } + o2 := v_1.AuxInt + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpLocalAddr { + continue + } + b := v_1_0.Aux + _ = v_1_0.Args[1] + v.reset(OpConstBool) + v.AuxInt = b2i(a == b && o1 == o2) + return true } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true + break } - // match: (And8 (Const8 [-1]) x) - // result: x + // match: (EqPtr (OffPtr [o1] p1) p2) + // cond: isSamePtr(p1, p2) + // result: (ConstBool [b2i(o1 == 0)]) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 || v_0.AuxInt != -1 { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpOffPtr { + continue + } + o1 := v_0.AuxInt + p1 := v_0.Args[0] + p2 := v.Args[1^_i0] + if !(isSamePtr(p1, p2)) { + continue + } + v.reset(OpConstBool) + v.AuxInt = b2i(o1 == 0) + return true } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true + break } - // match: (And8 x (Const8 [-1])) - // result: x + // match: (EqPtr (OffPtr [o1] p1) (OffPtr [o2] p2)) + // cond: isSamePtr(p1, p2) + // result: (ConstBool [b2i(o1 == o2)]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.AuxInt != -1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpOffPtr { + continue + } + o1 := v_0.AuxInt + p1 := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpOffPtr { + continue + } + o2 := v_1.AuxInt + p2 := v_1.Args[0] + if !(isSamePtr(p1, p2)) { + continue + } + v.reset(OpConstBool) + v.AuxInt = b2i(o1 == o2) + return true } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true + break } - // match: (And8 (Const8 [0]) _) - // result: (Const8 [0]) + // match: (EqPtr (Const32 [c]) (Const32 [d])) + // result: (ConstBool [b2i(c == d)]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 || v_0.AuxInt != 0 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst32 { + continue + } + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c == d) + return true } - v.reset(OpConst8) - v.AuxInt = 0 - return true + break } return false } -func rewriteValuegeneric_OpAnd8_10(v *Value) bool { +func rewriteValuegeneric_OpEqPtr_10(v *Value) bool { b := v.Block - // match: (And8 _ (Const8 [0])) - // result: (Const8 [0]) + typ := &b.Func.Config.Types + // match: (EqPtr (Const64 [c]) (Const64 [d])) + // result: (ConstBool [b2i(c == d)]) for { _ = v.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.AuxInt != 0 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst64 { + continue + } + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c == d) + return true } - v.reset(OpConst8) - v.AuxInt = 0 - return true + break } - // match: (And8 x (And8 x y)) - // result: (And8 x y) + // match: (EqPtr (LocalAddr _ _) (Addr _)) + // result: (ConstBool [0]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAnd8 { - break - } - y := v_1.Args[1] - if x != v_1.Args[0] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpLocalAddr { + continue + } + _ = v_0.Args[1] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAddr { + continue + } + v.reset(OpConstBool) + v.AuxInt = 0 + return true } - v.reset(OpAnd8) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (And8 x (And8 y x)) - // result: (And8 x y) + // match: (EqPtr (OffPtr (LocalAddr _ _)) (Addr _)) + // result: (ConstBool [0]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAnd8 { - break - } - _ = v_1.Args[1] - y := v_1.Args[0] - if x != v_1.Args[1] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpOffPtr { + continue + } + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpLocalAddr { + continue + } + _ = v_0_0.Args[1] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAddr { + continue + } + v.reset(OpConstBool) + v.AuxInt = 0 + return true } - v.reset(OpAnd8) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (And8 (And8 x y) x) - // result: (And8 x y) + // match: (EqPtr (LocalAddr _ _) (OffPtr (Addr _))) + // result: (ConstBool [0]) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd8 { - break - } - y := v_0.Args[1] - if x != v_0.Args[0] { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpLocalAddr { + continue + } + _ = v_0.Args[1] + v_1 := v.Args[1^_i0] + if v_1.Op != OpOffPtr { + continue + } + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpAddr { + continue + } + v.reset(OpConstBool) + v.AuxInt = 0 + return true } - v.reset(OpAnd8) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (And8 (And8 y x) x) - // result: (And8 x y) + // match: (EqPtr (OffPtr (LocalAddr _ _)) (OffPtr (Addr _))) + // result: (ConstBool [0]) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd8 { - break - } - _ = v_0.Args[1] - y := v_0.Args[0] - if x != v_0.Args[1] { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpOffPtr { + continue + } + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpLocalAddr { + continue + } + _ = v_0_0.Args[1] + v_1 := v.Args[1^_i0] + if v_1.Op != OpOffPtr { + continue + } + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpAddr { + continue + } + v.reset(OpConstBool) + v.AuxInt = 0 + return true } - v.reset(OpAnd8) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (And8 (And8 i:(Const8 ) z) x) - // cond: (z.Op != OpConst8 && x.Op != OpConst8) - // result: (And8 i (And8 z x)) + // match: (EqPtr (AddPtr p1 o1) p2) + // cond: isSamePtr(p1, p2) + // result: (Not (IsNonNil o1)) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd8 { - break - } - z := v_0.Args[1] - i := v_0.Args[0] - if i.Op != OpConst8 { - break - } - t := i.Type - if !(z.Op != OpConst8 && x.Op != OpConst8) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAddPtr { + continue + } + o1 := v_0.Args[1] + p1 := v_0.Args[0] + p2 := v.Args[1^_i0] + if !(isSamePtr(p1, p2)) { + continue + } + v.reset(OpNot) + v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool) + v0.AddArg(o1) + v.AddArg(v0) + return true } - v.reset(OpAnd8) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAnd8, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (And8 (And8 z i:(Const8 )) x) - // cond: (z.Op != OpConst8 && x.Op != OpConst8) - // result: (And8 i (And8 z x)) + // match: (EqPtr (Const32 [0]) p) + // result: (Not (IsNonNil p)) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd8 { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 || v_0.AuxInt != 0 { + continue + } + p := v.Args[1^_i0] + v.reset(OpNot) + v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool) + v0.AddArg(p) + v.AddArg(v0) + return true } - _ = v_0.Args[1] - z := v_0.Args[0] - i := v_0.Args[1] - if i.Op != OpConst8 { - break + break + } + // match: (EqPtr (Const64 [0]) p) + // result: (Not (IsNonNil p)) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 || v_0.AuxInt != 0 { + continue + } + p := v.Args[1^_i0] + v.reset(OpNot) + v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool) + v0.AddArg(p) + v.AddArg(v0) + return true } - t := i.Type - if !(z.Op != OpConst8 && x.Op != OpConst8) { - break + break + } + // match: (EqPtr (ConstNil) p) + // result: (Not (IsNonNil p)) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConstNil { + continue + } + p := v.Args[1^_i0] + v.reset(OpNot) + v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool) + v0.AddArg(p) + v.AddArg(v0) + return true } - v.reset(OpAnd8) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAnd8, t) - v0.AddArg(z) + break + } + return false +} +func rewriteValuegeneric_OpEqSlice_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (EqSlice x y) + // result: (EqPtr (SlicePtr x) (SlicePtr y)) + for { + y := v.Args[1] + x := v.Args[0] + v.reset(OpEqPtr) + v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) v0.AddArg(x) v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) + v1.AddArg(y) + v.AddArg(v1) return true } - // match: (And8 x (And8 i:(Const8 ) z)) - // cond: (z.Op != OpConst8 && x.Op != OpConst8) - // result: (And8 i (And8 z x)) +} +func rewriteValuegeneric_OpGeq16_0(v *Value) bool { + // match: (Geq16 (Const16 [c]) (Const16 [d])) + // result: (ConstBool [b2i(c >= d)]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAnd8 { - break - } - z := v_1.Args[1] - i := v_1.Args[0] - if i.Op != OpConst8 { + v_0 := v.Args[0] + if v_0.Op != OpConst16 { break } - t := i.Type - if !(z.Op != OpConst8 && x.Op != OpConst8) { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst16 { break } - v.reset(OpAnd8) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAnd8, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c >= d) return true } - // match: (And8 x (And8 z i:(Const8 ))) - // cond: (z.Op != OpConst8 && x.Op != OpConst8) - // result: (And8 i (And8 z x)) + // match: (Geq16 (And16 _ (Const16 [c])) (Const16 [0])) + // cond: int16(c) >= 0 + // result: (ConstBool [1]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAnd8 { - break - } - _ = v_1.Args[1] - z := v_1.Args[0] - i := v_1.Args[1] - if i.Op != OpConst8 { + v_0 := v.Args[0] + if v_0.Op != OpAnd16 { break } - t := i.Type - if !(z.Op != OpConst8 && x.Op != OpConst8) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_1 := v_0.Args[1^_i0] + if v_0_1.Op != OpConst16 { + continue + } + c := v_0_1.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst16 || v_1.AuxInt != 0 || !(int16(c) >= 0) { + continue + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true } - v.reset(OpAnd8) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpAnd8, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (And8 (Const8 [c]) (And8 (Const8 [d]) x)) - // result: (And8 (Const8 [int64(int8(c&d))]) x) + return false +} +func rewriteValuegeneric_OpGeq16U_0(v *Value) bool { + // match: (Geq16U (Const16 [c]) (Const16 [d])) + // result: (ConstBool [b2i(uint16(c) >= uint16(d))]) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst8 { + if v_0.Op != OpConst16 { break } - t := v_0.Type c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpAnd8 { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst8 || v_1_0.Type != t { + if v_1.Op != OpConst16 { break } - d := v_1_0.AuxInt - v.reset(OpAnd8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c & d)) - v.AddArg(v0) - v.AddArg(x) + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(uint16(c) >= uint16(d)) return true } return false } -func rewriteValuegeneric_OpAnd8_20(v *Value) bool { - b := v.Block - // match: (And8 (Const8 [c]) (And8 x (Const8 [d]))) - // result: (And8 (Const8 [int64(int8(c&d))]) x) +func rewriteValuegeneric_OpGeq32_0(v *Value) bool { + // match: (Geq32 (Const32 [c]) (Const32 [d])) + // result: (ConstBool [b2i(c >= d)]) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst8 { + if v_0.Op != OpConst32 { break } - t := v_0.Type c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpAnd8 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst8 || v_1_1.Type != t { + if v_1.Op != OpConst32 { break } - d := v_1_1.AuxInt - v.reset(OpAnd8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c & d)) - v.AddArg(v0) - v.AddArg(x) + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c >= d) return true } - // match: (And8 (And8 (Const8 [d]) x) (Const8 [c])) - // result: (And8 (Const8 [int64(int8(c&d))]) x) + // match: (Geq32 (And32 _ (Const32 [c])) (Const32 [0])) + // cond: int32(c) >= 0 + // result: (ConstBool [1]) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpAnd8 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst8 { + if v_0.Op != OpAnd32 { break } - t := v_0_0.Type - d := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.Type != t { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_1 := v_0.Args[1^_i0] + if v_0_1.Op != OpConst32 { + continue + } + c := v_0_1.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst32 || v_1.AuxInt != 0 || !(int32(c) >= 0) { + continue + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true } - c := v_1.AuxInt - v.reset(OpAnd8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c & d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (And8 (And8 x (Const8 [d])) (Const8 [c])) - // result: (And8 (Const8 [int64(int8(c&d))]) x) + return false +} +func rewriteValuegeneric_OpGeq32F_0(v *Value) bool { + // match: (Geq32F (Const32F [c]) (Const32F [d])) + // result: (ConstBool [b2i(auxTo32F(c) >= auxTo32F(d))]) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpAnd8 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst8 { + if v_0.Op != OpConst32F { break } - t := v_0_1.Type - d := v_0_1.AuxInt + c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.Type != t { + if v_1.Op != OpConst32F { break } - c := v_1.AuxInt - v.reset(OpAnd8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c & d)) - v.AddArg(v0) - v.AddArg(x) + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(auxTo32F(c) >= auxTo32F(d)) return true } return false } -func rewriteValuegeneric_OpArraySelect_0(v *Value) bool { - // match: (ArraySelect (ArrayMake1 x)) - // result: x +func rewriteValuegeneric_OpGeq32U_0(v *Value) bool { + // match: (Geq32U (Const32 [c]) (Const32 [d])) + // result: (ConstBool [b2i(uint32(c) >= uint32(d))]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpArrayMake1 { - break - } - x := v_0.Args[0] - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (ArraySelect [0] (IData x)) - // result: (IData x) - for { - if v.AuxInt != 0 { + if v_0.Op != OpConst32 { break } - v_0 := v.Args[0] - if v_0.Op != OpIData { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst32 { break } - x := v_0.Args[0] - v.reset(OpIData) - v.AddArg(x) + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(uint32(c) >= uint32(d)) return true } return false } -func rewriteValuegeneric_OpCom16_0(v *Value) bool { - // match: (Com16 (Com16 x)) - // result: x +func rewriteValuegeneric_OpGeq64_0(v *Value) bool { + // match: (Geq64 (Const64 [c]) (Const64 [d])) + // result: (ConstBool [b2i(c >= d)]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpCom16 { + if v_0.Op != OpConst64 { break } - x := v_0.Args[0] - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Com16 (Const16 [c])) - // result: (Const16 [^c]) - for { - v_0 := v.Args[0] - if v_0.Op != OpConst16 { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - c := v_0.AuxInt - v.reset(OpConst16) - v.AuxInt = ^c + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c >= d) return true } - // match: (Com16 (Add16 (Const16 [-1]) x)) - // result: (Neg16 x) + // match: (Geq64 (And64 _ (Const64 [c])) (Const64 [0])) + // cond: int64(c) >= 0 + // result: (ConstBool [1]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpAdd16 { + if v_0.Op != OpAnd64 { break } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst16 || v_0_0.AuxInt != -1 { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_1 := v_0.Args[1^_i0] + if v_0_1.Op != OpConst64 { + continue + } + c := v_0_1.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 || v_1.AuxInt != 0 || !(int64(c) >= 0) { + continue + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true } - v.reset(OpNeg16) - v.AddArg(x) - return true + break } - // match: (Com16 (Add16 x (Const16 [-1]))) - // result: (Neg16 x) + // match: (Geq64 (Rsh64Ux64 _ (Const64 [c])) (Const64 [0])) + // cond: c > 0 + // result: (ConstBool [1]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpAdd16 { + if v_0.Op != OpRsh64Ux64 { break } _ = v_0.Args[1] - x := v_0.Args[0] v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst16 || v_0_1.AuxInt != -1 { + if v_0_1.Op != OpConst64 { break } - v.reset(OpNeg16) - v.AddArg(x) + c := v_0_1.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 || v_1.AuxInt != 0 || !(c > 0) { + break + } + v.reset(OpConstBool) + v.AuxInt = 1 return true } return false } -func rewriteValuegeneric_OpCom32_0(v *Value) bool { - // match: (Com32 (Com32 x)) - // result: x +func rewriteValuegeneric_OpGeq64F_0(v *Value) bool { + // match: (Geq64F (Const64F [c]) (Const64F [d])) + // result: (ConstBool [b2i(auxTo64F(c) >= auxTo64F(d))]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpCom32 { + if v_0.Op != OpConst64F { break } - x := v_0.Args[0] - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64F { + break + } + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(auxTo64F(c) >= auxTo64F(d)) return true } - // match: (Com32 (Const32 [c])) - // result: (Const32 [^c]) + return false +} +func rewriteValuegeneric_OpGeq64U_0(v *Value) bool { + // match: (Geq64U (Const64 [c]) (Const64 [d])) + // result: (ConstBool [b2i(uint64(c) >= uint64(d))]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst32 { + if v_0.Op != OpConst64 { break } c := v_0.AuxInt - v.reset(OpConst32) - v.AuxInt = ^c + v_1 := v.Args[1] + if v_1.Op != OpConst64 { + break + } + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(uint64(c) >= uint64(d)) return true } - // match: (Com32 (Add32 (Const32 [-1]) x)) - // result: (Neg32 x) + return false +} +func rewriteValuegeneric_OpGeq8_0(v *Value) bool { + // match: (Geq8 (Const8 [c]) (Const8 [d])) + // result: (ConstBool [b2i(c >= d)]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpAdd32 { + if v_0.Op != OpConst8 { break } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 || v_0_0.AuxInt != -1 { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst8 { break } - v.reset(OpNeg32) - v.AddArg(x) + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c >= d) return true } - // match: (Com32 (Add32 x (Const32 [-1]))) - // result: (Neg32 x) + // match: (Geq8 (And8 _ (Const8 [c])) (Const8 [0])) + // cond: int8(c) >= 0 + // result: (ConstBool [1]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpAdd32 { + if v_0.Op != OpAnd8 { break } _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 || v_0_1.AuxInt != -1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_1 := v_0.Args[1^_i0] + if v_0_1.Op != OpConst8 { + continue + } + c := v_0_1.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst8 || v_1.AuxInt != 0 || !(int8(c) >= 0) { + continue + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true } - v.reset(OpNeg32) - v.AddArg(x) - return true + break } return false } -func rewriteValuegeneric_OpCom64_0(v *Value) bool { - // match: (Com64 (Com64 x)) - // result: x +func rewriteValuegeneric_OpGeq8U_0(v *Value) bool { + // match: (Geq8U (Const8 [c]) (Const8 [d])) + // result: (ConstBool [b2i(uint8(c) >= uint8(d))]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpCom64 { + if v_0.Op != OpConst8 { break } - x := v_0.Args[0] - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst8 { + break + } + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(uint8(c) >= uint8(d)) return true } - // match: (Com64 (Const64 [c])) - // result: (Const64 [^c]) + return false +} +func rewriteValuegeneric_OpGreater16_0(v *Value) bool { + // match: (Greater16 (Const16 [c]) (Const16 [d])) + // result: (ConstBool [b2i(c > d)]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst64 { + if v_0.Op != OpConst16 { break } c := v_0.AuxInt - v.reset(OpConst64) - v.AuxInt = ^c + v_1 := v.Args[1] + if v_1.Op != OpConst16 { + break + } + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c > d) return true } - // match: (Com64 (Add64 (Const64 [-1]) x)) - // result: (Neg64 x) + return false +} +func rewriteValuegeneric_OpGreater16U_0(v *Value) bool { + // match: (Greater16U (Const16 [c]) (Const16 [d])) + // result: (ConstBool [b2i(uint16(c) > uint16(d))]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpAdd64 { + if v_0.Op != OpConst16 { break } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 || v_0_0.AuxInt != -1 { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst16 { break } - v.reset(OpNeg64) - v.AddArg(x) + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(uint16(c) > uint16(d)) return true } - // match: (Com64 (Add64 x (Const64 [-1]))) - // result: (Neg64 x) + return false +} +func rewriteValuegeneric_OpGreater32_0(v *Value) bool { + // match: (Greater32 (Const32 [c]) (Const32 [d])) + // result: (ConstBool [b2i(c > d)]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpAdd64 { + if v_0.Op != OpConst32 { break } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.AuxInt != -1 { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst32 { break } - v.reset(OpNeg64) - v.AddArg(x) + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c > d) return true } return false } -func rewriteValuegeneric_OpCom8_0(v *Value) bool { - // match: (Com8 (Com8 x)) - // result: x +func rewriteValuegeneric_OpGreater32F_0(v *Value) bool { + // match: (Greater32F (Const32F [c]) (Const32F [d])) + // result: (ConstBool [b2i(auxTo32F(c) > auxTo32F(d))]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpCom8 { + if v_0.Op != OpConst32F { break } - x := v_0.Args[0] - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst32F { + break + } + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(auxTo32F(c) > auxTo32F(d)) return true } - // match: (Com8 (Const8 [c])) - // result: (Const8 [^c]) + return false +} +func rewriteValuegeneric_OpGreater32U_0(v *Value) bool { + // match: (Greater32U (Const32 [c]) (Const32 [d])) + // result: (ConstBool [b2i(uint32(c) > uint32(d))]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst8 { + if v_0.Op != OpConst32 { break } c := v_0.AuxInt - v.reset(OpConst8) - v.AuxInt = ^c + v_1 := v.Args[1] + if v_1.Op != OpConst32 { + break + } + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(uint32(c) > uint32(d)) return true } - // match: (Com8 (Add8 (Const8 [-1]) x)) - // result: (Neg8 x) + return false +} +func rewriteValuegeneric_OpGreater64_0(v *Value) bool { + // match: (Greater64 (Const64 [c]) (Const64 [d])) + // result: (ConstBool [b2i(c > d)]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpAdd8 { + if v_0.Op != OpConst64 { break } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst8 || v_0_0.AuxInt != -1 { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - v.reset(OpNeg8) - v.AddArg(x) + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c > d) return true } - // match: (Com8 (Add8 x (Const8 [-1]))) - // result: (Neg8 x) + return false +} +func rewriteValuegeneric_OpGreater64F_0(v *Value) bool { + // match: (Greater64F (Const64F [c]) (Const64F [d])) + // result: (ConstBool [b2i(auxTo64F(c) > auxTo64F(d))]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpAdd8 { + if v_0.Op != OpConst64F { break } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst8 || v_0_1.AuxInt != -1 { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64F { break } - v.reset(OpNeg8) - v.AddArg(x) + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(auxTo64F(c) > auxTo64F(d)) return true } return false } -func rewriteValuegeneric_OpConstInterface_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (ConstInterface) - // result: (IMake (ConstNil ) (ConstNil )) +func rewriteValuegeneric_OpGreater64U_0(v *Value) bool { + // match: (Greater64U (Const64 [c]) (Const64 [d])) + // result: (ConstBool [b2i(uint64(c) > uint64(d))]) for { - v.reset(OpIMake) - v0 := b.NewValue0(v.Pos, OpConstNil, typ.Uintptr) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) - v.AddArg(v1) + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst64 { + break + } + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { + break + } + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(uint64(c) > uint64(d)) return true } + return false } -func rewriteValuegeneric_OpConstSlice_0(v *Value) bool { - b := v.Block - config := b.Func.Config - typ := &b.Func.Config.Types - // match: (ConstSlice) - // cond: config.PtrSize == 4 - // result: (SliceMake (ConstNil ) (Const32 [0]) (Const32 [0])) +func rewriteValuegeneric_OpGreater8_0(v *Value) bool { + // match: (Greater8 (Const8 [c]) (Const8 [d])) + // result: (ConstBool [b2i(c > d)]) for { - if !(config.PtrSize == 4) { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst8 { break } - v.reset(OpSliceMake) - v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.Elem().PtrTo()) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpConst32, typ.Int) - v1.AuxInt = 0 - v.AddArg(v1) - v2 := b.NewValue0(v.Pos, OpConst32, typ.Int) - v2.AuxInt = 0 - v.AddArg(v2) + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst8 { + break + } + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c > d) return true } - // match: (ConstSlice) - // cond: config.PtrSize == 8 - // result: (SliceMake (ConstNil ) (Const64 [0]) (Const64 [0])) + return false +} +func rewriteValuegeneric_OpGreater8U_0(v *Value) bool { + // match: (Greater8U (Const8 [c]) (Const8 [d])) + // result: (ConstBool [b2i(uint8(c) > uint8(d))]) for { - if !(config.PtrSize == 8) { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst8 { break } - v.reset(OpSliceMake) - v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.Elem().PtrTo()) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpConst64, typ.Int) - v1.AuxInt = 0 - v.AddArg(v1) - v2 := b.NewValue0(v.Pos, OpConst64, typ.Int) - v2.AuxInt = 0 - v.AddArg(v2) + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst8 { + break + } + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(uint8(c) > uint8(d)) return true } return false } -func rewriteValuegeneric_OpConstString_0(v *Value) bool { - b := v.Block - config := b.Func.Config - fe := b.Func.fe - typ := &b.Func.Config.Types - // match: (ConstString {s}) - // cond: config.PtrSize == 4 && s.(string) == "" - // result: (StringMake (ConstNil) (Const32 [0])) +func rewriteValuegeneric_OpIMake_0(v *Value) bool { + // match: (IMake typ (StructMake1 val)) + // result: (IMake typ val) for { - s := v.Aux - if !(config.PtrSize == 4 && s.(string) == "") { + _ = v.Args[1] + typ := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpStructMake1 { break } - v.reset(OpStringMake) - v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpConst32, typ.Int) - v1.AuxInt = 0 - v.AddArg(v1) + val := v_1.Args[0] + v.reset(OpIMake) + v.AddArg(typ) + v.AddArg(val) return true } - // match: (ConstString {s}) - // cond: config.PtrSize == 8 && s.(string) == "" - // result: (StringMake (ConstNil) (Const64 [0])) + // match: (IMake typ (ArrayMake1 val)) + // result: (IMake typ val) for { - s := v.Aux - if !(config.PtrSize == 8 && s.(string) == "") { - break - } - v.reset(OpStringMake) - v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpConst64, typ.Int) - v1.AuxInt = 0 - v.AddArg(v1) - return true - } - // match: (ConstString {s}) - // cond: config.PtrSize == 4 && s.(string) != "" - // result: (StringMake (Addr {fe.StringData(s.(string))} (SB)) (Const32 [int64(len(s.(string)))])) - for { - s := v.Aux - if !(config.PtrSize == 4 && s.(string) != "") { - break - } - v.reset(OpStringMake) - v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr) - v0.Aux = fe.StringData(s.(string)) - v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr) - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst32, typ.Int) - v2.AuxInt = int64(len(s.(string))) - v.AddArg(v2) - return true - } - // match: (ConstString {s}) - // cond: config.PtrSize == 8 && s.(string) != "" - // result: (StringMake (Addr {fe.StringData(s.(string))} (SB)) (Const64 [int64(len(s.(string)))])) - for { - s := v.Aux - if !(config.PtrSize == 8 && s.(string) != "") { + _ = v.Args[1] + typ := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpArrayMake1 { break } - v.reset(OpStringMake) - v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr) - v0.Aux = fe.StringData(s.(string)) - v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr) - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst64, typ.Int) - v2.AuxInt = int64(len(s.(string))) - v.AddArg(v2) + val := v_1.Args[0] + v.reset(OpIMake) + v.AddArg(typ) + v.AddArg(val) return true } return false } -func rewriteValuegeneric_OpConvert_0(v *Value) bool { - // match: (Convert (Add64 (Convert ptr mem) off) mem) - // result: (Add64 ptr off) +func rewriteValuegeneric_OpInterCall_0(v *Value) bool { + // match: (InterCall [argsize] (Load (OffPtr [off] (ITab (IMake (Addr {itab} (SB)) _))) _) mem) + // cond: devirt(v, itab, off) != nil + // result: (StaticCall [argsize] {devirt(v, itab, off)} mem) for { + argsize := v.AuxInt mem := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpAdd64 { + if v_0.Op != OpLoad { break } - off := v_0.Args[1] + _ = v_0.Args[1] v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConvert { + if v_0_0.Op != OpOffPtr { break } - _ = v_0_0.Args[1] - ptr := v_0_0.Args[0] - if mem != v_0_0.Args[1] { + off := v_0_0.AuxInt + v_0_0_0 := v_0_0.Args[0] + if v_0_0_0.Op != OpITab { break } - v.reset(OpAdd64) - v.AddArg(ptr) - v.AddArg(off) - return true - } - // match: (Convert (Add64 off (Convert ptr mem)) mem) - // result: (Add64 ptr off) - for { - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd64 { + v_0_0_0_0 := v_0_0_0.Args[0] + if v_0_0_0_0.Op != OpIMake { break } - _ = v_0.Args[1] - off := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConvert { + _ = v_0_0_0_0.Args[1] + v_0_0_0_0_0 := v_0_0_0_0.Args[0] + if v_0_0_0_0_0.Op != OpAddr { break } - _ = v_0_1.Args[1] - ptr := v_0_1.Args[0] - if mem != v_0_1.Args[1] { + itab := v_0_0_0_0_0.Aux + v_0_0_0_0_0_0 := v_0_0_0_0_0.Args[0] + if v_0_0_0_0_0_0.Op != OpSB || !(devirt(v, itab, off) != nil) { break } - v.reset(OpAdd64) - v.AddArg(ptr) - v.AddArg(off) + v.reset(OpStaticCall) + v.AuxInt = argsize + v.Aux = devirt(v, itab, off) + v.AddArg(mem) return true } - // match: (Convert (Add32 (Convert ptr mem) off) mem) - // result: (Add32 ptr off) + return false +} +func rewriteValuegeneric_OpIsInBounds_0(v *Value) bool { + // match: (IsInBounds (ZeroExt8to32 _) (Const32 [c])) + // cond: (1 << 8) <= c + // result: (ConstBool [1]) for { - mem := v.Args[1] + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpAdd32 { + if v_0.Op != OpZeroExt8to32 { break } - off := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConvert { + v_1 := v.Args[1] + if v_1.Op != OpConst32 { break } - _ = v_0_0.Args[1] - ptr := v_0_0.Args[0] - if mem != v_0_0.Args[1] { + c := v_1.AuxInt + if !((1 << 8) <= c) { break } - v.reset(OpAdd32) - v.AddArg(ptr) - v.AddArg(off) + v.reset(OpConstBool) + v.AuxInt = 1 return true } - // match: (Convert (Add32 off (Convert ptr mem)) mem) - // result: (Add32 ptr off) + // match: (IsInBounds (ZeroExt8to64 _) (Const64 [c])) + // cond: (1 << 8) <= c + // result: (ConstBool [1]) for { - mem := v.Args[1] + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpAdd32 { + if v_0.Op != OpZeroExt8to64 { break } - _ = v_0.Args[1] - off := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConvert { + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - _ = v_0_1.Args[1] - ptr := v_0_1.Args[0] - if mem != v_0_1.Args[1] { + c := v_1.AuxInt + if !((1 << 8) <= c) { break } - v.reset(OpAdd32) - v.AddArg(ptr) - v.AddArg(off) + v.reset(OpConstBool) + v.AuxInt = 1 return true } - // match: (Convert (Convert ptr mem) mem) - // result: ptr + // match: (IsInBounds (ZeroExt16to32 _) (Const32 [c])) + // cond: (1 << 16) <= c + // result: (ConstBool [1]) for { - mem := v.Args[1] + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConvert { + if v_0.Op != OpZeroExt16to32 { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] - if mem != v_0.Args[1] { + v_1 := v.Args[1] + if v_1.Op != OpConst32 { break } - v.reset(OpCopy) - v.Type = ptr.Type - v.AddArg(ptr) + c := v_1.AuxInt + if !((1 << 16) <= c) { + break + } + v.reset(OpConstBool) + v.AuxInt = 1 return true } - return false -} -func rewriteValuegeneric_OpCvt32Fto32_0(v *Value) bool { - // match: (Cvt32Fto32 (Const32F [c])) - // result: (Const32 [int64(int32(auxTo32F(c)))]) + // match: (IsInBounds (ZeroExt16to64 _) (Const64 [c])) + // cond: (1 << 16) <= c + // result: (ConstBool [1]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst32F { + if v_0.Op != OpZeroExt16to64 { break } - c := v_0.AuxInt - v.reset(OpConst32) - v.AuxInt = int64(int32(auxTo32F(c))) + v_1 := v.Args[1] + if v_1.Op != OpConst64 { + break + } + c := v_1.AuxInt + if !((1 << 16) <= c) { + break + } + v.reset(OpConstBool) + v.AuxInt = 1 return true } - return false -} -func rewriteValuegeneric_OpCvt32Fto64_0(v *Value) bool { - // match: (Cvt32Fto64 (Const32F [c])) - // result: (Const64 [int64(auxTo32F(c))]) + // match: (IsInBounds x x) + // result: (ConstBool [0]) for { - v_0 := v.Args[0] - if v_0.Op != OpConst32F { + x := v.Args[1] + if x != v.Args[0] { break } - c := v_0.AuxInt - v.reset(OpConst64) - v.AuxInt = int64(auxTo32F(c)) + v.reset(OpConstBool) + v.AuxInt = 0 return true } - return false -} -func rewriteValuegeneric_OpCvt32Fto64F_0(v *Value) bool { - // match: (Cvt32Fto64F (Const32F [c])) - // result: (Const64F [c]) + // match: (IsInBounds (And8 (Const8 [c]) _) (Const8 [d])) + // cond: 0 <= c && c < d + // result: (ConstBool [1]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst32F { + if v_0.Op != OpAnd8 { break } - c := v_0.AuxInt - v.reset(OpConst64F) - v.AuxInt = c - return true + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpConst8 { + continue + } + c := v_0_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst8 { + continue + } + d := v_1.AuxInt + if !(0 <= c && c < d) { + continue + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true + } + break } - return false -} -func rewriteValuegeneric_OpCvt32to32F_0(v *Value) bool { - // match: (Cvt32to32F (Const32 [c])) - // result: (Const32F [auxFrom32F(float32(int32(c)))]) + // match: (IsInBounds (ZeroExt8to16 (And8 (Const8 [c]) _)) (Const16 [d])) + // cond: 0 <= c && c < d + // result: (ConstBool [1]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst32 { + if v_0.Op != OpZeroExt8to16 { break } - c := v_0.AuxInt - v.reset(OpConst32F) - v.AuxInt = auxFrom32F(float32(int32(c))) - return true + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpAnd8 { + break + } + _ = v_0_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0_0 := v_0_0.Args[_i0] + if v_0_0_0.Op != OpConst8 { + continue + } + c := v_0_0_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst16 { + continue + } + d := v_1.AuxInt + if !(0 <= c && c < d) { + continue + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true + } + break } - return false -} -func rewriteValuegeneric_OpCvt32to64F_0(v *Value) bool { - // match: (Cvt32to64F (Const32 [c])) - // result: (Const64F [auxFrom64F(float64(int32(c)))]) + // match: (IsInBounds (ZeroExt8to32 (And8 (Const8 [c]) _)) (Const32 [d])) + // cond: 0 <= c && c < d + // result: (ConstBool [1]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst32 { + if v_0.Op != OpZeroExt8to32 { break } - c := v_0.AuxInt - v.reset(OpConst64F) - v.AuxInt = auxFrom64F(float64(int32(c))) - return true - } - return false -} -func rewriteValuegeneric_OpCvt64Fto32_0(v *Value) bool { - // match: (Cvt64Fto32 (Const64F [c])) - // result: (Const32 [int64(int32(auxTo64F(c)))]) + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpAnd8 { + break + } + _ = v_0_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0_0 := v_0_0.Args[_i0] + if v_0_0_0.Op != OpConst8 { + continue + } + c := v_0_0_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst32 { + continue + } + d := v_1.AuxInt + if !(0 <= c && c < d) { + continue + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true + } + break + } + // match: (IsInBounds (ZeroExt8to64 (And8 (Const8 [c]) _)) (Const64 [d])) + // cond: 0 <= c && c < d + // result: (ConstBool [1]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst64F { + if v_0.Op != OpZeroExt8to64 { break } - c := v_0.AuxInt - v.reset(OpConst32) - v.AuxInt = int64(int32(auxTo64F(c))) - return true + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpAnd8 { + break + } + _ = v_0_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0_0 := v_0_0.Args[_i0] + if v_0_0_0.Op != OpConst8 { + continue + } + c := v_0_0_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { + continue + } + d := v_1.AuxInt + if !(0 <= c && c < d) { + continue + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true + } + break } - return false -} -func rewriteValuegeneric_OpCvt64Fto32F_0(v *Value) bool { - // match: (Cvt64Fto32F (Const64F [c])) - // result: (Const32F [auxFrom32F(float32(auxTo64F(c)))]) + // match: (IsInBounds (And16 (Const16 [c]) _) (Const16 [d])) + // cond: 0 <= c && c < d + // result: (ConstBool [1]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst64F { + if v_0.Op != OpAnd16 { break } - c := v_0.AuxInt - v.reset(OpConst32F) - v.AuxInt = auxFrom32F(float32(auxTo64F(c))) - return true + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpConst16 { + continue + } + c := v_0_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst16 { + continue + } + d := v_1.AuxInt + if !(0 <= c && c < d) { + continue + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true + } + break } return false } -func rewriteValuegeneric_OpCvt64Fto64_0(v *Value) bool { - // match: (Cvt64Fto64 (Const64F [c])) - // result: (Const64 [int64(auxTo64F(c))]) +func rewriteValuegeneric_OpIsInBounds_10(v *Value) bool { + // match: (IsInBounds (ZeroExt16to32 (And16 (Const16 [c]) _)) (Const32 [d])) + // cond: 0 <= c && c < d + // result: (ConstBool [1]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst64F { + if v_0.Op != OpZeroExt16to32 { break } - c := v_0.AuxInt - v.reset(OpConst64) - v.AuxInt = int64(auxTo64F(c)) - return true + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpAnd16 { + break + } + _ = v_0_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0_0 := v_0_0.Args[_i0] + if v_0_0_0.Op != OpConst16 { + continue + } + c := v_0_0_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst32 { + continue + } + d := v_1.AuxInt + if !(0 <= c && c < d) { + continue + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true + } + break } - return false -} -func rewriteValuegeneric_OpCvt64to32F_0(v *Value) bool { - // match: (Cvt64to32F (Const64 [c])) - // result: (Const32F [auxFrom32F(float32(c))]) + // match: (IsInBounds (ZeroExt16to64 (And16 (Const16 [c]) _)) (Const64 [d])) + // cond: 0 <= c && c < d + // result: (ConstBool [1]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst64 { + if v_0.Op != OpZeroExt16to64 { break } - c := v_0.AuxInt - v.reset(OpConst32F) - v.AuxInt = auxFrom32F(float32(c)) - return true + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpAnd16 { + break + } + _ = v_0_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0_0 := v_0_0.Args[_i0] + if v_0_0_0.Op != OpConst16 { + continue + } + c := v_0_0_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { + continue + } + d := v_1.AuxInt + if !(0 <= c && c < d) { + continue + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true + } + break } - return false -} -func rewriteValuegeneric_OpCvt64to64F_0(v *Value) bool { - // match: (Cvt64to64F (Const64 [c])) - // result: (Const64F [auxFrom64F(float64(c))]) + // match: (IsInBounds (And32 (Const32 [c]) _) (Const32 [d])) + // cond: 0 <= c && c < d + // result: (ConstBool [1]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst64 { + if v_0.Op != OpAnd32 { break } - c := v_0.AuxInt - v.reset(OpConst64F) - v.AuxInt = auxFrom64F(float64(c)) - return true + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpConst32 { + continue + } + c := v_0_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst32 { + continue + } + d := v_1.AuxInt + if !(0 <= c && c < d) { + continue + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true + } + break } - return false -} -func rewriteValuegeneric_OpDiv16_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Div16 (Const16 [c]) (Const16 [d])) - // cond: d != 0 - // result: (Const16 [int64(int16(c)/int16(d))]) + // match: (IsInBounds (ZeroExt32to64 (And32 (Const32 [c]) _)) (Const64 [d])) + // cond: 0 <= c && c < d + // result: (ConstBool [1]) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst16 { + if v_0.Op != OpZeroExt32to64 { break } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 { + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpAnd32 { break } - d := v_1.AuxInt - if !(d != 0) { - break + _ = v_0_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0_0 := v_0_0.Args[_i0] + if v_0_0_0.Op != OpConst32 { + continue + } + c := v_0_0_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { + continue + } + d := v_1.AuxInt + if !(0 <= c && c < d) { + continue + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true } - v.reset(OpConst16) - v.AuxInt = int64(int16(c) / int16(d)) - return true + break } - // match: (Div16 n (Const16 [c])) - // cond: isNonNegative(n) && isPowerOfTwo(c&0xffff) - // result: (Rsh16Ux64 n (Const64 [log2(c&0xffff)])) + // match: (IsInBounds (And64 (Const64 [c]) _) (Const64 [d])) + // cond: 0 <= c && c < d + // result: (ConstBool [1]) for { _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst16 { + v_0 := v.Args[0] + if v_0.Op != OpAnd64 { break } - c := v_1.AuxInt - if !(isNonNegative(n) && isPowerOfTwo(c&0xffff)) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpConst64 { + continue + } + c := v_0_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { + continue + } + d := v_1.AuxInt + if !(0 <= c && c < d) { + continue + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true } - v.reset(OpRsh16Ux64) - v.AddArg(n) - v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v0.AuxInt = log2(c & 0xffff) - v.AddArg(v0) - return true + break } - // match: (Div16 n (Const16 [c])) - // cond: c < 0 && c != -1<<15 - // result: (Neg16 (Div16 n (Const16 [-c]))) + // match: (IsInBounds (Const32 [c]) (Const32 [d])) + // result: (ConstBool [b2i(0 <= c && c < d)]) for { - t := v.Type _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst16 { + v_0 := v.Args[0] + if v_0.Op != OpConst32 { break } - c := v_1.AuxInt - if !(c < 0 && c != -1<<15) { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst32 { break } - v.reset(OpNeg16) - v0 := b.NewValue0(v.Pos, OpDiv16, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst16, t) - v1.AuxInt = -c - v0.AddArg(v1) - v.AddArg(v0) + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(0 <= c && c < d) return true } - // match: (Div16 x (Const16 [-1<<15])) - // result: (Rsh16Ux64 (And16 x (Neg16 x)) (Const64 [15])) + // match: (IsInBounds (Const64 [c]) (Const64 [d])) + // result: (ConstBool [b2i(0 <= c && c < d)]) for { - t := v.Type _ = v.Args[1] - x := v.Args[0] + v_0 := v.Args[0] + if v_0.Op != OpConst64 { + break + } + c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.AuxInt != -1<<15 { + if v_1.Op != OpConst64 { break } - v.reset(OpRsh16Ux64) - v0 := b.NewValue0(v.Pos, OpAnd16, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpNeg16, t) - v1.AddArg(x) - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = 15 - v.AddArg(v2) + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(0 <= c && c < d) return true } - // match: (Div16 n (Const16 [c])) - // cond: isPowerOfTwo(c) - // result: (Rsh16x64 (Add16 n (Rsh16Ux64 (Rsh16x64 n (Const64 [15])) (Const64 [16-log2(c)]))) (Const64 [log2(c)])) + // match: (IsInBounds (Mod32u _ y) y) + // result: (ConstBool [1]) for { - t := v.Type - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst16 { + y := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpMod32u { break } - c := v_1.AuxInt - if !(isPowerOfTwo(c)) { + _ = v_0.Args[1] + if y != v_0.Args[1] { break } - v.reset(OpRsh16x64) - v0 := b.NewValue0(v.Pos, OpAdd16, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpRsh16Ux64, t) - v2 := b.NewValue0(v.Pos, OpRsh16x64, t) - v2.AddArg(n) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = 15 - v2.AddArg(v3) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = 16 - log2(c) - v1.AddArg(v4) - v0.AddArg(v1) - v.AddArg(v0) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = log2(c) - v.AddArg(v5) + v.reset(OpConstBool) + v.AuxInt = 1 return true } - // match: (Div16 x (Const16 [c])) - // cond: smagicOK(16,c) - // result: (Sub16 (Rsh32x64 (Mul32 (Const32 [int64(smagic(16,c).m)]) (SignExt16to32 x)) (Const64 [16+smagic(16,c).s])) (Rsh32x64 (SignExt16to32 x) (Const64 [31]))) + // match: (IsInBounds (Mod64u _ y) y) + // result: (ConstBool [1]) + for { + y := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpMod64u { + break + } + _ = v_0.Args[1] + if y != v_0.Args[1] { + break + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true + } + // match: (IsInBounds (ZeroExt8to64 (Rsh8Ux64 _ (Const64 [c]))) (Const64 [d])) + // cond: 0 < c && c < 8 && 1< [log2(c&0xffff)])) + // match: (IsInBounds (ZeroExt8to16 (Rsh8Ux64 _ (Const64 [c]))) (Const16 [d])) + // cond: 0 < c && c < 8 && 1< (Mul64 (Const64 [int64(1<<16+umagic(16,c).m)]) (ZeroExt16to64 x)) (Const64 [16+umagic(16,c).s]))) + // match: (IsInBounds (Rsh8Ux64 _ (Const64 [c])) (Const64 [d])) + // cond: 0 < c && c < 8 && 1< (Mul32 (Const32 [int64(1<<15+umagic(16,c).m/2)]) (ZeroExt16to32 x)) (Const64 [16+umagic(16,c).s-1]))) + // match: (IsInBounds (ZeroExt16to64 (Rsh16Ux64 _ (Const64 [c]))) (Const64 [d])) + // cond: 0 < c && c < 16 && 1< (Mul32 (Const32 [int64(1<<15+(umagic(16,c).m+1)/2)]) (Rsh32Ux64 (ZeroExt16to32 x) (Const64 [1]))) (Const64 [16+umagic(16,c).s-2]))) + // match: (IsInBounds (ZeroExt16to32 (Rsh16Ux64 _ (Const64 [c]))) (Const64 [d])) + // cond: 0 < c && c < 16 && 1< (Avg32u (Lsh32x64 (ZeroExt16to32 x) (Const64 [16])) (Mul32 (Const32 [int64(umagic(16,c).m)]) (ZeroExt16to32 x))) (Const64 [16+umagic(16,c).s-1]))) + // match: (IsInBounds (Rsh16Ux64 _ (Const64 [c])) (Const64 [d])) + // cond: 0 < c && c < 16 && 1< [log2(c&0xffffffff)])) + // match: (IsInBounds (Rsh32Ux64 _ (Const64 [c])) (Const64 [d])) + // cond: 0 < c && c < 32 && 1< n (Const32 [c])) - // cond: c < 0 && c != -1<<31 - // result: (Neg32 (Div32 n (Const32 [-c]))) + // match: (IsInBounds (Rsh64Ux64 _ (Const64 [c])) (Const64 [d])) + // cond: 0 < c && c < 64 && 1< x (Const32 [-1<<31])) - // result: (Rsh32Ux64 (And32 x (Neg32 x)) (Const64 [31])) + return false +} +func rewriteValuegeneric_OpIsNonNil_0(v *Value) bool { + // match: (IsNonNil (ConstNil)) + // result: (ConstBool [0]) for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.AuxInt != -1<<31 { + v_0 := v.Args[0] + if v_0.Op != OpConstNil { break } - v.reset(OpRsh32Ux64) - v0 := b.NewValue0(v.Pos, OpAnd32, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpNeg32, t) - v1.AddArg(x) - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = 31 - v.AddArg(v2) + v.reset(OpConstBool) + v.AuxInt = 0 return true } - // match: (Div32 n (Const32 [c])) - // cond: isPowerOfTwo(c) - // result: (Rsh32x64 (Add32 n (Rsh32Ux64 (Rsh32x64 n (Const64 [31])) (Const64 [32-log2(c)]))) (Const64 [log2(c)])) + // match: (IsNonNil (Const32 [c])) + // result: (ConstBool [b2i(c != 0)]) for { - t := v.Type - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c)) { + v_0 := v.Args[0] + if v_0.Op != OpConst32 { break } - v.reset(OpRsh32x64) - v0 := b.NewValue0(v.Pos, OpAdd32, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpRsh32Ux64, t) - v2 := b.NewValue0(v.Pos, OpRsh32x64, t) - v2.AddArg(n) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = 31 - v2.AddArg(v3) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = 32 - log2(c) - v1.AddArg(v4) - v0.AddArg(v1) - v.AddArg(v0) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = log2(c) - v.AddArg(v5) + c := v_0.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c != 0) return true } - // match: (Div32 x (Const32 [c])) - // cond: smagicOK(32,c) && config.RegSize == 8 - // result: (Sub32 (Rsh64x64 (Mul64 (Const64 [int64(smagic(32,c).m)]) (SignExt32to64 x)) (Const64 [32+smagic(32,c).s])) (Rsh64x64 (SignExt32to64 x) (Const64 [63]))) + // match: (IsNonNil (Const64 [c])) + // result: (ConstBool [b2i(c != 0)]) for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 { + v_0 := v.Args[0] + if v_0.Op != OpConst64 { break } - c := v_1.AuxInt - if !(smagicOK(32, c) && config.RegSize == 8) { + c := v_0.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c != 0) + return true + } + // match: (IsNonNil (Addr _)) + // result: (ConstBool [1]) + for { + v_0 := v.Args[0] + if v_0.Op != OpAddr { break } - v.reset(OpSub32) - v.Type = t - v0 := b.NewValue0(v.Pos, OpRsh64x64, t) - v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = int64(smagic(32, c).m) - v1.AddArg(v2) - v3 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) - v3.AddArg(x) - v1.AddArg(v3) - v0.AddArg(v1) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = 32 + smagic(32, c).s - v0.AddArg(v4) - v.AddArg(v0) - v5 := b.NewValue0(v.Pos, OpRsh64x64, t) - v6 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) - v6.AddArg(x) - v5.AddArg(v6) - v7 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v7.AuxInt = 63 - v5.AddArg(v7) - v.AddArg(v5) + v.reset(OpConstBool) + v.AuxInt = 1 return true } - // match: (Div32 x (Const32 [c])) - // cond: smagicOK(32,c) && config.RegSize == 4 && smagic(32,c).m&1 == 0 && config.useHmul - // result: (Sub32 (Rsh32x64 (Hmul32 (Const32 [int64(int32(smagic(32,c).m/2))]) x) (Const64 [smagic(32,c).s-1])) (Rsh32x64 x (Const64 [31]))) + // match: (IsNonNil (LocalAddr _ _)) + // result: (ConstBool [1]) for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 { + v_0 := v.Args[0] + if v_0.Op != OpLocalAddr { break } - c := v_1.AuxInt - if !(smagicOK(32, c) && config.RegSize == 4 && smagic(32, c).m&1 == 0 && config.useHmul) { + _ = v_0.Args[1] + v.reset(OpConstBool) + v.AuxInt = 1 + return true + } + return false +} +func rewriteValuegeneric_OpIsSliceInBounds_0(v *Value) bool { + // match: (IsSliceInBounds x x) + // result: (ConstBool [1]) + for { + x := v.Args[1] + if x != v.Args[0] { break } - v.reset(OpSub32) - v.Type = t - v0 := b.NewValue0(v.Pos, OpRsh32x64, t) - v1 := b.NewValue0(v.Pos, OpHmul32, t) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(smagic(32, c).m / 2)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = smagic(32, c).s - 1 - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpRsh32x64, t) - v4.AddArg(x) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = 31 - v4.AddArg(v5) - v.AddArg(v4) + v.reset(OpConstBool) + v.AuxInt = 1 return true } - // match: (Div32 x (Const32 [c])) - // cond: smagicOK(32,c) && config.RegSize == 4 && smagic(32,c).m&1 != 0 && config.useHmul - // result: (Sub32 (Rsh32x64 (Add32 (Hmul32 (Const32 [int64(int32(smagic(32,c).m))]) x) x) (Const64 [smagic(32,c).s])) (Rsh32x64 x (Const64 [31]))) + // match: (IsSliceInBounds (And32 (Const32 [c]) _) (Const32 [d])) + // cond: 0 <= c && c <= d + // result: (ConstBool [1]) for { - t := v.Type _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 { + v_0 := v.Args[0] + if v_0.Op != OpAnd32 { break } - c := v_1.AuxInt - if !(smagicOK(32, c) && config.RegSize == 4 && smagic(32, c).m&1 != 0 && config.useHmul) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpConst32 { + continue + } + c := v_0_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst32 { + continue + } + d := v_1.AuxInt + if !(0 <= c && c <= d) { + continue + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true } - v.reset(OpSub32) - v.Type = t - v0 := b.NewValue0(v.Pos, OpRsh32x64, t) - v1 := b.NewValue0(v.Pos, OpAdd32, t) - v2 := b.NewValue0(v.Pos, OpHmul32, t) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(smagic(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = smagic(32, c).s - v0.AddArg(v4) - v.AddArg(v0) - v5 := b.NewValue0(v.Pos, OpRsh32x64, t) - v5.AddArg(x) - v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v6.AuxInt = 31 - v5.AddArg(v6) - v.AddArg(v5) - return true + break } - return false -} -func rewriteValuegeneric_OpDiv32F_0(v *Value) bool { - b := v.Block - // match: (Div32F (Const32F [c]) (Const32F [d])) - // result: (Const32F [auxFrom32F(auxTo32F(c) / auxTo32F(d))]) + // match: (IsSliceInBounds (And64 (Const64 [c]) _) (Const64 [d])) + // cond: 0 <= c && c <= d + // result: (ConstBool [1]) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst32F { + if v_0.Op != OpAnd64 { break } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32F { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpConst64 { + continue + } + c := v_0_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { + continue + } + d := v_1.AuxInt + if !(0 <= c && c <= d) { + continue + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true } - d := v_1.AuxInt - v.reset(OpConst32F) - v.AuxInt = auxFrom32F(auxTo32F(c) / auxTo32F(d)) - return true + break } - // match: (Div32F x (Const32F [c])) - // cond: reciprocalExact32(auxTo32F(c)) - // result: (Mul32F x (Const32F [auxFrom32F(1/auxTo32F(c))])) + // match: (IsSliceInBounds (Const32 [0]) _) + // result: (ConstBool [1]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32F { + v_0 := v.Args[0] + if v_0.Op != OpConst32 || v_0.AuxInt != 0 { break } - t := v_1.Type - c := v_1.AuxInt - if !(reciprocalExact32(auxTo32F(c))) { + v.reset(OpConstBool) + v.AuxInt = 1 + return true + } + // match: (IsSliceInBounds (Const64 [0]) _) + // result: (ConstBool [1]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst64 || v_0.AuxInt != 0 { break } - v.reset(OpMul32F) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst32F, t) - v0.AuxInt = auxFrom32F(1 / auxTo32F(c)) - v.AddArg(v0) + v.reset(OpConstBool) + v.AuxInt = 1 return true } - return false -} -func rewriteValuegeneric_OpDiv32u_0(v *Value) bool { - b := v.Block - config := b.Func.Config - typ := &b.Func.Config.Types - // match: (Div32u (Const32 [c]) (Const32 [d])) - // cond: d != 0 - // result: (Const32 [int64(int32(uint32(c)/uint32(d)))]) + // match: (IsSliceInBounds (Const32 [c]) (Const32 [d])) + // result: (ConstBool [b2i(0 <= c && c <= d)]) for { _ = v.Args[1] v_0 := v.Args[0] @@ -7014,237 +9526,155 @@ func rewriteValuegeneric_OpDiv32u_0(v *Value) bool { break } d := v_1.AuxInt - if !(d != 0) { - break - } - v.reset(OpConst32) - v.AuxInt = int64(int32(uint32(c) / uint32(d))) + v.reset(OpConstBool) + v.AuxInt = b2i(0 <= c && c <= d) return true } - // match: (Div32u n (Const32 [c])) - // cond: isPowerOfTwo(c&0xffffffff) - // result: (Rsh32Ux64 n (Const64 [log2(c&0xffffffff)])) + // match: (IsSliceInBounds (Const64 [c]) (Const64 [d])) + // result: (ConstBool [b2i(0 <= c && c <= d)]) for { _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 { + v_0 := v.Args[0] + if v_0.Op != OpConst64 { break } - c := v_1.AuxInt - if !(isPowerOfTwo(c & 0xffffffff)) { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - v.reset(OpRsh32Ux64) - v.AddArg(n) - v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v0.AuxInt = log2(c & 0xffffffff) - v.AddArg(v0) + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(0 <= c && c <= d) return true } - // match: (Div32u x (Const32 [c])) - // cond: umagicOK(32, c) && config.RegSize == 4 && umagic(32,c).m&1 == 0 && config.useHmul - // result: (Rsh32Ux64 (Hmul32u (Const32 [int64(int32(1<<31+umagic(32,c).m/2))]) x) (Const64 [umagic(32,c).s-1])) + // match: (IsSliceInBounds (SliceLen x) (SliceCap x)) + // result: (ConstBool [1]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 { + v_0 := v.Args[0] + if v_0.Op != OpSliceLen { break } - c := v_1.AuxInt - if !(umagicOK(32, c) && config.RegSize == 4 && umagic(32, c).m&1 == 0 && config.useHmul) { + x := v_0.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpSliceCap || x != v_1.Args[0] { break } - v.reset(OpRsh32Ux64) - v.Type = typ.UInt32 - v0 := b.NewValue0(v.Pos, OpHmul32u, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v1.AuxInt = int64(int32(1<<31 + umagic(32, c).m/2)) - v0.AddArg(v1) - v0.AddArg(x) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = umagic(32, c).s - 1 - v.AddArg(v2) + v.reset(OpConstBool) + v.AuxInt = 1 return true } - // match: (Div32u x (Const32 [c])) - // cond: umagicOK(32, c) && config.RegSize == 4 && c&1 == 0 && config.useHmul - // result: (Rsh32Ux64 (Hmul32u (Const32 [int64(int32(1<<31+(umagic(32,c).m+1)/2))]) (Rsh32Ux64 x (Const64 [1]))) (Const64 [umagic(32,c).s-2])) + return false +} +func rewriteValuegeneric_OpLeq16_0(v *Value) bool { + // match: (Leq16 (Const16 [c]) (Const16 [d])) + // result: (ConstBool [b2i(c <= d)]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 { + v_0 := v.Args[0] + if v_0.Op != OpConst16 { break } - c := v_1.AuxInt - if !(umagicOK(32, c) && config.RegSize == 4 && c&1 == 0 && config.useHmul) { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst16 { break } - v.reset(OpRsh32Ux64) - v.Type = typ.UInt32 - v0 := b.NewValue0(v.Pos, OpHmul32u, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v1.AuxInt = int64(int32(1<<31 + (umagic(32, c).m+1)/2)) - v0.AddArg(v1) - v2 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) - v2.AddArg(x) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = 1 - v2.AddArg(v3) - v0.AddArg(v2) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = umagic(32, c).s - 2 - v.AddArg(v4) + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c <= d) return true } - // match: (Div32u x (Const32 [c])) - // cond: umagicOK(32, c) && config.RegSize == 4 && config.useAvg && config.useHmul - // result: (Rsh32Ux64 (Avg32u x (Hmul32u (Const32 [int64(int32(umagic(32,c).m))]) x)) (Const64 [umagic(32,c).s-1])) + return false +} +func rewriteValuegeneric_OpLeq16U_0(v *Value) bool { + // match: (Leq16U (Const16 [c]) (Const16 [d])) + // result: (ConstBool [b2i(uint16(c) <= uint16(d))]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 { + v_0 := v.Args[0] + if v_0.Op != OpConst16 { break } - c := v_1.AuxInt - if !(umagicOK(32, c) && config.RegSize == 4 && config.useAvg && config.useHmul) { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst16 { break } - v.reset(OpRsh32Ux64) - v.Type = typ.UInt32 - v0 := b.NewValue0(v.Pos, OpAvg32u, typ.UInt32) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpHmul32u, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(umagic(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v.AddArg(v0) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = umagic(32, c).s - 1 - v.AddArg(v3) + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(uint16(c) <= uint16(d)) return true } - // match: (Div32u x (Const32 [c])) - // cond: umagicOK(32, c) && config.RegSize == 8 && umagic(32,c).m&1 == 0 - // result: (Trunc64to32 (Rsh64Ux64 (Mul64 (Const64 [int64(1<<31+umagic(32,c).m/2)]) (ZeroExt32to64 x)) (Const64 [32+umagic(32,c).s-1]))) + return false +} +func rewriteValuegeneric_OpLeq32_0(v *Value) bool { + // match: (Leq32 (Const32 [c]) (Const32 [d])) + // result: (ConstBool [b2i(c <= d)]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 { + v_0 := v.Args[0] + if v_0.Op != OpConst32 { break } - c := v_1.AuxInt - if !(umagicOK(32, c) && config.RegSize == 8 && umagic(32, c).m&1 == 0) { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst32 { break } - v.reset(OpTrunc64to32) - v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = int64(1<<31 + umagic(32, c).m/2) - v1.AddArg(v2) - v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) - v3.AddArg(x) - v1.AddArg(v3) - v0.AddArg(v1) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = 32 + umagic(32, c).s - 1 - v0.AddArg(v4) - v.AddArg(v0) + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c <= d) return true } - // match: (Div32u x (Const32 [c])) - // cond: umagicOK(32, c) && config.RegSize == 8 && c&1 == 0 - // result: (Trunc64to32 (Rsh64Ux64 (Mul64 (Const64 [int64(1<<31+(umagic(32,c).m+1)/2)]) (Rsh64Ux64 (ZeroExt32to64 x) (Const64 [1]))) (Const64 [32+umagic(32,c).s-2]))) + return false +} +func rewriteValuegeneric_OpLeq32F_0(v *Value) bool { + // match: (Leq32F (Const32F [c]) (Const32F [d])) + // result: (ConstBool [b2i(auxTo32F(c) <= auxTo32F(d))]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 { + v_0 := v.Args[0] + if v_0.Op != OpConst32F { break } - c := v_1.AuxInt - if !(umagicOK(32, c) && config.RegSize == 8 && c&1 == 0) { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst32F { break } - v.reset(OpTrunc64to32) - v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = int64(1<<31 + (umagic(32, c).m+1)/2) - v1.AddArg(v2) - v3 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) - v4 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) - v4.AddArg(x) - v3.AddArg(v4) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = 1 - v3.AddArg(v5) - v1.AddArg(v3) - v0.AddArg(v1) - v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v6.AuxInt = 32 + umagic(32, c).s - 2 - v0.AddArg(v6) - v.AddArg(v0) + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(auxTo32F(c) <= auxTo32F(d)) return true } - // match: (Div32u x (Const32 [c])) - // cond: umagicOK(32, c) && config.RegSize == 8 && config.useAvg - // result: (Trunc64to32 (Rsh64Ux64 (Avg64u (Lsh64x64 (ZeroExt32to64 x) (Const64 [32])) (Mul64 (Const64 [int64(umagic(32,c).m)]) (ZeroExt32to64 x))) (Const64 [32+umagic(32,c).s-1]))) + return false +} +func rewriteValuegeneric_OpLeq32U_0(v *Value) bool { + // match: (Leq32U (Const32 [c]) (Const32 [d])) + // result: (ConstBool [b2i(uint32(c) <= uint32(d))]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 { + v_0 := v.Args[0] + if v_0.Op != OpConst32 { break } - c := v_1.AuxInt - if !(umagicOK(32, c) && config.RegSize == 8 && config.useAvg) { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst32 { break } - v.reset(OpTrunc64to32) - v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpAvg64u, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpLsh64x64, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) - v3.AddArg(x) - v2.AddArg(v3) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = 32 - v2.AddArg(v4) - v1.AddArg(v2) - v5 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt32) - v6.AuxInt = int64(umagic(32, c).m) - v5.AddArg(v6) - v7 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) - v7.AddArg(x) - v5.AddArg(v7) - v1.AddArg(v5) - v0.AddArg(v1) - v8 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v8.AuxInt = 32 + umagic(32, c).s - 1 - v0.AddArg(v8) - v.AddArg(v0) + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(uint32(c) <= uint32(d)) return true } return false } -func rewriteValuegeneric_OpDiv64_0(v *Value) bool { - b := v.Block - config := b.Func.Config - typ := &b.Func.Config.Types - // match: (Div64 (Const64 [c]) (Const64 [d])) - // cond: d != 0 - // result: (Const64 [c/d]) +func rewriteValuegeneric_OpLeq64_0(v *Value) bool { + // match: (Leq64 (Const64 [c]) (Const64 [d])) + // result: (ConstBool [b2i(c <= d)]) for { _ = v.Args[1] v_0 := v.Args[0] @@ -7257,257 +9687,204 @@ func rewriteValuegeneric_OpDiv64_0(v *Value) bool { break } d := v_1.AuxInt - if !(d != 0) { - break - } - v.reset(OpConst64) - v.AuxInt = c / d + v.reset(OpConstBool) + v.AuxInt = b2i(c <= d) return true } - // match: (Div64 n (Const64 [c])) - // cond: isNonNegative(n) && isPowerOfTwo(c) - // result: (Rsh64Ux64 n (Const64 [log2(c)])) + return false +} +func rewriteValuegeneric_OpLeq64F_0(v *Value) bool { + // match: (Leq64F (Const64F [c]) (Const64F [d])) + // result: (ConstBool [b2i(auxTo64F(c) <= auxTo64F(d))]) for { _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 { + v_0 := v.Args[0] + if v_0.Op != OpConst64F { break } - c := v_1.AuxInt - if !(isNonNegative(n) && isPowerOfTwo(c)) { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64F { break } - v.reset(OpRsh64Ux64) - v.AddArg(n) - v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v0.AuxInt = log2(c) - v.AddArg(v0) + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(auxTo64F(c) <= auxTo64F(d)) return true } - // match: (Div64 n (Const64 [-1<<63])) - // cond: isNonNegative(n) - // result: (Const64 [0]) + return false +} +func rewriteValuegeneric_OpLeq64U_0(v *Value) bool { + // match: (Leq64U (Const64 [c]) (Const64 [d])) + // result: (ConstBool [b2i(uint64(c) <= uint64(d))]) for { _ = v.Args[1] - n := v.Args[0] + v_0 := v.Args[0] + if v_0.Op != OpConst64 { + break + } + c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != -1<<63 || !(isNonNegative(n)) { + if v_1.Op != OpConst64 { break } - v.reset(OpConst64) - v.AuxInt = 0 + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(uint64(c) <= uint64(d)) return true } - // match: (Div64 n (Const64 [c])) - // cond: c < 0 && c != -1<<63 - // result: (Neg64 (Div64 n (Const64 [-c]))) + return false +} +func rewriteValuegeneric_OpLeq8_0(v *Value) bool { + // match: (Leq8 (Const8 [c]) (Const8 [d])) + // result: (ConstBool [b2i(c <= d)]) for { - t := v.Type _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 { + v_0 := v.Args[0] + if v_0.Op != OpConst8 { break } - c := v_1.AuxInt - if !(c < 0 && c != -1<<63) { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst8 { break } - v.reset(OpNeg64) - v0 := b.NewValue0(v.Pos, OpDiv64, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst64, t) - v1.AuxInt = -c - v0.AddArg(v1) - v.AddArg(v0) + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c <= d) return true } - // match: (Div64 x (Const64 [-1<<63])) - // result: (Rsh64Ux64 (And64 x (Neg64 x)) (Const64 [63])) + return false +} +func rewriteValuegeneric_OpLeq8U_0(v *Value) bool { + // match: (Leq8U (Const8 [c]) (Const8 [d])) + // result: (ConstBool [b2i(uint8(c) <= uint8(d))]) for { - t := v.Type _ = v.Args[1] - x := v.Args[0] + v_0 := v.Args[0] + if v_0.Op != OpConst8 { + break + } + c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != -1<<63 { + if v_1.Op != OpConst8 { break } - v.reset(OpRsh64Ux64) - v0 := b.NewValue0(v.Pos, OpAnd64, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpNeg64, t) - v1.AddArg(x) - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = 63 - v.AddArg(v2) + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(uint8(c) <= uint8(d)) return true } - // match: (Div64 n (Const64 [c])) - // cond: isPowerOfTwo(c) - // result: (Rsh64x64 (Add64 n (Rsh64Ux64 (Rsh64x64 n (Const64 [63])) (Const64 [64-log2(c)]))) (Const64 [log2(c)])) + return false +} +func rewriteValuegeneric_OpLess16_0(v *Value) bool { + // match: (Less16 (Const16 [c]) (Const16 [d])) + // result: (ConstBool [b2i(c < d)]) for { - t := v.Type _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 { + v_0 := v.Args[0] + if v_0.Op != OpConst16 { break } - c := v_1.AuxInt - if !(isPowerOfTwo(c)) { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst16 { break } - v.reset(OpRsh64x64) - v0 := b.NewValue0(v.Pos, OpAdd64, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpRsh64Ux64, t) - v2 := b.NewValue0(v.Pos, OpRsh64x64, t) - v2.AddArg(n) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = 63 - v2.AddArg(v3) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = 64 - log2(c) - v1.AddArg(v4) - v0.AddArg(v1) - v.AddArg(v0) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = log2(c) - v.AddArg(v5) + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c < d) return true } - // match: (Div64 x (Const64 [c])) - // cond: smagicOK(64,c) && smagic(64,c).m&1 == 0 && config.useHmul - // result: (Sub64 (Rsh64x64 (Hmul64 (Const64 [int64(smagic(64,c).m/2)]) x) (Const64 [smagic(64,c).s-1])) (Rsh64x64 x (Const64 [63]))) + return false +} +func rewriteValuegeneric_OpLess16U_0(v *Value) bool { + // match: (Less16U (Const16 [c]) (Const16 [d])) + // result: (ConstBool [b2i(uint16(c) < uint16(d))]) for { - t := v.Type _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 { + v_0 := v.Args[0] + if v_0.Op != OpConst16 { break } - c := v_1.AuxInt - if !(smagicOK(64, c) && smagic(64, c).m&1 == 0 && config.useHmul) { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst16 { break } - v.reset(OpSub64) - v.Type = t - v0 := b.NewValue0(v.Pos, OpRsh64x64, t) - v1 := b.NewValue0(v.Pos, OpHmul64, t) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = int64(smagic(64, c).m / 2) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = smagic(64, c).s - 1 - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpRsh64x64, t) - v4.AddArg(x) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = 63 - v4.AddArg(v5) - v.AddArg(v4) + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(uint16(c) < uint16(d)) return true } - // match: (Div64 x (Const64 [c])) - // cond: smagicOK(64,c) && smagic(64,c).m&1 != 0 && config.useHmul - // result: (Sub64 (Rsh64x64 (Add64 (Hmul64 (Const64 [int64(smagic(64,c).m)]) x) x) (Const64 [smagic(64,c).s])) (Rsh64x64 x (Const64 [63]))) + return false +} +func rewriteValuegeneric_OpLess32_0(v *Value) bool { + // match: (Less32 (Const32 [c]) (Const32 [d])) + // result: (ConstBool [b2i(c < d)]) for { - t := v.Type _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 { + v_0 := v.Args[0] + if v_0.Op != OpConst32 { break } - c := v_1.AuxInt - if !(smagicOK(64, c) && smagic(64, c).m&1 != 0 && config.useHmul) { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst32 { break } - v.reset(OpSub64) - v.Type = t - v0 := b.NewValue0(v.Pos, OpRsh64x64, t) - v1 := b.NewValue0(v.Pos, OpAdd64, t) - v2 := b.NewValue0(v.Pos, OpHmul64, t) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(smagic(64, c).m) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = smagic(64, c).s - v0.AddArg(v4) - v.AddArg(v0) - v5 := b.NewValue0(v.Pos, OpRsh64x64, t) - v5.AddArg(x) - v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v6.AuxInt = 63 - v5.AddArg(v6) - v.AddArg(v5) + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c < d) return true } return false } -func rewriteValuegeneric_OpDiv64F_0(v *Value) bool { - b := v.Block - // match: (Div64F (Const64F [c]) (Const64F [d])) - // result: (Const64F [auxFrom64F(auxTo64F(c) / auxTo64F(d))]) +func rewriteValuegeneric_OpLess32F_0(v *Value) bool { + // match: (Less32F (Const32F [c]) (Const32F [d])) + // result: (ConstBool [b2i(auxTo32F(c) < auxTo32F(d))]) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst64F { + if v_0.Op != OpConst32F { break } c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpConst64F { + if v_1.Op != OpConst32F { break } d := v_1.AuxInt - v.reset(OpConst64F) - v.AuxInt = auxFrom64F(auxTo64F(c) / auxTo64F(d)) + v.reset(OpConstBool) + v.AuxInt = b2i(auxTo32F(c) < auxTo32F(d)) return true } - // match: (Div64F x (Const64F [c])) - // cond: reciprocalExact64(auxTo64F(c)) - // result: (Mul64F x (Const64F [auxFrom64F(1/auxTo64F(c))])) + return false +} +func rewriteValuegeneric_OpLess32U_0(v *Value) bool { + // match: (Less32U (Const32 [c]) (Const32 [d])) + // result: (ConstBool [b2i(uint32(c) < uint32(d))]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64F { + v_0 := v.Args[0] + if v_0.Op != OpConst32 { break } - t := v_1.Type - c := v_1.AuxInt - if !(reciprocalExact64(auxTo64F(c))) { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst32 { break } - v.reset(OpMul64F) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64F, t) - v0.AuxInt = auxFrom64F(1 / auxTo64F(c)) - v.AddArg(v0) + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(uint32(c) < uint32(d)) return true } return false } -func rewriteValuegeneric_OpDiv64u_0(v *Value) bool { - b := v.Block - config := b.Func.Config - typ := &b.Func.Config.Types - // match: (Div64u (Const64 [c]) (Const64 [d])) - // cond: d != 0 - // result: (Const64 [int64(uint64(c)/uint64(d))]) +func rewriteValuegeneric_OpLess64_0(v *Value) bool { + // match: (Less64 (Const64 [c]) (Const64 [d])) + // result: (ConstBool [b2i(c < d)]) for { _ = v.Args[1] v_0 := v.Args[0] @@ -7520,147 +9897,78 @@ func rewriteValuegeneric_OpDiv64u_0(v *Value) bool { break } d := v_1.AuxInt - if !(d != 0) { - break - } - v.reset(OpConst64) - v.AuxInt = int64(uint64(c) / uint64(d)) + v.reset(OpConstBool) + v.AuxInt = b2i(c < d) return true } - // match: (Div64u n (Const64 [c])) - // cond: isPowerOfTwo(c) - // result: (Rsh64Ux64 n (Const64 [log2(c)])) + return false +} +func rewriteValuegeneric_OpLess64F_0(v *Value) bool { + // match: (Less64F (Const64F [c]) (Const64F [d])) + // result: (ConstBool [b2i(auxTo64F(c) < auxTo64F(d))]) for { _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 { + v_0 := v.Args[0] + if v_0.Op != OpConst64F { break } - c := v_1.AuxInt - if !(isPowerOfTwo(c)) { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64F { break } - v.reset(OpRsh64Ux64) - v.AddArg(n) - v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v0.AuxInt = log2(c) - v.AddArg(v0) + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(auxTo64F(c) < auxTo64F(d)) return true } - // match: (Div64u n (Const64 [-1<<63])) - // result: (Rsh64Ux64 n (Const64 [63])) + return false +} +func rewriteValuegeneric_OpLess64U_0(v *Value) bool { + // match: (Less64U (Const64 [c]) (Const64 [d])) + // result: (ConstBool [b2i(uint64(c) < uint64(d))]) for { _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != -1<<63 { + v_0 := v.Args[0] + if v_0.Op != OpConst64 { break } - v.reset(OpRsh64Ux64) - v.AddArg(n) - v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v0.AuxInt = 63 - v.AddArg(v0) - return true - } - // match: (Div64u x (Const64 [c])) - // cond: umagicOK(64, c) && config.RegSize == 8 && umagic(64,c).m&1 == 0 && config.useHmul - // result: (Rsh64Ux64 (Hmul64u (Const64 [int64(1<<63+umagic(64,c).m/2)]) x) (Const64 [umagic(64,c).s-1])) - for { - _ = v.Args[1] - x := v.Args[0] + c := v_0.AuxInt v_1 := v.Args[1] if v_1.Op != OpConst64 { break } - c := v_1.AuxInt - if !(umagicOK(64, c) && config.RegSize == 8 && umagic(64, c).m&1 == 0 && config.useHmul) { - break - } - v.reset(OpRsh64Ux64) - v.Type = typ.UInt64 - v0 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v1.AuxInt = int64(1<<63 + umagic(64, c).m/2) - v0.AddArg(v1) - v0.AddArg(x) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = umagic(64, c).s - 1 - v.AddArg(v2) + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(uint64(c) < uint64(d)) return true } - // match: (Div64u x (Const64 [c])) - // cond: umagicOK(64, c) && config.RegSize == 8 && c&1 == 0 && config.useHmul - // result: (Rsh64Ux64 (Hmul64u (Const64 [int64(1<<63+(umagic(64,c).m+1)/2)]) (Rsh64Ux64 x (Const64 [1]))) (Const64 [umagic(64,c).s-2])) + return false +} +func rewriteValuegeneric_OpLess8_0(v *Value) bool { + // match: (Less8 (Const8 [c]) (Const8 [d])) + // result: (ConstBool [b2i(c < d)]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c := v_1.AuxInt - if !(umagicOK(64, c) && config.RegSize == 8 && c&1 == 0 && config.useHmul) { + v_0 := v.Args[0] + if v_0.Op != OpConst8 { break } - v.reset(OpRsh64Ux64) - v.Type = typ.UInt64 - v0 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v1.AuxInt = int64(1<<63 + (umagic(64, c).m+1)/2) - v0.AddArg(v1) - v2 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) - v2.AddArg(x) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = 1 - v2.AddArg(v3) - v0.AddArg(v2) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = umagic(64, c).s - 2 - v.AddArg(v4) - return true - } - // match: (Div64u x (Const64 [c])) - // cond: umagicOK(64, c) && config.RegSize == 8 && config.useAvg && config.useHmul - // result: (Rsh64Ux64 (Avg64u x (Hmul64u (Const64 [int64(umagic(64,c).m)]) x)) (Const64 [umagic(64,c).s-1])) - for { - _ = v.Args[1] - x := v.Args[0] + c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c := v_1.AuxInt - if !(umagicOK(64, c) && config.RegSize == 8 && config.useAvg && config.useHmul) { + if v_1.Op != OpConst8 { break } - v.reset(OpRsh64Ux64) - v.Type = typ.UInt64 - v0 := b.NewValue0(v.Pos, OpAvg64u, typ.UInt64) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = int64(umagic(64, c).m) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v.AddArg(v0) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = umagic(64, c).s - 1 - v.AddArg(v3) + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c < d) return true } return false } -func rewriteValuegeneric_OpDiv8_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Div8 (Const8 [c]) (Const8 [d])) - // cond: d != 0 - // result: (Const8 [int64(int8(c)/int8(d))]) +func rewriteValuegeneric_OpLess8U_0(v *Value) bool { + // match: (Less8U (Const8 [c]) (Const8 [d])) + // result: (ConstBool [b2i(uint8(c) < uint8(d))]) for { _ = v.Args[1] v_0 := v.Args[0] @@ -7673,33547 +9981,7383 @@ func rewriteValuegeneric_OpDiv8_0(v *Value) bool { break } d := v_1.AuxInt - if !(d != 0) { - break - } - v.reset(OpConst8) - v.AuxInt = int64(int8(c) / int8(d)) + v.reset(OpConstBool) + v.AuxInt = b2i(uint8(c) < uint8(d)) return true } - // match: (Div8 n (Const8 [c])) - // cond: isNonNegative(n) && isPowerOfTwo(c&0xff) - // result: (Rsh8Ux64 n (Const64 [log2(c&0xff)])) + return false +} +func rewriteValuegeneric_OpLoad_0(v *Value) bool { + b := v.Block + fe := b.Func.fe + // match: (Load p1 (Store {t2} p2 x _)) + // cond: isSamePtr(p1, p2) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == sizeof(t2) + // result: x for { + t1 := v.Type _ = v.Args[1] - n := v.Args[0] + p1 := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpConst8 { + if v_1.Op != OpStore { break } - c := v_1.AuxInt - if !(isNonNegative(n) && isPowerOfTwo(c&0xff)) { + t2 := v_1.Aux + _ = v_1.Args[2] + p2 := v_1.Args[0] + x := v_1.Args[1] + if !(isSamePtr(p1, p2) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == sizeof(t2)) { break } - v.reset(OpRsh8Ux64) - v.AddArg(n) - v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v0.AuxInt = log2(c & 0xff) - v.AddArg(v0) + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (Div8 n (Const8 [c])) - // cond: c < 0 && c != -1<<7 - // result: (Neg8 (Div8 n (Const8 [-c]))) + // match: (Load p1 (Store {t2} p2 _ (Store {t3} p3 x _))) + // cond: isSamePtr(p1, p3) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == sizeof(t2) && disjoint(p3, sizeof(t3), p2, sizeof(t2)) + // result: x for { - t := v.Type + t1 := v.Type _ = v.Args[1] - n := v.Args[0] + p1 := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpConst8 { + if v_1.Op != OpStore { break } - c := v_1.AuxInt - if !(c < 0 && c != -1<<7) { + t2 := v_1.Aux + _ = v_1.Args[2] + p2 := v_1.Args[0] + v_1_2 := v_1.Args[2] + if v_1_2.Op != OpStore { break } - v.reset(OpNeg8) - v0 := b.NewValue0(v.Pos, OpDiv8, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst8, t) - v1.AuxInt = -c - v0.AddArg(v1) - v.AddArg(v0) + t3 := v_1_2.Aux + _ = v_1_2.Args[2] + p3 := v_1_2.Args[0] + x := v_1_2.Args[1] + if !(isSamePtr(p1, p3) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == sizeof(t2) && disjoint(p3, sizeof(t3), p2, sizeof(t2))) { + break + } + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (Div8 x (Const8 [-1<<7 ])) - // result: (Rsh8Ux64 (And8 x (Neg8 x)) (Const64 [7 ])) + // match: (Load p1 (Store {t2} p2 _ (Store {t3} p3 _ (Store {t4} p4 x _)))) + // cond: isSamePtr(p1, p4) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == sizeof(t2) && disjoint(p4, sizeof(t4), p2, sizeof(t2)) && disjoint(p4, sizeof(t4), p3, sizeof(t3)) + // result: x for { - t := v.Type + t1 := v.Type _ = v.Args[1] - x := v.Args[0] + p1 := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.AuxInt != -1<<7 { + if v_1.Op != OpStore { break } - v.reset(OpRsh8Ux64) - v0 := b.NewValue0(v.Pos, OpAnd8, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpNeg8, t) - v1.AddArg(x) - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = 7 - v.AddArg(v2) + t2 := v_1.Aux + _ = v_1.Args[2] + p2 := v_1.Args[0] + v_1_2 := v_1.Args[2] + if v_1_2.Op != OpStore { + break + } + t3 := v_1_2.Aux + _ = v_1_2.Args[2] + p3 := v_1_2.Args[0] + v_1_2_2 := v_1_2.Args[2] + if v_1_2_2.Op != OpStore { + break + } + t4 := v_1_2_2.Aux + _ = v_1_2_2.Args[2] + p4 := v_1_2_2.Args[0] + x := v_1_2_2.Args[1] + if !(isSamePtr(p1, p4) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == sizeof(t2) && disjoint(p4, sizeof(t4), p2, sizeof(t2)) && disjoint(p4, sizeof(t4), p3, sizeof(t3))) { + break + } + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (Div8 n (Const8 [c])) - // cond: isPowerOfTwo(c) - // result: (Rsh8x64 (Add8 n (Rsh8Ux64 (Rsh8x64 n (Const64 [ 7])) (Const64 [ 8-log2(c)]))) (Const64 [log2(c)])) + // match: (Load p1 (Store {t2} p2 _ (Store {t3} p3 _ (Store {t4} p4 _ (Store {t5} p5 x _))))) + // cond: isSamePtr(p1, p5) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == sizeof(t2) && disjoint(p5, sizeof(t5), p2, sizeof(t2)) && disjoint(p5, sizeof(t5), p3, sizeof(t3)) && disjoint(p5, sizeof(t5), p4, sizeof(t4)) + // result: x for { - t := v.Type + t1 := v.Type _ = v.Args[1] - n := v.Args[0] + p1 := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpConst8 { + if v_1.Op != OpStore { break } - c := v_1.AuxInt - if !(isPowerOfTwo(c)) { + t2 := v_1.Aux + _ = v_1.Args[2] + p2 := v_1.Args[0] + v_1_2 := v_1.Args[2] + if v_1_2.Op != OpStore { break } - v.reset(OpRsh8x64) - v0 := b.NewValue0(v.Pos, OpAdd8, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpRsh8Ux64, t) - v2 := b.NewValue0(v.Pos, OpRsh8x64, t) - v2.AddArg(n) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = 7 - v2.AddArg(v3) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = 8 - log2(c) - v1.AddArg(v4) - v0.AddArg(v1) - v.AddArg(v0) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = log2(c) - v.AddArg(v5) + t3 := v_1_2.Aux + _ = v_1_2.Args[2] + p3 := v_1_2.Args[0] + v_1_2_2 := v_1_2.Args[2] + if v_1_2_2.Op != OpStore { + break + } + t4 := v_1_2_2.Aux + _ = v_1_2_2.Args[2] + p4 := v_1_2_2.Args[0] + v_1_2_2_2 := v_1_2_2.Args[2] + if v_1_2_2_2.Op != OpStore { + break + } + t5 := v_1_2_2_2.Aux + _ = v_1_2_2_2.Args[2] + p5 := v_1_2_2_2.Args[0] + x := v_1_2_2_2.Args[1] + if !(isSamePtr(p1, p5) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == sizeof(t2) && disjoint(p5, sizeof(t5), p2, sizeof(t2)) && disjoint(p5, sizeof(t5), p3, sizeof(t3)) && disjoint(p5, sizeof(t5), p4, sizeof(t4))) { + break + } + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (Div8 x (Const8 [c])) - // cond: smagicOK(8,c) - // result: (Sub8 (Rsh32x64 (Mul32 (Const32 [int64(smagic(8,c).m)]) (SignExt8to32 x)) (Const64 [8+smagic(8,c).s])) (Rsh32x64 (SignExt8to32 x) (Const64 [31]))) + // match: (Load p1 (Store {t2} p2 (Const64 [x]) _)) + // cond: isSamePtr(p1,p2) && sizeof(t2) == 8 && is64BitFloat(t1) + // result: (Const64F [x]) for { - t := v.Type + t1 := v.Type _ = v.Args[1] - x := v.Args[0] + p1 := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpConst8 { + if v_1.Op != OpStore { break } - c := v_1.AuxInt - if !(smagicOK(8, c)) { + t2 := v_1.Aux + _ = v_1.Args[2] + p2 := v_1.Args[0] + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpConst64 { break } - v.reset(OpSub8) - v.Type = t - v0 := b.NewValue0(v.Pos, OpRsh32x64, t) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(smagic(8, c).m) - v1.AddArg(v2) - v3 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) - v3.AddArg(x) - v1.AddArg(v3) - v0.AddArg(v1) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = 8 + smagic(8, c).s - v0.AddArg(v4) - v.AddArg(v0) - v5 := b.NewValue0(v.Pos, OpRsh32x64, t) - v6 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) - v6.AddArg(x) - v5.AddArg(v6) - v7 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v7.AuxInt = 31 - v5.AddArg(v7) - v.AddArg(v5) + x := v_1_1.AuxInt + if !(isSamePtr(p1, p2) && sizeof(t2) == 8 && is64BitFloat(t1)) { + break + } + v.reset(OpConst64F) + v.AuxInt = x return true } - return false -} -func rewriteValuegeneric_OpDiv8u_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Div8u (Const8 [c]) (Const8 [d])) - // cond: d != 0 - // result: (Const8 [int64(int8(uint8(c)/uint8(d)))]) + // match: (Load p1 (Store {t2} p2 (Const32 [x]) _)) + // cond: isSamePtr(p1,p2) && sizeof(t2) == 4 && is32BitFloat(t1) + // result: (Const32F [auxFrom32F(math.Float32frombits(uint32(x)))]) for { + t1 := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { + p1 := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpStore { break } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 { + t2 := v_1.Aux + _ = v_1.Args[2] + p2 := v_1.Args[0] + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpConst32 { break } - d := v_1.AuxInt - if !(d != 0) { + x := v_1_1.AuxInt + if !(isSamePtr(p1, p2) && sizeof(t2) == 4 && is32BitFloat(t1)) { break } - v.reset(OpConst8) - v.AuxInt = int64(int8(uint8(c) / uint8(d))) + v.reset(OpConst32F) + v.AuxInt = auxFrom32F(math.Float32frombits(uint32(x))) return true } - // match: (Div8u n (Const8 [c])) - // cond: isPowerOfTwo(c&0xff) - // result: (Rsh8Ux64 n (Const64 [log2(c&0xff)])) + // match: (Load p1 (Store {t2} p2 (Const64F [x]) _)) + // cond: isSamePtr(p1,p2) && sizeof(t2) == 8 && is64BitInt(t1) + // result: (Const64 [x]) for { + t1 := v.Type _ = v.Args[1] - n := v.Args[0] + p1 := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpConst8 { + if v_1.Op != OpStore { break } - c := v_1.AuxInt - if !(isPowerOfTwo(c & 0xff)) { + t2 := v_1.Aux + _ = v_1.Args[2] + p2 := v_1.Args[0] + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpConst64F { break } - v.reset(OpRsh8Ux64) - v.AddArg(n) - v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v0.AuxInt = log2(c & 0xff) - v.AddArg(v0) + x := v_1_1.AuxInt + if !(isSamePtr(p1, p2) && sizeof(t2) == 8 && is64BitInt(t1)) { + break + } + v.reset(OpConst64) + v.AuxInt = x return true } - // match: (Div8u x (Const8 [c])) - // cond: umagicOK(8, c) - // result: (Trunc32to8 (Rsh32Ux64 (Mul32 (Const32 [int64(1<<8+umagic(8,c).m)]) (ZeroExt8to32 x)) (Const64 [8+umagic(8,c).s]))) + // match: (Load p1 (Store {t2} p2 (Const32F [x]) _)) + // cond: isSamePtr(p1,p2) && sizeof(t2) == 4 && is32BitInt(t1) + // result: (Const32 [int64(int32(math.Float32bits(auxTo32F(x))))]) for { + t1 := v.Type _ = v.Args[1] - x := v.Args[0] + p1 := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpConst8 { + if v_1.Op != OpStore { break } - c := v_1.AuxInt - if !(umagicOK(8, c)) { + t2 := v_1.Aux + _ = v_1.Args[2] + p2 := v_1.Args[0] + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpConst32F { break } - v.reset(OpTrunc32to8) - v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(1<<8 + umagic(8, c).m) - v1.AddArg(v2) - v3 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) - v3.AddArg(x) - v1.AddArg(v3) - v0.AddArg(v1) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = 8 + umagic(8, c).s - v0.AddArg(v4) - v.AddArg(v0) - return true - } - return false -} -func rewriteValuegeneric_OpEq16_0(v *Value) bool { - b := v.Block - config := b.Func.Config - typ := &b.Func.Config.Types - // match: (Eq16 x x) - // result: (ConstBool [1]) - for { - x := v.Args[1] - if x != v.Args[0] { + x := v_1_1.AuxInt + if !(isSamePtr(p1, p2) && sizeof(t2) == 4 && is32BitInt(t1)) { break } - v.reset(OpConstBool) - v.AuxInt = 1 + v.reset(OpConst32) + v.AuxInt = int64(int32(math.Float32bits(auxTo32F(x)))) return true } - // match: (Eq16 (Const16 [c]) (Add16 (Const16 [d]) x)) - // result: (Eq16 (Const16 [int64(int16(c-d))]) x) + // match: (Load op:(OffPtr [o1] p1) (Store {t2} p2 _ mem:(Zero [n] p3 _))) + // cond: o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p3) && fe.CanSSA(t1) && disjoint(op, t1.Size(), p2, sizeof(t2)) + // result: @mem.Block (Load (OffPtr [o1] p3) mem) for { + t1 := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { + op := v.Args[0] + if op.Op != OpOffPtr { break } - t := v_0.Type - c := v_0.AuxInt + o1 := op.AuxInt + p1 := op.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAdd16 { + if v_1.Op != OpStore { break } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst16 || v_1_0.Type != t { + t2 := v_1.Aux + _ = v_1.Args[2] + p2 := v_1.Args[0] + mem := v_1.Args[2] + if mem.Op != OpZero { break } - d := v_1_0.AuxInt - v.reset(OpEq16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c - d)) + n := mem.AuxInt + _ = mem.Args[1] + p3 := mem.Args[0] + if !(o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p3) && fe.CanSSA(t1) && disjoint(op, t1.Size(), p2, sizeof(t2))) { + break + } + b = mem.Block + v0 := b.NewValue0(v.Pos, OpLoad, t1) + v.reset(OpCopy) v.AddArg(v0) - v.AddArg(x) + v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type) + v1.AuxInt = o1 + v1.AddArg(p3) + v0.AddArg(v1) + v0.AddArg(mem) return true } - // match: (Eq16 (Const16 [c]) (Add16 x (Const16 [d]))) - // result: (Eq16 (Const16 [int64(int16(c-d))]) x) + // match: (Load op:(OffPtr [o1] p1) (Store {t2} p2 _ (Store {t3} p3 _ mem:(Zero [n] p4 _)))) + // cond: o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p4) && fe.CanSSA(t1) && disjoint(op, t1.Size(), p2, sizeof(t2)) && disjoint(op, t1.Size(), p3, sizeof(t3)) + // result: @mem.Block (Load (OffPtr [o1] p4) mem) for { + t1 := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { + op := v.Args[0] + if op.Op != OpOffPtr { break } - t := v_0.Type - c := v_0.AuxInt + o1 := op.AuxInt + p1 := op.Args[0] v_1 := v.Args[1] - if v_1.Op != OpAdd16 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst16 || v_1_1.Type != t { + if v_1.Op != OpStore { break } - d := v_1_1.AuxInt - v.reset(OpEq16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c - d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Eq16 (Add16 (Const16 [d]) x) (Const16 [c])) - // result: (Eq16 (Const16 [int64(int16(c-d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd16 { + t2 := v_1.Aux + _ = v_1.Args[2] + p2 := v_1.Args[0] + v_1_2 := v_1.Args[2] + if v_1_2.Op != OpStore { break } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst16 { + t3 := v_1_2.Aux + _ = v_1_2.Args[2] + p3 := v_1_2.Args[0] + mem := v_1_2.Args[2] + if mem.Op != OpZero { break } - t := v_0_0.Type - d := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.Type != t { + n := mem.AuxInt + _ = mem.Args[1] + p4 := mem.Args[0] + if !(o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p4) && fe.CanSSA(t1) && disjoint(op, t1.Size(), p2, sizeof(t2)) && disjoint(op, t1.Size(), p3, sizeof(t3))) { break } - c := v_1.AuxInt - v.reset(OpEq16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c - d)) + b = mem.Block + v0 := b.NewValue0(v.Pos, OpLoad, t1) + v.reset(OpCopy) v.AddArg(v0) - v.AddArg(x) + v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type) + v1.AuxInt = o1 + v1.AddArg(p4) + v0.AddArg(v1) + v0.AddArg(mem) return true } - // match: (Eq16 (Add16 x (Const16 [d])) (Const16 [c])) - // result: (Eq16 (Const16 [int64(int16(c-d))]) x) + return false +} +func rewriteValuegeneric_OpLoad_10(v *Value) bool { + b := v.Block + fe := b.Func.fe + // match: (Load op:(OffPtr [o1] p1) (Store {t2} p2 _ (Store {t3} p3 _ (Store {t4} p4 _ mem:(Zero [n] p5 _))))) + // cond: o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p5) && fe.CanSSA(t1) && disjoint(op, t1.Size(), p2, sizeof(t2)) && disjoint(op, t1.Size(), p3, sizeof(t3)) && disjoint(op, t1.Size(), p4, sizeof(t4)) + // result: @mem.Block (Load (OffPtr [o1] p5) mem) for { + t1 := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd16 { + op := v.Args[0] + if op.Op != OpOffPtr { break } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst16 { + o1 := op.AuxInt + p1 := op.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpStore { break } - t := v_0_1.Type - d := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.Type != t { + t2 := v_1.Aux + _ = v_1.Args[2] + p2 := v_1.Args[0] + v_1_2 := v_1.Args[2] + if v_1_2.Op != OpStore { break } - c := v_1.AuxInt - v.reset(OpEq16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c - d)) + t3 := v_1_2.Aux + _ = v_1_2.Args[2] + p3 := v_1_2.Args[0] + v_1_2_2 := v_1_2.Args[2] + if v_1_2_2.Op != OpStore { + break + } + t4 := v_1_2_2.Aux + _ = v_1_2_2.Args[2] + p4 := v_1_2_2.Args[0] + mem := v_1_2_2.Args[2] + if mem.Op != OpZero { + break + } + n := mem.AuxInt + _ = mem.Args[1] + p5 := mem.Args[0] + if !(o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p5) && fe.CanSSA(t1) && disjoint(op, t1.Size(), p2, sizeof(t2)) && disjoint(op, t1.Size(), p3, sizeof(t3)) && disjoint(op, t1.Size(), p4, sizeof(t4))) { + break + } + b = mem.Block + v0 := b.NewValue0(v.Pos, OpLoad, t1) + v.reset(OpCopy) v.AddArg(v0) - v.AddArg(x) + v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type) + v1.AuxInt = o1 + v1.AddArg(p5) + v0.AddArg(v1) + v0.AddArg(mem) return true } - // match: (Eq16 (Const16 [c]) (Const16 [d])) - // result: (ConstBool [b2i(c == d)]) + // match: (Load op:(OffPtr [o1] p1) (Store {t2} p2 _ (Store {t3} p3 _ (Store {t4} p4 _ (Store {t5} p5 _ mem:(Zero [n] p6 _)))))) + // cond: o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p6) && fe.CanSSA(t1) && disjoint(op, t1.Size(), p2, sizeof(t2)) && disjoint(op, t1.Size(), p3, sizeof(t3)) && disjoint(op, t1.Size(), p4, sizeof(t4)) && disjoint(op, t1.Size(), p5, sizeof(t5)) + // result: @mem.Block (Load (OffPtr [o1] p6) mem) for { + t1 := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { + op := v.Args[0] + if op.Op != OpOffPtr { break } - c := v_0.AuxInt + o1 := op.AuxInt + p1 := op.Args[0] v_1 := v.Args[1] - if v_1.Op != OpConst16 { + if v_1.Op != OpStore { break } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c == d) + t2 := v_1.Aux + _ = v_1.Args[2] + p2 := v_1.Args[0] + v_1_2 := v_1.Args[2] + if v_1_2.Op != OpStore { + break + } + t3 := v_1_2.Aux + _ = v_1_2.Args[2] + p3 := v_1_2.Args[0] + v_1_2_2 := v_1_2.Args[2] + if v_1_2_2.Op != OpStore { + break + } + t4 := v_1_2_2.Aux + _ = v_1_2_2.Args[2] + p4 := v_1_2_2.Args[0] + v_1_2_2_2 := v_1_2_2.Args[2] + if v_1_2_2_2.Op != OpStore { + break + } + t5 := v_1_2_2_2.Aux + _ = v_1_2_2_2.Args[2] + p5 := v_1_2_2_2.Args[0] + mem := v_1_2_2_2.Args[2] + if mem.Op != OpZero { + break + } + n := mem.AuxInt + _ = mem.Args[1] + p6 := mem.Args[0] + if !(o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p6) && fe.CanSSA(t1) && disjoint(op, t1.Size(), p2, sizeof(t2)) && disjoint(op, t1.Size(), p3, sizeof(t3)) && disjoint(op, t1.Size(), p4, sizeof(t4)) && disjoint(op, t1.Size(), p5, sizeof(t5))) { + break + } + b = mem.Block + v0 := b.NewValue0(v.Pos, OpLoad, t1) + v.reset(OpCopy) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type) + v1.AuxInt = o1 + v1.AddArg(p6) + v0.AddArg(v1) + v0.AddArg(mem) return true } - // match: (Eq16 (Const16 [d]) (Const16 [c])) - // result: (ConstBool [b2i(c == d)]) + // match: (Load (OffPtr [o] p1) (Zero [n] p2 _)) + // cond: t1.IsBoolean() && isSamePtr(p1, p2) && n >= o + 1 + // result: (ConstBool [0]) for { + t1 := v.Type _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst16 { + if v_0.Op != OpOffPtr { break } - d := v_0.AuxInt + o := v_0.AuxInt + p1 := v_0.Args[0] v_1 := v.Args[1] - if v_1.Op != OpConst16 { + if v_1.Op != OpZero { + break + } + n := v_1.AuxInt + _ = v_1.Args[1] + p2 := v_1.Args[0] + if !(t1.IsBoolean() && isSamePtr(p1, p2) && n >= o+1) { break } - c := v_1.AuxInt v.reset(OpConstBool) - v.AuxInt = b2i(c == d) + v.AuxInt = 0 return true } - // match: (Eq16 (Mod16u x (Const16 [c])) (Const16 [0])) - // cond: x.Op != OpConst16 && udivisibleOK(16,c) && !hasSmallRotate(config) - // result: (Eq32 (Mod32u (ZeroExt16to32 x) (Const32 [c&0xffff])) (Const32 [0])) + // match: (Load (OffPtr [o] p1) (Zero [n] p2 _)) + // cond: is8BitInt(t1) && isSamePtr(p1, p2) && n >= o + 1 + // result: (Const8 [0]) for { + t1 := v.Type _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpMod16u { + if v_0.Op != OpOffPtr { break } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst16 { + o := v_0.AuxInt + p1 := v_0.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpZero { break } - c := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.AuxInt != 0 || !(x.Op != OpConst16 && udivisibleOK(16, c) && !hasSmallRotate(config)) { + n := v_1.AuxInt + _ = v_1.Args[1] + p2 := v_1.Args[0] + if !(is8BitInt(t1) && isSamePtr(p1, p2) && n >= o+1) { break } - v.reset(OpEq32) - v0 := b.NewValue0(v.Pos, OpMod32u, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) - v1.AddArg(x) - v0.AddArg(v1) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = c & 0xffff - v0.AddArg(v2) - v.AddArg(v0) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = 0 - v.AddArg(v3) + v.reset(OpConst8) + v.AuxInt = 0 return true } - // match: (Eq16 (Const16 [0]) (Mod16u x (Const16 [c]))) - // cond: x.Op != OpConst16 && udivisibleOK(16,c) && !hasSmallRotate(config) - // result: (Eq32 (Mod32u (ZeroExt16to32 x) (Const32 [c&0xffff])) (Const32 [0])) + // match: (Load (OffPtr [o] p1) (Zero [n] p2 _)) + // cond: is16BitInt(t1) && isSamePtr(p1, p2) && n >= o + 2 + // result: (Const16 [0]) for { + t1 := v.Type _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst16 || v_0.AuxInt != 0 { + if v_0.Op != OpOffPtr { break } + o := v_0.AuxInt + p1 := v_0.Args[0] v_1 := v.Args[1] - if v_1.Op != OpMod16u { + if v_1.Op != OpZero { break } + n := v_1.AuxInt _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst16 { - break - } - c := v_1_1.AuxInt - if !(x.Op != OpConst16 && udivisibleOK(16, c) && !hasSmallRotate(config)) { + p2 := v_1.Args[0] + if !(is16BitInt(t1) && isSamePtr(p1, p2) && n >= o+2) { break } - v.reset(OpEq32) - v0 := b.NewValue0(v.Pos, OpMod32u, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) - v1.AddArg(x) - v0.AddArg(v1) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = c & 0xffff - v0.AddArg(v2) - v.AddArg(v0) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = 0 - v.AddArg(v3) + v.reset(OpConst16) + v.AuxInt = 0 return true } - // match: (Eq16 (Mod16 x (Const16 [c])) (Const16 [0])) - // cond: x.Op != OpConst16 && sdivisibleOK(16,c) && !hasSmallRotate(config) - // result: (Eq32 (Mod32 (SignExt16to32 x) (Const32 [c])) (Const32 [0])) + // match: (Load (OffPtr [o] p1) (Zero [n] p2 _)) + // cond: is32BitInt(t1) && isSamePtr(p1, p2) && n >= o + 4 + // result: (Const32 [0]) for { + t1 := v.Type _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpMod16 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst16 { + if v_0.Op != OpOffPtr { break } - c := v_0_1.AuxInt + o := v_0.AuxInt + p1 := v_0.Args[0] v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.AuxInt != 0 || !(x.Op != OpConst16 && sdivisibleOK(16, c) && !hasSmallRotate(config)) { + if v_1.Op != OpZero { break } - v.reset(OpEq32) - v0 := b.NewValue0(v.Pos, OpMod32, typ.Int32) - v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) - v1.AddArg(x) - v0.AddArg(v1) - v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32) - v2.AuxInt = c - v0.AddArg(v2) - v.AddArg(v0) - v3 := b.NewValue0(v.Pos, OpConst32, typ.Int32) - v3.AuxInt = 0 - v.AddArg(v3) + n := v_1.AuxInt + _ = v_1.Args[1] + p2 := v_1.Args[0] + if !(is32BitInt(t1) && isSamePtr(p1, p2) && n >= o+4) { + break + } + v.reset(OpConst32) + v.AuxInt = 0 return true } - return false -} -func rewriteValuegeneric_OpEq16_10(v *Value) bool { - b := v.Block - config := b.Func.Config - typ := &b.Func.Config.Types - // match: (Eq16 (Const16 [0]) (Mod16 x (Const16 [c]))) - // cond: x.Op != OpConst16 && sdivisibleOK(16,c) && !hasSmallRotate(config) - // result: (Eq32 (Mod32 (SignExt16to32 x) (Const32 [c])) (Const32 [0])) + // match: (Load (OffPtr [o] p1) (Zero [n] p2 _)) + // cond: is64BitInt(t1) && isSamePtr(p1, p2) && n >= o + 8 + // result: (Const64 [0]) for { + t1 := v.Type _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst16 || v_0.AuxInt != 0 { + if v_0.Op != OpOffPtr { break } + o := v_0.AuxInt + p1 := v_0.Args[0] v_1 := v.Args[1] - if v_1.Op != OpMod16 { + if v_1.Op != OpZero { break } + n := v_1.AuxInt _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst16 { - break - } - c := v_1_1.AuxInt - if !(x.Op != OpConst16 && sdivisibleOK(16, c) && !hasSmallRotate(config)) { + p2 := v_1.Args[0] + if !(is64BitInt(t1) && isSamePtr(p1, p2) && n >= o+8) { break } - v.reset(OpEq32) - v0 := b.NewValue0(v.Pos, OpMod32, typ.Int32) - v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) - v1.AddArg(x) - v0.AddArg(v1) - v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32) - v2.AuxInt = c - v0.AddArg(v2) - v.AddArg(v0) - v3 := b.NewValue0(v.Pos, OpConst32, typ.Int32) - v3.AuxInt = 0 - v.AddArg(v3) + v.reset(OpConst64) + v.AuxInt = 0 return true } - // match: (Eq16 x (Mul16 (Const16 [c]) (Trunc64to16 (Rsh64Ux64 mul:(Mul64 (Const64 [m]) (ZeroExt16to64 x)) (Const64 [s]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<16+umagic(16,c).m) && s == 16+umagic(16,c).s && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + // match: (Load (OffPtr [o] p1) (Zero [n] p2 _)) + // cond: is32BitFloat(t1) && isSamePtr(p1, p2) && n >= o + 4 + // result: (Const32F [0]) for { + t1 := v.Type _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst16 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpTrunc64to16 { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh64Ux64 { - break - } - _ = v_1_1_0.Args[1] - mul := v_1_1_0.Args[0] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpZeroExt16to64 || x != mul_1.Args[0] { + v_0 := v.Args[0] + if v_0.Op != OpOffPtr { break } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { + o := v_0.AuxInt + p1 := v_0.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpZero { break } - s := v_1_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<16+umagic(16, c).m) && s == 16+umagic(16, c).s && x.Op != OpConst16 && udivisibleOK(16, c)) { + n := v_1.AuxInt + _ = v_1.Args[1] + p2 := v_1.Args[0] + if !(is32BitFloat(t1) && isSamePtr(p1, p2) && n >= o+4) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) + v.reset(OpConst32F) + v.AuxInt = 0 return true } - // match: (Eq16 x (Mul16 (Const16 [c]) (Trunc64to16 (Rsh64Ux64 mul:(Mul64 (ZeroExt16to64 x) (Const64 [m])) (Const64 [s]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<16+umagic(16,c).m) && s == 16+umagic(16,c).s && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + // match: (Load (OffPtr [o] p1) (Zero [n] p2 _)) + // cond: is64BitFloat(t1) && isSamePtr(p1, p2) && n >= o + 8 + // result: (Const64F [0]) for { + t1 := v.Type _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst16 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpTrunc64to16 { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh64Ux64 { - break - } - _ = v_1_1_0.Args[1] - mul := v_1_1_0.Args[0] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpZeroExt16to64 || x != mul_0.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { + v_0 := v.Args[0] + if v_0.Op != OpOffPtr { break } - m := mul_1.AuxInt - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { + o := v_0.AuxInt + p1 := v_0.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpZero { break } - s := v_1_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<16+umagic(16, c).m) && s == 16+umagic(16, c).s && x.Op != OpConst16 && udivisibleOK(16, c)) { + n := v_1.AuxInt + _ = v_1.Args[1] + p2 := v_1.Args[0] + if !(is64BitFloat(t1) && isSamePtr(p1, p2) && n >= o+8) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) + v.reset(OpConst64F) + v.AuxInt = 0 return true } - // match: (Eq16 x (Mul16 (Trunc64to16 (Rsh64Ux64 mul:(Mul64 (Const64 [m]) (ZeroExt16to64 x)) (Const64 [s]))) (Const16 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<16+umagic(16,c).m) && s == 16+umagic(16,c).s && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + // match: (Load _ _) + // cond: t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t) + // result: (StructMake0) for { + t := v.Type _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpTrunc64to16 { - break - } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh64Ux64 { - break - } - _ = v_1_0_0.Args[1] - mul := v_1_0_0.Args[0] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpZeroExt16to64 || x != mul_1.Args[0] { - break - } - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { - break - } - s := v_1_0_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst16 { + if !(t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t)) { break } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<16+umagic(16, c).m) && s == 16+umagic(16, c).s && x.Op != OpConst16 && udivisibleOK(16, c)) { + v.reset(OpStructMake0) + return true + } + return false +} +func rewriteValuegeneric_OpLoad_20(v *Value) bool { + b := v.Block + fe := b.Func.fe + // match: (Load ptr mem) + // cond: t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t) + // result: (StructMake1 (Load (OffPtr [0] ptr) mem)) + for { + t := v.Type + mem := v.Args[1] + ptr := v.Args[0] + if !(t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t)) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) - v1.AddArg(x) + v.reset(OpStructMake1) + v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) + v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) + v1.AuxInt = 0 + v1.AddArg(ptr) v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) - v0.AddArg(v3) + v0.AddArg(mem) v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) return true } - // match: (Eq16 x (Mul16 (Trunc64to16 (Rsh64Ux64 mul:(Mul64 (ZeroExt16to64 x) (Const64 [m])) (Const64 [s]))) (Const16 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<16+umagic(16,c).m) && s == 16+umagic(16,c).s && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + // match: (Load ptr mem) + // cond: t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t) + // result: (StructMake2 (Load (OffPtr [0] ptr) mem) (Load (OffPtr [t.FieldOff(1)] ptr) mem)) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpTrunc64to16 { - break - } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh64Ux64 { - break - } - _ = v_1_0_0.Args[1] - mul := v_1_0_0.Args[0] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpZeroExt16to64 || x != mul_0.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { - break - } - s := v_1_0_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst16 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<16+umagic(16, c).m) && s == 16+umagic(16, c).s && x.Op != OpConst16 && udivisibleOK(16, c)) { + t := v.Type + mem := v.Args[1] + ptr := v.Args[0] + if !(t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t)) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) - v1.AddArg(x) + v.reset(OpStructMake2) + v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) + v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) + v1.AuxInt = 0 + v1.AddArg(ptr) v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) - v0.AddArg(v3) + v0.AddArg(mem) v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) + v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) + v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) + v3.AuxInt = t.FieldOff(1) + v3.AddArg(ptr) + v2.AddArg(v3) + v2.AddArg(mem) + v.AddArg(v2) return true } - // match: (Eq16 (Mul16 (Const16 [c]) (Trunc64to16 (Rsh64Ux64 mul:(Mul64 (Const64 [m]) (ZeroExt16to64 x)) (Const64 [s])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<16+umagic(16,c).m) && s == 16+umagic(16,c).s && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + // match: (Load ptr mem) + // cond: t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t) + // result: (StructMake3 (Load (OffPtr [0] ptr) mem) (Load (OffPtr [t.FieldOff(1)] ptr) mem) (Load (OffPtr [t.FieldOff(2)] ptr) mem)) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul16 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst16 { + t := v.Type + mem := v.Args[1] + ptr := v.Args[0] + if !(t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t)) { break } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpTrunc64to16 { + v.reset(OpStructMake3) + v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) + v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) + v1.AuxInt = 0 + v1.AddArg(ptr) + v0.AddArg(v1) + v0.AddArg(mem) + v.AddArg(v0) + v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) + v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) + v3.AuxInt = t.FieldOff(1) + v3.AddArg(ptr) + v2.AddArg(v3) + v2.AddArg(mem) + v.AddArg(v2) + v4 := b.NewValue0(v.Pos, OpLoad, t.FieldType(2)) + v5 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) + v5.AuxInt = t.FieldOff(2) + v5.AddArg(ptr) + v4.AddArg(v5) + v4.AddArg(mem) + v.AddArg(v4) + return true + } + // match: (Load ptr mem) + // cond: t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t) + // result: (StructMake4 (Load (OffPtr [0] ptr) mem) (Load (OffPtr [t.FieldOff(1)] ptr) mem) (Load (OffPtr [t.FieldOff(2)] ptr) mem) (Load (OffPtr [t.FieldOff(3)] ptr) mem)) + for { + t := v.Type + mem := v.Args[1] + ptr := v.Args[0] + if !(t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t)) { break } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh64Ux64 { + v.reset(OpStructMake4) + v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) + v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) + v1.AuxInt = 0 + v1.AddArg(ptr) + v0.AddArg(v1) + v0.AddArg(mem) + v.AddArg(v0) + v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) + v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) + v3.AuxInt = t.FieldOff(1) + v3.AddArg(ptr) + v2.AddArg(v3) + v2.AddArg(mem) + v.AddArg(v2) + v4 := b.NewValue0(v.Pos, OpLoad, t.FieldType(2)) + v5 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) + v5.AuxInt = t.FieldOff(2) + v5.AddArg(ptr) + v4.AddArg(v5) + v4.AddArg(mem) + v.AddArg(v4) + v6 := b.NewValue0(v.Pos, OpLoad, t.FieldType(3)) + v7 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(3).PtrTo()) + v7.AuxInt = t.FieldOff(3) + v7.AddArg(ptr) + v6.AddArg(v7) + v6.AddArg(mem) + v.AddArg(v6) + return true + } + // match: (Load _ _) + // cond: t.IsArray() && t.NumElem() == 0 + // result: (ArrayMake0) + for { + t := v.Type + _ = v.Args[1] + if !(t.IsArray() && t.NumElem() == 0) { break } - _ = v_0_1_0.Args[1] - mul := v_0_1_0.Args[0] - if mul.Op != OpMul64 { + v.reset(OpArrayMake0) + return true + } + // match: (Load ptr mem) + // cond: t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t) + // result: (ArrayMake1 (Load ptr mem)) + for { + t := v.Type + mem := v.Args[1] + ptr := v.Args[0] + if !(t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t)) { break } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { + v.reset(OpArrayMake1) + v0 := b.NewValue0(v.Pos, OpLoad, t.Elem()) + v0.AddArg(ptr) + v0.AddArg(mem) + v.AddArg(v0) + return true + } + return false +} +func rewriteValuegeneric_OpLsh16x16_0(v *Value) bool { + b := v.Block + // match: (Lsh16x16 x (Const16 [c])) + // result: (Lsh16x64 x (Const64 [int64(uint16(c))])) + for { + t := v.Type + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst16 { break } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpZeroExt16to64 || x != mul_1.Args[0] { + c := v_1.AuxInt + v.reset(OpLsh16x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint16(c)) + v.AddArg(v0) + return true + } + // match: (Lsh16x16 (Const16 [0]) _) + // result: (Const16 [0]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst16 || v_0.AuxInt != 0 { break } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { + v.reset(OpConst16) + v.AuxInt = 0 + return true + } + return false +} +func rewriteValuegeneric_OpLsh16x32_0(v *Value) bool { + b := v.Block + // match: (Lsh16x32 x (Const32 [c])) + // result: (Lsh16x64 x (Const64 [int64(uint32(c))])) + for { + t := v.Type + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst32 { break } - s := v_0_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<16+umagic(16, c).m) && s == 16+umagic(16, c).s && x.Op != OpConst16 && udivisibleOK(16, c)) { + c := v_1.AuxInt + v.reset(OpLsh16x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint32(c)) + v.AddArg(v0) + return true + } + // match: (Lsh16x32 (Const16 [0]) _) + // result: (Const16 [0]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst16 || v_0.AuxInt != 0 { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) + v.reset(OpConst16) + v.AuxInt = 0 return true } - // match: (Eq16 (Mul16 (Const16 [c]) (Trunc64to16 (Rsh64Ux64 mul:(Mul64 (ZeroExt16to64 x) (Const64 [m])) (Const64 [s])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<16+umagic(16,c).m) && s == 16+umagic(16,c).s && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + return false +} +func rewriteValuegeneric_OpLsh16x64_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (Lsh16x64 (Const16 [c]) (Const64 [d])) + // result: (Const16 [int64(int16(c) << uint64(d))]) for { - x := v.Args[1] + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpMul16 { + if v_0.Op != OpConst16 { break } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst16 { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpTrunc64to16 { + d := v_1.AuxInt + v.reset(OpConst16) + v.AuxInt = int64(int16(c) << uint64(d)) + return true + } + // match: (Lsh16x64 x (Const64 [0])) + // result: x + for { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst64 || v_1.AuxInt != 0 { + break + } + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + // match: (Lsh16x64 (Const16 [0]) _) + // result: (Const16 [0]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst16 || v_0.AuxInt != 0 { break } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh64Ux64 { + v.reset(OpConst16) + v.AuxInt = 0 + return true + } + // match: (Lsh16x64 _ (Const64 [c])) + // cond: uint64(c) >= 16 + // result: (Const16 [0]) + for { + _ = v.Args[1] + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - _ = v_0_1_0.Args[1] - mul := v_0_1_0.Args[0] - if mul.Op != OpMul64 { + c := v_1.AuxInt + if !(uint64(c) >= 16) { break } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpZeroExt16to64 || x != mul_0.Args[0] { + v.reset(OpConst16) + v.AuxInt = 0 + return true + } + // match: (Lsh16x64 (Lsh16x64 x (Const64 [c])) (Const64 [d])) + // cond: !uaddOvf(c,d) + // result: (Lsh16x64 x (Const64 [c+d])) + for { + t := v.Type + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpLsh16x64 { break } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 { break } - m := mul_1.AuxInt - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { + c := v_0_1.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - s := v_0_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<16+umagic(16, c).m) && s == 16+umagic(16, c).s && x.Op != OpConst16 && udivisibleOK(16, c)) { + d := v_1.AuxInt + if !(!uaddOvf(c, d)) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) - v0.AddArg(v3) + v.reset(OpLsh16x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = c + d v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) return true } - // match: (Eq16 (Mul16 (Trunc64to16 (Rsh64Ux64 mul:(Mul64 (Const64 [m]) (ZeroExt16to64 x)) (Const64 [s]))) (Const16 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<16+umagic(16,c).m) && s == 16+umagic(16,c).s && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + // match: (Lsh16x64 (Rsh16Ux64 (Lsh16x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) + // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) + // result: (Lsh16x64 x (Const64 [c1-c2+c3])) for { - x := v.Args[1] + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpMul16 { + if v_0.Op != OpRsh16Ux64 { break } _ = v_0.Args[1] v_0_0 := v_0.Args[0] - if v_0_0.Op != OpTrunc64to16 { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh64Ux64 { + if v_0_0.Op != OpLsh16x64 { break } - _ = v_0_0_0.Args[1] - mul := v_0_0_0.Args[0] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { + _ = v_0_0.Args[1] + x := v_0_0.Args[0] + v_0_0_1 := v_0_0.Args[1] + if v_0_0_1.Op != OpConst64 { break } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpZeroExt16to64 || x != mul_1.Args[0] { + c1 := v_0_0_1.AuxInt + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 { break } - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { + c2 := v_0_1.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - s := v_0_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst16 { + c3 := v_1.AuxInt + if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { break } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<16+umagic(16, c).m) && s == 16+umagic(16, c).s && x.Op != OpConst16 && udivisibleOK(16, c)) { + v.reset(OpLsh16x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v0.AuxInt = c1 - c2 + c3 + v.AddArg(v0) + return true + } + return false +} +func rewriteValuegeneric_OpLsh16x8_0(v *Value) bool { + b := v.Block + // match: (Lsh16x8 x (Const8 [c])) + // result: (Lsh16x64 x (Const64 [int64(uint8(c))])) + for { + t := v.Type + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst8 { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) - v0.AddArg(v3) + c := v_1.AuxInt + v.reset(OpLsh16x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint8(c)) v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) return true } - // match: (Eq16 (Mul16 (Trunc64to16 (Rsh64Ux64 mul:(Mul64 (ZeroExt16to64 x) (Const64 [m])) (Const64 [s]))) (Const16 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<16+umagic(16,c).m) && s == 16+umagic(16,c).s && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + // match: (Lsh16x8 (Const16 [0]) _) + // result: (Const16 [0]) for { - x := v.Args[1] + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpMul16 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpTrunc64to16 { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh64Ux64 { + if v_0.Op != OpConst16 || v_0.AuxInt != 0 { break } - _ = v_0_0_0.Args[1] - mul := v_0_0_0.Args[0] - if mul.Op != OpMul64 { + v.reset(OpConst16) + v.AuxInt = 0 + return true + } + return false +} +func rewriteValuegeneric_OpLsh32x16_0(v *Value) bool { + b := v.Block + // match: (Lsh32x16 x (Const16 [c])) + // result: (Lsh32x64 x (Const64 [int64(uint16(c))])) + for { + t := v.Type + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst16 { break } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpZeroExt16to64 || x != mul_0.Args[0] { + c := v_1.AuxInt + v.reset(OpLsh32x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint16(c)) + v.AddArg(v0) + return true + } + // match: (Lsh32x16 (Const32 [0]) _) + // result: (Const32 [0]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst32 || v_0.AuxInt != 0 { break } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { + v.reset(OpConst32) + v.AuxInt = 0 + return true + } + return false +} +func rewriteValuegeneric_OpLsh32x32_0(v *Value) bool { + b := v.Block + // match: (Lsh32x32 x (Const32 [c])) + // result: (Lsh32x64 x (Const64 [int64(uint32(c))])) + for { + t := v.Type + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst32 { break } - m := mul_1.AuxInt - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { + c := v_1.AuxInt + v.reset(OpLsh32x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint32(c)) + v.AddArg(v0) + return true + } + // match: (Lsh32x32 (Const32 [0]) _) + // result: (Const32 [0]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst32 || v_0.AuxInt != 0 { break } - s := v_0_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst16 { + v.reset(OpConst32) + v.AuxInt = 0 + return true + } + return false +} +func rewriteValuegeneric_OpLsh32x64_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (Lsh32x64 (Const32 [c]) (Const64 [d])) + // result: (Const32 [int64(int32(c) << uint64(d))]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst32 { break } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<16+umagic(16, c).m) && s == 16+umagic(16, c).s && x.Op != OpConst16 && udivisibleOK(16, c)) { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) + d := v_1.AuxInt + v.reset(OpConst32) + v.AuxInt = int64(int32(c) << uint64(d)) return true } - // match: (Eq16 x (Mul16 (Const16 [c]) (Trunc32to16 (Rsh32Ux64 mul:(Mul32 (Const32 [m]) (ZeroExt16to32 x)) (Const64 [s]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+umagic(16,c).m/2) && s == 16+umagic(16,c).s-1 && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + // match: (Lsh32x64 x (Const64 [0])) + // result: x for { _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst16 { + if v_1.Op != OpConst64 || v_1.AuxInt != 0 { break } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpTrunc32to16 { + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + // match: (Lsh32x64 (Const32 [0]) _) + // result: (Const32 [0]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst32 || v_0.AuxInt != 0 { break } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh32Ux64 { + v.reset(OpConst32) + v.AuxInt = 0 + return true + } + // match: (Lsh32x64 _ (Const64 [c])) + // cond: uint64(c) >= 32 + // result: (Const32 [0]) + for { + _ = v.Args[1] + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - _ = v_1_1_0.Args[1] - mul := v_1_1_0.Args[0] - if mul.Op != OpMul32 { + c := v_1.AuxInt + if !(uint64(c) >= 32) { break } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { + v.reset(OpConst32) + v.AuxInt = 0 + return true + } + // match: (Lsh32x64 (Lsh32x64 x (Const64 [c])) (Const64 [d])) + // cond: !uaddOvf(c,d) + // result: (Lsh32x64 x (Const64 [c+d])) + for { + t := v.Type + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpLsh32x64 { break } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpZeroExt16to32 || x != mul_1.Args[0] { + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 { break } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { + c := v_0_1.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - s := v_1_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+umagic(16, c).m/2) && s == 16+umagic(16, c).s-1 && x.Op != OpConst16 && udivisibleOK(16, c)) { + d := v_1.AuxInt + if !(!uaddOvf(c, d)) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) - v0.AddArg(v3) + v.reset(OpLsh32x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = c + d v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) return true } - return false -} -func rewriteValuegeneric_OpEq16_20(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Eq16 x (Mul16 (Const16 [c]) (Trunc32to16 (Rsh32Ux64 mul:(Mul32 (ZeroExt16to32 x) (Const32 [m])) (Const64 [s]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+umagic(16,c).m/2) && s == 16+umagic(16,c).s-1 && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + // match: (Lsh32x64 (Rsh32Ux64 (Lsh32x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) + // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) + // result: (Lsh32x64 x (Const64 [c1-c2+c3])) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst16 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpTrunc32to16 { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh32Ux64 { + v_0 := v.Args[0] + if v_0.Op != OpRsh32Ux64 { break } - _ = v_1_1_0.Args[1] - mul := v_1_1_0.Args[0] - if mul.Op != OpMul32 { + _ = v_0.Args[1] + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpLsh32x64 { break } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpZeroExt16to32 || x != mul_0.Args[0] { + _ = v_0_0.Args[1] + x := v_0_0.Args[0] + v_0_0_1 := v_0_0.Args[1] + if v_0_0_1.Op != OpConst64 { break } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { + c1 := v_0_0_1.AuxInt + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 { break } - m := mul_1.AuxInt - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { + c2 := v_0_1.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - s := v_1_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+umagic(16, c).m/2) && s == 16+umagic(16, c).s-1 && x.Op != OpConst16 && udivisibleOK(16, c)) { + c3 := v_1.AuxInt + if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) - v0.AddArg(v3) + v.reset(OpLsh32x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v0.AuxInt = c1 - c2 + c3 v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) return true } - // match: (Eq16 x (Mul16 (Trunc32to16 (Rsh32Ux64 mul:(Mul32 (Const32 [m]) (ZeroExt16to32 x)) (Const64 [s]))) (Const16 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+umagic(16,c).m/2) && s == 16+umagic(16,c).s-1 && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + return false +} +func rewriteValuegeneric_OpLsh32x8_0(v *Value) bool { + b := v.Block + // match: (Lsh32x8 x (Const8 [c])) + // result: (Lsh32x64 x (Const64 [int64(uint8(c))])) for { + t := v.Type _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpTrunc32to16 { - break - } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh32Ux64 { - break - } - _ = v_1_0_0.Args[1] - mul := v_1_0_0.Args[0] - if mul.Op != OpMul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpZeroExt16to32 || x != mul_1.Args[0] { + if v_1.Op != OpConst8 { break } - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { + c := v_1.AuxInt + v.reset(OpLsh32x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint8(c)) + v.AddArg(v0) + return true + } + // match: (Lsh32x8 (Const32 [0]) _) + // result: (Const32 [0]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst32 || v_0.AuxInt != 0 { break } - s := v_1_0_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst16 { + v.reset(OpConst32) + v.AuxInt = 0 + return true + } + return false +} +func rewriteValuegeneric_OpLsh64x16_0(v *Value) bool { + b := v.Block + // match: (Lsh64x16 x (Const16 [c])) + // result: (Lsh64x64 x (Const64 [int64(uint16(c))])) + for { + t := v.Type + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst16 { break } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+umagic(16, c).m/2) && s == 16+umagic(16, c).s-1 && x.Op != OpConst16 && udivisibleOK(16, c)) { + c := v_1.AuxInt + v.reset(OpLsh64x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint16(c)) + v.AddArg(v0) + return true + } + // match: (Lsh64x16 (Const64 [0]) _) + // result: (Const64 [0]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst64 || v_0.AuxInt != 0 { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) + v.reset(OpConst64) + v.AuxInt = 0 return true } - // match: (Eq16 x (Mul16 (Trunc32to16 (Rsh32Ux64 mul:(Mul32 (ZeroExt16to32 x) (Const32 [m])) (Const64 [s]))) (Const16 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+umagic(16,c).m/2) && s == 16+umagic(16,c).s-1 && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + return false +} +func rewriteValuegeneric_OpLsh64x32_0(v *Value) bool { + b := v.Block + // match: (Lsh64x32 x (Const32 [c])) + // result: (Lsh64x64 x (Const64 [int64(uint32(c))])) for { + t := v.Type _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpTrunc32to16 { + if v_1.Op != OpConst32 { break } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh32Ux64 { + c := v_1.AuxInt + v.reset(OpLsh64x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint32(c)) + v.AddArg(v0) + return true + } + // match: (Lsh64x32 (Const64 [0]) _) + // result: (Const64 [0]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst64 || v_0.AuxInt != 0 { break } - _ = v_1_0_0.Args[1] - mul := v_1_0_0.Args[0] - if mul.Op != OpMul32 { + v.reset(OpConst64) + v.AuxInt = 0 + return true + } + return false +} +func rewriteValuegeneric_OpLsh64x64_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (Lsh64x64 (Const64 [c]) (Const64 [d])) + // result: (Const64 [c << uint64(d)]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst64 { break } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpZeroExt16to32 || x != mul_0.Args[0] { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { + d := v_1.AuxInt + v.reset(OpConst64) + v.AuxInt = c << uint64(d) + return true + } + // match: (Lsh64x64 x (Const64 [0])) + // result: x + for { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst64 || v_1.AuxInt != 0 { break } - m := mul_1.AuxInt - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + // match: (Lsh64x64 (Const64 [0]) _) + // result: (Const64 [0]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst64 || v_0.AuxInt != 0 { break } - s := v_1_0_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst16 { + v.reset(OpConst64) + v.AuxInt = 0 + return true + } + // match: (Lsh64x64 _ (Const64 [c])) + // cond: uint64(c) >= 64 + // result: (Const64 [0]) + for { + _ = v.Args[1] + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+umagic(16, c).m/2) && s == 16+umagic(16, c).s-1 && x.Op != OpConst16 && udivisibleOK(16, c)) { + c := v_1.AuxInt + if !(uint64(c) >= 64) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) + v.reset(OpConst64) + v.AuxInt = 0 return true } - // match: (Eq16 (Mul16 (Const16 [c]) (Trunc32to16 (Rsh32Ux64 mul:(Mul32 (Const32 [m]) (ZeroExt16to32 x)) (Const64 [s])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+umagic(16,c).m/2) && s == 16+umagic(16,c).s-1 && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + // match: (Lsh64x64 (Lsh64x64 x (Const64 [c])) (Const64 [d])) + // cond: !uaddOvf(c,d) + // result: (Lsh64x64 x (Const64 [c+d])) for { - x := v.Args[1] + t := v.Type + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpMul16 { + if v_0.Op != OpLsh64x64 { break } _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst16 { - break - } - c := v_0_0.AuxInt + x := v_0.Args[0] v_0_1 := v_0.Args[1] - if v_0_1.Op != OpTrunc32to16 { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh32Ux64 { - break - } - _ = v_0_1_0.Args[1] - mul := v_0_1_0.Args[0] - if mul.Op != OpMul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpZeroExt16to32 || x != mul_1.Args[0] { + if v_0_1.Op != OpConst64 { break } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { + c := v_0_1.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - s := v_0_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+umagic(16, c).m/2) && s == 16+umagic(16, c).s-1 && x.Op != OpConst16 && udivisibleOK(16, c)) { + d := v_1.AuxInt + if !(!uaddOvf(c, d)) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) - v0.AddArg(v3) + v.reset(OpLsh64x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = c + d v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) return true } - // match: (Eq16 (Mul16 (Const16 [c]) (Trunc32to16 (Rsh32Ux64 mul:(Mul32 (ZeroExt16to32 x) (Const32 [m])) (Const64 [s])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+umagic(16,c).m/2) && s == 16+umagic(16,c).s-1 && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + // match: (Lsh64x64 (Rsh64Ux64 (Lsh64x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) + // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) + // result: (Lsh64x64 x (Const64 [c1-c2+c3])) for { - x := v.Args[1] + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpMul16 { + if v_0.Op != OpRsh64Ux64 { break } _ = v_0.Args[1] v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst16 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpTrunc32to16 { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh32Ux64 { - break - } - _ = v_0_1_0.Args[1] - mul := v_0_1_0.Args[0] - if mul.Op != OpMul32 { + if v_0_0.Op != OpLsh64x64 { break } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpZeroExt16to32 || x != mul_0.Args[0] { + _ = v_0_0.Args[1] + x := v_0_0.Args[0] + v_0_0_1 := v_0_0.Args[1] + if v_0_0_1.Op != OpConst64 { break } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { + c1 := v_0_0_1.AuxInt + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 { break } - m := mul_1.AuxInt - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { + c2 := v_0_1.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - s := v_0_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+umagic(16, c).m/2) && s == 16+umagic(16, c).s-1 && x.Op != OpConst16 && udivisibleOK(16, c)) { + c3 := v_1.AuxInt + if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) - v0.AddArg(v3) + v.reset(OpLsh64x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v0.AuxInt = c1 - c2 + c3 v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) return true } - // match: (Eq16 (Mul16 (Trunc32to16 (Rsh32Ux64 mul:(Mul32 (Const32 [m]) (ZeroExt16to32 x)) (Const64 [s]))) (Const16 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+umagic(16,c).m/2) && s == 16+umagic(16,c).s-1 && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul16 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpTrunc32to16 { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh32Ux64 { - break - } - _ = v_0_0_0.Args[1] - mul := v_0_0_0.Args[0] - if mul.Op != OpMul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpZeroExt16to32 || x != mul_1.Args[0] { - break - } - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { + return false +} +func rewriteValuegeneric_OpLsh64x8_0(v *Value) bool { + b := v.Block + // match: (Lsh64x8 x (Const8 [c])) + // result: (Lsh64x64 x (Const64 [int64(uint8(c))])) + for { + t := v.Type + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst8 { break } - s := v_0_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst16 { + c := v_1.AuxInt + v.reset(OpLsh64x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint8(c)) + v.AddArg(v0) + return true + } + // match: (Lsh64x8 (Const64 [0]) _) + // result: (Const64 [0]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst64 || v_0.AuxInt != 0 { break } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+umagic(16, c).m/2) && s == 16+umagic(16, c).s-1 && x.Op != OpConst16 && udivisibleOK(16, c)) { + v.reset(OpConst64) + v.AuxInt = 0 + return true + } + return false +} +func rewriteValuegeneric_OpLsh8x16_0(v *Value) bool { + b := v.Block + // match: (Lsh8x16 x (Const16 [c])) + // result: (Lsh8x64 x (Const64 [int64(uint16(c))])) + for { + t := v.Type + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst16 { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) - v0.AddArg(v3) + c := v_1.AuxInt + v.reset(OpLsh8x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint16(c)) v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) return true } - // match: (Eq16 (Mul16 (Trunc32to16 (Rsh32Ux64 mul:(Mul32 (ZeroExt16to32 x) (Const32 [m])) (Const64 [s]))) (Const16 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+umagic(16,c).m/2) && s == 16+umagic(16,c).s-1 && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + // match: (Lsh8x16 (Const8 [0]) _) + // result: (Const8 [0]) for { - x := v.Args[1] + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpMul16 { + if v_0.Op != OpConst8 || v_0.AuxInt != 0 { break } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpTrunc32to16 { + v.reset(OpConst8) + v.AuxInt = 0 + return true + } + return false +} +func rewriteValuegeneric_OpLsh8x32_0(v *Value) bool { + b := v.Block + // match: (Lsh8x32 x (Const32 [c])) + // result: (Lsh8x64 x (Const64 [int64(uint32(c))])) + for { + t := v.Type + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst32 { break } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh32Ux64 { + c := v_1.AuxInt + v.reset(OpLsh8x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint32(c)) + v.AddArg(v0) + return true + } + // match: (Lsh8x32 (Const8 [0]) _) + // result: (Const8 [0]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst8 || v_0.AuxInt != 0 { break } - _ = v_0_0_0.Args[1] - mul := v_0_0_0.Args[0] - if mul.Op != OpMul32 { + v.reset(OpConst8) + v.AuxInt = 0 + return true + } + return false +} +func rewriteValuegeneric_OpLsh8x64_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (Lsh8x64 (Const8 [c]) (Const64 [d])) + // result: (Const8 [int64(int8(c) << uint64(d))]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst8 { break } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpZeroExt16to32 || x != mul_0.Args[0] { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { + d := v_1.AuxInt + v.reset(OpConst8) + v.AuxInt = int64(int8(c) << uint64(d)) + return true + } + // match: (Lsh8x64 x (Const64 [0])) + // result: x + for { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst64 || v_1.AuxInt != 0 { break } - m := mul_1.AuxInt - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + // match: (Lsh8x64 (Const8 [0]) _) + // result: (Const8 [0]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst8 || v_0.AuxInt != 0 { break } - s := v_0_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst16 { + v.reset(OpConst8) + v.AuxInt = 0 + return true + } + // match: (Lsh8x64 _ (Const64 [c])) + // cond: uint64(c) >= 8 + // result: (Const8 [0]) + for { + _ = v.Args[1] + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+umagic(16, c).m/2) && s == 16+umagic(16, c).s-1 && x.Op != OpConst16 && udivisibleOK(16, c)) { + c := v_1.AuxInt + if !(uint64(c) >= 8) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) + v.reset(OpConst8) + v.AuxInt = 0 return true } - // match: (Eq16 x (Mul16 (Const16 [c]) (Trunc32to16 (Rsh32Ux64 mul:(Mul32 (Const32 [m]) (Rsh32Ux64 (ZeroExt16to32 x) (Const64 [1]))) (Const64 [s]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+(umagic(16,c).m+1)/2) && s == 16+umagic(16,c).s-2 && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + // match: (Lsh8x64 (Lsh8x64 x (Const64 [c])) (Const64 [d])) + // cond: !uaddOvf(c,d) + // result: (Lsh8x64 x (Const64 [c+d])) for { + t := v.Type _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst16 { + v_0 := v.Args[0] + if v_0.Op != OpLsh8x64 { break } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpTrunc32to16 { + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 { break } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh32Ux64 { + c := v_0_1.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - _ = v_1_1_0.Args[1] - mul := v_1_1_0.Args[0] - if mul.Op != OpMul32 { + d := v_1.AuxInt + if !(!uaddOvf(c, d)) { break } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { + v.reset(OpLsh8x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = c + d + v.AddArg(v0) + return true + } + // match: (Lsh8x64 (Rsh8Ux64 (Lsh8x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) + // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) + // result: (Lsh8x64 x (Const64 [c1-c2+c3])) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpRsh8Ux64 { break } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpRsh32Ux64 { + _ = v_0.Args[1] + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpLsh8x64 { break } - _ = mul_1.Args[1] - mul_1_0 := mul_1.Args[0] - if mul_1_0.Op != OpZeroExt16to32 || x != mul_1_0.Args[0] { + _ = v_0_0.Args[1] + x := v_0_0.Args[0] + v_0_0_1 := v_0_0.Args[1] + if v_0_0_1.Op != OpConst64 { break } - mul_1_1 := mul_1.Args[1] - if mul_1_1.Op != OpConst64 || mul_1_1.AuxInt != 1 { + c1 := v_0_0_1.AuxInt + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 { break } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { + c2 := v_0_1.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - s := v_1_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+(umagic(16, c).m+1)/2) && s == 16+umagic(16, c).s-2 && x.Op != OpConst16 && udivisibleOK(16, c)) { + c3 := v_1.AuxInt + if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) - v0.AddArg(v3) + v.reset(OpLsh8x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v0.AuxInt = c1 - c2 + c3 v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) return true } - // match: (Eq16 x (Mul16 (Const16 [c]) (Trunc32to16 (Rsh32Ux64 mul:(Mul32 (Rsh32Ux64 (ZeroExt16to32 x) (Const64 [1])) (Const32 [m])) (Const64 [s]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+(umagic(16,c).m+1)/2) && s == 16+umagic(16,c).s-2 && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + return false +} +func rewriteValuegeneric_OpLsh8x8_0(v *Value) bool { + b := v.Block + // match: (Lsh8x8 x (Const8 [c])) + // result: (Lsh8x64 x (Const64 [int64(uint8(c))])) for { + t := v.Type _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst16 { + if v_1.Op != OpConst8 { break } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpTrunc32to16 { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh32Ux64 { + c := v_1.AuxInt + v.reset(OpLsh8x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint8(c)) + v.AddArg(v0) + return true + } + // match: (Lsh8x8 (Const8 [0]) _) + // result: (Const8 [0]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst8 || v_0.AuxInt != 0 { break } - _ = v_1_1_0.Args[1] - mul := v_1_1_0.Args[0] - if mul.Op != OpMul32 { + v.reset(OpConst8) + v.AuxInt = 0 + return true + } + return false +} +func rewriteValuegeneric_OpMod16_0(v *Value) bool { + b := v.Block + // match: (Mod16 (Const16 [c]) (Const16 [d])) + // cond: d != 0 + // result: (Const16 [int64(int16(c % d))]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst16 { break } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpRsh32Ux64 { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst16 { break } - _ = mul_0.Args[1] - mul_0_0 := mul_0.Args[0] - if mul_0_0.Op != OpZeroExt16to32 || x != mul_0_0.Args[0] { + d := v_1.AuxInt + if !(d != 0) { break } - mul_0_1 := mul_0.Args[1] - if mul_0_1.Op != OpConst64 || mul_0_1.AuxInt != 1 { + v.reset(OpConst16) + v.AuxInt = int64(int16(c % d)) + return true + } + // match: (Mod16 n (Const16 [c])) + // cond: isNonNegative(n) && isPowerOfTwo(c&0xffff) + // result: (And16 n (Const16 [(c&0xffff)-1])) + for { + t := v.Type + _ = v.Args[1] + n := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst16 { break } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { + c := v_1.AuxInt + if !(isNonNegative(n) && isPowerOfTwo(c&0xffff)) { break } - m := mul_1.AuxInt - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { + v.reset(OpAnd16) + v.AddArg(n) + v0 := b.NewValue0(v.Pos, OpConst16, t) + v0.AuxInt = (c & 0xffff) - 1 + v.AddArg(v0) + return true + } + // match: (Mod16 n (Const16 [c])) + // cond: c < 0 && c != -1<<15 + // result: (Mod16 n (Const16 [-c])) + for { + t := v.Type + _ = v.Args[1] + n := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst16 { break } - s := v_1_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+(umagic(16, c).m+1)/2) && s == 16+umagic(16, c).s-2 && x.Op != OpConst16 && udivisibleOK(16, c)) { + c := v_1.AuxInt + if !(c < 0 && c != -1<<15) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) - v0.AddArg(v3) + v.reset(OpMod16) + v.Type = t + v.AddArg(n) + v0 := b.NewValue0(v.Pos, OpConst16, t) + v0.AuxInt = -c v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) return true } - // match: (Eq16 x (Mul16 (Trunc32to16 (Rsh32Ux64 mul:(Mul32 (Const32 [m]) (Rsh32Ux64 (ZeroExt16to32 x) (Const64 [1]))) (Const64 [s]))) (Const16 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+(umagic(16,c).m+1)/2) && s == 16+umagic(16,c).s-2 && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + // match: (Mod16 x (Const16 [c])) + // cond: x.Op != OpConst16 && (c > 0 || c == -1<<15) + // result: (Sub16 x (Mul16 (Div16 x (Const16 [c])) (Const16 [c]))) for { + t := v.Type _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpTrunc32to16 { - break - } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh32Ux64 { - break - } - _ = v_1_0_0.Args[1] - mul := v_1_0_0.Args[0] - if mul.Op != OpMul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpRsh32Ux64 { - break - } - _ = mul_1.Args[1] - mul_1_0 := mul_1.Args[0] - if mul_1_0.Op != OpZeroExt16to32 || x != mul_1_0.Args[0] { - break - } - mul_1_1 := mul_1.Args[1] - if mul_1_1.Op != OpConst64 || mul_1_1.AuxInt != 1 { - break - } - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { - break - } - s := v_1_0_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst16 { + if v_1.Op != OpConst16 { break } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+(umagic(16, c).m+1)/2) && s == 16+umagic(16, c).s-2 && x.Op != OpConst16 && udivisibleOK(16, c)) { + c := v_1.AuxInt + if !(x.Op != OpConst16 && (c > 0 || c == -1<<15)) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) + v.reset(OpSub16) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpMul16, t) + v1 := b.NewValue0(v.Pos, OpDiv16, t) v1.AddArg(x) + v2 := b.NewValue0(v.Pos, OpConst16, t) + v2.AuxInt = c + v1.AddArg(v2) v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) + v3 := b.NewValue0(v.Pos, OpConst16, t) + v3.AuxInt = c v0.AddArg(v3) v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) return true } return false } -func rewriteValuegeneric_OpEq16_30(v *Value) bool { +func rewriteValuegeneric_OpMod16u_0(v *Value) bool { b := v.Block - typ := &b.Func.Config.Types - // match: (Eq16 x (Mul16 (Trunc32to16 (Rsh32Ux64 mul:(Mul32 (Rsh32Ux64 (ZeroExt16to32 x) (Const64 [1])) (Const32 [m])) (Const64 [s]))) (Const16 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+(umagic(16,c).m+1)/2) && s == 16+umagic(16,c).s-2 && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + // match: (Mod16u (Const16 [c]) (Const16 [d])) + // cond: d != 0 + // result: (Const16 [int64(uint16(c) % uint16(d))]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpTrunc32to16 { - break - } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh32Ux64 { - break - } - _ = v_1_0_0.Args[1] - mul := v_1_0_0.Args[0] - if mul.Op != OpMul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpRsh32Ux64 { + v_0 := v.Args[0] + if v_0.Op != OpConst16 { break } - _ = mul_0.Args[1] - mul_0_0 := mul_0.Args[0] - if mul_0_0.Op != OpZeroExt16to32 || x != mul_0_0.Args[0] { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst16 { break } - mul_0_1 := mul_0.Args[1] - if mul_0_1.Op != OpConst64 || mul_0_1.AuxInt != 1 { + d := v_1.AuxInt + if !(d != 0) { break } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { + v.reset(OpConst16) + v.AuxInt = int64(uint16(c) % uint16(d)) + return true + } + // match: (Mod16u n (Const16 [c])) + // cond: isPowerOfTwo(c&0xffff) + // result: (And16 n (Const16 [(c&0xffff)-1])) + for { + t := v.Type + _ = v.Args[1] + n := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst16 { break } - m := mul_1.AuxInt - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { + c := v_1.AuxInt + if !(isPowerOfTwo(c & 0xffff)) { break } - s := v_1_0_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst16 { + v.reset(OpAnd16) + v.AddArg(n) + v0 := b.NewValue0(v.Pos, OpConst16, t) + v0.AuxInt = (c & 0xffff) - 1 + v.AddArg(v0) + return true + } + // match: (Mod16u x (Const16 [c])) + // cond: x.Op != OpConst16 && c > 0 && umagicOK(16,c) + // result: (Sub16 x (Mul16 (Div16u x (Const16 [c])) (Const16 [c]))) + for { + t := v.Type + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst16 { break } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+(umagic(16, c).m+1)/2) && s == 16+umagic(16, c).s-2 && x.Op != OpConst16 && udivisibleOK(16, c)) { + c := v_1.AuxInt + if !(x.Op != OpConst16 && c > 0 && umagicOK(16, c)) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) + v.reset(OpSub16) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpMul16, t) + v1 := b.NewValue0(v.Pos, OpDiv16u, t) v1.AddArg(x) + v2 := b.NewValue0(v.Pos, OpConst16, t) + v2.AuxInt = c + v1.AddArg(v2) v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) + v3 := b.NewValue0(v.Pos, OpConst16, t) + v3.AuxInt = c v0.AddArg(v3) v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) return true } - // match: (Eq16 (Mul16 (Const16 [c]) (Trunc32to16 (Rsh32Ux64 mul:(Mul32 (Const32 [m]) (Rsh32Ux64 (ZeroExt16to32 x) (Const64 [1]))) (Const64 [s])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+(umagic(16,c).m+1)/2) && s == 16+umagic(16,c).s-2 && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + return false +} +func rewriteValuegeneric_OpMod32_0(v *Value) bool { + b := v.Block + // match: (Mod32 (Const32 [c]) (Const32 [d])) + // cond: d != 0 + // result: (Const32 [int64(int32(c % d))]) for { - x := v.Args[1] + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpMul16 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst16 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpTrunc32to16 { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh32Ux64 { + if v_0.Op != OpConst32 { break } - _ = v_0_1_0.Args[1] - mul := v_0_1_0.Args[0] - if mul.Op != OpMul32 { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst32 { break } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { + d := v_1.AuxInt + if !(d != 0) { break } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpRsh32Ux64 { + v.reset(OpConst32) + v.AuxInt = int64(int32(c % d)) + return true + } + // match: (Mod32 n (Const32 [c])) + // cond: isNonNegative(n) && isPowerOfTwo(c&0xffffffff) + // result: (And32 n (Const32 [(c&0xffffffff)-1])) + for { + t := v.Type + _ = v.Args[1] + n := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst32 { break } - _ = mul_1.Args[1] - mul_1_0 := mul_1.Args[0] - if mul_1_0.Op != OpZeroExt16to32 || x != mul_1_0.Args[0] { + c := v_1.AuxInt + if !(isNonNegative(n) && isPowerOfTwo(c&0xffffffff)) { break } - mul_1_1 := mul_1.Args[1] - if mul_1_1.Op != OpConst64 || mul_1_1.AuxInt != 1 { + v.reset(OpAnd32) + v.AddArg(n) + v0 := b.NewValue0(v.Pos, OpConst32, t) + v0.AuxInt = (c & 0xffffffff) - 1 + v.AddArg(v0) + return true + } + // match: (Mod32 n (Const32 [c])) + // cond: c < 0 && c != -1<<31 + // result: (Mod32 n (Const32 [-c])) + for { + t := v.Type + _ = v.Args[1] + n := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst32 { break } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { + c := v_1.AuxInt + if !(c < 0 && c != -1<<31) { break } - s := v_0_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+(umagic(16, c).m+1)/2) && s == 16+umagic(16, c).s-2 && x.Op != OpConst16 && udivisibleOK(16, c)) { + v.reset(OpMod32) + v.Type = t + v.AddArg(n) + v0 := b.NewValue0(v.Pos, OpConst32, t) + v0.AuxInt = -c + v.AddArg(v0) + return true + } + // match: (Mod32 x (Const32 [c])) + // cond: x.Op != OpConst32 && (c > 0 || c == -1<<31) + // result: (Sub32 x (Mul32 (Div32 x (Const32 [c])) (Const32 [c]))) + for { + t := v.Type + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst32 { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) + c := v_1.AuxInt + if !(x.Op != OpConst32 && (c > 0 || c == -1<<31)) { + break + } + v.reset(OpSub32) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpMul32, t) + v1 := b.NewValue0(v.Pos, OpDiv32, t) v1.AddArg(x) + v2 := b.NewValue0(v.Pos, OpConst32, t) + v2.AuxInt = c + v1.AddArg(v2) v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) + v3 := b.NewValue0(v.Pos, OpConst32, t) + v3.AuxInt = c v0.AddArg(v3) v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) return true } - // match: (Eq16 (Mul16 (Const16 [c]) (Trunc32to16 (Rsh32Ux64 mul:(Mul32 (Rsh32Ux64 (ZeroExt16to32 x) (Const64 [1])) (Const32 [m])) (Const64 [s])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+(umagic(16,c).m+1)/2) && s == 16+umagic(16,c).s-2 && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + return false +} +func rewriteValuegeneric_OpMod32u_0(v *Value) bool { + b := v.Block + // match: (Mod32u (Const32 [c]) (Const32 [d])) + // cond: d != 0 + // result: (Const32 [int64(uint32(c) % uint32(d))]) for { - x := v.Args[1] + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpMul16 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst16 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpTrunc32to16 { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh32Ux64 { - break - } - _ = v_0_1_0.Args[1] - mul := v_0_1_0.Args[0] - if mul.Op != OpMul32 { + if v_0.Op != OpConst32 { break } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpRsh32Ux64 { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst32 { break } - _ = mul_0.Args[1] - mul_0_0 := mul_0.Args[0] - if mul_0_0.Op != OpZeroExt16to32 || x != mul_0_0.Args[0] { + d := v_1.AuxInt + if !(d != 0) { break } - mul_0_1 := mul_0.Args[1] - if mul_0_1.Op != OpConst64 || mul_0_1.AuxInt != 1 { + v.reset(OpConst32) + v.AuxInt = int64(uint32(c) % uint32(d)) + return true + } + // match: (Mod32u n (Const32 [c])) + // cond: isPowerOfTwo(c&0xffffffff) + // result: (And32 n (Const32 [(c&0xffffffff)-1])) + for { + t := v.Type + _ = v.Args[1] + n := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst32 { break } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { + c := v_1.AuxInt + if !(isPowerOfTwo(c & 0xffffffff)) { break } - m := mul_1.AuxInt - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { + v.reset(OpAnd32) + v.AddArg(n) + v0 := b.NewValue0(v.Pos, OpConst32, t) + v0.AuxInt = (c & 0xffffffff) - 1 + v.AddArg(v0) + return true + } + // match: (Mod32u x (Const32 [c])) + // cond: x.Op != OpConst32 && c > 0 && umagicOK(32,c) + // result: (Sub32 x (Mul32 (Div32u x (Const32 [c])) (Const32 [c]))) + for { + t := v.Type + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst32 { break } - s := v_0_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+(umagic(16, c).m+1)/2) && s == 16+umagic(16, c).s-2 && x.Op != OpConst16 && udivisibleOK(16, c)) { + c := v_1.AuxInt + if !(x.Op != OpConst32 && c > 0 && umagicOK(32, c)) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) + v.reset(OpSub32) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpMul32, t) + v1 := b.NewValue0(v.Pos, OpDiv32u, t) v1.AddArg(x) + v2 := b.NewValue0(v.Pos, OpConst32, t) + v2.AuxInt = c + v1.AddArg(v2) v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) + v3 := b.NewValue0(v.Pos, OpConst32, t) + v3.AuxInt = c v0.AddArg(v3) v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) return true } - // match: (Eq16 (Mul16 (Trunc32to16 (Rsh32Ux64 mul:(Mul32 (Const32 [m]) (Rsh32Ux64 (ZeroExt16to32 x) (Const64 [1]))) (Const64 [s]))) (Const16 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+(umagic(16,c).m+1)/2) && s == 16+umagic(16,c).s-2 && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + return false +} +func rewriteValuegeneric_OpMod64_0(v *Value) bool { + b := v.Block + // match: (Mod64 (Const64 [c]) (Const64 [d])) + // cond: d != 0 + // result: (Const64 [c % d]) for { - x := v.Args[1] + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpMul16 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpTrunc32to16 { + if v_0.Op != OpConst64 { break } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh32Ux64 { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - _ = v_0_0_0.Args[1] - mul := v_0_0_0.Args[0] - if mul.Op != OpMul32 { + d := v_1.AuxInt + if !(d != 0) { break } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { + v.reset(OpConst64) + v.AuxInt = c % d + return true + } + // match: (Mod64 n (Const64 [c])) + // cond: isNonNegative(n) && isPowerOfTwo(c) + // result: (And64 n (Const64 [c-1])) + for { + t := v.Type + _ = v.Args[1] + n := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpRsh32Ux64 { + c := v_1.AuxInt + if !(isNonNegative(n) && isPowerOfTwo(c)) { break } - _ = mul_1.Args[1] - mul_1_0 := mul_1.Args[0] - if mul_1_0.Op != OpZeroExt16to32 || x != mul_1_0.Args[0] { + v.reset(OpAnd64) + v.AddArg(n) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = c - 1 + v.AddArg(v0) + return true + } + // match: (Mod64 n (Const64 [-1<<63])) + // cond: isNonNegative(n) + // result: n + for { + _ = v.Args[1] + n := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst64 || v_1.AuxInt != -1<<63 || !(isNonNegative(n)) { break } - mul_1_1 := mul_1.Args[1] - if mul_1_1.Op != OpConst64 || mul_1_1.AuxInt != 1 { + v.reset(OpCopy) + v.Type = n.Type + v.AddArg(n) + return true + } + // match: (Mod64 n (Const64 [c])) + // cond: c < 0 && c != -1<<63 + // result: (Mod64 n (Const64 [-c])) + for { + t := v.Type + _ = v.Args[1] + n := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { + c := v_1.AuxInt + if !(c < 0 && c != -1<<63) { break } - s := v_0_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst16 { + v.reset(OpMod64) + v.Type = t + v.AddArg(n) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = -c + v.AddArg(v0) + return true + } + // match: (Mod64 x (Const64 [c])) + // cond: x.Op != OpConst64 && (c > 0 || c == -1<<63) + // result: (Sub64 x (Mul64 (Div64 x (Const64 [c])) (Const64 [c]))) + for { + t := v.Type + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+(umagic(16, c).m+1)/2) && s == 16+umagic(16, c).s-2 && x.Op != OpConst16 && udivisibleOK(16, c)) { + c := v_1.AuxInt + if !(x.Op != OpConst64 && (c > 0 || c == -1<<63)) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) + v.reset(OpSub64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpMul64, t) + v1 := b.NewValue0(v.Pos, OpDiv64, t) v1.AddArg(x) + v2 := b.NewValue0(v.Pos, OpConst64, t) + v2.AuxInt = c + v1.AddArg(v2) v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) + v3 := b.NewValue0(v.Pos, OpConst64, t) + v3.AuxInt = c v0.AddArg(v3) v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) return true } - // match: (Eq16 (Mul16 (Trunc32to16 (Rsh32Ux64 mul:(Mul32 (Rsh32Ux64 (ZeroExt16to32 x) (Const64 [1])) (Const32 [m])) (Const64 [s]))) (Const16 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+(umagic(16,c).m+1)/2) && s == 16+umagic(16,c).s-2 && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + return false +} +func rewriteValuegeneric_OpMod64u_0(v *Value) bool { + b := v.Block + // match: (Mod64u (Const64 [c]) (Const64 [d])) + // cond: d != 0 + // result: (Const64 [int64(uint64(c) % uint64(d))]) for { - x := v.Args[1] + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpMul16 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpTrunc32to16 { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh32Ux64 { - break - } - _ = v_0_0_0.Args[1] - mul := v_0_0_0.Args[0] - if mul.Op != OpMul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpRsh32Ux64 { + if v_0.Op != OpConst64 { break } - _ = mul_0.Args[1] - mul_0_0 := mul_0.Args[0] - if mul_0_0.Op != OpZeroExt16to32 || x != mul_0_0.Args[0] { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - mul_0_1 := mul_0.Args[1] - if mul_0_1.Op != OpConst64 || mul_0_1.AuxInt != 1 { + d := v_1.AuxInt + if !(d != 0) { break } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { + v.reset(OpConst64) + v.AuxInt = int64(uint64(c) % uint64(d)) + return true + } + // match: (Mod64u n (Const64 [c])) + // cond: isPowerOfTwo(c) + // result: (And64 n (Const64 [c-1])) + for { + t := v.Type + _ = v.Args[1] + n := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - m := mul_1.AuxInt - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { + c := v_1.AuxInt + if !(isPowerOfTwo(c)) { break } - s := v_0_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst16 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<15+(umagic(16, c).m+1)/2) && s == 16+umagic(16, c).s-2 && x.Op != OpConst16 && udivisibleOK(16, c)) { + v.reset(OpAnd64) + v.AddArg(n) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = c - 1 + v.AddArg(v0) + return true + } + // match: (Mod64u n (Const64 [-1<<63])) + // result: (And64 n (Const64 [1<<63-1])) + for { + t := v.Type + _ = v.Args[1] + n := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst64 || v_1.AuxInt != -1<<63 { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) - v0.AddArg(v3) + v.reset(OpAnd64) + v.AddArg(n) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = 1<<63 - 1 v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) return true } - // match: (Eq16 x (Mul16 (Const16 [c]) (Trunc32to16 (Rsh32Ux64 (Avg32u (Lsh32x64 (ZeroExt16to32 x) (Const64 [16])) mul:(Mul32 (Const32 [m]) (ZeroExt16to32 x))) (Const64 [s]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(16,c).m) && s == 16+umagic(16,c).s-1 && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + // match: (Mod64u x (Const64 [c])) + // cond: x.Op != OpConst64 && c > 0 && umagicOK(64,c) + // result: (Sub64 x (Mul64 (Div64u x (Const64 [c])) (Const64 [c]))) for { + t := v.Type _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst16 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpTrunc32to16 { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh32Ux64 { - break - } - _ = v_1_1_0.Args[1] - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAvg32u { - break - } - _ = v_1_1_0_0.Args[1] - v_1_1_0_0_0 := v_1_1_0_0.Args[0] - if v_1_1_0_0_0.Op != OpLsh32x64 { - break - } - _ = v_1_1_0_0_0.Args[1] - v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] - if v_1_1_0_0_0_0.Op != OpZeroExt16to32 || x != v_1_1_0_0_0_0.Args[0] { - break - } - v_1_1_0_0_0_1 := v_1_1_0_0_0.Args[1] - if v_1_1_0_0_0_1.Op != OpConst64 || v_1_1_0_0_0_1.AuxInt != 16 { - break - } - mul := v_1_1_0_0.Args[1] - if mul.Op != OpMul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpZeroExt16to32 || x != mul_1.Args[0] { - break - } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { + if v_1.Op != OpConst64 { break } - s := v_1_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(16, c).m) && s == 16+umagic(16, c).s-1 && x.Op != OpConst16 && udivisibleOK(16, c)) { + c := v_1.AuxInt + if !(x.Op != OpConst64 && c > 0 && umagicOK(64, c)) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) + v.reset(OpSub64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpMul64, t) + v1 := b.NewValue0(v.Pos, OpDiv64u, t) v1.AddArg(x) + v2 := b.NewValue0(v.Pos, OpConst64, t) + v2.AuxInt = c + v1.AddArg(v2) v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) + v3 := b.NewValue0(v.Pos, OpConst64, t) + v3.AuxInt = c v0.AddArg(v3) v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) return true } - // match: (Eq16 x (Mul16 (Const16 [c]) (Trunc32to16 (Rsh32Ux64 (Avg32u (Lsh32x64 (ZeroExt16to32 x) (Const64 [16])) mul:(Mul32 (ZeroExt16to32 x) (Const32 [m]))) (Const64 [s]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(16,c).m) && s == 16+umagic(16,c).s-1 && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + return false +} +func rewriteValuegeneric_OpMod8_0(v *Value) bool { + b := v.Block + // match: (Mod8 (Const8 [c]) (Const8 [d])) + // cond: d != 0 + // result: (Const8 [int64(int8(c % d))]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst16 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpTrunc32to16 { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh32Ux64 { - break - } - _ = v_1_1_0.Args[1] - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAvg32u { - break - } - _ = v_1_1_0_0.Args[1] - v_1_1_0_0_0 := v_1_1_0_0.Args[0] - if v_1_1_0_0_0.Op != OpLsh32x64 { - break - } - _ = v_1_1_0_0_0.Args[1] - v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] - if v_1_1_0_0_0_0.Op != OpZeroExt16to32 || x != v_1_1_0_0_0_0.Args[0] { + v_0 := v.Args[0] + if v_0.Op != OpConst8 { break } - v_1_1_0_0_0_1 := v_1_1_0_0_0.Args[1] - if v_1_1_0_0_0_1.Op != OpConst64 || v_1_1_0_0_0_1.AuxInt != 16 { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst8 { break } - mul := v_1_1_0_0.Args[1] - if mul.Op != OpMul32 { + d := v_1.AuxInt + if !(d != 0) { break } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpZeroExt16to32 || x != mul_0.Args[0] { + v.reset(OpConst8) + v.AuxInt = int64(int8(c % d)) + return true + } + // match: (Mod8 n (Const8 [c])) + // cond: isNonNegative(n) && isPowerOfTwo(c&0xff) + // result: (And8 n (Const8 [(c&0xff)-1])) + for { + t := v.Type + _ = v.Args[1] + n := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst8 { break } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { + c := v_1.AuxInt + if !(isNonNegative(n) && isPowerOfTwo(c&0xff)) { break } - m := mul_1.AuxInt - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { + v.reset(OpAnd8) + v.AddArg(n) + v0 := b.NewValue0(v.Pos, OpConst8, t) + v0.AuxInt = (c & 0xff) - 1 + v.AddArg(v0) + return true + } + // match: (Mod8 n (Const8 [c])) + // cond: c < 0 && c != -1<<7 + // result: (Mod8 n (Const8 [-c])) + for { + t := v.Type + _ = v.Args[1] + n := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst8 { break } - s := v_1_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(16, c).m) && s == 16+umagic(16, c).s-1 && x.Op != OpConst16 && udivisibleOK(16, c)) { + c := v_1.AuxInt + if !(c < 0 && c != -1<<7) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) - v0.AddArg(v3) + v.reset(OpMod8) + v.Type = t + v.AddArg(n) + v0 := b.NewValue0(v.Pos, OpConst8, t) + v0.AuxInt = -c v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) return true } - // match: (Eq16 x (Mul16 (Trunc32to16 (Rsh32Ux64 (Avg32u (Lsh32x64 (ZeroExt16to32 x) (Const64 [16])) mul:(Mul32 (Const32 [m]) (ZeroExt16to32 x))) (Const64 [s]))) (Const16 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(16,c).m) && s == 16+umagic(16,c).s-1 && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + // match: (Mod8 x (Const8 [c])) + // cond: x.Op != OpConst8 && (c > 0 || c == -1<<7) + // result: (Sub8 x (Mul8 (Div8 x (Const8 [c])) (Const8 [c]))) for { + t := v.Type _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpTrunc32to16 { - break - } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh32Ux64 { - break - } - _ = v_1_0_0.Args[1] - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpAvg32u { - break - } - _ = v_1_0_0_0.Args[1] - v_1_0_0_0_0 := v_1_0_0_0.Args[0] - if v_1_0_0_0_0.Op != OpLsh32x64 { - break - } - _ = v_1_0_0_0_0.Args[1] - v_1_0_0_0_0_0 := v_1_0_0_0_0.Args[0] - if v_1_0_0_0_0_0.Op != OpZeroExt16to32 || x != v_1_0_0_0_0_0.Args[0] { - break - } - v_1_0_0_0_0_1 := v_1_0_0_0_0.Args[1] - if v_1_0_0_0_0_1.Op != OpConst64 || v_1_0_0_0_0_1.AuxInt != 16 { - break - } - mul := v_1_0_0_0.Args[1] - if mul.Op != OpMul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpZeroExt16to32 || x != mul_1.Args[0] { - break - } - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { - break - } - s := v_1_0_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst16 { + if v_1.Op != OpConst8 { break } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(16, c).m) && s == 16+umagic(16, c).s-1 && x.Op != OpConst16 && udivisibleOK(16, c)) { + c := v_1.AuxInt + if !(x.Op != OpConst8 && (c > 0 || c == -1<<7)) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) + v.reset(OpSub8) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpMul8, t) + v1 := b.NewValue0(v.Pos, OpDiv8, t) v1.AddArg(x) + v2 := b.NewValue0(v.Pos, OpConst8, t) + v2.AuxInt = c + v1.AddArg(v2) v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) + v3 := b.NewValue0(v.Pos, OpConst8, t) + v3.AuxInt = c v0.AddArg(v3) v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) return true } - // match: (Eq16 x (Mul16 (Trunc32to16 (Rsh32Ux64 (Avg32u (Lsh32x64 (ZeroExt16to32 x) (Const64 [16])) mul:(Mul32 (ZeroExt16to32 x) (Const32 [m]))) (Const64 [s]))) (Const16 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(16,c).m) && s == 16+umagic(16,c).s-1 && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + return false +} +func rewriteValuegeneric_OpMod8u_0(v *Value) bool { + b := v.Block + // match: (Mod8u (Const8 [c]) (Const8 [d])) + // cond: d != 0 + // result: (Const8 [int64(uint8(c) % uint8(d))]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpTrunc32to16 { - break - } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh32Ux64 { - break - } - _ = v_1_0_0.Args[1] - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpAvg32u { + v_0 := v.Args[0] + if v_0.Op != OpConst8 { break } - _ = v_1_0_0_0.Args[1] - v_1_0_0_0_0 := v_1_0_0_0.Args[0] - if v_1_0_0_0_0.Op != OpLsh32x64 { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst8 { break } - _ = v_1_0_0_0_0.Args[1] - v_1_0_0_0_0_0 := v_1_0_0_0_0.Args[0] - if v_1_0_0_0_0_0.Op != OpZeroExt16to32 || x != v_1_0_0_0_0_0.Args[0] { + d := v_1.AuxInt + if !(d != 0) { break } - v_1_0_0_0_0_1 := v_1_0_0_0_0.Args[1] - if v_1_0_0_0_0_1.Op != OpConst64 || v_1_0_0_0_0_1.AuxInt != 16 { + v.reset(OpConst8) + v.AuxInt = int64(uint8(c) % uint8(d)) + return true + } + // match: (Mod8u n (Const8 [c])) + // cond: isPowerOfTwo(c&0xff) + // result: (And8 n (Const8 [(c&0xff)-1])) + for { + t := v.Type + _ = v.Args[1] + n := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst8 { break } - mul := v_1_0_0_0.Args[1] - if mul.Op != OpMul32 { + c := v_1.AuxInt + if !(isPowerOfTwo(c & 0xff)) { break } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpZeroExt16to32 || x != mul_0.Args[0] { + v.reset(OpAnd8) + v.AddArg(n) + v0 := b.NewValue0(v.Pos, OpConst8, t) + v0.AuxInt = (c & 0xff) - 1 + v.AddArg(v0) + return true + } + // match: (Mod8u x (Const8 [c])) + // cond: x.Op != OpConst8 && c > 0 && umagicOK(8, c) + // result: (Sub8 x (Mul8 (Div8u x (Const8 [c])) (Const8 [c]))) + for { + t := v.Type + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst8 { break } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { + c := v_1.AuxInt + if !(x.Op != OpConst8 && c > 0 && umagicOK(8, c)) { break } - m := mul_1.AuxInt - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { - break - } - s := v_1_0_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst16 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(16, c).m) && s == 16+umagic(16, c).s-1 && x.Op != OpConst16 && udivisibleOK(16, c)) { - break - } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) + v.reset(OpSub8) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpMul8, t) + v1 := b.NewValue0(v.Pos, OpDiv8u, t) v1.AddArg(x) + v2 := b.NewValue0(v.Pos, OpConst8, t) + v2.AuxInt = c + v1.AddArg(v2) v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) + v3 := b.NewValue0(v.Pos, OpConst8, t) + v3.AuxInt = c v0.AddArg(v3) v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) return true } - // match: (Eq16 (Mul16 (Const16 [c]) (Trunc32to16 (Rsh32Ux64 (Avg32u (Lsh32x64 (ZeroExt16to32 x) (Const64 [16])) mul:(Mul32 (Const32 [m]) (ZeroExt16to32 x))) (Const64 [s])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(16,c).m) && s == 16+umagic(16,c).s-1 && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + return false +} +func rewriteValuegeneric_OpMove_0(v *Value) bool { + b := v.Block + // match: (Move {t} [n] dst1 src mem:(Zero {t} [n] dst2 _)) + // cond: isSamePtr(src, dst2) + // result: (Zero {t} [n] dst1 mem) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul16 { + n := v.AuxInt + t := v.Aux + _ = v.Args[2] + dst1 := v.Args[0] + src := v.Args[1] + mem := v.Args[2] + if mem.Op != OpZero || mem.AuxInt != n || mem.Aux != t { break } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst16 { + _ = mem.Args[1] + dst2 := mem.Args[0] + if !(isSamePtr(src, dst2)) { break } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpTrunc32to16 { + v.reset(OpZero) + v.AuxInt = n + v.Aux = t + v.AddArg(dst1) + v.AddArg(mem) + return true + } + // match: (Move {t} [n] dst1 src mem:(VarDef (Zero {t} [n] dst0 _))) + // cond: isSamePtr(src, dst0) + // result: (Zero {t} [n] dst1 mem) + for { + n := v.AuxInt + t := v.Aux + _ = v.Args[2] + dst1 := v.Args[0] + src := v.Args[1] + mem := v.Args[2] + if mem.Op != OpVarDef { break } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh32Ux64 { + mem_0 := mem.Args[0] + if mem_0.Op != OpZero || mem_0.AuxInt != n || mem_0.Aux != t { break } - _ = v_0_1_0.Args[1] - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpAvg32u { + _ = mem_0.Args[1] + dst0 := mem_0.Args[0] + if !(isSamePtr(src, dst0)) { break } - _ = v_0_1_0_0.Args[1] - v_0_1_0_0_0 := v_0_1_0_0.Args[0] - if v_0_1_0_0_0.Op != OpLsh32x64 { + v.reset(OpZero) + v.AuxInt = n + v.Aux = t + v.AddArg(dst1) + v.AddArg(mem) + return true + } + // match: (Move {t1} [n] dst1 src1 store:(Store {t2} op:(OffPtr [o2] dst2) _ mem)) + // cond: isSamePtr(dst1, dst2) && store.Uses == 1 && n >= o2 + sizeof(t2) && disjoint(src1, n, op, sizeof(t2)) && clobber(store) + // result: (Move {t1} [n] dst1 src1 mem) + for { + n := v.AuxInt + t1 := v.Aux + _ = v.Args[2] + dst1 := v.Args[0] + src1 := v.Args[1] + store := v.Args[2] + if store.Op != OpStore { break } - _ = v_0_1_0_0_0.Args[1] - v_0_1_0_0_0_0 := v_0_1_0_0_0.Args[0] - if v_0_1_0_0_0_0.Op != OpZeroExt16to32 || x != v_0_1_0_0_0_0.Args[0] { + t2 := store.Aux + mem := store.Args[2] + op := store.Args[0] + if op.Op != OpOffPtr { break } - v_0_1_0_0_0_1 := v_0_1_0_0_0.Args[1] - if v_0_1_0_0_0_1.Op != OpConst64 || v_0_1_0_0_0_1.AuxInt != 16 { + o2 := op.AuxInt + dst2 := op.Args[0] + if !(isSamePtr(dst1, dst2) && store.Uses == 1 && n >= o2+sizeof(t2) && disjoint(src1, n, op, sizeof(t2)) && clobber(store)) { break } - mul := v_0_1_0_0.Args[1] - if mul.Op != OpMul32 { + v.reset(OpMove) + v.AuxInt = n + v.Aux = t1 + v.AddArg(dst1) + v.AddArg(src1) + v.AddArg(mem) + return true + } + // match: (Move {t} [n] dst1 src1 move:(Move {t} [n] dst2 _ mem)) + // cond: move.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(move) + // result: (Move {t} [n] dst1 src1 mem) + for { + n := v.AuxInt + t := v.Aux + _ = v.Args[2] + dst1 := v.Args[0] + src1 := v.Args[1] + move := v.Args[2] + if move.Op != OpMove || move.AuxInt != n || move.Aux != t { break } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { + mem := move.Args[2] + dst2 := move.Args[0] + if !(move.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(move)) { break } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpZeroExt16to32 || x != mul_1.Args[0] { + v.reset(OpMove) + v.AuxInt = n + v.Aux = t + v.AddArg(dst1) + v.AddArg(src1) + v.AddArg(mem) + return true + } + // match: (Move {t} [n] dst1 src1 vardef:(VarDef {x} move:(Move {t} [n] dst2 _ mem))) + // cond: move.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(move) && clobber(vardef) + // result: (Move {t} [n] dst1 src1 (VarDef {x} mem)) + for { + n := v.AuxInt + t := v.Aux + _ = v.Args[2] + dst1 := v.Args[0] + src1 := v.Args[1] + vardef := v.Args[2] + if vardef.Op != OpVarDef { break } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { + x := vardef.Aux + move := vardef.Args[0] + if move.Op != OpMove || move.AuxInt != n || move.Aux != t { break } - s := v_0_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(16, c).m) && s == 16+umagic(16, c).s-1 && x.Op != OpConst16 && udivisibleOK(16, c)) { + mem := move.Args[2] + dst2 := move.Args[0] + if !(move.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(move) && clobber(vardef)) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) - v0.AddArg(v3) + v.reset(OpMove) + v.AuxInt = n + v.Aux = t + v.AddArg(dst1) + v.AddArg(src1) + v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem) + v0.Aux = x + v0.AddArg(mem) v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) return true } - return false -} -func rewriteValuegeneric_OpEq16_40(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Eq16 (Mul16 (Const16 [c]) (Trunc32to16 (Rsh32Ux64 (Avg32u (Lsh32x64 (ZeroExt16to32 x) (Const64 [16])) mul:(Mul32 (ZeroExt16to32 x) (Const32 [m]))) (Const64 [s])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(16,c).m) && s == 16+umagic(16,c).s-1 && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + // match: (Move {t} [n] dst1 src1 zero:(Zero {t} [n] dst2 mem)) + // cond: zero.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(zero) + // result: (Move {t} [n] dst1 src1 mem) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul16 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst16 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpTrunc32to16 { + n := v.AuxInt + t := v.Aux + _ = v.Args[2] + dst1 := v.Args[0] + src1 := v.Args[1] + zero := v.Args[2] + if zero.Op != OpZero || zero.AuxInt != n || zero.Aux != t { break } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh32Ux64 { + mem := zero.Args[1] + dst2 := zero.Args[0] + if !(zero.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(zero)) { break } - _ = v_0_1_0.Args[1] - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpAvg32u { + v.reset(OpMove) + v.AuxInt = n + v.Aux = t + v.AddArg(dst1) + v.AddArg(src1) + v.AddArg(mem) + return true + } + // match: (Move {t} [n] dst1 src1 vardef:(VarDef {x} zero:(Zero {t} [n] dst2 mem))) + // cond: zero.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(zero) && clobber(vardef) + // result: (Move {t} [n] dst1 src1 (VarDef {x} mem)) + for { + n := v.AuxInt + t := v.Aux + _ = v.Args[2] + dst1 := v.Args[0] + src1 := v.Args[1] + vardef := v.Args[2] + if vardef.Op != OpVarDef { break } - _ = v_0_1_0_0.Args[1] - v_0_1_0_0_0 := v_0_1_0_0.Args[0] - if v_0_1_0_0_0.Op != OpLsh32x64 { + x := vardef.Aux + zero := vardef.Args[0] + if zero.Op != OpZero || zero.AuxInt != n || zero.Aux != t { break } - _ = v_0_1_0_0_0.Args[1] - v_0_1_0_0_0_0 := v_0_1_0_0_0.Args[0] - if v_0_1_0_0_0_0.Op != OpZeroExt16to32 || x != v_0_1_0_0_0_0.Args[0] { + mem := zero.Args[1] + dst2 := zero.Args[0] + if !(zero.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(zero) && clobber(vardef)) { break } - v_0_1_0_0_0_1 := v_0_1_0_0_0.Args[1] - if v_0_1_0_0_0_1.Op != OpConst64 || v_0_1_0_0_0_1.AuxInt != 16 { + v.reset(OpMove) + v.AuxInt = n + v.Aux = t + v.AddArg(dst1) + v.AddArg(src1) + v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem) + v0.Aux = x + v0.AddArg(mem) + v.AddArg(v0) + return true + } + // match: (Move {t1} [n] dst p1 mem:(Store {t2} op2:(OffPtr [o2] p2) d1 (Store {t3} op3:(OffPtr [0] p3) d2 _))) + // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && o2 == sizeof(t3) && n == sizeof(t2) + sizeof(t3) + // result: (Store {t2} (OffPtr [o2] dst) d1 (Store {t3} (OffPtr [0] dst) d2 mem)) + for { + n := v.AuxInt + t1 := v.Aux + _ = v.Args[2] + dst := v.Args[0] + p1 := v.Args[1] + mem := v.Args[2] + if mem.Op != OpStore { break } - mul := v_0_1_0_0.Args[1] - if mul.Op != OpMul32 { + t2 := mem.Aux + _ = mem.Args[2] + op2 := mem.Args[0] + if op2.Op != OpOffPtr { break } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpZeroExt16to32 || x != mul_0.Args[0] { + tt2 := op2.Type + o2 := op2.AuxInt + p2 := op2.Args[0] + d1 := mem.Args[1] + mem_2 := mem.Args[2] + if mem_2.Op != OpStore { break } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { + t3 := mem_2.Aux + _ = mem_2.Args[2] + op3 := mem_2.Args[0] + if op3.Op != OpOffPtr { break } - m := mul_1.AuxInt - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { + tt3 := op3.Type + if op3.AuxInt != 0 { break } - s := v_0_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(16, c).m) && s == 16+umagic(16, c).s-1 && x.Op != OpConst16 && udivisibleOK(16, c)) { + p3 := op3.Args[0] + d2 := mem_2.Args[1] + if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && o2 == sizeof(t3) && n == sizeof(t2)+sizeof(t3)) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) + v.reset(OpStore) + v.Aux = t2 + v0 := b.NewValue0(v.Pos, OpOffPtr, tt2) + v0.AuxInt = o2 + v0.AddArg(dst) + v.AddArg(v0) + v.AddArg(d1) + v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v1.Aux = t3 + v2 := b.NewValue0(v.Pos, OpOffPtr, tt3) + v2.AuxInt = 0 + v2.AddArg(dst) + v1.AddArg(v2) + v1.AddArg(d2) + v1.AddArg(mem) + v.AddArg(v1) return true } - // match: (Eq16 (Mul16 (Trunc32to16 (Rsh32Ux64 (Avg32u (Lsh32x64 (ZeroExt16to32 x) (Const64 [16])) mul:(Mul32 (Const32 [m]) (ZeroExt16to32 x))) (Const64 [s]))) (Const16 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(16,c).m) && s == 16+umagic(16,c).s-1 && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + // match: (Move {t1} [n] dst p1 mem:(Store {t2} op2:(OffPtr [o2] p2) d1 (Store {t3} op3:(OffPtr [o3] p3) d2 (Store {t4} op4:(OffPtr [0] p4) d3 _)))) + // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && o3 == sizeof(t4) && o2-o3 == sizeof(t3) && n == sizeof(t2) + sizeof(t3) + sizeof(t4) + // result: (Store {t2} (OffPtr [o2] dst) d1 (Store {t3} (OffPtr [o3] dst) d2 (Store {t4} (OffPtr [0] dst) d3 mem))) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul16 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpTrunc32to16 { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh32Ux64 { - break - } - _ = v_0_0_0.Args[1] - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpAvg32u { - break - } - _ = v_0_0_0_0.Args[1] - v_0_0_0_0_0 := v_0_0_0_0.Args[0] - if v_0_0_0_0_0.Op != OpLsh32x64 { - break - } - _ = v_0_0_0_0_0.Args[1] - v_0_0_0_0_0_0 := v_0_0_0_0_0.Args[0] - if v_0_0_0_0_0_0.Op != OpZeroExt16to32 || x != v_0_0_0_0_0_0.Args[0] { + n := v.AuxInt + t1 := v.Aux + _ = v.Args[2] + dst := v.Args[0] + p1 := v.Args[1] + mem := v.Args[2] + if mem.Op != OpStore { break } - v_0_0_0_0_0_1 := v_0_0_0_0_0.Args[1] - if v_0_0_0_0_0_1.Op != OpConst64 || v_0_0_0_0_0_1.AuxInt != 16 { + t2 := mem.Aux + _ = mem.Args[2] + op2 := mem.Args[0] + if op2.Op != OpOffPtr { break } - mul := v_0_0_0_0.Args[1] - if mul.Op != OpMul32 { + tt2 := op2.Type + o2 := op2.AuxInt + p2 := op2.Args[0] + d1 := mem.Args[1] + mem_2 := mem.Args[2] + if mem_2.Op != OpStore { break } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { + t3 := mem_2.Aux + _ = mem_2.Args[2] + op3 := mem_2.Args[0] + if op3.Op != OpOffPtr { break } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpZeroExt16to32 || x != mul_1.Args[0] { + tt3 := op3.Type + o3 := op3.AuxInt + p3 := op3.Args[0] + d2 := mem_2.Args[1] + mem_2_2 := mem_2.Args[2] + if mem_2_2.Op != OpStore { break } - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { + t4 := mem_2_2.Aux + _ = mem_2_2.Args[2] + op4 := mem_2_2.Args[0] + if op4.Op != OpOffPtr { break } - s := v_0_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst16 { + tt4 := op4.Type + if op4.AuxInt != 0 { break } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(16, c).m) && s == 16+umagic(16, c).s-1 && x.Op != OpConst16 && udivisibleOK(16, c)) { + p4 := op4.Args[0] + d3 := mem_2_2.Args[1] + if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && o3 == sizeof(t4) && o2-o3 == sizeof(t3) && n == sizeof(t2)+sizeof(t3)+sizeof(t4)) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) - v0.AddArg(v3) + v.reset(OpStore) + v.Aux = t2 + v0 := b.NewValue0(v.Pos, OpOffPtr, tt2) + v0.AuxInt = o2 + v0.AddArg(dst) v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) + v.AddArg(d1) + v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v1.Aux = t3 + v2 := b.NewValue0(v.Pos, OpOffPtr, tt3) + v2.AuxInt = o3 + v2.AddArg(dst) + v1.AddArg(v2) + v1.AddArg(d2) + v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v3.Aux = t4 + v4 := b.NewValue0(v.Pos, OpOffPtr, tt4) + v4.AuxInt = 0 + v4.AddArg(dst) + v3.AddArg(v4) + v3.AddArg(d3) + v3.AddArg(mem) + v1.AddArg(v3) + v.AddArg(v1) return true } - // match: (Eq16 (Mul16 (Trunc32to16 (Rsh32Ux64 (Avg32u (Lsh32x64 (ZeroExt16to32 x) (Const64 [16])) mul:(Mul32 (ZeroExt16to32 x) (Const32 [m]))) (Const64 [s]))) (Const16 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(16,c).m) && s == 16+umagic(16,c).s-1 && x.Op != OpConst16 && udivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Mul16 (Const16 [int64(int16(udivisible(16,c).m))]) x) (Const16 [int64(16-udivisible(16,c).k)]) ) (Const16 [int64(int16(udivisible(16,c).max))]) ) + // match: (Move {t1} [n] dst p1 mem:(Store {t2} op2:(OffPtr [o2] p2) d1 (Store {t3} op3:(OffPtr [o3] p3) d2 (Store {t4} op4:(OffPtr [o4] p4) d3 (Store {t5} op5:(OffPtr [0] p5) d4 _))))) + // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && alignof(t5) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && registerizable(b, t5) && o4 == sizeof(t5) && o3-o4 == sizeof(t4) && o2-o3 == sizeof(t3) && n == sizeof(t2) + sizeof(t3) + sizeof(t4) + sizeof(t5) + // result: (Store {t2} (OffPtr [o2] dst) d1 (Store {t3} (OffPtr [o3] dst) d2 (Store {t4} (OffPtr [o4] dst) d3 (Store {t5} (OffPtr [0] dst) d4 mem)))) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul16 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpTrunc32to16 { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh32Ux64 { - break - } - _ = v_0_0_0.Args[1] - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpAvg32u { + n := v.AuxInt + t1 := v.Aux + _ = v.Args[2] + dst := v.Args[0] + p1 := v.Args[1] + mem := v.Args[2] + if mem.Op != OpStore { break } - _ = v_0_0_0_0.Args[1] - v_0_0_0_0_0 := v_0_0_0_0.Args[0] - if v_0_0_0_0_0.Op != OpLsh32x64 { + t2 := mem.Aux + _ = mem.Args[2] + op2 := mem.Args[0] + if op2.Op != OpOffPtr { break } - _ = v_0_0_0_0_0.Args[1] - v_0_0_0_0_0_0 := v_0_0_0_0_0.Args[0] - if v_0_0_0_0_0_0.Op != OpZeroExt16to32 || x != v_0_0_0_0_0_0.Args[0] { + tt2 := op2.Type + o2 := op2.AuxInt + p2 := op2.Args[0] + d1 := mem.Args[1] + mem_2 := mem.Args[2] + if mem_2.Op != OpStore { break } - v_0_0_0_0_0_1 := v_0_0_0_0_0.Args[1] - if v_0_0_0_0_0_1.Op != OpConst64 || v_0_0_0_0_0_1.AuxInt != 16 { + t3 := mem_2.Aux + _ = mem_2.Args[2] + op3 := mem_2.Args[0] + if op3.Op != OpOffPtr { break } - mul := v_0_0_0_0.Args[1] - if mul.Op != OpMul32 { + tt3 := op3.Type + o3 := op3.AuxInt + p3 := op3.Args[0] + d2 := mem_2.Args[1] + mem_2_2 := mem_2.Args[2] + if mem_2_2.Op != OpStore { break } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpZeroExt16to32 || x != mul_0.Args[0] { + t4 := mem_2_2.Aux + _ = mem_2_2.Args[2] + op4 := mem_2_2.Args[0] + if op4.Op != OpOffPtr { break } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { + tt4 := op4.Type + o4 := op4.AuxInt + p4 := op4.Args[0] + d3 := mem_2_2.Args[1] + mem_2_2_2 := mem_2_2.Args[2] + if mem_2_2_2.Op != OpStore { break } - m := mul_1.AuxInt - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { + t5 := mem_2_2_2.Aux + _ = mem_2_2_2.Args[2] + op5 := mem_2_2_2.Args[0] + if op5.Op != OpOffPtr { break } - s := v_0_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst16 { + tt5 := op5.Type + if op5.AuxInt != 0 { break } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(16, c).m) && s == 16+umagic(16, c).s-1 && x.Op != OpConst16 && udivisibleOK(16, c)) { + p5 := op5.Args[0] + d4 := mem_2_2_2.Args[1] + if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && alignof(t5) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && registerizable(b, t5) && o4 == sizeof(t5) && o3-o4 == sizeof(t4) && o2-o3 == sizeof(t3) && n == sizeof(t2)+sizeof(t3)+sizeof(t4)+sizeof(t5)) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v2.AuxInt = int64(int16(udivisible(16, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(16 - udivisible(16, c).k) - v0.AddArg(v3) + v.reset(OpStore) + v.Aux = t2 + v0 := b.NewValue0(v.Pos, OpOffPtr, tt2) + v0.AuxInt = o2 + v0.AddArg(dst) v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(udivisible(16, c).max)) - v.AddArg(v4) + v.AddArg(d1) + v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v1.Aux = t3 + v2 := b.NewValue0(v.Pos, OpOffPtr, tt3) + v2.AuxInt = o3 + v2.AddArg(dst) + v1.AddArg(v2) + v1.AddArg(d2) + v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v3.Aux = t4 + v4 := b.NewValue0(v.Pos, OpOffPtr, tt4) + v4.AuxInt = o4 + v4.AddArg(dst) + v3.AddArg(v4) + v3.AddArg(d3) + v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v5.Aux = t5 + v6 := b.NewValue0(v.Pos, OpOffPtr, tt5) + v6.AuxInt = 0 + v6.AddArg(dst) + v5.AddArg(v6) + v5.AddArg(d4) + v5.AddArg(mem) + v3.AddArg(v5) + v1.AddArg(v3) + v.AddArg(v1) return true } - // match: (Eq16 x (Mul16 (Const16 [c]) (Sub16 (Rsh32x64 mul:(Mul32 (Const32 [m]) (SignExt16to32 x)) (Const64 [s])) (Rsh32x64 (SignExt16to32 x) (Const64 [31]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(16,c).m) && s == 16+smagic(16,c).s && x.Op != OpConst16 && sdivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Add16 (Mul16 (Const16 [int64(int16(sdivisible(16,c).m))]) x) (Const16 [int64(int16(sdivisible(16,c).a))]) ) (Const16 [int64(16-sdivisible(16,c).k)]) ) (Const16 [int64(int16(sdivisible(16,c).max))]) ) + return false +} +func rewriteValuegeneric_OpMove_10(v *Value) bool { + b := v.Block + // match: (Move {t1} [n] dst p1 mem:(VarDef (Store {t2} op2:(OffPtr [o2] p2) d1 (Store {t3} op3:(OffPtr [0] p3) d2 _)))) + // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && o2 == sizeof(t3) && n == sizeof(t2) + sizeof(t3) + // result: (Store {t2} (OffPtr [o2] dst) d1 (Store {t3} (OffPtr [0] dst) d2 mem)) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst16 { + n := v.AuxInt + t1 := v.Aux + _ = v.Args[2] + dst := v.Args[0] + p1 := v.Args[1] + mem := v.Args[2] + if mem.Op != OpVarDef { break } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpSub16 { + mem_0 := mem.Args[0] + if mem_0.Op != OpStore { break } - _ = v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh32x64 { + t2 := mem_0.Aux + _ = mem_0.Args[2] + op2 := mem_0.Args[0] + if op2.Op != OpOffPtr { break } - _ = v_1_1_0.Args[1] - mul := v_1_1_0.Args[0] - if mul.Op != OpMul32 { + tt2 := op2.Type + o2 := op2.AuxInt + p2 := op2.Args[0] + d1 := mem_0.Args[1] + mem_0_2 := mem_0.Args[2] + if mem_0_2.Op != OpStore { break } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { + t3 := mem_0_2.Aux + _ = mem_0_2.Args[2] + op3 := mem_0_2.Args[0] + if op3.Op != OpOffPtr { break } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpSignExt16to32 || x != mul_1.Args[0] { + tt3 := op3.Type + if op3.AuxInt != 0 { break } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { - break - } - s := v_1_1_0_1.AuxInt - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpRsh32x64 { - break - } - _ = v_1_1_1.Args[1] - v_1_1_1_0 := v_1_1_1.Args[0] - if v_1_1_1_0.Op != OpSignExt16to32 || x != v_1_1_1_0.Args[0] { - break - } - v_1_1_1_1 := v_1_1_1.Args[1] - if v_1_1_1_1.Op != OpConst64 || v_1_1_1_1.AuxInt != 31 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(16, c).m) && s == 16+smagic(16, c).s && x.Op != OpConst16 && sdivisibleOK(16, c)) { + p3 := op3.Args[0] + d2 := mem_0_2.Args[1] + if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && o2 == sizeof(t3) && n == sizeof(t2)+sizeof(t3)) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpAdd16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(int16(sdivisible(16, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(sdivisible(16, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v5.AuxInt = int64(16 - sdivisible(16, c).k) - v0.AddArg(v5) + v.reset(OpStore) + v.Aux = t2 + v0 := b.NewValue0(v.Pos, OpOffPtr, tt2) + v0.AuxInt = o2 + v0.AddArg(dst) v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v6.AuxInt = int64(int16(sdivisible(16, c).max)) - v.AddArg(v6) + v.AddArg(d1) + v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v1.Aux = t3 + v2 := b.NewValue0(v.Pos, OpOffPtr, tt3) + v2.AuxInt = 0 + v2.AddArg(dst) + v1.AddArg(v2) + v1.AddArg(d2) + v1.AddArg(mem) + v.AddArg(v1) return true } - // match: (Eq16 x (Mul16 (Const16 [c]) (Sub16 (Rsh32x64 mul:(Mul32 (SignExt16to32 x) (Const32 [m])) (Const64 [s])) (Rsh32x64 (SignExt16to32 x) (Const64 [31]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(16,c).m) && s == 16+smagic(16,c).s && x.Op != OpConst16 && sdivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Add16 (Mul16 (Const16 [int64(int16(sdivisible(16,c).m))]) x) (Const16 [int64(int16(sdivisible(16,c).a))]) ) (Const16 [int64(16-sdivisible(16,c).k)]) ) (Const16 [int64(int16(sdivisible(16,c).max))]) ) + // match: (Move {t1} [n] dst p1 mem:(VarDef (Store {t2} op2:(OffPtr [o2] p2) d1 (Store {t3} op3:(OffPtr [o3] p3) d2 (Store {t4} op4:(OffPtr [0] p4) d3 _))))) + // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && o3 == sizeof(t4) && o2-o3 == sizeof(t3) && n == sizeof(t2) + sizeof(t3) + sizeof(t4) + // result: (Store {t2} (OffPtr [o2] dst) d1 (Store {t3} (OffPtr [o3] dst) d2 (Store {t4} (OffPtr [0] dst) d3 mem))) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst16 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpSub16 { + n := v.AuxInt + t1 := v.Aux + _ = v.Args[2] + dst := v.Args[0] + p1 := v.Args[1] + mem := v.Args[2] + if mem.Op != OpVarDef { break } - _ = v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh32x64 { + mem_0 := mem.Args[0] + if mem_0.Op != OpStore { break } - _ = v_1_1_0.Args[1] - mul := v_1_1_0.Args[0] - if mul.Op != OpMul32 { + t2 := mem_0.Aux + _ = mem_0.Args[2] + op2 := mem_0.Args[0] + if op2.Op != OpOffPtr { break } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpSignExt16to32 || x != mul_0.Args[0] { + tt2 := op2.Type + o2 := op2.AuxInt + p2 := op2.Args[0] + d1 := mem_0.Args[1] + mem_0_2 := mem_0.Args[2] + if mem_0_2.Op != OpStore { break } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { + t3 := mem_0_2.Aux + _ = mem_0_2.Args[2] + op3 := mem_0_2.Args[0] + if op3.Op != OpOffPtr { break } - m := mul_1.AuxInt - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { + tt3 := op3.Type + o3 := op3.AuxInt + p3 := op3.Args[0] + d2 := mem_0_2.Args[1] + mem_0_2_2 := mem_0_2.Args[2] + if mem_0_2_2.Op != OpStore { break } - s := v_1_1_0_1.AuxInt - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpRsh32x64 { + t4 := mem_0_2_2.Aux + _ = mem_0_2_2.Args[2] + op4 := mem_0_2_2.Args[0] + if op4.Op != OpOffPtr { break } - _ = v_1_1_1.Args[1] - v_1_1_1_0 := v_1_1_1.Args[0] - if v_1_1_1_0.Op != OpSignExt16to32 || x != v_1_1_1_0.Args[0] { + tt4 := op4.Type + if op4.AuxInt != 0 { break } - v_1_1_1_1 := v_1_1_1.Args[1] - if v_1_1_1_1.Op != OpConst64 || v_1_1_1_1.AuxInt != 31 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(16, c).m) && s == 16+smagic(16, c).s && x.Op != OpConst16 && sdivisibleOK(16, c)) { + p4 := op4.Args[0] + d3 := mem_0_2_2.Args[1] + if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && o3 == sizeof(t4) && o2-o3 == sizeof(t3) && n == sizeof(t2)+sizeof(t3)+sizeof(t4)) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpAdd16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(int16(sdivisible(16, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(sdivisible(16, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v5.AuxInt = int64(16 - sdivisible(16, c).k) - v0.AddArg(v5) + v.reset(OpStore) + v.Aux = t2 + v0 := b.NewValue0(v.Pos, OpOffPtr, tt2) + v0.AuxInt = o2 + v0.AddArg(dst) v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v6.AuxInt = int64(int16(sdivisible(16, c).max)) - v.AddArg(v6) + v.AddArg(d1) + v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v1.Aux = t3 + v2 := b.NewValue0(v.Pos, OpOffPtr, tt3) + v2.AuxInt = o3 + v2.AddArg(dst) + v1.AddArg(v2) + v1.AddArg(d2) + v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v3.Aux = t4 + v4 := b.NewValue0(v.Pos, OpOffPtr, tt4) + v4.AuxInt = 0 + v4.AddArg(dst) + v3.AddArg(v4) + v3.AddArg(d3) + v3.AddArg(mem) + v1.AddArg(v3) + v.AddArg(v1) return true } - // match: (Eq16 x (Mul16 (Sub16 (Rsh32x64 mul:(Mul32 (Const32 [m]) (SignExt16to32 x)) (Const64 [s])) (Rsh32x64 (SignExt16to32 x) (Const64 [31]))) (Const16 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(16,c).m) && s == 16+smagic(16,c).s && x.Op != OpConst16 && sdivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Add16 (Mul16 (Const16 [int64(int16(sdivisible(16,c).m))]) x) (Const16 [int64(int16(sdivisible(16,c).a))]) ) (Const16 [int64(16-sdivisible(16,c).k)]) ) (Const16 [int64(int16(sdivisible(16,c).max))]) ) + // match: (Move {t1} [n] dst p1 mem:(VarDef (Store {t2} op2:(OffPtr [o2] p2) d1 (Store {t3} op3:(OffPtr [o3] p3) d2 (Store {t4} op4:(OffPtr [o4] p4) d3 (Store {t5} op5:(OffPtr [0] p5) d4 _)))))) + // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && alignof(t5) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && registerizable(b, t5) && o4 == sizeof(t5) && o3-o4 == sizeof(t4) && o2-o3 == sizeof(t3) && n == sizeof(t2) + sizeof(t3) + sizeof(t4) + sizeof(t5) + // result: (Store {t2} (OffPtr [o2] dst) d1 (Store {t3} (OffPtr [o3] dst) d2 (Store {t4} (OffPtr [o4] dst) d3 (Store {t5} (OffPtr [0] dst) d4 mem)))) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpSub16 { + n := v.AuxInt + t1 := v.Aux + _ = v.Args[2] + dst := v.Args[0] + p1 := v.Args[1] + mem := v.Args[2] + if mem.Op != OpVarDef { break } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh32x64 { + mem_0 := mem.Args[0] + if mem_0.Op != OpStore { break } - _ = v_1_0_0.Args[1] - mul := v_1_0_0.Args[0] - if mul.Op != OpMul32 { + t2 := mem_0.Aux + _ = mem_0.Args[2] + op2 := mem_0.Args[0] + if op2.Op != OpOffPtr { break } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { + tt2 := op2.Type + o2 := op2.AuxInt + p2 := op2.Args[0] + d1 := mem_0.Args[1] + mem_0_2 := mem_0.Args[2] + if mem_0_2.Op != OpStore { break } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpSignExt16to32 || x != mul_1.Args[0] { + t3 := mem_0_2.Aux + _ = mem_0_2.Args[2] + op3 := mem_0_2.Args[0] + if op3.Op != OpOffPtr { break } - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { + tt3 := op3.Type + o3 := op3.AuxInt + p3 := op3.Args[0] + d2 := mem_0_2.Args[1] + mem_0_2_2 := mem_0_2.Args[2] + if mem_0_2_2.Op != OpStore { break } - s := v_1_0_0_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpRsh32x64 { + t4 := mem_0_2_2.Aux + _ = mem_0_2_2.Args[2] + op4 := mem_0_2_2.Args[0] + if op4.Op != OpOffPtr { break } - _ = v_1_0_1.Args[1] - v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpSignExt16to32 || x != v_1_0_1_0.Args[0] { + tt4 := op4.Type + o4 := op4.AuxInt + p4 := op4.Args[0] + d3 := mem_0_2_2.Args[1] + mem_0_2_2_2 := mem_0_2_2.Args[2] + if mem_0_2_2_2.Op != OpStore { break } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpConst64 || v_1_0_1_1.AuxInt != 31 { + t5 := mem_0_2_2_2.Aux + _ = mem_0_2_2_2.Args[2] + op5 := mem_0_2_2_2.Args[0] + if op5.Op != OpOffPtr { break } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst16 { + tt5 := op5.Type + if op5.AuxInt != 0 { break } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(16, c).m) && s == 16+smagic(16, c).s && x.Op != OpConst16 && sdivisibleOK(16, c)) { + p5 := op5.Args[0] + d4 := mem_0_2_2_2.Args[1] + if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && alignof(t5) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && registerizable(b, t5) && o4 == sizeof(t5) && o3-o4 == sizeof(t4) && o2-o3 == sizeof(t3) && n == sizeof(t2)+sizeof(t3)+sizeof(t4)+sizeof(t5)) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpAdd16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(int16(sdivisible(16, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(sdivisible(16, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v5.AuxInt = int64(16 - sdivisible(16, c).k) - v0.AddArg(v5) + v.reset(OpStore) + v.Aux = t2 + v0 := b.NewValue0(v.Pos, OpOffPtr, tt2) + v0.AuxInt = o2 + v0.AddArg(dst) v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v6.AuxInt = int64(int16(sdivisible(16, c).max)) - v.AddArg(v6) + v.AddArg(d1) + v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v1.Aux = t3 + v2 := b.NewValue0(v.Pos, OpOffPtr, tt3) + v2.AuxInt = o3 + v2.AddArg(dst) + v1.AddArg(v2) + v1.AddArg(d2) + v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v3.Aux = t4 + v4 := b.NewValue0(v.Pos, OpOffPtr, tt4) + v4.AuxInt = o4 + v4.AddArg(dst) + v3.AddArg(v4) + v3.AddArg(d3) + v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v5.Aux = t5 + v6 := b.NewValue0(v.Pos, OpOffPtr, tt5) + v6.AuxInt = 0 + v6.AddArg(dst) + v5.AddArg(v6) + v5.AddArg(d4) + v5.AddArg(mem) + v3.AddArg(v5) + v1.AddArg(v3) + v.AddArg(v1) return true } - // match: (Eq16 x (Mul16 (Sub16 (Rsh32x64 mul:(Mul32 (SignExt16to32 x) (Const32 [m])) (Const64 [s])) (Rsh32x64 (SignExt16to32 x) (Const64 [31]))) (Const16 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(16,c).m) && s == 16+smagic(16,c).s && x.Op != OpConst16 && sdivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Add16 (Mul16 (Const16 [int64(int16(sdivisible(16,c).m))]) x) (Const16 [int64(int16(sdivisible(16,c).a))]) ) (Const16 [int64(16-sdivisible(16,c).k)]) ) (Const16 [int64(int16(sdivisible(16,c).max))]) ) + // match: (Move {t1} [n] dst p1 mem:(Store {t2} op2:(OffPtr [o2] p2) d1 (Zero {t3} [n] p3 _))) + // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && registerizable(b, t2) && n >= o2 + sizeof(t2) + // result: (Store {t2} (OffPtr [o2] dst) d1 (Zero {t1} [n] dst mem)) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpSub16 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh32x64 { - break - } - _ = v_1_0_0.Args[1] - mul := v_1_0_0.Args[0] - if mul.Op != OpMul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpSignExt16to32 || x != mul_0.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { - break - } - m := mul_1.AuxInt - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { + n := v.AuxInt + t1 := v.Aux + _ = v.Args[2] + dst := v.Args[0] + p1 := v.Args[1] + mem := v.Args[2] + if mem.Op != OpStore { break } - s := v_1_0_0_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpRsh32x64 { + t2 := mem.Aux + _ = mem.Args[2] + op2 := mem.Args[0] + if op2.Op != OpOffPtr { break } - _ = v_1_0_1.Args[1] - v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpSignExt16to32 || x != v_1_0_1_0.Args[0] { + tt2 := op2.Type + o2 := op2.AuxInt + p2 := op2.Args[0] + d1 := mem.Args[1] + mem_2 := mem.Args[2] + if mem_2.Op != OpZero || mem_2.AuxInt != n { break } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpConst64 || v_1_0_1_1.AuxInt != 31 { + t3 := mem_2.Aux + _ = mem_2.Args[1] + p3 := mem_2.Args[0] + if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && registerizable(b, t2) && n >= o2+sizeof(t2)) { break } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst16 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(16, c).m) && s == 16+smagic(16, c).s && x.Op != OpConst16 && sdivisibleOK(16, c)) { - break - } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpAdd16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(int16(sdivisible(16, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(sdivisible(16, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v5.AuxInt = int64(16 - sdivisible(16, c).k) - v0.AddArg(v5) + v.reset(OpStore) + v.Aux = t2 + v0 := b.NewValue0(v.Pos, OpOffPtr, tt2) + v0.AuxInt = o2 + v0.AddArg(dst) v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v6.AuxInt = int64(int16(sdivisible(16, c).max)) - v.AddArg(v6) + v.AddArg(d1) + v1 := b.NewValue0(v.Pos, OpZero, types.TypeMem) + v1.AuxInt = n + v1.Aux = t1 + v1.AddArg(dst) + v1.AddArg(mem) + v.AddArg(v1) return true } - // match: (Eq16 (Mul16 (Const16 [c]) (Sub16 (Rsh32x64 mul:(Mul32 (Const32 [m]) (SignExt16to32 x)) (Const64 [s])) (Rsh32x64 (SignExt16to32 x) (Const64 [31])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(16,c).m) && s == 16+smagic(16,c).s && x.Op != OpConst16 && sdivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Add16 (Mul16 (Const16 [int64(int16(sdivisible(16,c).m))]) x) (Const16 [int64(int16(sdivisible(16,c).a))]) ) (Const16 [int64(16-sdivisible(16,c).k)]) ) (Const16 [int64(int16(sdivisible(16,c).max))]) ) + // match: (Move {t1} [n] dst p1 mem:(Store {t2} (OffPtr [o2] p2) d1 (Store {t3} (OffPtr [o3] p3) d2 (Zero {t4} [n] p4 _)))) + // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && n >= o2 + sizeof(t2) && n >= o3 + sizeof(t3) + // result: (Store {t2} (OffPtr [o2] dst) d1 (Store {t3} (OffPtr [o3] dst) d2 (Zero {t1} [n] dst mem))) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul16 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst16 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpSub16 { - break - } - _ = v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh32x64 { - break - } - _ = v_0_1_0.Args[1] - mul := v_0_1_0.Args[0] - if mul.Op != OpMul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { + n := v.AuxInt + t1 := v.Aux + _ = v.Args[2] + dst := v.Args[0] + p1 := v.Args[1] + mem := v.Args[2] + if mem.Op != OpStore { break } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpSignExt16to32 || x != mul_1.Args[0] { + t2 := mem.Aux + _ = mem.Args[2] + mem_0 := mem.Args[0] + if mem_0.Op != OpOffPtr { break } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { + tt2 := mem_0.Type + o2 := mem_0.AuxInt + p2 := mem_0.Args[0] + d1 := mem.Args[1] + mem_2 := mem.Args[2] + if mem_2.Op != OpStore { break } - s := v_0_1_0_1.AuxInt - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpRsh32x64 { + t3 := mem_2.Aux + _ = mem_2.Args[2] + mem_2_0 := mem_2.Args[0] + if mem_2_0.Op != OpOffPtr { break } - _ = v_0_1_1.Args[1] - v_0_1_1_0 := v_0_1_1.Args[0] - if v_0_1_1_0.Op != OpSignExt16to32 || x != v_0_1_1_0.Args[0] { + tt3 := mem_2_0.Type + o3 := mem_2_0.AuxInt + p3 := mem_2_0.Args[0] + d2 := mem_2.Args[1] + mem_2_2 := mem_2.Args[2] + if mem_2_2.Op != OpZero || mem_2_2.AuxInt != n { break } - v_0_1_1_1 := v_0_1_1.Args[1] - if v_0_1_1_1.Op != OpConst64 || v_0_1_1_1.AuxInt != 31 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(16, c).m) && s == 16+smagic(16, c).s && x.Op != OpConst16 && sdivisibleOK(16, c)) { + t4 := mem_2_2.Aux + _ = mem_2_2.Args[1] + p4 := mem_2_2.Args[0] + if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && n >= o2+sizeof(t2) && n >= o3+sizeof(t3)) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpAdd16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(int16(sdivisible(16, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(sdivisible(16, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v5.AuxInt = int64(16 - sdivisible(16, c).k) - v0.AddArg(v5) + v.reset(OpStore) + v.Aux = t2 + v0 := b.NewValue0(v.Pos, OpOffPtr, tt2) + v0.AuxInt = o2 + v0.AddArg(dst) v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v6.AuxInt = int64(int16(sdivisible(16, c).max)) - v.AddArg(v6) + v.AddArg(d1) + v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v1.Aux = t3 + v2 := b.NewValue0(v.Pos, OpOffPtr, tt3) + v2.AuxInt = o3 + v2.AddArg(dst) + v1.AddArg(v2) + v1.AddArg(d2) + v3 := b.NewValue0(v.Pos, OpZero, types.TypeMem) + v3.AuxInt = n + v3.Aux = t1 + v3.AddArg(dst) + v3.AddArg(mem) + v1.AddArg(v3) + v.AddArg(v1) return true } - // match: (Eq16 (Mul16 (Const16 [c]) (Sub16 (Rsh32x64 mul:(Mul32 (SignExt16to32 x) (Const32 [m])) (Const64 [s])) (Rsh32x64 (SignExt16to32 x) (Const64 [31])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(16,c).m) && s == 16+smagic(16,c).s && x.Op != OpConst16 && sdivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Add16 (Mul16 (Const16 [int64(int16(sdivisible(16,c).m))]) x) (Const16 [int64(int16(sdivisible(16,c).a))]) ) (Const16 [int64(16-sdivisible(16,c).k)]) ) (Const16 [int64(int16(sdivisible(16,c).max))]) ) + // match: (Move {t1} [n] dst p1 mem:(Store {t2} (OffPtr [o2] p2) d1 (Store {t3} (OffPtr [o3] p3) d2 (Store {t4} (OffPtr [o4] p4) d3 (Zero {t5} [n] p5 _))))) + // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && alignof(t5) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && n >= o2 + sizeof(t2) && n >= o3 + sizeof(t3) && n >= o4 + sizeof(t4) + // result: (Store {t2} (OffPtr [o2] dst) d1 (Store {t3} (OffPtr [o3] dst) d2 (Store {t4} (OffPtr [o4] dst) d3 (Zero {t1} [n] dst mem)))) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul16 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst16 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpSub16 { - break - } - _ = v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh32x64 { + n := v.AuxInt + t1 := v.Aux + _ = v.Args[2] + dst := v.Args[0] + p1 := v.Args[1] + mem := v.Args[2] + if mem.Op != OpStore { break } - _ = v_0_1_0.Args[1] - mul := v_0_1_0.Args[0] - if mul.Op != OpMul32 { + t2 := mem.Aux + _ = mem.Args[2] + mem_0 := mem.Args[0] + if mem_0.Op != OpOffPtr { break } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpSignExt16to32 || x != mul_0.Args[0] { + tt2 := mem_0.Type + o2 := mem_0.AuxInt + p2 := mem_0.Args[0] + d1 := mem.Args[1] + mem_2 := mem.Args[2] + if mem_2.Op != OpStore { break } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { + t3 := mem_2.Aux + _ = mem_2.Args[2] + mem_2_0 := mem_2.Args[0] + if mem_2_0.Op != OpOffPtr { break } - m := mul_1.AuxInt - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { + tt3 := mem_2_0.Type + o3 := mem_2_0.AuxInt + p3 := mem_2_0.Args[0] + d2 := mem_2.Args[1] + mem_2_2 := mem_2.Args[2] + if mem_2_2.Op != OpStore { break } - s := v_0_1_0_1.AuxInt - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpRsh32x64 { + t4 := mem_2_2.Aux + _ = mem_2_2.Args[2] + mem_2_2_0 := mem_2_2.Args[0] + if mem_2_2_0.Op != OpOffPtr { break } - _ = v_0_1_1.Args[1] - v_0_1_1_0 := v_0_1_1.Args[0] - if v_0_1_1_0.Op != OpSignExt16to32 || x != v_0_1_1_0.Args[0] { + tt4 := mem_2_2_0.Type + o4 := mem_2_2_0.AuxInt + p4 := mem_2_2_0.Args[0] + d3 := mem_2_2.Args[1] + mem_2_2_2 := mem_2_2.Args[2] + if mem_2_2_2.Op != OpZero || mem_2_2_2.AuxInt != n { break } - v_0_1_1_1 := v_0_1_1.Args[1] - if v_0_1_1_1.Op != OpConst64 || v_0_1_1_1.AuxInt != 31 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(16, c).m) && s == 16+smagic(16, c).s && x.Op != OpConst16 && sdivisibleOK(16, c)) { + t5 := mem_2_2_2.Aux + _ = mem_2_2_2.Args[1] + p5 := mem_2_2_2.Args[0] + if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && alignof(t5) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && n >= o2+sizeof(t2) && n >= o3+sizeof(t3) && n >= o4+sizeof(t4)) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpAdd16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(int16(sdivisible(16, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(sdivisible(16, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v5.AuxInt = int64(16 - sdivisible(16, c).k) - v0.AddArg(v5) + v.reset(OpStore) + v.Aux = t2 + v0 := b.NewValue0(v.Pos, OpOffPtr, tt2) + v0.AuxInt = o2 + v0.AddArg(dst) v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v6.AuxInt = int64(int16(sdivisible(16, c).max)) - v.AddArg(v6) + v.AddArg(d1) + v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v1.Aux = t3 + v2 := b.NewValue0(v.Pos, OpOffPtr, tt3) + v2.AuxInt = o3 + v2.AddArg(dst) + v1.AddArg(v2) + v1.AddArg(d2) + v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v3.Aux = t4 + v4 := b.NewValue0(v.Pos, OpOffPtr, tt4) + v4.AuxInt = o4 + v4.AddArg(dst) + v3.AddArg(v4) + v3.AddArg(d3) + v5 := b.NewValue0(v.Pos, OpZero, types.TypeMem) + v5.AuxInt = n + v5.Aux = t1 + v5.AddArg(dst) + v5.AddArg(mem) + v3.AddArg(v5) + v1.AddArg(v3) + v.AddArg(v1) return true } - // match: (Eq16 (Mul16 (Sub16 (Rsh32x64 mul:(Mul32 (Const32 [m]) (SignExt16to32 x)) (Const64 [s])) (Rsh32x64 (SignExt16to32 x) (Const64 [31]))) (Const16 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(16,c).m) && s == 16+smagic(16,c).s && x.Op != OpConst16 && sdivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Add16 (Mul16 (Const16 [int64(int16(sdivisible(16,c).m))]) x) (Const16 [int64(int16(sdivisible(16,c).a))]) ) (Const16 [int64(16-sdivisible(16,c).k)]) ) (Const16 [int64(int16(sdivisible(16,c).max))]) ) + // match: (Move {t1} [n] dst p1 mem:(Store {t2} (OffPtr [o2] p2) d1 (Store {t3} (OffPtr [o3] p3) d2 (Store {t4} (OffPtr [o4] p4) d3 (Store {t5} (OffPtr [o5] p5) d4 (Zero {t6} [n] p6 _)))))) + // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && isSamePtr(p5, p6) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && alignof(t5) <= alignof(t1) && alignof(t6) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && registerizable(b, t5) && n >= o2 + sizeof(t2) && n >= o3 + sizeof(t3) && n >= o4 + sizeof(t4) && n >= o5 + sizeof(t5) + // result: (Store {t2} (OffPtr [o2] dst) d1 (Store {t3} (OffPtr [o3] dst) d2 (Store {t4} (OffPtr [o4] dst) d3 (Store {t5} (OffPtr [o5] dst) d4 (Zero {t1} [n] dst mem))))) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul16 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSub16 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh32x64 { + n := v.AuxInt + t1 := v.Aux + _ = v.Args[2] + dst := v.Args[0] + p1 := v.Args[1] + mem := v.Args[2] + if mem.Op != OpStore { break } - _ = v_0_0_0.Args[1] - mul := v_0_0_0.Args[0] - if mul.Op != OpMul32 { + t2 := mem.Aux + _ = mem.Args[2] + mem_0 := mem.Args[0] + if mem_0.Op != OpOffPtr { break } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { + tt2 := mem_0.Type + o2 := mem_0.AuxInt + p2 := mem_0.Args[0] + d1 := mem.Args[1] + mem_2 := mem.Args[2] + if mem_2.Op != OpStore { break } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpSignExt16to32 || x != mul_1.Args[0] { + t3 := mem_2.Aux + _ = mem_2.Args[2] + mem_2_0 := mem_2.Args[0] + if mem_2_0.Op != OpOffPtr { break } - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { + tt3 := mem_2_0.Type + o3 := mem_2_0.AuxInt + p3 := mem_2_0.Args[0] + d2 := mem_2.Args[1] + mem_2_2 := mem_2.Args[2] + if mem_2_2.Op != OpStore { break } - s := v_0_0_0_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpRsh32x64 { + t4 := mem_2_2.Aux + _ = mem_2_2.Args[2] + mem_2_2_0 := mem_2_2.Args[0] + if mem_2_2_0.Op != OpOffPtr { break } - _ = v_0_0_1.Args[1] - v_0_0_1_0 := v_0_0_1.Args[0] - if v_0_0_1_0.Op != OpSignExt16to32 || x != v_0_0_1_0.Args[0] { + tt4 := mem_2_2_0.Type + o4 := mem_2_2_0.AuxInt + p4 := mem_2_2_0.Args[0] + d3 := mem_2_2.Args[1] + mem_2_2_2 := mem_2_2.Args[2] + if mem_2_2_2.Op != OpStore { break } - v_0_0_1_1 := v_0_0_1.Args[1] - if v_0_0_1_1.Op != OpConst64 || v_0_0_1_1.AuxInt != 31 { + t5 := mem_2_2_2.Aux + _ = mem_2_2_2.Args[2] + mem_2_2_2_0 := mem_2_2_2.Args[0] + if mem_2_2_2_0.Op != OpOffPtr { break } - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst16 { + tt5 := mem_2_2_2_0.Type + o5 := mem_2_2_2_0.AuxInt + p5 := mem_2_2_2_0.Args[0] + d4 := mem_2_2_2.Args[1] + mem_2_2_2_2 := mem_2_2_2.Args[2] + if mem_2_2_2_2.Op != OpZero || mem_2_2_2_2.AuxInt != n { break } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(16, c).m) && s == 16+smagic(16, c).s && x.Op != OpConst16 && sdivisibleOK(16, c)) { + t6 := mem_2_2_2_2.Aux + _ = mem_2_2_2_2.Args[1] + p6 := mem_2_2_2_2.Args[0] + if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && isSamePtr(p5, p6) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && alignof(t5) <= alignof(t1) && alignof(t6) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && registerizable(b, t5) && n >= o2+sizeof(t2) && n >= o3+sizeof(t3) && n >= o4+sizeof(t4) && n >= o5+sizeof(t5)) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpAdd16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(int16(sdivisible(16, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(sdivisible(16, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v5.AuxInt = int64(16 - sdivisible(16, c).k) - v0.AddArg(v5) + v.reset(OpStore) + v.Aux = t2 + v0 := b.NewValue0(v.Pos, OpOffPtr, tt2) + v0.AuxInt = o2 + v0.AddArg(dst) v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v6.AuxInt = int64(int16(sdivisible(16, c).max)) - v.AddArg(v6) + v.AddArg(d1) + v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v1.Aux = t3 + v2 := b.NewValue0(v.Pos, OpOffPtr, tt3) + v2.AuxInt = o3 + v2.AddArg(dst) + v1.AddArg(v2) + v1.AddArg(d2) + v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v3.Aux = t4 + v4 := b.NewValue0(v.Pos, OpOffPtr, tt4) + v4.AuxInt = o4 + v4.AddArg(dst) + v3.AddArg(v4) + v3.AddArg(d3) + v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v5.Aux = t5 + v6 := b.NewValue0(v.Pos, OpOffPtr, tt5) + v6.AuxInt = o5 + v6.AddArg(dst) + v5.AddArg(v6) + v5.AddArg(d4) + v7 := b.NewValue0(v.Pos, OpZero, types.TypeMem) + v7.AuxInt = n + v7.Aux = t1 + v7.AddArg(dst) + v7.AddArg(mem) + v5.AddArg(v7) + v3.AddArg(v5) + v1.AddArg(v3) + v.AddArg(v1) return true } - return false -} -func rewriteValuegeneric_OpEq16_50(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Eq16 (Mul16 (Sub16 (Rsh32x64 mul:(Mul32 (SignExt16to32 x) (Const32 [m])) (Const64 [s])) (Rsh32x64 (SignExt16to32 x) (Const64 [31]))) (Const16 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(16,c).m) && s == 16+smagic(16,c).s && x.Op != OpConst16 && sdivisibleOK(16,c) - // result: (Leq16U (RotateLeft16 (Add16 (Mul16 (Const16 [int64(int16(sdivisible(16,c).m))]) x) (Const16 [int64(int16(sdivisible(16,c).a))]) ) (Const16 [int64(16-sdivisible(16,c).k)]) ) (Const16 [int64(int16(sdivisible(16,c).max))]) ) + // match: (Move {t1} [n] dst p1 mem:(VarDef (Store {t2} op2:(OffPtr [o2] p2) d1 (Zero {t3} [n] p3 _)))) + // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && registerizable(b, t2) && n >= o2 + sizeof(t2) + // result: (Store {t2} (OffPtr [o2] dst) d1 (Zero {t1} [n] dst mem)) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul16 { + n := v.AuxInt + t1 := v.Aux + _ = v.Args[2] + dst := v.Args[0] + p1 := v.Args[1] + mem := v.Args[2] + if mem.Op != OpVarDef { break } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSub16 { + mem_0 := mem.Args[0] + if mem_0.Op != OpStore { break } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh32x64 { + t2 := mem_0.Aux + _ = mem_0.Args[2] + op2 := mem_0.Args[0] + if op2.Op != OpOffPtr { break } - _ = v_0_0_0.Args[1] - mul := v_0_0_0.Args[0] - if mul.Op != OpMul32 { + tt2 := op2.Type + o2 := op2.AuxInt + p2 := op2.Args[0] + d1 := mem_0.Args[1] + mem_0_2 := mem_0.Args[2] + if mem_0_2.Op != OpZero || mem_0_2.AuxInt != n { break } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpSignExt16to32 || x != mul_0.Args[0] { + t3 := mem_0_2.Aux + _ = mem_0_2.Args[1] + p3 := mem_0_2.Args[0] + if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && registerizable(b, t2) && n >= o2+sizeof(t2)) { break } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { + v.reset(OpStore) + v.Aux = t2 + v0 := b.NewValue0(v.Pos, OpOffPtr, tt2) + v0.AuxInt = o2 + v0.AddArg(dst) + v.AddArg(v0) + v.AddArg(d1) + v1 := b.NewValue0(v.Pos, OpZero, types.TypeMem) + v1.AuxInt = n + v1.Aux = t1 + v1.AddArg(dst) + v1.AddArg(mem) + v.AddArg(v1) + return true + } + // match: (Move {t1} [n] dst p1 mem:(VarDef (Store {t2} (OffPtr [o2] p2) d1 (Store {t3} (OffPtr [o3] p3) d2 (Zero {t4} [n] p4 _))))) + // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && n >= o2 + sizeof(t2) && n >= o3 + sizeof(t3) + // result: (Store {t2} (OffPtr [o2] dst) d1 (Store {t3} (OffPtr [o3] dst) d2 (Zero {t1} [n] dst mem))) + for { + n := v.AuxInt + t1 := v.Aux + _ = v.Args[2] + dst := v.Args[0] + p1 := v.Args[1] + mem := v.Args[2] + if mem.Op != OpVarDef { break } - m := mul_1.AuxInt - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { + mem_0 := mem.Args[0] + if mem_0.Op != OpStore { break } - s := v_0_0_0_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpRsh32x64 { + t2 := mem_0.Aux + _ = mem_0.Args[2] + mem_0_0 := mem_0.Args[0] + if mem_0_0.Op != OpOffPtr { break } - _ = v_0_0_1.Args[1] - v_0_0_1_0 := v_0_0_1.Args[0] - if v_0_0_1_0.Op != OpSignExt16to32 || x != v_0_0_1_0.Args[0] { + tt2 := mem_0_0.Type + o2 := mem_0_0.AuxInt + p2 := mem_0_0.Args[0] + d1 := mem_0.Args[1] + mem_0_2 := mem_0.Args[2] + if mem_0_2.Op != OpStore { break } - v_0_0_1_1 := v_0_0_1.Args[1] - if v_0_0_1_1.Op != OpConst64 || v_0_0_1_1.AuxInt != 31 { + t3 := mem_0_2.Aux + _ = mem_0_2.Args[2] + mem_0_2_0 := mem_0_2.Args[0] + if mem_0_2_0.Op != OpOffPtr { break } - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst16 { + tt3 := mem_0_2_0.Type + o3 := mem_0_2_0.AuxInt + p3 := mem_0_2_0.Args[0] + d2 := mem_0_2.Args[1] + mem_0_2_2 := mem_0_2.Args[2] + if mem_0_2_2.Op != OpZero || mem_0_2_2.AuxInt != n { break } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(16, c).m) && s == 16+smagic(16, c).s && x.Op != OpConst16 && sdivisibleOK(16, c)) { + t4 := mem_0_2_2.Aux + _ = mem_0_2_2.Args[1] + p4 := mem_0_2_2.Args[0] + if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && n >= o2+sizeof(t2) && n >= o3+sizeof(t3)) { break } - v.reset(OpLeq16U) - v0 := b.NewValue0(v.Pos, OpRotateLeft16, typ.UInt16) - v1 := b.NewValue0(v.Pos, OpAdd16, typ.UInt16) - v2 := b.NewValue0(v.Pos, OpMul16, typ.UInt16) - v3 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v3.AuxInt = int64(int16(sdivisible(16, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v4.AuxInt = int64(int16(sdivisible(16, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v5.AuxInt = int64(16 - sdivisible(16, c).k) - v0.AddArg(v5) + v.reset(OpStore) + v.Aux = t2 + v0 := b.NewValue0(v.Pos, OpOffPtr, tt2) + v0.AuxInt = o2 + v0.AddArg(dst) v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) - v6.AuxInt = int64(int16(sdivisible(16, c).max)) - v.AddArg(v6) + v.AddArg(d1) + v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v1.Aux = t3 + v2 := b.NewValue0(v.Pos, OpOffPtr, tt3) + v2.AuxInt = o3 + v2.AddArg(dst) + v1.AddArg(v2) + v1.AddArg(d2) + v3 := b.NewValue0(v.Pos, OpZero, types.TypeMem) + v3.AuxInt = n + v3.Aux = t1 + v3.AddArg(dst) + v3.AddArg(mem) + v1.AddArg(v3) + v.AddArg(v1) return true } - // match: (Eq16 n (Lsh16x64 (Rsh16x64 (Add16 n (Rsh16Ux64 (Rsh16x64 n (Const64 [15])) (Const64 [kbar]))) (Const64 [k])) (Const64 [k]))) - // cond: k > 0 && k < 15 && kbar == 16 - k - // result: (Eq16 (And16 n (Const16 [int64(1< [0])) + // match: (Move {t1} [n] dst p1 mem:(VarDef (Store {t2} (OffPtr [o2] p2) d1 (Store {t3} (OffPtr [o3] p3) d2 (Store {t4} (OffPtr [o4] p4) d3 (Zero {t5} [n] p5 _)))))) + // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && alignof(t5) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && n >= o2 + sizeof(t2) && n >= o3 + sizeof(t3) && n >= o4 + sizeof(t4) + // result: (Store {t2} (OffPtr [o2] dst) d1 (Store {t3} (OffPtr [o3] dst) d2 (Store {t4} (OffPtr [o4] dst) d3 (Zero {t1} [n] dst mem)))) for { - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpLsh16x64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpRsh16x64 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAdd16 { + n := v.AuxInt + t1 := v.Aux + _ = v.Args[2] + dst := v.Args[0] + p1 := v.Args[1] + mem := v.Args[2] + if mem.Op != OpVarDef { break } - t := v_1_0_0.Type - _ = v_1_0_0.Args[1] - if n != v_1_0_0.Args[0] { + mem_0 := mem.Args[0] + if mem_0.Op != OpStore { break } - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpRsh16Ux64 || v_1_0_0_1.Type != t { + t2 := mem_0.Aux + _ = mem_0.Args[2] + mem_0_0 := mem_0.Args[0] + if mem_0_0.Op != OpOffPtr { break } - _ = v_1_0_0_1.Args[1] - v_1_0_0_1_0 := v_1_0_0_1.Args[0] - if v_1_0_0_1_0.Op != OpRsh16x64 || v_1_0_0_1_0.Type != t { + tt2 := mem_0_0.Type + o2 := mem_0_0.AuxInt + p2 := mem_0_0.Args[0] + d1 := mem_0.Args[1] + mem_0_2 := mem_0.Args[2] + if mem_0_2.Op != OpStore { break } - _ = v_1_0_0_1_0.Args[1] - if n != v_1_0_0_1_0.Args[0] { + t3 := mem_0_2.Aux + _ = mem_0_2.Args[2] + mem_0_2_0 := mem_0_2.Args[0] + if mem_0_2_0.Op != OpOffPtr { break } - v_1_0_0_1_0_1 := v_1_0_0_1_0.Args[1] - if v_1_0_0_1_0_1.Op != OpConst64 || v_1_0_0_1_0_1.Type != typ.UInt64 || v_1_0_0_1_0_1.AuxInt != 15 { + tt3 := mem_0_2_0.Type + o3 := mem_0_2_0.AuxInt + p3 := mem_0_2_0.Args[0] + d2 := mem_0_2.Args[1] + mem_0_2_2 := mem_0_2.Args[2] + if mem_0_2_2.Op != OpStore { break } - v_1_0_0_1_1 := v_1_0_0_1.Args[1] - if v_1_0_0_1_1.Op != OpConst64 || v_1_0_0_1_1.Type != typ.UInt64 { + t4 := mem_0_2_2.Aux + _ = mem_0_2_2.Args[2] + mem_0_2_2_0 := mem_0_2_2.Args[0] + if mem_0_2_2_0.Op != OpOffPtr { break } - kbar := v_1_0_0_1_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 { + tt4 := mem_0_2_2_0.Type + o4 := mem_0_2_2_0.AuxInt + p4 := mem_0_2_2_0.Args[0] + d3 := mem_0_2_2.Args[1] + mem_0_2_2_2 := mem_0_2_2.Args[2] + if mem_0_2_2_2.Op != OpZero || mem_0_2_2_2.AuxInt != n { break } - k := v_1_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || v_1_1.AuxInt != k || !(k > 0 && k < 15 && kbar == 16-k) { + t5 := mem_0_2_2_2.Aux + _ = mem_0_2_2_2.Args[1] + p5 := mem_0_2_2_2.Args[0] + if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && alignof(t5) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && n >= o2+sizeof(t2) && n >= o3+sizeof(t3) && n >= o4+sizeof(t4)) { break } - v.reset(OpEq16) - v0 := b.NewValue0(v.Pos, OpAnd16, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst16, t) - v1.AuxInt = int64(1< (Rsh16Ux64 (Rsh16x64 n (Const64 [15])) (Const64 [kbar])) n) (Const64 [k])) (Const64 [k]))) - // cond: k > 0 && k < 15 && kbar == 16 - k - // result: (Eq16 (And16 n (Const16 [int64(1< [0])) - for { - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpLsh16x64 { - break + v.AddArg(d1) + v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v1.Aux = t3 + v2 := b.NewValue0(v.Pos, OpOffPtr, tt3) + v2.AuxInt = o3 + v2.AddArg(dst) + v1.AddArg(v2) + v1.AddArg(d2) + v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v3.Aux = t4 + v4 := b.NewValue0(v.Pos, OpOffPtr, tt4) + v4.AuxInt = o4 + v4.AddArg(dst) + v3.AddArg(v4) + v3.AddArg(d3) + v5 := b.NewValue0(v.Pos, OpZero, types.TypeMem) + v5.AuxInt = n + v5.Aux = t1 + v5.AddArg(dst) + v5.AddArg(mem) + v3.AddArg(v5) + v1.AddArg(v3) + v.AddArg(v1) + return true + } + return false +} +func rewriteValuegeneric_OpMove_20(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (Move {t1} [n] dst p1 mem:(VarDef (Store {t2} (OffPtr [o2] p2) d1 (Store {t3} (OffPtr [o3] p3) d2 (Store {t4} (OffPtr [o4] p4) d3 (Store {t5} (OffPtr [o5] p5) d4 (Zero {t6} [n] p6 _))))))) + // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && isSamePtr(p5, p6) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && alignof(t5) <= alignof(t1) && alignof(t6) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && registerizable(b, t5) && n >= o2 + sizeof(t2) && n >= o3 + sizeof(t3) && n >= o4 + sizeof(t4) && n >= o5 + sizeof(t5) + // result: (Store {t2} (OffPtr [o2] dst) d1 (Store {t3} (OffPtr [o3] dst) d2 (Store {t4} (OffPtr [o4] dst) d3 (Store {t5} (OffPtr [o5] dst) d4 (Zero {t1} [n] dst mem))))) + for { + n := v.AuxInt + t1 := v.Aux + _ = v.Args[2] + dst := v.Args[0] + p1 := v.Args[1] + mem := v.Args[2] + if mem.Op != OpVarDef { + break } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpRsh16x64 { + mem_0 := mem.Args[0] + if mem_0.Op != OpStore { break } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAdd16 { + t2 := mem_0.Aux + _ = mem_0.Args[2] + mem_0_0 := mem_0.Args[0] + if mem_0_0.Op != OpOffPtr { break } - t := v_1_0_0.Type - _ = v_1_0_0.Args[1] - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpRsh16Ux64 || v_1_0_0_0.Type != t { + tt2 := mem_0_0.Type + o2 := mem_0_0.AuxInt + p2 := mem_0_0.Args[0] + d1 := mem_0.Args[1] + mem_0_2 := mem_0.Args[2] + if mem_0_2.Op != OpStore { break } - _ = v_1_0_0_0.Args[1] - v_1_0_0_0_0 := v_1_0_0_0.Args[0] - if v_1_0_0_0_0.Op != OpRsh16x64 || v_1_0_0_0_0.Type != t { + t3 := mem_0_2.Aux + _ = mem_0_2.Args[2] + mem_0_2_0 := mem_0_2.Args[0] + if mem_0_2_0.Op != OpOffPtr { break } - _ = v_1_0_0_0_0.Args[1] - if n != v_1_0_0_0_0.Args[0] { + tt3 := mem_0_2_0.Type + o3 := mem_0_2_0.AuxInt + p3 := mem_0_2_0.Args[0] + d2 := mem_0_2.Args[1] + mem_0_2_2 := mem_0_2.Args[2] + if mem_0_2_2.Op != OpStore { break } - v_1_0_0_0_0_1 := v_1_0_0_0_0.Args[1] - if v_1_0_0_0_0_1.Op != OpConst64 || v_1_0_0_0_0_1.Type != typ.UInt64 || v_1_0_0_0_0_1.AuxInt != 15 { + t4 := mem_0_2_2.Aux + _ = mem_0_2_2.Args[2] + mem_0_2_2_0 := mem_0_2_2.Args[0] + if mem_0_2_2_0.Op != OpOffPtr { break } - v_1_0_0_0_1 := v_1_0_0_0.Args[1] - if v_1_0_0_0_1.Op != OpConst64 || v_1_0_0_0_1.Type != typ.UInt64 { + tt4 := mem_0_2_2_0.Type + o4 := mem_0_2_2_0.AuxInt + p4 := mem_0_2_2_0.Args[0] + d3 := mem_0_2_2.Args[1] + mem_0_2_2_2 := mem_0_2_2.Args[2] + if mem_0_2_2_2.Op != OpStore { break } - kbar := v_1_0_0_0_1.AuxInt - if n != v_1_0_0.Args[1] { + t5 := mem_0_2_2_2.Aux + _ = mem_0_2_2_2.Args[2] + mem_0_2_2_2_0 := mem_0_2_2_2.Args[0] + if mem_0_2_2_2_0.Op != OpOffPtr { break } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 { + tt5 := mem_0_2_2_2_0.Type + o5 := mem_0_2_2_2_0.AuxInt + p5 := mem_0_2_2_2_0.Args[0] + d4 := mem_0_2_2_2.Args[1] + mem_0_2_2_2_2 := mem_0_2_2_2.Args[2] + if mem_0_2_2_2_2.Op != OpZero || mem_0_2_2_2_2.AuxInt != n { break } - k := v_1_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || v_1_1.AuxInt != k || !(k > 0 && k < 15 && kbar == 16-k) { + t6 := mem_0_2_2_2_2.Aux + _ = mem_0_2_2_2_2.Args[1] + p6 := mem_0_2_2_2_2.Args[0] + if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && isSamePtr(p5, p6) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && alignof(t5) <= alignof(t1) && alignof(t6) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && registerizable(b, t5) && n >= o2+sizeof(t2) && n >= o3+sizeof(t3) && n >= o4+sizeof(t4) && n >= o5+sizeof(t5)) { break } - v.reset(OpEq16) - v0 := b.NewValue0(v.Pos, OpAnd16, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst16, t) - v1.AuxInt = int64(1< n (Rsh16Ux64 (Rsh16x64 n (Const64 [15])) (Const64 [kbar]))) (Const64 [k])) (Const64 [k])) n) - // cond: k > 0 && k < 15 && kbar == 16 - k - // result: (Eq16 (And16 n (Const16 [int64(1< [0])) + // match: (Move {t1} [s] dst tmp1 midmem:(Move {t2} [s] tmp2 src _)) + // cond: t1.(*types.Type).Compare(t2.(*types.Type)) == types.CMPeq && isSamePtr(tmp1, tmp2) && isStackPtr(src) && disjoint(src, s, tmp2, s) && (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config)) + // result: (Move {t1} [s] dst src midmem) for { - n := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh16x64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh16x64 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAdd16 { - break - } - t := v_0_0_0.Type - _ = v_0_0_0.Args[1] - if n != v_0_0_0.Args[0] { - break - } - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpRsh16Ux64 || v_0_0_0_1.Type != t { - break - } - _ = v_0_0_0_1.Args[1] - v_0_0_0_1_0 := v_0_0_0_1.Args[0] - if v_0_0_0_1_0.Op != OpRsh16x64 || v_0_0_0_1_0.Type != t { - break - } - _ = v_0_0_0_1_0.Args[1] - if n != v_0_0_0_1_0.Args[0] { + s := v.AuxInt + t1 := v.Aux + _ = v.Args[2] + dst := v.Args[0] + tmp1 := v.Args[1] + midmem := v.Args[2] + if midmem.Op != OpMove || midmem.AuxInt != s { break } - v_0_0_0_1_0_1 := v_0_0_0_1_0.Args[1] - if v_0_0_0_1_0_1.Op != OpConst64 || v_0_0_0_1_0_1.Type != typ.UInt64 || v_0_0_0_1_0_1.AuxInt != 15 { + t2 := midmem.Aux + _ = midmem.Args[2] + tmp2 := midmem.Args[0] + src := midmem.Args[1] + if !(t1.(*types.Type).Compare(t2.(*types.Type)) == types.CMPeq && isSamePtr(tmp1, tmp2) && isStackPtr(src) && disjoint(src, s, tmp2, s) && (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config))) { break } - v_0_0_0_1_1 := v_0_0_0_1.Args[1] - if v_0_0_0_1_1.Op != OpConst64 || v_0_0_0_1_1.Type != typ.UInt64 { + v.reset(OpMove) + v.AuxInt = s + v.Aux = t1 + v.AddArg(dst) + v.AddArg(src) + v.AddArg(midmem) + return true + } + // match: (Move {t1} [s] dst tmp1 midmem:(VarDef (Move {t2} [s] tmp2 src _))) + // cond: t1.(*types.Type).Compare(t2.(*types.Type)) == types.CMPeq && isSamePtr(tmp1, tmp2) && isStackPtr(src) && disjoint(src, s, tmp2, s) && (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config)) + // result: (Move {t1} [s] dst src midmem) + for { + s := v.AuxInt + t1 := v.Aux + _ = v.Args[2] + dst := v.Args[0] + tmp1 := v.Args[1] + midmem := v.Args[2] + if midmem.Op != OpVarDef { break } - kbar := v_0_0_0_1_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 || v_0_0_1.Type != typ.UInt64 { + midmem_0 := midmem.Args[0] + if midmem_0.Op != OpMove || midmem_0.AuxInt != s { break } - k := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.Type != typ.UInt64 || v_0_1.AuxInt != k || !(k > 0 && k < 15 && kbar == 16-k) { + t2 := midmem_0.Aux + _ = midmem_0.Args[2] + tmp2 := midmem_0.Args[0] + src := midmem_0.Args[1] + if !(t1.(*types.Type).Compare(t2.(*types.Type)) == types.CMPeq && isSamePtr(tmp1, tmp2) && isStackPtr(src) && disjoint(src, s, tmp2, s) && (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config))) { break } - v.reset(OpEq16) - v0 := b.NewValue0(v.Pos, OpAnd16, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst16, t) - v1.AuxInt = int64(1< (Rsh16Ux64 (Rsh16x64 n (Const64 [15])) (Const64 [kbar])) n) (Const64 [k])) (Const64 [k])) n) - // cond: k > 0 && k < 15 && kbar == 16 - k - // result: (Eq16 (And16 n (Const16 [int64(1< [0])) + // match: (Move dst src mem) + // cond: isSamePtr(dst, src) + // result: mem for { - n := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh16x64 { + mem := v.Args[2] + dst := v.Args[0] + src := v.Args[1] + if !(isSamePtr(dst, src)) { break } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh16x64 { - break + v.reset(OpCopy) + v.Type = mem.Type + v.AddArg(mem) + return true + } + return false +} +func rewriteValuegeneric_OpMul16_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (Mul16 (Const16 [c]) (Const16 [d])) + // result: (Const16 [int64(int16(c*d))]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst16 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst16 { + continue + } + d := v_1.AuxInt + v.reset(OpConst16) + v.AuxInt = int64(int16(c * d)) + return true } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAdd16 { - break + break + } + // match: (Mul16 (Const16 [1]) x) + // result: x + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst16 || v_0.AuxInt != 1 { + continue + } + x := v.Args[1^_i0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - t := v_0_0_0.Type - _ = v_0_0_0.Args[1] - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpRsh16Ux64 || v_0_0_0_0.Type != t { - break - } - _ = v_0_0_0_0.Args[1] - v_0_0_0_0_0 := v_0_0_0_0.Args[0] - if v_0_0_0_0_0.Op != OpRsh16x64 || v_0_0_0_0_0.Type != t { - break - } - _ = v_0_0_0_0_0.Args[1] - if n != v_0_0_0_0_0.Args[0] { - break - } - v_0_0_0_0_0_1 := v_0_0_0_0_0.Args[1] - if v_0_0_0_0_0_1.Op != OpConst64 || v_0_0_0_0_0_1.Type != typ.UInt64 || v_0_0_0_0_0_1.AuxInt != 15 { - break - } - v_0_0_0_0_1 := v_0_0_0_0.Args[1] - if v_0_0_0_0_1.Op != OpConst64 || v_0_0_0_0_1.Type != typ.UInt64 { - break - } - kbar := v_0_0_0_0_1.AuxInt - if n != v_0_0_0.Args[1] { - break - } - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 || v_0_0_1.Type != typ.UInt64 { - break - } - k := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.Type != typ.UInt64 || v_0_1.AuxInt != k || !(k > 0 && k < 15 && kbar == 16-k) { - break - } - v.reset(OpEq16) - v0 := b.NewValue0(v.Pos, OpAnd16, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst16, t) - v1.AuxInt = int64(1< n (Const16 [c])) + // cond: isPowerOfTwo(c) + // result: (Lsh16x64 n (Const64 [log2(c)])) for { + t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 || v_0.AuxInt != 0 { - break - } - s := v.Args[1] - if s.Op != OpSub16 { - break - } - y := s.Args[1] - x := s.Args[0] - if !(s.Uses == 1) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + n := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst16 { + continue + } + c := v_1.AuxInt + if !(isPowerOfTwo(c)) { + continue + } + v.reset(OpLsh16x64) + v.Type = t + v.AddArg(n) + v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v0.AuxInt = log2(c) + v.AddArg(v0) + return true } - v.reset(OpEq16) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (Eq16 (And16 x (Const16 [y])) (Const16 [y])) - // cond: isPowerOfTwo(y) - // result: (Neq16 (And16 x (Const16 [y])) (Const16 [0])) + // match: (Mul16 n (Const16 [c])) + // cond: t.IsSigned() && isPowerOfTwo(-c) + // result: (Neg16 (Lsh16x64 n (Const64 [log2(-c)]))) for { + t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd16 { - break - } - t := v_0.Type - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst16 || v_0_1.Type != t { - break - } - y := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.Type != t || v_1.AuxInt != y || !(isPowerOfTwo(y)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + n := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst16 { + continue + } + c := v_1.AuxInt + if !(t.IsSigned() && isPowerOfTwo(-c)) { + continue + } + v.reset(OpNeg16) + v0 := b.NewValue0(v.Pos, OpLsh16x64, t) + v0.AddArg(n) + v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v1.AuxInt = log2(-c) + v0.AddArg(v1) + v.AddArg(v0) + return true } - v.reset(OpNeq16) - v0 := b.NewValue0(v.Pos, OpAnd16, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst16, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst16, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true + break } - // match: (Eq16 (And16 (Const16 [y]) x) (Const16 [y])) - // cond: isPowerOfTwo(y) - // result: (Neq16 (And16 x (Const16 [y])) (Const16 [0])) + // match: (Mul16 (Const16 [0]) _) + // result: (Const16 [0]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd16 { - break - } - t := v_0.Type - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst16 || v_0_0.Type != t { - break - } - y := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.Type != t || v_1.AuxInt != y || !(isPowerOfTwo(y)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst16 || v_0.AuxInt != 0 { + continue + } + v.reset(OpConst16) + v.AuxInt = 0 + return true } - v.reset(OpNeq16) - v0 := b.NewValue0(v.Pos, OpAnd16, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst16, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst16, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true + break } - // match: (Eq16 (Const16 [y]) (And16 x (Const16 [y]))) - // cond: isPowerOfTwo(y) - // result: (Neq16 (And16 x (Const16 [y])) (Const16 [0])) + // match: (Mul16 (Const16 [c]) (Mul16 (Const16 [d]) x)) + // result: (Mul16 (Const16 [int64(int16(c*d))]) x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - t := v_0.Type - y := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAnd16 || v_1.Type != t { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst16 || v_1_1.Type != t || v_1_1.AuxInt != y || !(isPowerOfTwo(y)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst16 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpMul16 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst16 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpMul16) + v0 := b.NewValue0(v.Pos, OpConst16, t) + v0.AuxInt = int64(int16(c * d)) + v.AddArg(v0) + v.AddArg(x) + return true + } } - v.reset(OpNeq16) - v0 := b.NewValue0(v.Pos, OpAnd16, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst16, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst16, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true + break } return false } -func rewriteValuegeneric_OpEq16_60(v *Value) bool { +func rewriteValuegeneric_OpMul32_0(v *Value) bool { b := v.Block - // match: (Eq16 (Const16 [y]) (And16 (Const16 [y]) x)) - // cond: isPowerOfTwo(y) - // result: (Neq16 (And16 x (Const16 [y])) (Const16 [0])) + typ := &b.Func.Config.Types + // match: (Mul32 (Const32 [c]) (Const32 [d])) + // result: (Const32 [int64(int32(c*d))]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - t := v_0.Type - y := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAnd16 || v_1.Type != t { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst16 || v_1_0.Type != t || v_1_0.AuxInt != y || !(isPowerOfTwo(y)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst32 { + continue + } + d := v_1.AuxInt + v.reset(OpConst32) + v.AuxInt = int64(int32(c * d)) + return true } - v.reset(OpNeq16) - v0 := b.NewValue0(v.Pos, OpAnd16, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst16, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst16, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true + break } - return false -} -func rewriteValuegeneric_OpEq32_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Eq32 x x) - // result: (ConstBool [1]) + // match: (Mul32 (Const32 [1]) x) + // result: x for { - x := v.Args[1] - if x != v.Args[0] { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 || v_0.AuxInt != 1 { + continue + } + x := v.Args[1^_i0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - v.reset(OpConstBool) - v.AuxInt = 1 - return true + break } - // match: (Eq32 (Const32 [c]) (Add32 (Const32 [d]) x)) - // result: (Eq32 (Const32 [int64(int32(c-d))]) x) + // match: (Mul32 (Const32 [-1]) x) + // result: (Neg32 x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAdd32 { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 || v_1_0.Type != t { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 || v_0.AuxInt != -1 { + continue + } + x := v.Args[1^_i0] + v.reset(OpNeg32) + v.AddArg(x) + return true } - d := v_1_0.AuxInt - v.reset(OpEq32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c - d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (Eq32 (Const32 [c]) (Add32 x (Const32 [d]))) - // result: (Eq32 (Const32 [int64(int32(c-d))]) x) + // match: (Mul32 n (Const32 [c])) + // cond: isPowerOfTwo(c) + // result: (Lsh32x64 n (Const64 [log2(c)])) for { + t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + n := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst32 { + continue + } + c := v_1.AuxInt + if !(isPowerOfTwo(c)) { + continue + } + v.reset(OpLsh32x64) + v.Type = t + v.AddArg(n) + v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v0.AuxInt = log2(c) + v.AddArg(v0) + return true } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAdd32 { - break + break + } + // match: (Mul32 n (Const32 [c])) + // cond: t.IsSigned() && isPowerOfTwo(-c) + // result: (Neg32 (Lsh32x64 n (Const64 [log2(-c)]))) + for { + t := v.Type + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + n := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst32 { + continue + } + c := v_1.AuxInt + if !(t.IsSigned() && isPowerOfTwo(-c)) { + continue + } + v.reset(OpNeg32) + v0 := b.NewValue0(v.Pos, OpLsh32x64, t) + v0.AddArg(n) + v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v1.AuxInt = log2(-c) + v0.AddArg(v1) + v.AddArg(v0) + return true } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 || v_1_1.Type != t { - break - } - d := v_1_1.AuxInt - v.reset(OpEq32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c - d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (Eq32 (Add32 (Const32 [d]) x) (Const32 [c])) - // result: (Eq32 (Const32 [int64(int32(c-d))]) x) + // match: (Mul32 (Const32 [c]) (Add32 (Const32 [d]) x)) + // result: (Add32 (Const32 [int64(int32(c*d))]) (Mul32 (Const32 [c]) x)) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd32 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break - } - t := v_0_0.Type - d := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.Type != t { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpAdd32 || v_1.Type != t { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst32 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpAdd32) + v0 := b.NewValue0(v.Pos, OpConst32, t) + v0.AuxInt = int64(int32(c * d)) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpMul32, t) + v2 := b.NewValue0(v.Pos, OpConst32, t) + v2.AuxInt = c + v1.AddArg(v2) + v1.AddArg(x) + v.AddArg(v1) + return true + } } - c := v_1.AuxInt - v.reset(OpEq32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c - d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (Eq32 (Add32 x (Const32 [d])) (Const32 [c])) - // result: (Eq32 (Const32 [int64(int32(c-d))]) x) + // match: (Mul32 (Const32 [0]) _) + // result: (Const32 [0]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd32 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { - break - } - t := v_0_1.Type - d := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.Type != t { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 || v_0.AuxInt != 0 { + continue + } + v.reset(OpConst32) + v.AuxInt = 0 + return true } - c := v_1.AuxInt - v.reset(OpEq32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c - d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (Eq32 (Const32 [c]) (Const32 [d])) - // result: (ConstBool [b2i(c == d)]) + // match: (Mul32 (Const32 [c]) (Mul32 (Const32 [d]) x)) + // result: (Mul32 (Const32 [int64(int32(c*d))]) x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpMul32 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst32 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpMul32) + v0 := b.NewValue0(v.Pos, OpConst32, t) + v0.AuxInt = int64(int32(c * d)) + v.AddArg(v0) + v.AddArg(x) + return true + } } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c == d) - return true + break } - // match: (Eq32 (Const32 [d]) (Const32 [c])) - // result: (ConstBool [b2i(c == d)]) + return false +} +func rewriteValuegeneric_OpMul32F_0(v *Value) bool { + // match: (Mul32F (Const32F [c]) (Const32F [d])) + // result: (Const32F [auxFrom32F(auxTo32F(c) * auxTo32F(d))]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32F { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst32F { + continue + } + d := v_1.AuxInt + v.reset(OpConst32F) + v.AuxInt = auxFrom32F(auxTo32F(c) * auxTo32F(d)) + return true } - c := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c == d) - return true + break } - // match: (Eq32 x (Mul32 (Const32 [c]) (Rsh32Ux64 mul:(Hmul32u (Const32 [m]) x) (Const64 [s])))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+umagic(32,c).m/2)) && s == umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) + // match: (Mul32F x (Const32F [auxFrom64F(1)])) + // result: x for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpRsh32Ux64 { - break - } - _ = v_1_1.Args[1] - mul := v_1_1.Args[0] - if mul.Op != OpHmul32u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpConst64 { - break - } - s := v_1_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+umagic(32, c).m/2)) && s == umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst32F || v_1.AuxInt != auxFrom64F(1) { + continue + } + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true + break } - // match: (Eq32 x (Mul32 (Const32 [c]) (Rsh32Ux64 mul:(Hmul32u x (Const32 [m])) (Const64 [s])))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+umagic(32,c).m/2)) && s == umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) + // match: (Mul32F x (Const32F [auxFrom32F(-1)])) + // result: (Neg32F x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpRsh32Ux64 { - break - } - _ = v_1_1.Args[1] - mul := v_1_1.Args[0] - if mul.Op != OpHmul32u { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { - break - } - m := mul_1.AuxInt - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpConst64 { - break - } - s := v_1_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+umagic(32, c).m/2)) && s == umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst32F || v_1.AuxInt != auxFrom32F(-1) { + continue + } + v.reset(OpNeg32F) + v.AddArg(x) + return true } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true + break } - // match: (Eq32 x (Mul32 (Rsh32Ux64 mul:(Hmul32u (Const32 [m]) x) (Const64 [s])) (Const32 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+umagic(32,c).m/2)) && s == umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) + // match: (Mul32F x (Const32F [auxFrom32F(2)])) + // result: (Add32F x x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpRsh32Ux64 { - break - } - _ = v_1_0.Args[1] - mul := v_1_0.Args[0] - if mul.Op != OpHmul32u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpConst64 { - break - } - s := v_1_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+umagic(32, c).m/2)) && s == umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst32F || v_1.AuxInt != auxFrom32F(2) { + continue + } + v.reset(OpAdd32F) + v.AddArg(x) + v.AddArg(x) + return true } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true + break } return false } -func rewriteValuegeneric_OpEq32_10(v *Value) bool { +func rewriteValuegeneric_OpMul64_0(v *Value) bool { b := v.Block typ := &b.Func.Config.Types - // match: (Eq32 x (Mul32 (Rsh32Ux64 mul:(Hmul32u x (Const32 [m])) (Const64 [s])) (Const32 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+umagic(32,c).m/2)) && s == umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) + // match: (Mul64 (Const64 [c]) (Const64 [d])) + // result: (Const64 [c*d]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpRsh32Ux64 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst64 { + continue + } + d := v_1.AuxInt + v.reset(OpConst64) + v.AuxInt = c * d + return true } - _ = v_1_0.Args[1] - mul := v_1_0.Args[0] - if mul.Op != OpHmul32u { - break + break + } + // match: (Mul64 (Const64 [1]) x) + // result: x + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 || v_0.AuxInt != 1 { + continue + } + x := v.Args[1^_i0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - _ = mul.Args[1] - if x != mul.Args[0] { - break + break + } + // match: (Mul64 (Const64 [-1]) x) + // result: (Neg64 x) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 || v_0.AuxInt != -1 { + continue + } + x := v.Args[1^_i0] + v.reset(OpNeg64) + v.AddArg(x) + return true } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { - break + break + } + // match: (Mul64 n (Const64 [c])) + // cond: isPowerOfTwo(c) + // result: (Lsh64x64 n (Const64 [log2(c)])) + for { + t := v.Type + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + n := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst64 { + continue + } + c := v_1.AuxInt + if !(isPowerOfTwo(c)) { + continue + } + v.reset(OpLsh64x64) + v.Type = t + v.AddArg(n) + v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v0.AuxInt = log2(c) + v.AddArg(v0) + return true } - m := mul_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpConst64 { - break - } - s := v_1_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+umagic(32, c).m/2)) && s == umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 (Mul32 (Const32 [c]) (Rsh32Ux64 mul:(Hmul32u (Const32 [m]) x) (Const64 [s]))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+umagic(32,c).m/2)) && s == umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpRsh32Ux64 { - break - } - _ = v_0_1.Args[1] - mul := v_0_1.Args[0] - if mul.Op != OpHmul32u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpConst64 { - break - } - s := v_0_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+umagic(32, c).m/2)) && s == umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 (Mul32 (Const32 [c]) (Rsh32Ux64 mul:(Hmul32u x (Const32 [m])) (Const64 [s]))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+umagic(32,c).m/2)) && s == umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpRsh32Ux64 { - break - } - _ = v_0_1.Args[1] - mul := v_0_1.Args[0] - if mul.Op != OpHmul32u { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { - break - } - m := mul_1.AuxInt - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpConst64 { - break - } - s := v_0_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+umagic(32, c).m/2)) && s == umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 (Mul32 (Rsh32Ux64 mul:(Hmul32u (Const32 [m]) x) (Const64 [s])) (Const32 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+umagic(32,c).m/2)) && s == umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh32Ux64 { - break - } - _ = v_0_0.Args[1] - mul := v_0_0.Args[0] - if mul.Op != OpHmul32u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+umagic(32, c).m/2)) && s == umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 (Mul32 (Rsh32Ux64 mul:(Hmul32u x (Const32 [m])) (Const64 [s])) (Const32 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+umagic(32,c).m/2)) && s == umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh32Ux64 { - break - } - _ = v_0_0.Args[1] - mul := v_0_0.Args[0] - if mul.Op != OpHmul32u { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { - break - } - m := mul_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+umagic(32, c).m/2)) && s == umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 x (Mul32 (Const32 [c]) (Rsh32Ux64 mul:(Hmul32u (Const32 [m]) (Rsh32Ux64 x (Const64 [1]))) (Const64 [s])))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+(umagic(32,c).m+1)/2)) && s == umagic(32,c).s-2 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpRsh32Ux64 { - break - } - _ = v_1_1.Args[1] - mul := v_1_1.Args[0] - if mul.Op != OpHmul32u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 || mul_0.Type != typ.UInt32 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpRsh32Ux64 { - break - } - _ = mul_1.Args[1] - if x != mul_1.Args[0] { - break - } - mul_1_1 := mul_1.Args[1] - if mul_1_1.Op != OpConst64 || mul_1_1.AuxInt != 1 { - break - } - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpConst64 { - break - } - s := v_1_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+(umagic(32, c).m+1)/2)) && s == umagic(32, c).s-2 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 x (Mul32 (Const32 [c]) (Rsh32Ux64 mul:(Hmul32u (Rsh32Ux64 x (Const64 [1])) (Const32 [m])) (Const64 [s])))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+(umagic(32,c).m+1)/2)) && s == umagic(32,c).s-2 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpRsh32Ux64 { - break - } - _ = v_1_1.Args[1] - mul := v_1_1.Args[0] - if mul.Op != OpHmul32u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpRsh32Ux64 { - break - } - _ = mul_0.Args[1] - if x != mul_0.Args[0] { - break - } - mul_0_1 := mul_0.Args[1] - if mul_0_1.Op != OpConst64 || mul_0_1.AuxInt != 1 { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 || mul_1.Type != typ.UInt32 { - break - } - m := mul_1.AuxInt - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpConst64 { - break - } - s := v_1_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+(umagic(32, c).m+1)/2)) && s == umagic(32, c).s-2 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 x (Mul32 (Rsh32Ux64 mul:(Hmul32u (Const32 [m]) (Rsh32Ux64 x (Const64 [1]))) (Const64 [s])) (Const32 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+(umagic(32,c).m+1)/2)) && s == umagic(32,c).s-2 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpRsh32Ux64 { - break - } - _ = v_1_0.Args[1] - mul := v_1_0.Args[0] - if mul.Op != OpHmul32u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 || mul_0.Type != typ.UInt32 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpRsh32Ux64 { - break - } - _ = mul_1.Args[1] - if x != mul_1.Args[0] { - break - } - mul_1_1 := mul_1.Args[1] - if mul_1_1.Op != OpConst64 || mul_1_1.AuxInt != 1 { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpConst64 { - break - } - s := v_1_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+(umagic(32, c).m+1)/2)) && s == umagic(32, c).s-2 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 x (Mul32 (Rsh32Ux64 mul:(Hmul32u (Rsh32Ux64 x (Const64 [1])) (Const32 [m])) (Const64 [s])) (Const32 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+(umagic(32,c).m+1)/2)) && s == umagic(32,c).s-2 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpRsh32Ux64 { - break - } - _ = v_1_0.Args[1] - mul := v_1_0.Args[0] - if mul.Op != OpHmul32u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpRsh32Ux64 { - break - } - _ = mul_0.Args[1] - if x != mul_0.Args[0] { - break - } - mul_0_1 := mul_0.Args[1] - if mul_0_1.Op != OpConst64 || mul_0_1.AuxInt != 1 { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 || mul_1.Type != typ.UInt32 { - break - } - m := mul_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpConst64 { - break - } - s := v_1_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+(umagic(32, c).m+1)/2)) && s == umagic(32, c).s-2 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 (Mul32 (Const32 [c]) (Rsh32Ux64 mul:(Hmul32u (Const32 [m]) (Rsh32Ux64 x (Const64 [1]))) (Const64 [s]))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+(umagic(32,c).m+1)/2)) && s == umagic(32,c).s-2 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpRsh32Ux64 { - break - } - _ = v_0_1.Args[1] - mul := v_0_1.Args[0] - if mul.Op != OpHmul32u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 || mul_0.Type != typ.UInt32 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpRsh32Ux64 { - break - } - _ = mul_1.Args[1] - if x != mul_1.Args[0] { - break - } - mul_1_1 := mul_1.Args[1] - if mul_1_1.Op != OpConst64 || mul_1_1.AuxInt != 1 { - break - } - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpConst64 { - break - } - s := v_0_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+(umagic(32, c).m+1)/2)) && s == umagic(32, c).s-2 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - return false -} -func rewriteValuegeneric_OpEq32_20(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Eq32 (Mul32 (Const32 [c]) (Rsh32Ux64 mul:(Hmul32u (Rsh32Ux64 x (Const64 [1])) (Const32 [m])) (Const64 [s]))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+(umagic(32,c).m+1)/2)) && s == umagic(32,c).s-2 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpRsh32Ux64 { - break - } - _ = v_0_1.Args[1] - mul := v_0_1.Args[0] - if mul.Op != OpHmul32u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpRsh32Ux64 { - break - } - _ = mul_0.Args[1] - if x != mul_0.Args[0] { - break - } - mul_0_1 := mul_0.Args[1] - if mul_0_1.Op != OpConst64 || mul_0_1.AuxInt != 1 { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 || mul_1.Type != typ.UInt32 { - break - } - m := mul_1.AuxInt - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpConst64 { - break - } - s := v_0_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+(umagic(32, c).m+1)/2)) && s == umagic(32, c).s-2 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 (Mul32 (Rsh32Ux64 mul:(Hmul32u (Const32 [m]) (Rsh32Ux64 x (Const64 [1]))) (Const64 [s])) (Const32 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+(umagic(32,c).m+1)/2)) && s == umagic(32,c).s-2 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh32Ux64 { - break - } - _ = v_0_0.Args[1] - mul := v_0_0.Args[0] - if mul.Op != OpHmul32u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 || mul_0.Type != typ.UInt32 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpRsh32Ux64 { - break - } - _ = mul_1.Args[1] - if x != mul_1.Args[0] { - break - } - mul_1_1 := mul_1.Args[1] - if mul_1_1.Op != OpConst64 || mul_1_1.AuxInt != 1 { - break - } - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+(umagic(32, c).m+1)/2)) && s == umagic(32, c).s-2 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 (Mul32 (Rsh32Ux64 mul:(Hmul32u (Rsh32Ux64 x (Const64 [1])) (Const32 [m])) (Const64 [s])) (Const32 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+(umagic(32,c).m+1)/2)) && s == umagic(32,c).s-2 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh32Ux64 { - break - } - _ = v_0_0.Args[1] - mul := v_0_0.Args[0] - if mul.Op != OpHmul32u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpRsh32Ux64 { - break - } - _ = mul_0.Args[1] - if x != mul_0.Args[0] { - break - } - mul_0_1 := mul_0.Args[1] - if mul_0_1.Op != OpConst64 || mul_0_1.AuxInt != 1 { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 || mul_1.Type != typ.UInt32 { - break - } - m := mul_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(1<<31+(umagic(32, c).m+1)/2)) && s == umagic(32, c).s-2 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 x (Mul32 (Const32 [c]) (Rsh32Ux64 (Avg32u x mul:(Hmul32u (Const32 [m]) x)) (Const64 [s])))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(umagic(32,c).m)) && s == umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpRsh32Ux64 { - break - } - _ = v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAvg32u { - break - } - _ = v_1_1_0.Args[1] - if x != v_1_1_0.Args[0] { - break - } - mul := v_1_1_0.Args[1] - if mul.Op != OpHmul32u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpConst64 { - break - } - s := v_1_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(umagic(32, c).m)) && s == umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 x (Mul32 (Const32 [c]) (Rsh32Ux64 (Avg32u x mul:(Hmul32u x (Const32 [m]))) (Const64 [s])))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(umagic(32,c).m)) && s == umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpRsh32Ux64 { - break - } - _ = v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAvg32u { - break - } - _ = v_1_1_0.Args[1] - if x != v_1_1_0.Args[0] { - break - } - mul := v_1_1_0.Args[1] - if mul.Op != OpHmul32u { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { - break - } - m := mul_1.AuxInt - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpConst64 { - break - } - s := v_1_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(umagic(32, c).m)) && s == umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 x (Mul32 (Rsh32Ux64 (Avg32u x mul:(Hmul32u (Const32 [m]) x)) (Const64 [s])) (Const32 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(umagic(32,c).m)) && s == umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpRsh32Ux64 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAvg32u { - break - } - _ = v_1_0_0.Args[1] - if x != v_1_0_0.Args[0] { - break - } - mul := v_1_0_0.Args[1] - if mul.Op != OpHmul32u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpConst64 { - break - } - s := v_1_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(umagic(32, c).m)) && s == umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 x (Mul32 (Rsh32Ux64 (Avg32u x mul:(Hmul32u x (Const32 [m]))) (Const64 [s])) (Const32 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(umagic(32,c).m)) && s == umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpRsh32Ux64 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAvg32u { - break - } - _ = v_1_0_0.Args[1] - if x != v_1_0_0.Args[0] { - break - } - mul := v_1_0_0.Args[1] - if mul.Op != OpHmul32u { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { - break - } - m := mul_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpConst64 { - break - } - s := v_1_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(umagic(32, c).m)) && s == umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 (Mul32 (Const32 [c]) (Rsh32Ux64 (Avg32u x mul:(Hmul32u (Const32 [m]) x)) (Const64 [s]))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(umagic(32,c).m)) && s == umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpRsh32Ux64 { - break - } - _ = v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpAvg32u { - break - } - _ = v_0_1_0.Args[1] - if x != v_0_1_0.Args[0] { - break - } - mul := v_0_1_0.Args[1] - if mul.Op != OpHmul32u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpConst64 { - break - } - s := v_0_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(umagic(32, c).m)) && s == umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 (Mul32 (Const32 [c]) (Rsh32Ux64 (Avg32u x mul:(Hmul32u x (Const32 [m]))) (Const64 [s]))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(umagic(32,c).m)) && s == umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpRsh32Ux64 { - break - } - _ = v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpAvg32u { - break - } - _ = v_0_1_0.Args[1] - if x != v_0_1_0.Args[0] { - break - } - mul := v_0_1_0.Args[1] - if mul.Op != OpHmul32u { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { - break - } - m := mul_1.AuxInt - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpConst64 { - break - } - s := v_0_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(umagic(32, c).m)) && s == umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 (Mul32 (Rsh32Ux64 (Avg32u x mul:(Hmul32u (Const32 [m]) x)) (Const64 [s])) (Const32 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(umagic(32,c).m)) && s == umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh32Ux64 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAvg32u { - break - } - _ = v_0_0_0.Args[1] - if x != v_0_0_0.Args[0] { - break - } - mul := v_0_0_0.Args[1] - if mul.Op != OpHmul32u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(umagic(32, c).m)) && s == umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - return false -} -func rewriteValuegeneric_OpEq32_30(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Eq32 (Mul32 (Rsh32Ux64 (Avg32u x mul:(Hmul32u x (Const32 [m]))) (Const64 [s])) (Const32 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(umagic(32,c).m)) && s == umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh32Ux64 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAvg32u { - break - } - _ = v_0_0_0.Args[1] - if x != v_0_0_0.Args[0] { - break - } - mul := v_0_0_0.Args[1] - if mul.Op != OpHmul32u { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { - break - } - m := mul_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(umagic(32, c).m)) && s == umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 x (Mul32 (Const32 [c]) (Trunc64to32 (Rsh64Ux64 mul:(Mul64 (Const64 [m]) (ZeroExt32to64 x)) (Const64 [s]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+umagic(32,c).m/2) && s == 32+umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpTrunc64to32 { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh64Ux64 { - break - } - _ = v_1_1_0.Args[1] - mul := v_1_1_0.Args[0] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpZeroExt32to64 || x != mul_1.Args[0] { - break - } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { - break - } - s := v_1_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+umagic(32, c).m/2) && s == 32+umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 x (Mul32 (Const32 [c]) (Trunc64to32 (Rsh64Ux64 mul:(Mul64 (ZeroExt32to64 x) (Const64 [m])) (Const64 [s]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+umagic(32,c).m/2) && s == 32+umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpTrunc64to32 { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh64Ux64 { - break - } - _ = v_1_1_0.Args[1] - mul := v_1_1_0.Args[0] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpZeroExt32to64 || x != mul_0.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { - break - } - s := v_1_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+umagic(32, c).m/2) && s == 32+umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 x (Mul32 (Trunc64to32 (Rsh64Ux64 mul:(Mul64 (Const64 [m]) (ZeroExt32to64 x)) (Const64 [s]))) (Const32 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+umagic(32,c).m/2) && s == 32+umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpTrunc64to32 { - break - } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh64Ux64 { - break - } - _ = v_1_0_0.Args[1] - mul := v_1_0_0.Args[0] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpZeroExt32to64 || x != mul_1.Args[0] { - break - } - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { - break - } - s := v_1_0_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+umagic(32, c).m/2) && s == 32+umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 x (Mul32 (Trunc64to32 (Rsh64Ux64 mul:(Mul64 (ZeroExt32to64 x) (Const64 [m])) (Const64 [s]))) (Const32 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+umagic(32,c).m/2) && s == 32+umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpTrunc64to32 { - break - } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh64Ux64 { - break - } - _ = v_1_0_0.Args[1] - mul := v_1_0_0.Args[0] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpZeroExt32to64 || x != mul_0.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { - break - } - s := v_1_0_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+umagic(32, c).m/2) && s == 32+umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 (Mul32 (Const32 [c]) (Trunc64to32 (Rsh64Ux64 mul:(Mul64 (Const64 [m]) (ZeroExt32to64 x)) (Const64 [s])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+umagic(32,c).m/2) && s == 32+umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpTrunc64to32 { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh64Ux64 { - break - } - _ = v_0_1_0.Args[1] - mul := v_0_1_0.Args[0] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpZeroExt32to64 || x != mul_1.Args[0] { - break - } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { - break - } - s := v_0_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+umagic(32, c).m/2) && s == 32+umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 (Mul32 (Const32 [c]) (Trunc64to32 (Rsh64Ux64 mul:(Mul64 (ZeroExt32to64 x) (Const64 [m])) (Const64 [s])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+umagic(32,c).m/2) && s == 32+umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpTrunc64to32 { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh64Ux64 { - break - } - _ = v_0_1_0.Args[1] - mul := v_0_1_0.Args[0] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpZeroExt32to64 || x != mul_0.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { - break - } - s := v_0_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+umagic(32, c).m/2) && s == 32+umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 (Mul32 (Trunc64to32 (Rsh64Ux64 mul:(Mul64 (Const64 [m]) (ZeroExt32to64 x)) (Const64 [s]))) (Const32 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+umagic(32,c).m/2) && s == 32+umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpTrunc64to32 { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh64Ux64 { - break - } - _ = v_0_0_0.Args[1] - mul := v_0_0_0.Args[0] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpZeroExt32to64 || x != mul_1.Args[0] { - break - } - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+umagic(32, c).m/2) && s == 32+umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 (Mul32 (Trunc64to32 (Rsh64Ux64 mul:(Mul64 (ZeroExt32to64 x) (Const64 [m])) (Const64 [s]))) (Const32 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+umagic(32,c).m/2) && s == 32+umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpTrunc64to32 { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh64Ux64 { - break - } - _ = v_0_0_0.Args[1] - mul := v_0_0_0.Args[0] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpZeroExt32to64 || x != mul_0.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+umagic(32, c).m/2) && s == 32+umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 x (Mul32 (Const32 [c]) (Trunc64to32 (Rsh64Ux64 mul:(Mul64 (Const64 [m]) (Rsh64Ux64 (ZeroExt32to64 x) (Const64 [1]))) (Const64 [s]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+(umagic(32,c).m+1)/2) && s == 32+umagic(32,c).s-2 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpTrunc64to32 { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh64Ux64 { - break - } - _ = v_1_1_0.Args[1] - mul := v_1_1_0.Args[0] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpRsh64Ux64 { - break - } - _ = mul_1.Args[1] - mul_1_0 := mul_1.Args[0] - if mul_1_0.Op != OpZeroExt32to64 || x != mul_1_0.Args[0] { - break - } - mul_1_1 := mul_1.Args[1] - if mul_1_1.Op != OpConst64 || mul_1_1.AuxInt != 1 { - break - } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { - break - } - s := v_1_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+(umagic(32, c).m+1)/2) && s == 32+umagic(32, c).s-2 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - return false -} -func rewriteValuegeneric_OpEq32_40(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Eq32 x (Mul32 (Const32 [c]) (Trunc64to32 (Rsh64Ux64 mul:(Mul64 (Rsh64Ux64 (ZeroExt32to64 x) (Const64 [1])) (Const64 [m])) (Const64 [s]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+(umagic(32,c).m+1)/2) && s == 32+umagic(32,c).s-2 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpTrunc64to32 { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh64Ux64 { - break - } - _ = v_1_1_0.Args[1] - mul := v_1_1_0.Args[0] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpRsh64Ux64 { - break - } - _ = mul_0.Args[1] - mul_0_0 := mul_0.Args[0] - if mul_0_0.Op != OpZeroExt32to64 || x != mul_0_0.Args[0] { - break - } - mul_0_1 := mul_0.Args[1] - if mul_0_1.Op != OpConst64 || mul_0_1.AuxInt != 1 { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { - break - } - s := v_1_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+(umagic(32, c).m+1)/2) && s == 32+umagic(32, c).s-2 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 x (Mul32 (Trunc64to32 (Rsh64Ux64 mul:(Mul64 (Const64 [m]) (Rsh64Ux64 (ZeroExt32to64 x) (Const64 [1]))) (Const64 [s]))) (Const32 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+(umagic(32,c).m+1)/2) && s == 32+umagic(32,c).s-2 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpTrunc64to32 { - break - } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh64Ux64 { - break - } - _ = v_1_0_0.Args[1] - mul := v_1_0_0.Args[0] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpRsh64Ux64 { - break - } - _ = mul_1.Args[1] - mul_1_0 := mul_1.Args[0] - if mul_1_0.Op != OpZeroExt32to64 || x != mul_1_0.Args[0] { - break - } - mul_1_1 := mul_1.Args[1] - if mul_1_1.Op != OpConst64 || mul_1_1.AuxInt != 1 { - break - } - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { - break - } - s := v_1_0_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+(umagic(32, c).m+1)/2) && s == 32+umagic(32, c).s-2 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 x (Mul32 (Trunc64to32 (Rsh64Ux64 mul:(Mul64 (Rsh64Ux64 (ZeroExt32to64 x) (Const64 [1])) (Const64 [m])) (Const64 [s]))) (Const32 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+(umagic(32,c).m+1)/2) && s == 32+umagic(32,c).s-2 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpTrunc64to32 { - break - } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh64Ux64 { - break - } - _ = v_1_0_0.Args[1] - mul := v_1_0_0.Args[0] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpRsh64Ux64 { - break - } - _ = mul_0.Args[1] - mul_0_0 := mul_0.Args[0] - if mul_0_0.Op != OpZeroExt32to64 || x != mul_0_0.Args[0] { - break - } - mul_0_1 := mul_0.Args[1] - if mul_0_1.Op != OpConst64 || mul_0_1.AuxInt != 1 { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { - break - } - s := v_1_0_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+(umagic(32, c).m+1)/2) && s == 32+umagic(32, c).s-2 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 (Mul32 (Const32 [c]) (Trunc64to32 (Rsh64Ux64 mul:(Mul64 (Const64 [m]) (Rsh64Ux64 (ZeroExt32to64 x) (Const64 [1]))) (Const64 [s])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+(umagic(32,c).m+1)/2) && s == 32+umagic(32,c).s-2 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpTrunc64to32 { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh64Ux64 { - break - } - _ = v_0_1_0.Args[1] - mul := v_0_1_0.Args[0] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpRsh64Ux64 { - break - } - _ = mul_1.Args[1] - mul_1_0 := mul_1.Args[0] - if mul_1_0.Op != OpZeroExt32to64 || x != mul_1_0.Args[0] { - break - } - mul_1_1 := mul_1.Args[1] - if mul_1_1.Op != OpConst64 || mul_1_1.AuxInt != 1 { - break - } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { - break - } - s := v_0_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+(umagic(32, c).m+1)/2) && s == 32+umagic(32, c).s-2 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 (Mul32 (Const32 [c]) (Trunc64to32 (Rsh64Ux64 mul:(Mul64 (Rsh64Ux64 (ZeroExt32to64 x) (Const64 [1])) (Const64 [m])) (Const64 [s])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+(umagic(32,c).m+1)/2) && s == 32+umagic(32,c).s-2 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpTrunc64to32 { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh64Ux64 { - break - } - _ = v_0_1_0.Args[1] - mul := v_0_1_0.Args[0] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpRsh64Ux64 { - break - } - _ = mul_0.Args[1] - mul_0_0 := mul_0.Args[0] - if mul_0_0.Op != OpZeroExt32to64 || x != mul_0_0.Args[0] { - break - } - mul_0_1 := mul_0.Args[1] - if mul_0_1.Op != OpConst64 || mul_0_1.AuxInt != 1 { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { - break - } - s := v_0_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+(umagic(32, c).m+1)/2) && s == 32+umagic(32, c).s-2 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 (Mul32 (Trunc64to32 (Rsh64Ux64 mul:(Mul64 (Const64 [m]) (Rsh64Ux64 (ZeroExt32to64 x) (Const64 [1]))) (Const64 [s]))) (Const32 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+(umagic(32,c).m+1)/2) && s == 32+umagic(32,c).s-2 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpTrunc64to32 { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh64Ux64 { - break - } - _ = v_0_0_0.Args[1] - mul := v_0_0_0.Args[0] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpRsh64Ux64 { - break - } - _ = mul_1.Args[1] - mul_1_0 := mul_1.Args[0] - if mul_1_0.Op != OpZeroExt32to64 || x != mul_1_0.Args[0] { - break - } - mul_1_1 := mul_1.Args[1] - if mul_1_1.Op != OpConst64 || mul_1_1.AuxInt != 1 { - break - } - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+(umagic(32, c).m+1)/2) && s == 32+umagic(32, c).s-2 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 (Mul32 (Trunc64to32 (Rsh64Ux64 mul:(Mul64 (Rsh64Ux64 (ZeroExt32to64 x) (Const64 [1])) (Const64 [m])) (Const64 [s]))) (Const32 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+(umagic(32,c).m+1)/2) && s == 32+umagic(32,c).s-2 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpTrunc64to32 { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh64Ux64 { - break - } - _ = v_0_0_0.Args[1] - mul := v_0_0_0.Args[0] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpRsh64Ux64 { - break - } - _ = mul_0.Args[1] - mul_0_0 := mul_0.Args[0] - if mul_0_0.Op != OpZeroExt32to64 || x != mul_0_0.Args[0] { - break - } - mul_0_1 := mul_0.Args[1] - if mul_0_1.Op != OpConst64 || mul_0_1.AuxInt != 1 { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<31+(umagic(32, c).m+1)/2) && s == 32+umagic(32, c).s-2 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 x (Mul32 (Const32 [c]) (Trunc64to32 (Rsh64Ux64 (Avg64u (Lsh64x64 (ZeroExt32to64 x) (Const64 [32])) mul:(Mul64 (Const64 [m]) (ZeroExt32to64 x))) (Const64 [s]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(32,c).m) && s == 32+umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpTrunc64to32 { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh64Ux64 { - break - } - _ = v_1_1_0.Args[1] - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAvg64u { - break - } - _ = v_1_1_0_0.Args[1] - v_1_1_0_0_0 := v_1_1_0_0.Args[0] - if v_1_1_0_0_0.Op != OpLsh64x64 { - break - } - _ = v_1_1_0_0_0.Args[1] - v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] - if v_1_1_0_0_0_0.Op != OpZeroExt32to64 || x != v_1_1_0_0_0_0.Args[0] { - break - } - v_1_1_0_0_0_1 := v_1_1_0_0_0.Args[1] - if v_1_1_0_0_0_1.Op != OpConst64 || v_1_1_0_0_0_1.AuxInt != 32 { - break - } - mul := v_1_1_0_0.Args[1] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpZeroExt32to64 || x != mul_1.Args[0] { - break - } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { - break - } - s := v_1_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(32, c).m) && s == 32+umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 x (Mul32 (Const32 [c]) (Trunc64to32 (Rsh64Ux64 (Avg64u (Lsh64x64 (ZeroExt32to64 x) (Const64 [32])) mul:(Mul64 (ZeroExt32to64 x) (Const64 [m]))) (Const64 [s]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(32,c).m) && s == 32+umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpTrunc64to32 { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh64Ux64 { - break - } - _ = v_1_1_0.Args[1] - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAvg64u { - break - } - _ = v_1_1_0_0.Args[1] - v_1_1_0_0_0 := v_1_1_0_0.Args[0] - if v_1_1_0_0_0.Op != OpLsh64x64 { - break - } - _ = v_1_1_0_0_0.Args[1] - v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] - if v_1_1_0_0_0_0.Op != OpZeroExt32to64 || x != v_1_1_0_0_0_0.Args[0] { - break - } - v_1_1_0_0_0_1 := v_1_1_0_0_0.Args[1] - if v_1_1_0_0_0_1.Op != OpConst64 || v_1_1_0_0_0_1.AuxInt != 32 { - break - } - mul := v_1_1_0_0.Args[1] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpZeroExt32to64 || x != mul_0.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { - break - } - s := v_1_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(32, c).m) && s == 32+umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 x (Mul32 (Trunc64to32 (Rsh64Ux64 (Avg64u (Lsh64x64 (ZeroExt32to64 x) (Const64 [32])) mul:(Mul64 (Const64 [m]) (ZeroExt32to64 x))) (Const64 [s]))) (Const32 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(32,c).m) && s == 32+umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpTrunc64to32 { - break - } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh64Ux64 { - break - } - _ = v_1_0_0.Args[1] - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpAvg64u { - break - } - _ = v_1_0_0_0.Args[1] - v_1_0_0_0_0 := v_1_0_0_0.Args[0] - if v_1_0_0_0_0.Op != OpLsh64x64 { - break - } - _ = v_1_0_0_0_0.Args[1] - v_1_0_0_0_0_0 := v_1_0_0_0_0.Args[0] - if v_1_0_0_0_0_0.Op != OpZeroExt32to64 || x != v_1_0_0_0_0_0.Args[0] { - break - } - v_1_0_0_0_0_1 := v_1_0_0_0_0.Args[1] - if v_1_0_0_0_0_1.Op != OpConst64 || v_1_0_0_0_0_1.AuxInt != 32 { - break - } - mul := v_1_0_0_0.Args[1] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpZeroExt32to64 || x != mul_1.Args[0] { - break - } - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { - break - } - s := v_1_0_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(32, c).m) && s == 32+umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - return false -} -func rewriteValuegeneric_OpEq32_50(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Eq32 x (Mul32 (Trunc64to32 (Rsh64Ux64 (Avg64u (Lsh64x64 (ZeroExt32to64 x) (Const64 [32])) mul:(Mul64 (ZeroExt32to64 x) (Const64 [m]))) (Const64 [s]))) (Const32 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(32,c).m) && s == 32+umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpTrunc64to32 { - break - } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh64Ux64 { - break - } - _ = v_1_0_0.Args[1] - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpAvg64u { - break - } - _ = v_1_0_0_0.Args[1] - v_1_0_0_0_0 := v_1_0_0_0.Args[0] - if v_1_0_0_0_0.Op != OpLsh64x64 { - break - } - _ = v_1_0_0_0_0.Args[1] - v_1_0_0_0_0_0 := v_1_0_0_0_0.Args[0] - if v_1_0_0_0_0_0.Op != OpZeroExt32to64 || x != v_1_0_0_0_0_0.Args[0] { - break - } - v_1_0_0_0_0_1 := v_1_0_0_0_0.Args[1] - if v_1_0_0_0_0_1.Op != OpConst64 || v_1_0_0_0_0_1.AuxInt != 32 { - break - } - mul := v_1_0_0_0.Args[1] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpZeroExt32to64 || x != mul_0.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { - break - } - s := v_1_0_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(32, c).m) && s == 32+umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 (Mul32 (Const32 [c]) (Trunc64to32 (Rsh64Ux64 (Avg64u (Lsh64x64 (ZeroExt32to64 x) (Const64 [32])) mul:(Mul64 (Const64 [m]) (ZeroExt32to64 x))) (Const64 [s])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(32,c).m) && s == 32+umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpTrunc64to32 { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh64Ux64 { - break - } - _ = v_0_1_0.Args[1] - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpAvg64u { - break - } - _ = v_0_1_0_0.Args[1] - v_0_1_0_0_0 := v_0_1_0_0.Args[0] - if v_0_1_0_0_0.Op != OpLsh64x64 { - break - } - _ = v_0_1_0_0_0.Args[1] - v_0_1_0_0_0_0 := v_0_1_0_0_0.Args[0] - if v_0_1_0_0_0_0.Op != OpZeroExt32to64 || x != v_0_1_0_0_0_0.Args[0] { - break - } - v_0_1_0_0_0_1 := v_0_1_0_0_0.Args[1] - if v_0_1_0_0_0_1.Op != OpConst64 || v_0_1_0_0_0_1.AuxInt != 32 { - break - } - mul := v_0_1_0_0.Args[1] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpZeroExt32to64 || x != mul_1.Args[0] { - break - } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { - break - } - s := v_0_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(32, c).m) && s == 32+umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 (Mul32 (Const32 [c]) (Trunc64to32 (Rsh64Ux64 (Avg64u (Lsh64x64 (ZeroExt32to64 x) (Const64 [32])) mul:(Mul64 (ZeroExt32to64 x) (Const64 [m]))) (Const64 [s])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(32,c).m) && s == 32+umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpTrunc64to32 { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh64Ux64 { - break - } - _ = v_0_1_0.Args[1] - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpAvg64u { - break - } - _ = v_0_1_0_0.Args[1] - v_0_1_0_0_0 := v_0_1_0_0.Args[0] - if v_0_1_0_0_0.Op != OpLsh64x64 { - break - } - _ = v_0_1_0_0_0.Args[1] - v_0_1_0_0_0_0 := v_0_1_0_0_0.Args[0] - if v_0_1_0_0_0_0.Op != OpZeroExt32to64 || x != v_0_1_0_0_0_0.Args[0] { - break - } - v_0_1_0_0_0_1 := v_0_1_0_0_0.Args[1] - if v_0_1_0_0_0_1.Op != OpConst64 || v_0_1_0_0_0_1.AuxInt != 32 { - break - } - mul := v_0_1_0_0.Args[1] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpZeroExt32to64 || x != mul_0.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { - break - } - s := v_0_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(32, c).m) && s == 32+umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 (Mul32 (Trunc64to32 (Rsh64Ux64 (Avg64u (Lsh64x64 (ZeroExt32to64 x) (Const64 [32])) mul:(Mul64 (Const64 [m]) (ZeroExt32to64 x))) (Const64 [s]))) (Const32 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(32,c).m) && s == 32+umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpTrunc64to32 { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh64Ux64 { - break - } - _ = v_0_0_0.Args[1] - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpAvg64u { - break - } - _ = v_0_0_0_0.Args[1] - v_0_0_0_0_0 := v_0_0_0_0.Args[0] - if v_0_0_0_0_0.Op != OpLsh64x64 { - break - } - _ = v_0_0_0_0_0.Args[1] - v_0_0_0_0_0_0 := v_0_0_0_0_0.Args[0] - if v_0_0_0_0_0_0.Op != OpZeroExt32to64 || x != v_0_0_0_0_0_0.Args[0] { - break - } - v_0_0_0_0_0_1 := v_0_0_0_0_0.Args[1] - if v_0_0_0_0_0_1.Op != OpConst64 || v_0_0_0_0_0_1.AuxInt != 32 { - break - } - mul := v_0_0_0_0.Args[1] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpZeroExt32to64 || x != mul_1.Args[0] { - break - } - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(32, c).m) && s == 32+umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 (Mul32 (Trunc64to32 (Rsh64Ux64 (Avg64u (Lsh64x64 (ZeroExt32to64 x) (Const64 [32])) mul:(Mul64 (ZeroExt32to64 x) (Const64 [m]))) (Const64 [s]))) (Const32 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(32,c).m) && s == 32+umagic(32,c).s-1 && x.Op != OpConst32 && udivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Mul32 (Const32 [int64(int32(udivisible(32,c).m))]) x) (Const32 [int64(32-udivisible(32,c).k)]) ) (Const32 [int64(int32(udivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpTrunc64to32 { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh64Ux64 { - break - } - _ = v_0_0_0.Args[1] - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpAvg64u { - break - } - _ = v_0_0_0_0.Args[1] - v_0_0_0_0_0 := v_0_0_0_0.Args[0] - if v_0_0_0_0_0.Op != OpLsh64x64 { - break - } - _ = v_0_0_0_0_0.Args[1] - v_0_0_0_0_0_0 := v_0_0_0_0_0.Args[0] - if v_0_0_0_0_0_0.Op != OpZeroExt32to64 || x != v_0_0_0_0_0_0.Args[0] { - break - } - v_0_0_0_0_0_1 := v_0_0_0_0_0.Args[1] - if v_0_0_0_0_0_1.Op != OpConst64 || v_0_0_0_0_0_1.AuxInt != 32 { - break - } - mul := v_0_0_0_0.Args[1] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpZeroExt32to64 || x != mul_0.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(32, c).m) && s == 32+umagic(32, c).s-1 && x.Op != OpConst32 && udivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = int64(int32(udivisible(32, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(32 - udivisible(32, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(udivisible(32, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq32 x (Mul32 (Const32 [c]) (Sub32 (Rsh64x64 mul:(Mul64 (Const64 [m]) (SignExt32to64 x)) (Const64 [s])) (Rsh64x64 (SignExt32to64 x) (Const64 [63]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(32,c).m) && s == 32+smagic(32,c).s && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpSub32 { - break - } - _ = v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh64x64 { - break - } - _ = v_1_1_0.Args[1] - mul := v_1_1_0.Args[0] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpSignExt32to64 || x != mul_1.Args[0] { - break - } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { - break - } - s := v_1_1_0_1.AuxInt - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpRsh64x64 { - break - } - _ = v_1_1_1.Args[1] - v_1_1_1_0 := v_1_1_1.Args[0] - if v_1_1_1_0.Op != OpSignExt32to64 || x != v_1_1_1_0.Args[0] { - break - } - v_1_1_1_1 := v_1_1_1.Args[1] - if v_1_1_1_1.Op != OpConst64 || v_1_1_1_1.AuxInt != 63 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(32, c).m) && s == 32+smagic(32, c).s && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq32 x (Mul32 (Const32 [c]) (Sub32 (Rsh64x64 mul:(Mul64 (SignExt32to64 x) (Const64 [m])) (Const64 [s])) (Rsh64x64 (SignExt32to64 x) (Const64 [63]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(32,c).m) && s == 32+smagic(32,c).s && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpSub32 { - break - } - _ = v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh64x64 { - break - } - _ = v_1_1_0.Args[1] - mul := v_1_1_0.Args[0] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpSignExt32to64 || x != mul_0.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { - break - } - s := v_1_1_0_1.AuxInt - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpRsh64x64 { - break - } - _ = v_1_1_1.Args[1] - v_1_1_1_0 := v_1_1_1.Args[0] - if v_1_1_1_0.Op != OpSignExt32to64 || x != v_1_1_1_0.Args[0] { - break - } - v_1_1_1_1 := v_1_1_1.Args[1] - if v_1_1_1_1.Op != OpConst64 || v_1_1_1_1.AuxInt != 63 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(32, c).m) && s == 32+smagic(32, c).s && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq32 x (Mul32 (Sub32 (Rsh64x64 mul:(Mul64 (Const64 [m]) (SignExt32to64 x)) (Const64 [s])) (Rsh64x64 (SignExt32to64 x) (Const64 [63]))) (Const32 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(32,c).m) && s == 32+smagic(32,c).s && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpSub32 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh64x64 { - break - } - _ = v_1_0_0.Args[1] - mul := v_1_0_0.Args[0] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpSignExt32to64 || x != mul_1.Args[0] { - break - } - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { - break - } - s := v_1_0_0_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpRsh64x64 { - break - } - _ = v_1_0_1.Args[1] - v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpSignExt32to64 || x != v_1_0_1_0.Args[0] { - break - } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpConst64 || v_1_0_1_1.AuxInt != 63 { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(32, c).m) && s == 32+smagic(32, c).s && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq32 x (Mul32 (Sub32 (Rsh64x64 mul:(Mul64 (SignExt32to64 x) (Const64 [m])) (Const64 [s])) (Rsh64x64 (SignExt32to64 x) (Const64 [63]))) (Const32 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(32,c).m) && s == 32+smagic(32,c).s && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpSub32 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh64x64 { - break - } - _ = v_1_0_0.Args[1] - mul := v_1_0_0.Args[0] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpSignExt32to64 || x != mul_0.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { - break - } - s := v_1_0_0_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpRsh64x64 { - break - } - _ = v_1_0_1.Args[1] - v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpSignExt32to64 || x != v_1_0_1_0.Args[0] { - break - } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpConst64 || v_1_0_1_1.AuxInt != 63 { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(32, c).m) && s == 32+smagic(32, c).s && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq32 (Mul32 (Const32 [c]) (Sub32 (Rsh64x64 mul:(Mul64 (Const64 [m]) (SignExt32to64 x)) (Const64 [s])) (Rsh64x64 (SignExt32to64 x) (Const64 [63])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(32,c).m) && s == 32+smagic(32,c).s && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpSub32 { - break - } - _ = v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh64x64 { - break - } - _ = v_0_1_0.Args[1] - mul := v_0_1_0.Args[0] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpSignExt32to64 || x != mul_1.Args[0] { - break - } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { - break - } - s := v_0_1_0_1.AuxInt - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpRsh64x64 { - break - } - _ = v_0_1_1.Args[1] - v_0_1_1_0 := v_0_1_1.Args[0] - if v_0_1_1_0.Op != OpSignExt32to64 || x != v_0_1_1_0.Args[0] { - break - } - v_0_1_1_1 := v_0_1_1.Args[1] - if v_0_1_1_1.Op != OpConst64 || v_0_1_1_1.AuxInt != 63 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(32, c).m) && s == 32+smagic(32, c).s && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - return false -} -func rewriteValuegeneric_OpEq32_60(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Eq32 (Mul32 (Const32 [c]) (Sub32 (Rsh64x64 mul:(Mul64 (SignExt32to64 x) (Const64 [m])) (Const64 [s])) (Rsh64x64 (SignExt32to64 x) (Const64 [63])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(32,c).m) && s == 32+smagic(32,c).s && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpSub32 { - break - } - _ = v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh64x64 { - break - } - _ = v_0_1_0.Args[1] - mul := v_0_1_0.Args[0] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpSignExt32to64 || x != mul_0.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { - break - } - s := v_0_1_0_1.AuxInt - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpRsh64x64 { - break - } - _ = v_0_1_1.Args[1] - v_0_1_1_0 := v_0_1_1.Args[0] - if v_0_1_1_0.Op != OpSignExt32to64 || x != v_0_1_1_0.Args[0] { - break - } - v_0_1_1_1 := v_0_1_1.Args[1] - if v_0_1_1_1.Op != OpConst64 || v_0_1_1_1.AuxInt != 63 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(32, c).m) && s == 32+smagic(32, c).s && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq32 (Mul32 (Sub32 (Rsh64x64 mul:(Mul64 (Const64 [m]) (SignExt32to64 x)) (Const64 [s])) (Rsh64x64 (SignExt32to64 x) (Const64 [63]))) (Const32 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(32,c).m) && s == 32+smagic(32,c).s && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSub32 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh64x64 { - break - } - _ = v_0_0_0.Args[1] - mul := v_0_0_0.Args[0] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpSignExt32to64 || x != mul_1.Args[0] { - break - } - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_0_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpRsh64x64 { - break - } - _ = v_0_0_1.Args[1] - v_0_0_1_0 := v_0_0_1.Args[0] - if v_0_0_1_0.Op != OpSignExt32to64 || x != v_0_0_1_0.Args[0] { - break - } - v_0_0_1_1 := v_0_0_1.Args[1] - if v_0_0_1_1.Op != OpConst64 || v_0_0_1_1.AuxInt != 63 { - break - } - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(32, c).m) && s == 32+smagic(32, c).s && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq32 (Mul32 (Sub32 (Rsh64x64 mul:(Mul64 (SignExt32to64 x) (Const64 [m])) (Const64 [s])) (Rsh64x64 (SignExt32to64 x) (Const64 [63]))) (Const32 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(32,c).m) && s == 32+smagic(32,c).s && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSub32 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh64x64 { - break - } - _ = v_0_0_0.Args[1] - mul := v_0_0_0.Args[0] - if mul.Op != OpMul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpSignExt32to64 || x != mul_0.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_0_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpRsh64x64 { - break - } - _ = v_0_0_1.Args[1] - v_0_0_1_0 := v_0_0_1.Args[0] - if v_0_0_1_0.Op != OpSignExt32to64 || x != v_0_0_1_0.Args[0] { - break - } - v_0_0_1_1 := v_0_0_1.Args[1] - if v_0_0_1_1.Op != OpConst64 || v_0_0_1_1.AuxInt != 63 { - break - } - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(32, c).m) && s == 32+smagic(32, c).s && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq32 x (Mul32 (Const32 [c]) (Sub32 (Rsh32x64 mul:(Hmul32 (Const32 [m]) x) (Const64 [s])) (Rsh32x64 x (Const64 [31]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32,c).m/2)) && s == smagic(32,c).s-1 && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpSub32 { - break - } - _ = v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh32x64 { - break - } - _ = v_1_1_0.Args[1] - mul := v_1_1_0.Args[0] - if mul.Op != OpHmul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { - break - } - s := v_1_1_0_1.AuxInt - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpRsh32x64 { - break - } - _ = v_1_1_1.Args[1] - if x != v_1_1_1.Args[0] { - break - } - v_1_1_1_1 := v_1_1_1.Args[1] - if v_1_1_1_1.Op != OpConst64 || v_1_1_1_1.AuxInt != 31 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32, c).m/2)) && s == smagic(32, c).s-1 && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq32 x (Mul32 (Const32 [c]) (Sub32 (Rsh32x64 mul:(Hmul32 x (Const32 [m])) (Const64 [s])) (Rsh32x64 x (Const64 [31]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32,c).m/2)) && s == smagic(32,c).s-1 && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpSub32 { - break - } - _ = v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh32x64 { - break - } - _ = v_1_1_0.Args[1] - mul := v_1_1_0.Args[0] - if mul.Op != OpHmul32 { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { - break - } - m := mul_1.AuxInt - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { - break - } - s := v_1_1_0_1.AuxInt - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpRsh32x64 { - break - } - _ = v_1_1_1.Args[1] - if x != v_1_1_1.Args[0] { - break - } - v_1_1_1_1 := v_1_1_1.Args[1] - if v_1_1_1_1.Op != OpConst64 || v_1_1_1_1.AuxInt != 31 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32, c).m/2)) && s == smagic(32, c).s-1 && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq32 x (Mul32 (Sub32 (Rsh32x64 mul:(Hmul32 (Const32 [m]) x) (Const64 [s])) (Rsh32x64 x (Const64 [31]))) (Const32 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32,c).m/2)) && s == smagic(32,c).s-1 && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpSub32 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh32x64 { - break - } - _ = v_1_0_0.Args[1] - mul := v_1_0_0.Args[0] - if mul.Op != OpHmul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { - break - } - s := v_1_0_0_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpRsh32x64 { - break - } - _ = v_1_0_1.Args[1] - if x != v_1_0_1.Args[0] { - break - } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpConst64 || v_1_0_1_1.AuxInt != 31 { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32, c).m/2)) && s == smagic(32, c).s-1 && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq32 x (Mul32 (Sub32 (Rsh32x64 mul:(Hmul32 x (Const32 [m])) (Const64 [s])) (Rsh32x64 x (Const64 [31]))) (Const32 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32,c).m/2)) && s == smagic(32,c).s-1 && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpSub32 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh32x64 { - break - } - _ = v_1_0_0.Args[1] - mul := v_1_0_0.Args[0] - if mul.Op != OpHmul32 { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { - break - } - m := mul_1.AuxInt - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { - break - } - s := v_1_0_0_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpRsh32x64 { - break - } - _ = v_1_0_1.Args[1] - if x != v_1_0_1.Args[0] { - break - } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpConst64 || v_1_0_1_1.AuxInt != 31 { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32, c).m/2)) && s == smagic(32, c).s-1 && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq32 (Mul32 (Const32 [c]) (Sub32 (Rsh32x64 mul:(Hmul32 (Const32 [m]) x) (Const64 [s])) (Rsh32x64 x (Const64 [31])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32,c).m/2)) && s == smagic(32,c).s-1 && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpSub32 { - break - } - _ = v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh32x64 { - break - } - _ = v_0_1_0.Args[1] - mul := v_0_1_0.Args[0] - if mul.Op != OpHmul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { - break - } - s := v_0_1_0_1.AuxInt - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpRsh32x64 { - break - } - _ = v_0_1_1.Args[1] - if x != v_0_1_1.Args[0] { - break - } - v_0_1_1_1 := v_0_1_1.Args[1] - if v_0_1_1_1.Op != OpConst64 || v_0_1_1_1.AuxInt != 31 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32, c).m/2)) && s == smagic(32, c).s-1 && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq32 (Mul32 (Const32 [c]) (Sub32 (Rsh32x64 mul:(Hmul32 x (Const32 [m])) (Const64 [s])) (Rsh32x64 x (Const64 [31])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32,c).m/2)) && s == smagic(32,c).s-1 && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpSub32 { - break - } - _ = v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh32x64 { - break - } - _ = v_0_1_0.Args[1] - mul := v_0_1_0.Args[0] - if mul.Op != OpHmul32 { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { - break - } - m := mul_1.AuxInt - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { - break - } - s := v_0_1_0_1.AuxInt - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpRsh32x64 { - break - } - _ = v_0_1_1.Args[1] - if x != v_0_1_1.Args[0] { - break - } - v_0_1_1_1 := v_0_1_1.Args[1] - if v_0_1_1_1.Op != OpConst64 || v_0_1_1_1.AuxInt != 31 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32, c).m/2)) && s == smagic(32, c).s-1 && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq32 (Mul32 (Sub32 (Rsh32x64 mul:(Hmul32 (Const32 [m]) x) (Const64 [s])) (Rsh32x64 x (Const64 [31]))) (Const32 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32,c).m/2)) && s == smagic(32,c).s-1 && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSub32 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh32x64 { - break - } - _ = v_0_0_0.Args[1] - mul := v_0_0_0.Args[0] - if mul.Op != OpHmul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_0_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpRsh32x64 { - break - } - _ = v_0_0_1.Args[1] - if x != v_0_0_1.Args[0] { - break - } - v_0_0_1_1 := v_0_0_1.Args[1] - if v_0_0_1_1.Op != OpConst64 || v_0_0_1_1.AuxInt != 31 { - break - } - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32, c).m/2)) && s == smagic(32, c).s-1 && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - return false -} -func rewriteValuegeneric_OpEq32_70(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Eq32 (Mul32 (Sub32 (Rsh32x64 mul:(Hmul32 x (Const32 [m])) (Const64 [s])) (Rsh32x64 x (Const64 [31]))) (Const32 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32,c).m/2)) && s == smagic(32,c).s-1 && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSub32 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh32x64 { - break - } - _ = v_0_0_0.Args[1] - mul := v_0_0_0.Args[0] - if mul.Op != OpHmul32 { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { - break - } - m := mul_1.AuxInt - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_0_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpRsh32x64 { - break - } - _ = v_0_0_1.Args[1] - if x != v_0_0_1.Args[0] { - break - } - v_0_0_1_1 := v_0_0_1.Args[1] - if v_0_0_1_1.Op != OpConst64 || v_0_0_1_1.AuxInt != 31 { - break - } - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32, c).m/2)) && s == smagic(32, c).s-1 && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq32 x (Mul32 (Const32 [c]) (Sub32 (Rsh32x64 (Add32 mul:(Hmul32 (Const32 [m]) x) x) (Const64 [s])) (Rsh32x64 x (Const64 [31]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32,c).m)) && s == smagic(32,c).s && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpSub32 { - break - } - _ = v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh32x64 { - break - } - _ = v_1_1_0.Args[1] - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAdd32 { - break - } - _ = v_1_1_0_0.Args[1] - mul := v_1_1_0_0.Args[0] - if mul.Op != OpHmul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] || x != v_1_1_0_0.Args[1] { - break - } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { - break - } - s := v_1_1_0_1.AuxInt - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpRsh32x64 { - break - } - _ = v_1_1_1.Args[1] - if x != v_1_1_1.Args[0] { - break - } - v_1_1_1_1 := v_1_1_1.Args[1] - if v_1_1_1_1.Op != OpConst64 || v_1_1_1_1.AuxInt != 31 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32, c).m)) && s == smagic(32, c).s && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq32 x (Mul32 (Const32 [c]) (Sub32 (Rsh32x64 (Add32 mul:(Hmul32 x (Const32 [m])) x) (Const64 [s])) (Rsh32x64 x (Const64 [31]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32,c).m)) && s == smagic(32,c).s && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpSub32 { - break - } - _ = v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh32x64 { - break - } - _ = v_1_1_0.Args[1] - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAdd32 { - break - } - _ = v_1_1_0_0.Args[1] - mul := v_1_1_0_0.Args[0] - if mul.Op != OpHmul32 { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { - break - } - m := mul_1.AuxInt - if x != v_1_1_0_0.Args[1] { - break - } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { - break - } - s := v_1_1_0_1.AuxInt - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpRsh32x64 { - break - } - _ = v_1_1_1.Args[1] - if x != v_1_1_1.Args[0] { - break - } - v_1_1_1_1 := v_1_1_1.Args[1] - if v_1_1_1_1.Op != OpConst64 || v_1_1_1_1.AuxInt != 31 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32, c).m)) && s == smagic(32, c).s && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq32 x (Mul32 (Const32 [c]) (Sub32 (Rsh32x64 (Add32 x mul:(Hmul32 (Const32 [m]) x)) (Const64 [s])) (Rsh32x64 x (Const64 [31]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32,c).m)) && s == smagic(32,c).s && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpSub32 { - break - } - _ = v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh32x64 { - break - } - _ = v_1_1_0.Args[1] - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAdd32 { - break - } - _ = v_1_1_0_0.Args[1] - if x != v_1_1_0_0.Args[0] { - break - } - mul := v_1_1_0_0.Args[1] - if mul.Op != OpHmul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { - break - } - s := v_1_1_0_1.AuxInt - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpRsh32x64 { - break - } - _ = v_1_1_1.Args[1] - if x != v_1_1_1.Args[0] { - break - } - v_1_1_1_1 := v_1_1_1.Args[1] - if v_1_1_1_1.Op != OpConst64 || v_1_1_1_1.AuxInt != 31 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32, c).m)) && s == smagic(32, c).s && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq32 x (Mul32 (Const32 [c]) (Sub32 (Rsh32x64 (Add32 x mul:(Hmul32 x (Const32 [m]))) (Const64 [s])) (Rsh32x64 x (Const64 [31]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32,c).m)) && s == smagic(32,c).s && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpSub32 { - break - } - _ = v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh32x64 { - break - } - _ = v_1_1_0.Args[1] - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAdd32 { - break - } - _ = v_1_1_0_0.Args[1] - if x != v_1_1_0_0.Args[0] { - break - } - mul := v_1_1_0_0.Args[1] - if mul.Op != OpHmul32 { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { - break - } - m := mul_1.AuxInt - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { - break - } - s := v_1_1_0_1.AuxInt - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpRsh32x64 { - break - } - _ = v_1_1_1.Args[1] - if x != v_1_1_1.Args[0] { - break - } - v_1_1_1_1 := v_1_1_1.Args[1] - if v_1_1_1_1.Op != OpConst64 || v_1_1_1_1.AuxInt != 31 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32, c).m)) && s == smagic(32, c).s && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq32 x (Mul32 (Sub32 (Rsh32x64 (Add32 mul:(Hmul32 (Const32 [m]) x) x) (Const64 [s])) (Rsh32x64 x (Const64 [31]))) (Const32 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32,c).m)) && s == smagic(32,c).s && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpSub32 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh32x64 { - break - } - _ = v_1_0_0.Args[1] - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpAdd32 { - break - } - _ = v_1_0_0_0.Args[1] - mul := v_1_0_0_0.Args[0] - if mul.Op != OpHmul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] || x != v_1_0_0_0.Args[1] { - break - } - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { - break - } - s := v_1_0_0_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpRsh32x64 { - break - } - _ = v_1_0_1.Args[1] - if x != v_1_0_1.Args[0] { - break - } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpConst64 || v_1_0_1_1.AuxInt != 31 { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32, c).m)) && s == smagic(32, c).s && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq32 x (Mul32 (Sub32 (Rsh32x64 (Add32 mul:(Hmul32 x (Const32 [m])) x) (Const64 [s])) (Rsh32x64 x (Const64 [31]))) (Const32 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32,c).m)) && s == smagic(32,c).s && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpSub32 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh32x64 { - break - } - _ = v_1_0_0.Args[1] - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpAdd32 { - break - } - _ = v_1_0_0_0.Args[1] - mul := v_1_0_0_0.Args[0] - if mul.Op != OpHmul32 { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { - break - } - m := mul_1.AuxInt - if x != v_1_0_0_0.Args[1] { - break - } - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { - break - } - s := v_1_0_0_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpRsh32x64 { - break - } - _ = v_1_0_1.Args[1] - if x != v_1_0_1.Args[0] { - break - } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpConst64 || v_1_0_1_1.AuxInt != 31 { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32, c).m)) && s == smagic(32, c).s && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq32 x (Mul32 (Sub32 (Rsh32x64 (Add32 x mul:(Hmul32 (Const32 [m]) x)) (Const64 [s])) (Rsh32x64 x (Const64 [31]))) (Const32 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32,c).m)) && s == smagic(32,c).s && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpSub32 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh32x64 { - break - } - _ = v_1_0_0.Args[1] - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpAdd32 { - break - } - _ = v_1_0_0_0.Args[1] - if x != v_1_0_0_0.Args[0] { - break - } - mul := v_1_0_0_0.Args[1] - if mul.Op != OpHmul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { - break - } - s := v_1_0_0_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpRsh32x64 { - break - } - _ = v_1_0_1.Args[1] - if x != v_1_0_1.Args[0] { - break - } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpConst64 || v_1_0_1_1.AuxInt != 31 { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32, c).m)) && s == smagic(32, c).s && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq32 x (Mul32 (Sub32 (Rsh32x64 (Add32 x mul:(Hmul32 x (Const32 [m]))) (Const64 [s])) (Rsh32x64 x (Const64 [31]))) (Const32 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32,c).m)) && s == smagic(32,c).s && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpSub32 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh32x64 { - break - } - _ = v_1_0_0.Args[1] - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpAdd32 { - break - } - _ = v_1_0_0_0.Args[1] - if x != v_1_0_0_0.Args[0] { - break - } - mul := v_1_0_0_0.Args[1] - if mul.Op != OpHmul32 { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { - break - } - m := mul_1.AuxInt - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { - break - } - s := v_1_0_0_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpRsh32x64 { - break - } - _ = v_1_0_1.Args[1] - if x != v_1_0_1.Args[0] { - break - } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpConst64 || v_1_0_1_1.AuxInt != 31 { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32, c).m)) && s == smagic(32, c).s && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq32 (Mul32 (Const32 [c]) (Sub32 (Rsh32x64 (Add32 mul:(Hmul32 (Const32 [m]) x) x) (Const64 [s])) (Rsh32x64 x (Const64 [31])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32,c).m)) && s == smagic(32,c).s && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpSub32 { - break - } - _ = v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh32x64 { - break - } - _ = v_0_1_0.Args[1] - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpAdd32 { - break - } - _ = v_0_1_0_0.Args[1] - mul := v_0_1_0_0.Args[0] - if mul.Op != OpHmul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] || x != v_0_1_0_0.Args[1] { - break - } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { - break - } - s := v_0_1_0_1.AuxInt - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpRsh32x64 { - break - } - _ = v_0_1_1.Args[1] - if x != v_0_1_1.Args[0] { - break - } - v_0_1_1_1 := v_0_1_1.Args[1] - if v_0_1_1_1.Op != OpConst64 || v_0_1_1_1.AuxInt != 31 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32, c).m)) && s == smagic(32, c).s && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - return false -} -func rewriteValuegeneric_OpEq32_80(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Eq32 (Mul32 (Const32 [c]) (Sub32 (Rsh32x64 (Add32 mul:(Hmul32 x (Const32 [m])) x) (Const64 [s])) (Rsh32x64 x (Const64 [31])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32,c).m)) && s == smagic(32,c).s && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpSub32 { - break - } - _ = v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh32x64 { - break - } - _ = v_0_1_0.Args[1] - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpAdd32 { - break - } - _ = v_0_1_0_0.Args[1] - mul := v_0_1_0_0.Args[0] - if mul.Op != OpHmul32 { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { - break - } - m := mul_1.AuxInt - if x != v_0_1_0_0.Args[1] { - break - } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { - break - } - s := v_0_1_0_1.AuxInt - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpRsh32x64 { - break - } - _ = v_0_1_1.Args[1] - if x != v_0_1_1.Args[0] { - break - } - v_0_1_1_1 := v_0_1_1.Args[1] - if v_0_1_1_1.Op != OpConst64 || v_0_1_1_1.AuxInt != 31 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32, c).m)) && s == smagic(32, c).s && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq32 (Mul32 (Const32 [c]) (Sub32 (Rsh32x64 (Add32 x mul:(Hmul32 (Const32 [m]) x)) (Const64 [s])) (Rsh32x64 x (Const64 [31])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32,c).m)) && s == smagic(32,c).s && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpSub32 { - break - } - _ = v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh32x64 { - break - } - _ = v_0_1_0.Args[1] - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpAdd32 { - break - } - _ = v_0_1_0_0.Args[1] - if x != v_0_1_0_0.Args[0] { - break - } - mul := v_0_1_0_0.Args[1] - if mul.Op != OpHmul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { - break - } - s := v_0_1_0_1.AuxInt - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpRsh32x64 { - break - } - _ = v_0_1_1.Args[1] - if x != v_0_1_1.Args[0] { - break - } - v_0_1_1_1 := v_0_1_1.Args[1] - if v_0_1_1_1.Op != OpConst64 || v_0_1_1_1.AuxInt != 31 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32, c).m)) && s == smagic(32, c).s && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq32 (Mul32 (Const32 [c]) (Sub32 (Rsh32x64 (Add32 x mul:(Hmul32 x (Const32 [m]))) (Const64 [s])) (Rsh32x64 x (Const64 [31])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32,c).m)) && s == smagic(32,c).s && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpSub32 { - break - } - _ = v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh32x64 { - break - } - _ = v_0_1_0.Args[1] - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpAdd32 { - break - } - _ = v_0_1_0_0.Args[1] - if x != v_0_1_0_0.Args[0] { - break - } - mul := v_0_1_0_0.Args[1] - if mul.Op != OpHmul32 { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { - break - } - m := mul_1.AuxInt - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { - break - } - s := v_0_1_0_1.AuxInt - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpRsh32x64 { - break - } - _ = v_0_1_1.Args[1] - if x != v_0_1_1.Args[0] { - break - } - v_0_1_1_1 := v_0_1_1.Args[1] - if v_0_1_1_1.Op != OpConst64 || v_0_1_1_1.AuxInt != 31 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32, c).m)) && s == smagic(32, c).s && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq32 (Mul32 (Sub32 (Rsh32x64 (Add32 mul:(Hmul32 (Const32 [m]) x) x) (Const64 [s])) (Rsh32x64 x (Const64 [31]))) (Const32 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32,c).m)) && s == smagic(32,c).s && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSub32 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh32x64 { - break - } - _ = v_0_0_0.Args[1] - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpAdd32 { - break - } - _ = v_0_0_0_0.Args[1] - mul := v_0_0_0_0.Args[0] - if mul.Op != OpHmul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] || x != v_0_0_0_0.Args[1] { - break - } - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_0_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpRsh32x64 { - break - } - _ = v_0_0_1.Args[1] - if x != v_0_0_1.Args[0] { - break - } - v_0_0_1_1 := v_0_0_1.Args[1] - if v_0_0_1_1.Op != OpConst64 || v_0_0_1_1.AuxInt != 31 { - break - } - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32, c).m)) && s == smagic(32, c).s && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq32 (Mul32 (Sub32 (Rsh32x64 (Add32 mul:(Hmul32 x (Const32 [m])) x) (Const64 [s])) (Rsh32x64 x (Const64 [31]))) (Const32 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32,c).m)) && s == smagic(32,c).s && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSub32 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh32x64 { - break - } - _ = v_0_0_0.Args[1] - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpAdd32 { - break - } - _ = v_0_0_0_0.Args[1] - mul := v_0_0_0_0.Args[0] - if mul.Op != OpHmul32 { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { - break - } - m := mul_1.AuxInt - if x != v_0_0_0_0.Args[1] { - break - } - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_0_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpRsh32x64 { - break - } - _ = v_0_0_1.Args[1] - if x != v_0_0_1.Args[0] { - break - } - v_0_0_1_1 := v_0_0_1.Args[1] - if v_0_0_1_1.Op != OpConst64 || v_0_0_1_1.AuxInt != 31 { - break - } - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32, c).m)) && s == smagic(32, c).s && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq32 (Mul32 (Sub32 (Rsh32x64 (Add32 x mul:(Hmul32 (Const32 [m]) x)) (Const64 [s])) (Rsh32x64 x (Const64 [31]))) (Const32 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32,c).m)) && s == smagic(32,c).s && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSub32 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh32x64 { - break - } - _ = v_0_0_0.Args[1] - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpAdd32 { - break - } - _ = v_0_0_0_0.Args[1] - if x != v_0_0_0_0.Args[0] { - break - } - mul := v_0_0_0_0.Args[1] - if mul.Op != OpHmul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_0_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpRsh32x64 { - break - } - _ = v_0_0_1.Args[1] - if x != v_0_0_1.Args[0] { - break - } - v_0_0_1_1 := v_0_0_1.Args[1] - if v_0_0_1_1.Op != OpConst64 || v_0_0_1_1.AuxInt != 31 { - break - } - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32, c).m)) && s == smagic(32, c).s && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq32 (Mul32 (Sub32 (Rsh32x64 (Add32 x mul:(Hmul32 x (Const32 [m]))) (Const64 [s])) (Rsh32x64 x (Const64 [31]))) (Const32 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32,c).m)) && s == smagic(32,c).s && x.Op != OpConst32 && sdivisibleOK(32,c) - // result: (Leq32U (RotateLeft32 (Add32 (Mul32 (Const32 [int64(int32(sdivisible(32,c).m))]) x) (Const32 [int64(int32(sdivisible(32,c).a))]) ) (Const32 [int64(32-sdivisible(32,c).k)]) ) (Const32 [int64(int32(sdivisible(32,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSub32 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh32x64 { - break - } - _ = v_0_0_0.Args[1] - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpAdd32 { - break - } - _ = v_0_0_0_0.Args[1] - if x != v_0_0_0_0.Args[0] { - break - } - mul := v_0_0_0_0.Args[1] - if mul.Op != OpHmul32 { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { - break - } - m := mul_1.AuxInt - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_0_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpRsh32x64 { - break - } - _ = v_0_0_1.Args[1] - if x != v_0_0_1.Args[0] { - break - } - v_0_0_1_1 := v_0_0_1.Args[1] - if v_0_0_1_1.Op != OpConst64 || v_0_0_1_1.AuxInt != 31 { - break - } - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(int32(smagic(32, c).m)) && s == smagic(32, c).s && x.Op != OpConst32 && sdivisibleOK(32, c)) { - break - } - v.reset(OpLeq32U) - v0 := b.NewValue0(v.Pos, OpRotateLeft32, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) - v2 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = int64(int32(sdivisible(32, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v4.AuxInt = int64(int32(sdivisible(32, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v5.AuxInt = int64(32 - sdivisible(32, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v6.AuxInt = int64(int32(sdivisible(32, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq32 n (Lsh32x64 (Rsh32x64 (Add32 n (Rsh32Ux64 (Rsh32x64 n (Const64 [31])) (Const64 [kbar]))) (Const64 [k])) (Const64 [k]))) - // cond: k > 0 && k < 31 && kbar == 32 - k - // result: (Eq32 (And32 n (Const32 [int64(1< [0])) - for { - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpLsh32x64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpRsh32x64 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAdd32 { - break - } - t := v_1_0_0.Type - _ = v_1_0_0.Args[1] - if n != v_1_0_0.Args[0] { - break - } - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpRsh32Ux64 || v_1_0_0_1.Type != t { - break - } - _ = v_1_0_0_1.Args[1] - v_1_0_0_1_0 := v_1_0_0_1.Args[0] - if v_1_0_0_1_0.Op != OpRsh32x64 || v_1_0_0_1_0.Type != t { - break - } - _ = v_1_0_0_1_0.Args[1] - if n != v_1_0_0_1_0.Args[0] { - break - } - v_1_0_0_1_0_1 := v_1_0_0_1_0.Args[1] - if v_1_0_0_1_0_1.Op != OpConst64 || v_1_0_0_1_0_1.Type != typ.UInt64 || v_1_0_0_1_0_1.AuxInt != 31 { - break - } - v_1_0_0_1_1 := v_1_0_0_1.Args[1] - if v_1_0_0_1_1.Op != OpConst64 || v_1_0_0_1_1.Type != typ.UInt64 { - break - } - kbar := v_1_0_0_1_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 { - break - } - k := v_1_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || v_1_1.AuxInt != k || !(k > 0 && k < 31 && kbar == 32-k) { - break - } - v.reset(OpEq32) - v0 := b.NewValue0(v.Pos, OpAnd32, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst32, t) - v1.AuxInt = int64(1< (Rsh32Ux64 (Rsh32x64 n (Const64 [31])) (Const64 [kbar])) n) (Const64 [k])) (Const64 [k]))) - // cond: k > 0 && k < 31 && kbar == 32 - k - // result: (Eq32 (And32 n (Const32 [int64(1< [0])) - for { - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpLsh32x64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpRsh32x64 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAdd32 { - break - } - t := v_1_0_0.Type - _ = v_1_0_0.Args[1] - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpRsh32Ux64 || v_1_0_0_0.Type != t { - break - } - _ = v_1_0_0_0.Args[1] - v_1_0_0_0_0 := v_1_0_0_0.Args[0] - if v_1_0_0_0_0.Op != OpRsh32x64 || v_1_0_0_0_0.Type != t { - break - } - _ = v_1_0_0_0_0.Args[1] - if n != v_1_0_0_0_0.Args[0] { - break - } - v_1_0_0_0_0_1 := v_1_0_0_0_0.Args[1] - if v_1_0_0_0_0_1.Op != OpConst64 || v_1_0_0_0_0_1.Type != typ.UInt64 || v_1_0_0_0_0_1.AuxInt != 31 { - break - } - v_1_0_0_0_1 := v_1_0_0_0.Args[1] - if v_1_0_0_0_1.Op != OpConst64 || v_1_0_0_0_1.Type != typ.UInt64 { - break - } - kbar := v_1_0_0_0_1.AuxInt - if n != v_1_0_0.Args[1] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 { - break - } - k := v_1_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || v_1_1.AuxInt != k || !(k > 0 && k < 31 && kbar == 32-k) { - break - } - v.reset(OpEq32) - v0 := b.NewValue0(v.Pos, OpAnd32, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst32, t) - v1.AuxInt = int64(1< n (Rsh32Ux64 (Rsh32x64 n (Const64 [31])) (Const64 [kbar]))) (Const64 [k])) (Const64 [k])) n) - // cond: k > 0 && k < 31 && kbar == 32 - k - // result: (Eq32 (And32 n (Const32 [int64(1< [0])) - for { - n := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh32x64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh32x64 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAdd32 { - break - } - t := v_0_0_0.Type - _ = v_0_0_0.Args[1] - if n != v_0_0_0.Args[0] { - break - } - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpRsh32Ux64 || v_0_0_0_1.Type != t { - break - } - _ = v_0_0_0_1.Args[1] - v_0_0_0_1_0 := v_0_0_0_1.Args[0] - if v_0_0_0_1_0.Op != OpRsh32x64 || v_0_0_0_1_0.Type != t { - break - } - _ = v_0_0_0_1_0.Args[1] - if n != v_0_0_0_1_0.Args[0] { - break - } - v_0_0_0_1_0_1 := v_0_0_0_1_0.Args[1] - if v_0_0_0_1_0_1.Op != OpConst64 || v_0_0_0_1_0_1.Type != typ.UInt64 || v_0_0_0_1_0_1.AuxInt != 31 { - break - } - v_0_0_0_1_1 := v_0_0_0_1.Args[1] - if v_0_0_0_1_1.Op != OpConst64 || v_0_0_0_1_1.Type != typ.UInt64 { - break - } - kbar := v_0_0_0_1_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 || v_0_0_1.Type != typ.UInt64 { - break - } - k := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.Type != typ.UInt64 || v_0_1.AuxInt != k || !(k > 0 && k < 31 && kbar == 32-k) { - break - } - v.reset(OpEq32) - v0 := b.NewValue0(v.Pos, OpAnd32, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst32, t) - v1.AuxInt = int64(1< (Rsh32Ux64 (Rsh32x64 n (Const64 [31])) (Const64 [kbar])) n) (Const64 [k])) (Const64 [k])) n) - // cond: k > 0 && k < 31 && kbar == 32 - k - // result: (Eq32 (And32 n (Const32 [int64(1< [0])) - for { - n := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh32x64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh32x64 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAdd32 { - break - } - t := v_0_0_0.Type - _ = v_0_0_0.Args[1] - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpRsh32Ux64 || v_0_0_0_0.Type != t { - break - } - _ = v_0_0_0_0.Args[1] - v_0_0_0_0_0 := v_0_0_0_0.Args[0] - if v_0_0_0_0_0.Op != OpRsh32x64 || v_0_0_0_0_0.Type != t { - break - } - _ = v_0_0_0_0_0.Args[1] - if n != v_0_0_0_0_0.Args[0] { - break - } - v_0_0_0_0_0_1 := v_0_0_0_0_0.Args[1] - if v_0_0_0_0_0_1.Op != OpConst64 || v_0_0_0_0_0_1.Type != typ.UInt64 || v_0_0_0_0_0_1.AuxInt != 31 { - break - } - v_0_0_0_0_1 := v_0_0_0_0.Args[1] - if v_0_0_0_0_1.Op != OpConst64 || v_0_0_0_0_1.Type != typ.UInt64 { - break - } - kbar := v_0_0_0_0_1.AuxInt - if n != v_0_0_0.Args[1] { - break - } - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 || v_0_0_1.Type != typ.UInt64 { - break - } - k := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.Type != typ.UInt64 || v_0_1.AuxInt != k || !(k > 0 && k < 31 && kbar == 32-k) { - break - } - v.reset(OpEq32) - v0 := b.NewValue0(v.Pos, OpAnd32, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst32, t) - v1.AuxInt = int64(1< x (Const32 [y])) (Const32 [y])) - // cond: isPowerOfTwo(y) - // result: (Neq32 (And32 x (Const32 [y])) (Const32 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd32 { - break - } - t := v_0.Type - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 || v_0_1.Type != t { - break - } - y := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.Type != t || v_1.AuxInt != y || !(isPowerOfTwo(y)) { - break - } - v.reset(OpNeq32) - v0 := b.NewValue0(v.Pos, OpAnd32, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst32, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst32, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true - } - // match: (Eq32 (And32 (Const32 [y]) x) (Const32 [y])) - // cond: isPowerOfTwo(y) - // result: (Neq32 (And32 x (Const32 [y])) (Const32 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd32 { - break - } - t := v_0.Type - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 || v_0_0.Type != t { - break - } - y := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.Type != t || v_1.AuxInt != y || !(isPowerOfTwo(y)) { - break - } - v.reset(OpNeq32) - v0 := b.NewValue0(v.Pos, OpAnd32, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst32, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst32, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true - } - // match: (Eq32 (Const32 [y]) (And32 x (Const32 [y]))) - // cond: isPowerOfTwo(y) - // result: (Neq32 (And32 x (Const32 [y])) (Const32 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - t := v_0.Type - y := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAnd32 || v_1.Type != t { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 || v_1_1.Type != t || v_1_1.AuxInt != y || !(isPowerOfTwo(y)) { - break - } - v.reset(OpNeq32) - v0 := b.NewValue0(v.Pos, OpAnd32, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst32, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst32, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true - } - // match: (Eq32 (Const32 [y]) (And32 (Const32 [y]) x)) - // cond: isPowerOfTwo(y) - // result: (Neq32 (And32 x (Const32 [y])) (Const32 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - t := v_0.Type - y := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAnd32 || v_1.Type != t { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 || v_1_0.Type != t || v_1_0.AuxInt != y || !(isPowerOfTwo(y)) { - break - } - v.reset(OpNeq32) - v0 := b.NewValue0(v.Pos, OpAnd32, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst32, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst32, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true - } - return false -} -func rewriteValuegeneric_OpEq32F_0(v *Value) bool { - // match: (Eq32F (Const32F [c]) (Const32F [d])) - // result: (ConstBool [b2i(auxTo32F(c) == auxTo32F(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32F { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32F { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(auxTo32F(c) == auxTo32F(d)) - return true - } - // match: (Eq32F (Const32F [d]) (Const32F [c])) - // result: (ConstBool [b2i(auxTo32F(c) == auxTo32F(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32F { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32F { - break - } - c := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(auxTo32F(c) == auxTo32F(d)) - return true - } - return false -} -func rewriteValuegeneric_OpEq64_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Eq64 x x) - // result: (ConstBool [1]) - for { - x := v.Args[1] - if x != v.Args[0] { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (Eq64 (Const64 [c]) (Add64 (Const64 [d]) x)) - // result: (Eq64 (Const64 [c-d]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAdd64 { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst64 || v_1_0.Type != t { - break - } - d := v_1_0.AuxInt - v.reset(OpEq64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c - d - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Eq64 (Const64 [c]) (Add64 x (Const64 [d]))) - // result: (Eq64 (Const64 [c-d]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAdd64 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != t { - break - } - d := v_1_1.AuxInt - v.reset(OpEq64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c - d - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Eq64 (Add64 (Const64 [d]) x) (Const64 [c])) - // result: (Eq64 (Const64 [c-d]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd64 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 { - break - } - t := v_0_0.Type - d := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpEq64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c - d - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Eq64 (Add64 x (Const64 [d])) (Const64 [c])) - // result: (Eq64 (Const64 [c-d]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd64 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - t := v_0_1.Type - d := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpEq64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c - d - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Eq64 (Const64 [c]) (Const64 [d])) - // result: (ConstBool [b2i(c == d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c == d) - return true - } - // match: (Eq64 (Const64 [d]) (Const64 [c])) - // result: (ConstBool [b2i(c == d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c == d) - return true - } - // match: (Eq64 x (Mul64 (Const64 [c]) (Rsh64Ux64 mul:(Hmul64u (Const64 [m]) x) (Const64 [s])))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+umagic(64,c).m/2) && s == umagic(64,c).s-1 && x.Op != OpConst64 && udivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Mul64 (Const64 [int64(udivisible(64,c).m)]) x) (Const64 [int64(64-udivisible(64,c).k)]) ) (Const64 [int64(udivisible(64,c).max)]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst64 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpRsh64Ux64 { - break - } - _ = v_1_1.Args[1] - mul := v_1_1.Args[0] - if mul.Op != OpHmul64u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpConst64 { - break - } - s := v_1_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+umagic(64, c).m/2) && s == umagic(64, c).s-1 && x.Op != OpConst64 && udivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = int64(udivisible(64, c).m) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(64 - udivisible(64, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(udivisible(64, c).max) - v.AddArg(v4) - return true - } - // match: (Eq64 x (Mul64 (Const64 [c]) (Rsh64Ux64 mul:(Hmul64u x (Const64 [m])) (Const64 [s])))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+umagic(64,c).m/2) && s == umagic(64,c).s-1 && x.Op != OpConst64 && udivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Mul64 (Const64 [int64(udivisible(64,c).m)]) x) (Const64 [int64(64-udivisible(64,c).k)]) ) (Const64 [int64(udivisible(64,c).max)]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst64 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpRsh64Ux64 { - break - } - _ = v_1_1.Args[1] - mul := v_1_1.Args[0] - if mul.Op != OpHmul64u { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpConst64 { - break - } - s := v_1_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+umagic(64, c).m/2) && s == umagic(64, c).s-1 && x.Op != OpConst64 && udivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = int64(udivisible(64, c).m) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(64 - udivisible(64, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(udivisible(64, c).max) - v.AddArg(v4) - return true - } - // match: (Eq64 x (Mul64 (Rsh64Ux64 mul:(Hmul64u (Const64 [m]) x) (Const64 [s])) (Const64 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+umagic(64,c).m/2) && s == umagic(64,c).s-1 && x.Op != OpConst64 && udivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Mul64 (Const64 [int64(udivisible(64,c).m)]) x) (Const64 [int64(64-udivisible(64,c).k)]) ) (Const64 [int64(udivisible(64,c).max)]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpRsh64Ux64 { - break - } - _ = v_1_0.Args[1] - mul := v_1_0.Args[0] - if mul.Op != OpHmul64u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpConst64 { - break - } - s := v_1_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+umagic(64, c).m/2) && s == umagic(64, c).s-1 && x.Op != OpConst64 && udivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = int64(udivisible(64, c).m) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(64 - udivisible(64, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(udivisible(64, c).max) - v.AddArg(v4) - return true - } - return false -} -func rewriteValuegeneric_OpEq64_10(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Eq64 x (Mul64 (Rsh64Ux64 mul:(Hmul64u x (Const64 [m])) (Const64 [s])) (Const64 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+umagic(64,c).m/2) && s == umagic(64,c).s-1 && x.Op != OpConst64 && udivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Mul64 (Const64 [int64(udivisible(64,c).m)]) x) (Const64 [int64(64-udivisible(64,c).k)]) ) (Const64 [int64(udivisible(64,c).max)]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpRsh64Ux64 { - break - } - _ = v_1_0.Args[1] - mul := v_1_0.Args[0] - if mul.Op != OpHmul64u { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpConst64 { - break - } - s := v_1_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+umagic(64, c).m/2) && s == umagic(64, c).s-1 && x.Op != OpConst64 && udivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = int64(udivisible(64, c).m) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(64 - udivisible(64, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(udivisible(64, c).max) - v.AddArg(v4) - return true - } - // match: (Eq64 (Mul64 (Const64 [c]) (Rsh64Ux64 mul:(Hmul64u (Const64 [m]) x) (Const64 [s]))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+umagic(64,c).m/2) && s == umagic(64,c).s-1 && x.Op != OpConst64 && udivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Mul64 (Const64 [int64(udivisible(64,c).m)]) x) (Const64 [int64(64-udivisible(64,c).k)]) ) (Const64 [int64(udivisible(64,c).max)]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpRsh64Ux64 { - break - } - _ = v_0_1.Args[1] - mul := v_0_1.Args[0] - if mul.Op != OpHmul64u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpConst64 { - break - } - s := v_0_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+umagic(64, c).m/2) && s == umagic(64, c).s-1 && x.Op != OpConst64 && udivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = int64(udivisible(64, c).m) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(64 - udivisible(64, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(udivisible(64, c).max) - v.AddArg(v4) - return true - } - // match: (Eq64 (Mul64 (Const64 [c]) (Rsh64Ux64 mul:(Hmul64u x (Const64 [m])) (Const64 [s]))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+umagic(64,c).m/2) && s == umagic(64,c).s-1 && x.Op != OpConst64 && udivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Mul64 (Const64 [int64(udivisible(64,c).m)]) x) (Const64 [int64(64-udivisible(64,c).k)]) ) (Const64 [int64(udivisible(64,c).max)]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpRsh64Ux64 { - break - } - _ = v_0_1.Args[1] - mul := v_0_1.Args[0] - if mul.Op != OpHmul64u { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpConst64 { - break - } - s := v_0_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+umagic(64, c).m/2) && s == umagic(64, c).s-1 && x.Op != OpConst64 && udivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = int64(udivisible(64, c).m) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(64 - udivisible(64, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(udivisible(64, c).max) - v.AddArg(v4) - return true - } - // match: (Eq64 (Mul64 (Rsh64Ux64 mul:(Hmul64u (Const64 [m]) x) (Const64 [s])) (Const64 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+umagic(64,c).m/2) && s == umagic(64,c).s-1 && x.Op != OpConst64 && udivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Mul64 (Const64 [int64(udivisible(64,c).m)]) x) (Const64 [int64(64-udivisible(64,c).k)]) ) (Const64 [int64(udivisible(64,c).max)]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh64Ux64 { - break - } - _ = v_0_0.Args[1] - mul := v_0_0.Args[0] - if mul.Op != OpHmul64u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+umagic(64, c).m/2) && s == umagic(64, c).s-1 && x.Op != OpConst64 && udivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = int64(udivisible(64, c).m) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(64 - udivisible(64, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(udivisible(64, c).max) - v.AddArg(v4) - return true - } - // match: (Eq64 (Mul64 (Rsh64Ux64 mul:(Hmul64u x (Const64 [m])) (Const64 [s])) (Const64 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+umagic(64,c).m/2) && s == umagic(64,c).s-1 && x.Op != OpConst64 && udivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Mul64 (Const64 [int64(udivisible(64,c).m)]) x) (Const64 [int64(64-udivisible(64,c).k)]) ) (Const64 [int64(udivisible(64,c).max)]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh64Ux64 { - break - } - _ = v_0_0.Args[1] - mul := v_0_0.Args[0] - if mul.Op != OpHmul64u { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+umagic(64, c).m/2) && s == umagic(64, c).s-1 && x.Op != OpConst64 && udivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = int64(udivisible(64, c).m) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(64 - udivisible(64, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(udivisible(64, c).max) - v.AddArg(v4) - return true - } - // match: (Eq64 x (Mul64 (Const64 [c]) (Rsh64Ux64 mul:(Hmul64u (Const64 [m]) (Rsh64Ux64 x (Const64 [1]))) (Const64 [s])))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+(umagic(64,c).m+1)/2) && s == umagic(64,c).s-2 && x.Op != OpConst64 && udivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Mul64 (Const64 [int64(udivisible(64,c).m)]) x) (Const64 [int64(64-udivisible(64,c).k)]) ) (Const64 [int64(udivisible(64,c).max)]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst64 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpRsh64Ux64 { - break - } - _ = v_1_1.Args[1] - mul := v_1_1.Args[0] - if mul.Op != OpHmul64u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpRsh64Ux64 { - break - } - _ = mul_1.Args[1] - if x != mul_1.Args[0] { - break - } - mul_1_1 := mul_1.Args[1] - if mul_1_1.Op != OpConst64 || mul_1_1.AuxInt != 1 { - break - } - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpConst64 { - break - } - s := v_1_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+(umagic(64, c).m+1)/2) && s == umagic(64, c).s-2 && x.Op != OpConst64 && udivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = int64(udivisible(64, c).m) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(64 - udivisible(64, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(udivisible(64, c).max) - v.AddArg(v4) - return true - } - // match: (Eq64 x (Mul64 (Const64 [c]) (Rsh64Ux64 mul:(Hmul64u (Rsh64Ux64 x (Const64 [1])) (Const64 [m])) (Const64 [s])))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+(umagic(64,c).m+1)/2) && s == umagic(64,c).s-2 && x.Op != OpConst64 && udivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Mul64 (Const64 [int64(udivisible(64,c).m)]) x) (Const64 [int64(64-udivisible(64,c).k)]) ) (Const64 [int64(udivisible(64,c).max)]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst64 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpRsh64Ux64 { - break - } - _ = v_1_1.Args[1] - mul := v_1_1.Args[0] - if mul.Op != OpHmul64u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpRsh64Ux64 { - break - } - _ = mul_0.Args[1] - if x != mul_0.Args[0] { - break - } - mul_0_1 := mul_0.Args[1] - if mul_0_1.Op != OpConst64 || mul_0_1.AuxInt != 1 { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpConst64 { - break - } - s := v_1_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+(umagic(64, c).m+1)/2) && s == umagic(64, c).s-2 && x.Op != OpConst64 && udivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = int64(udivisible(64, c).m) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(64 - udivisible(64, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(udivisible(64, c).max) - v.AddArg(v4) - return true - } - // match: (Eq64 x (Mul64 (Rsh64Ux64 mul:(Hmul64u (Const64 [m]) (Rsh64Ux64 x (Const64 [1]))) (Const64 [s])) (Const64 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+(umagic(64,c).m+1)/2) && s == umagic(64,c).s-2 && x.Op != OpConst64 && udivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Mul64 (Const64 [int64(udivisible(64,c).m)]) x) (Const64 [int64(64-udivisible(64,c).k)]) ) (Const64 [int64(udivisible(64,c).max)]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpRsh64Ux64 { - break - } - _ = v_1_0.Args[1] - mul := v_1_0.Args[0] - if mul.Op != OpHmul64u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpRsh64Ux64 { - break - } - _ = mul_1.Args[1] - if x != mul_1.Args[0] { - break - } - mul_1_1 := mul_1.Args[1] - if mul_1_1.Op != OpConst64 || mul_1_1.AuxInt != 1 { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpConst64 { - break - } - s := v_1_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+(umagic(64, c).m+1)/2) && s == umagic(64, c).s-2 && x.Op != OpConst64 && udivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = int64(udivisible(64, c).m) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(64 - udivisible(64, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(udivisible(64, c).max) - v.AddArg(v4) - return true - } - // match: (Eq64 x (Mul64 (Rsh64Ux64 mul:(Hmul64u (Rsh64Ux64 x (Const64 [1])) (Const64 [m])) (Const64 [s])) (Const64 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+(umagic(64,c).m+1)/2) && s == umagic(64,c).s-2 && x.Op != OpConst64 && udivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Mul64 (Const64 [int64(udivisible(64,c).m)]) x) (Const64 [int64(64-udivisible(64,c).k)]) ) (Const64 [int64(udivisible(64,c).max)]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpRsh64Ux64 { - break - } - _ = v_1_0.Args[1] - mul := v_1_0.Args[0] - if mul.Op != OpHmul64u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpRsh64Ux64 { - break - } - _ = mul_0.Args[1] - if x != mul_0.Args[0] { - break - } - mul_0_1 := mul_0.Args[1] - if mul_0_1.Op != OpConst64 || mul_0_1.AuxInt != 1 { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpConst64 { - break - } - s := v_1_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+(umagic(64, c).m+1)/2) && s == umagic(64, c).s-2 && x.Op != OpConst64 && udivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = int64(udivisible(64, c).m) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(64 - udivisible(64, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(udivisible(64, c).max) - v.AddArg(v4) - return true - } - // match: (Eq64 (Mul64 (Const64 [c]) (Rsh64Ux64 mul:(Hmul64u (Const64 [m]) (Rsh64Ux64 x (Const64 [1]))) (Const64 [s]))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+(umagic(64,c).m+1)/2) && s == umagic(64,c).s-2 && x.Op != OpConst64 && udivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Mul64 (Const64 [int64(udivisible(64,c).m)]) x) (Const64 [int64(64-udivisible(64,c).k)]) ) (Const64 [int64(udivisible(64,c).max)]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpRsh64Ux64 { - break - } - _ = v_0_1.Args[1] - mul := v_0_1.Args[0] - if mul.Op != OpHmul64u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpRsh64Ux64 { - break - } - _ = mul_1.Args[1] - if x != mul_1.Args[0] { - break - } - mul_1_1 := mul_1.Args[1] - if mul_1_1.Op != OpConst64 || mul_1_1.AuxInt != 1 { - break - } - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpConst64 { - break - } - s := v_0_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+(umagic(64, c).m+1)/2) && s == umagic(64, c).s-2 && x.Op != OpConst64 && udivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = int64(udivisible(64, c).m) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(64 - udivisible(64, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(udivisible(64, c).max) - v.AddArg(v4) - return true - } - return false -} -func rewriteValuegeneric_OpEq64_20(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Eq64 (Mul64 (Const64 [c]) (Rsh64Ux64 mul:(Hmul64u (Rsh64Ux64 x (Const64 [1])) (Const64 [m])) (Const64 [s]))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+(umagic(64,c).m+1)/2) && s == umagic(64,c).s-2 && x.Op != OpConst64 && udivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Mul64 (Const64 [int64(udivisible(64,c).m)]) x) (Const64 [int64(64-udivisible(64,c).k)]) ) (Const64 [int64(udivisible(64,c).max)]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpRsh64Ux64 { - break - } - _ = v_0_1.Args[1] - mul := v_0_1.Args[0] - if mul.Op != OpHmul64u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpRsh64Ux64 { - break - } - _ = mul_0.Args[1] - if x != mul_0.Args[0] { - break - } - mul_0_1 := mul_0.Args[1] - if mul_0_1.Op != OpConst64 || mul_0_1.AuxInt != 1 { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpConst64 { - break - } - s := v_0_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+(umagic(64, c).m+1)/2) && s == umagic(64, c).s-2 && x.Op != OpConst64 && udivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = int64(udivisible(64, c).m) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(64 - udivisible(64, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(udivisible(64, c).max) - v.AddArg(v4) - return true - } - // match: (Eq64 (Mul64 (Rsh64Ux64 mul:(Hmul64u (Const64 [m]) (Rsh64Ux64 x (Const64 [1]))) (Const64 [s])) (Const64 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+(umagic(64,c).m+1)/2) && s == umagic(64,c).s-2 && x.Op != OpConst64 && udivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Mul64 (Const64 [int64(udivisible(64,c).m)]) x) (Const64 [int64(64-udivisible(64,c).k)]) ) (Const64 [int64(udivisible(64,c).max)]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh64Ux64 { - break - } - _ = v_0_0.Args[1] - mul := v_0_0.Args[0] - if mul.Op != OpHmul64u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpRsh64Ux64 { - break - } - _ = mul_1.Args[1] - if x != mul_1.Args[0] { - break - } - mul_1_1 := mul_1.Args[1] - if mul_1_1.Op != OpConst64 || mul_1_1.AuxInt != 1 { - break - } - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+(umagic(64, c).m+1)/2) && s == umagic(64, c).s-2 && x.Op != OpConst64 && udivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = int64(udivisible(64, c).m) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(64 - udivisible(64, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(udivisible(64, c).max) - v.AddArg(v4) - return true - } - // match: (Eq64 (Mul64 (Rsh64Ux64 mul:(Hmul64u (Rsh64Ux64 x (Const64 [1])) (Const64 [m])) (Const64 [s])) (Const64 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+(umagic(64,c).m+1)/2) && s == umagic(64,c).s-2 && x.Op != OpConst64 && udivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Mul64 (Const64 [int64(udivisible(64,c).m)]) x) (Const64 [int64(64-udivisible(64,c).k)]) ) (Const64 [int64(udivisible(64,c).max)]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh64Ux64 { - break - } - _ = v_0_0.Args[1] - mul := v_0_0.Args[0] - if mul.Op != OpHmul64u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpRsh64Ux64 { - break - } - _ = mul_0.Args[1] - if x != mul_0.Args[0] { - break - } - mul_0_1 := mul_0.Args[1] - if mul_0_1.Op != OpConst64 || mul_0_1.AuxInt != 1 { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<63+(umagic(64, c).m+1)/2) && s == umagic(64, c).s-2 && x.Op != OpConst64 && udivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = int64(udivisible(64, c).m) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(64 - udivisible(64, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(udivisible(64, c).max) - v.AddArg(v4) - return true - } - // match: (Eq64 x (Mul64 (Const64 [c]) (Rsh64Ux64 (Avg64u x mul:(Hmul64u (Const64 [m]) x)) (Const64 [s])))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(64,c).m) && s == umagic(64,c).s-1 && x.Op != OpConst64 && udivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Mul64 (Const64 [int64(udivisible(64,c).m)]) x) (Const64 [int64(64-udivisible(64,c).k)]) ) (Const64 [int64(udivisible(64,c).max)]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst64 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpRsh64Ux64 { - break - } - _ = v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAvg64u { - break - } - _ = v_1_1_0.Args[1] - if x != v_1_1_0.Args[0] { - break - } - mul := v_1_1_0.Args[1] - if mul.Op != OpHmul64u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpConst64 { - break - } - s := v_1_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(64, c).m) && s == umagic(64, c).s-1 && x.Op != OpConst64 && udivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = int64(udivisible(64, c).m) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(64 - udivisible(64, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(udivisible(64, c).max) - v.AddArg(v4) - return true - } - // match: (Eq64 x (Mul64 (Const64 [c]) (Rsh64Ux64 (Avg64u x mul:(Hmul64u x (Const64 [m]))) (Const64 [s])))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(64,c).m) && s == umagic(64,c).s-1 && x.Op != OpConst64 && udivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Mul64 (Const64 [int64(udivisible(64,c).m)]) x) (Const64 [int64(64-udivisible(64,c).k)]) ) (Const64 [int64(udivisible(64,c).max)]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst64 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpRsh64Ux64 { - break - } - _ = v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAvg64u { - break - } - _ = v_1_1_0.Args[1] - if x != v_1_1_0.Args[0] { - break - } - mul := v_1_1_0.Args[1] - if mul.Op != OpHmul64u { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpConst64 { - break - } - s := v_1_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(64, c).m) && s == umagic(64, c).s-1 && x.Op != OpConst64 && udivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = int64(udivisible(64, c).m) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(64 - udivisible(64, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(udivisible(64, c).max) - v.AddArg(v4) - return true - } - // match: (Eq64 x (Mul64 (Rsh64Ux64 (Avg64u x mul:(Hmul64u (Const64 [m]) x)) (Const64 [s])) (Const64 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(64,c).m) && s == umagic(64,c).s-1 && x.Op != OpConst64 && udivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Mul64 (Const64 [int64(udivisible(64,c).m)]) x) (Const64 [int64(64-udivisible(64,c).k)]) ) (Const64 [int64(udivisible(64,c).max)]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpRsh64Ux64 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAvg64u { - break - } - _ = v_1_0_0.Args[1] - if x != v_1_0_0.Args[0] { - break - } - mul := v_1_0_0.Args[1] - if mul.Op != OpHmul64u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpConst64 { - break - } - s := v_1_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(64, c).m) && s == umagic(64, c).s-1 && x.Op != OpConst64 && udivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = int64(udivisible(64, c).m) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(64 - udivisible(64, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(udivisible(64, c).max) - v.AddArg(v4) - return true - } - // match: (Eq64 x (Mul64 (Rsh64Ux64 (Avg64u x mul:(Hmul64u x (Const64 [m]))) (Const64 [s])) (Const64 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(64,c).m) && s == umagic(64,c).s-1 && x.Op != OpConst64 && udivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Mul64 (Const64 [int64(udivisible(64,c).m)]) x) (Const64 [int64(64-udivisible(64,c).k)]) ) (Const64 [int64(udivisible(64,c).max)]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpRsh64Ux64 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAvg64u { - break - } - _ = v_1_0_0.Args[1] - if x != v_1_0_0.Args[0] { - break - } - mul := v_1_0_0.Args[1] - if mul.Op != OpHmul64u { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpConst64 { - break - } - s := v_1_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(64, c).m) && s == umagic(64, c).s-1 && x.Op != OpConst64 && udivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = int64(udivisible(64, c).m) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(64 - udivisible(64, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(udivisible(64, c).max) - v.AddArg(v4) - return true - } - // match: (Eq64 (Mul64 (Const64 [c]) (Rsh64Ux64 (Avg64u x mul:(Hmul64u (Const64 [m]) x)) (Const64 [s]))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(64,c).m) && s == umagic(64,c).s-1 && x.Op != OpConst64 && udivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Mul64 (Const64 [int64(udivisible(64,c).m)]) x) (Const64 [int64(64-udivisible(64,c).k)]) ) (Const64 [int64(udivisible(64,c).max)]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpRsh64Ux64 { - break - } - _ = v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpAvg64u { - break - } - _ = v_0_1_0.Args[1] - if x != v_0_1_0.Args[0] { - break - } - mul := v_0_1_0.Args[1] - if mul.Op != OpHmul64u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpConst64 { - break - } - s := v_0_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(64, c).m) && s == umagic(64, c).s-1 && x.Op != OpConst64 && udivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = int64(udivisible(64, c).m) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(64 - udivisible(64, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(udivisible(64, c).max) - v.AddArg(v4) - return true - } - // match: (Eq64 (Mul64 (Const64 [c]) (Rsh64Ux64 (Avg64u x mul:(Hmul64u x (Const64 [m]))) (Const64 [s]))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(64,c).m) && s == umagic(64,c).s-1 && x.Op != OpConst64 && udivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Mul64 (Const64 [int64(udivisible(64,c).m)]) x) (Const64 [int64(64-udivisible(64,c).k)]) ) (Const64 [int64(udivisible(64,c).max)]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpRsh64Ux64 { - break - } - _ = v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpAvg64u { - break - } - _ = v_0_1_0.Args[1] - if x != v_0_1_0.Args[0] { - break - } - mul := v_0_1_0.Args[1] - if mul.Op != OpHmul64u { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpConst64 { - break - } - s := v_0_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(64, c).m) && s == umagic(64, c).s-1 && x.Op != OpConst64 && udivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = int64(udivisible(64, c).m) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(64 - udivisible(64, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(udivisible(64, c).max) - v.AddArg(v4) - return true - } - // match: (Eq64 (Mul64 (Rsh64Ux64 (Avg64u x mul:(Hmul64u (Const64 [m]) x)) (Const64 [s])) (Const64 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(64,c).m) && s == umagic(64,c).s-1 && x.Op != OpConst64 && udivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Mul64 (Const64 [int64(udivisible(64,c).m)]) x) (Const64 [int64(64-udivisible(64,c).k)]) ) (Const64 [int64(udivisible(64,c).max)]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh64Ux64 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAvg64u { - break - } - _ = v_0_0_0.Args[1] - if x != v_0_0_0.Args[0] { - break - } - mul := v_0_0_0.Args[1] - if mul.Op != OpHmul64u { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(64, c).m) && s == umagic(64, c).s-1 && x.Op != OpConst64 && udivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = int64(udivisible(64, c).m) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(64 - udivisible(64, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(udivisible(64, c).max) - v.AddArg(v4) - return true - } - return false -} -func rewriteValuegeneric_OpEq64_30(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Eq64 (Mul64 (Rsh64Ux64 (Avg64u x mul:(Hmul64u x (Const64 [m]))) (Const64 [s])) (Const64 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(64,c).m) && s == umagic(64,c).s-1 && x.Op != OpConst64 && udivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Mul64 (Const64 [int64(udivisible(64,c).m)]) x) (Const64 [int64(64-udivisible(64,c).k)]) ) (Const64 [int64(udivisible(64,c).max)]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh64Ux64 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAvg64u { - break - } - _ = v_0_0_0.Args[1] - if x != v_0_0_0.Args[0] { - break - } - mul := v_0_0_0.Args[1] - if mul.Op != OpHmul64u { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(umagic(64, c).m) && s == umagic(64, c).s-1 && x.Op != OpConst64 && udivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v2.AuxInt = int64(udivisible(64, c).m) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(64 - udivisible(64, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(udivisible(64, c).max) - v.AddArg(v4) - return true - } - // match: (Eq64 x (Mul64 (Const64 [c]) (Sub64 (Rsh64x64 mul:(Hmul64 (Const64 [m]) x) (Const64 [s])) (Rsh64x64 x (Const64 [63]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64,c).m/2) && s == smagic(64,c).s-1 && x.Op != OpConst64 && sdivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Add64 (Mul64 (Const64 [int64(sdivisible(64,c).m)]) x) (Const64 [int64(sdivisible(64,c).a)]) ) (Const64 [int64(64-sdivisible(64,c).k)]) ) (Const64 [int64(sdivisible(64,c).max)]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst64 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpSub64 { - break - } - _ = v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh64x64 { - break - } - _ = v_1_1_0.Args[1] - mul := v_1_1_0.Args[0] - if mul.Op != OpHmul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { - break - } - s := v_1_1_0_1.AuxInt - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpRsh64x64 { - break - } - _ = v_1_1_1.Args[1] - if x != v_1_1_1.Args[0] { - break - } - v_1_1_1_1 := v_1_1_1.Args[1] - if v_1_1_1_1.Op != OpConst64 || v_1_1_1_1.AuxInt != 63 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64, c).m/2) && s == smagic(64, c).s-1 && x.Op != OpConst64 && sdivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(sdivisible(64, c).m) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(sdivisible(64, c).a) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = int64(64 - sdivisible(64, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v6.AuxInt = int64(sdivisible(64, c).max) - v.AddArg(v6) - return true - } - // match: (Eq64 x (Mul64 (Const64 [c]) (Sub64 (Rsh64x64 mul:(Hmul64 x (Const64 [m])) (Const64 [s])) (Rsh64x64 x (Const64 [63]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64,c).m/2) && s == smagic(64,c).s-1 && x.Op != OpConst64 && sdivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Add64 (Mul64 (Const64 [int64(sdivisible(64,c).m)]) x) (Const64 [int64(sdivisible(64,c).a)]) ) (Const64 [int64(64-sdivisible(64,c).k)]) ) (Const64 [int64(sdivisible(64,c).max)]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst64 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpSub64 { - break - } - _ = v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh64x64 { - break - } - _ = v_1_1_0.Args[1] - mul := v_1_1_0.Args[0] - if mul.Op != OpHmul64 { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { - break - } - s := v_1_1_0_1.AuxInt - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpRsh64x64 { - break - } - _ = v_1_1_1.Args[1] - if x != v_1_1_1.Args[0] { - break - } - v_1_1_1_1 := v_1_1_1.Args[1] - if v_1_1_1_1.Op != OpConst64 || v_1_1_1_1.AuxInt != 63 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64, c).m/2) && s == smagic(64, c).s-1 && x.Op != OpConst64 && sdivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(sdivisible(64, c).m) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(sdivisible(64, c).a) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = int64(64 - sdivisible(64, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v6.AuxInt = int64(sdivisible(64, c).max) - v.AddArg(v6) - return true - } - // match: (Eq64 x (Mul64 (Sub64 (Rsh64x64 mul:(Hmul64 (Const64 [m]) x) (Const64 [s])) (Rsh64x64 x (Const64 [63]))) (Const64 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64,c).m/2) && s == smagic(64,c).s-1 && x.Op != OpConst64 && sdivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Add64 (Mul64 (Const64 [int64(sdivisible(64,c).m)]) x) (Const64 [int64(sdivisible(64,c).a)]) ) (Const64 [int64(64-sdivisible(64,c).k)]) ) (Const64 [int64(sdivisible(64,c).max)]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpSub64 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh64x64 { - break - } - _ = v_1_0_0.Args[1] - mul := v_1_0_0.Args[0] - if mul.Op != OpHmul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { - break - } - s := v_1_0_0_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpRsh64x64 { - break - } - _ = v_1_0_1.Args[1] - if x != v_1_0_1.Args[0] { - break - } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpConst64 || v_1_0_1_1.AuxInt != 63 { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64, c).m/2) && s == smagic(64, c).s-1 && x.Op != OpConst64 && sdivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(sdivisible(64, c).m) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(sdivisible(64, c).a) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = int64(64 - sdivisible(64, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v6.AuxInt = int64(sdivisible(64, c).max) - v.AddArg(v6) - return true - } - // match: (Eq64 x (Mul64 (Sub64 (Rsh64x64 mul:(Hmul64 x (Const64 [m])) (Const64 [s])) (Rsh64x64 x (Const64 [63]))) (Const64 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64,c).m/2) && s == smagic(64,c).s-1 && x.Op != OpConst64 && sdivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Add64 (Mul64 (Const64 [int64(sdivisible(64,c).m)]) x) (Const64 [int64(sdivisible(64,c).a)]) ) (Const64 [int64(64-sdivisible(64,c).k)]) ) (Const64 [int64(sdivisible(64,c).max)]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpSub64 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh64x64 { - break - } - _ = v_1_0_0.Args[1] - mul := v_1_0_0.Args[0] - if mul.Op != OpHmul64 { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { - break - } - s := v_1_0_0_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpRsh64x64 { - break - } - _ = v_1_0_1.Args[1] - if x != v_1_0_1.Args[0] { - break - } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpConst64 || v_1_0_1_1.AuxInt != 63 { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64, c).m/2) && s == smagic(64, c).s-1 && x.Op != OpConst64 && sdivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(sdivisible(64, c).m) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(sdivisible(64, c).a) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = int64(64 - sdivisible(64, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v6.AuxInt = int64(sdivisible(64, c).max) - v.AddArg(v6) - return true - } - // match: (Eq64 (Mul64 (Const64 [c]) (Sub64 (Rsh64x64 mul:(Hmul64 (Const64 [m]) x) (Const64 [s])) (Rsh64x64 x (Const64 [63])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64,c).m/2) && s == smagic(64,c).s-1 && x.Op != OpConst64 && sdivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Add64 (Mul64 (Const64 [int64(sdivisible(64,c).m)]) x) (Const64 [int64(sdivisible(64,c).a)]) ) (Const64 [int64(64-sdivisible(64,c).k)]) ) (Const64 [int64(sdivisible(64,c).max)]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpSub64 { - break - } - _ = v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh64x64 { - break - } - _ = v_0_1_0.Args[1] - mul := v_0_1_0.Args[0] - if mul.Op != OpHmul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { - break - } - s := v_0_1_0_1.AuxInt - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpRsh64x64 { - break - } - _ = v_0_1_1.Args[1] - if x != v_0_1_1.Args[0] { - break - } - v_0_1_1_1 := v_0_1_1.Args[1] - if v_0_1_1_1.Op != OpConst64 || v_0_1_1_1.AuxInt != 63 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64, c).m/2) && s == smagic(64, c).s-1 && x.Op != OpConst64 && sdivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(sdivisible(64, c).m) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(sdivisible(64, c).a) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = int64(64 - sdivisible(64, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v6.AuxInt = int64(sdivisible(64, c).max) - v.AddArg(v6) - return true - } - // match: (Eq64 (Mul64 (Const64 [c]) (Sub64 (Rsh64x64 mul:(Hmul64 x (Const64 [m])) (Const64 [s])) (Rsh64x64 x (Const64 [63])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64,c).m/2) && s == smagic(64,c).s-1 && x.Op != OpConst64 && sdivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Add64 (Mul64 (Const64 [int64(sdivisible(64,c).m)]) x) (Const64 [int64(sdivisible(64,c).a)]) ) (Const64 [int64(64-sdivisible(64,c).k)]) ) (Const64 [int64(sdivisible(64,c).max)]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpSub64 { - break - } - _ = v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh64x64 { - break - } - _ = v_0_1_0.Args[1] - mul := v_0_1_0.Args[0] - if mul.Op != OpHmul64 { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { - break - } - s := v_0_1_0_1.AuxInt - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpRsh64x64 { - break - } - _ = v_0_1_1.Args[1] - if x != v_0_1_1.Args[0] { - break - } - v_0_1_1_1 := v_0_1_1.Args[1] - if v_0_1_1_1.Op != OpConst64 || v_0_1_1_1.AuxInt != 63 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64, c).m/2) && s == smagic(64, c).s-1 && x.Op != OpConst64 && sdivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(sdivisible(64, c).m) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(sdivisible(64, c).a) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = int64(64 - sdivisible(64, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v6.AuxInt = int64(sdivisible(64, c).max) - v.AddArg(v6) - return true - } - // match: (Eq64 (Mul64 (Sub64 (Rsh64x64 mul:(Hmul64 (Const64 [m]) x) (Const64 [s])) (Rsh64x64 x (Const64 [63]))) (Const64 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64,c).m/2) && s == smagic(64,c).s-1 && x.Op != OpConst64 && sdivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Add64 (Mul64 (Const64 [int64(sdivisible(64,c).m)]) x) (Const64 [int64(sdivisible(64,c).a)]) ) (Const64 [int64(64-sdivisible(64,c).k)]) ) (Const64 [int64(sdivisible(64,c).max)]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSub64 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh64x64 { - break - } - _ = v_0_0_0.Args[1] - mul := v_0_0_0.Args[0] - if mul.Op != OpHmul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_0_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpRsh64x64 { - break - } - _ = v_0_0_1.Args[1] - if x != v_0_0_1.Args[0] { - break - } - v_0_0_1_1 := v_0_0_1.Args[1] - if v_0_0_1_1.Op != OpConst64 || v_0_0_1_1.AuxInt != 63 { - break - } - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64, c).m/2) && s == smagic(64, c).s-1 && x.Op != OpConst64 && sdivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(sdivisible(64, c).m) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(sdivisible(64, c).a) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = int64(64 - sdivisible(64, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v6.AuxInt = int64(sdivisible(64, c).max) - v.AddArg(v6) - return true - } - // match: (Eq64 (Mul64 (Sub64 (Rsh64x64 mul:(Hmul64 x (Const64 [m])) (Const64 [s])) (Rsh64x64 x (Const64 [63]))) (Const64 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64,c).m/2) && s == smagic(64,c).s-1 && x.Op != OpConst64 && sdivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Add64 (Mul64 (Const64 [int64(sdivisible(64,c).m)]) x) (Const64 [int64(sdivisible(64,c).a)]) ) (Const64 [int64(64-sdivisible(64,c).k)]) ) (Const64 [int64(sdivisible(64,c).max)]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSub64 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh64x64 { - break - } - _ = v_0_0_0.Args[1] - mul := v_0_0_0.Args[0] - if mul.Op != OpHmul64 { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_0_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpRsh64x64 { - break - } - _ = v_0_0_1.Args[1] - if x != v_0_0_1.Args[0] { - break - } - v_0_0_1_1 := v_0_0_1.Args[1] - if v_0_0_1_1.Op != OpConst64 || v_0_0_1_1.AuxInt != 63 { - break - } - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64, c).m/2) && s == smagic(64, c).s-1 && x.Op != OpConst64 && sdivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(sdivisible(64, c).m) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(sdivisible(64, c).a) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = int64(64 - sdivisible(64, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v6.AuxInt = int64(sdivisible(64, c).max) - v.AddArg(v6) - return true - } - // match: (Eq64 x (Mul64 (Const64 [c]) (Sub64 (Rsh64x64 (Add64 mul:(Hmul64 (Const64 [m]) x) x) (Const64 [s])) (Rsh64x64 x (Const64 [63]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64,c).m) && s == smagic(64,c).s && x.Op != OpConst64 && sdivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Add64 (Mul64 (Const64 [int64(sdivisible(64,c).m)]) x) (Const64 [int64(sdivisible(64,c).a)]) ) (Const64 [int64(64-sdivisible(64,c).k)]) ) (Const64 [int64(sdivisible(64,c).max)]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst64 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpSub64 { - break - } - _ = v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh64x64 { - break - } - _ = v_1_1_0.Args[1] - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAdd64 { - break - } - _ = v_1_1_0_0.Args[1] - mul := v_1_1_0_0.Args[0] - if mul.Op != OpHmul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] || x != v_1_1_0_0.Args[1] { - break - } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { - break - } - s := v_1_1_0_1.AuxInt - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpRsh64x64 { - break - } - _ = v_1_1_1.Args[1] - if x != v_1_1_1.Args[0] { - break - } - v_1_1_1_1 := v_1_1_1.Args[1] - if v_1_1_1_1.Op != OpConst64 || v_1_1_1_1.AuxInt != 63 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64, c).m) && s == smagic(64, c).s && x.Op != OpConst64 && sdivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(sdivisible(64, c).m) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(sdivisible(64, c).a) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = int64(64 - sdivisible(64, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v6.AuxInt = int64(sdivisible(64, c).max) - v.AddArg(v6) - return true - } - return false -} -func rewriteValuegeneric_OpEq64_40(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Eq64 x (Mul64 (Const64 [c]) (Sub64 (Rsh64x64 (Add64 mul:(Hmul64 x (Const64 [m])) x) (Const64 [s])) (Rsh64x64 x (Const64 [63]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64,c).m) && s == smagic(64,c).s && x.Op != OpConst64 && sdivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Add64 (Mul64 (Const64 [int64(sdivisible(64,c).m)]) x) (Const64 [int64(sdivisible(64,c).a)]) ) (Const64 [int64(64-sdivisible(64,c).k)]) ) (Const64 [int64(sdivisible(64,c).max)]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst64 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpSub64 { - break - } - _ = v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh64x64 { - break - } - _ = v_1_1_0.Args[1] - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAdd64 { - break - } - _ = v_1_1_0_0.Args[1] - mul := v_1_1_0_0.Args[0] - if mul.Op != OpHmul64 { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - if x != v_1_1_0_0.Args[1] { - break - } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { - break - } - s := v_1_1_0_1.AuxInt - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpRsh64x64 { - break - } - _ = v_1_1_1.Args[1] - if x != v_1_1_1.Args[0] { - break - } - v_1_1_1_1 := v_1_1_1.Args[1] - if v_1_1_1_1.Op != OpConst64 || v_1_1_1_1.AuxInt != 63 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64, c).m) && s == smagic(64, c).s && x.Op != OpConst64 && sdivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(sdivisible(64, c).m) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(sdivisible(64, c).a) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = int64(64 - sdivisible(64, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v6.AuxInt = int64(sdivisible(64, c).max) - v.AddArg(v6) - return true - } - // match: (Eq64 x (Mul64 (Const64 [c]) (Sub64 (Rsh64x64 (Add64 x mul:(Hmul64 (Const64 [m]) x)) (Const64 [s])) (Rsh64x64 x (Const64 [63]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64,c).m) && s == smagic(64,c).s && x.Op != OpConst64 && sdivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Add64 (Mul64 (Const64 [int64(sdivisible(64,c).m)]) x) (Const64 [int64(sdivisible(64,c).a)]) ) (Const64 [int64(64-sdivisible(64,c).k)]) ) (Const64 [int64(sdivisible(64,c).max)]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst64 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpSub64 { - break - } - _ = v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh64x64 { - break - } - _ = v_1_1_0.Args[1] - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAdd64 { - break - } - _ = v_1_1_0_0.Args[1] - if x != v_1_1_0_0.Args[0] { - break - } - mul := v_1_1_0_0.Args[1] - if mul.Op != OpHmul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { - break - } - s := v_1_1_0_1.AuxInt - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpRsh64x64 { - break - } - _ = v_1_1_1.Args[1] - if x != v_1_1_1.Args[0] { - break - } - v_1_1_1_1 := v_1_1_1.Args[1] - if v_1_1_1_1.Op != OpConst64 || v_1_1_1_1.AuxInt != 63 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64, c).m) && s == smagic(64, c).s && x.Op != OpConst64 && sdivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(sdivisible(64, c).m) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(sdivisible(64, c).a) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = int64(64 - sdivisible(64, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v6.AuxInt = int64(sdivisible(64, c).max) - v.AddArg(v6) - return true - } - // match: (Eq64 x (Mul64 (Const64 [c]) (Sub64 (Rsh64x64 (Add64 x mul:(Hmul64 x (Const64 [m]))) (Const64 [s])) (Rsh64x64 x (Const64 [63]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64,c).m) && s == smagic(64,c).s && x.Op != OpConst64 && sdivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Add64 (Mul64 (Const64 [int64(sdivisible(64,c).m)]) x) (Const64 [int64(sdivisible(64,c).a)]) ) (Const64 [int64(64-sdivisible(64,c).k)]) ) (Const64 [int64(sdivisible(64,c).max)]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst64 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpSub64 { - break - } - _ = v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh64x64 { - break - } - _ = v_1_1_0.Args[1] - v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAdd64 { - break - } - _ = v_1_1_0_0.Args[1] - if x != v_1_1_0_0.Args[0] { - break - } - mul := v_1_1_0_0.Args[1] - if mul.Op != OpHmul64 { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { - break - } - s := v_1_1_0_1.AuxInt - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpRsh64x64 { - break - } - _ = v_1_1_1.Args[1] - if x != v_1_1_1.Args[0] { - break - } - v_1_1_1_1 := v_1_1_1.Args[1] - if v_1_1_1_1.Op != OpConst64 || v_1_1_1_1.AuxInt != 63 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64, c).m) && s == smagic(64, c).s && x.Op != OpConst64 && sdivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(sdivisible(64, c).m) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(sdivisible(64, c).a) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = int64(64 - sdivisible(64, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v6.AuxInt = int64(sdivisible(64, c).max) - v.AddArg(v6) - return true - } - // match: (Eq64 x (Mul64 (Sub64 (Rsh64x64 (Add64 mul:(Hmul64 (Const64 [m]) x) x) (Const64 [s])) (Rsh64x64 x (Const64 [63]))) (Const64 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64,c).m) && s == smagic(64,c).s && x.Op != OpConst64 && sdivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Add64 (Mul64 (Const64 [int64(sdivisible(64,c).m)]) x) (Const64 [int64(sdivisible(64,c).a)]) ) (Const64 [int64(64-sdivisible(64,c).k)]) ) (Const64 [int64(sdivisible(64,c).max)]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpSub64 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh64x64 { - break - } - _ = v_1_0_0.Args[1] - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpAdd64 { - break - } - _ = v_1_0_0_0.Args[1] - mul := v_1_0_0_0.Args[0] - if mul.Op != OpHmul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] || x != v_1_0_0_0.Args[1] { - break - } - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { - break - } - s := v_1_0_0_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpRsh64x64 { - break - } - _ = v_1_0_1.Args[1] - if x != v_1_0_1.Args[0] { - break - } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpConst64 || v_1_0_1_1.AuxInt != 63 { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64, c).m) && s == smagic(64, c).s && x.Op != OpConst64 && sdivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(sdivisible(64, c).m) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(sdivisible(64, c).a) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = int64(64 - sdivisible(64, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v6.AuxInt = int64(sdivisible(64, c).max) - v.AddArg(v6) - return true - } - // match: (Eq64 x (Mul64 (Sub64 (Rsh64x64 (Add64 mul:(Hmul64 x (Const64 [m])) x) (Const64 [s])) (Rsh64x64 x (Const64 [63]))) (Const64 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64,c).m) && s == smagic(64,c).s && x.Op != OpConst64 && sdivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Add64 (Mul64 (Const64 [int64(sdivisible(64,c).m)]) x) (Const64 [int64(sdivisible(64,c).a)]) ) (Const64 [int64(64-sdivisible(64,c).k)]) ) (Const64 [int64(sdivisible(64,c).max)]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpSub64 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh64x64 { - break - } - _ = v_1_0_0.Args[1] - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpAdd64 { - break - } - _ = v_1_0_0_0.Args[1] - mul := v_1_0_0_0.Args[0] - if mul.Op != OpHmul64 { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - if x != v_1_0_0_0.Args[1] { - break - } - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { - break - } - s := v_1_0_0_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpRsh64x64 { - break - } - _ = v_1_0_1.Args[1] - if x != v_1_0_1.Args[0] { - break - } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpConst64 || v_1_0_1_1.AuxInt != 63 { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64, c).m) && s == smagic(64, c).s && x.Op != OpConst64 && sdivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(sdivisible(64, c).m) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(sdivisible(64, c).a) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = int64(64 - sdivisible(64, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v6.AuxInt = int64(sdivisible(64, c).max) - v.AddArg(v6) - return true - } - // match: (Eq64 x (Mul64 (Sub64 (Rsh64x64 (Add64 x mul:(Hmul64 (Const64 [m]) x)) (Const64 [s])) (Rsh64x64 x (Const64 [63]))) (Const64 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64,c).m) && s == smagic(64,c).s && x.Op != OpConst64 && sdivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Add64 (Mul64 (Const64 [int64(sdivisible(64,c).m)]) x) (Const64 [int64(sdivisible(64,c).a)]) ) (Const64 [int64(64-sdivisible(64,c).k)]) ) (Const64 [int64(sdivisible(64,c).max)]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpSub64 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh64x64 { - break - } - _ = v_1_0_0.Args[1] - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpAdd64 { - break - } - _ = v_1_0_0_0.Args[1] - if x != v_1_0_0_0.Args[0] { - break - } - mul := v_1_0_0_0.Args[1] - if mul.Op != OpHmul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { - break - } - s := v_1_0_0_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpRsh64x64 { - break - } - _ = v_1_0_1.Args[1] - if x != v_1_0_1.Args[0] { - break - } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpConst64 || v_1_0_1_1.AuxInt != 63 { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64, c).m) && s == smagic(64, c).s && x.Op != OpConst64 && sdivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(sdivisible(64, c).m) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(sdivisible(64, c).a) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = int64(64 - sdivisible(64, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v6.AuxInt = int64(sdivisible(64, c).max) - v.AddArg(v6) - return true - } - // match: (Eq64 x (Mul64 (Sub64 (Rsh64x64 (Add64 x mul:(Hmul64 x (Const64 [m]))) (Const64 [s])) (Rsh64x64 x (Const64 [63]))) (Const64 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64,c).m) && s == smagic(64,c).s && x.Op != OpConst64 && sdivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Add64 (Mul64 (Const64 [int64(sdivisible(64,c).m)]) x) (Const64 [int64(sdivisible(64,c).a)]) ) (Const64 [int64(64-sdivisible(64,c).k)]) ) (Const64 [int64(sdivisible(64,c).max)]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpSub64 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh64x64 { - break - } - _ = v_1_0_0.Args[1] - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpAdd64 { - break - } - _ = v_1_0_0_0.Args[1] - if x != v_1_0_0_0.Args[0] { - break - } - mul := v_1_0_0_0.Args[1] - if mul.Op != OpHmul64 { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { - break - } - s := v_1_0_0_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpRsh64x64 { - break - } - _ = v_1_0_1.Args[1] - if x != v_1_0_1.Args[0] { - break - } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpConst64 || v_1_0_1_1.AuxInt != 63 { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64, c).m) && s == smagic(64, c).s && x.Op != OpConst64 && sdivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(sdivisible(64, c).m) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(sdivisible(64, c).a) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = int64(64 - sdivisible(64, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v6.AuxInt = int64(sdivisible(64, c).max) - v.AddArg(v6) - return true - } - // match: (Eq64 (Mul64 (Const64 [c]) (Sub64 (Rsh64x64 (Add64 mul:(Hmul64 (Const64 [m]) x) x) (Const64 [s])) (Rsh64x64 x (Const64 [63])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64,c).m) && s == smagic(64,c).s && x.Op != OpConst64 && sdivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Add64 (Mul64 (Const64 [int64(sdivisible(64,c).m)]) x) (Const64 [int64(sdivisible(64,c).a)]) ) (Const64 [int64(64-sdivisible(64,c).k)]) ) (Const64 [int64(sdivisible(64,c).max)]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpSub64 { - break - } - _ = v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh64x64 { - break - } - _ = v_0_1_0.Args[1] - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpAdd64 { - break - } - _ = v_0_1_0_0.Args[1] - mul := v_0_1_0_0.Args[0] - if mul.Op != OpHmul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] || x != v_0_1_0_0.Args[1] { - break - } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { - break - } - s := v_0_1_0_1.AuxInt - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpRsh64x64 { - break - } - _ = v_0_1_1.Args[1] - if x != v_0_1_1.Args[0] { - break - } - v_0_1_1_1 := v_0_1_1.Args[1] - if v_0_1_1_1.Op != OpConst64 || v_0_1_1_1.AuxInt != 63 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64, c).m) && s == smagic(64, c).s && x.Op != OpConst64 && sdivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(sdivisible(64, c).m) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(sdivisible(64, c).a) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = int64(64 - sdivisible(64, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v6.AuxInt = int64(sdivisible(64, c).max) - v.AddArg(v6) - return true - } - // match: (Eq64 (Mul64 (Const64 [c]) (Sub64 (Rsh64x64 (Add64 mul:(Hmul64 x (Const64 [m])) x) (Const64 [s])) (Rsh64x64 x (Const64 [63])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64,c).m) && s == smagic(64,c).s && x.Op != OpConst64 && sdivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Add64 (Mul64 (Const64 [int64(sdivisible(64,c).m)]) x) (Const64 [int64(sdivisible(64,c).a)]) ) (Const64 [int64(64-sdivisible(64,c).k)]) ) (Const64 [int64(sdivisible(64,c).max)]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpSub64 { - break - } - _ = v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh64x64 { - break - } - _ = v_0_1_0.Args[1] - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpAdd64 { - break - } - _ = v_0_1_0_0.Args[1] - mul := v_0_1_0_0.Args[0] - if mul.Op != OpHmul64 { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - if x != v_0_1_0_0.Args[1] { - break - } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { - break - } - s := v_0_1_0_1.AuxInt - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpRsh64x64 { - break - } - _ = v_0_1_1.Args[1] - if x != v_0_1_1.Args[0] { - break - } - v_0_1_1_1 := v_0_1_1.Args[1] - if v_0_1_1_1.Op != OpConst64 || v_0_1_1_1.AuxInt != 63 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64, c).m) && s == smagic(64, c).s && x.Op != OpConst64 && sdivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(sdivisible(64, c).m) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(sdivisible(64, c).a) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = int64(64 - sdivisible(64, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v6.AuxInt = int64(sdivisible(64, c).max) - v.AddArg(v6) - return true - } - // match: (Eq64 (Mul64 (Const64 [c]) (Sub64 (Rsh64x64 (Add64 x mul:(Hmul64 (Const64 [m]) x)) (Const64 [s])) (Rsh64x64 x (Const64 [63])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64,c).m) && s == smagic(64,c).s && x.Op != OpConst64 && sdivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Add64 (Mul64 (Const64 [int64(sdivisible(64,c).m)]) x) (Const64 [int64(sdivisible(64,c).a)]) ) (Const64 [int64(64-sdivisible(64,c).k)]) ) (Const64 [int64(sdivisible(64,c).max)]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpSub64 { - break - } - _ = v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh64x64 { - break - } - _ = v_0_1_0.Args[1] - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpAdd64 { - break - } - _ = v_0_1_0_0.Args[1] - if x != v_0_1_0_0.Args[0] { - break - } - mul := v_0_1_0_0.Args[1] - if mul.Op != OpHmul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { - break - } - s := v_0_1_0_1.AuxInt - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpRsh64x64 { - break - } - _ = v_0_1_1.Args[1] - if x != v_0_1_1.Args[0] { - break - } - v_0_1_1_1 := v_0_1_1.Args[1] - if v_0_1_1_1.Op != OpConst64 || v_0_1_1_1.AuxInt != 63 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64, c).m) && s == smagic(64, c).s && x.Op != OpConst64 && sdivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(sdivisible(64, c).m) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(sdivisible(64, c).a) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = int64(64 - sdivisible(64, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v6.AuxInt = int64(sdivisible(64, c).max) - v.AddArg(v6) - return true - } - return false -} -func rewriteValuegeneric_OpEq64_50(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Eq64 (Mul64 (Const64 [c]) (Sub64 (Rsh64x64 (Add64 x mul:(Hmul64 x (Const64 [m]))) (Const64 [s])) (Rsh64x64 x (Const64 [63])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64,c).m) && s == smagic(64,c).s && x.Op != OpConst64 && sdivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Add64 (Mul64 (Const64 [int64(sdivisible(64,c).m)]) x) (Const64 [int64(sdivisible(64,c).a)]) ) (Const64 [int64(64-sdivisible(64,c).k)]) ) (Const64 [int64(sdivisible(64,c).max)]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpSub64 { - break - } - _ = v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh64x64 { - break - } - _ = v_0_1_0.Args[1] - v_0_1_0_0 := v_0_1_0.Args[0] - if v_0_1_0_0.Op != OpAdd64 { - break - } - _ = v_0_1_0_0.Args[1] - if x != v_0_1_0_0.Args[0] { - break - } - mul := v_0_1_0_0.Args[1] - if mul.Op != OpHmul64 { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { - break - } - s := v_0_1_0_1.AuxInt - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpRsh64x64 { - break - } - _ = v_0_1_1.Args[1] - if x != v_0_1_1.Args[0] { - break - } - v_0_1_1_1 := v_0_1_1.Args[1] - if v_0_1_1_1.Op != OpConst64 || v_0_1_1_1.AuxInt != 63 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64, c).m) && s == smagic(64, c).s && x.Op != OpConst64 && sdivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(sdivisible(64, c).m) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(sdivisible(64, c).a) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = int64(64 - sdivisible(64, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v6.AuxInt = int64(sdivisible(64, c).max) - v.AddArg(v6) - return true - } - // match: (Eq64 (Mul64 (Sub64 (Rsh64x64 (Add64 mul:(Hmul64 (Const64 [m]) x) x) (Const64 [s])) (Rsh64x64 x (Const64 [63]))) (Const64 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64,c).m) && s == smagic(64,c).s && x.Op != OpConst64 && sdivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Add64 (Mul64 (Const64 [int64(sdivisible(64,c).m)]) x) (Const64 [int64(sdivisible(64,c).a)]) ) (Const64 [int64(64-sdivisible(64,c).k)]) ) (Const64 [int64(sdivisible(64,c).max)]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSub64 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh64x64 { - break - } - _ = v_0_0_0.Args[1] - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpAdd64 { - break - } - _ = v_0_0_0_0.Args[1] - mul := v_0_0_0_0.Args[0] - if mul.Op != OpHmul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] || x != v_0_0_0_0.Args[1] { - break - } - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_0_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpRsh64x64 { - break - } - _ = v_0_0_1.Args[1] - if x != v_0_0_1.Args[0] { - break - } - v_0_0_1_1 := v_0_0_1.Args[1] - if v_0_0_1_1.Op != OpConst64 || v_0_0_1_1.AuxInt != 63 { - break - } - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64, c).m) && s == smagic(64, c).s && x.Op != OpConst64 && sdivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(sdivisible(64, c).m) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(sdivisible(64, c).a) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = int64(64 - sdivisible(64, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v6.AuxInt = int64(sdivisible(64, c).max) - v.AddArg(v6) - return true - } - // match: (Eq64 (Mul64 (Sub64 (Rsh64x64 (Add64 mul:(Hmul64 x (Const64 [m])) x) (Const64 [s])) (Rsh64x64 x (Const64 [63]))) (Const64 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64,c).m) && s == smagic(64,c).s && x.Op != OpConst64 && sdivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Add64 (Mul64 (Const64 [int64(sdivisible(64,c).m)]) x) (Const64 [int64(sdivisible(64,c).a)]) ) (Const64 [int64(64-sdivisible(64,c).k)]) ) (Const64 [int64(sdivisible(64,c).max)]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSub64 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh64x64 { - break - } - _ = v_0_0_0.Args[1] - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpAdd64 { - break - } - _ = v_0_0_0_0.Args[1] - mul := v_0_0_0_0.Args[0] - if mul.Op != OpHmul64 { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - if x != v_0_0_0_0.Args[1] { - break - } - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_0_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpRsh64x64 { - break - } - _ = v_0_0_1.Args[1] - if x != v_0_0_1.Args[0] { - break - } - v_0_0_1_1 := v_0_0_1.Args[1] - if v_0_0_1_1.Op != OpConst64 || v_0_0_1_1.AuxInt != 63 { - break - } - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64, c).m) && s == smagic(64, c).s && x.Op != OpConst64 && sdivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(sdivisible(64, c).m) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(sdivisible(64, c).a) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = int64(64 - sdivisible(64, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v6.AuxInt = int64(sdivisible(64, c).max) - v.AddArg(v6) - return true - } - // match: (Eq64 (Mul64 (Sub64 (Rsh64x64 (Add64 x mul:(Hmul64 (Const64 [m]) x)) (Const64 [s])) (Rsh64x64 x (Const64 [63]))) (Const64 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64,c).m) && s == smagic(64,c).s && x.Op != OpConst64 && sdivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Add64 (Mul64 (Const64 [int64(sdivisible(64,c).m)]) x) (Const64 [int64(sdivisible(64,c).a)]) ) (Const64 [int64(64-sdivisible(64,c).k)]) ) (Const64 [int64(sdivisible(64,c).max)]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSub64 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh64x64 { - break - } - _ = v_0_0_0.Args[1] - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpAdd64 { - break - } - _ = v_0_0_0_0.Args[1] - if x != v_0_0_0_0.Args[0] { - break - } - mul := v_0_0_0_0.Args[1] - if mul.Op != OpHmul64 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst64 { - break - } - m := mul_0.AuxInt - if x != mul.Args[1] { - break - } - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_0_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpRsh64x64 { - break - } - _ = v_0_0_1.Args[1] - if x != v_0_0_1.Args[0] { - break - } - v_0_0_1_1 := v_0_0_1.Args[1] - if v_0_0_1_1.Op != OpConst64 || v_0_0_1_1.AuxInt != 63 { - break - } - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64, c).m) && s == smagic(64, c).s && x.Op != OpConst64 && sdivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(sdivisible(64, c).m) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(sdivisible(64, c).a) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = int64(64 - sdivisible(64, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v6.AuxInt = int64(sdivisible(64, c).max) - v.AddArg(v6) - return true - } - // match: (Eq64 (Mul64 (Sub64 (Rsh64x64 (Add64 x mul:(Hmul64 x (Const64 [m]))) (Const64 [s])) (Rsh64x64 x (Const64 [63]))) (Const64 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64,c).m) && s == smagic(64,c).s && x.Op != OpConst64 && sdivisibleOK(64,c) - // result: (Leq64U (RotateLeft64 (Add64 (Mul64 (Const64 [int64(sdivisible(64,c).m)]) x) (Const64 [int64(sdivisible(64,c).a)]) ) (Const64 [int64(64-sdivisible(64,c).k)]) ) (Const64 [int64(sdivisible(64,c).max)]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSub64 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh64x64 { - break - } - _ = v_0_0_0.Args[1] - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpAdd64 { - break - } - _ = v_0_0_0_0.Args[1] - if x != v_0_0_0_0.Args[0] { - break - } - mul := v_0_0_0_0.Args[1] - if mul.Op != OpHmul64 { - break - } - _ = mul.Args[1] - if x != mul.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst64 { - break - } - m := mul_1.AuxInt - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_0_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpRsh64x64 { - break - } - _ = v_0_0_1.Args[1] - if x != v_0_0_1.Args[0] { - break - } - v_0_0_1_1 := v_0_0_1.Args[1] - if v_0_0_1_1.Op != OpConst64 || v_0_0_1_1.AuxInt != 63 { - break - } - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(64, c).m) && s == smagic(64, c).s && x.Op != OpConst64 && sdivisibleOK(64, c)) { - break - } - v.reset(OpLeq64U) - v0 := b.NewValue0(v.Pos, OpRotateLeft64, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpAdd64, typ.UInt64) - v2 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v3.AuxInt = int64(sdivisible(64, c).m) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v4.AuxInt = int64(sdivisible(64, c).a) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v5.AuxInt = int64(64 - sdivisible(64, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v6.AuxInt = int64(sdivisible(64, c).max) - v.AddArg(v6) - return true - } - // match: (Eq64 n (Lsh64x64 (Rsh64x64 (Add64 n (Rsh64Ux64 (Rsh64x64 n (Const64 [63])) (Const64 [kbar]))) (Const64 [k])) (Const64 [k]))) - // cond: k > 0 && k < 63 && kbar == 64 - k - // result: (Eq64 (And64 n (Const64 [int64(1< [0])) - for { - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpLsh64x64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpRsh64x64 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAdd64 { - break - } - t := v_1_0_0.Type - _ = v_1_0_0.Args[1] - if n != v_1_0_0.Args[0] { - break - } - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpRsh64Ux64 || v_1_0_0_1.Type != t { - break - } - _ = v_1_0_0_1.Args[1] - v_1_0_0_1_0 := v_1_0_0_1.Args[0] - if v_1_0_0_1_0.Op != OpRsh64x64 || v_1_0_0_1_0.Type != t { - break - } - _ = v_1_0_0_1_0.Args[1] - if n != v_1_0_0_1_0.Args[0] { - break - } - v_1_0_0_1_0_1 := v_1_0_0_1_0.Args[1] - if v_1_0_0_1_0_1.Op != OpConst64 || v_1_0_0_1_0_1.Type != typ.UInt64 || v_1_0_0_1_0_1.AuxInt != 63 { - break - } - v_1_0_0_1_1 := v_1_0_0_1.Args[1] - if v_1_0_0_1_1.Op != OpConst64 || v_1_0_0_1_1.Type != typ.UInt64 { - break - } - kbar := v_1_0_0_1_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 { - break - } - k := v_1_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || v_1_1.AuxInt != k || !(k > 0 && k < 63 && kbar == 64-k) { - break - } - v.reset(OpEq64) - v0 := b.NewValue0(v.Pos, OpAnd64, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst64, t) - v1.AuxInt = int64(1< (Rsh64Ux64 (Rsh64x64 n (Const64 [63])) (Const64 [kbar])) n) (Const64 [k])) (Const64 [k]))) - // cond: k > 0 && k < 63 && kbar == 64 - k - // result: (Eq64 (And64 n (Const64 [int64(1< [0])) - for { - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpLsh64x64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpRsh64x64 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAdd64 { - break - } - t := v_1_0_0.Type - _ = v_1_0_0.Args[1] - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpRsh64Ux64 || v_1_0_0_0.Type != t { - break - } - _ = v_1_0_0_0.Args[1] - v_1_0_0_0_0 := v_1_0_0_0.Args[0] - if v_1_0_0_0_0.Op != OpRsh64x64 || v_1_0_0_0_0.Type != t { - break - } - _ = v_1_0_0_0_0.Args[1] - if n != v_1_0_0_0_0.Args[0] { - break - } - v_1_0_0_0_0_1 := v_1_0_0_0_0.Args[1] - if v_1_0_0_0_0_1.Op != OpConst64 || v_1_0_0_0_0_1.Type != typ.UInt64 || v_1_0_0_0_0_1.AuxInt != 63 { - break - } - v_1_0_0_0_1 := v_1_0_0_0.Args[1] - if v_1_0_0_0_1.Op != OpConst64 || v_1_0_0_0_1.Type != typ.UInt64 { - break - } - kbar := v_1_0_0_0_1.AuxInt - if n != v_1_0_0.Args[1] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 { - break - } - k := v_1_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || v_1_1.AuxInt != k || !(k > 0 && k < 63 && kbar == 64-k) { - break - } - v.reset(OpEq64) - v0 := b.NewValue0(v.Pos, OpAnd64, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst64, t) - v1.AuxInt = int64(1< n (Rsh64Ux64 (Rsh64x64 n (Const64 [63])) (Const64 [kbar]))) (Const64 [k])) (Const64 [k])) n) - // cond: k > 0 && k < 63 && kbar == 64 - k - // result: (Eq64 (And64 n (Const64 [int64(1< [0])) - for { - n := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh64x64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh64x64 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAdd64 { - break - } - t := v_0_0_0.Type - _ = v_0_0_0.Args[1] - if n != v_0_0_0.Args[0] { - break - } - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpRsh64Ux64 || v_0_0_0_1.Type != t { - break - } - _ = v_0_0_0_1.Args[1] - v_0_0_0_1_0 := v_0_0_0_1.Args[0] - if v_0_0_0_1_0.Op != OpRsh64x64 || v_0_0_0_1_0.Type != t { - break - } - _ = v_0_0_0_1_0.Args[1] - if n != v_0_0_0_1_0.Args[0] { - break - } - v_0_0_0_1_0_1 := v_0_0_0_1_0.Args[1] - if v_0_0_0_1_0_1.Op != OpConst64 || v_0_0_0_1_0_1.Type != typ.UInt64 || v_0_0_0_1_0_1.AuxInt != 63 { - break - } - v_0_0_0_1_1 := v_0_0_0_1.Args[1] - if v_0_0_0_1_1.Op != OpConst64 || v_0_0_0_1_1.Type != typ.UInt64 { - break - } - kbar := v_0_0_0_1_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 || v_0_0_1.Type != typ.UInt64 { - break - } - k := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.Type != typ.UInt64 || v_0_1.AuxInt != k || !(k > 0 && k < 63 && kbar == 64-k) { - break - } - v.reset(OpEq64) - v0 := b.NewValue0(v.Pos, OpAnd64, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst64, t) - v1.AuxInt = int64(1< (Rsh64Ux64 (Rsh64x64 n (Const64 [63])) (Const64 [kbar])) n) (Const64 [k])) (Const64 [k])) n) - // cond: k > 0 && k < 63 && kbar == 64 - k - // result: (Eq64 (And64 n (Const64 [int64(1< [0])) - for { - n := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh64x64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh64x64 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAdd64 { - break - } - t := v_0_0_0.Type - _ = v_0_0_0.Args[1] - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpRsh64Ux64 || v_0_0_0_0.Type != t { - break - } - _ = v_0_0_0_0.Args[1] - v_0_0_0_0_0 := v_0_0_0_0.Args[0] - if v_0_0_0_0_0.Op != OpRsh64x64 || v_0_0_0_0_0.Type != t { - break - } - _ = v_0_0_0_0_0.Args[1] - if n != v_0_0_0_0_0.Args[0] { - break - } - v_0_0_0_0_0_1 := v_0_0_0_0_0.Args[1] - if v_0_0_0_0_0_1.Op != OpConst64 || v_0_0_0_0_0_1.Type != typ.UInt64 || v_0_0_0_0_0_1.AuxInt != 63 { - break - } - v_0_0_0_0_1 := v_0_0_0_0.Args[1] - if v_0_0_0_0_1.Op != OpConst64 || v_0_0_0_0_1.Type != typ.UInt64 { - break - } - kbar := v_0_0_0_0_1.AuxInt - if n != v_0_0_0.Args[1] { - break - } - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 || v_0_0_1.Type != typ.UInt64 { - break - } - k := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.Type != typ.UInt64 || v_0_1.AuxInt != k || !(k > 0 && k < 63 && kbar == 64-k) { - break - } - v.reset(OpEq64) - v0 := b.NewValue0(v.Pos, OpAnd64, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst64, t) - v1.AuxInt = int64(1< x (Const64 [y])) (Const64 [y])) - // cond: isPowerOfTwo(y) - // result: (Neq64 (And64 x (Const64 [y])) (Const64 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd64 { - break - } - t := v_0.Type - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.Type != t { - break - } - y := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.Type != t || v_1.AuxInt != y || !(isPowerOfTwo(y)) { - break - } - v.reset(OpNeq64) - v0 := b.NewValue0(v.Pos, OpAnd64, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst64, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst64, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true - } - // match: (Eq64 (And64 (Const64 [y]) x) (Const64 [y])) - // cond: isPowerOfTwo(y) - // result: (Neq64 (And64 x (Const64 [y])) (Const64 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd64 { - break - } - t := v_0.Type - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 || v_0_0.Type != t { - break - } - y := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.Type != t || v_1.AuxInt != y || !(isPowerOfTwo(y)) { - break - } - v.reset(OpNeq64) - v0 := b.NewValue0(v.Pos, OpAnd64, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst64, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst64, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true - } - // match: (Eq64 (Const64 [y]) (And64 x (Const64 [y]))) - // cond: isPowerOfTwo(y) - // result: (Neq64 (And64 x (Const64 [y])) (Const64 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - t := v_0.Type - y := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAnd64 || v_1.Type != t { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != t || v_1_1.AuxInt != y || !(isPowerOfTwo(y)) { - break - } - v.reset(OpNeq64) - v0 := b.NewValue0(v.Pos, OpAnd64, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst64, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst64, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true - } - // match: (Eq64 (Const64 [y]) (And64 (Const64 [y]) x)) - // cond: isPowerOfTwo(y) - // result: (Neq64 (And64 x (Const64 [y])) (Const64 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - t := v_0.Type - y := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAnd64 || v_1.Type != t { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst64 || v_1_0.Type != t || v_1_0.AuxInt != y || !(isPowerOfTwo(y)) { - break - } - v.reset(OpNeq64) - v0 := b.NewValue0(v.Pos, OpAnd64, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst64, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst64, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true - } - return false -} -func rewriteValuegeneric_OpEq64F_0(v *Value) bool { - // match: (Eq64F (Const64F [c]) (Const64F [d])) - // result: (ConstBool [b2i(auxTo64F(c) == auxTo64F(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64F { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64F { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(auxTo64F(c) == auxTo64F(d)) - return true - } - // match: (Eq64F (Const64F [d]) (Const64F [c])) - // result: (ConstBool [b2i(auxTo64F(c) == auxTo64F(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64F { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64F { - break - } - c := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(auxTo64F(c) == auxTo64F(d)) - return true - } - return false -} -func rewriteValuegeneric_OpEq8_0(v *Value) bool { - b := v.Block - config := b.Func.Config - typ := &b.Func.Config.Types - // match: (Eq8 x x) - // result: (ConstBool [1]) - for { - x := v.Args[1] - if x != v.Args[0] { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (Eq8 (Const8 [c]) (Add8 (Const8 [d]) x)) - // result: (Eq8 (Const8 [int64(int8(c-d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAdd8 { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst8 || v_1_0.Type != t { - break - } - d := v_1_0.AuxInt - v.reset(OpEq8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c - d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Eq8 (Const8 [c]) (Add8 x (Const8 [d]))) - // result: (Eq8 (Const8 [int64(int8(c-d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAdd8 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst8 || v_1_1.Type != t { - break - } - d := v_1_1.AuxInt - v.reset(OpEq8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c - d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Eq8 (Add8 (Const8 [d]) x) (Const8 [c])) - // result: (Eq8 (Const8 [int64(int8(c-d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd8 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst8 { - break - } - t := v_0_0.Type - d := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpEq8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c - d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Eq8 (Add8 x (Const8 [d])) (Const8 [c])) - // result: (Eq8 (Const8 [int64(int8(c-d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd8 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst8 { - break - } - t := v_0_1.Type - d := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpEq8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c - d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Eq8 (Const8 [c]) (Const8 [d])) - // result: (ConstBool [b2i(c == d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c == d) - return true - } - // match: (Eq8 (Const8 [d]) (Const8 [c])) - // result: (ConstBool [b2i(c == d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break - } - c := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c == d) - return true - } - // match: (Eq8 (Mod8u x (Const8 [c])) (Const8 [0])) - // cond: x.Op != OpConst8 && udivisibleOK(8,c) && !hasSmallRotate(config) - // result: (Eq32 (Mod32u (ZeroExt8to32 x) (Const32 [c&0xff])) (Const32 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMod8u { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst8 { - break - } - c := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.AuxInt != 0 || !(x.Op != OpConst8 && udivisibleOK(8, c) && !hasSmallRotate(config)) { - break - } - v.reset(OpEq32) - v0 := b.NewValue0(v.Pos, OpMod32u, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) - v1.AddArg(x) - v0.AddArg(v1) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = c & 0xff - v0.AddArg(v2) - v.AddArg(v0) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = 0 - v.AddArg(v3) - return true - } - // match: (Eq8 (Const8 [0]) (Mod8u x (Const8 [c]))) - // cond: x.Op != OpConst8 && udivisibleOK(8,c) && !hasSmallRotate(config) - // result: (Eq32 (Mod32u (ZeroExt8to32 x) (Const32 [c&0xff])) (Const32 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 || v_0.AuxInt != 0 { - break - } - v_1 := v.Args[1] - if v_1.Op != OpMod8u { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst8 { - break - } - c := v_1_1.AuxInt - if !(x.Op != OpConst8 && udivisibleOK(8, c) && !hasSmallRotate(config)) { - break - } - v.reset(OpEq32) - v0 := b.NewValue0(v.Pos, OpMod32u, typ.UInt32) - v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) - v1.AddArg(x) - v0.AddArg(v1) - v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v2.AuxInt = c & 0xff - v0.AddArg(v2) - v.AddArg(v0) - v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) - v3.AuxInt = 0 - v.AddArg(v3) - return true - } - // match: (Eq8 (Mod8 x (Const8 [c])) (Const8 [0])) - // cond: x.Op != OpConst8 && sdivisibleOK(8,c) && !hasSmallRotate(config) - // result: (Eq32 (Mod32 (SignExt8to32 x) (Const32 [c])) (Const32 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMod8 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst8 { - break - } - c := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.AuxInt != 0 || !(x.Op != OpConst8 && sdivisibleOK(8, c) && !hasSmallRotate(config)) { - break - } - v.reset(OpEq32) - v0 := b.NewValue0(v.Pos, OpMod32, typ.Int32) - v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) - v1.AddArg(x) - v0.AddArg(v1) - v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32) - v2.AuxInt = c - v0.AddArg(v2) - v.AddArg(v0) - v3 := b.NewValue0(v.Pos, OpConst32, typ.Int32) - v3.AuxInt = 0 - v.AddArg(v3) - return true - } - return false -} -func rewriteValuegeneric_OpEq8_10(v *Value) bool { - b := v.Block - config := b.Func.Config - typ := &b.Func.Config.Types - // match: (Eq8 (Const8 [0]) (Mod8 x (Const8 [c]))) - // cond: x.Op != OpConst8 && sdivisibleOK(8,c) && !hasSmallRotate(config) - // result: (Eq32 (Mod32 (SignExt8to32 x) (Const32 [c])) (Const32 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 || v_0.AuxInt != 0 { - break - } - v_1 := v.Args[1] - if v_1.Op != OpMod8 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst8 { - break - } - c := v_1_1.AuxInt - if !(x.Op != OpConst8 && sdivisibleOK(8, c) && !hasSmallRotate(config)) { - break - } - v.reset(OpEq32) - v0 := b.NewValue0(v.Pos, OpMod32, typ.Int32) - v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) - v1.AddArg(x) - v0.AddArg(v1) - v2 := b.NewValue0(v.Pos, OpConst32, typ.Int32) - v2.AuxInt = c - v0.AddArg(v2) - v.AddArg(v0) - v3 := b.NewValue0(v.Pos, OpConst32, typ.Int32) - v3.AuxInt = 0 - v.AddArg(v3) - return true - } - // match: (Eq8 x (Mul8 (Const8 [c]) (Trunc32to8 (Rsh32Ux64 mul:(Mul32 (Const32 [m]) (ZeroExt8to32 x)) (Const64 [s]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<8+umagic(8,c).m) && s == 8+umagic(8,c).s && x.Op != OpConst8 && udivisibleOK(8,c) - // result: (Leq8U (RotateLeft8 (Mul8 (Const8 [int64(int8(udivisible(8,c).m))]) x) (Const8 [int64(8-udivisible(8,c).k)]) ) (Const8 [int64(int8(udivisible(8,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul8 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst8 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpTrunc32to8 { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh32Ux64 { - break - } - _ = v_1_1_0.Args[1] - mul := v_1_1_0.Args[0] - if mul.Op != OpMul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpZeroExt8to32 || x != mul_1.Args[0] { - break - } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { - break - } - s := v_1_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<8+umagic(8, c).m) && s == 8+umagic(8, c).s && x.Op != OpConst8 && udivisibleOK(8, c)) { - break - } - v.reset(OpLeq8U) - v0 := b.NewValue0(v.Pos, OpRotateLeft8, typ.UInt8) - v1 := b.NewValue0(v.Pos, OpMul8, typ.UInt8) - v2 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v2.AuxInt = int64(int8(udivisible(8, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v3.AuxInt = int64(8 - udivisible(8, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v4.AuxInt = int64(int8(udivisible(8, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq8 x (Mul8 (Const8 [c]) (Trunc32to8 (Rsh32Ux64 mul:(Mul32 (ZeroExt8to32 x) (Const32 [m])) (Const64 [s]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<8+umagic(8,c).m) && s == 8+umagic(8,c).s && x.Op != OpConst8 && udivisibleOK(8,c) - // result: (Leq8U (RotateLeft8 (Mul8 (Const8 [int64(int8(udivisible(8,c).m))]) x) (Const8 [int64(8-udivisible(8,c).k)]) ) (Const8 [int64(int8(udivisible(8,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul8 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst8 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpTrunc32to8 { - break - } - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh32Ux64 { - break - } - _ = v_1_1_0.Args[1] - mul := v_1_1_0.Args[0] - if mul.Op != OpMul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpZeroExt8to32 || x != mul_0.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { - break - } - m := mul_1.AuxInt - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { - break - } - s := v_1_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<8+umagic(8, c).m) && s == 8+umagic(8, c).s && x.Op != OpConst8 && udivisibleOK(8, c)) { - break - } - v.reset(OpLeq8U) - v0 := b.NewValue0(v.Pos, OpRotateLeft8, typ.UInt8) - v1 := b.NewValue0(v.Pos, OpMul8, typ.UInt8) - v2 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v2.AuxInt = int64(int8(udivisible(8, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v3.AuxInt = int64(8 - udivisible(8, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v4.AuxInt = int64(int8(udivisible(8, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq8 x (Mul8 (Trunc32to8 (Rsh32Ux64 mul:(Mul32 (Const32 [m]) (ZeroExt8to32 x)) (Const64 [s]))) (Const8 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<8+umagic(8,c).m) && s == 8+umagic(8,c).s && x.Op != OpConst8 && udivisibleOK(8,c) - // result: (Leq8U (RotateLeft8 (Mul8 (Const8 [int64(int8(udivisible(8,c).m))]) x) (Const8 [int64(8-udivisible(8,c).k)]) ) (Const8 [int64(int8(udivisible(8,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul8 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpTrunc32to8 { - break - } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh32Ux64 { - break - } - _ = v_1_0_0.Args[1] - mul := v_1_0_0.Args[0] - if mul.Op != OpMul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpZeroExt8to32 || x != mul_1.Args[0] { - break - } - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { - break - } - s := v_1_0_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst8 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<8+umagic(8, c).m) && s == 8+umagic(8, c).s && x.Op != OpConst8 && udivisibleOK(8, c)) { - break - } - v.reset(OpLeq8U) - v0 := b.NewValue0(v.Pos, OpRotateLeft8, typ.UInt8) - v1 := b.NewValue0(v.Pos, OpMul8, typ.UInt8) - v2 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v2.AuxInt = int64(int8(udivisible(8, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v3.AuxInt = int64(8 - udivisible(8, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v4.AuxInt = int64(int8(udivisible(8, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq8 x (Mul8 (Trunc32to8 (Rsh32Ux64 mul:(Mul32 (ZeroExt8to32 x) (Const32 [m])) (Const64 [s]))) (Const8 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<8+umagic(8,c).m) && s == 8+umagic(8,c).s && x.Op != OpConst8 && udivisibleOK(8,c) - // result: (Leq8U (RotateLeft8 (Mul8 (Const8 [int64(int8(udivisible(8,c).m))]) x) (Const8 [int64(8-udivisible(8,c).k)]) ) (Const8 [int64(int8(udivisible(8,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul8 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpTrunc32to8 { - break - } - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh32Ux64 { - break - } - _ = v_1_0_0.Args[1] - mul := v_1_0_0.Args[0] - if mul.Op != OpMul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpZeroExt8to32 || x != mul_0.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { - break - } - m := mul_1.AuxInt - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { - break - } - s := v_1_0_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst8 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<8+umagic(8, c).m) && s == 8+umagic(8, c).s && x.Op != OpConst8 && udivisibleOK(8, c)) { - break - } - v.reset(OpLeq8U) - v0 := b.NewValue0(v.Pos, OpRotateLeft8, typ.UInt8) - v1 := b.NewValue0(v.Pos, OpMul8, typ.UInt8) - v2 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v2.AuxInt = int64(int8(udivisible(8, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v3.AuxInt = int64(8 - udivisible(8, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v4.AuxInt = int64(int8(udivisible(8, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq8 (Mul8 (Const8 [c]) (Trunc32to8 (Rsh32Ux64 mul:(Mul32 (Const32 [m]) (ZeroExt8to32 x)) (Const64 [s])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<8+umagic(8,c).m) && s == 8+umagic(8,c).s && x.Op != OpConst8 && udivisibleOK(8,c) - // result: (Leq8U (RotateLeft8 (Mul8 (Const8 [int64(int8(udivisible(8,c).m))]) x) (Const8 [int64(8-udivisible(8,c).k)]) ) (Const8 [int64(int8(udivisible(8,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul8 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst8 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpTrunc32to8 { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh32Ux64 { - break - } - _ = v_0_1_0.Args[1] - mul := v_0_1_0.Args[0] - if mul.Op != OpMul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpZeroExt8to32 || x != mul_1.Args[0] { - break - } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { - break - } - s := v_0_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<8+umagic(8, c).m) && s == 8+umagic(8, c).s && x.Op != OpConst8 && udivisibleOK(8, c)) { - break - } - v.reset(OpLeq8U) - v0 := b.NewValue0(v.Pos, OpRotateLeft8, typ.UInt8) - v1 := b.NewValue0(v.Pos, OpMul8, typ.UInt8) - v2 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v2.AuxInt = int64(int8(udivisible(8, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v3.AuxInt = int64(8 - udivisible(8, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v4.AuxInt = int64(int8(udivisible(8, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq8 (Mul8 (Const8 [c]) (Trunc32to8 (Rsh32Ux64 mul:(Mul32 (ZeroExt8to32 x) (Const32 [m])) (Const64 [s])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<8+umagic(8,c).m) && s == 8+umagic(8,c).s && x.Op != OpConst8 && udivisibleOK(8,c) - // result: (Leq8U (RotateLeft8 (Mul8 (Const8 [int64(int8(udivisible(8,c).m))]) x) (Const8 [int64(8-udivisible(8,c).k)]) ) (Const8 [int64(int8(udivisible(8,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul8 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst8 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpTrunc32to8 { - break - } - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh32Ux64 { - break - } - _ = v_0_1_0.Args[1] - mul := v_0_1_0.Args[0] - if mul.Op != OpMul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpZeroExt8to32 || x != mul_0.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { - break - } - m := mul_1.AuxInt - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { - break - } - s := v_0_1_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<8+umagic(8, c).m) && s == 8+umagic(8, c).s && x.Op != OpConst8 && udivisibleOK(8, c)) { - break - } - v.reset(OpLeq8U) - v0 := b.NewValue0(v.Pos, OpRotateLeft8, typ.UInt8) - v1 := b.NewValue0(v.Pos, OpMul8, typ.UInt8) - v2 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v2.AuxInt = int64(int8(udivisible(8, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v3.AuxInt = int64(8 - udivisible(8, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v4.AuxInt = int64(int8(udivisible(8, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq8 (Mul8 (Trunc32to8 (Rsh32Ux64 mul:(Mul32 (Const32 [m]) (ZeroExt8to32 x)) (Const64 [s]))) (Const8 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<8+umagic(8,c).m) && s == 8+umagic(8,c).s && x.Op != OpConst8 && udivisibleOK(8,c) - // result: (Leq8U (RotateLeft8 (Mul8 (Const8 [int64(int8(udivisible(8,c).m))]) x) (Const8 [int64(8-udivisible(8,c).k)]) ) (Const8 [int64(int8(udivisible(8,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul8 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpTrunc32to8 { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh32Ux64 { - break - } - _ = v_0_0_0.Args[1] - mul := v_0_0_0.Args[0] - if mul.Op != OpMul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpZeroExt8to32 || x != mul_1.Args[0] { - break - } - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst8 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<8+umagic(8, c).m) && s == 8+umagic(8, c).s && x.Op != OpConst8 && udivisibleOK(8, c)) { - break - } - v.reset(OpLeq8U) - v0 := b.NewValue0(v.Pos, OpRotateLeft8, typ.UInt8) - v1 := b.NewValue0(v.Pos, OpMul8, typ.UInt8) - v2 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v2.AuxInt = int64(int8(udivisible(8, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v3.AuxInt = int64(8 - udivisible(8, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v4.AuxInt = int64(int8(udivisible(8, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq8 (Mul8 (Trunc32to8 (Rsh32Ux64 mul:(Mul32 (ZeroExt8to32 x) (Const32 [m])) (Const64 [s]))) (Const8 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<8+umagic(8,c).m) && s == 8+umagic(8,c).s && x.Op != OpConst8 && udivisibleOK(8,c) - // result: (Leq8U (RotateLeft8 (Mul8 (Const8 [int64(int8(udivisible(8,c).m))]) x) (Const8 [int64(8-udivisible(8,c).k)]) ) (Const8 [int64(int8(udivisible(8,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul8 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpTrunc32to8 { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh32Ux64 { - break - } - _ = v_0_0_0.Args[1] - mul := v_0_0_0.Args[0] - if mul.Op != OpMul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpZeroExt8to32 || x != mul_0.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { - break - } - m := mul_1.AuxInt - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst8 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(1<<8+umagic(8, c).m) && s == 8+umagic(8, c).s && x.Op != OpConst8 && udivisibleOK(8, c)) { - break - } - v.reset(OpLeq8U) - v0 := b.NewValue0(v.Pos, OpRotateLeft8, typ.UInt8) - v1 := b.NewValue0(v.Pos, OpMul8, typ.UInt8) - v2 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v2.AuxInt = int64(int8(udivisible(8, c).m)) - v1.AddArg(v2) - v1.AddArg(x) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v3.AuxInt = int64(8 - udivisible(8, c).k) - v0.AddArg(v3) - v.AddArg(v0) - v4 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v4.AuxInt = int64(int8(udivisible(8, c).max)) - v.AddArg(v4) - return true - } - // match: (Eq8 x (Mul8 (Const8 [c]) (Sub8 (Rsh32x64 mul:(Mul32 (Const32 [m]) (SignExt8to32 x)) (Const64 [s])) (Rsh32x64 (SignExt8to32 x) (Const64 [31]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(8,c).m) && s == 8+smagic(8,c).s && x.Op != OpConst8 && sdivisibleOK(8,c) - // result: (Leq8U (RotateLeft8 (Add8 (Mul8 (Const8 [int64(int8(sdivisible(8,c).m))]) x) (Const8 [int64(int8(sdivisible(8,c).a))]) ) (Const8 [int64(8-sdivisible(8,c).k)]) ) (Const8 [int64(int8(sdivisible(8,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul8 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst8 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpSub8 { - break - } - _ = v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh32x64 { - break - } - _ = v_1_1_0.Args[1] - mul := v_1_1_0.Args[0] - if mul.Op != OpMul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpSignExt8to32 || x != mul_1.Args[0] { - break - } - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { - break - } - s := v_1_1_0_1.AuxInt - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpRsh32x64 { - break - } - _ = v_1_1_1.Args[1] - v_1_1_1_0 := v_1_1_1.Args[0] - if v_1_1_1_0.Op != OpSignExt8to32 || x != v_1_1_1_0.Args[0] { - break - } - v_1_1_1_1 := v_1_1_1.Args[1] - if v_1_1_1_1.Op != OpConst64 || v_1_1_1_1.AuxInt != 31 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(8, c).m) && s == 8+smagic(8, c).s && x.Op != OpConst8 && sdivisibleOK(8, c)) { - break - } - v.reset(OpLeq8U) - v0 := b.NewValue0(v.Pos, OpRotateLeft8, typ.UInt8) - v1 := b.NewValue0(v.Pos, OpAdd8, typ.UInt8) - v2 := b.NewValue0(v.Pos, OpMul8, typ.UInt8) - v3 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v3.AuxInt = int64(int8(sdivisible(8, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v4.AuxInt = int64(int8(sdivisible(8, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v5.AuxInt = int64(8 - sdivisible(8, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v6.AuxInt = int64(int8(sdivisible(8, c).max)) - v.AddArg(v6) - return true - } - return false -} -func rewriteValuegeneric_OpEq8_20(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Eq8 x (Mul8 (Const8 [c]) (Sub8 (Rsh32x64 mul:(Mul32 (SignExt8to32 x) (Const32 [m])) (Const64 [s])) (Rsh32x64 (SignExt8to32 x) (Const64 [31]))))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(8,c).m) && s == 8+smagic(8,c).s && x.Op != OpConst8 && sdivisibleOK(8,c) - // result: (Leq8U (RotateLeft8 (Add8 (Mul8 (Const8 [int64(int8(sdivisible(8,c).m))]) x) (Const8 [int64(int8(sdivisible(8,c).a))]) ) (Const8 [int64(8-sdivisible(8,c).k)]) ) (Const8 [int64(int8(sdivisible(8,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul8 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst8 { - break - } - c := v_1_0.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpSub8 { - break - } - _ = v_1_1.Args[1] - v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpRsh32x64 { - break - } - _ = v_1_1_0.Args[1] - mul := v_1_1_0.Args[0] - if mul.Op != OpMul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpSignExt8to32 || x != mul_0.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { - break - } - m := mul_1.AuxInt - v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpConst64 { - break - } - s := v_1_1_0_1.AuxInt - v_1_1_1 := v_1_1.Args[1] - if v_1_1_1.Op != OpRsh32x64 { - break - } - _ = v_1_1_1.Args[1] - v_1_1_1_0 := v_1_1_1.Args[0] - if v_1_1_1_0.Op != OpSignExt8to32 || x != v_1_1_1_0.Args[0] { - break - } - v_1_1_1_1 := v_1_1_1.Args[1] - if v_1_1_1_1.Op != OpConst64 || v_1_1_1_1.AuxInt != 31 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(8, c).m) && s == 8+smagic(8, c).s && x.Op != OpConst8 && sdivisibleOK(8, c)) { - break - } - v.reset(OpLeq8U) - v0 := b.NewValue0(v.Pos, OpRotateLeft8, typ.UInt8) - v1 := b.NewValue0(v.Pos, OpAdd8, typ.UInt8) - v2 := b.NewValue0(v.Pos, OpMul8, typ.UInt8) - v3 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v3.AuxInt = int64(int8(sdivisible(8, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v4.AuxInt = int64(int8(sdivisible(8, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v5.AuxInt = int64(8 - sdivisible(8, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v6.AuxInt = int64(int8(sdivisible(8, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq8 x (Mul8 (Sub8 (Rsh32x64 mul:(Mul32 (Const32 [m]) (SignExt8to32 x)) (Const64 [s])) (Rsh32x64 (SignExt8to32 x) (Const64 [31]))) (Const8 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(8,c).m) && s == 8+smagic(8,c).s && x.Op != OpConst8 && sdivisibleOK(8,c) - // result: (Leq8U (RotateLeft8 (Add8 (Mul8 (Const8 [int64(int8(sdivisible(8,c).m))]) x) (Const8 [int64(int8(sdivisible(8,c).a))]) ) (Const8 [int64(8-sdivisible(8,c).k)]) ) (Const8 [int64(int8(sdivisible(8,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul8 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpSub8 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh32x64 { - break - } - _ = v_1_0_0.Args[1] - mul := v_1_0_0.Args[0] - if mul.Op != OpMul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpSignExt8to32 || x != mul_1.Args[0] { - break - } - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { - break - } - s := v_1_0_0_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpRsh32x64 { - break - } - _ = v_1_0_1.Args[1] - v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpSignExt8to32 || x != v_1_0_1_0.Args[0] { - break - } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpConst64 || v_1_0_1_1.AuxInt != 31 { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst8 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(8, c).m) && s == 8+smagic(8, c).s && x.Op != OpConst8 && sdivisibleOK(8, c)) { - break - } - v.reset(OpLeq8U) - v0 := b.NewValue0(v.Pos, OpRotateLeft8, typ.UInt8) - v1 := b.NewValue0(v.Pos, OpAdd8, typ.UInt8) - v2 := b.NewValue0(v.Pos, OpMul8, typ.UInt8) - v3 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v3.AuxInt = int64(int8(sdivisible(8, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v4.AuxInt = int64(int8(sdivisible(8, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v5.AuxInt = int64(8 - sdivisible(8, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v6.AuxInt = int64(int8(sdivisible(8, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq8 x (Mul8 (Sub8 (Rsh32x64 mul:(Mul32 (SignExt8to32 x) (Const32 [m])) (Const64 [s])) (Rsh32x64 (SignExt8to32 x) (Const64 [31]))) (Const8 [c]))) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(8,c).m) && s == 8+smagic(8,c).s && x.Op != OpConst8 && sdivisibleOK(8,c) - // result: (Leq8U (RotateLeft8 (Add8 (Mul8 (Const8 [int64(int8(sdivisible(8,c).m))]) x) (Const8 [int64(int8(sdivisible(8,c).a))]) ) (Const8 [int64(8-sdivisible(8,c).k)]) ) (Const8 [int64(int8(sdivisible(8,c).max))]) ) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul8 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpSub8 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpRsh32x64 { - break - } - _ = v_1_0_0.Args[1] - mul := v_1_0_0.Args[0] - if mul.Op != OpMul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpSignExt8to32 || x != mul_0.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { - break - } - m := mul_1.AuxInt - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpConst64 { - break - } - s := v_1_0_0_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpRsh32x64 { - break - } - _ = v_1_0_1.Args[1] - v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpSignExt8to32 || x != v_1_0_1_0.Args[0] { - break - } - v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpConst64 || v_1_0_1_1.AuxInt != 31 { - break - } - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst8 { - break - } - c := v_1_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(8, c).m) && s == 8+smagic(8, c).s && x.Op != OpConst8 && sdivisibleOK(8, c)) { - break - } - v.reset(OpLeq8U) - v0 := b.NewValue0(v.Pos, OpRotateLeft8, typ.UInt8) - v1 := b.NewValue0(v.Pos, OpAdd8, typ.UInt8) - v2 := b.NewValue0(v.Pos, OpMul8, typ.UInt8) - v3 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v3.AuxInt = int64(int8(sdivisible(8, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v4.AuxInt = int64(int8(sdivisible(8, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v5.AuxInt = int64(8 - sdivisible(8, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v6.AuxInt = int64(int8(sdivisible(8, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq8 (Mul8 (Const8 [c]) (Sub8 (Rsh32x64 mul:(Mul32 (Const32 [m]) (SignExt8to32 x)) (Const64 [s])) (Rsh32x64 (SignExt8to32 x) (Const64 [31])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(8,c).m) && s == 8+smagic(8,c).s && x.Op != OpConst8 && sdivisibleOK(8,c) - // result: (Leq8U (RotateLeft8 (Add8 (Mul8 (Const8 [int64(int8(sdivisible(8,c).m))]) x) (Const8 [int64(int8(sdivisible(8,c).a))]) ) (Const8 [int64(8-sdivisible(8,c).k)]) ) (Const8 [int64(int8(sdivisible(8,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul8 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst8 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpSub8 { - break - } - _ = v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh32x64 { - break - } - _ = v_0_1_0.Args[1] - mul := v_0_1_0.Args[0] - if mul.Op != OpMul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpSignExt8to32 || x != mul_1.Args[0] { - break - } - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { - break - } - s := v_0_1_0_1.AuxInt - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpRsh32x64 { - break - } - _ = v_0_1_1.Args[1] - v_0_1_1_0 := v_0_1_1.Args[0] - if v_0_1_1_0.Op != OpSignExt8to32 || x != v_0_1_1_0.Args[0] { - break - } - v_0_1_1_1 := v_0_1_1.Args[1] - if v_0_1_1_1.Op != OpConst64 || v_0_1_1_1.AuxInt != 31 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(8, c).m) && s == 8+smagic(8, c).s && x.Op != OpConst8 && sdivisibleOK(8, c)) { - break - } - v.reset(OpLeq8U) - v0 := b.NewValue0(v.Pos, OpRotateLeft8, typ.UInt8) - v1 := b.NewValue0(v.Pos, OpAdd8, typ.UInt8) - v2 := b.NewValue0(v.Pos, OpMul8, typ.UInt8) - v3 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v3.AuxInt = int64(int8(sdivisible(8, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v4.AuxInt = int64(int8(sdivisible(8, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v5.AuxInt = int64(8 - sdivisible(8, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v6.AuxInt = int64(int8(sdivisible(8, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq8 (Mul8 (Const8 [c]) (Sub8 (Rsh32x64 mul:(Mul32 (SignExt8to32 x) (Const32 [m])) (Const64 [s])) (Rsh32x64 (SignExt8to32 x) (Const64 [31])))) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(8,c).m) && s == 8+smagic(8,c).s && x.Op != OpConst8 && sdivisibleOK(8,c) - // result: (Leq8U (RotateLeft8 (Add8 (Mul8 (Const8 [int64(int8(sdivisible(8,c).m))]) x) (Const8 [int64(int8(sdivisible(8,c).a))]) ) (Const8 [int64(8-sdivisible(8,c).k)]) ) (Const8 [int64(int8(sdivisible(8,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul8 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst8 { - break - } - c := v_0_0.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpSub8 { - break - } - _ = v_0_1.Args[1] - v_0_1_0 := v_0_1.Args[0] - if v_0_1_0.Op != OpRsh32x64 { - break - } - _ = v_0_1_0.Args[1] - mul := v_0_1_0.Args[0] - if mul.Op != OpMul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpSignExt8to32 || x != mul_0.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { - break - } - m := mul_1.AuxInt - v_0_1_0_1 := v_0_1_0.Args[1] - if v_0_1_0_1.Op != OpConst64 { - break - } - s := v_0_1_0_1.AuxInt - v_0_1_1 := v_0_1.Args[1] - if v_0_1_1.Op != OpRsh32x64 { - break - } - _ = v_0_1_1.Args[1] - v_0_1_1_0 := v_0_1_1.Args[0] - if v_0_1_1_0.Op != OpSignExt8to32 || x != v_0_1_1_0.Args[0] { - break - } - v_0_1_1_1 := v_0_1_1.Args[1] - if v_0_1_1_1.Op != OpConst64 || v_0_1_1_1.AuxInt != 31 || !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(8, c).m) && s == 8+smagic(8, c).s && x.Op != OpConst8 && sdivisibleOK(8, c)) { - break - } - v.reset(OpLeq8U) - v0 := b.NewValue0(v.Pos, OpRotateLeft8, typ.UInt8) - v1 := b.NewValue0(v.Pos, OpAdd8, typ.UInt8) - v2 := b.NewValue0(v.Pos, OpMul8, typ.UInt8) - v3 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v3.AuxInt = int64(int8(sdivisible(8, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v4.AuxInt = int64(int8(sdivisible(8, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v5.AuxInt = int64(8 - sdivisible(8, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v6.AuxInt = int64(int8(sdivisible(8, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq8 (Mul8 (Sub8 (Rsh32x64 mul:(Mul32 (Const32 [m]) (SignExt8to32 x)) (Const64 [s])) (Rsh32x64 (SignExt8to32 x) (Const64 [31]))) (Const8 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(8,c).m) && s == 8+smagic(8,c).s && x.Op != OpConst8 && sdivisibleOK(8,c) - // result: (Leq8U (RotateLeft8 (Add8 (Mul8 (Const8 [int64(int8(sdivisible(8,c).m))]) x) (Const8 [int64(int8(sdivisible(8,c).a))]) ) (Const8 [int64(8-sdivisible(8,c).k)]) ) (Const8 [int64(int8(sdivisible(8,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul8 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSub8 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh32x64 { - break - } - _ = v_0_0_0.Args[1] - mul := v_0_0_0.Args[0] - if mul.Op != OpMul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpConst32 { - break - } - m := mul_0.AuxInt - mul_1 := mul.Args[1] - if mul_1.Op != OpSignExt8to32 || x != mul_1.Args[0] { - break - } - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_0_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpRsh32x64 { - break - } - _ = v_0_0_1.Args[1] - v_0_0_1_0 := v_0_0_1.Args[0] - if v_0_0_1_0.Op != OpSignExt8to32 || x != v_0_0_1_0.Args[0] { - break - } - v_0_0_1_1 := v_0_0_1.Args[1] - if v_0_0_1_1.Op != OpConst64 || v_0_0_1_1.AuxInt != 31 { - break - } - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst8 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(8, c).m) && s == 8+smagic(8, c).s && x.Op != OpConst8 && sdivisibleOK(8, c)) { - break - } - v.reset(OpLeq8U) - v0 := b.NewValue0(v.Pos, OpRotateLeft8, typ.UInt8) - v1 := b.NewValue0(v.Pos, OpAdd8, typ.UInt8) - v2 := b.NewValue0(v.Pos, OpMul8, typ.UInt8) - v3 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v3.AuxInt = int64(int8(sdivisible(8, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v4.AuxInt = int64(int8(sdivisible(8, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v5.AuxInt = int64(8 - sdivisible(8, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v6.AuxInt = int64(int8(sdivisible(8, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq8 (Mul8 (Sub8 (Rsh32x64 mul:(Mul32 (SignExt8to32 x) (Const32 [m])) (Const64 [s])) (Rsh32x64 (SignExt8to32 x) (Const64 [31]))) (Const8 [c])) x) - // cond: v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(8,c).m) && s == 8+smagic(8,c).s && x.Op != OpConst8 && sdivisibleOK(8,c) - // result: (Leq8U (RotateLeft8 (Add8 (Mul8 (Const8 [int64(int8(sdivisible(8,c).m))]) x) (Const8 [int64(int8(sdivisible(8,c).a))]) ) (Const8 [int64(8-sdivisible(8,c).k)]) ) (Const8 [int64(int8(sdivisible(8,c).max))]) ) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul8 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSub8 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpRsh32x64 { - break - } - _ = v_0_0_0.Args[1] - mul := v_0_0_0.Args[0] - if mul.Op != OpMul32 { - break - } - _ = mul.Args[1] - mul_0 := mul.Args[0] - if mul_0.Op != OpSignExt8to32 || x != mul_0.Args[0] { - break - } - mul_1 := mul.Args[1] - if mul_1.Op != OpConst32 { - break - } - m := mul_1.AuxInt - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpConst64 { - break - } - s := v_0_0_0_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpRsh32x64 { - break - } - _ = v_0_0_1.Args[1] - v_0_0_1_0 := v_0_0_1.Args[0] - if v_0_0_1_0.Op != OpSignExt8to32 || x != v_0_0_1_0.Args[0] { - break - } - v_0_0_1_1 := v_0_0_1.Args[1] - if v_0_0_1_1.Op != OpConst64 || v_0_0_1_1.AuxInt != 31 { - break - } - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst8 { - break - } - c := v_0_1.AuxInt - if !(v.Block.Func.pass.name != "opt" && mul.Uses == 1 && m == int64(smagic(8, c).m) && s == 8+smagic(8, c).s && x.Op != OpConst8 && sdivisibleOK(8, c)) { - break - } - v.reset(OpLeq8U) - v0 := b.NewValue0(v.Pos, OpRotateLeft8, typ.UInt8) - v1 := b.NewValue0(v.Pos, OpAdd8, typ.UInt8) - v2 := b.NewValue0(v.Pos, OpMul8, typ.UInt8) - v3 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v3.AuxInt = int64(int8(sdivisible(8, c).m)) - v2.AddArg(v3) - v2.AddArg(x) - v1.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v4.AuxInt = int64(int8(sdivisible(8, c).a)) - v1.AddArg(v4) - v0.AddArg(v1) - v5 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v5.AuxInt = int64(8 - sdivisible(8, c).k) - v0.AddArg(v5) - v.AddArg(v0) - v6 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) - v6.AuxInt = int64(int8(sdivisible(8, c).max)) - v.AddArg(v6) - return true - } - // match: (Eq8 n (Lsh8x64 (Rsh8x64 (Add8 n (Rsh8Ux64 (Rsh8x64 n (Const64 [ 7])) (Const64 [kbar]))) (Const64 [k])) (Const64 [k]))) - // cond: k > 0 && k < 7 && kbar == 8 - k - // result: (Eq8 (And8 n (Const8 [int64(1< [0])) - for { - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpLsh8x64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpRsh8x64 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAdd8 { - break - } - t := v_1_0_0.Type - _ = v_1_0_0.Args[1] - if n != v_1_0_0.Args[0] { - break - } - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpRsh8Ux64 || v_1_0_0_1.Type != t { - break - } - _ = v_1_0_0_1.Args[1] - v_1_0_0_1_0 := v_1_0_0_1.Args[0] - if v_1_0_0_1_0.Op != OpRsh8x64 || v_1_0_0_1_0.Type != t { - break - } - _ = v_1_0_0_1_0.Args[1] - if n != v_1_0_0_1_0.Args[0] { - break - } - v_1_0_0_1_0_1 := v_1_0_0_1_0.Args[1] - if v_1_0_0_1_0_1.Op != OpConst64 || v_1_0_0_1_0_1.Type != typ.UInt64 || v_1_0_0_1_0_1.AuxInt != 7 { - break - } - v_1_0_0_1_1 := v_1_0_0_1.Args[1] - if v_1_0_0_1_1.Op != OpConst64 || v_1_0_0_1_1.Type != typ.UInt64 { - break - } - kbar := v_1_0_0_1_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 { - break - } - k := v_1_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || v_1_1.AuxInt != k || !(k > 0 && k < 7 && kbar == 8-k) { - break - } - v.reset(OpEq8) - v0 := b.NewValue0(v.Pos, OpAnd8, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst8, t) - v1.AuxInt = int64(1< (Rsh8Ux64 (Rsh8x64 n (Const64 [ 7])) (Const64 [kbar])) n) (Const64 [k])) (Const64 [k]))) - // cond: k > 0 && k < 7 && kbar == 8 - k - // result: (Eq8 (And8 n (Const8 [int64(1< [0])) - for { - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpLsh8x64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpRsh8x64 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAdd8 { - break - } - t := v_1_0_0.Type - _ = v_1_0_0.Args[1] - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpRsh8Ux64 || v_1_0_0_0.Type != t { - break - } - _ = v_1_0_0_0.Args[1] - v_1_0_0_0_0 := v_1_0_0_0.Args[0] - if v_1_0_0_0_0.Op != OpRsh8x64 || v_1_0_0_0_0.Type != t { - break - } - _ = v_1_0_0_0_0.Args[1] - if n != v_1_0_0_0_0.Args[0] { - break - } - v_1_0_0_0_0_1 := v_1_0_0_0_0.Args[1] - if v_1_0_0_0_0_1.Op != OpConst64 || v_1_0_0_0_0_1.Type != typ.UInt64 || v_1_0_0_0_0_1.AuxInt != 7 { - break - } - v_1_0_0_0_1 := v_1_0_0_0.Args[1] - if v_1_0_0_0_1.Op != OpConst64 || v_1_0_0_0_1.Type != typ.UInt64 { - break - } - kbar := v_1_0_0_0_1.AuxInt - if n != v_1_0_0.Args[1] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 { - break - } - k := v_1_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || v_1_1.AuxInt != k || !(k > 0 && k < 7 && kbar == 8-k) { - break - } - v.reset(OpEq8) - v0 := b.NewValue0(v.Pos, OpAnd8, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst8, t) - v1.AuxInt = int64(1< n (Rsh8Ux64 (Rsh8x64 n (Const64 [ 7])) (Const64 [kbar]))) (Const64 [k])) (Const64 [k])) n) - // cond: k > 0 && k < 7 && kbar == 8 - k - // result: (Eq8 (And8 n (Const8 [int64(1< [0])) - for { - n := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh8x64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh8x64 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAdd8 { - break - } - t := v_0_0_0.Type - _ = v_0_0_0.Args[1] - if n != v_0_0_0.Args[0] { - break - } - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpRsh8Ux64 || v_0_0_0_1.Type != t { - break - } - _ = v_0_0_0_1.Args[1] - v_0_0_0_1_0 := v_0_0_0_1.Args[0] - if v_0_0_0_1_0.Op != OpRsh8x64 || v_0_0_0_1_0.Type != t { - break - } - _ = v_0_0_0_1_0.Args[1] - if n != v_0_0_0_1_0.Args[0] { - break - } - v_0_0_0_1_0_1 := v_0_0_0_1_0.Args[1] - if v_0_0_0_1_0_1.Op != OpConst64 || v_0_0_0_1_0_1.Type != typ.UInt64 || v_0_0_0_1_0_1.AuxInt != 7 { - break - } - v_0_0_0_1_1 := v_0_0_0_1.Args[1] - if v_0_0_0_1_1.Op != OpConst64 || v_0_0_0_1_1.Type != typ.UInt64 { - break - } - kbar := v_0_0_0_1_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 || v_0_0_1.Type != typ.UInt64 { - break - } - k := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.Type != typ.UInt64 || v_0_1.AuxInt != k || !(k > 0 && k < 7 && kbar == 8-k) { - break - } - v.reset(OpEq8) - v0 := b.NewValue0(v.Pos, OpAnd8, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst8, t) - v1.AuxInt = int64(1< (Rsh8Ux64 (Rsh8x64 n (Const64 [ 7])) (Const64 [kbar])) n) (Const64 [k])) (Const64 [k])) n) - // cond: k > 0 && k < 7 && kbar == 8 - k - // result: (Eq8 (And8 n (Const8 [int64(1< [0])) - for { - n := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh8x64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh8x64 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAdd8 { - break - } - t := v_0_0_0.Type - _ = v_0_0_0.Args[1] - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpRsh8Ux64 || v_0_0_0_0.Type != t { - break - } - _ = v_0_0_0_0.Args[1] - v_0_0_0_0_0 := v_0_0_0_0.Args[0] - if v_0_0_0_0_0.Op != OpRsh8x64 || v_0_0_0_0_0.Type != t { - break - } - _ = v_0_0_0_0_0.Args[1] - if n != v_0_0_0_0_0.Args[0] { - break - } - v_0_0_0_0_0_1 := v_0_0_0_0_0.Args[1] - if v_0_0_0_0_0_1.Op != OpConst64 || v_0_0_0_0_0_1.Type != typ.UInt64 || v_0_0_0_0_0_1.AuxInt != 7 { - break - } - v_0_0_0_0_1 := v_0_0_0_0.Args[1] - if v_0_0_0_0_1.Op != OpConst64 || v_0_0_0_0_1.Type != typ.UInt64 { - break - } - kbar := v_0_0_0_0_1.AuxInt - if n != v_0_0_0.Args[1] { - break - } - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 || v_0_0_1.Type != typ.UInt64 { - break - } - k := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.Type != typ.UInt64 || v_0_1.AuxInt != k || !(k > 0 && k < 7 && kbar == 8-k) { - break - } - v.reset(OpEq8) - v0 := b.NewValue0(v.Pos, OpAnd8, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst8, t) - v1.AuxInt = int64(1< x (Const8 [y])) (Const8 [y])) - // cond: isPowerOfTwo(y) - // result: (Neq8 (And8 x (Const8 [y])) (Const8 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd8 { - break - } - t := v_0.Type - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst8 || v_0_1.Type != t { - break - } - y := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.Type != t || v_1.AuxInt != y || !(isPowerOfTwo(y)) { - break - } - v.reset(OpNeq8) - v0 := b.NewValue0(v.Pos, OpAnd8, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst8, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst8, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true - } - // match: (Eq8 (And8 (Const8 [y]) x) (Const8 [y])) - // cond: isPowerOfTwo(y) - // result: (Neq8 (And8 x (Const8 [y])) (Const8 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd8 { - break - } - t := v_0.Type - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst8 || v_0_0.Type != t { - break - } - y := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.Type != t || v_1.AuxInt != y || !(isPowerOfTwo(y)) { - break - } - v.reset(OpNeq8) - v0 := b.NewValue0(v.Pos, OpAnd8, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst8, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst8, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true - } - // match: (Eq8 (Const8 [y]) (And8 x (Const8 [y]))) - // cond: isPowerOfTwo(y) - // result: (Neq8 (And8 x (Const8 [y])) (Const8 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - t := v_0.Type - y := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAnd8 || v_1.Type != t { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst8 || v_1_1.Type != t || v_1_1.AuxInt != y || !(isPowerOfTwo(y)) { - break - } - v.reset(OpNeq8) - v0 := b.NewValue0(v.Pos, OpAnd8, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst8, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst8, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true - } - // match: (Eq8 (Const8 [y]) (And8 (Const8 [y]) x)) - // cond: isPowerOfTwo(y) - // result: (Neq8 (And8 x (Const8 [y])) (Const8 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - t := v_0.Type - y := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAnd8 || v_1.Type != t { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst8 || v_1_0.Type != t || v_1_0.AuxInt != y || !(isPowerOfTwo(y)) { - break - } - v.reset(OpNeq8) - v0 := b.NewValue0(v.Pos, OpAnd8, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst8, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst8, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true - } - return false -} -func rewriteValuegeneric_OpEqB_0(v *Value) bool { - // match: (EqB (ConstBool [c]) (ConstBool [d])) - // result: (ConstBool [b2i(c == d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConstBool { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConstBool { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c == d) - return true - } - // match: (EqB (ConstBool [d]) (ConstBool [c])) - // result: (ConstBool [b2i(c == d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConstBool { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConstBool { - break - } - c := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c == d) - return true - } - // match: (EqB (ConstBool [0]) x) - // result: (Not x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConstBool || v_0.AuxInt != 0 { - break - } - v.reset(OpNot) - v.AddArg(x) - return true - } - // match: (EqB x (ConstBool [0])) - // result: (Not x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConstBool || v_1.AuxInt != 0 { - break - } - v.reset(OpNot) - v.AddArg(x) - return true - } - // match: (EqB (ConstBool [1]) x) - // result: x - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConstBool || v_0.AuxInt != 1 { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (EqB x (ConstBool [1])) - // result: x - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConstBool || v_1.AuxInt != 1 { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - return false -} -func rewriteValuegeneric_OpEqInter_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (EqInter x y) - // result: (EqPtr (ITab x) (ITab y)) - for { - y := v.Args[1] - x := v.Args[0] - v.reset(OpEqPtr) - v0 := b.NewValue0(v.Pos, OpITab, typ.Uintptr) - v0.AddArg(x) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpITab, typ.Uintptr) - v1.AddArg(y) - v.AddArg(v1) - return true - } -} -func rewriteValuegeneric_OpEqPtr_0(v *Value) bool { - // match: (EqPtr x x) - // result: (ConstBool [1]) - for { - x := v.Args[1] - if x != v.Args[0] { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (EqPtr (Addr {a} _) (Addr {b} _)) - // result: (ConstBool [b2i(a == b)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAddr { - break - } - a := v_0.Aux - v_1 := v.Args[1] - if v_1.Op != OpAddr { - break - } - b := v_1.Aux - v.reset(OpConstBool) - v.AuxInt = b2i(a == b) - return true - } - // match: (EqPtr (Addr {b} _) (Addr {a} _)) - // result: (ConstBool [b2i(a == b)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAddr { - break - } - b := v_0.Aux - v_1 := v.Args[1] - if v_1.Op != OpAddr { - break - } - a := v_1.Aux - v.reset(OpConstBool) - v.AuxInt = b2i(a == b) - return true - } - // match: (EqPtr (Addr {a} _) (OffPtr [o] (Addr {b} _))) - // result: (ConstBool [b2i(a == b && o == 0)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAddr { - break - } - a := v_0.Aux - v_1 := v.Args[1] - if v_1.Op != OpOffPtr { - break - } - o := v_1.AuxInt - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAddr { - break - } - b := v_1_0.Aux - v.reset(OpConstBool) - v.AuxInt = b2i(a == b && o == 0) - return true - } - // match: (EqPtr (OffPtr [o] (Addr {b} _)) (Addr {a} _)) - // result: (ConstBool [b2i(a == b && o == 0)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - o := v_0.AuxInt - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAddr { - break - } - b := v_0_0.Aux - v_1 := v.Args[1] - if v_1.Op != OpAddr { - break - } - a := v_1.Aux - v.reset(OpConstBool) - v.AuxInt = b2i(a == b && o == 0) - return true - } - // match: (EqPtr (OffPtr [o1] (Addr {a} _)) (OffPtr [o2] (Addr {b} _))) - // result: (ConstBool [b2i(a == b && o1 == o2)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - o1 := v_0.AuxInt - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAddr { - break - } - a := v_0_0.Aux - v_1 := v.Args[1] - if v_1.Op != OpOffPtr { - break - } - o2 := v_1.AuxInt - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAddr { - break - } - b := v_1_0.Aux - v.reset(OpConstBool) - v.AuxInt = b2i(a == b && o1 == o2) - return true - } - // match: (EqPtr (OffPtr [o2] (Addr {b} _)) (OffPtr [o1] (Addr {a} _))) - // result: (ConstBool [b2i(a == b && o1 == o2)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - o2 := v_0.AuxInt - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAddr { - break - } - b := v_0_0.Aux - v_1 := v.Args[1] - if v_1.Op != OpOffPtr { - break - } - o1 := v_1.AuxInt - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAddr { - break - } - a := v_1_0.Aux - v.reset(OpConstBool) - v.AuxInt = b2i(a == b && o1 == o2) - return true - } - // match: (EqPtr (LocalAddr {a} _ _) (LocalAddr {b} _ _)) - // result: (ConstBool [b2i(a == b)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLocalAddr { - break - } - a := v_0.Aux - _ = v_0.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpLocalAddr { - break - } - b := v_1.Aux - _ = v_1.Args[1] - v.reset(OpConstBool) - v.AuxInt = b2i(a == b) - return true - } - // match: (EqPtr (LocalAddr {b} _ _) (LocalAddr {a} _ _)) - // result: (ConstBool [b2i(a == b)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLocalAddr { - break - } - b := v_0.Aux - _ = v_0.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpLocalAddr { - break - } - a := v_1.Aux - _ = v_1.Args[1] - v.reset(OpConstBool) - v.AuxInt = b2i(a == b) - return true - } - // match: (EqPtr (LocalAddr {a} _ _) (OffPtr [o] (LocalAddr {b} _ _))) - // result: (ConstBool [b2i(a == b && o == 0)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLocalAddr { - break - } - a := v_0.Aux - _ = v_0.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpOffPtr { - break - } - o := v_1.AuxInt - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpLocalAddr { - break - } - b := v_1_0.Aux - _ = v_1_0.Args[1] - v.reset(OpConstBool) - v.AuxInt = b2i(a == b && o == 0) - return true - } - return false -} -func rewriteValuegeneric_OpEqPtr_10(v *Value) bool { - // match: (EqPtr (OffPtr [o] (LocalAddr {b} _ _)) (LocalAddr {a} _ _)) - // result: (ConstBool [b2i(a == b && o == 0)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - o := v_0.AuxInt - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpLocalAddr { - break - } - b := v_0_0.Aux - _ = v_0_0.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpLocalAddr { - break - } - a := v_1.Aux - _ = v_1.Args[1] - v.reset(OpConstBool) - v.AuxInt = b2i(a == b && o == 0) - return true - } - // match: (EqPtr (OffPtr [o1] (LocalAddr {a} _ _)) (OffPtr [o2] (LocalAddr {b} _ _))) - // result: (ConstBool [b2i(a == b && o1 == o2)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - o1 := v_0.AuxInt - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpLocalAddr { - break - } - a := v_0_0.Aux - _ = v_0_0.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpOffPtr { - break - } - o2 := v_1.AuxInt - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpLocalAddr { - break - } - b := v_1_0.Aux - _ = v_1_0.Args[1] - v.reset(OpConstBool) - v.AuxInt = b2i(a == b && o1 == o2) - return true - } - // match: (EqPtr (OffPtr [o2] (LocalAddr {b} _ _)) (OffPtr [o1] (LocalAddr {a} _ _))) - // result: (ConstBool [b2i(a == b && o1 == o2)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - o2 := v_0.AuxInt - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpLocalAddr { - break - } - b := v_0_0.Aux - _ = v_0_0.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpOffPtr { - break - } - o1 := v_1.AuxInt - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpLocalAddr { - break - } - a := v_1_0.Aux - _ = v_1_0.Args[1] - v.reset(OpConstBool) - v.AuxInt = b2i(a == b && o1 == o2) - return true - } - // match: (EqPtr (OffPtr [o1] p1) p2) - // cond: isSamePtr(p1, p2) - // result: (ConstBool [b2i(o1 == 0)]) - for { - p2 := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - o1 := v_0.AuxInt - p1 := v_0.Args[0] - if !(isSamePtr(p1, p2)) { - break - } - v.reset(OpConstBool) - v.AuxInt = b2i(o1 == 0) - return true - } - // match: (EqPtr p2 (OffPtr [o1] p1)) - // cond: isSamePtr(p1, p2) - // result: (ConstBool [b2i(o1 == 0)]) - for { - _ = v.Args[1] - p2 := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpOffPtr { - break - } - o1 := v_1.AuxInt - p1 := v_1.Args[0] - if !(isSamePtr(p1, p2)) { - break - } - v.reset(OpConstBool) - v.AuxInt = b2i(o1 == 0) - return true - } - // match: (EqPtr (OffPtr [o1] p1) (OffPtr [o2] p2)) - // cond: isSamePtr(p1, p2) - // result: (ConstBool [b2i(o1 == o2)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - o1 := v_0.AuxInt - p1 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpOffPtr { - break - } - o2 := v_1.AuxInt - p2 := v_1.Args[0] - if !(isSamePtr(p1, p2)) { - break - } - v.reset(OpConstBool) - v.AuxInt = b2i(o1 == o2) - return true - } - // match: (EqPtr (OffPtr [o2] p2) (OffPtr [o1] p1)) - // cond: isSamePtr(p1, p2) - // result: (ConstBool [b2i(o1 == o2)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - o2 := v_0.AuxInt - p2 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpOffPtr { - break - } - o1 := v_1.AuxInt - p1 := v_1.Args[0] - if !(isSamePtr(p1, p2)) { - break - } - v.reset(OpConstBool) - v.AuxInt = b2i(o1 == o2) - return true - } - // match: (EqPtr (Const32 [c]) (Const32 [d])) - // result: (ConstBool [b2i(c == d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c == d) - return true - } - // match: (EqPtr (Const32 [d]) (Const32 [c])) - // result: (ConstBool [b2i(c == d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - c := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c == d) - return true - } - // match: (EqPtr (Const64 [c]) (Const64 [d])) - // result: (ConstBool [b2i(c == d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c == d) - return true - } - return false -} -func rewriteValuegeneric_OpEqPtr_20(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (EqPtr (Const64 [d]) (Const64 [c])) - // result: (ConstBool [b2i(c == d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c == d) - return true - } - // match: (EqPtr (LocalAddr _ _) (Addr _)) - // result: (ConstBool [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLocalAddr { - break - } - _ = v_0.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpAddr { - break - } - v.reset(OpConstBool) - v.AuxInt = 0 - return true - } - // match: (EqPtr (Addr _) (LocalAddr _ _)) - // result: (ConstBool [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAddr { - break - } - v_1 := v.Args[1] - if v_1.Op != OpLocalAddr { - break - } - _ = v_1.Args[1] - v.reset(OpConstBool) - v.AuxInt = 0 - return true - } - // match: (EqPtr (OffPtr (LocalAddr _ _)) (Addr _)) - // result: (ConstBool [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpLocalAddr { - break - } - _ = v_0_0.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpAddr { - break - } - v.reset(OpConstBool) - v.AuxInt = 0 - return true - } - // match: (EqPtr (Addr _) (OffPtr (LocalAddr _ _))) - // result: (ConstBool [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAddr { - break - } - v_1 := v.Args[1] - if v_1.Op != OpOffPtr { - break - } - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpLocalAddr { - break - } - _ = v_1_0.Args[1] - v.reset(OpConstBool) - v.AuxInt = 0 - return true - } - // match: (EqPtr (LocalAddr _ _) (OffPtr (Addr _))) - // result: (ConstBool [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLocalAddr { - break - } - _ = v_0.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpOffPtr { - break - } - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAddr { - break - } - v.reset(OpConstBool) - v.AuxInt = 0 - return true - } - // match: (EqPtr (OffPtr (Addr _)) (LocalAddr _ _)) - // result: (ConstBool [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAddr { - break - } - v_1 := v.Args[1] - if v_1.Op != OpLocalAddr { - break - } - _ = v_1.Args[1] - v.reset(OpConstBool) - v.AuxInt = 0 - return true - } - // match: (EqPtr (OffPtr (LocalAddr _ _)) (OffPtr (Addr _))) - // result: (ConstBool [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpLocalAddr { - break - } - _ = v_0_0.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpOffPtr { - break - } - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAddr { - break - } - v.reset(OpConstBool) - v.AuxInt = 0 - return true - } - // match: (EqPtr (OffPtr (Addr _)) (OffPtr (LocalAddr _ _))) - // result: (ConstBool [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAddr { - break - } - v_1 := v.Args[1] - if v_1.Op != OpOffPtr { - break - } - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpLocalAddr { - break - } - _ = v_1_0.Args[1] - v.reset(OpConstBool) - v.AuxInt = 0 - return true - } - // match: (EqPtr (AddPtr p1 o1) p2) - // cond: isSamePtr(p1, p2) - // result: (Not (IsNonNil o1)) - for { - p2 := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAddPtr { - break - } - o1 := v_0.Args[1] - p1 := v_0.Args[0] - if !(isSamePtr(p1, p2)) { - break - } - v.reset(OpNot) - v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool) - v0.AddArg(o1) - v.AddArg(v0) - return true - } - return false -} -func rewriteValuegeneric_OpEqPtr_30(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (EqPtr p2 (AddPtr p1 o1)) - // cond: isSamePtr(p1, p2) - // result: (Not (IsNonNil o1)) - for { - _ = v.Args[1] - p2 := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAddPtr { - break - } - o1 := v_1.Args[1] - p1 := v_1.Args[0] - if !(isSamePtr(p1, p2)) { - break - } - v.reset(OpNot) - v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool) - v0.AddArg(o1) - v.AddArg(v0) - return true - } - // match: (EqPtr (Const32 [0]) p) - // result: (Not (IsNonNil p)) - for { - p := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 || v_0.AuxInt != 0 { - break - } - v.reset(OpNot) - v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool) - v0.AddArg(p) - v.AddArg(v0) - return true - } - // match: (EqPtr p (Const32 [0])) - // result: (Not (IsNonNil p)) - for { - _ = v.Args[1] - p := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.AuxInt != 0 { - break - } - v.reset(OpNot) - v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool) - v0.AddArg(p) - v.AddArg(v0) - return true - } - // match: (EqPtr (Const64 [0]) p) - // result: (Not (IsNonNil p)) - for { - p := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 || v_0.AuxInt != 0 { - break - } - v.reset(OpNot) - v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool) - v0.AddArg(p) - v.AddArg(v0) - return true - } - // match: (EqPtr p (Const64 [0])) - // result: (Not (IsNonNil p)) - for { - _ = v.Args[1] - p := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 0 { - break - } - v.reset(OpNot) - v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool) - v0.AddArg(p) - v.AddArg(v0) - return true - } - // match: (EqPtr (ConstNil) p) - // result: (Not (IsNonNil p)) - for { - p := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConstNil { - break - } - v.reset(OpNot) - v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool) - v0.AddArg(p) - v.AddArg(v0) - return true - } - // match: (EqPtr p (ConstNil)) - // result: (Not (IsNonNil p)) - for { - _ = v.Args[1] - p := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConstNil { - break - } - v.reset(OpNot) - v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool) - v0.AddArg(p) - v.AddArg(v0) - return true - } - return false -} -func rewriteValuegeneric_OpEqSlice_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (EqSlice x y) - // result: (EqPtr (SlicePtr x) (SlicePtr y)) - for { - y := v.Args[1] - x := v.Args[0] - v.reset(OpEqPtr) - v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) - v0.AddArg(x) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) - v1.AddArg(y) - v.AddArg(v1) - return true - } -} -func rewriteValuegeneric_OpGeq16_0(v *Value) bool { - // match: (Geq16 (Const16 [c]) (Const16 [d])) - // result: (ConstBool [b2i(c >= d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c >= d) - return true - } - // match: (Geq16 (And16 _ (Const16 [c])) (Const16 [0])) - // cond: int16(c) >= 0 - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd16 { - break - } - _ = v_0.Args[1] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst16 { - break - } - c := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.AuxInt != 0 || !(int16(c) >= 0) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (Geq16 (And16 (Const16 [c]) _) (Const16 [0])) - // cond: int16(c) >= 0 - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd16 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst16 { - break - } - c := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.AuxInt != 0 || !(int16(c) >= 0) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - return false -} -func rewriteValuegeneric_OpGeq16U_0(v *Value) bool { - // match: (Geq16U (Const16 [c]) (Const16 [d])) - // result: (ConstBool [b2i(uint16(c) >= uint16(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(uint16(c) >= uint16(d)) - return true - } - return false -} -func rewriteValuegeneric_OpGeq32_0(v *Value) bool { - // match: (Geq32 (Const32 [c]) (Const32 [d])) - // result: (ConstBool [b2i(c >= d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c >= d) - return true - } - // match: (Geq32 (And32 _ (Const32 [c])) (Const32 [0])) - // cond: int32(c) >= 0 - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd32 { - break - } - _ = v_0.Args[1] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { - break - } - c := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.AuxInt != 0 || !(int32(c) >= 0) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (Geq32 (And32 (Const32 [c]) _) (Const32 [0])) - // cond: int32(c) >= 0 - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break - } - c := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.AuxInt != 0 || !(int32(c) >= 0) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - return false -} -func rewriteValuegeneric_OpGeq32F_0(v *Value) bool { - // match: (Geq32F (Const32F [c]) (Const32F [d])) - // result: (ConstBool [b2i(auxTo32F(c) >= auxTo32F(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32F { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32F { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(auxTo32F(c) >= auxTo32F(d)) - return true - } - return false -} -func rewriteValuegeneric_OpGeq32U_0(v *Value) bool { - // match: (Geq32U (Const32 [c]) (Const32 [d])) - // result: (ConstBool [b2i(uint32(c) >= uint32(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(uint32(c) >= uint32(d)) - return true - } - return false -} -func rewriteValuegeneric_OpGeq64_0(v *Value) bool { - // match: (Geq64 (Const64 [c]) (Const64 [d])) - // result: (ConstBool [b2i(c >= d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c >= d) - return true - } - // match: (Geq64 (And64 _ (Const64 [c])) (Const64 [0])) - // cond: int64(c) >= 0 - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd64 { - break - } - _ = v_0.Args[1] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 0 || !(int64(c) >= 0) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (Geq64 (And64 (Const64 [c]) _) (Const64 [0])) - // cond: int64(c) >= 0 - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 { - break - } - c := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 0 || !(int64(c) >= 0) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (Geq64 (Rsh64Ux64 _ (Const64 [c])) (Const64 [0])) - // cond: c > 0 - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpRsh64Ux64 { - break - } - _ = v_0.Args[1] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 0 || !(c > 0) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - return false -} -func rewriteValuegeneric_OpGeq64F_0(v *Value) bool { - // match: (Geq64F (Const64F [c]) (Const64F [d])) - // result: (ConstBool [b2i(auxTo64F(c) >= auxTo64F(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64F { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64F { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(auxTo64F(c) >= auxTo64F(d)) - return true - } - return false -} -func rewriteValuegeneric_OpGeq64U_0(v *Value) bool { - // match: (Geq64U (Const64 [c]) (Const64 [d])) - // result: (ConstBool [b2i(uint64(c) >= uint64(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(uint64(c) >= uint64(d)) - return true - } - return false -} -func rewriteValuegeneric_OpGeq8_0(v *Value) bool { - // match: (Geq8 (Const8 [c]) (Const8 [d])) - // result: (ConstBool [b2i(c >= d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c >= d) - return true - } - // match: (Geq8 (And8 _ (Const8 [c])) (Const8 [0])) - // cond: int8(c) >= 0 - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd8 { - break - } - _ = v_0.Args[1] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst8 { - break - } - c := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.AuxInt != 0 || !(int8(c) >= 0) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (Geq8 (And8 (Const8 [c]) _) (Const8 [0])) - // cond: int8(c) >= 0 - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd8 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst8 { - break - } - c := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.AuxInt != 0 || !(int8(c) >= 0) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - return false -} -func rewriteValuegeneric_OpGeq8U_0(v *Value) bool { - // match: (Geq8U (Const8 [c]) (Const8 [d])) - // result: (ConstBool [b2i(uint8(c) >= uint8(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(uint8(c) >= uint8(d)) - return true - } - return false -} -func rewriteValuegeneric_OpGreater16_0(v *Value) bool { - // match: (Greater16 (Const16 [c]) (Const16 [d])) - // result: (ConstBool [b2i(c > d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c > d) - return true - } - return false -} -func rewriteValuegeneric_OpGreater16U_0(v *Value) bool { - // match: (Greater16U (Const16 [c]) (Const16 [d])) - // result: (ConstBool [b2i(uint16(c) > uint16(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(uint16(c) > uint16(d)) - return true - } - return false -} -func rewriteValuegeneric_OpGreater32_0(v *Value) bool { - // match: (Greater32 (Const32 [c]) (Const32 [d])) - // result: (ConstBool [b2i(c > d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c > d) - return true - } - return false -} -func rewriteValuegeneric_OpGreater32F_0(v *Value) bool { - // match: (Greater32F (Const32F [c]) (Const32F [d])) - // result: (ConstBool [b2i(auxTo32F(c) > auxTo32F(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32F { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32F { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(auxTo32F(c) > auxTo32F(d)) - return true - } - return false -} -func rewriteValuegeneric_OpGreater32U_0(v *Value) bool { - // match: (Greater32U (Const32 [c]) (Const32 [d])) - // result: (ConstBool [b2i(uint32(c) > uint32(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(uint32(c) > uint32(d)) - return true - } - return false -} -func rewriteValuegeneric_OpGreater64_0(v *Value) bool { - // match: (Greater64 (Const64 [c]) (Const64 [d])) - // result: (ConstBool [b2i(c > d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c > d) - return true - } - return false -} -func rewriteValuegeneric_OpGreater64F_0(v *Value) bool { - // match: (Greater64F (Const64F [c]) (Const64F [d])) - // result: (ConstBool [b2i(auxTo64F(c) > auxTo64F(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64F { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64F { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(auxTo64F(c) > auxTo64F(d)) - return true - } - return false -} -func rewriteValuegeneric_OpGreater64U_0(v *Value) bool { - // match: (Greater64U (Const64 [c]) (Const64 [d])) - // result: (ConstBool [b2i(uint64(c) > uint64(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(uint64(c) > uint64(d)) - return true - } - return false -} -func rewriteValuegeneric_OpGreater8_0(v *Value) bool { - // match: (Greater8 (Const8 [c]) (Const8 [d])) - // result: (ConstBool [b2i(c > d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c > d) - return true - } - return false -} -func rewriteValuegeneric_OpGreater8U_0(v *Value) bool { - // match: (Greater8U (Const8 [c]) (Const8 [d])) - // result: (ConstBool [b2i(uint8(c) > uint8(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(uint8(c) > uint8(d)) - return true - } - return false -} -func rewriteValuegeneric_OpIMake_0(v *Value) bool { - // match: (IMake typ (StructMake1 val)) - // result: (IMake typ val) - for { - _ = v.Args[1] - typ := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpStructMake1 { - break - } - val := v_1.Args[0] - v.reset(OpIMake) - v.AddArg(typ) - v.AddArg(val) - return true - } - // match: (IMake typ (ArrayMake1 val)) - // result: (IMake typ val) - for { - _ = v.Args[1] - typ := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpArrayMake1 { - break - } - val := v_1.Args[0] - v.reset(OpIMake) - v.AddArg(typ) - v.AddArg(val) - return true - } - return false -} -func rewriteValuegeneric_OpInterCall_0(v *Value) bool { - // match: (InterCall [argsize] (Load (OffPtr [off] (ITab (IMake (Addr {itab} (SB)) _))) _) mem) - // cond: devirt(v, itab, off) != nil - // result: (StaticCall [argsize] {devirt(v, itab, off)} mem) - for { - argsize := v.AuxInt - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLoad { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpOffPtr { - break - } - off := v_0_0.AuxInt - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpITab { - break - } - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpIMake { - break - } - _ = v_0_0_0_0.Args[1] - v_0_0_0_0_0 := v_0_0_0_0.Args[0] - if v_0_0_0_0_0.Op != OpAddr { - break - } - itab := v_0_0_0_0_0.Aux - v_0_0_0_0_0_0 := v_0_0_0_0_0.Args[0] - if v_0_0_0_0_0_0.Op != OpSB || !(devirt(v, itab, off) != nil) { - break - } - v.reset(OpStaticCall) - v.AuxInt = argsize - v.Aux = devirt(v, itab, off) - v.AddArg(mem) - return true - } - return false -} -func rewriteValuegeneric_OpIsInBounds_0(v *Value) bool { - // match: (IsInBounds (ZeroExt8to32 _) (Const32 [c])) - // cond: (1 << 8) <= c - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpZeroExt8to32 { - break - } - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - c := v_1.AuxInt - if !((1 << 8) <= c) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (IsInBounds (ZeroExt8to64 _) (Const64 [c])) - // cond: (1 << 8) <= c - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpZeroExt8to64 { - break - } - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c := v_1.AuxInt - if !((1 << 8) <= c) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (IsInBounds (ZeroExt16to32 _) (Const32 [c])) - // cond: (1 << 16) <= c - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpZeroExt16to32 { - break - } - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - c := v_1.AuxInt - if !((1 << 16) <= c) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (IsInBounds (ZeroExt16to64 _) (Const64 [c])) - // cond: (1 << 16) <= c - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpZeroExt16to64 { - break - } - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c := v_1.AuxInt - if !((1 << 16) <= c) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (IsInBounds x x) - // result: (ConstBool [0]) - for { - x := v.Args[1] - if x != v.Args[0] { - break - } - v.reset(OpConstBool) - v.AuxInt = 0 - return true - } - // match: (IsInBounds (And8 (Const8 [c]) _) (Const8 [d])) - // cond: 0 <= c && c < d - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd8 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst8 { - break - } - c := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break - } - d := v_1.AuxInt - if !(0 <= c && c < d) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (IsInBounds (And8 _ (Const8 [c])) (Const8 [d])) - // cond: 0 <= c && c < d - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd8 { - break - } - _ = v_0.Args[1] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst8 { - break - } - c := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break - } - d := v_1.AuxInt - if !(0 <= c && c < d) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (IsInBounds (ZeroExt8to16 (And8 (Const8 [c]) _)) (Const16 [d])) - // cond: 0 <= c && c < d - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpZeroExt8to16 { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAnd8 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpConst8 { - break - } - c := v_0_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - d := v_1.AuxInt - if !(0 <= c && c < d) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (IsInBounds (ZeroExt8to16 (And8 _ (Const8 [c]))) (Const16 [d])) - // cond: 0 <= c && c < d - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpZeroExt8to16 { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAnd8 { - break - } - _ = v_0_0.Args[1] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst8 { - break - } - c := v_0_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - d := v_1.AuxInt - if !(0 <= c && c < d) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (IsInBounds (ZeroExt8to32 (And8 (Const8 [c]) _)) (Const32 [d])) - // cond: 0 <= c && c < d - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpZeroExt8to32 { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAnd8 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpConst8 { - break - } - c := v_0_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - d := v_1.AuxInt - if !(0 <= c && c < d) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - return false -} -func rewriteValuegeneric_OpIsInBounds_10(v *Value) bool { - // match: (IsInBounds (ZeroExt8to32 (And8 _ (Const8 [c]))) (Const32 [d])) - // cond: 0 <= c && c < d - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpZeroExt8to32 { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAnd8 { - break - } - _ = v_0_0.Args[1] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst8 { - break - } - c := v_0_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - d := v_1.AuxInt - if !(0 <= c && c < d) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (IsInBounds (ZeroExt8to64 (And8 (Const8 [c]) _)) (Const64 [d])) - // cond: 0 <= c && c < d - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpZeroExt8to64 { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAnd8 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpConst8 { - break - } - c := v_0_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - if !(0 <= c && c < d) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (IsInBounds (ZeroExt8to64 (And8 _ (Const8 [c]))) (Const64 [d])) - // cond: 0 <= c && c < d - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpZeroExt8to64 { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAnd8 { - break - } - _ = v_0_0.Args[1] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst8 { - break - } - c := v_0_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - if !(0 <= c && c < d) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (IsInBounds (And16 (Const16 [c]) _) (Const16 [d])) - // cond: 0 <= c && c < d - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd16 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst16 { - break - } - c := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - d := v_1.AuxInt - if !(0 <= c && c < d) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (IsInBounds (And16 _ (Const16 [c])) (Const16 [d])) - // cond: 0 <= c && c < d - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd16 { - break - } - _ = v_0.Args[1] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst16 { - break - } - c := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - d := v_1.AuxInt - if !(0 <= c && c < d) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (IsInBounds (ZeroExt16to32 (And16 (Const16 [c]) _)) (Const32 [d])) - // cond: 0 <= c && c < d - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpZeroExt16to32 { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAnd16 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpConst16 { - break - } - c := v_0_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - d := v_1.AuxInt - if !(0 <= c && c < d) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (IsInBounds (ZeroExt16to32 (And16 _ (Const16 [c]))) (Const32 [d])) - // cond: 0 <= c && c < d - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpZeroExt16to32 { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAnd16 { - break - } - _ = v_0_0.Args[1] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst16 { - break - } - c := v_0_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - d := v_1.AuxInt - if !(0 <= c && c < d) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (IsInBounds (ZeroExt16to64 (And16 (Const16 [c]) _)) (Const64 [d])) - // cond: 0 <= c && c < d - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpZeroExt16to64 { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAnd16 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpConst16 { - break - } - c := v_0_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - if !(0 <= c && c < d) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (IsInBounds (ZeroExt16to64 (And16 _ (Const16 [c]))) (Const64 [d])) - // cond: 0 <= c && c < d - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpZeroExt16to64 { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAnd16 { - break - } - _ = v_0_0.Args[1] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst16 { - break - } - c := v_0_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - if !(0 <= c && c < d) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (IsInBounds (And32 (Const32 [c]) _) (Const32 [d])) - // cond: 0 <= c && c < d - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd32 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break - } - c := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - d := v_1.AuxInt - if !(0 <= c && c < d) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - return false -} -func rewriteValuegeneric_OpIsInBounds_20(v *Value) bool { - // match: (IsInBounds (And32 _ (Const32 [c])) (Const32 [d])) - // cond: 0 <= c && c < d - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd32 { - break - } - _ = v_0.Args[1] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { - break - } - c := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - d := v_1.AuxInt - if !(0 <= c && c < d) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (IsInBounds (ZeroExt32to64 (And32 (Const32 [c]) _)) (Const64 [d])) - // cond: 0 <= c && c < d - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpZeroExt32to64 { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAnd32 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpConst32 { - break - } - c := v_0_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - if !(0 <= c && c < d) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (IsInBounds (ZeroExt32to64 (And32 _ (Const32 [c]))) (Const64 [d])) - // cond: 0 <= c && c < d - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpZeroExt32to64 { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAnd32 { - break - } - _ = v_0_0.Args[1] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst32 { - break - } - c := v_0_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - if !(0 <= c && c < d) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (IsInBounds (And64 (Const64 [c]) _) (Const64 [d])) - // cond: 0 <= c && c < d - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 { - break - } - c := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - if !(0 <= c && c < d) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (IsInBounds (And64 _ (Const64 [c])) (Const64 [d])) - // cond: 0 <= c && c < d - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd64 { - break - } - _ = v_0.Args[1] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - if !(0 <= c && c < d) { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (IsInBounds (Const32 [c]) (Const32 [d])) - // result: (ConstBool [b2i(0 <= c && c < d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(0 <= c && c < d) - return true - } - // match: (IsInBounds (Const64 [c]) (Const64 [d])) - // result: (ConstBool [b2i(0 <= c && c < d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(0 <= c && c < d) - return true - } - // match: (IsInBounds (Mod32u _ y) y) - // result: (ConstBool [1]) - for { - y := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMod32u { - break - } - _ = v_0.Args[1] - if y != v_0.Args[1] { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (IsInBounds (Mod64u _ y) y) - // result: (ConstBool [1]) - for { - y := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMod64u { - break - } - _ = v_0.Args[1] - if y != v_0.Args[1] { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (IsInBounds (ZeroExt8to64 (Rsh8Ux64 _ (Const64 [c]))) (Const64 [d])) - // cond: 0 < c && c < 8 && 1< p1 (Store {t2} p2 x _)) - // cond: isSamePtr(p1, p2) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == sizeof(t2) - // result: x - for { - t1 := v.Type - _ = v.Args[1] - p1 := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpStore { - break - } - t2 := v_1.Aux - _ = v_1.Args[2] - p2 := v_1.Args[0] - x := v_1.Args[1] - if !(isSamePtr(p1, p2) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == sizeof(t2)) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Load p1 (Store {t2} p2 _ (Store {t3} p3 x _))) - // cond: isSamePtr(p1, p3) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == sizeof(t2) && disjoint(p3, sizeof(t3), p2, sizeof(t2)) - // result: x - for { - t1 := v.Type - _ = v.Args[1] - p1 := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpStore { - break - } - t2 := v_1.Aux - _ = v_1.Args[2] - p2 := v_1.Args[0] - v_1_2 := v_1.Args[2] - if v_1_2.Op != OpStore { - break - } - t3 := v_1_2.Aux - _ = v_1_2.Args[2] - p3 := v_1_2.Args[0] - x := v_1_2.Args[1] - if !(isSamePtr(p1, p3) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == sizeof(t2) && disjoint(p3, sizeof(t3), p2, sizeof(t2))) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Load p1 (Store {t2} p2 _ (Store {t3} p3 _ (Store {t4} p4 x _)))) - // cond: isSamePtr(p1, p4) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == sizeof(t2) && disjoint(p4, sizeof(t4), p2, sizeof(t2)) && disjoint(p4, sizeof(t4), p3, sizeof(t3)) - // result: x - for { - t1 := v.Type - _ = v.Args[1] - p1 := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpStore { - break - } - t2 := v_1.Aux - _ = v_1.Args[2] - p2 := v_1.Args[0] - v_1_2 := v_1.Args[2] - if v_1_2.Op != OpStore { - break - } - t3 := v_1_2.Aux - _ = v_1_2.Args[2] - p3 := v_1_2.Args[0] - v_1_2_2 := v_1_2.Args[2] - if v_1_2_2.Op != OpStore { - break - } - t4 := v_1_2_2.Aux - _ = v_1_2_2.Args[2] - p4 := v_1_2_2.Args[0] - x := v_1_2_2.Args[1] - if !(isSamePtr(p1, p4) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == sizeof(t2) && disjoint(p4, sizeof(t4), p2, sizeof(t2)) && disjoint(p4, sizeof(t4), p3, sizeof(t3))) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Load p1 (Store {t2} p2 _ (Store {t3} p3 _ (Store {t4} p4 _ (Store {t5} p5 x _))))) - // cond: isSamePtr(p1, p5) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == sizeof(t2) && disjoint(p5, sizeof(t5), p2, sizeof(t2)) && disjoint(p5, sizeof(t5), p3, sizeof(t3)) && disjoint(p5, sizeof(t5), p4, sizeof(t4)) - // result: x - for { - t1 := v.Type - _ = v.Args[1] - p1 := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpStore { - break - } - t2 := v_1.Aux - _ = v_1.Args[2] - p2 := v_1.Args[0] - v_1_2 := v_1.Args[2] - if v_1_2.Op != OpStore { - break - } - t3 := v_1_2.Aux - _ = v_1_2.Args[2] - p3 := v_1_2.Args[0] - v_1_2_2 := v_1_2.Args[2] - if v_1_2_2.Op != OpStore { - break - } - t4 := v_1_2_2.Aux - _ = v_1_2_2.Args[2] - p4 := v_1_2_2.Args[0] - v_1_2_2_2 := v_1_2_2.Args[2] - if v_1_2_2_2.Op != OpStore { - break - } - t5 := v_1_2_2_2.Aux - _ = v_1_2_2_2.Args[2] - p5 := v_1_2_2_2.Args[0] - x := v_1_2_2_2.Args[1] - if !(isSamePtr(p1, p5) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == sizeof(t2) && disjoint(p5, sizeof(t5), p2, sizeof(t2)) && disjoint(p5, sizeof(t5), p3, sizeof(t3)) && disjoint(p5, sizeof(t5), p4, sizeof(t4))) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Load p1 (Store {t2} p2 (Const64 [x]) _)) - // cond: isSamePtr(p1,p2) && sizeof(t2) == 8 && is64BitFloat(t1) - // result: (Const64F [x]) - for { - t1 := v.Type - _ = v.Args[1] - p1 := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpStore { - break - } - t2 := v_1.Aux - _ = v_1.Args[2] - p2 := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 { - break - } - x := v_1_1.AuxInt - if !(isSamePtr(p1, p2) && sizeof(t2) == 8 && is64BitFloat(t1)) { - break - } - v.reset(OpConst64F) - v.AuxInt = x - return true - } - // match: (Load p1 (Store {t2} p2 (Const32 [x]) _)) - // cond: isSamePtr(p1,p2) && sizeof(t2) == 4 && is32BitFloat(t1) - // result: (Const32F [auxFrom32F(math.Float32frombits(uint32(x)))]) - for { - t1 := v.Type - _ = v.Args[1] - p1 := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpStore { - break - } - t2 := v_1.Aux - _ = v_1.Args[2] - p2 := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 { - break - } - x := v_1_1.AuxInt - if !(isSamePtr(p1, p2) && sizeof(t2) == 4 && is32BitFloat(t1)) { - break - } - v.reset(OpConst32F) - v.AuxInt = auxFrom32F(math.Float32frombits(uint32(x))) - return true - } - // match: (Load p1 (Store {t2} p2 (Const64F [x]) _)) - // cond: isSamePtr(p1,p2) && sizeof(t2) == 8 && is64BitInt(t1) - // result: (Const64 [x]) - for { - t1 := v.Type - _ = v.Args[1] - p1 := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpStore { - break - } - t2 := v_1.Aux - _ = v_1.Args[2] - p2 := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64F { - break - } - x := v_1_1.AuxInt - if !(isSamePtr(p1, p2) && sizeof(t2) == 8 && is64BitInt(t1)) { - break - } - v.reset(OpConst64) - v.AuxInt = x - return true - } - // match: (Load p1 (Store {t2} p2 (Const32F [x]) _)) - // cond: isSamePtr(p1,p2) && sizeof(t2) == 4 && is32BitInt(t1) - // result: (Const32 [int64(int32(math.Float32bits(auxTo32F(x))))]) - for { - t1 := v.Type - _ = v.Args[1] - p1 := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpStore { - break - } - t2 := v_1.Aux - _ = v_1.Args[2] - p2 := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32F { - break - } - x := v_1_1.AuxInt - if !(isSamePtr(p1, p2) && sizeof(t2) == 4 && is32BitInt(t1)) { - break - } - v.reset(OpConst32) - v.AuxInt = int64(int32(math.Float32bits(auxTo32F(x)))) - return true - } - // match: (Load op:(OffPtr [o1] p1) (Store {t2} p2 _ mem:(Zero [n] p3 _))) - // cond: o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p3) && fe.CanSSA(t1) && disjoint(op, t1.Size(), p2, sizeof(t2)) - // result: @mem.Block (Load (OffPtr [o1] p3) mem) - for { - t1 := v.Type - _ = v.Args[1] - op := v.Args[0] - if op.Op != OpOffPtr { - break - } - o1 := op.AuxInt - p1 := op.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpStore { - break - } - t2 := v_1.Aux - _ = v_1.Args[2] - p2 := v_1.Args[0] - mem := v_1.Args[2] - if mem.Op != OpZero { - break - } - n := mem.AuxInt - _ = mem.Args[1] - p3 := mem.Args[0] - if !(o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p3) && fe.CanSSA(t1) && disjoint(op, t1.Size(), p2, sizeof(t2))) { - break - } - b = mem.Block - v0 := b.NewValue0(v.Pos, OpLoad, t1) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type) - v1.AuxInt = o1 - v1.AddArg(p3) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (Load op:(OffPtr [o1] p1) (Store {t2} p2 _ (Store {t3} p3 _ mem:(Zero [n] p4 _)))) - // cond: o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p4) && fe.CanSSA(t1) && disjoint(op, t1.Size(), p2, sizeof(t2)) && disjoint(op, t1.Size(), p3, sizeof(t3)) - // result: @mem.Block (Load (OffPtr [o1] p4) mem) - for { - t1 := v.Type - _ = v.Args[1] - op := v.Args[0] - if op.Op != OpOffPtr { - break - } - o1 := op.AuxInt - p1 := op.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpStore { - break - } - t2 := v_1.Aux - _ = v_1.Args[2] - p2 := v_1.Args[0] - v_1_2 := v_1.Args[2] - if v_1_2.Op != OpStore { - break - } - t3 := v_1_2.Aux - _ = v_1_2.Args[2] - p3 := v_1_2.Args[0] - mem := v_1_2.Args[2] - if mem.Op != OpZero { - break - } - n := mem.AuxInt - _ = mem.Args[1] - p4 := mem.Args[0] - if !(o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p4) && fe.CanSSA(t1) && disjoint(op, t1.Size(), p2, sizeof(t2)) && disjoint(op, t1.Size(), p3, sizeof(t3))) { - break - } - b = mem.Block - v0 := b.NewValue0(v.Pos, OpLoad, t1) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type) - v1.AuxInt = o1 - v1.AddArg(p4) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - return false -} -func rewriteValuegeneric_OpLoad_10(v *Value) bool { - b := v.Block - fe := b.Func.fe - // match: (Load op:(OffPtr [o1] p1) (Store {t2} p2 _ (Store {t3} p3 _ (Store {t4} p4 _ mem:(Zero [n] p5 _))))) - // cond: o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p5) && fe.CanSSA(t1) && disjoint(op, t1.Size(), p2, sizeof(t2)) && disjoint(op, t1.Size(), p3, sizeof(t3)) && disjoint(op, t1.Size(), p4, sizeof(t4)) - // result: @mem.Block (Load (OffPtr [o1] p5) mem) - for { - t1 := v.Type - _ = v.Args[1] - op := v.Args[0] - if op.Op != OpOffPtr { - break - } - o1 := op.AuxInt - p1 := op.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpStore { - break - } - t2 := v_1.Aux - _ = v_1.Args[2] - p2 := v_1.Args[0] - v_1_2 := v_1.Args[2] - if v_1_2.Op != OpStore { - break - } - t3 := v_1_2.Aux - _ = v_1_2.Args[2] - p3 := v_1_2.Args[0] - v_1_2_2 := v_1_2.Args[2] - if v_1_2_2.Op != OpStore { - break - } - t4 := v_1_2_2.Aux - _ = v_1_2_2.Args[2] - p4 := v_1_2_2.Args[0] - mem := v_1_2_2.Args[2] - if mem.Op != OpZero { - break - } - n := mem.AuxInt - _ = mem.Args[1] - p5 := mem.Args[0] - if !(o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p5) && fe.CanSSA(t1) && disjoint(op, t1.Size(), p2, sizeof(t2)) && disjoint(op, t1.Size(), p3, sizeof(t3)) && disjoint(op, t1.Size(), p4, sizeof(t4))) { - break - } - b = mem.Block - v0 := b.NewValue0(v.Pos, OpLoad, t1) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type) - v1.AuxInt = o1 - v1.AddArg(p5) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (Load op:(OffPtr [o1] p1) (Store {t2} p2 _ (Store {t3} p3 _ (Store {t4} p4 _ (Store {t5} p5 _ mem:(Zero [n] p6 _)))))) - // cond: o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p6) && fe.CanSSA(t1) && disjoint(op, t1.Size(), p2, sizeof(t2)) && disjoint(op, t1.Size(), p3, sizeof(t3)) && disjoint(op, t1.Size(), p4, sizeof(t4)) && disjoint(op, t1.Size(), p5, sizeof(t5)) - // result: @mem.Block (Load (OffPtr [o1] p6) mem) - for { - t1 := v.Type - _ = v.Args[1] - op := v.Args[0] - if op.Op != OpOffPtr { - break - } - o1 := op.AuxInt - p1 := op.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpStore { - break - } - t2 := v_1.Aux - _ = v_1.Args[2] - p2 := v_1.Args[0] - v_1_2 := v_1.Args[2] - if v_1_2.Op != OpStore { - break - } - t3 := v_1_2.Aux - _ = v_1_2.Args[2] - p3 := v_1_2.Args[0] - v_1_2_2 := v_1_2.Args[2] - if v_1_2_2.Op != OpStore { - break - } - t4 := v_1_2_2.Aux - _ = v_1_2_2.Args[2] - p4 := v_1_2_2.Args[0] - v_1_2_2_2 := v_1_2_2.Args[2] - if v_1_2_2_2.Op != OpStore { - break - } - t5 := v_1_2_2_2.Aux - _ = v_1_2_2_2.Args[2] - p5 := v_1_2_2_2.Args[0] - mem := v_1_2_2_2.Args[2] - if mem.Op != OpZero { - break - } - n := mem.AuxInt - _ = mem.Args[1] - p6 := mem.Args[0] - if !(o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p6) && fe.CanSSA(t1) && disjoint(op, t1.Size(), p2, sizeof(t2)) && disjoint(op, t1.Size(), p3, sizeof(t3)) && disjoint(op, t1.Size(), p4, sizeof(t4)) && disjoint(op, t1.Size(), p5, sizeof(t5))) { - break - } - b = mem.Block - v0 := b.NewValue0(v.Pos, OpLoad, t1) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpOffPtr, op.Type) - v1.AuxInt = o1 - v1.AddArg(p6) - v0.AddArg(v1) - v0.AddArg(mem) - return true - } - // match: (Load (OffPtr [o] p1) (Zero [n] p2 _)) - // cond: t1.IsBoolean() && isSamePtr(p1, p2) && n >= o + 1 - // result: (ConstBool [0]) - for { - t1 := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - o := v_0.AuxInt - p1 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpZero { - break - } - n := v_1.AuxInt - _ = v_1.Args[1] - p2 := v_1.Args[0] - if !(t1.IsBoolean() && isSamePtr(p1, p2) && n >= o+1) { - break - } - v.reset(OpConstBool) - v.AuxInt = 0 - return true - } - // match: (Load (OffPtr [o] p1) (Zero [n] p2 _)) - // cond: is8BitInt(t1) && isSamePtr(p1, p2) && n >= o + 1 - // result: (Const8 [0]) - for { - t1 := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - o := v_0.AuxInt - p1 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpZero { - break - } - n := v_1.AuxInt - _ = v_1.Args[1] - p2 := v_1.Args[0] - if !(is8BitInt(t1) && isSamePtr(p1, p2) && n >= o+1) { - break - } - v.reset(OpConst8) - v.AuxInt = 0 - return true - } - // match: (Load (OffPtr [o] p1) (Zero [n] p2 _)) - // cond: is16BitInt(t1) && isSamePtr(p1, p2) && n >= o + 2 - // result: (Const16 [0]) - for { - t1 := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - o := v_0.AuxInt - p1 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpZero { - break - } - n := v_1.AuxInt - _ = v_1.Args[1] - p2 := v_1.Args[0] - if !(is16BitInt(t1) && isSamePtr(p1, p2) && n >= o+2) { - break - } - v.reset(OpConst16) - v.AuxInt = 0 - return true - } - // match: (Load (OffPtr [o] p1) (Zero [n] p2 _)) - // cond: is32BitInt(t1) && isSamePtr(p1, p2) && n >= o + 4 - // result: (Const32 [0]) - for { - t1 := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - o := v_0.AuxInt - p1 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpZero { - break - } - n := v_1.AuxInt - _ = v_1.Args[1] - p2 := v_1.Args[0] - if !(is32BitInt(t1) && isSamePtr(p1, p2) && n >= o+4) { - break - } - v.reset(OpConst32) - v.AuxInt = 0 - return true - } - // match: (Load (OffPtr [o] p1) (Zero [n] p2 _)) - // cond: is64BitInt(t1) && isSamePtr(p1, p2) && n >= o + 8 - // result: (Const64 [0]) - for { - t1 := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - o := v_0.AuxInt - p1 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpZero { - break - } - n := v_1.AuxInt - _ = v_1.Args[1] - p2 := v_1.Args[0] - if !(is64BitInt(t1) && isSamePtr(p1, p2) && n >= o+8) { - break - } - v.reset(OpConst64) - v.AuxInt = 0 - return true - } - // match: (Load (OffPtr [o] p1) (Zero [n] p2 _)) - // cond: is32BitFloat(t1) && isSamePtr(p1, p2) && n >= o + 4 - // result: (Const32F [0]) - for { - t1 := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - o := v_0.AuxInt - p1 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpZero { - break - } - n := v_1.AuxInt - _ = v_1.Args[1] - p2 := v_1.Args[0] - if !(is32BitFloat(t1) && isSamePtr(p1, p2) && n >= o+4) { - break - } - v.reset(OpConst32F) - v.AuxInt = 0 - return true - } - // match: (Load (OffPtr [o] p1) (Zero [n] p2 _)) - // cond: is64BitFloat(t1) && isSamePtr(p1, p2) && n >= o + 8 - // result: (Const64F [0]) - for { - t1 := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - o := v_0.AuxInt - p1 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpZero { - break - } - n := v_1.AuxInt - _ = v_1.Args[1] - p2 := v_1.Args[0] - if !(is64BitFloat(t1) && isSamePtr(p1, p2) && n >= o+8) { - break - } - v.reset(OpConst64F) - v.AuxInt = 0 - return true - } - // match: (Load _ _) - // cond: t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t) - // result: (StructMake0) - for { - t := v.Type - _ = v.Args[1] - if !(t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t)) { - break - } - v.reset(OpStructMake0) - return true - } - return false -} -func rewriteValuegeneric_OpLoad_20(v *Value) bool { - b := v.Block - fe := b.Func.fe - // match: (Load ptr mem) - // cond: t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t) - // result: (StructMake1 (Load (OffPtr [0] ptr) mem)) - for { - t := v.Type - mem := v.Args[1] - ptr := v.Args[0] - if !(t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t)) { - break - } - v.reset(OpStructMake1) - v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) - v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) - v1.AuxInt = 0 - v1.AddArg(ptr) - v0.AddArg(v1) - v0.AddArg(mem) - v.AddArg(v0) - return true - } - // match: (Load ptr mem) - // cond: t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t) - // result: (StructMake2 (Load (OffPtr [0] ptr) mem) (Load (OffPtr [t.FieldOff(1)] ptr) mem)) - for { - t := v.Type - mem := v.Args[1] - ptr := v.Args[0] - if !(t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t)) { - break - } - v.reset(OpStructMake2) - v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) - v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) - v1.AuxInt = 0 - v1.AddArg(ptr) - v0.AddArg(v1) - v0.AddArg(mem) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) - v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) - v3.AuxInt = t.FieldOff(1) - v3.AddArg(ptr) - v2.AddArg(v3) - v2.AddArg(mem) - v.AddArg(v2) - return true - } - // match: (Load ptr mem) - // cond: t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t) - // result: (StructMake3 (Load (OffPtr [0] ptr) mem) (Load (OffPtr [t.FieldOff(1)] ptr) mem) (Load (OffPtr [t.FieldOff(2)] ptr) mem)) - for { - t := v.Type - mem := v.Args[1] - ptr := v.Args[0] - if !(t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t)) { - break - } - v.reset(OpStructMake3) - v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) - v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) - v1.AuxInt = 0 - v1.AddArg(ptr) - v0.AddArg(v1) - v0.AddArg(mem) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) - v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) - v3.AuxInt = t.FieldOff(1) - v3.AddArg(ptr) - v2.AddArg(v3) - v2.AddArg(mem) - v.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpLoad, t.FieldType(2)) - v5 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) - v5.AuxInt = t.FieldOff(2) - v5.AddArg(ptr) - v4.AddArg(v5) - v4.AddArg(mem) - v.AddArg(v4) - return true - } - // match: (Load ptr mem) - // cond: t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t) - // result: (StructMake4 (Load (OffPtr [0] ptr) mem) (Load (OffPtr [t.FieldOff(1)] ptr) mem) (Load (OffPtr [t.FieldOff(2)] ptr) mem) (Load (OffPtr [t.FieldOff(3)] ptr) mem)) - for { - t := v.Type - mem := v.Args[1] - ptr := v.Args[0] - if !(t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t)) { - break - } - v.reset(OpStructMake4) - v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) - v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) - v1.AuxInt = 0 - v1.AddArg(ptr) - v0.AddArg(v1) - v0.AddArg(mem) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) - v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) - v3.AuxInt = t.FieldOff(1) - v3.AddArg(ptr) - v2.AddArg(v3) - v2.AddArg(mem) - v.AddArg(v2) - v4 := b.NewValue0(v.Pos, OpLoad, t.FieldType(2)) - v5 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) - v5.AuxInt = t.FieldOff(2) - v5.AddArg(ptr) - v4.AddArg(v5) - v4.AddArg(mem) - v.AddArg(v4) - v6 := b.NewValue0(v.Pos, OpLoad, t.FieldType(3)) - v7 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(3).PtrTo()) - v7.AuxInt = t.FieldOff(3) - v7.AddArg(ptr) - v6.AddArg(v7) - v6.AddArg(mem) - v.AddArg(v6) - return true - } - // match: (Load _ _) - // cond: t.IsArray() && t.NumElem() == 0 - // result: (ArrayMake0) - for { - t := v.Type - _ = v.Args[1] - if !(t.IsArray() && t.NumElem() == 0) { - break - } - v.reset(OpArrayMake0) - return true - } - // match: (Load ptr mem) - // cond: t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t) - // result: (ArrayMake1 (Load ptr mem)) - for { - t := v.Type - mem := v.Args[1] - ptr := v.Args[0] - if !(t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t)) { - break - } - v.reset(OpArrayMake1) - v0 := b.NewValue0(v.Pos, OpLoad, t.Elem()) - v0.AddArg(ptr) - v0.AddArg(mem) - v.AddArg(v0) - return true - } - return false -} -func rewriteValuegeneric_OpLsh16x16_0(v *Value) bool { - b := v.Block - // match: (Lsh16x16 x (Const16 [c])) - // result: (Lsh16x64 x (Const64 [int64(uint16(c))])) - for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - c := v_1.AuxInt - v.reset(OpLsh16x64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint16(c)) - v.AddArg(v0) - return true - } - // match: (Lsh16x16 (Const16 [0]) _) - // result: (Const16 [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 || v_0.AuxInt != 0 { - break - } - v.reset(OpConst16) - v.AuxInt = 0 - return true - } - return false -} -func rewriteValuegeneric_OpLsh16x32_0(v *Value) bool { - b := v.Block - // match: (Lsh16x32 x (Const32 [c])) - // result: (Lsh16x64 x (Const64 [int64(uint32(c))])) - for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - c := v_1.AuxInt - v.reset(OpLsh16x64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint32(c)) - v.AddArg(v0) - return true - } - // match: (Lsh16x32 (Const16 [0]) _) - // result: (Const16 [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 || v_0.AuxInt != 0 { - break - } - v.reset(OpConst16) - v.AuxInt = 0 - return true - } - return false -} -func rewriteValuegeneric_OpLsh16x64_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Lsh16x64 (Const16 [c]) (Const64 [d])) - // result: (Const16 [int64(int16(c) << uint64(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - v.reset(OpConst16) - v.AuxInt = int64(int16(c) << uint64(d)) - return true - } - // match: (Lsh16x64 x (Const64 [0])) - // result: x - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 0 { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Lsh16x64 (Const16 [0]) _) - // result: (Const16 [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 || v_0.AuxInt != 0 { - break - } - v.reset(OpConst16) - v.AuxInt = 0 - return true - } - // match: (Lsh16x64 _ (Const64 [c])) - // cond: uint64(c) >= 16 - // result: (Const16 [0]) - for { - _ = v.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c := v_1.AuxInt - if !(uint64(c) >= 16) { - break - } - v.reset(OpConst16) - v.AuxInt = 0 - return true - } - // match: (Lsh16x64 (Lsh16x64 x (Const64 [c])) (Const64 [d])) - // cond: !uaddOvf(c,d) - // result: (Lsh16x64 x (Const64 [c+d])) - for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh16x64 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - if !(!uaddOvf(c, d)) { - break - } - v.reset(OpLsh16x64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c + d - v.AddArg(v0) - return true - } - // match: (Lsh16x64 (Rsh16Ux64 (Lsh16x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) - // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) - // result: (Lsh16x64 x (Const64 [c1-c2+c3])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpRsh16Ux64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpLsh16x64 { - break - } - _ = v_0_0.Args[1] - x := v_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 { - break - } - c1 := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c2 := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c3 := v_1.AuxInt - if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { - break - } - v.reset(OpLsh16x64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v0.AuxInt = c1 - c2 + c3 - v.AddArg(v0) - return true - } - return false -} -func rewriteValuegeneric_OpLsh16x8_0(v *Value) bool { - b := v.Block - // match: (Lsh16x8 x (Const8 [c])) - // result: (Lsh16x64 x (Const64 [int64(uint8(c))])) - for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break - } - c := v_1.AuxInt - v.reset(OpLsh16x64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint8(c)) - v.AddArg(v0) - return true - } - // match: (Lsh16x8 (Const16 [0]) _) - // result: (Const16 [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 || v_0.AuxInt != 0 { - break - } - v.reset(OpConst16) - v.AuxInt = 0 - return true - } - return false -} -func rewriteValuegeneric_OpLsh32x16_0(v *Value) bool { - b := v.Block - // match: (Lsh32x16 x (Const16 [c])) - // result: (Lsh32x64 x (Const64 [int64(uint16(c))])) - for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - c := v_1.AuxInt - v.reset(OpLsh32x64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint16(c)) - v.AddArg(v0) - return true - } - // match: (Lsh32x16 (Const32 [0]) _) - // result: (Const32 [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 || v_0.AuxInt != 0 { - break - } - v.reset(OpConst32) - v.AuxInt = 0 - return true - } - return false -} -func rewriteValuegeneric_OpLsh32x32_0(v *Value) bool { - b := v.Block - // match: (Lsh32x32 x (Const32 [c])) - // result: (Lsh32x64 x (Const64 [int64(uint32(c))])) - for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - c := v_1.AuxInt - v.reset(OpLsh32x64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint32(c)) - v.AddArg(v0) - return true - } - // match: (Lsh32x32 (Const32 [0]) _) - // result: (Const32 [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 || v_0.AuxInt != 0 { - break - } - v.reset(OpConst32) - v.AuxInt = 0 - return true - } - return false -} -func rewriteValuegeneric_OpLsh32x64_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Lsh32x64 (Const32 [c]) (Const64 [d])) - // result: (Const32 [int64(int32(c) << uint64(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - v.reset(OpConst32) - v.AuxInt = int64(int32(c) << uint64(d)) - return true - } - // match: (Lsh32x64 x (Const64 [0])) - // result: x - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 0 { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Lsh32x64 (Const32 [0]) _) - // result: (Const32 [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 || v_0.AuxInt != 0 { - break - } - v.reset(OpConst32) - v.AuxInt = 0 - return true - } - // match: (Lsh32x64 _ (Const64 [c])) - // cond: uint64(c) >= 32 - // result: (Const32 [0]) - for { - _ = v.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c := v_1.AuxInt - if !(uint64(c) >= 32) { - break - } - v.reset(OpConst32) - v.AuxInt = 0 - return true - } - // match: (Lsh32x64 (Lsh32x64 x (Const64 [c])) (Const64 [d])) - // cond: !uaddOvf(c,d) - // result: (Lsh32x64 x (Const64 [c+d])) - for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh32x64 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - if !(!uaddOvf(c, d)) { - break - } - v.reset(OpLsh32x64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c + d - v.AddArg(v0) - return true - } - // match: (Lsh32x64 (Rsh32Ux64 (Lsh32x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) - // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) - // result: (Lsh32x64 x (Const64 [c1-c2+c3])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpRsh32Ux64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpLsh32x64 { - break - } - _ = v_0_0.Args[1] - x := v_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 { - break - } - c1 := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c2 := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c3 := v_1.AuxInt - if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { - break - } - v.reset(OpLsh32x64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v0.AuxInt = c1 - c2 + c3 - v.AddArg(v0) - return true - } - return false -} -func rewriteValuegeneric_OpLsh32x8_0(v *Value) bool { - b := v.Block - // match: (Lsh32x8 x (Const8 [c])) - // result: (Lsh32x64 x (Const64 [int64(uint8(c))])) - for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break - } - c := v_1.AuxInt - v.reset(OpLsh32x64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint8(c)) - v.AddArg(v0) - return true - } - // match: (Lsh32x8 (Const32 [0]) _) - // result: (Const32 [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 || v_0.AuxInt != 0 { - break - } - v.reset(OpConst32) - v.AuxInt = 0 - return true - } - return false -} -func rewriteValuegeneric_OpLsh64x16_0(v *Value) bool { - b := v.Block - // match: (Lsh64x16 x (Const16 [c])) - // result: (Lsh64x64 x (Const64 [int64(uint16(c))])) - for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - c := v_1.AuxInt - v.reset(OpLsh64x64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint16(c)) - v.AddArg(v0) - return true - } - // match: (Lsh64x16 (Const64 [0]) _) - // result: (Const64 [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 || v_0.AuxInt != 0 { - break - } - v.reset(OpConst64) - v.AuxInt = 0 - return true - } - return false -} -func rewriteValuegeneric_OpLsh64x32_0(v *Value) bool { - b := v.Block - // match: (Lsh64x32 x (Const32 [c])) - // result: (Lsh64x64 x (Const64 [int64(uint32(c))])) - for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - c := v_1.AuxInt - v.reset(OpLsh64x64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint32(c)) - v.AddArg(v0) - return true - } - // match: (Lsh64x32 (Const64 [0]) _) - // result: (Const64 [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 || v_0.AuxInt != 0 { - break - } - v.reset(OpConst64) - v.AuxInt = 0 - return true - } - return false -} -func rewriteValuegeneric_OpLsh64x64_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Lsh64x64 (Const64 [c]) (Const64 [d])) - // result: (Const64 [c << uint64(d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - v.reset(OpConst64) - v.AuxInt = c << uint64(d) - return true - } - // match: (Lsh64x64 x (Const64 [0])) - // result: x - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 0 { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Lsh64x64 (Const64 [0]) _) - // result: (Const64 [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 || v_0.AuxInt != 0 { - break - } - v.reset(OpConst64) - v.AuxInt = 0 - return true - } - // match: (Lsh64x64 _ (Const64 [c])) - // cond: uint64(c) >= 64 - // result: (Const64 [0]) - for { - _ = v.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c := v_1.AuxInt - if !(uint64(c) >= 64) { - break - } - v.reset(OpConst64) - v.AuxInt = 0 - return true - } - // match: (Lsh64x64 (Lsh64x64 x (Const64 [c])) (Const64 [d])) - // cond: !uaddOvf(c,d) - // result: (Lsh64x64 x (Const64 [c+d])) - for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh64x64 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - if !(!uaddOvf(c, d)) { - break - } - v.reset(OpLsh64x64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c + d - v.AddArg(v0) - return true - } - // match: (Lsh64x64 (Rsh64Ux64 (Lsh64x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) - // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) - // result: (Lsh64x64 x (Const64 [c1-c2+c3])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpRsh64Ux64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpLsh64x64 { - break - } - _ = v_0_0.Args[1] - x := v_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 { - break - } - c1 := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c2 := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c3 := v_1.AuxInt - if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { - break - } - v.reset(OpLsh64x64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v0.AuxInt = c1 - c2 + c3 - v.AddArg(v0) - return true - } - return false -} -func rewriteValuegeneric_OpLsh64x8_0(v *Value) bool { - b := v.Block - // match: (Lsh64x8 x (Const8 [c])) - // result: (Lsh64x64 x (Const64 [int64(uint8(c))])) - for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break - } - c := v_1.AuxInt - v.reset(OpLsh64x64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint8(c)) - v.AddArg(v0) - return true - } - // match: (Lsh64x8 (Const64 [0]) _) - // result: (Const64 [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 || v_0.AuxInt != 0 { - break - } - v.reset(OpConst64) - v.AuxInt = 0 - return true - } - return false -} -func rewriteValuegeneric_OpLsh8x16_0(v *Value) bool { - b := v.Block - // match: (Lsh8x16 x (Const16 [c])) - // result: (Lsh8x64 x (Const64 [int64(uint16(c))])) - for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - c := v_1.AuxInt - v.reset(OpLsh8x64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint16(c)) - v.AddArg(v0) - return true - } - // match: (Lsh8x16 (Const8 [0]) _) - // result: (Const8 [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 || v_0.AuxInt != 0 { - break - } - v.reset(OpConst8) - v.AuxInt = 0 - return true - } - return false -} -func rewriteValuegeneric_OpLsh8x32_0(v *Value) bool { - b := v.Block - // match: (Lsh8x32 x (Const32 [c])) - // result: (Lsh8x64 x (Const64 [int64(uint32(c))])) - for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - c := v_1.AuxInt - v.reset(OpLsh8x64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint32(c)) - v.AddArg(v0) - return true - } - // match: (Lsh8x32 (Const8 [0]) _) - // result: (Const8 [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 || v_0.AuxInt != 0 { - break - } - v.reset(OpConst8) - v.AuxInt = 0 - return true - } - return false -} -func rewriteValuegeneric_OpLsh8x64_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Lsh8x64 (Const8 [c]) (Const64 [d])) - // result: (Const8 [int64(int8(c) << uint64(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - v.reset(OpConst8) - v.AuxInt = int64(int8(c) << uint64(d)) - return true - } - // match: (Lsh8x64 x (Const64 [0])) - // result: x - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 0 { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Lsh8x64 (Const8 [0]) _) - // result: (Const8 [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 || v_0.AuxInt != 0 { - break - } - v.reset(OpConst8) - v.AuxInt = 0 - return true - } - // match: (Lsh8x64 _ (Const64 [c])) - // cond: uint64(c) >= 8 - // result: (Const8 [0]) - for { - _ = v.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c := v_1.AuxInt - if !(uint64(c) >= 8) { - break - } - v.reset(OpConst8) - v.AuxInt = 0 - return true - } - // match: (Lsh8x64 (Lsh8x64 x (Const64 [c])) (Const64 [d])) - // cond: !uaddOvf(c,d) - // result: (Lsh8x64 x (Const64 [c+d])) - for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh8x64 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - if !(!uaddOvf(c, d)) { - break - } - v.reset(OpLsh8x64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c + d - v.AddArg(v0) - return true - } - // match: (Lsh8x64 (Rsh8Ux64 (Lsh8x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) - // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) - // result: (Lsh8x64 x (Const64 [c1-c2+c3])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpRsh8Ux64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpLsh8x64 { - break - } - _ = v_0_0.Args[1] - x := v_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 { - break - } - c1 := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c2 := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c3 := v_1.AuxInt - if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { - break - } - v.reset(OpLsh8x64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v0.AuxInt = c1 - c2 + c3 - v.AddArg(v0) - return true - } - return false -} -func rewriteValuegeneric_OpLsh8x8_0(v *Value) bool { - b := v.Block - // match: (Lsh8x8 x (Const8 [c])) - // result: (Lsh8x64 x (Const64 [int64(uint8(c))])) - for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break - } - c := v_1.AuxInt - v.reset(OpLsh8x64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint8(c)) - v.AddArg(v0) - return true - } - // match: (Lsh8x8 (Const8 [0]) _) - // result: (Const8 [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 || v_0.AuxInt != 0 { - break - } - v.reset(OpConst8) - v.AuxInt = 0 - return true - } - return false -} -func rewriteValuegeneric_OpMod16_0(v *Value) bool { - b := v.Block - // match: (Mod16 (Const16 [c]) (Const16 [d])) - // cond: d != 0 - // result: (Const16 [int64(int16(c % d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - d := v_1.AuxInt - if !(d != 0) { - break - } - v.reset(OpConst16) - v.AuxInt = int64(int16(c % d)) - return true - } - // match: (Mod16 n (Const16 [c])) - // cond: isNonNegative(n) && isPowerOfTwo(c&0xffff) - // result: (And16 n (Const16 [(c&0xffff)-1])) - for { - t := v.Type - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - c := v_1.AuxInt - if !(isNonNegative(n) && isPowerOfTwo(c&0xffff)) { - break - } - v.reset(OpAnd16) - v.AddArg(n) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = (c & 0xffff) - 1 - v.AddArg(v0) - return true - } - // match: (Mod16 n (Const16 [c])) - // cond: c < 0 && c != -1<<15 - // result: (Mod16 n (Const16 [-c])) - for { - t := v.Type - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - c := v_1.AuxInt - if !(c < 0 && c != -1<<15) { - break - } - v.reset(OpMod16) - v.Type = t - v.AddArg(n) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = -c - v.AddArg(v0) - return true - } - // match: (Mod16 x (Const16 [c])) - // cond: x.Op != OpConst16 && (c > 0 || c == -1<<15) - // result: (Sub16 x (Mul16 (Div16 x (Const16 [c])) (Const16 [c]))) - for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - c := v_1.AuxInt - if !(x.Op != OpConst16 && (c > 0 || c == -1<<15)) { - break - } - v.reset(OpSub16) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpMul16, t) - v1 := b.NewValue0(v.Pos, OpDiv16, t) - v1.AddArg(x) - v2 := b.NewValue0(v.Pos, OpConst16, t) - v2.AuxInt = c - v1.AddArg(v2) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, t) - v3.AuxInt = c - v0.AddArg(v3) - v.AddArg(v0) - return true - } - return false -} -func rewriteValuegeneric_OpMod16u_0(v *Value) bool { - b := v.Block - // match: (Mod16u (Const16 [c]) (Const16 [d])) - // cond: d != 0 - // result: (Const16 [int64(uint16(c) % uint16(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - d := v_1.AuxInt - if !(d != 0) { - break - } - v.reset(OpConst16) - v.AuxInt = int64(uint16(c) % uint16(d)) - return true - } - // match: (Mod16u n (Const16 [c])) - // cond: isPowerOfTwo(c&0xffff) - // result: (And16 n (Const16 [(c&0xffff)-1])) - for { - t := v.Type - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c & 0xffff)) { - break - } - v.reset(OpAnd16) - v.AddArg(n) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = (c & 0xffff) - 1 - v.AddArg(v0) - return true - } - // match: (Mod16u x (Const16 [c])) - // cond: x.Op != OpConst16 && c > 0 && umagicOK(16,c) - // result: (Sub16 x (Mul16 (Div16u x (Const16 [c])) (Const16 [c]))) - for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - c := v_1.AuxInt - if !(x.Op != OpConst16 && c > 0 && umagicOK(16, c)) { - break - } - v.reset(OpSub16) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpMul16, t) - v1 := b.NewValue0(v.Pos, OpDiv16u, t) - v1.AddArg(x) - v2 := b.NewValue0(v.Pos, OpConst16, t) - v2.AuxInt = c - v1.AddArg(v2) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst16, t) - v3.AuxInt = c - v0.AddArg(v3) - v.AddArg(v0) - return true - } - return false -} -func rewriteValuegeneric_OpMod32_0(v *Value) bool { - b := v.Block - // match: (Mod32 (Const32 [c]) (Const32 [d])) - // cond: d != 0 - // result: (Const32 [int64(int32(c % d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - d := v_1.AuxInt - if !(d != 0) { - break - } - v.reset(OpConst32) - v.AuxInt = int64(int32(c % d)) - return true - } - // match: (Mod32 n (Const32 [c])) - // cond: isNonNegative(n) && isPowerOfTwo(c&0xffffffff) - // result: (And32 n (Const32 [(c&0xffffffff)-1])) - for { - t := v.Type - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - c := v_1.AuxInt - if !(isNonNegative(n) && isPowerOfTwo(c&0xffffffff)) { - break - } - v.reset(OpAnd32) - v.AddArg(n) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = (c & 0xffffffff) - 1 - v.AddArg(v0) - return true - } - // match: (Mod32 n (Const32 [c])) - // cond: c < 0 && c != -1<<31 - // result: (Mod32 n (Const32 [-c])) - for { - t := v.Type - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - c := v_1.AuxInt - if !(c < 0 && c != -1<<31) { - break - } - v.reset(OpMod32) - v.Type = t - v.AddArg(n) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = -c - v.AddArg(v0) - return true - } - // match: (Mod32 x (Const32 [c])) - // cond: x.Op != OpConst32 && (c > 0 || c == -1<<31) - // result: (Sub32 x (Mul32 (Div32 x (Const32 [c])) (Const32 [c]))) - for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - c := v_1.AuxInt - if !(x.Op != OpConst32 && (c > 0 || c == -1<<31)) { - break - } - v.reset(OpSub32) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpMul32, t) - v1 := b.NewValue0(v.Pos, OpDiv32, t) - v1.AddArg(x) - v2 := b.NewValue0(v.Pos, OpConst32, t) - v2.AuxInt = c - v1.AddArg(v2) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, t) - v3.AuxInt = c - v0.AddArg(v3) - v.AddArg(v0) - return true - } - return false -} -func rewriteValuegeneric_OpMod32u_0(v *Value) bool { - b := v.Block - // match: (Mod32u (Const32 [c]) (Const32 [d])) - // cond: d != 0 - // result: (Const32 [int64(uint32(c) % uint32(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - d := v_1.AuxInt - if !(d != 0) { - break - } - v.reset(OpConst32) - v.AuxInt = int64(uint32(c) % uint32(d)) - return true - } - // match: (Mod32u n (Const32 [c])) - // cond: isPowerOfTwo(c&0xffffffff) - // result: (And32 n (Const32 [(c&0xffffffff)-1])) - for { - t := v.Type - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c & 0xffffffff)) { - break - } - v.reset(OpAnd32) - v.AddArg(n) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = (c & 0xffffffff) - 1 - v.AddArg(v0) - return true - } - // match: (Mod32u x (Const32 [c])) - // cond: x.Op != OpConst32 && c > 0 && umagicOK(32,c) - // result: (Sub32 x (Mul32 (Div32u x (Const32 [c])) (Const32 [c]))) - for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - c := v_1.AuxInt - if !(x.Op != OpConst32 && c > 0 && umagicOK(32, c)) { - break - } - v.reset(OpSub32) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpMul32, t) - v1 := b.NewValue0(v.Pos, OpDiv32u, t) - v1.AddArg(x) - v2 := b.NewValue0(v.Pos, OpConst32, t) - v2.AuxInt = c - v1.AddArg(v2) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst32, t) - v3.AuxInt = c - v0.AddArg(v3) - v.AddArg(v0) - return true - } - return false -} -func rewriteValuegeneric_OpMod64_0(v *Value) bool { - b := v.Block - // match: (Mod64 (Const64 [c]) (Const64 [d])) - // cond: d != 0 - // result: (Const64 [c % d]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - if !(d != 0) { - break - } - v.reset(OpConst64) - v.AuxInt = c % d - return true - } - // match: (Mod64 n (Const64 [c])) - // cond: isNonNegative(n) && isPowerOfTwo(c) - // result: (And64 n (Const64 [c-1])) - for { - t := v.Type - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c := v_1.AuxInt - if !(isNonNegative(n) && isPowerOfTwo(c)) { - break - } - v.reset(OpAnd64) - v.AddArg(n) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c - 1 - v.AddArg(v0) - return true - } - // match: (Mod64 n (Const64 [-1<<63])) - // cond: isNonNegative(n) - // result: n - for { - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != -1<<63 || !(isNonNegative(n)) { - break - } - v.reset(OpCopy) - v.Type = n.Type - v.AddArg(n) - return true - } - // match: (Mod64 n (Const64 [c])) - // cond: c < 0 && c != -1<<63 - // result: (Mod64 n (Const64 [-c])) - for { - t := v.Type - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c := v_1.AuxInt - if !(c < 0 && c != -1<<63) { - break - } - v.reset(OpMod64) - v.Type = t - v.AddArg(n) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = -c - v.AddArg(v0) - return true - } - // match: (Mod64 x (Const64 [c])) - // cond: x.Op != OpConst64 && (c > 0 || c == -1<<63) - // result: (Sub64 x (Mul64 (Div64 x (Const64 [c])) (Const64 [c]))) - for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c := v_1.AuxInt - if !(x.Op != OpConst64 && (c > 0 || c == -1<<63)) { - break - } - v.reset(OpSub64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpMul64, t) - v1 := b.NewValue0(v.Pos, OpDiv64, t) - v1.AddArg(x) - v2 := b.NewValue0(v.Pos, OpConst64, t) - v2.AuxInt = c - v1.AddArg(v2) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst64, t) - v3.AuxInt = c - v0.AddArg(v3) - v.AddArg(v0) - return true - } - return false -} -func rewriteValuegeneric_OpMod64u_0(v *Value) bool { - b := v.Block - // match: (Mod64u (Const64 [c]) (Const64 [d])) - // cond: d != 0 - // result: (Const64 [int64(uint64(c) % uint64(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - if !(d != 0) { - break - } - v.reset(OpConst64) - v.AuxInt = int64(uint64(c) % uint64(d)) - return true - } - // match: (Mod64u n (Const64 [c])) - // cond: isPowerOfTwo(c) - // result: (And64 n (Const64 [c-1])) - for { - t := v.Type - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c)) { - break - } - v.reset(OpAnd64) - v.AddArg(n) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c - 1 - v.AddArg(v0) - return true - } - // match: (Mod64u n (Const64 [-1<<63])) - // result: (And64 n (Const64 [1<<63-1])) - for { - t := v.Type - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != -1<<63 { - break - } - v.reset(OpAnd64) - v.AddArg(n) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = 1<<63 - 1 - v.AddArg(v0) - return true - } - // match: (Mod64u x (Const64 [c])) - // cond: x.Op != OpConst64 && c > 0 && umagicOK(64,c) - // result: (Sub64 x (Mul64 (Div64u x (Const64 [c])) (Const64 [c]))) - for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c := v_1.AuxInt - if !(x.Op != OpConst64 && c > 0 && umagicOK(64, c)) { - break - } - v.reset(OpSub64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpMul64, t) - v1 := b.NewValue0(v.Pos, OpDiv64u, t) - v1.AddArg(x) - v2 := b.NewValue0(v.Pos, OpConst64, t) - v2.AuxInt = c - v1.AddArg(v2) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst64, t) - v3.AuxInt = c - v0.AddArg(v3) - v.AddArg(v0) - return true - } - return false -} -func rewriteValuegeneric_OpMod8_0(v *Value) bool { - b := v.Block - // match: (Mod8 (Const8 [c]) (Const8 [d])) - // cond: d != 0 - // result: (Const8 [int64(int8(c % d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break - } - d := v_1.AuxInt - if !(d != 0) { - break - } - v.reset(OpConst8) - v.AuxInt = int64(int8(c % d)) - return true - } - // match: (Mod8 n (Const8 [c])) - // cond: isNonNegative(n) && isPowerOfTwo(c&0xff) - // result: (And8 n (Const8 [(c&0xff)-1])) - for { - t := v.Type - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break - } - c := v_1.AuxInt - if !(isNonNegative(n) && isPowerOfTwo(c&0xff)) { - break - } - v.reset(OpAnd8) - v.AddArg(n) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = (c & 0xff) - 1 - v.AddArg(v0) - return true - } - // match: (Mod8 n (Const8 [c])) - // cond: c < 0 && c != -1<<7 - // result: (Mod8 n (Const8 [-c])) - for { - t := v.Type - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break - } - c := v_1.AuxInt - if !(c < 0 && c != -1<<7) { - break - } - v.reset(OpMod8) - v.Type = t - v.AddArg(n) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = -c - v.AddArg(v0) - return true - } - // match: (Mod8 x (Const8 [c])) - // cond: x.Op != OpConst8 && (c > 0 || c == -1<<7) - // result: (Sub8 x (Mul8 (Div8 x (Const8 [c])) (Const8 [c]))) - for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break - } - c := v_1.AuxInt - if !(x.Op != OpConst8 && (c > 0 || c == -1<<7)) { - break - } - v.reset(OpSub8) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpMul8, t) - v1 := b.NewValue0(v.Pos, OpDiv8, t) - v1.AddArg(x) - v2 := b.NewValue0(v.Pos, OpConst8, t) - v2.AuxInt = c - v1.AddArg(v2) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst8, t) - v3.AuxInt = c - v0.AddArg(v3) - v.AddArg(v0) - return true - } - return false -} -func rewriteValuegeneric_OpMod8u_0(v *Value) bool { - b := v.Block - // match: (Mod8u (Const8 [c]) (Const8 [d])) - // cond: d != 0 - // result: (Const8 [int64(uint8(c) % uint8(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break - } - d := v_1.AuxInt - if !(d != 0) { - break - } - v.reset(OpConst8) - v.AuxInt = int64(uint8(c) % uint8(d)) - return true - } - // match: (Mod8u n (Const8 [c])) - // cond: isPowerOfTwo(c&0xff) - // result: (And8 n (Const8 [(c&0xff)-1])) - for { - t := v.Type - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c & 0xff)) { - break - } - v.reset(OpAnd8) - v.AddArg(n) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = (c & 0xff) - 1 - v.AddArg(v0) - return true - } - // match: (Mod8u x (Const8 [c])) - // cond: x.Op != OpConst8 && c > 0 && umagicOK(8, c) - // result: (Sub8 x (Mul8 (Div8u x (Const8 [c])) (Const8 [c]))) - for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break - } - c := v_1.AuxInt - if !(x.Op != OpConst8 && c > 0 && umagicOK(8, c)) { - break - } - v.reset(OpSub8) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpMul8, t) - v1 := b.NewValue0(v.Pos, OpDiv8u, t) - v1.AddArg(x) - v2 := b.NewValue0(v.Pos, OpConst8, t) - v2.AuxInt = c - v1.AddArg(v2) - v0.AddArg(v1) - v3 := b.NewValue0(v.Pos, OpConst8, t) - v3.AuxInt = c - v0.AddArg(v3) - v.AddArg(v0) - return true - } - return false -} -func rewriteValuegeneric_OpMove_0(v *Value) bool { - b := v.Block - // match: (Move {t} [n] dst1 src mem:(Zero {t} [n] dst2 _)) - // cond: isSamePtr(src, dst2) - // result: (Zero {t} [n] dst1 mem) - for { - n := v.AuxInt - t := v.Aux - _ = v.Args[2] - dst1 := v.Args[0] - src := v.Args[1] - mem := v.Args[2] - if mem.Op != OpZero || mem.AuxInt != n || mem.Aux != t { - break - } - _ = mem.Args[1] - dst2 := mem.Args[0] - if !(isSamePtr(src, dst2)) { - break - } - v.reset(OpZero) - v.AuxInt = n - v.Aux = t - v.AddArg(dst1) - v.AddArg(mem) - return true - } - // match: (Move {t} [n] dst1 src mem:(VarDef (Zero {t} [n] dst0 _))) - // cond: isSamePtr(src, dst0) - // result: (Zero {t} [n] dst1 mem) - for { - n := v.AuxInt - t := v.Aux - _ = v.Args[2] - dst1 := v.Args[0] - src := v.Args[1] - mem := v.Args[2] - if mem.Op != OpVarDef { - break - } - mem_0 := mem.Args[0] - if mem_0.Op != OpZero || mem_0.AuxInt != n || mem_0.Aux != t { - break - } - _ = mem_0.Args[1] - dst0 := mem_0.Args[0] - if !(isSamePtr(src, dst0)) { - break - } - v.reset(OpZero) - v.AuxInt = n - v.Aux = t - v.AddArg(dst1) - v.AddArg(mem) - return true - } - // match: (Move {t1} [n] dst1 src1 store:(Store {t2} op:(OffPtr [o2] dst2) _ mem)) - // cond: isSamePtr(dst1, dst2) && store.Uses == 1 && n >= o2 + sizeof(t2) && disjoint(src1, n, op, sizeof(t2)) && clobber(store) - // result: (Move {t1} [n] dst1 src1 mem) - for { - n := v.AuxInt - t1 := v.Aux - _ = v.Args[2] - dst1 := v.Args[0] - src1 := v.Args[1] - store := v.Args[2] - if store.Op != OpStore { - break - } - t2 := store.Aux - mem := store.Args[2] - op := store.Args[0] - if op.Op != OpOffPtr { - break - } - o2 := op.AuxInt - dst2 := op.Args[0] - if !(isSamePtr(dst1, dst2) && store.Uses == 1 && n >= o2+sizeof(t2) && disjoint(src1, n, op, sizeof(t2)) && clobber(store)) { - break - } - v.reset(OpMove) - v.AuxInt = n - v.Aux = t1 - v.AddArg(dst1) - v.AddArg(src1) - v.AddArg(mem) - return true - } - // match: (Move {t} [n] dst1 src1 move:(Move {t} [n] dst2 _ mem)) - // cond: move.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(move) - // result: (Move {t} [n] dst1 src1 mem) - for { - n := v.AuxInt - t := v.Aux - _ = v.Args[2] - dst1 := v.Args[0] - src1 := v.Args[1] - move := v.Args[2] - if move.Op != OpMove || move.AuxInt != n || move.Aux != t { - break - } - mem := move.Args[2] - dst2 := move.Args[0] - if !(move.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(move)) { - break - } - v.reset(OpMove) - v.AuxInt = n - v.Aux = t - v.AddArg(dst1) - v.AddArg(src1) - v.AddArg(mem) - return true - } - // match: (Move {t} [n] dst1 src1 vardef:(VarDef {x} move:(Move {t} [n] dst2 _ mem))) - // cond: move.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(move) && clobber(vardef) - // result: (Move {t} [n] dst1 src1 (VarDef {x} mem)) - for { - n := v.AuxInt - t := v.Aux - _ = v.Args[2] - dst1 := v.Args[0] - src1 := v.Args[1] - vardef := v.Args[2] - if vardef.Op != OpVarDef { - break - } - x := vardef.Aux - move := vardef.Args[0] - if move.Op != OpMove || move.AuxInt != n || move.Aux != t { - break - } - mem := move.Args[2] - dst2 := move.Args[0] - if !(move.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(move) && clobber(vardef)) { - break - } - v.reset(OpMove) - v.AuxInt = n - v.Aux = t - v.AddArg(dst1) - v.AddArg(src1) - v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem) - v0.Aux = x - v0.AddArg(mem) - v.AddArg(v0) - return true - } - // match: (Move {t} [n] dst1 src1 zero:(Zero {t} [n] dst2 mem)) - // cond: zero.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(zero) - // result: (Move {t} [n] dst1 src1 mem) - for { - n := v.AuxInt - t := v.Aux - _ = v.Args[2] - dst1 := v.Args[0] - src1 := v.Args[1] - zero := v.Args[2] - if zero.Op != OpZero || zero.AuxInt != n || zero.Aux != t { - break - } - mem := zero.Args[1] - dst2 := zero.Args[0] - if !(zero.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(zero)) { - break - } - v.reset(OpMove) - v.AuxInt = n - v.Aux = t - v.AddArg(dst1) - v.AddArg(src1) - v.AddArg(mem) - return true - } - // match: (Move {t} [n] dst1 src1 vardef:(VarDef {x} zero:(Zero {t} [n] dst2 mem))) - // cond: zero.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(zero) && clobber(vardef) - // result: (Move {t} [n] dst1 src1 (VarDef {x} mem)) - for { - n := v.AuxInt - t := v.Aux - _ = v.Args[2] - dst1 := v.Args[0] - src1 := v.Args[1] - vardef := v.Args[2] - if vardef.Op != OpVarDef { - break - } - x := vardef.Aux - zero := vardef.Args[0] - if zero.Op != OpZero || zero.AuxInt != n || zero.Aux != t { - break - } - mem := zero.Args[1] - dst2 := zero.Args[0] - if !(zero.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(zero) && clobber(vardef)) { - break - } - v.reset(OpMove) - v.AuxInt = n - v.Aux = t - v.AddArg(dst1) - v.AddArg(src1) - v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem) - v0.Aux = x - v0.AddArg(mem) - v.AddArg(v0) - return true - } - // match: (Move {t1} [n] dst p1 mem:(Store {t2} op2:(OffPtr [o2] p2) d1 (Store {t3} op3:(OffPtr [0] p3) d2 _))) - // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && o2 == sizeof(t3) && n == sizeof(t2) + sizeof(t3) - // result: (Store {t2} (OffPtr [o2] dst) d1 (Store {t3} (OffPtr [0] dst) d2 mem)) - for { - n := v.AuxInt - t1 := v.Aux - _ = v.Args[2] - dst := v.Args[0] - p1 := v.Args[1] - mem := v.Args[2] - if mem.Op != OpStore { - break - } - t2 := mem.Aux - _ = mem.Args[2] - op2 := mem.Args[0] - if op2.Op != OpOffPtr { - break - } - tt2 := op2.Type - o2 := op2.AuxInt - p2 := op2.Args[0] - d1 := mem.Args[1] - mem_2 := mem.Args[2] - if mem_2.Op != OpStore { - break - } - t3 := mem_2.Aux - _ = mem_2.Args[2] - op3 := mem_2.Args[0] - if op3.Op != OpOffPtr { - break - } - tt3 := op3.Type - if op3.AuxInt != 0 { - break - } - p3 := op3.Args[0] - d2 := mem_2.Args[1] - if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && o2 == sizeof(t3) && n == sizeof(t2)+sizeof(t3)) { - break - } - v.reset(OpStore) - v.Aux = t2 - v0 := b.NewValue0(v.Pos, OpOffPtr, tt2) - v0.AuxInt = o2 - v0.AddArg(dst) - v.AddArg(v0) - v.AddArg(d1) - v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v1.Aux = t3 - v2 := b.NewValue0(v.Pos, OpOffPtr, tt3) - v2.AuxInt = 0 - v2.AddArg(dst) - v1.AddArg(v2) - v1.AddArg(d2) - v1.AddArg(mem) - v.AddArg(v1) - return true - } - // match: (Move {t1} [n] dst p1 mem:(Store {t2} op2:(OffPtr [o2] p2) d1 (Store {t3} op3:(OffPtr [o3] p3) d2 (Store {t4} op4:(OffPtr [0] p4) d3 _)))) - // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && o3 == sizeof(t4) && o2-o3 == sizeof(t3) && n == sizeof(t2) + sizeof(t3) + sizeof(t4) - // result: (Store {t2} (OffPtr [o2] dst) d1 (Store {t3} (OffPtr [o3] dst) d2 (Store {t4} (OffPtr [0] dst) d3 mem))) - for { - n := v.AuxInt - t1 := v.Aux - _ = v.Args[2] - dst := v.Args[0] - p1 := v.Args[1] - mem := v.Args[2] - if mem.Op != OpStore { - break - } - t2 := mem.Aux - _ = mem.Args[2] - op2 := mem.Args[0] - if op2.Op != OpOffPtr { - break - } - tt2 := op2.Type - o2 := op2.AuxInt - p2 := op2.Args[0] - d1 := mem.Args[1] - mem_2 := mem.Args[2] - if mem_2.Op != OpStore { - break - } - t3 := mem_2.Aux - _ = mem_2.Args[2] - op3 := mem_2.Args[0] - if op3.Op != OpOffPtr { - break - } - tt3 := op3.Type - o3 := op3.AuxInt - p3 := op3.Args[0] - d2 := mem_2.Args[1] - mem_2_2 := mem_2.Args[2] - if mem_2_2.Op != OpStore { - break - } - t4 := mem_2_2.Aux - _ = mem_2_2.Args[2] - op4 := mem_2_2.Args[0] - if op4.Op != OpOffPtr { - break - } - tt4 := op4.Type - if op4.AuxInt != 0 { - break - } - p4 := op4.Args[0] - d3 := mem_2_2.Args[1] - if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && o3 == sizeof(t4) && o2-o3 == sizeof(t3) && n == sizeof(t2)+sizeof(t3)+sizeof(t4)) { - break - } - v.reset(OpStore) - v.Aux = t2 - v0 := b.NewValue0(v.Pos, OpOffPtr, tt2) - v0.AuxInt = o2 - v0.AddArg(dst) - v.AddArg(v0) - v.AddArg(d1) - v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v1.Aux = t3 - v2 := b.NewValue0(v.Pos, OpOffPtr, tt3) - v2.AuxInt = o3 - v2.AddArg(dst) - v1.AddArg(v2) - v1.AddArg(d2) - v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v3.Aux = t4 - v4 := b.NewValue0(v.Pos, OpOffPtr, tt4) - v4.AuxInt = 0 - v4.AddArg(dst) - v3.AddArg(v4) - v3.AddArg(d3) - v3.AddArg(mem) - v1.AddArg(v3) - v.AddArg(v1) - return true - } - // match: (Move {t1} [n] dst p1 mem:(Store {t2} op2:(OffPtr [o2] p2) d1 (Store {t3} op3:(OffPtr [o3] p3) d2 (Store {t4} op4:(OffPtr [o4] p4) d3 (Store {t5} op5:(OffPtr [0] p5) d4 _))))) - // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && alignof(t5) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && registerizable(b, t5) && o4 == sizeof(t5) && o3-o4 == sizeof(t4) && o2-o3 == sizeof(t3) && n == sizeof(t2) + sizeof(t3) + sizeof(t4) + sizeof(t5) - // result: (Store {t2} (OffPtr [o2] dst) d1 (Store {t3} (OffPtr [o3] dst) d2 (Store {t4} (OffPtr [o4] dst) d3 (Store {t5} (OffPtr [0] dst) d4 mem)))) - for { - n := v.AuxInt - t1 := v.Aux - _ = v.Args[2] - dst := v.Args[0] - p1 := v.Args[1] - mem := v.Args[2] - if mem.Op != OpStore { - break - } - t2 := mem.Aux - _ = mem.Args[2] - op2 := mem.Args[0] - if op2.Op != OpOffPtr { - break - } - tt2 := op2.Type - o2 := op2.AuxInt - p2 := op2.Args[0] - d1 := mem.Args[1] - mem_2 := mem.Args[2] - if mem_2.Op != OpStore { - break - } - t3 := mem_2.Aux - _ = mem_2.Args[2] - op3 := mem_2.Args[0] - if op3.Op != OpOffPtr { - break - } - tt3 := op3.Type - o3 := op3.AuxInt - p3 := op3.Args[0] - d2 := mem_2.Args[1] - mem_2_2 := mem_2.Args[2] - if mem_2_2.Op != OpStore { - break - } - t4 := mem_2_2.Aux - _ = mem_2_2.Args[2] - op4 := mem_2_2.Args[0] - if op4.Op != OpOffPtr { - break - } - tt4 := op4.Type - o4 := op4.AuxInt - p4 := op4.Args[0] - d3 := mem_2_2.Args[1] - mem_2_2_2 := mem_2_2.Args[2] - if mem_2_2_2.Op != OpStore { - break - } - t5 := mem_2_2_2.Aux - _ = mem_2_2_2.Args[2] - op5 := mem_2_2_2.Args[0] - if op5.Op != OpOffPtr { - break - } - tt5 := op5.Type - if op5.AuxInt != 0 { - break - } - p5 := op5.Args[0] - d4 := mem_2_2_2.Args[1] - if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && alignof(t5) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && registerizable(b, t5) && o4 == sizeof(t5) && o3-o4 == sizeof(t4) && o2-o3 == sizeof(t3) && n == sizeof(t2)+sizeof(t3)+sizeof(t4)+sizeof(t5)) { - break - } - v.reset(OpStore) - v.Aux = t2 - v0 := b.NewValue0(v.Pos, OpOffPtr, tt2) - v0.AuxInt = o2 - v0.AddArg(dst) - v.AddArg(v0) - v.AddArg(d1) - v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v1.Aux = t3 - v2 := b.NewValue0(v.Pos, OpOffPtr, tt3) - v2.AuxInt = o3 - v2.AddArg(dst) - v1.AddArg(v2) - v1.AddArg(d2) - v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v3.Aux = t4 - v4 := b.NewValue0(v.Pos, OpOffPtr, tt4) - v4.AuxInt = o4 - v4.AddArg(dst) - v3.AddArg(v4) - v3.AddArg(d3) - v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v5.Aux = t5 - v6 := b.NewValue0(v.Pos, OpOffPtr, tt5) - v6.AuxInt = 0 - v6.AddArg(dst) - v5.AddArg(v6) - v5.AddArg(d4) - v5.AddArg(mem) - v3.AddArg(v5) - v1.AddArg(v3) - v.AddArg(v1) - return true - } - return false -} -func rewriteValuegeneric_OpMove_10(v *Value) bool { - b := v.Block - // match: (Move {t1} [n] dst p1 mem:(VarDef (Store {t2} op2:(OffPtr [o2] p2) d1 (Store {t3} op3:(OffPtr [0] p3) d2 _)))) - // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && o2 == sizeof(t3) && n == sizeof(t2) + sizeof(t3) - // result: (Store {t2} (OffPtr [o2] dst) d1 (Store {t3} (OffPtr [0] dst) d2 mem)) - for { - n := v.AuxInt - t1 := v.Aux - _ = v.Args[2] - dst := v.Args[0] - p1 := v.Args[1] - mem := v.Args[2] - if mem.Op != OpVarDef { - break - } - mem_0 := mem.Args[0] - if mem_0.Op != OpStore { - break - } - t2 := mem_0.Aux - _ = mem_0.Args[2] - op2 := mem_0.Args[0] - if op2.Op != OpOffPtr { - break - } - tt2 := op2.Type - o2 := op2.AuxInt - p2 := op2.Args[0] - d1 := mem_0.Args[1] - mem_0_2 := mem_0.Args[2] - if mem_0_2.Op != OpStore { - break - } - t3 := mem_0_2.Aux - _ = mem_0_2.Args[2] - op3 := mem_0_2.Args[0] - if op3.Op != OpOffPtr { - break - } - tt3 := op3.Type - if op3.AuxInt != 0 { - break - } - p3 := op3.Args[0] - d2 := mem_0_2.Args[1] - if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && o2 == sizeof(t3) && n == sizeof(t2)+sizeof(t3)) { - break - } - v.reset(OpStore) - v.Aux = t2 - v0 := b.NewValue0(v.Pos, OpOffPtr, tt2) - v0.AuxInt = o2 - v0.AddArg(dst) - v.AddArg(v0) - v.AddArg(d1) - v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v1.Aux = t3 - v2 := b.NewValue0(v.Pos, OpOffPtr, tt3) - v2.AuxInt = 0 - v2.AddArg(dst) - v1.AddArg(v2) - v1.AddArg(d2) - v1.AddArg(mem) - v.AddArg(v1) - return true - } - // match: (Move {t1} [n] dst p1 mem:(VarDef (Store {t2} op2:(OffPtr [o2] p2) d1 (Store {t3} op3:(OffPtr [o3] p3) d2 (Store {t4} op4:(OffPtr [0] p4) d3 _))))) - // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && o3 == sizeof(t4) && o2-o3 == sizeof(t3) && n == sizeof(t2) + sizeof(t3) + sizeof(t4) - // result: (Store {t2} (OffPtr [o2] dst) d1 (Store {t3} (OffPtr [o3] dst) d2 (Store {t4} (OffPtr [0] dst) d3 mem))) - for { - n := v.AuxInt - t1 := v.Aux - _ = v.Args[2] - dst := v.Args[0] - p1 := v.Args[1] - mem := v.Args[2] - if mem.Op != OpVarDef { - break - } - mem_0 := mem.Args[0] - if mem_0.Op != OpStore { - break - } - t2 := mem_0.Aux - _ = mem_0.Args[2] - op2 := mem_0.Args[0] - if op2.Op != OpOffPtr { - break - } - tt2 := op2.Type - o2 := op2.AuxInt - p2 := op2.Args[0] - d1 := mem_0.Args[1] - mem_0_2 := mem_0.Args[2] - if mem_0_2.Op != OpStore { - break - } - t3 := mem_0_2.Aux - _ = mem_0_2.Args[2] - op3 := mem_0_2.Args[0] - if op3.Op != OpOffPtr { - break - } - tt3 := op3.Type - o3 := op3.AuxInt - p3 := op3.Args[0] - d2 := mem_0_2.Args[1] - mem_0_2_2 := mem_0_2.Args[2] - if mem_0_2_2.Op != OpStore { - break - } - t4 := mem_0_2_2.Aux - _ = mem_0_2_2.Args[2] - op4 := mem_0_2_2.Args[0] - if op4.Op != OpOffPtr { - break - } - tt4 := op4.Type - if op4.AuxInt != 0 { - break - } - p4 := op4.Args[0] - d3 := mem_0_2_2.Args[1] - if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && o3 == sizeof(t4) && o2-o3 == sizeof(t3) && n == sizeof(t2)+sizeof(t3)+sizeof(t4)) { - break - } - v.reset(OpStore) - v.Aux = t2 - v0 := b.NewValue0(v.Pos, OpOffPtr, tt2) - v0.AuxInt = o2 - v0.AddArg(dst) - v.AddArg(v0) - v.AddArg(d1) - v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v1.Aux = t3 - v2 := b.NewValue0(v.Pos, OpOffPtr, tt3) - v2.AuxInt = o3 - v2.AddArg(dst) - v1.AddArg(v2) - v1.AddArg(d2) - v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v3.Aux = t4 - v4 := b.NewValue0(v.Pos, OpOffPtr, tt4) - v4.AuxInt = 0 - v4.AddArg(dst) - v3.AddArg(v4) - v3.AddArg(d3) - v3.AddArg(mem) - v1.AddArg(v3) - v.AddArg(v1) - return true - } - // match: (Move {t1} [n] dst p1 mem:(VarDef (Store {t2} op2:(OffPtr [o2] p2) d1 (Store {t3} op3:(OffPtr [o3] p3) d2 (Store {t4} op4:(OffPtr [o4] p4) d3 (Store {t5} op5:(OffPtr [0] p5) d4 _)))))) - // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && alignof(t5) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && registerizable(b, t5) && o4 == sizeof(t5) && o3-o4 == sizeof(t4) && o2-o3 == sizeof(t3) && n == sizeof(t2) + sizeof(t3) + sizeof(t4) + sizeof(t5) - // result: (Store {t2} (OffPtr [o2] dst) d1 (Store {t3} (OffPtr [o3] dst) d2 (Store {t4} (OffPtr [o4] dst) d3 (Store {t5} (OffPtr [0] dst) d4 mem)))) - for { - n := v.AuxInt - t1 := v.Aux - _ = v.Args[2] - dst := v.Args[0] - p1 := v.Args[1] - mem := v.Args[2] - if mem.Op != OpVarDef { - break - } - mem_0 := mem.Args[0] - if mem_0.Op != OpStore { - break - } - t2 := mem_0.Aux - _ = mem_0.Args[2] - op2 := mem_0.Args[0] - if op2.Op != OpOffPtr { - break - } - tt2 := op2.Type - o2 := op2.AuxInt - p2 := op2.Args[0] - d1 := mem_0.Args[1] - mem_0_2 := mem_0.Args[2] - if mem_0_2.Op != OpStore { - break - } - t3 := mem_0_2.Aux - _ = mem_0_2.Args[2] - op3 := mem_0_2.Args[0] - if op3.Op != OpOffPtr { - break - } - tt3 := op3.Type - o3 := op3.AuxInt - p3 := op3.Args[0] - d2 := mem_0_2.Args[1] - mem_0_2_2 := mem_0_2.Args[2] - if mem_0_2_2.Op != OpStore { - break - } - t4 := mem_0_2_2.Aux - _ = mem_0_2_2.Args[2] - op4 := mem_0_2_2.Args[0] - if op4.Op != OpOffPtr { - break - } - tt4 := op4.Type - o4 := op4.AuxInt - p4 := op4.Args[0] - d3 := mem_0_2_2.Args[1] - mem_0_2_2_2 := mem_0_2_2.Args[2] - if mem_0_2_2_2.Op != OpStore { - break - } - t5 := mem_0_2_2_2.Aux - _ = mem_0_2_2_2.Args[2] - op5 := mem_0_2_2_2.Args[0] - if op5.Op != OpOffPtr { - break - } - tt5 := op5.Type - if op5.AuxInt != 0 { - break - } - p5 := op5.Args[0] - d4 := mem_0_2_2_2.Args[1] - if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && alignof(t5) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && registerizable(b, t5) && o4 == sizeof(t5) && o3-o4 == sizeof(t4) && o2-o3 == sizeof(t3) && n == sizeof(t2)+sizeof(t3)+sizeof(t4)+sizeof(t5)) { - break - } - v.reset(OpStore) - v.Aux = t2 - v0 := b.NewValue0(v.Pos, OpOffPtr, tt2) - v0.AuxInt = o2 - v0.AddArg(dst) - v.AddArg(v0) - v.AddArg(d1) - v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v1.Aux = t3 - v2 := b.NewValue0(v.Pos, OpOffPtr, tt3) - v2.AuxInt = o3 - v2.AddArg(dst) - v1.AddArg(v2) - v1.AddArg(d2) - v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v3.Aux = t4 - v4 := b.NewValue0(v.Pos, OpOffPtr, tt4) - v4.AuxInt = o4 - v4.AddArg(dst) - v3.AddArg(v4) - v3.AddArg(d3) - v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v5.Aux = t5 - v6 := b.NewValue0(v.Pos, OpOffPtr, tt5) - v6.AuxInt = 0 - v6.AddArg(dst) - v5.AddArg(v6) - v5.AddArg(d4) - v5.AddArg(mem) - v3.AddArg(v5) - v1.AddArg(v3) - v.AddArg(v1) - return true - } - // match: (Move {t1} [n] dst p1 mem:(Store {t2} op2:(OffPtr [o2] p2) d1 (Zero {t3} [n] p3 _))) - // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && registerizable(b, t2) && n >= o2 + sizeof(t2) - // result: (Store {t2} (OffPtr [o2] dst) d1 (Zero {t1} [n] dst mem)) - for { - n := v.AuxInt - t1 := v.Aux - _ = v.Args[2] - dst := v.Args[0] - p1 := v.Args[1] - mem := v.Args[2] - if mem.Op != OpStore { - break - } - t2 := mem.Aux - _ = mem.Args[2] - op2 := mem.Args[0] - if op2.Op != OpOffPtr { - break - } - tt2 := op2.Type - o2 := op2.AuxInt - p2 := op2.Args[0] - d1 := mem.Args[1] - mem_2 := mem.Args[2] - if mem_2.Op != OpZero || mem_2.AuxInt != n { - break - } - t3 := mem_2.Aux - _ = mem_2.Args[1] - p3 := mem_2.Args[0] - if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && registerizable(b, t2) && n >= o2+sizeof(t2)) { - break - } - v.reset(OpStore) - v.Aux = t2 - v0 := b.NewValue0(v.Pos, OpOffPtr, tt2) - v0.AuxInt = o2 - v0.AddArg(dst) - v.AddArg(v0) - v.AddArg(d1) - v1 := b.NewValue0(v.Pos, OpZero, types.TypeMem) - v1.AuxInt = n - v1.Aux = t1 - v1.AddArg(dst) - v1.AddArg(mem) - v.AddArg(v1) - return true - } - // match: (Move {t1} [n] dst p1 mem:(Store {t2} (OffPtr [o2] p2) d1 (Store {t3} (OffPtr [o3] p3) d2 (Zero {t4} [n] p4 _)))) - // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && n >= o2 + sizeof(t2) && n >= o3 + sizeof(t3) - // result: (Store {t2} (OffPtr [o2] dst) d1 (Store {t3} (OffPtr [o3] dst) d2 (Zero {t1} [n] dst mem))) - for { - n := v.AuxInt - t1 := v.Aux - _ = v.Args[2] - dst := v.Args[0] - p1 := v.Args[1] - mem := v.Args[2] - if mem.Op != OpStore { - break - } - t2 := mem.Aux - _ = mem.Args[2] - mem_0 := mem.Args[0] - if mem_0.Op != OpOffPtr { - break - } - tt2 := mem_0.Type - o2 := mem_0.AuxInt - p2 := mem_0.Args[0] - d1 := mem.Args[1] - mem_2 := mem.Args[2] - if mem_2.Op != OpStore { - break - } - t3 := mem_2.Aux - _ = mem_2.Args[2] - mem_2_0 := mem_2.Args[0] - if mem_2_0.Op != OpOffPtr { - break - } - tt3 := mem_2_0.Type - o3 := mem_2_0.AuxInt - p3 := mem_2_0.Args[0] - d2 := mem_2.Args[1] - mem_2_2 := mem_2.Args[2] - if mem_2_2.Op != OpZero || mem_2_2.AuxInt != n { - break - } - t4 := mem_2_2.Aux - _ = mem_2_2.Args[1] - p4 := mem_2_2.Args[0] - if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && n >= o2+sizeof(t2) && n >= o3+sizeof(t3)) { - break - } - v.reset(OpStore) - v.Aux = t2 - v0 := b.NewValue0(v.Pos, OpOffPtr, tt2) - v0.AuxInt = o2 - v0.AddArg(dst) - v.AddArg(v0) - v.AddArg(d1) - v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v1.Aux = t3 - v2 := b.NewValue0(v.Pos, OpOffPtr, tt3) - v2.AuxInt = o3 - v2.AddArg(dst) - v1.AddArg(v2) - v1.AddArg(d2) - v3 := b.NewValue0(v.Pos, OpZero, types.TypeMem) - v3.AuxInt = n - v3.Aux = t1 - v3.AddArg(dst) - v3.AddArg(mem) - v1.AddArg(v3) - v.AddArg(v1) - return true - } - // match: (Move {t1} [n] dst p1 mem:(Store {t2} (OffPtr [o2] p2) d1 (Store {t3} (OffPtr [o3] p3) d2 (Store {t4} (OffPtr [o4] p4) d3 (Zero {t5} [n] p5 _))))) - // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && alignof(t5) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && n >= o2 + sizeof(t2) && n >= o3 + sizeof(t3) && n >= o4 + sizeof(t4) - // result: (Store {t2} (OffPtr [o2] dst) d1 (Store {t3} (OffPtr [o3] dst) d2 (Store {t4} (OffPtr [o4] dst) d3 (Zero {t1} [n] dst mem)))) - for { - n := v.AuxInt - t1 := v.Aux - _ = v.Args[2] - dst := v.Args[0] - p1 := v.Args[1] - mem := v.Args[2] - if mem.Op != OpStore { - break - } - t2 := mem.Aux - _ = mem.Args[2] - mem_0 := mem.Args[0] - if mem_0.Op != OpOffPtr { - break - } - tt2 := mem_0.Type - o2 := mem_0.AuxInt - p2 := mem_0.Args[0] - d1 := mem.Args[1] - mem_2 := mem.Args[2] - if mem_2.Op != OpStore { - break - } - t3 := mem_2.Aux - _ = mem_2.Args[2] - mem_2_0 := mem_2.Args[0] - if mem_2_0.Op != OpOffPtr { - break - } - tt3 := mem_2_0.Type - o3 := mem_2_0.AuxInt - p3 := mem_2_0.Args[0] - d2 := mem_2.Args[1] - mem_2_2 := mem_2.Args[2] - if mem_2_2.Op != OpStore { - break - } - t4 := mem_2_2.Aux - _ = mem_2_2.Args[2] - mem_2_2_0 := mem_2_2.Args[0] - if mem_2_2_0.Op != OpOffPtr { - break - } - tt4 := mem_2_2_0.Type - o4 := mem_2_2_0.AuxInt - p4 := mem_2_2_0.Args[0] - d3 := mem_2_2.Args[1] - mem_2_2_2 := mem_2_2.Args[2] - if mem_2_2_2.Op != OpZero || mem_2_2_2.AuxInt != n { - break - } - t5 := mem_2_2_2.Aux - _ = mem_2_2_2.Args[1] - p5 := mem_2_2_2.Args[0] - if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && alignof(t5) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && n >= o2+sizeof(t2) && n >= o3+sizeof(t3) && n >= o4+sizeof(t4)) { - break - } - v.reset(OpStore) - v.Aux = t2 - v0 := b.NewValue0(v.Pos, OpOffPtr, tt2) - v0.AuxInt = o2 - v0.AddArg(dst) - v.AddArg(v0) - v.AddArg(d1) - v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v1.Aux = t3 - v2 := b.NewValue0(v.Pos, OpOffPtr, tt3) - v2.AuxInt = o3 - v2.AddArg(dst) - v1.AddArg(v2) - v1.AddArg(d2) - v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v3.Aux = t4 - v4 := b.NewValue0(v.Pos, OpOffPtr, tt4) - v4.AuxInt = o4 - v4.AddArg(dst) - v3.AddArg(v4) - v3.AddArg(d3) - v5 := b.NewValue0(v.Pos, OpZero, types.TypeMem) - v5.AuxInt = n - v5.Aux = t1 - v5.AddArg(dst) - v5.AddArg(mem) - v3.AddArg(v5) - v1.AddArg(v3) - v.AddArg(v1) - return true - } - // match: (Move {t1} [n] dst p1 mem:(Store {t2} (OffPtr [o2] p2) d1 (Store {t3} (OffPtr [o3] p3) d2 (Store {t4} (OffPtr [o4] p4) d3 (Store {t5} (OffPtr [o5] p5) d4 (Zero {t6} [n] p6 _)))))) - // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && isSamePtr(p5, p6) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && alignof(t5) <= alignof(t1) && alignof(t6) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && registerizable(b, t5) && n >= o2 + sizeof(t2) && n >= o3 + sizeof(t3) && n >= o4 + sizeof(t4) && n >= o5 + sizeof(t5) - // result: (Store {t2} (OffPtr [o2] dst) d1 (Store {t3} (OffPtr [o3] dst) d2 (Store {t4} (OffPtr [o4] dst) d3 (Store {t5} (OffPtr [o5] dst) d4 (Zero {t1} [n] dst mem))))) - for { - n := v.AuxInt - t1 := v.Aux - _ = v.Args[2] - dst := v.Args[0] - p1 := v.Args[1] - mem := v.Args[2] - if mem.Op != OpStore { - break - } - t2 := mem.Aux - _ = mem.Args[2] - mem_0 := mem.Args[0] - if mem_0.Op != OpOffPtr { - break - } - tt2 := mem_0.Type - o2 := mem_0.AuxInt - p2 := mem_0.Args[0] - d1 := mem.Args[1] - mem_2 := mem.Args[2] - if mem_2.Op != OpStore { - break - } - t3 := mem_2.Aux - _ = mem_2.Args[2] - mem_2_0 := mem_2.Args[0] - if mem_2_0.Op != OpOffPtr { - break - } - tt3 := mem_2_0.Type - o3 := mem_2_0.AuxInt - p3 := mem_2_0.Args[0] - d2 := mem_2.Args[1] - mem_2_2 := mem_2.Args[2] - if mem_2_2.Op != OpStore { - break - } - t4 := mem_2_2.Aux - _ = mem_2_2.Args[2] - mem_2_2_0 := mem_2_2.Args[0] - if mem_2_2_0.Op != OpOffPtr { - break - } - tt4 := mem_2_2_0.Type - o4 := mem_2_2_0.AuxInt - p4 := mem_2_2_0.Args[0] - d3 := mem_2_2.Args[1] - mem_2_2_2 := mem_2_2.Args[2] - if mem_2_2_2.Op != OpStore { - break - } - t5 := mem_2_2_2.Aux - _ = mem_2_2_2.Args[2] - mem_2_2_2_0 := mem_2_2_2.Args[0] - if mem_2_2_2_0.Op != OpOffPtr { - break - } - tt5 := mem_2_2_2_0.Type - o5 := mem_2_2_2_0.AuxInt - p5 := mem_2_2_2_0.Args[0] - d4 := mem_2_2_2.Args[1] - mem_2_2_2_2 := mem_2_2_2.Args[2] - if mem_2_2_2_2.Op != OpZero || mem_2_2_2_2.AuxInt != n { - break - } - t6 := mem_2_2_2_2.Aux - _ = mem_2_2_2_2.Args[1] - p6 := mem_2_2_2_2.Args[0] - if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && isSamePtr(p5, p6) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && alignof(t5) <= alignof(t1) && alignof(t6) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && registerizable(b, t5) && n >= o2+sizeof(t2) && n >= o3+sizeof(t3) && n >= o4+sizeof(t4) && n >= o5+sizeof(t5)) { - break - } - v.reset(OpStore) - v.Aux = t2 - v0 := b.NewValue0(v.Pos, OpOffPtr, tt2) - v0.AuxInt = o2 - v0.AddArg(dst) - v.AddArg(v0) - v.AddArg(d1) - v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v1.Aux = t3 - v2 := b.NewValue0(v.Pos, OpOffPtr, tt3) - v2.AuxInt = o3 - v2.AddArg(dst) - v1.AddArg(v2) - v1.AddArg(d2) - v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v3.Aux = t4 - v4 := b.NewValue0(v.Pos, OpOffPtr, tt4) - v4.AuxInt = o4 - v4.AddArg(dst) - v3.AddArg(v4) - v3.AddArg(d3) - v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v5.Aux = t5 - v6 := b.NewValue0(v.Pos, OpOffPtr, tt5) - v6.AuxInt = o5 - v6.AddArg(dst) - v5.AddArg(v6) - v5.AddArg(d4) - v7 := b.NewValue0(v.Pos, OpZero, types.TypeMem) - v7.AuxInt = n - v7.Aux = t1 - v7.AddArg(dst) - v7.AddArg(mem) - v5.AddArg(v7) - v3.AddArg(v5) - v1.AddArg(v3) - v.AddArg(v1) - return true - } - // match: (Move {t1} [n] dst p1 mem:(VarDef (Store {t2} op2:(OffPtr [o2] p2) d1 (Zero {t3} [n] p3 _)))) - // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && registerizable(b, t2) && n >= o2 + sizeof(t2) - // result: (Store {t2} (OffPtr [o2] dst) d1 (Zero {t1} [n] dst mem)) - for { - n := v.AuxInt - t1 := v.Aux - _ = v.Args[2] - dst := v.Args[0] - p1 := v.Args[1] - mem := v.Args[2] - if mem.Op != OpVarDef { - break - } - mem_0 := mem.Args[0] - if mem_0.Op != OpStore { - break - } - t2 := mem_0.Aux - _ = mem_0.Args[2] - op2 := mem_0.Args[0] - if op2.Op != OpOffPtr { - break - } - tt2 := op2.Type - o2 := op2.AuxInt - p2 := op2.Args[0] - d1 := mem_0.Args[1] - mem_0_2 := mem_0.Args[2] - if mem_0_2.Op != OpZero || mem_0_2.AuxInt != n { - break - } - t3 := mem_0_2.Aux - _ = mem_0_2.Args[1] - p3 := mem_0_2.Args[0] - if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && registerizable(b, t2) && n >= o2+sizeof(t2)) { - break - } - v.reset(OpStore) - v.Aux = t2 - v0 := b.NewValue0(v.Pos, OpOffPtr, tt2) - v0.AuxInt = o2 - v0.AddArg(dst) - v.AddArg(v0) - v.AddArg(d1) - v1 := b.NewValue0(v.Pos, OpZero, types.TypeMem) - v1.AuxInt = n - v1.Aux = t1 - v1.AddArg(dst) - v1.AddArg(mem) - v.AddArg(v1) - return true - } - // match: (Move {t1} [n] dst p1 mem:(VarDef (Store {t2} (OffPtr [o2] p2) d1 (Store {t3} (OffPtr [o3] p3) d2 (Zero {t4} [n] p4 _))))) - // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && n >= o2 + sizeof(t2) && n >= o3 + sizeof(t3) - // result: (Store {t2} (OffPtr [o2] dst) d1 (Store {t3} (OffPtr [o3] dst) d2 (Zero {t1} [n] dst mem))) - for { - n := v.AuxInt - t1 := v.Aux - _ = v.Args[2] - dst := v.Args[0] - p1 := v.Args[1] - mem := v.Args[2] - if mem.Op != OpVarDef { - break - } - mem_0 := mem.Args[0] - if mem_0.Op != OpStore { - break - } - t2 := mem_0.Aux - _ = mem_0.Args[2] - mem_0_0 := mem_0.Args[0] - if mem_0_0.Op != OpOffPtr { - break - } - tt2 := mem_0_0.Type - o2 := mem_0_0.AuxInt - p2 := mem_0_0.Args[0] - d1 := mem_0.Args[1] - mem_0_2 := mem_0.Args[2] - if mem_0_2.Op != OpStore { - break - } - t3 := mem_0_2.Aux - _ = mem_0_2.Args[2] - mem_0_2_0 := mem_0_2.Args[0] - if mem_0_2_0.Op != OpOffPtr { - break - } - tt3 := mem_0_2_0.Type - o3 := mem_0_2_0.AuxInt - p3 := mem_0_2_0.Args[0] - d2 := mem_0_2.Args[1] - mem_0_2_2 := mem_0_2.Args[2] - if mem_0_2_2.Op != OpZero || mem_0_2_2.AuxInt != n { - break - } - t4 := mem_0_2_2.Aux - _ = mem_0_2_2.Args[1] - p4 := mem_0_2_2.Args[0] - if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && n >= o2+sizeof(t2) && n >= o3+sizeof(t3)) { - break - } - v.reset(OpStore) - v.Aux = t2 - v0 := b.NewValue0(v.Pos, OpOffPtr, tt2) - v0.AuxInt = o2 - v0.AddArg(dst) - v.AddArg(v0) - v.AddArg(d1) - v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v1.Aux = t3 - v2 := b.NewValue0(v.Pos, OpOffPtr, tt3) - v2.AuxInt = o3 - v2.AddArg(dst) - v1.AddArg(v2) - v1.AddArg(d2) - v3 := b.NewValue0(v.Pos, OpZero, types.TypeMem) - v3.AuxInt = n - v3.Aux = t1 - v3.AddArg(dst) - v3.AddArg(mem) - v1.AddArg(v3) - v.AddArg(v1) - return true - } - // match: (Move {t1} [n] dst p1 mem:(VarDef (Store {t2} (OffPtr [o2] p2) d1 (Store {t3} (OffPtr [o3] p3) d2 (Store {t4} (OffPtr [o4] p4) d3 (Zero {t5} [n] p5 _)))))) - // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && alignof(t5) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && n >= o2 + sizeof(t2) && n >= o3 + sizeof(t3) && n >= o4 + sizeof(t4) - // result: (Store {t2} (OffPtr [o2] dst) d1 (Store {t3} (OffPtr [o3] dst) d2 (Store {t4} (OffPtr [o4] dst) d3 (Zero {t1} [n] dst mem)))) - for { - n := v.AuxInt - t1 := v.Aux - _ = v.Args[2] - dst := v.Args[0] - p1 := v.Args[1] - mem := v.Args[2] - if mem.Op != OpVarDef { - break - } - mem_0 := mem.Args[0] - if mem_0.Op != OpStore { - break - } - t2 := mem_0.Aux - _ = mem_0.Args[2] - mem_0_0 := mem_0.Args[0] - if mem_0_0.Op != OpOffPtr { - break - } - tt2 := mem_0_0.Type - o2 := mem_0_0.AuxInt - p2 := mem_0_0.Args[0] - d1 := mem_0.Args[1] - mem_0_2 := mem_0.Args[2] - if mem_0_2.Op != OpStore { - break - } - t3 := mem_0_2.Aux - _ = mem_0_2.Args[2] - mem_0_2_0 := mem_0_2.Args[0] - if mem_0_2_0.Op != OpOffPtr { - break - } - tt3 := mem_0_2_0.Type - o3 := mem_0_2_0.AuxInt - p3 := mem_0_2_0.Args[0] - d2 := mem_0_2.Args[1] - mem_0_2_2 := mem_0_2.Args[2] - if mem_0_2_2.Op != OpStore { - break - } - t4 := mem_0_2_2.Aux - _ = mem_0_2_2.Args[2] - mem_0_2_2_0 := mem_0_2_2.Args[0] - if mem_0_2_2_0.Op != OpOffPtr { - break - } - tt4 := mem_0_2_2_0.Type - o4 := mem_0_2_2_0.AuxInt - p4 := mem_0_2_2_0.Args[0] - d3 := mem_0_2_2.Args[1] - mem_0_2_2_2 := mem_0_2_2.Args[2] - if mem_0_2_2_2.Op != OpZero || mem_0_2_2_2.AuxInt != n { - break - } - t5 := mem_0_2_2_2.Aux - _ = mem_0_2_2_2.Args[1] - p5 := mem_0_2_2_2.Args[0] - if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && alignof(t5) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && n >= o2+sizeof(t2) && n >= o3+sizeof(t3) && n >= o4+sizeof(t4)) { - break - } - v.reset(OpStore) - v.Aux = t2 - v0 := b.NewValue0(v.Pos, OpOffPtr, tt2) - v0.AuxInt = o2 - v0.AddArg(dst) - v.AddArg(v0) - v.AddArg(d1) - v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v1.Aux = t3 - v2 := b.NewValue0(v.Pos, OpOffPtr, tt3) - v2.AuxInt = o3 - v2.AddArg(dst) - v1.AddArg(v2) - v1.AddArg(d2) - v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v3.Aux = t4 - v4 := b.NewValue0(v.Pos, OpOffPtr, tt4) - v4.AuxInt = o4 - v4.AddArg(dst) - v3.AddArg(v4) - v3.AddArg(d3) - v5 := b.NewValue0(v.Pos, OpZero, types.TypeMem) - v5.AuxInt = n - v5.Aux = t1 - v5.AddArg(dst) - v5.AddArg(mem) - v3.AddArg(v5) - v1.AddArg(v3) - v.AddArg(v1) - return true - } - return false -} -func rewriteValuegeneric_OpMove_20(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (Move {t1} [n] dst p1 mem:(VarDef (Store {t2} (OffPtr [o2] p2) d1 (Store {t3} (OffPtr [o3] p3) d2 (Store {t4} (OffPtr [o4] p4) d3 (Store {t5} (OffPtr [o5] p5) d4 (Zero {t6} [n] p6 _))))))) - // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && isSamePtr(p5, p6) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && alignof(t5) <= alignof(t1) && alignof(t6) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && registerizable(b, t5) && n >= o2 + sizeof(t2) && n >= o3 + sizeof(t3) && n >= o4 + sizeof(t4) && n >= o5 + sizeof(t5) - // result: (Store {t2} (OffPtr [o2] dst) d1 (Store {t3} (OffPtr [o3] dst) d2 (Store {t4} (OffPtr [o4] dst) d3 (Store {t5} (OffPtr [o5] dst) d4 (Zero {t1} [n] dst mem))))) - for { - n := v.AuxInt - t1 := v.Aux - _ = v.Args[2] - dst := v.Args[0] - p1 := v.Args[1] - mem := v.Args[2] - if mem.Op != OpVarDef { - break - } - mem_0 := mem.Args[0] - if mem_0.Op != OpStore { - break - } - t2 := mem_0.Aux - _ = mem_0.Args[2] - mem_0_0 := mem_0.Args[0] - if mem_0_0.Op != OpOffPtr { - break - } - tt2 := mem_0_0.Type - o2 := mem_0_0.AuxInt - p2 := mem_0_0.Args[0] - d1 := mem_0.Args[1] - mem_0_2 := mem_0.Args[2] - if mem_0_2.Op != OpStore { - break - } - t3 := mem_0_2.Aux - _ = mem_0_2.Args[2] - mem_0_2_0 := mem_0_2.Args[0] - if mem_0_2_0.Op != OpOffPtr { - break - } - tt3 := mem_0_2_0.Type - o3 := mem_0_2_0.AuxInt - p3 := mem_0_2_0.Args[0] - d2 := mem_0_2.Args[1] - mem_0_2_2 := mem_0_2.Args[2] - if mem_0_2_2.Op != OpStore { - break - } - t4 := mem_0_2_2.Aux - _ = mem_0_2_2.Args[2] - mem_0_2_2_0 := mem_0_2_2.Args[0] - if mem_0_2_2_0.Op != OpOffPtr { - break - } - tt4 := mem_0_2_2_0.Type - o4 := mem_0_2_2_0.AuxInt - p4 := mem_0_2_2_0.Args[0] - d3 := mem_0_2_2.Args[1] - mem_0_2_2_2 := mem_0_2_2.Args[2] - if mem_0_2_2_2.Op != OpStore { - break - } - t5 := mem_0_2_2_2.Aux - _ = mem_0_2_2_2.Args[2] - mem_0_2_2_2_0 := mem_0_2_2_2.Args[0] - if mem_0_2_2_2_0.Op != OpOffPtr { - break - } - tt5 := mem_0_2_2_2_0.Type - o5 := mem_0_2_2_2_0.AuxInt - p5 := mem_0_2_2_2_0.Args[0] - d4 := mem_0_2_2_2.Args[1] - mem_0_2_2_2_2 := mem_0_2_2_2.Args[2] - if mem_0_2_2_2_2.Op != OpZero || mem_0_2_2_2_2.AuxInt != n { - break - } - t6 := mem_0_2_2_2_2.Aux - _ = mem_0_2_2_2_2.Args[1] - p6 := mem_0_2_2_2_2.Args[0] - if !(isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && isSamePtr(p5, p6) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && alignof(t5) <= alignof(t1) && alignof(t6) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && registerizable(b, t5) && n >= o2+sizeof(t2) && n >= o3+sizeof(t3) && n >= o4+sizeof(t4) && n >= o5+sizeof(t5)) { - break - } - v.reset(OpStore) - v.Aux = t2 - v0 := b.NewValue0(v.Pos, OpOffPtr, tt2) - v0.AuxInt = o2 - v0.AddArg(dst) - v.AddArg(v0) - v.AddArg(d1) - v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v1.Aux = t3 - v2 := b.NewValue0(v.Pos, OpOffPtr, tt3) - v2.AuxInt = o3 - v2.AddArg(dst) - v1.AddArg(v2) - v1.AddArg(d2) - v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v3.Aux = t4 - v4 := b.NewValue0(v.Pos, OpOffPtr, tt4) - v4.AuxInt = o4 - v4.AddArg(dst) - v3.AddArg(v4) - v3.AddArg(d3) - v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v5.Aux = t5 - v6 := b.NewValue0(v.Pos, OpOffPtr, tt5) - v6.AuxInt = o5 - v6.AddArg(dst) - v5.AddArg(v6) - v5.AddArg(d4) - v7 := b.NewValue0(v.Pos, OpZero, types.TypeMem) - v7.AuxInt = n - v7.Aux = t1 - v7.AddArg(dst) - v7.AddArg(mem) - v5.AddArg(v7) - v3.AddArg(v5) - v1.AddArg(v3) - v.AddArg(v1) - return true - } - // match: (Move {t1} [s] dst tmp1 midmem:(Move {t2} [s] tmp2 src _)) - // cond: t1.(*types.Type).Compare(t2.(*types.Type)) == types.CMPeq && isSamePtr(tmp1, tmp2) && isStackPtr(src) && disjoint(src, s, tmp2, s) && (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config)) - // result: (Move {t1} [s] dst src midmem) - for { - s := v.AuxInt - t1 := v.Aux - _ = v.Args[2] - dst := v.Args[0] - tmp1 := v.Args[1] - midmem := v.Args[2] - if midmem.Op != OpMove || midmem.AuxInt != s { - break - } - t2 := midmem.Aux - _ = midmem.Args[2] - tmp2 := midmem.Args[0] - src := midmem.Args[1] - if !(t1.(*types.Type).Compare(t2.(*types.Type)) == types.CMPeq && isSamePtr(tmp1, tmp2) && isStackPtr(src) && disjoint(src, s, tmp2, s) && (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config))) { - break - } - v.reset(OpMove) - v.AuxInt = s - v.Aux = t1 - v.AddArg(dst) - v.AddArg(src) - v.AddArg(midmem) - return true - } - // match: (Move {t1} [s] dst tmp1 midmem:(VarDef (Move {t2} [s] tmp2 src _))) - // cond: t1.(*types.Type).Compare(t2.(*types.Type)) == types.CMPeq && isSamePtr(tmp1, tmp2) && isStackPtr(src) && disjoint(src, s, tmp2, s) && (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config)) - // result: (Move {t1} [s] dst src midmem) - for { - s := v.AuxInt - t1 := v.Aux - _ = v.Args[2] - dst := v.Args[0] - tmp1 := v.Args[1] - midmem := v.Args[2] - if midmem.Op != OpVarDef { - break - } - midmem_0 := midmem.Args[0] - if midmem_0.Op != OpMove || midmem_0.AuxInt != s { - break - } - t2 := midmem_0.Aux - _ = midmem_0.Args[2] - tmp2 := midmem_0.Args[0] - src := midmem_0.Args[1] - if !(t1.(*types.Type).Compare(t2.(*types.Type)) == types.CMPeq && isSamePtr(tmp1, tmp2) && isStackPtr(src) && disjoint(src, s, tmp2, s) && (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config))) { - break - } - v.reset(OpMove) - v.AuxInt = s - v.Aux = t1 - v.AddArg(dst) - v.AddArg(src) - v.AddArg(midmem) - return true - } - // match: (Move dst src mem) - // cond: isSamePtr(dst, src) - // result: mem - for { - mem := v.Args[2] - dst := v.Args[0] - src := v.Args[1] - if !(isSamePtr(dst, src)) { - break - } - v.reset(OpCopy) - v.Type = mem.Type - v.AddArg(mem) - return true - } - return false -} -func rewriteValuegeneric_OpMul16_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Mul16 (Const16 [c]) (Const16 [d])) - // result: (Const16 [int64(int16(c*d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - d := v_1.AuxInt - v.reset(OpConst16) - v.AuxInt = int64(int16(c * d)) - return true - } - // match: (Mul16 (Const16 [d]) (Const16 [c])) - // result: (Const16 [int64(int16(c*d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - c := v_1.AuxInt - v.reset(OpConst16) - v.AuxInt = int64(int16(c * d)) - return true - } - // match: (Mul16 (Const16 [1]) x) - // result: x - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 || v_0.AuxInt != 1 { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Mul16 x (Const16 [1])) - // result: x - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.AuxInt != 1 { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Mul16 (Const16 [-1]) x) - // result: (Neg16 x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 || v_0.AuxInt != -1 { - break - } - v.reset(OpNeg16) - v.AddArg(x) - return true - } - // match: (Mul16 x (Const16 [-1])) - // result: (Neg16 x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.AuxInt != -1 { - break - } - v.reset(OpNeg16) - v.AddArg(x) - return true - } - // match: (Mul16 n (Const16 [c])) - // cond: isPowerOfTwo(c) - // result: (Lsh16x64 n (Const64 [log2(c)])) - for { - t := v.Type - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c)) { - break - } - v.reset(OpLsh16x64) - v.Type = t - v.AddArg(n) - v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v0.AuxInt = log2(c) - v.AddArg(v0) - return true - } - // match: (Mul16 (Const16 [c]) n) - // cond: isPowerOfTwo(c) - // result: (Lsh16x64 n (Const64 [log2(c)])) - for { - t := v.Type - n := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - c := v_0.AuxInt - if !(isPowerOfTwo(c)) { - break - } - v.reset(OpLsh16x64) - v.Type = t - v.AddArg(n) - v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v0.AuxInt = log2(c) - v.AddArg(v0) - return true - } - // match: (Mul16 n (Const16 [c])) - // cond: t.IsSigned() && isPowerOfTwo(-c) - // result: (Neg16 (Lsh16x64 n (Const64 [log2(-c)]))) - for { - t := v.Type - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - c := v_1.AuxInt - if !(t.IsSigned() && isPowerOfTwo(-c)) { - break - } - v.reset(OpNeg16) - v0 := b.NewValue0(v.Pos, OpLsh16x64, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v1.AuxInt = log2(-c) - v0.AddArg(v1) - v.AddArg(v0) - return true - } - // match: (Mul16 (Const16 [c]) n) - // cond: t.IsSigned() && isPowerOfTwo(-c) - // result: (Neg16 (Lsh16x64 n (Const64 [log2(-c)]))) - for { - t := v.Type - n := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - c := v_0.AuxInt - if !(t.IsSigned() && isPowerOfTwo(-c)) { - break - } - v.reset(OpNeg16) - v0 := b.NewValue0(v.Pos, OpLsh16x64, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v1.AuxInt = log2(-c) - v0.AddArg(v1) - v.AddArg(v0) - return true - } - return false -} -func rewriteValuegeneric_OpMul16_10(v *Value) bool { - b := v.Block - // match: (Mul16 (Const16 [0]) _) - // result: (Const16 [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 || v_0.AuxInt != 0 { - break - } - v.reset(OpConst16) - v.AuxInt = 0 - return true - } - // match: (Mul16 _ (Const16 [0])) - // result: (Const16 [0]) - for { - _ = v.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.AuxInt != 0 { - break - } - v.reset(OpConst16) - v.AuxInt = 0 - return true - } - // match: (Mul16 (Const16 [c]) (Mul16 (Const16 [d]) x)) - // result: (Mul16 (Const16 [int64(int16(c*d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst16 || v_1_0.Type != t { - break - } - d := v_1_0.AuxInt - v.reset(OpMul16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c * d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Mul16 (Const16 [c]) (Mul16 x (Const16 [d]))) - // result: (Mul16 (Const16 [int64(int16(c*d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst16 || v_1_1.Type != t { - break - } - d := v_1_1.AuxInt - v.reset(OpMul16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c * d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Mul16 (Mul16 (Const16 [d]) x) (Const16 [c])) - // result: (Mul16 (Const16 [int64(int16(c*d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul16 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst16 { - break - } - t := v_0_0.Type - d := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpMul16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c * d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Mul16 (Mul16 x (Const16 [d])) (Const16 [c])) - // result: (Mul16 (Const16 [int64(int16(c*d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul16 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst16 { - break - } - t := v_0_1.Type - d := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpMul16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c * d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - return false -} -func rewriteValuegeneric_OpMul32_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Mul32 (Const32 [c]) (Const32 [d])) - // result: (Const32 [int64(int32(c*d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - d := v_1.AuxInt - v.reset(OpConst32) - v.AuxInt = int64(int32(c * d)) - return true - } - // match: (Mul32 (Const32 [d]) (Const32 [c])) - // result: (Const32 [int64(int32(c*d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - c := v_1.AuxInt - v.reset(OpConst32) - v.AuxInt = int64(int32(c * d)) - return true - } - // match: (Mul32 (Const32 [1]) x) - // result: x - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 || v_0.AuxInt != 1 { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Mul32 x (Const32 [1])) - // result: x - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.AuxInt != 1 { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Mul32 (Const32 [-1]) x) - // result: (Neg32 x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 || v_0.AuxInt != -1 { - break - } - v.reset(OpNeg32) - v.AddArg(x) - return true - } - // match: (Mul32 x (Const32 [-1])) - // result: (Neg32 x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.AuxInt != -1 { - break - } - v.reset(OpNeg32) - v.AddArg(x) - return true - } - // match: (Mul32 n (Const32 [c])) - // cond: isPowerOfTwo(c) - // result: (Lsh32x64 n (Const64 [log2(c)])) - for { - t := v.Type - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c)) { - break - } - v.reset(OpLsh32x64) - v.Type = t - v.AddArg(n) - v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v0.AuxInt = log2(c) - v.AddArg(v0) - return true - } - // match: (Mul32 (Const32 [c]) n) - // cond: isPowerOfTwo(c) - // result: (Lsh32x64 n (Const64 [log2(c)])) - for { - t := v.Type - n := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - c := v_0.AuxInt - if !(isPowerOfTwo(c)) { - break - } - v.reset(OpLsh32x64) - v.Type = t - v.AddArg(n) - v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v0.AuxInt = log2(c) - v.AddArg(v0) - return true - } - // match: (Mul32 n (Const32 [c])) - // cond: t.IsSigned() && isPowerOfTwo(-c) - // result: (Neg32 (Lsh32x64 n (Const64 [log2(-c)]))) - for { - t := v.Type - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - c := v_1.AuxInt - if !(t.IsSigned() && isPowerOfTwo(-c)) { - break - } - v.reset(OpNeg32) - v0 := b.NewValue0(v.Pos, OpLsh32x64, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v1.AuxInt = log2(-c) - v0.AddArg(v1) - v.AddArg(v0) - return true - } - // match: (Mul32 (Const32 [c]) n) - // cond: t.IsSigned() && isPowerOfTwo(-c) - // result: (Neg32 (Lsh32x64 n (Const64 [log2(-c)]))) - for { - t := v.Type - n := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - c := v_0.AuxInt - if !(t.IsSigned() && isPowerOfTwo(-c)) { - break - } - v.reset(OpNeg32) - v0 := b.NewValue0(v.Pos, OpLsh32x64, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v1.AuxInt = log2(-c) - v0.AddArg(v1) - v.AddArg(v0) - return true - } - return false -} -func rewriteValuegeneric_OpMul32_10(v *Value) bool { - b := v.Block - // match: (Mul32 (Const32 [c]) (Add32 (Const32 [d]) x)) - // result: (Add32 (Const32 [int64(int32(c*d))]) (Mul32 (Const32 [c]) x)) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAdd32 || v_1.Type != t { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 || v_1_0.Type != t { - break - } - d := v_1_0.AuxInt - v.reset(OpAdd32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c * d)) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpMul32, t) - v2 := b.NewValue0(v.Pos, OpConst32, t) - v2.AuxInt = c - v1.AddArg(v2) - v1.AddArg(x) - v.AddArg(v1) - return true - } - // match: (Mul32 (Const32 [c]) (Add32 x (Const32 [d]))) - // result: (Add32 (Const32 [int64(int32(c*d))]) (Mul32 (Const32 [c]) x)) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAdd32 || v_1.Type != t { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 || v_1_1.Type != t { - break - } - d := v_1_1.AuxInt - v.reset(OpAdd32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c * d)) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpMul32, t) - v2 := b.NewValue0(v.Pos, OpConst32, t) - v2.AuxInt = c - v1.AddArg(v2) - v1.AddArg(x) - v.AddArg(v1) - return true - } - // match: (Mul32 (Add32 (Const32 [d]) x) (Const32 [c])) - // result: (Add32 (Const32 [int64(int32(c*d))]) (Mul32 (Const32 [c]) x)) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd32 { - break - } - t := v_0.Type - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 || v_0_0.Type != t { - break - } - d := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpAdd32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c * d)) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpMul32, t) - v2 := b.NewValue0(v.Pos, OpConst32, t) - v2.AuxInt = c - v1.AddArg(v2) - v1.AddArg(x) - v.AddArg(v1) - return true - } - // match: (Mul32 (Add32 x (Const32 [d])) (Const32 [c])) - // result: (Add32 (Const32 [int64(int32(c*d))]) (Mul32 (Const32 [c]) x)) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd32 { - break - } - t := v_0.Type - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 || v_0_1.Type != t { - break - } - d := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpAdd32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c * d)) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpMul32, t) - v2 := b.NewValue0(v.Pos, OpConst32, t) - v2.AuxInt = c - v1.AddArg(v2) - v1.AddArg(x) - v.AddArg(v1) - return true - } - // match: (Mul32 (Const32 [0]) _) - // result: (Const32 [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 || v_0.AuxInt != 0 { - break - } - v.reset(OpConst32) - v.AuxInt = 0 - return true - } - // match: (Mul32 _ (Const32 [0])) - // result: (Const32 [0]) - for { - _ = v.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.AuxInt != 0 { - break - } - v.reset(OpConst32) - v.AuxInt = 0 - return true - } - // match: (Mul32 (Const32 [c]) (Mul32 (Const32 [d]) x)) - // result: (Mul32 (Const32 [int64(int32(c*d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 || v_1_0.Type != t { - break - } - d := v_1_0.AuxInt - v.reset(OpMul32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c * d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Mul32 (Const32 [c]) (Mul32 x (Const32 [d]))) - // result: (Mul32 (Const32 [int64(int32(c*d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpMul32 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 || v_1_1.Type != t { - break - } - d := v_1_1.AuxInt - v.reset(OpMul32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c * d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Mul32 (Mul32 (Const32 [d]) x) (Const32 [c])) - // result: (Mul32 (Const32 [int64(int32(c*d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break - } - t := v_0_0.Type - d := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpMul32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c * d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Mul32 (Mul32 x (Const32 [d])) (Const32 [c])) - // result: (Mul32 (Const32 [int64(int32(c*d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { - break - } - t := v_0_1.Type - d := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpMul32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c * d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - return false -} -func rewriteValuegeneric_OpMul32F_0(v *Value) bool { - // match: (Mul32F (Const32F [c]) (Const32F [d])) - // result: (Const32F [auxFrom32F(auxTo32F(c) * auxTo32F(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32F { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32F { - break - } - d := v_1.AuxInt - v.reset(OpConst32F) - v.AuxInt = auxFrom32F(auxTo32F(c) * auxTo32F(d)) - return true - } - // match: (Mul32F (Const32F [d]) (Const32F [c])) - // result: (Const32F [auxFrom32F(auxTo32F(c) * auxTo32F(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32F { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32F { - break - } - c := v_1.AuxInt - v.reset(OpConst32F) - v.AuxInt = auxFrom32F(auxTo32F(c) * auxTo32F(d)) - return true - } - // match: (Mul32F x (Const32F [auxFrom64F(1)])) - // result: x - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32F || v_1.AuxInt != auxFrom64F(1) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Mul32F (Const32F [auxFrom64F(1)]) x) - // result: x - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32F || v_0.AuxInt != auxFrom64F(1) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Mul32F x (Const32F [auxFrom32F(-1)])) - // result: (Neg32F x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32F || v_1.AuxInt != auxFrom32F(-1) { - break - } - v.reset(OpNeg32F) - v.AddArg(x) - return true - } - // match: (Mul32F (Const32F [auxFrom32F(-1)]) x) - // result: (Neg32F x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32F || v_0.AuxInt != auxFrom32F(-1) { - break - } - v.reset(OpNeg32F) - v.AddArg(x) - return true - } - // match: (Mul32F x (Const32F [auxFrom32F(2)])) - // result: (Add32F x x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32F || v_1.AuxInt != auxFrom32F(2) { - break - } - v.reset(OpAdd32F) - v.AddArg(x) - v.AddArg(x) - return true - } - // match: (Mul32F (Const32F [auxFrom32F(2)]) x) - // result: (Add32F x x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32F || v_0.AuxInt != auxFrom32F(2) { - break - } - v.reset(OpAdd32F) - v.AddArg(x) - v.AddArg(x) - return true - } - return false -} -func rewriteValuegeneric_OpMul64_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Mul64 (Const64 [c]) (Const64 [d])) - // result: (Const64 [c*d]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - v.reset(OpConst64) - v.AuxInt = c * d - return true - } - // match: (Mul64 (Const64 [d]) (Const64 [c])) - // result: (Const64 [c*d]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c := v_1.AuxInt - v.reset(OpConst64) - v.AuxInt = c * d - return true - } - // match: (Mul64 (Const64 [1]) x) - // result: x - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 || v_0.AuxInt != 1 { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Mul64 x (Const64 [1])) - // result: x - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 1 { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Mul64 (Const64 [-1]) x) - // result: (Neg64 x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 || v_0.AuxInt != -1 { - break - } - v.reset(OpNeg64) - v.AddArg(x) - return true - } - // match: (Mul64 x (Const64 [-1])) - // result: (Neg64 x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != -1 { - break - } - v.reset(OpNeg64) - v.AddArg(x) - return true - } - // match: (Mul64 n (Const64 [c])) - // cond: isPowerOfTwo(c) - // result: (Lsh64x64 n (Const64 [log2(c)])) - for { - t := v.Type - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c)) { - break - } - v.reset(OpLsh64x64) - v.Type = t - v.AddArg(n) - v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v0.AuxInt = log2(c) - v.AddArg(v0) - return true - } - // match: (Mul64 (Const64 [c]) n) - // cond: isPowerOfTwo(c) - // result: (Lsh64x64 n (Const64 [log2(c)])) - for { - t := v.Type - n := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - c := v_0.AuxInt - if !(isPowerOfTwo(c)) { - break - } - v.reset(OpLsh64x64) - v.Type = t - v.AddArg(n) - v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v0.AuxInt = log2(c) - v.AddArg(v0) - return true - } - // match: (Mul64 n (Const64 [c])) - // cond: t.IsSigned() && isPowerOfTwo(-c) - // result: (Neg64 (Lsh64x64 n (Const64 [log2(-c)]))) - for { - t := v.Type - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c := v_1.AuxInt - if !(t.IsSigned() && isPowerOfTwo(-c)) { - break - } - v.reset(OpNeg64) - v0 := b.NewValue0(v.Pos, OpLsh64x64, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v1.AuxInt = log2(-c) - v0.AddArg(v1) - v.AddArg(v0) - return true - } - // match: (Mul64 (Const64 [c]) n) - // cond: t.IsSigned() && isPowerOfTwo(-c) - // result: (Neg64 (Lsh64x64 n (Const64 [log2(-c)]))) - for { - t := v.Type - n := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - c := v_0.AuxInt - if !(t.IsSigned() && isPowerOfTwo(-c)) { - break - } - v.reset(OpNeg64) - v0 := b.NewValue0(v.Pos, OpLsh64x64, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v1.AuxInt = log2(-c) - v0.AddArg(v1) - v.AddArg(v0) - return true - } - return false -} -func rewriteValuegeneric_OpMul64_10(v *Value) bool { - b := v.Block - // match: (Mul64 (Const64 [c]) (Add64 (Const64 [d]) x)) - // result: (Add64 (Const64 [c*d]) (Mul64 (Const64 [c]) x)) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAdd64 || v_1.Type != t { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst64 || v_1_0.Type != t { - break - } - d := v_1_0.AuxInt - v.reset(OpAdd64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c * d - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpMul64, t) - v2 := b.NewValue0(v.Pos, OpConst64, t) - v2.AuxInt = c - v1.AddArg(v2) - v1.AddArg(x) - v.AddArg(v1) - return true - } - // match: (Mul64 (Const64 [c]) (Add64 x (Const64 [d]))) - // result: (Add64 (Const64 [c*d]) (Mul64 (Const64 [c]) x)) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAdd64 || v_1.Type != t { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != t { - break - } - d := v_1_1.AuxInt - v.reset(OpAdd64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c * d - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpMul64, t) - v2 := b.NewValue0(v.Pos, OpConst64, t) - v2.AuxInt = c - v1.AddArg(v2) - v1.AddArg(x) - v.AddArg(v1) - return true - } - // match: (Mul64 (Add64 (Const64 [d]) x) (Const64 [c])) - // result: (Add64 (Const64 [c*d]) (Mul64 (Const64 [c]) x)) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd64 { - break - } - t := v_0.Type - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 || v_0_0.Type != t { - break - } - d := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpAdd64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c * d - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpMul64, t) - v2 := b.NewValue0(v.Pos, OpConst64, t) - v2.AuxInt = c - v1.AddArg(v2) - v1.AddArg(x) - v.AddArg(v1) - return true - } - // match: (Mul64 (Add64 x (Const64 [d])) (Const64 [c])) - // result: (Add64 (Const64 [c*d]) (Mul64 (Const64 [c]) x)) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd64 { - break - } - t := v_0.Type - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.Type != t { - break - } - d := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpAdd64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c * d - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpMul64, t) - v2 := b.NewValue0(v.Pos, OpConst64, t) - v2.AuxInt = c - v1.AddArg(v2) - v1.AddArg(x) - v.AddArg(v1) - return true - } - // match: (Mul64 (Const64 [0]) _) - // result: (Const64 [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 || v_0.AuxInt != 0 { - break - } - v.reset(OpConst64) - v.AuxInt = 0 - return true - } - // match: (Mul64 _ (Const64 [0])) - // result: (Const64 [0]) - for { - _ = v.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 0 { - break - } - v.reset(OpConst64) - v.AuxInt = 0 - return true - } - // match: (Mul64 (Const64 [c]) (Mul64 (Const64 [d]) x)) - // result: (Mul64 (Const64 [c*d]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst64 || v_1_0.Type != t { - break - } - d := v_1_0.AuxInt - v.reset(OpMul64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c * d - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Mul64 (Const64 [c]) (Mul64 x (Const64 [d]))) - // result: (Mul64 (Const64 [c*d]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != t { - break - } - d := v_1_1.AuxInt - v.reset(OpMul64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c * d - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Mul64 (Mul64 (Const64 [d]) x) (Const64 [c])) - // result: (Mul64 (Const64 [c*d]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 { - break - } - t := v_0_0.Type - d := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpMul64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c * d - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Mul64 (Mul64 x (Const64 [d])) (Const64 [c])) - // result: (Mul64 (Const64 [c*d]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - t := v_0_1.Type - d := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpMul64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c * d - v.AddArg(v0) - v.AddArg(x) - return true - } - return false -} -func rewriteValuegeneric_OpMul64F_0(v *Value) bool { - // match: (Mul64F (Const64F [c]) (Const64F [d])) - // result: (Const64F [auxFrom64F(auxTo64F(c) * auxTo64F(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64F { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64F { - break - } - d := v_1.AuxInt - v.reset(OpConst64F) - v.AuxInt = auxFrom64F(auxTo64F(c) * auxTo64F(d)) - return true - } - // match: (Mul64F (Const64F [d]) (Const64F [c])) - // result: (Const64F [auxFrom64F(auxTo64F(c) * auxTo64F(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64F { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64F { - break - } - c := v_1.AuxInt - v.reset(OpConst64F) - v.AuxInt = auxFrom64F(auxTo64F(c) * auxTo64F(d)) - return true - } - // match: (Mul64F x (Const64F [auxFrom64F(1)])) - // result: x - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64F || v_1.AuxInt != auxFrom64F(1) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Mul64F (Const64F [auxFrom64F(1)]) x) - // result: x - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64F || v_0.AuxInt != auxFrom64F(1) { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Mul64F x (Const64F [auxFrom64F(-1)])) - // result: (Neg64F x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64F || v_1.AuxInt != auxFrom64F(-1) { - break - } - v.reset(OpNeg64F) - v.AddArg(x) - return true - } - // match: (Mul64F (Const64F [auxFrom64F(-1)]) x) - // result: (Neg64F x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64F || v_0.AuxInt != auxFrom64F(-1) { - break - } - v.reset(OpNeg64F) - v.AddArg(x) - return true - } - // match: (Mul64F x (Const64F [auxFrom64F(2)])) - // result: (Add64F x x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64F || v_1.AuxInt != auxFrom64F(2) { - break - } - v.reset(OpAdd64F) - v.AddArg(x) - v.AddArg(x) - return true - } - // match: (Mul64F (Const64F [auxFrom64F(2)]) x) - // result: (Add64F x x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64F || v_0.AuxInt != auxFrom64F(2) { - break - } - v.reset(OpAdd64F) - v.AddArg(x) - v.AddArg(x) - return true - } - return false -} -func rewriteValuegeneric_OpMul8_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Mul8 (Const8 [c]) (Const8 [d])) - // result: (Const8 [int64(int8(c*d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break - } - d := v_1.AuxInt - v.reset(OpConst8) - v.AuxInt = int64(int8(c * d)) - return true - } - // match: (Mul8 (Const8 [d]) (Const8 [c])) - // result: (Const8 [int64(int8(c*d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break - } - c := v_1.AuxInt - v.reset(OpConst8) - v.AuxInt = int64(int8(c * d)) - return true - } - // match: (Mul8 (Const8 [1]) x) - // result: x - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 || v_0.AuxInt != 1 { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Mul8 x (Const8 [1])) - // result: x - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.AuxInt != 1 { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Mul8 (Const8 [-1]) x) - // result: (Neg8 x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 || v_0.AuxInt != -1 { - break - } - v.reset(OpNeg8) - v.AddArg(x) - return true - } - // match: (Mul8 x (Const8 [-1])) - // result: (Neg8 x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.AuxInt != -1 { - break - } - v.reset(OpNeg8) - v.AddArg(x) - return true - } - // match: (Mul8 n (Const8 [c])) - // cond: isPowerOfTwo(c) - // result: (Lsh8x64 n (Const64 [log2(c)])) - for { - t := v.Type - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break - } - c := v_1.AuxInt - if !(isPowerOfTwo(c)) { - break - } - v.reset(OpLsh8x64) - v.Type = t - v.AddArg(n) - v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v0.AuxInt = log2(c) - v.AddArg(v0) - return true - } - // match: (Mul8 (Const8 [c]) n) - // cond: isPowerOfTwo(c) - // result: (Lsh8x64 n (Const64 [log2(c)])) - for { - t := v.Type - n := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - c := v_0.AuxInt - if !(isPowerOfTwo(c)) { - break - } - v.reset(OpLsh8x64) - v.Type = t - v.AddArg(n) - v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v0.AuxInt = log2(c) - v.AddArg(v0) - return true - } - // match: (Mul8 n (Const8 [c])) - // cond: t.IsSigned() && isPowerOfTwo(-c) - // result: (Neg8 (Lsh8x64 n (Const64 [log2(-c)]))) - for { - t := v.Type - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break - } - c := v_1.AuxInt - if !(t.IsSigned() && isPowerOfTwo(-c)) { - break - } - v.reset(OpNeg8) - v0 := b.NewValue0(v.Pos, OpLsh8x64, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v1.AuxInt = log2(-c) - v0.AddArg(v1) - v.AddArg(v0) - return true - } - // match: (Mul8 (Const8 [c]) n) - // cond: t.IsSigned() && isPowerOfTwo(-c) - // result: (Neg8 (Lsh8x64 n (Const64 [log2(-c)]))) - for { - t := v.Type - n := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - c := v_0.AuxInt - if !(t.IsSigned() && isPowerOfTwo(-c)) { - break - } - v.reset(OpNeg8) - v0 := b.NewValue0(v.Pos, OpLsh8x64, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v1.AuxInt = log2(-c) - v0.AddArg(v1) - v.AddArg(v0) - return true - } - return false -} -func rewriteValuegeneric_OpMul8_10(v *Value) bool { - b := v.Block - // match: (Mul8 (Const8 [0]) _) - // result: (Const8 [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 || v_0.AuxInt != 0 { - break - } - v.reset(OpConst8) - v.AuxInt = 0 - return true - } - // match: (Mul8 _ (Const8 [0])) - // result: (Const8 [0]) - for { - _ = v.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.AuxInt != 0 { - break - } - v.reset(OpConst8) - v.AuxInt = 0 - return true - } - // match: (Mul8 (Const8 [c]) (Mul8 (Const8 [d]) x)) - // result: (Mul8 (Const8 [int64(int8(c*d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpMul8 { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst8 || v_1_0.Type != t { - break - } - d := v_1_0.AuxInt - v.reset(OpMul8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c * d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Mul8 (Const8 [c]) (Mul8 x (Const8 [d]))) - // result: (Mul8 (Const8 [int64(int8(c*d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpMul8 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst8 || v_1_1.Type != t { - break - } - d := v_1_1.AuxInt - v.reset(OpMul8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c * d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Mul8 (Mul8 (Const8 [d]) x) (Const8 [c])) - // result: (Mul8 (Const8 [int64(int8(c*d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul8 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst8 { - break - } - t := v_0_0.Type - d := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpMul8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c * d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Mul8 (Mul8 x (Const8 [d])) (Const8 [c])) - // result: (Mul8 (Const8 [int64(int8(c*d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul8 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst8 { - break - } - t := v_0_1.Type - d := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpMul8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c * d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - return false -} -func rewriteValuegeneric_OpNeg16_0(v *Value) bool { - b := v.Block - // match: (Neg16 (Const16 [c])) - // result: (Const16 [int64(-int16(c))]) - for { - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - c := v_0.AuxInt - v.reset(OpConst16) - v.AuxInt = int64(-int16(c)) - return true - } - // match: (Neg16 (Sub16 x y)) - // result: (Sub16 y x) - for { - v_0 := v.Args[0] - if v_0.Op != OpSub16 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpSub16) - v.AddArg(y) - v.AddArg(x) - return true - } - // match: (Neg16 (Neg16 x)) - // result: x - for { - v_0 := v.Args[0] - if v_0.Op != OpNeg16 { - break - } - x := v_0.Args[0] - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Neg16 (Com16 x)) - // result: (Add16 (Const16 [1]) x) - for { - t := v.Type - v_0 := v.Args[0] - if v_0.Op != OpCom16 { - break - } - x := v_0.Args[0] - v.reset(OpAdd16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = 1 - v.AddArg(v0) - v.AddArg(x) - return true - } - return false -} -func rewriteValuegeneric_OpNeg32_0(v *Value) bool { - b := v.Block - // match: (Neg32 (Const32 [c])) - // result: (Const32 [int64(-int32(c))]) - for { - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - c := v_0.AuxInt - v.reset(OpConst32) - v.AuxInt = int64(-int32(c)) - return true - } - // match: (Neg32 (Sub32 x y)) - // result: (Sub32 y x) - for { - v_0 := v.Args[0] - if v_0.Op != OpSub32 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpSub32) - v.AddArg(y) - v.AddArg(x) - return true - } - // match: (Neg32 (Neg32 x)) - // result: x - for { - v_0 := v.Args[0] - if v_0.Op != OpNeg32 { - break - } - x := v_0.Args[0] - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Neg32 (Com32 x)) - // result: (Add32 (Const32 [1]) x) - for { - t := v.Type - v_0 := v.Args[0] - if v_0.Op != OpCom32 { - break - } - x := v_0.Args[0] - v.reset(OpAdd32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = 1 - v.AddArg(v0) - v.AddArg(x) - return true - } - return false -} -func rewriteValuegeneric_OpNeg32F_0(v *Value) bool { - // match: (Neg32F (Const32F [c])) - // cond: auxTo32F(c) != 0 - // result: (Const32F [auxFrom32F(-auxTo32F(c))]) - for { - v_0 := v.Args[0] - if v_0.Op != OpConst32F { - break - } - c := v_0.AuxInt - if !(auxTo32F(c) != 0) { - break - } - v.reset(OpConst32F) - v.AuxInt = auxFrom32F(-auxTo32F(c)) - return true - } - return false -} -func rewriteValuegeneric_OpNeg64_0(v *Value) bool { - b := v.Block - // match: (Neg64 (Const64 [c])) - // result: (Const64 [-c]) - for { - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - c := v_0.AuxInt - v.reset(OpConst64) - v.AuxInt = -c - return true - } - // match: (Neg64 (Sub64 x y)) - // result: (Sub64 y x) - for { - v_0 := v.Args[0] - if v_0.Op != OpSub64 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpSub64) - v.AddArg(y) - v.AddArg(x) - return true - } - // match: (Neg64 (Neg64 x)) - // result: x - for { - v_0 := v.Args[0] - if v_0.Op != OpNeg64 { - break - } - x := v_0.Args[0] - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Neg64 (Com64 x)) - // result: (Add64 (Const64 [1]) x) - for { - t := v.Type - v_0 := v.Args[0] - if v_0.Op != OpCom64 { - break - } - x := v_0.Args[0] - v.reset(OpAdd64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = 1 - v.AddArg(v0) - v.AddArg(x) - return true - } - return false -} -func rewriteValuegeneric_OpNeg64F_0(v *Value) bool { - // match: (Neg64F (Const64F [c])) - // cond: auxTo64F(c) != 0 - // result: (Const64F [auxFrom64F(-auxTo64F(c))]) - for { - v_0 := v.Args[0] - if v_0.Op != OpConst64F { - break - } - c := v_0.AuxInt - if !(auxTo64F(c) != 0) { - break - } - v.reset(OpConst64F) - v.AuxInt = auxFrom64F(-auxTo64F(c)) - return true - } - return false -} -func rewriteValuegeneric_OpNeg8_0(v *Value) bool { - b := v.Block - // match: (Neg8 (Const8 [c])) - // result: (Const8 [int64( -int8(c))]) - for { - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - c := v_0.AuxInt - v.reset(OpConst8) - v.AuxInt = int64(-int8(c)) - return true - } - // match: (Neg8 (Sub8 x y)) - // result: (Sub8 y x) - for { - v_0 := v.Args[0] - if v_0.Op != OpSub8 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpSub8) - v.AddArg(y) - v.AddArg(x) - return true - } - // match: (Neg8 (Neg8 x)) - // result: x - for { - v_0 := v.Args[0] - if v_0.Op != OpNeg8 { - break - } - x := v_0.Args[0] - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Neg8 (Com8 x)) - // result: (Add8 (Const8 [1]) x) - for { - t := v.Type - v_0 := v.Args[0] - if v_0.Op != OpCom8 { - break - } - x := v_0.Args[0] - v.reset(OpAdd8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = 1 - v.AddArg(v0) - v.AddArg(x) - return true - } - return false -} -func rewriteValuegeneric_OpNeq16_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Neq16 x x) - // result: (ConstBool [0]) - for { - x := v.Args[1] - if x != v.Args[0] { - break - } - v.reset(OpConstBool) - v.AuxInt = 0 - return true - } - // match: (Neq16 (Const16 [c]) (Add16 (Const16 [d]) x)) - // result: (Neq16 (Const16 [int64(int16(c-d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAdd16 { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst16 || v_1_0.Type != t { - break - } - d := v_1_0.AuxInt - v.reset(OpNeq16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c - d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Neq16 (Const16 [c]) (Add16 x (Const16 [d]))) - // result: (Neq16 (Const16 [int64(int16(c-d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAdd16 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst16 || v_1_1.Type != t { - break - } - d := v_1_1.AuxInt - v.reset(OpNeq16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c - d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Neq16 (Add16 (Const16 [d]) x) (Const16 [c])) - // result: (Neq16 (Const16 [int64(int16(c-d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd16 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst16 { - break - } - t := v_0_0.Type - d := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpNeq16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c - d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Neq16 (Add16 x (Const16 [d])) (Const16 [c])) - // result: (Neq16 (Const16 [int64(int16(c-d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd16 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst16 { - break - } - t := v_0_1.Type - d := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpNeq16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c - d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Neq16 (Const16 [c]) (Const16 [d])) - // result: (ConstBool [b2i(c != d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c != d) - return true - } - // match: (Neq16 (Const16 [d]) (Const16 [c])) - // result: (ConstBool [b2i(c != d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - c := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c != d) - return true - } - // match: (Neq16 n (Lsh16x64 (Rsh16x64 (Add16 n (Rsh16Ux64 (Rsh16x64 n (Const64 [15])) (Const64 [kbar]))) (Const64 [k])) (Const64 [k]))) - // cond: k > 0 && k < 15 && kbar == 16 - k - // result: (Neq16 (And16 n (Const16 [int64(1< [0])) - for { - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpLsh16x64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpRsh16x64 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAdd16 { - break - } - t := v_1_0_0.Type - _ = v_1_0_0.Args[1] - if n != v_1_0_0.Args[0] { - break - } - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpRsh16Ux64 || v_1_0_0_1.Type != t { - break - } - _ = v_1_0_0_1.Args[1] - v_1_0_0_1_0 := v_1_0_0_1.Args[0] - if v_1_0_0_1_0.Op != OpRsh16x64 || v_1_0_0_1_0.Type != t { - break - } - _ = v_1_0_0_1_0.Args[1] - if n != v_1_0_0_1_0.Args[0] { - break - } - v_1_0_0_1_0_1 := v_1_0_0_1_0.Args[1] - if v_1_0_0_1_0_1.Op != OpConst64 || v_1_0_0_1_0_1.Type != typ.UInt64 || v_1_0_0_1_0_1.AuxInt != 15 { - break - } - v_1_0_0_1_1 := v_1_0_0_1.Args[1] - if v_1_0_0_1_1.Op != OpConst64 || v_1_0_0_1_1.Type != typ.UInt64 { - break - } - kbar := v_1_0_0_1_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 { - break - } - k := v_1_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || v_1_1.AuxInt != k || !(k > 0 && k < 15 && kbar == 16-k) { - break - } - v.reset(OpNeq16) - v0 := b.NewValue0(v.Pos, OpAnd16, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst16, t) - v1.AuxInt = int64(1< (Rsh16Ux64 (Rsh16x64 n (Const64 [15])) (Const64 [kbar])) n) (Const64 [k])) (Const64 [k]))) - // cond: k > 0 && k < 15 && kbar == 16 - k - // result: (Neq16 (And16 n (Const16 [int64(1< [0])) - for { - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpLsh16x64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpRsh16x64 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAdd16 { - break - } - t := v_1_0_0.Type - _ = v_1_0_0.Args[1] - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpRsh16Ux64 || v_1_0_0_0.Type != t { - break - } - _ = v_1_0_0_0.Args[1] - v_1_0_0_0_0 := v_1_0_0_0.Args[0] - if v_1_0_0_0_0.Op != OpRsh16x64 || v_1_0_0_0_0.Type != t { - break - } - _ = v_1_0_0_0_0.Args[1] - if n != v_1_0_0_0_0.Args[0] { - break - } - v_1_0_0_0_0_1 := v_1_0_0_0_0.Args[1] - if v_1_0_0_0_0_1.Op != OpConst64 || v_1_0_0_0_0_1.Type != typ.UInt64 || v_1_0_0_0_0_1.AuxInt != 15 { - break - } - v_1_0_0_0_1 := v_1_0_0_0.Args[1] - if v_1_0_0_0_1.Op != OpConst64 || v_1_0_0_0_1.Type != typ.UInt64 { - break - } - kbar := v_1_0_0_0_1.AuxInt - if n != v_1_0_0.Args[1] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 { - break - } - k := v_1_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || v_1_1.AuxInt != k || !(k > 0 && k < 15 && kbar == 16-k) { - break - } - v.reset(OpNeq16) - v0 := b.NewValue0(v.Pos, OpAnd16, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst16, t) - v1.AuxInt = int64(1< n (Rsh16Ux64 (Rsh16x64 n (Const64 [15])) (Const64 [kbar]))) (Const64 [k])) (Const64 [k])) n) - // cond: k > 0 && k < 15 && kbar == 16 - k - // result: (Neq16 (And16 n (Const16 [int64(1< [0])) - for { - n := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh16x64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh16x64 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAdd16 { - break - } - t := v_0_0_0.Type - _ = v_0_0_0.Args[1] - if n != v_0_0_0.Args[0] { - break - } - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpRsh16Ux64 || v_0_0_0_1.Type != t { - break - } - _ = v_0_0_0_1.Args[1] - v_0_0_0_1_0 := v_0_0_0_1.Args[0] - if v_0_0_0_1_0.Op != OpRsh16x64 || v_0_0_0_1_0.Type != t { - break - } - _ = v_0_0_0_1_0.Args[1] - if n != v_0_0_0_1_0.Args[0] { - break - } - v_0_0_0_1_0_1 := v_0_0_0_1_0.Args[1] - if v_0_0_0_1_0_1.Op != OpConst64 || v_0_0_0_1_0_1.Type != typ.UInt64 || v_0_0_0_1_0_1.AuxInt != 15 { - break - } - v_0_0_0_1_1 := v_0_0_0_1.Args[1] - if v_0_0_0_1_1.Op != OpConst64 || v_0_0_0_1_1.Type != typ.UInt64 { - break - } - kbar := v_0_0_0_1_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 || v_0_0_1.Type != typ.UInt64 { - break - } - k := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.Type != typ.UInt64 || v_0_1.AuxInt != k || !(k > 0 && k < 15 && kbar == 16-k) { - break - } - v.reset(OpNeq16) - v0 := b.NewValue0(v.Pos, OpAnd16, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst16, t) - v1.AuxInt = int64(1< (Rsh16Ux64 (Rsh16x64 n (Const64 [15])) (Const64 [kbar])) n) (Const64 [k])) (Const64 [k])) n) - // cond: k > 0 && k < 15 && kbar == 16 - k - // result: (Neq16 (And16 n (Const16 [int64(1< [0])) - for { - n := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh16x64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh16x64 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAdd16 { - break - } - t := v_0_0_0.Type - _ = v_0_0_0.Args[1] - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpRsh16Ux64 || v_0_0_0_0.Type != t { - break - } - _ = v_0_0_0_0.Args[1] - v_0_0_0_0_0 := v_0_0_0_0.Args[0] - if v_0_0_0_0_0.Op != OpRsh16x64 || v_0_0_0_0_0.Type != t { - break - } - _ = v_0_0_0_0_0.Args[1] - if n != v_0_0_0_0_0.Args[0] { - break - } - v_0_0_0_0_0_1 := v_0_0_0_0_0.Args[1] - if v_0_0_0_0_0_1.Op != OpConst64 || v_0_0_0_0_0_1.Type != typ.UInt64 || v_0_0_0_0_0_1.AuxInt != 15 { - break - } - v_0_0_0_0_1 := v_0_0_0_0.Args[1] - if v_0_0_0_0_1.Op != OpConst64 || v_0_0_0_0_1.Type != typ.UInt64 { - break - } - kbar := v_0_0_0_0_1.AuxInt - if n != v_0_0_0.Args[1] { - break - } - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 || v_0_0_1.Type != typ.UInt64 { - break - } - k := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.Type != typ.UInt64 || v_0_1.AuxInt != k || !(k > 0 && k < 15 && kbar == 16-k) { - break - } - v.reset(OpNeq16) - v0 := b.NewValue0(v.Pos, OpAnd16, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst16, t) - v1.AuxInt = int64(1< x (Const16 [y])) (Const16 [y])) - // cond: isPowerOfTwo(y) - // result: (Eq16 (And16 x (Const16 [y])) (Const16 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd16 { - break - } - t := v_0.Type - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst16 || v_0_1.Type != t { - break - } - y := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.Type != t || v_1.AuxInt != y || !(isPowerOfTwo(y)) { - break - } - v.reset(OpEq16) - v0 := b.NewValue0(v.Pos, OpAnd16, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst16, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst16, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true - } - // match: (Neq16 (And16 (Const16 [y]) x) (Const16 [y])) - // cond: isPowerOfTwo(y) - // result: (Eq16 (And16 x (Const16 [y])) (Const16 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd16 { - break - } - t := v_0.Type - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst16 || v_0_0.Type != t { - break - } - y := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.Type != t || v_1.AuxInt != y || !(isPowerOfTwo(y)) { - break - } - v.reset(OpEq16) - v0 := b.NewValue0(v.Pos, OpAnd16, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst16, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst16, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true - } - // match: (Neq16 (Const16 [y]) (And16 x (Const16 [y]))) - // cond: isPowerOfTwo(y) - // result: (Eq16 (And16 x (Const16 [y])) (Const16 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - t := v_0.Type - y := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAnd16 || v_1.Type != t { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst16 || v_1_1.Type != t || v_1_1.AuxInt != y || !(isPowerOfTwo(y)) { - break - } - v.reset(OpEq16) - v0 := b.NewValue0(v.Pos, OpAnd16, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst16, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst16, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true - } - // match: (Neq16 (Const16 [y]) (And16 (Const16 [y]) x)) - // cond: isPowerOfTwo(y) - // result: (Eq16 (And16 x (Const16 [y])) (Const16 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - t := v_0.Type - y := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAnd16 || v_1.Type != t { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst16 || v_1_0.Type != t || v_1_0.AuxInt != y || !(isPowerOfTwo(y)) { - break - } - v.reset(OpEq16) - v0 := b.NewValue0(v.Pos, OpAnd16, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst16, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst16, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true - } - return false -} -func rewriteValuegeneric_OpNeq32_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Neq32 x x) - // result: (ConstBool [0]) - for { - x := v.Args[1] - if x != v.Args[0] { - break - } - v.reset(OpConstBool) - v.AuxInt = 0 - return true - } - // match: (Neq32 (Const32 [c]) (Add32 (Const32 [d]) x)) - // result: (Neq32 (Const32 [int64(int32(c-d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAdd32 { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 || v_1_0.Type != t { - break - } - d := v_1_0.AuxInt - v.reset(OpNeq32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c - d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Neq32 (Const32 [c]) (Add32 x (Const32 [d]))) - // result: (Neq32 (Const32 [int64(int32(c-d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAdd32 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 || v_1_1.Type != t { - break - } - d := v_1_1.AuxInt - v.reset(OpNeq32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c - d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Neq32 (Add32 (Const32 [d]) x) (Const32 [c])) - // result: (Neq32 (Const32 [int64(int32(c-d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd32 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break - } - t := v_0_0.Type - d := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpNeq32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c - d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Neq32 (Add32 x (Const32 [d])) (Const32 [c])) - // result: (Neq32 (Const32 [int64(int32(c-d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd32 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { - break - } - t := v_0_1.Type - d := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpNeq32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c - d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Neq32 (Const32 [c]) (Const32 [d])) - // result: (ConstBool [b2i(c != d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c != d) - return true - } - // match: (Neq32 (Const32 [d]) (Const32 [c])) - // result: (ConstBool [b2i(c != d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - c := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c != d) - return true - } - // match: (Neq32 n (Lsh32x64 (Rsh32x64 (Add32 n (Rsh32Ux64 (Rsh32x64 n (Const64 [31])) (Const64 [kbar]))) (Const64 [k])) (Const64 [k]))) - // cond: k > 0 && k < 31 && kbar == 32 - k - // result: (Neq32 (And32 n (Const32 [int64(1< [0])) - for { - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpLsh32x64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpRsh32x64 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAdd32 { - break - } - t := v_1_0_0.Type - _ = v_1_0_0.Args[1] - if n != v_1_0_0.Args[0] { - break - } - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpRsh32Ux64 || v_1_0_0_1.Type != t { - break - } - _ = v_1_0_0_1.Args[1] - v_1_0_0_1_0 := v_1_0_0_1.Args[0] - if v_1_0_0_1_0.Op != OpRsh32x64 || v_1_0_0_1_0.Type != t { - break - } - _ = v_1_0_0_1_0.Args[1] - if n != v_1_0_0_1_0.Args[0] { - break - } - v_1_0_0_1_0_1 := v_1_0_0_1_0.Args[1] - if v_1_0_0_1_0_1.Op != OpConst64 || v_1_0_0_1_0_1.Type != typ.UInt64 || v_1_0_0_1_0_1.AuxInt != 31 { - break - } - v_1_0_0_1_1 := v_1_0_0_1.Args[1] - if v_1_0_0_1_1.Op != OpConst64 || v_1_0_0_1_1.Type != typ.UInt64 { - break - } - kbar := v_1_0_0_1_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 { - break - } - k := v_1_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || v_1_1.AuxInt != k || !(k > 0 && k < 31 && kbar == 32-k) { - break - } - v.reset(OpNeq32) - v0 := b.NewValue0(v.Pos, OpAnd32, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst32, t) - v1.AuxInt = int64(1< (Rsh32Ux64 (Rsh32x64 n (Const64 [31])) (Const64 [kbar])) n) (Const64 [k])) (Const64 [k]))) - // cond: k > 0 && k < 31 && kbar == 32 - k - // result: (Neq32 (And32 n (Const32 [int64(1< [0])) - for { - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpLsh32x64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpRsh32x64 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAdd32 { - break - } - t := v_1_0_0.Type - _ = v_1_0_0.Args[1] - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpRsh32Ux64 || v_1_0_0_0.Type != t { - break - } - _ = v_1_0_0_0.Args[1] - v_1_0_0_0_0 := v_1_0_0_0.Args[0] - if v_1_0_0_0_0.Op != OpRsh32x64 || v_1_0_0_0_0.Type != t { - break - } - _ = v_1_0_0_0_0.Args[1] - if n != v_1_0_0_0_0.Args[0] { - break - } - v_1_0_0_0_0_1 := v_1_0_0_0_0.Args[1] - if v_1_0_0_0_0_1.Op != OpConst64 || v_1_0_0_0_0_1.Type != typ.UInt64 || v_1_0_0_0_0_1.AuxInt != 31 { - break - } - v_1_0_0_0_1 := v_1_0_0_0.Args[1] - if v_1_0_0_0_1.Op != OpConst64 || v_1_0_0_0_1.Type != typ.UInt64 { - break - } - kbar := v_1_0_0_0_1.AuxInt - if n != v_1_0_0.Args[1] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 { - break - } - k := v_1_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || v_1_1.AuxInt != k || !(k > 0 && k < 31 && kbar == 32-k) { - break - } - v.reset(OpNeq32) - v0 := b.NewValue0(v.Pos, OpAnd32, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst32, t) - v1.AuxInt = int64(1< n (Rsh32Ux64 (Rsh32x64 n (Const64 [31])) (Const64 [kbar]))) (Const64 [k])) (Const64 [k])) n) - // cond: k > 0 && k < 31 && kbar == 32 - k - // result: (Neq32 (And32 n (Const32 [int64(1< [0])) - for { - n := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh32x64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh32x64 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAdd32 { - break - } - t := v_0_0_0.Type - _ = v_0_0_0.Args[1] - if n != v_0_0_0.Args[0] { - break - } - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpRsh32Ux64 || v_0_0_0_1.Type != t { - break - } - _ = v_0_0_0_1.Args[1] - v_0_0_0_1_0 := v_0_0_0_1.Args[0] - if v_0_0_0_1_0.Op != OpRsh32x64 || v_0_0_0_1_0.Type != t { - break - } - _ = v_0_0_0_1_0.Args[1] - if n != v_0_0_0_1_0.Args[0] { - break - } - v_0_0_0_1_0_1 := v_0_0_0_1_0.Args[1] - if v_0_0_0_1_0_1.Op != OpConst64 || v_0_0_0_1_0_1.Type != typ.UInt64 || v_0_0_0_1_0_1.AuxInt != 31 { - break - } - v_0_0_0_1_1 := v_0_0_0_1.Args[1] - if v_0_0_0_1_1.Op != OpConst64 || v_0_0_0_1_1.Type != typ.UInt64 { - break - } - kbar := v_0_0_0_1_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 || v_0_0_1.Type != typ.UInt64 { - break - } - k := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.Type != typ.UInt64 || v_0_1.AuxInt != k || !(k > 0 && k < 31 && kbar == 32-k) { - break - } - v.reset(OpNeq32) - v0 := b.NewValue0(v.Pos, OpAnd32, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst32, t) - v1.AuxInt = int64(1< (Rsh32Ux64 (Rsh32x64 n (Const64 [31])) (Const64 [kbar])) n) (Const64 [k])) (Const64 [k])) n) - // cond: k > 0 && k < 31 && kbar == 32 - k - // result: (Neq32 (And32 n (Const32 [int64(1< [0])) - for { - n := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh32x64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh32x64 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAdd32 { - break - } - t := v_0_0_0.Type - _ = v_0_0_0.Args[1] - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpRsh32Ux64 || v_0_0_0_0.Type != t { - break - } - _ = v_0_0_0_0.Args[1] - v_0_0_0_0_0 := v_0_0_0_0.Args[0] - if v_0_0_0_0_0.Op != OpRsh32x64 || v_0_0_0_0_0.Type != t { - break - } - _ = v_0_0_0_0_0.Args[1] - if n != v_0_0_0_0_0.Args[0] { - break - } - v_0_0_0_0_0_1 := v_0_0_0_0_0.Args[1] - if v_0_0_0_0_0_1.Op != OpConst64 || v_0_0_0_0_0_1.Type != typ.UInt64 || v_0_0_0_0_0_1.AuxInt != 31 { - break - } - v_0_0_0_0_1 := v_0_0_0_0.Args[1] - if v_0_0_0_0_1.Op != OpConst64 || v_0_0_0_0_1.Type != typ.UInt64 { - break - } - kbar := v_0_0_0_0_1.AuxInt - if n != v_0_0_0.Args[1] { - break - } - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 || v_0_0_1.Type != typ.UInt64 { - break - } - k := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.Type != typ.UInt64 || v_0_1.AuxInt != k || !(k > 0 && k < 31 && kbar == 32-k) { - break - } - v.reset(OpNeq32) - v0 := b.NewValue0(v.Pos, OpAnd32, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst32, t) - v1.AuxInt = int64(1< x (Const32 [y])) (Const32 [y])) - // cond: isPowerOfTwo(y) - // result: (Eq32 (And32 x (Const32 [y])) (Const32 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd32 { - break - } - t := v_0.Type - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 || v_0_1.Type != t { - break - } - y := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.Type != t || v_1.AuxInt != y || !(isPowerOfTwo(y)) { - break - } - v.reset(OpEq32) - v0 := b.NewValue0(v.Pos, OpAnd32, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst32, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst32, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true - } - // match: (Neq32 (And32 (Const32 [y]) x) (Const32 [y])) - // cond: isPowerOfTwo(y) - // result: (Eq32 (And32 x (Const32 [y])) (Const32 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd32 { - break - } - t := v_0.Type - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 || v_0_0.Type != t { - break - } - y := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.Type != t || v_1.AuxInt != y || !(isPowerOfTwo(y)) { - break - } - v.reset(OpEq32) - v0 := b.NewValue0(v.Pos, OpAnd32, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst32, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst32, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true - } - // match: (Neq32 (Const32 [y]) (And32 x (Const32 [y]))) - // cond: isPowerOfTwo(y) - // result: (Eq32 (And32 x (Const32 [y])) (Const32 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - t := v_0.Type - y := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAnd32 || v_1.Type != t { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 || v_1_1.Type != t || v_1_1.AuxInt != y || !(isPowerOfTwo(y)) { - break - } - v.reset(OpEq32) - v0 := b.NewValue0(v.Pos, OpAnd32, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst32, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst32, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true - } - // match: (Neq32 (Const32 [y]) (And32 (Const32 [y]) x)) - // cond: isPowerOfTwo(y) - // result: (Eq32 (And32 x (Const32 [y])) (Const32 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - t := v_0.Type - y := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAnd32 || v_1.Type != t { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 || v_1_0.Type != t || v_1_0.AuxInt != y || !(isPowerOfTwo(y)) { - break - } - v.reset(OpEq32) - v0 := b.NewValue0(v.Pos, OpAnd32, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst32, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst32, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true - } - return false -} -func rewriteValuegeneric_OpNeq32F_0(v *Value) bool { - // match: (Neq32F (Const32F [c]) (Const32F [d])) - // result: (ConstBool [b2i(auxTo32F(c) != auxTo32F(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32F { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32F { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(auxTo32F(c) != auxTo32F(d)) - return true - } - // match: (Neq32F (Const32F [d]) (Const32F [c])) - // result: (ConstBool [b2i(auxTo32F(c) != auxTo32F(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32F { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32F { - break - } - c := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(auxTo32F(c) != auxTo32F(d)) - return true - } - return false -} -func rewriteValuegeneric_OpNeq64_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Neq64 x x) - // result: (ConstBool [0]) - for { - x := v.Args[1] - if x != v.Args[0] { - break - } - v.reset(OpConstBool) - v.AuxInt = 0 - return true - } - // match: (Neq64 (Const64 [c]) (Add64 (Const64 [d]) x)) - // result: (Neq64 (Const64 [c-d]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAdd64 { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst64 || v_1_0.Type != t { - break - } - d := v_1_0.AuxInt - v.reset(OpNeq64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c - d - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Neq64 (Const64 [c]) (Add64 x (Const64 [d]))) - // result: (Neq64 (Const64 [c-d]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAdd64 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != t { - break - } - d := v_1_1.AuxInt - v.reset(OpNeq64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c - d - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Neq64 (Add64 (Const64 [d]) x) (Const64 [c])) - // result: (Neq64 (Const64 [c-d]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd64 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 { - break - } - t := v_0_0.Type - d := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpNeq64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c - d - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Neq64 (Add64 x (Const64 [d])) (Const64 [c])) - // result: (Neq64 (Const64 [c-d]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd64 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - t := v_0_1.Type - d := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpNeq64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c - d - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Neq64 (Const64 [c]) (Const64 [d])) - // result: (ConstBool [b2i(c != d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c != d) - return true - } - // match: (Neq64 (Const64 [d]) (Const64 [c])) - // result: (ConstBool [b2i(c != d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c != d) - return true - } - // match: (Neq64 n (Lsh64x64 (Rsh64x64 (Add64 n (Rsh64Ux64 (Rsh64x64 n (Const64 [63])) (Const64 [kbar]))) (Const64 [k])) (Const64 [k]))) - // cond: k > 0 && k < 63 && kbar == 64 - k - // result: (Neq64 (And64 n (Const64 [int64(1< [0])) - for { - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpLsh64x64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpRsh64x64 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAdd64 { - break - } - t := v_1_0_0.Type - _ = v_1_0_0.Args[1] - if n != v_1_0_0.Args[0] { - break - } - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpRsh64Ux64 || v_1_0_0_1.Type != t { - break - } - _ = v_1_0_0_1.Args[1] - v_1_0_0_1_0 := v_1_0_0_1.Args[0] - if v_1_0_0_1_0.Op != OpRsh64x64 || v_1_0_0_1_0.Type != t { - break - } - _ = v_1_0_0_1_0.Args[1] - if n != v_1_0_0_1_0.Args[0] { - break - } - v_1_0_0_1_0_1 := v_1_0_0_1_0.Args[1] - if v_1_0_0_1_0_1.Op != OpConst64 || v_1_0_0_1_0_1.Type != typ.UInt64 || v_1_0_0_1_0_1.AuxInt != 63 { - break - } - v_1_0_0_1_1 := v_1_0_0_1.Args[1] - if v_1_0_0_1_1.Op != OpConst64 || v_1_0_0_1_1.Type != typ.UInt64 { - break - } - kbar := v_1_0_0_1_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 { - break - } - k := v_1_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || v_1_1.AuxInt != k || !(k > 0 && k < 63 && kbar == 64-k) { - break - } - v.reset(OpNeq64) - v0 := b.NewValue0(v.Pos, OpAnd64, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst64, t) - v1.AuxInt = int64(1< (Rsh64Ux64 (Rsh64x64 n (Const64 [63])) (Const64 [kbar])) n) (Const64 [k])) (Const64 [k]))) - // cond: k > 0 && k < 63 && kbar == 64 - k - // result: (Neq64 (And64 n (Const64 [int64(1< [0])) - for { - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpLsh64x64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpRsh64x64 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAdd64 { - break - } - t := v_1_0_0.Type - _ = v_1_0_0.Args[1] - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpRsh64Ux64 || v_1_0_0_0.Type != t { - break - } - _ = v_1_0_0_0.Args[1] - v_1_0_0_0_0 := v_1_0_0_0.Args[0] - if v_1_0_0_0_0.Op != OpRsh64x64 || v_1_0_0_0_0.Type != t { - break - } - _ = v_1_0_0_0_0.Args[1] - if n != v_1_0_0_0_0.Args[0] { - break - } - v_1_0_0_0_0_1 := v_1_0_0_0_0.Args[1] - if v_1_0_0_0_0_1.Op != OpConst64 || v_1_0_0_0_0_1.Type != typ.UInt64 || v_1_0_0_0_0_1.AuxInt != 63 { - break - } - v_1_0_0_0_1 := v_1_0_0_0.Args[1] - if v_1_0_0_0_1.Op != OpConst64 || v_1_0_0_0_1.Type != typ.UInt64 { - break - } - kbar := v_1_0_0_0_1.AuxInt - if n != v_1_0_0.Args[1] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 { - break - } - k := v_1_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || v_1_1.AuxInt != k || !(k > 0 && k < 63 && kbar == 64-k) { - break - } - v.reset(OpNeq64) - v0 := b.NewValue0(v.Pos, OpAnd64, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst64, t) - v1.AuxInt = int64(1< n (Rsh64Ux64 (Rsh64x64 n (Const64 [63])) (Const64 [kbar]))) (Const64 [k])) (Const64 [k])) n) - // cond: k > 0 && k < 63 && kbar == 64 - k - // result: (Neq64 (And64 n (Const64 [int64(1< [0])) - for { - n := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh64x64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh64x64 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAdd64 { - break - } - t := v_0_0_0.Type - _ = v_0_0_0.Args[1] - if n != v_0_0_0.Args[0] { - break - } - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpRsh64Ux64 || v_0_0_0_1.Type != t { - break - } - _ = v_0_0_0_1.Args[1] - v_0_0_0_1_0 := v_0_0_0_1.Args[0] - if v_0_0_0_1_0.Op != OpRsh64x64 || v_0_0_0_1_0.Type != t { - break - } - _ = v_0_0_0_1_0.Args[1] - if n != v_0_0_0_1_0.Args[0] { - break - } - v_0_0_0_1_0_1 := v_0_0_0_1_0.Args[1] - if v_0_0_0_1_0_1.Op != OpConst64 || v_0_0_0_1_0_1.Type != typ.UInt64 || v_0_0_0_1_0_1.AuxInt != 63 { - break - } - v_0_0_0_1_1 := v_0_0_0_1.Args[1] - if v_0_0_0_1_1.Op != OpConst64 || v_0_0_0_1_1.Type != typ.UInt64 { - break - } - kbar := v_0_0_0_1_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 || v_0_0_1.Type != typ.UInt64 { - break - } - k := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.Type != typ.UInt64 || v_0_1.AuxInt != k || !(k > 0 && k < 63 && kbar == 64-k) { - break - } - v.reset(OpNeq64) - v0 := b.NewValue0(v.Pos, OpAnd64, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst64, t) - v1.AuxInt = int64(1< (Rsh64Ux64 (Rsh64x64 n (Const64 [63])) (Const64 [kbar])) n) (Const64 [k])) (Const64 [k])) n) - // cond: k > 0 && k < 63 && kbar == 64 - k - // result: (Neq64 (And64 n (Const64 [int64(1< [0])) - for { - n := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh64x64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh64x64 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAdd64 { - break - } - t := v_0_0_0.Type - _ = v_0_0_0.Args[1] - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpRsh64Ux64 || v_0_0_0_0.Type != t { - break - } - _ = v_0_0_0_0.Args[1] - v_0_0_0_0_0 := v_0_0_0_0.Args[0] - if v_0_0_0_0_0.Op != OpRsh64x64 || v_0_0_0_0_0.Type != t { - break - } - _ = v_0_0_0_0_0.Args[1] - if n != v_0_0_0_0_0.Args[0] { - break - } - v_0_0_0_0_0_1 := v_0_0_0_0_0.Args[1] - if v_0_0_0_0_0_1.Op != OpConst64 || v_0_0_0_0_0_1.Type != typ.UInt64 || v_0_0_0_0_0_1.AuxInt != 63 { - break - } - v_0_0_0_0_1 := v_0_0_0_0.Args[1] - if v_0_0_0_0_1.Op != OpConst64 || v_0_0_0_0_1.Type != typ.UInt64 { - break - } - kbar := v_0_0_0_0_1.AuxInt - if n != v_0_0_0.Args[1] { - break - } - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 || v_0_0_1.Type != typ.UInt64 { - break - } - k := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.Type != typ.UInt64 || v_0_1.AuxInt != k || !(k > 0 && k < 63 && kbar == 64-k) { - break - } - v.reset(OpNeq64) - v0 := b.NewValue0(v.Pos, OpAnd64, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst64, t) - v1.AuxInt = int64(1< x (Const64 [y])) (Const64 [y])) - // cond: isPowerOfTwo(y) - // result: (Eq64 (And64 x (Const64 [y])) (Const64 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd64 { - break - } - t := v_0.Type - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.Type != t { - break - } - y := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.Type != t || v_1.AuxInt != y || !(isPowerOfTwo(y)) { - break - } - v.reset(OpEq64) - v0 := b.NewValue0(v.Pos, OpAnd64, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst64, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst64, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true - } - // match: (Neq64 (And64 (Const64 [y]) x) (Const64 [y])) - // cond: isPowerOfTwo(y) - // result: (Eq64 (And64 x (Const64 [y])) (Const64 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd64 { - break - } - t := v_0.Type - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 || v_0_0.Type != t { - break - } - y := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.Type != t || v_1.AuxInt != y || !(isPowerOfTwo(y)) { - break - } - v.reset(OpEq64) - v0 := b.NewValue0(v.Pos, OpAnd64, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst64, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst64, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true - } - // match: (Neq64 (Const64 [y]) (And64 x (Const64 [y]))) - // cond: isPowerOfTwo(y) - // result: (Eq64 (And64 x (Const64 [y])) (Const64 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - t := v_0.Type - y := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAnd64 || v_1.Type != t { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != t || v_1_1.AuxInt != y || !(isPowerOfTwo(y)) { - break - } - v.reset(OpEq64) - v0 := b.NewValue0(v.Pos, OpAnd64, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst64, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst64, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true - } - // match: (Neq64 (Const64 [y]) (And64 (Const64 [y]) x)) - // cond: isPowerOfTwo(y) - // result: (Eq64 (And64 x (Const64 [y])) (Const64 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - t := v_0.Type - y := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAnd64 || v_1.Type != t { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst64 || v_1_0.Type != t || v_1_0.AuxInt != y || !(isPowerOfTwo(y)) { - break - } - v.reset(OpEq64) - v0 := b.NewValue0(v.Pos, OpAnd64, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst64, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst64, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true - } - return false -} -func rewriteValuegeneric_OpNeq64F_0(v *Value) bool { - // match: (Neq64F (Const64F [c]) (Const64F [d])) - // result: (ConstBool [b2i(auxTo64F(c) != auxTo64F(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64F { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64F { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(auxTo64F(c) != auxTo64F(d)) - return true - } - // match: (Neq64F (Const64F [d]) (Const64F [c])) - // result: (ConstBool [b2i(auxTo64F(c) != auxTo64F(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64F { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64F { - break - } - c := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(auxTo64F(c) != auxTo64F(d)) - return true - } - return false -} -func rewriteValuegeneric_OpNeq8_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Neq8 x x) - // result: (ConstBool [0]) - for { - x := v.Args[1] - if x != v.Args[0] { - break - } - v.reset(OpConstBool) - v.AuxInt = 0 - return true - } - // match: (Neq8 (Const8 [c]) (Add8 (Const8 [d]) x)) - // result: (Neq8 (Const8 [int64(int8(c-d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAdd8 { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst8 || v_1_0.Type != t { - break - } - d := v_1_0.AuxInt - v.reset(OpNeq8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c - d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Neq8 (Const8 [c]) (Add8 x (Const8 [d]))) - // result: (Neq8 (Const8 [int64(int8(c-d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAdd8 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst8 || v_1_1.Type != t { - break - } - d := v_1_1.AuxInt - v.reset(OpNeq8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c - d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Neq8 (Add8 (Const8 [d]) x) (Const8 [c])) - // result: (Neq8 (Const8 [int64(int8(c-d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd8 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst8 { - break - } - t := v_0_0.Type - d := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpNeq8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c - d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Neq8 (Add8 x (Const8 [d])) (Const8 [c])) - // result: (Neq8 (Const8 [int64(int8(c-d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd8 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst8 { - break - } - t := v_0_1.Type - d := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpNeq8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c - d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Neq8 (Const8 [c]) (Const8 [d])) - // result: (ConstBool [b2i(c != d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c != d) - return true - } - // match: (Neq8 (Const8 [d]) (Const8 [c])) - // result: (ConstBool [b2i(c != d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break - } - c := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c != d) - return true - } - // match: (Neq8 n (Lsh8x64 (Rsh8x64 (Add8 n (Rsh8Ux64 (Rsh8x64 n (Const64 [ 7])) (Const64 [kbar]))) (Const64 [k])) (Const64 [k]))) - // cond: k > 0 && k < 7 && kbar == 8 - k - // result: (Neq8 (And8 n (Const8 [int64(1< [0])) - for { - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpLsh8x64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpRsh8x64 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAdd8 { - break - } - t := v_1_0_0.Type - _ = v_1_0_0.Args[1] - if n != v_1_0_0.Args[0] { - break - } - v_1_0_0_1 := v_1_0_0.Args[1] - if v_1_0_0_1.Op != OpRsh8Ux64 || v_1_0_0_1.Type != t { - break - } - _ = v_1_0_0_1.Args[1] - v_1_0_0_1_0 := v_1_0_0_1.Args[0] - if v_1_0_0_1_0.Op != OpRsh8x64 || v_1_0_0_1_0.Type != t { - break - } - _ = v_1_0_0_1_0.Args[1] - if n != v_1_0_0_1_0.Args[0] { - break - } - v_1_0_0_1_0_1 := v_1_0_0_1_0.Args[1] - if v_1_0_0_1_0_1.Op != OpConst64 || v_1_0_0_1_0_1.Type != typ.UInt64 || v_1_0_0_1_0_1.AuxInt != 7 { - break - } - v_1_0_0_1_1 := v_1_0_0_1.Args[1] - if v_1_0_0_1_1.Op != OpConst64 || v_1_0_0_1_1.Type != typ.UInt64 { - break - } - kbar := v_1_0_0_1_1.AuxInt - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 { - break - } - k := v_1_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || v_1_1.AuxInt != k || !(k > 0 && k < 7 && kbar == 8-k) { - break - } - v.reset(OpNeq8) - v0 := b.NewValue0(v.Pos, OpAnd8, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst8, t) - v1.AuxInt = int64(1< (Rsh8Ux64 (Rsh8x64 n (Const64 [ 7])) (Const64 [kbar])) n) (Const64 [k])) (Const64 [k]))) - // cond: k > 0 && k < 7 && kbar == 8 - k - // result: (Neq8 (And8 n (Const8 [int64(1< [0])) - for { - _ = v.Args[1] - n := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpLsh8x64 { - break - } - _ = v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpRsh8x64 { - break - } - _ = v_1_0.Args[1] - v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAdd8 { - break - } - t := v_1_0_0.Type - _ = v_1_0_0.Args[1] - v_1_0_0_0 := v_1_0_0.Args[0] - if v_1_0_0_0.Op != OpRsh8Ux64 || v_1_0_0_0.Type != t { - break - } - _ = v_1_0_0_0.Args[1] - v_1_0_0_0_0 := v_1_0_0_0.Args[0] - if v_1_0_0_0_0.Op != OpRsh8x64 || v_1_0_0_0_0.Type != t { - break - } - _ = v_1_0_0_0_0.Args[1] - if n != v_1_0_0_0_0.Args[0] { - break - } - v_1_0_0_0_0_1 := v_1_0_0_0_0.Args[1] - if v_1_0_0_0_0_1.Op != OpConst64 || v_1_0_0_0_0_1.Type != typ.UInt64 || v_1_0_0_0_0_1.AuxInt != 7 { - break - } - v_1_0_0_0_1 := v_1_0_0_0.Args[1] - if v_1_0_0_0_1.Op != OpConst64 || v_1_0_0_0_1.Type != typ.UInt64 { - break - } - kbar := v_1_0_0_0_1.AuxInt - if n != v_1_0_0.Args[1] { - break - } - v_1_0_1 := v_1_0.Args[1] - if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 { - break - } - k := v_1_0_1.AuxInt - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || v_1_1.AuxInt != k || !(k > 0 && k < 7 && kbar == 8-k) { - break - } - v.reset(OpNeq8) - v0 := b.NewValue0(v.Pos, OpAnd8, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst8, t) - v1.AuxInt = int64(1< n (Rsh8Ux64 (Rsh8x64 n (Const64 [ 7])) (Const64 [kbar]))) (Const64 [k])) (Const64 [k])) n) - // cond: k > 0 && k < 7 && kbar == 8 - k - // result: (Neq8 (And8 n (Const8 [int64(1< [0])) - for { - n := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh8x64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh8x64 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAdd8 { - break - } - t := v_0_0_0.Type - _ = v_0_0_0.Args[1] - if n != v_0_0_0.Args[0] { - break - } - v_0_0_0_1 := v_0_0_0.Args[1] - if v_0_0_0_1.Op != OpRsh8Ux64 || v_0_0_0_1.Type != t { - break - } - _ = v_0_0_0_1.Args[1] - v_0_0_0_1_0 := v_0_0_0_1.Args[0] - if v_0_0_0_1_0.Op != OpRsh8x64 || v_0_0_0_1_0.Type != t { - break - } - _ = v_0_0_0_1_0.Args[1] - if n != v_0_0_0_1_0.Args[0] { - break - } - v_0_0_0_1_0_1 := v_0_0_0_1_0.Args[1] - if v_0_0_0_1_0_1.Op != OpConst64 || v_0_0_0_1_0_1.Type != typ.UInt64 || v_0_0_0_1_0_1.AuxInt != 7 { - break - } - v_0_0_0_1_1 := v_0_0_0_1.Args[1] - if v_0_0_0_1_1.Op != OpConst64 || v_0_0_0_1_1.Type != typ.UInt64 { - break - } - kbar := v_0_0_0_1_1.AuxInt - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 || v_0_0_1.Type != typ.UInt64 { - break - } - k := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.Type != typ.UInt64 || v_0_1.AuxInt != k || !(k > 0 && k < 7 && kbar == 8-k) { - break - } - v.reset(OpNeq8) - v0 := b.NewValue0(v.Pos, OpAnd8, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst8, t) - v1.AuxInt = int64(1< (Rsh8Ux64 (Rsh8x64 n (Const64 [ 7])) (Const64 [kbar])) n) (Const64 [k])) (Const64 [k])) n) - // cond: k > 0 && k < 7 && kbar == 8 - k - // result: (Neq8 (And8 n (Const8 [int64(1< [0])) - for { - n := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh8x64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh8x64 { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAdd8 { - break - } - t := v_0_0_0.Type - _ = v_0_0_0.Args[1] - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpRsh8Ux64 || v_0_0_0_0.Type != t { - break - } - _ = v_0_0_0_0.Args[1] - v_0_0_0_0_0 := v_0_0_0_0.Args[0] - if v_0_0_0_0_0.Op != OpRsh8x64 || v_0_0_0_0_0.Type != t { - break - } - _ = v_0_0_0_0_0.Args[1] - if n != v_0_0_0_0_0.Args[0] { - break - } - v_0_0_0_0_0_1 := v_0_0_0_0_0.Args[1] - if v_0_0_0_0_0_1.Op != OpConst64 || v_0_0_0_0_0_1.Type != typ.UInt64 || v_0_0_0_0_0_1.AuxInt != 7 { - break - } - v_0_0_0_0_1 := v_0_0_0_0.Args[1] - if v_0_0_0_0_1.Op != OpConst64 || v_0_0_0_0_1.Type != typ.UInt64 { - break - } - kbar := v_0_0_0_0_1.AuxInt - if n != v_0_0_0.Args[1] { - break - } - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 || v_0_0_1.Type != typ.UInt64 { - break - } - k := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.Type != typ.UInt64 || v_0_1.AuxInt != k || !(k > 0 && k < 7 && kbar == 8-k) { - break - } - v.reset(OpNeq8) - v0 := b.NewValue0(v.Pos, OpAnd8, t) - v0.AddArg(n) - v1 := b.NewValue0(v.Pos, OpConst8, t) - v1.AuxInt = int64(1< x (Const8 [y])) (Const8 [y])) - // cond: isPowerOfTwo(y) - // result: (Eq8 (And8 x (Const8 [y])) (Const8 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd8 { - break - } - t := v_0.Type - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst8 || v_0_1.Type != t { - break - } - y := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.Type != t || v_1.AuxInt != y || !(isPowerOfTwo(y)) { - break - } - v.reset(OpEq8) - v0 := b.NewValue0(v.Pos, OpAnd8, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst8, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst8, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true - } - // match: (Neq8 (And8 (Const8 [y]) x) (Const8 [y])) - // cond: isPowerOfTwo(y) - // result: (Eq8 (And8 x (Const8 [y])) (Const8 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd8 { - break - } - t := v_0.Type - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst8 || v_0_0.Type != t { - break - } - y := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.Type != t || v_1.AuxInt != y || !(isPowerOfTwo(y)) { - break - } - v.reset(OpEq8) - v0 := b.NewValue0(v.Pos, OpAnd8, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst8, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst8, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true - } - // match: (Neq8 (Const8 [y]) (And8 x (Const8 [y]))) - // cond: isPowerOfTwo(y) - // result: (Eq8 (And8 x (Const8 [y])) (Const8 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - t := v_0.Type - y := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAnd8 || v_1.Type != t { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst8 || v_1_1.Type != t || v_1_1.AuxInt != y || !(isPowerOfTwo(y)) { - break - } - v.reset(OpEq8) - v0 := b.NewValue0(v.Pos, OpAnd8, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst8, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst8, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true - } - // match: (Neq8 (Const8 [y]) (And8 (Const8 [y]) x)) - // cond: isPowerOfTwo(y) - // result: (Eq8 (And8 x (Const8 [y])) (Const8 [0])) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - t := v_0.Type - y := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAnd8 || v_1.Type != t { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst8 || v_1_0.Type != t || v_1_0.AuxInt != y || !(isPowerOfTwo(y)) { - break - } - v.reset(OpEq8) - v0 := b.NewValue0(v.Pos, OpAnd8, t) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpConst8, t) - v1.AuxInt = y - v0.AddArg(v1) - v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpConst8, t) - v2.AuxInt = 0 - v.AddArg(v2) - return true - } - return false -} -func rewriteValuegeneric_OpNeqB_0(v *Value) bool { - // match: (NeqB (ConstBool [c]) (ConstBool [d])) - // result: (ConstBool [b2i(c != d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConstBool { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConstBool { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c != d) - return true - } - // match: (NeqB (ConstBool [d]) (ConstBool [c])) - // result: (ConstBool [b2i(c != d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConstBool { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConstBool { - break - } - c := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c != d) - return true - } - // match: (NeqB (ConstBool [0]) x) - // result: x - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConstBool || v_0.AuxInt != 0 { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (NeqB x (ConstBool [0])) - // result: x - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConstBool || v_1.AuxInt != 0 { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (NeqB (ConstBool [1]) x) - // result: (Not x) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConstBool || v_0.AuxInt != 1 { - break - } - v.reset(OpNot) - v.AddArg(x) - return true - } - // match: (NeqB x (ConstBool [1])) - // result: (Not x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConstBool || v_1.AuxInt != 1 { - break - } - v.reset(OpNot) - v.AddArg(x) - return true - } - // match: (NeqB (Not x) (Not y)) - // result: (NeqB x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpNot { - break - } - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpNot { - break - } - y := v_1.Args[0] - v.reset(OpNeqB) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (NeqB (Not y) (Not x)) - // result: (NeqB x y) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpNot { - break - } - y := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpNot { - break - } - x := v_1.Args[0] - v.reset(OpNeqB) - v.AddArg(x) - v.AddArg(y) - return true - } - return false -} -func rewriteValuegeneric_OpNeqInter_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (NeqInter x y) - // result: (NeqPtr (ITab x) (ITab y)) - for { - y := v.Args[1] - x := v.Args[0] - v.reset(OpNeqPtr) - v0 := b.NewValue0(v.Pos, OpITab, typ.Uintptr) - v0.AddArg(x) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpITab, typ.Uintptr) - v1.AddArg(y) - v.AddArg(v1) - return true - } -} -func rewriteValuegeneric_OpNeqPtr_0(v *Value) bool { - // match: (NeqPtr x x) - // result: (ConstBool [0]) - for { - x := v.Args[1] - if x != v.Args[0] { - break - } - v.reset(OpConstBool) - v.AuxInt = 0 - return true - } - // match: (NeqPtr (Addr {a} _) (Addr {b} _)) - // result: (ConstBool [b2i(a != b)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAddr { - break - } - a := v_0.Aux - v_1 := v.Args[1] - if v_1.Op != OpAddr { - break - } - b := v_1.Aux - v.reset(OpConstBool) - v.AuxInt = b2i(a != b) - return true - } - // match: (NeqPtr (Addr {b} _) (Addr {a} _)) - // result: (ConstBool [b2i(a != b)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAddr { - break - } - b := v_0.Aux - v_1 := v.Args[1] - if v_1.Op != OpAddr { - break - } - a := v_1.Aux - v.reset(OpConstBool) - v.AuxInt = b2i(a != b) - return true - } - // match: (NeqPtr (Addr {a} _) (OffPtr [o] (Addr {b} _))) - // result: (ConstBool [b2i(a != b || o != 0)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAddr { - break - } - a := v_0.Aux - v_1 := v.Args[1] - if v_1.Op != OpOffPtr { - break - } - o := v_1.AuxInt - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAddr { - break - } - b := v_1_0.Aux - v.reset(OpConstBool) - v.AuxInt = b2i(a != b || o != 0) - return true - } - // match: (NeqPtr (OffPtr [o] (Addr {b} _)) (Addr {a} _)) - // result: (ConstBool [b2i(a != b || o != 0)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - o := v_0.AuxInt - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAddr { - break - } - b := v_0_0.Aux - v_1 := v.Args[1] - if v_1.Op != OpAddr { - break - } - a := v_1.Aux - v.reset(OpConstBool) - v.AuxInt = b2i(a != b || o != 0) - return true - } - // match: (NeqPtr (OffPtr [o1] (Addr {a} _)) (OffPtr [o2] (Addr {b} _))) - // result: (ConstBool [b2i(a != b || o1 != o2)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - o1 := v_0.AuxInt - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAddr { - break - } - a := v_0_0.Aux - v_1 := v.Args[1] - if v_1.Op != OpOffPtr { - break - } - o2 := v_1.AuxInt - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAddr { - break - } - b := v_1_0.Aux - v.reset(OpConstBool) - v.AuxInt = b2i(a != b || o1 != o2) - return true - } - // match: (NeqPtr (OffPtr [o2] (Addr {b} _)) (OffPtr [o1] (Addr {a} _))) - // result: (ConstBool [b2i(a != b || o1 != o2)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - o2 := v_0.AuxInt - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAddr { - break - } - b := v_0_0.Aux - v_1 := v.Args[1] - if v_1.Op != OpOffPtr { - break - } - o1 := v_1.AuxInt - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAddr { - break - } - a := v_1_0.Aux - v.reset(OpConstBool) - v.AuxInt = b2i(a != b || o1 != o2) - return true - } - // match: (NeqPtr (LocalAddr {a} _ _) (LocalAddr {b} _ _)) - // result: (ConstBool [b2i(a != b)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLocalAddr { - break - } - a := v_0.Aux - _ = v_0.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpLocalAddr { - break - } - b := v_1.Aux - _ = v_1.Args[1] - v.reset(OpConstBool) - v.AuxInt = b2i(a != b) - return true - } - // match: (NeqPtr (LocalAddr {b} _ _) (LocalAddr {a} _ _)) - // result: (ConstBool [b2i(a != b)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLocalAddr { - break - } - b := v_0.Aux - _ = v_0.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpLocalAddr { - break - } - a := v_1.Aux - _ = v_1.Args[1] - v.reset(OpConstBool) - v.AuxInt = b2i(a != b) - return true - } - // match: (NeqPtr (LocalAddr {a} _ _) (OffPtr [o] (LocalAddr {b} _ _))) - // result: (ConstBool [b2i(a != b || o != 0)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLocalAddr { - break - } - a := v_0.Aux - _ = v_0.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpOffPtr { - break - } - o := v_1.AuxInt - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpLocalAddr { - break - } - b := v_1_0.Aux - _ = v_1_0.Args[1] - v.reset(OpConstBool) - v.AuxInt = b2i(a != b || o != 0) - return true - } - return false -} -func rewriteValuegeneric_OpNeqPtr_10(v *Value) bool { - // match: (NeqPtr (OffPtr [o] (LocalAddr {b} _ _)) (LocalAddr {a} _ _)) - // result: (ConstBool [b2i(a != b || o != 0)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - o := v_0.AuxInt - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpLocalAddr { - break - } - b := v_0_0.Aux - _ = v_0_0.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpLocalAddr { - break - } - a := v_1.Aux - _ = v_1.Args[1] - v.reset(OpConstBool) - v.AuxInt = b2i(a != b || o != 0) - return true - } - // match: (NeqPtr (OffPtr [o1] (LocalAddr {a} _ _)) (OffPtr [o2] (LocalAddr {b} _ _))) - // result: (ConstBool [b2i(a != b || o1 != o2)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - o1 := v_0.AuxInt - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpLocalAddr { - break - } - a := v_0_0.Aux - _ = v_0_0.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpOffPtr { - break - } - o2 := v_1.AuxInt - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpLocalAddr { - break - } - b := v_1_0.Aux - _ = v_1_0.Args[1] - v.reset(OpConstBool) - v.AuxInt = b2i(a != b || o1 != o2) - return true - } - // match: (NeqPtr (OffPtr [o2] (LocalAddr {b} _ _)) (OffPtr [o1] (LocalAddr {a} _ _))) - // result: (ConstBool [b2i(a != b || o1 != o2)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - o2 := v_0.AuxInt - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpLocalAddr { - break - } - b := v_0_0.Aux - _ = v_0_0.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpOffPtr { - break - } - o1 := v_1.AuxInt - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpLocalAddr { - break - } - a := v_1_0.Aux - _ = v_1_0.Args[1] - v.reset(OpConstBool) - v.AuxInt = b2i(a != b || o1 != o2) - return true - } - // match: (NeqPtr (OffPtr [o1] p1) p2) - // cond: isSamePtr(p1, p2) - // result: (ConstBool [b2i(o1 != 0)]) - for { - p2 := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - o1 := v_0.AuxInt - p1 := v_0.Args[0] - if !(isSamePtr(p1, p2)) { - break - } - v.reset(OpConstBool) - v.AuxInt = b2i(o1 != 0) - return true - } - // match: (NeqPtr p2 (OffPtr [o1] p1)) - // cond: isSamePtr(p1, p2) - // result: (ConstBool [b2i(o1 != 0)]) - for { - _ = v.Args[1] - p2 := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpOffPtr { - break - } - o1 := v_1.AuxInt - p1 := v_1.Args[0] - if !(isSamePtr(p1, p2)) { - break - } - v.reset(OpConstBool) - v.AuxInt = b2i(o1 != 0) - return true - } - // match: (NeqPtr (OffPtr [o1] p1) (OffPtr [o2] p2)) - // cond: isSamePtr(p1, p2) - // result: (ConstBool [b2i(o1 != o2)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - o1 := v_0.AuxInt - p1 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpOffPtr { - break - } - o2 := v_1.AuxInt - p2 := v_1.Args[0] - if !(isSamePtr(p1, p2)) { - break - } - v.reset(OpConstBool) - v.AuxInt = b2i(o1 != o2) - return true - } - // match: (NeqPtr (OffPtr [o2] p2) (OffPtr [o1] p1)) - // cond: isSamePtr(p1, p2) - // result: (ConstBool [b2i(o1 != o2)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - o2 := v_0.AuxInt - p2 := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpOffPtr { - break - } - o1 := v_1.AuxInt - p1 := v_1.Args[0] - if !(isSamePtr(p1, p2)) { - break - } - v.reset(OpConstBool) - v.AuxInt = b2i(o1 != o2) - return true - } - // match: (NeqPtr (Const32 [c]) (Const32 [d])) - // result: (ConstBool [b2i(c != d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c != d) - return true - } - // match: (NeqPtr (Const32 [d]) (Const32 [c])) - // result: (ConstBool [b2i(c != d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - c := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c != d) - return true - } - // match: (NeqPtr (Const64 [c]) (Const64 [d])) - // result: (ConstBool [b2i(c != d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c != d) - return true - } - return false -} -func rewriteValuegeneric_OpNeqPtr_20(v *Value) bool { - // match: (NeqPtr (Const64 [d]) (Const64 [c])) - // result: (ConstBool [b2i(c != d)]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c := v_1.AuxInt - v.reset(OpConstBool) - v.AuxInt = b2i(c != d) - return true - } - // match: (NeqPtr (LocalAddr _ _) (Addr _)) - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLocalAddr { - break - } - _ = v_0.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpAddr { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (NeqPtr (Addr _) (LocalAddr _ _)) - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAddr { - break - } - v_1 := v.Args[1] - if v_1.Op != OpLocalAddr { - break - } - _ = v_1.Args[1] - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (NeqPtr (OffPtr (LocalAddr _ _)) (Addr _)) - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpLocalAddr { - break - } - _ = v_0_0.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpAddr { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (NeqPtr (Addr _) (OffPtr (LocalAddr _ _))) - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAddr { - break - } - v_1 := v.Args[1] - if v_1.Op != OpOffPtr { - break - } - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpLocalAddr { - break - } - _ = v_1_0.Args[1] - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (NeqPtr (LocalAddr _ _) (OffPtr (Addr _))) - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLocalAddr { - break - } - _ = v_0.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpOffPtr { - break - } - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAddr { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (NeqPtr (OffPtr (Addr _)) (LocalAddr _ _)) - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAddr { - break - } - v_1 := v.Args[1] - if v_1.Op != OpLocalAddr { - break - } - _ = v_1.Args[1] - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (NeqPtr (OffPtr (LocalAddr _ _)) (OffPtr (Addr _))) - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpLocalAddr { - break - } - _ = v_0_0.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpOffPtr { - break - } - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpAddr { - break - } - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (NeqPtr (OffPtr (Addr _)) (OffPtr (LocalAddr _ _))) - // result: (ConstBool [1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAddr { - break - } - v_1 := v.Args[1] - if v_1.Op != OpOffPtr { - break - } - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpLocalAddr { - break - } - _ = v_1_0.Args[1] - v.reset(OpConstBool) - v.AuxInt = 1 - return true - } - // match: (NeqPtr (AddPtr p1 o1) p2) - // cond: isSamePtr(p1, p2) - // result: (IsNonNil o1) - for { - p2 := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAddPtr { - break - } - o1 := v_0.Args[1] - p1 := v_0.Args[0] - if !(isSamePtr(p1, p2)) { - break - } - v.reset(OpIsNonNil) - v.AddArg(o1) - return true - } - return false -} -func rewriteValuegeneric_OpNeqPtr_30(v *Value) bool { - // match: (NeqPtr p2 (AddPtr p1 o1)) - // cond: isSamePtr(p1, p2) - // result: (IsNonNil o1) - for { - _ = v.Args[1] - p2 := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpAddPtr { - break - } - o1 := v_1.Args[1] - p1 := v_1.Args[0] - if !(isSamePtr(p1, p2)) { - break - } - v.reset(OpIsNonNil) - v.AddArg(o1) - return true - } - // match: (NeqPtr (Const32 [0]) p) - // result: (IsNonNil p) - for { - p := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 || v_0.AuxInt != 0 { - break - } - v.reset(OpIsNonNil) - v.AddArg(p) - return true - } - // match: (NeqPtr p (Const32 [0])) - // result: (IsNonNil p) - for { - _ = v.Args[1] - p := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.AuxInt != 0 { - break - } - v.reset(OpIsNonNil) - v.AddArg(p) - return true - } - // match: (NeqPtr (Const64 [0]) p) - // result: (IsNonNil p) - for { - p := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 || v_0.AuxInt != 0 { - break - } - v.reset(OpIsNonNil) - v.AddArg(p) - return true - } - // match: (NeqPtr p (Const64 [0])) - // result: (IsNonNil p) - for { - _ = v.Args[1] - p := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 0 { - break - } - v.reset(OpIsNonNil) - v.AddArg(p) - return true - } - // match: (NeqPtr (ConstNil) p) - // result: (IsNonNil p) - for { - p := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConstNil { - break - } - v.reset(OpIsNonNil) - v.AddArg(p) - return true - } - // match: (NeqPtr p (ConstNil)) - // result: (IsNonNil p) - for { - _ = v.Args[1] - p := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConstNil { - break - } - v.reset(OpIsNonNil) - v.AddArg(p) - return true - } - return false -} -func rewriteValuegeneric_OpNeqSlice_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (NeqSlice x y) - // result: (NeqPtr (SlicePtr x) (SlicePtr y)) - for { - y := v.Args[1] - x := v.Args[0] - v.reset(OpNeqPtr) - v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) - v0.AddArg(x) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) - v1.AddArg(y) - v.AddArg(v1) - return true - } -} -func rewriteValuegeneric_OpNilCheck_0(v *Value) bool { - b := v.Block - config := b.Func.Config - fe := b.Func.fe - // match: (NilCheck (GetG mem) mem) - // result: mem - for { - mem := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpGetG || mem != v_0.Args[0] { - break - } - v.reset(OpCopy) - v.Type = mem.Type - v.AddArg(mem) - return true - } - // match: (NilCheck (Load (OffPtr [c] (SP)) (StaticCall {sym} _)) _) - // cond: isSameSym(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize && warnRule(fe.Debug_checknil(), v, "removed nil check") - // result: (Invalid) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLoad { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpOffPtr { - break - } - c := v_0_0.AuxInt - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpSP { - break - } - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpStaticCall { - break - } - sym := v_0_1.Aux - if !(isSameSym(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize && warnRule(fe.Debug_checknil(), v, "removed nil check")) { - break - } - v.reset(OpInvalid) - return true - } - // match: (NilCheck (OffPtr (Load (OffPtr [c] (SP)) (StaticCall {sym} _))) _) - // cond: isSameSym(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize && warnRule(fe.Debug_checknil(), v, "removed nil check") - // result: (Invalid) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpLoad { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpOffPtr { - break - } - c := v_0_0_0.AuxInt - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpSP { - break - } - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpStaticCall { - break - } - sym := v_0_0_1.Aux - if !(isSameSym(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize && warnRule(fe.Debug_checknil(), v, "removed nil check")) { - break - } - v.reset(OpInvalid) - return true - } - return false -} -func rewriteValuegeneric_OpNot_0(v *Value) bool { - // match: (Not (ConstBool [c])) - // result: (ConstBool [1-c]) - for { - v_0 := v.Args[0] - if v_0.Op != OpConstBool { - break - } - c := v_0.AuxInt - v.reset(OpConstBool) - v.AuxInt = 1 - c - return true - } - // match: (Not (Eq64 x y)) - // result: (Neq64 x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpEq64 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpNeq64) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Eq32 x y)) - // result: (Neq32 x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpEq32 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpNeq32) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Eq16 x y)) - // result: (Neq16 x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpEq16 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpNeq16) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Eq8 x y)) - // result: (Neq8 x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpEq8 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpNeq8) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (EqB x y)) - // result: (NeqB x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpEqB { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpNeqB) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (EqPtr x y)) - // result: (NeqPtr x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpEqPtr { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpNeqPtr) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Eq64F x y)) - // result: (Neq64F x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpEq64F { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpNeq64F) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Eq32F x y)) - // result: (Neq32F x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpEq32F { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpNeq32F) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Neq64 x y)) - // result: (Eq64 x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpNeq64 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpEq64) - v.AddArg(x) - v.AddArg(y) - return true - } - return false -} -func rewriteValuegeneric_OpNot_10(v *Value) bool { - // match: (Not (Neq32 x y)) - // result: (Eq32 x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpNeq32 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpEq32) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Neq16 x y)) - // result: (Eq16 x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpNeq16 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpEq16) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Neq8 x y)) - // result: (Eq8 x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpNeq8 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpEq8) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (NeqB x y)) - // result: (EqB x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpNeqB { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpEqB) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (NeqPtr x y)) - // result: (EqPtr x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpNeqPtr { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpEqPtr) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Neq64F x y)) - // result: (Eq64F x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpNeq64F { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpEq64F) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Neq32F x y)) - // result: (Eq32F x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpNeq32F { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpEq32F) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Greater64 x y)) - // result: (Leq64 x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpGreater64 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpLeq64) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Greater32 x y)) - // result: (Leq32 x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpGreater32 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpLeq32) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Greater16 x y)) - // result: (Leq16 x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpGreater16 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpLeq16) - v.AddArg(x) - v.AddArg(y) - return true - } - return false -} -func rewriteValuegeneric_OpNot_20(v *Value) bool { - // match: (Not (Greater8 x y)) - // result: (Leq8 x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpGreater8 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpLeq8) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Greater64U x y)) - // result: (Leq64U x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpGreater64U { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpLeq64U) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Greater32U x y)) - // result: (Leq32U x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpGreater32U { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpLeq32U) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Greater16U x y)) - // result: (Leq16U x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpGreater16U { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpLeq16U) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Greater8U x y)) - // result: (Leq8U x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpGreater8U { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpLeq8U) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Geq64 x y)) - // result: (Less64 x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpGeq64 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpLess64) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Geq32 x y)) - // result: (Less32 x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpGeq32 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpLess32) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Geq16 x y)) - // result: (Less16 x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpGeq16 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpLess16) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Geq8 x y)) - // result: (Less8 x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpGeq8 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpLess8) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Geq64U x y)) - // result: (Less64U x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpGeq64U { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpLess64U) - v.AddArg(x) - v.AddArg(y) - return true - } - return false -} -func rewriteValuegeneric_OpNot_30(v *Value) bool { - // match: (Not (Geq32U x y)) - // result: (Less32U x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpGeq32U { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpLess32U) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Geq16U x y)) - // result: (Less16U x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpGeq16U { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpLess16U) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Geq8U x y)) - // result: (Less8U x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpGeq8U { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpLess8U) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Less64 x y)) - // result: (Geq64 x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpLess64 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpGeq64) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Less32 x y)) - // result: (Geq32 x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpLess32 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpGeq32) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Less16 x y)) - // result: (Geq16 x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpLess16 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpGeq16) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Less8 x y)) - // result: (Geq8 x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpLess8 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpGeq8) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Less64U x y)) - // result: (Geq64U x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpLess64U { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpGeq64U) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Less32U x y)) - // result: (Geq32U x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpLess32U { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpGeq32U) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Less16U x y)) - // result: (Geq16U x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpLess16U { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpGeq16U) - v.AddArg(x) - v.AddArg(y) - return true - } - return false -} -func rewriteValuegeneric_OpNot_40(v *Value) bool { - // match: (Not (Less8U x y)) - // result: (Geq8U x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpLess8U { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpGeq8U) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Leq64 x y)) - // result: (Greater64 x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpLeq64 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpGreater64) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Leq32 x y)) - // result: (Greater32 x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpLeq32 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpGreater32) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Leq16 x y)) - // result: (Greater16 x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpLeq16 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpGreater16) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Leq8 x y)) - // result: (Greater8 x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpLeq8 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpGreater8) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Leq64U x y)) - // result: (Greater64U x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpLeq64U { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpGreater64U) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Leq32U x y)) - // result: (Greater32U x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpLeq32U { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpGreater32U) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Leq16U x y)) - // result: (Greater16U x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpLeq16U { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpGreater16U) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Not (Leq8U x y)) - // result: (Greater8U x y) - for { - v_0 := v.Args[0] - if v_0.Op != OpLeq8U { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v.reset(OpGreater8U) - v.AddArg(x) - v.AddArg(y) - return true - } - return false -} -func rewriteValuegeneric_OpOffPtr_0(v *Value) bool { - // match: (OffPtr (OffPtr p [b]) [a]) - // result: (OffPtr p [a+b]) - for { - a := v.AuxInt - v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - b := v_0.AuxInt - p := v_0.Args[0] - v.reset(OpOffPtr) - v.AuxInt = a + b - v.AddArg(p) - return true - } - // match: (OffPtr p [0]) - // cond: v.Type.Compare(p.Type) == types.CMPeq - // result: p - for { - if v.AuxInt != 0 { - break - } - p := v.Args[0] - if !(v.Type.Compare(p.Type) == types.CMPeq) { - break - } - v.reset(OpCopy) - v.Type = p.Type - v.AddArg(p) - return true - } - return false -} -func rewriteValuegeneric_OpOr16_0(v *Value) bool { - // match: (Or16 (Const16 [c]) (Const16 [d])) - // result: (Const16 [int64(int16(c|d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - d := v_1.AuxInt - v.reset(OpConst16) - v.AuxInt = int64(int16(c | d)) - return true - } - // match: (Or16 (Const16 [d]) (Const16 [c])) - // result: (Const16 [int64(int16(c|d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - c := v_1.AuxInt - v.reset(OpConst16) - v.AuxInt = int64(int16(c | d)) - return true - } - // match: (Or16 x x) - // result: x - for { - x := v.Args[1] - if x != v.Args[0] { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Or16 (Const16 [0]) x) - // result: x - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 || v_0.AuxInt != 0 { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Or16 x (Const16 [0])) - // result: x - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.AuxInt != 0 { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Or16 (Const16 [-1]) _) - // result: (Const16 [-1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 || v_0.AuxInt != -1 { - break - } - v.reset(OpConst16) - v.AuxInt = -1 - return true - } - // match: (Or16 _ (Const16 [-1])) - // result: (Const16 [-1]) - for { - _ = v.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.AuxInt != -1 { - break - } - v.reset(OpConst16) - v.AuxInt = -1 - return true - } - // match: (Or16 x (Or16 x y)) - // result: (Or16 x y) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpOr16 { - break - } - y := v_1.Args[1] - if x != v_1.Args[0] { - break - } - v.reset(OpOr16) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Or16 x (Or16 y x)) - // result: (Or16 x y) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpOr16 { - break - } - _ = v_1.Args[1] - y := v_1.Args[0] - if x != v_1.Args[1] { - break - } - v.reset(OpOr16) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Or16 (Or16 x y) x) - // result: (Or16 x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOr16 { - break - } - y := v_0.Args[1] - if x != v_0.Args[0] { - break - } - v.reset(OpOr16) - v.AddArg(x) - v.AddArg(y) - return true - } - return false -} -func rewriteValuegeneric_OpOr16_10(v *Value) bool { - b := v.Block - // match: (Or16 (Or16 y x) x) - // result: (Or16 x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOr16 { - break - } - _ = v_0.Args[1] - y := v_0.Args[0] - if x != v_0.Args[1] { - break - } - v.reset(OpOr16) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Or16 (And16 x (Const16 [c2])) (Const16 [c1])) - // cond: ^(c1 | c2) == 0 - // result: (Or16 (Const16 [c1]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd16 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst16 { - break - } - c2 := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - t := v_1.Type - c1 := v_1.AuxInt - if !(^(c1 | c2) == 0) { - break - } - v.reset(OpOr16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = c1 - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Or16 (And16 (Const16 [c2]) x) (Const16 [c1])) - // cond: ^(c1 | c2) == 0 - // result: (Or16 (Const16 [c1]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd16 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst16 { - break - } - c2 := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - t := v_1.Type - c1 := v_1.AuxInt - if !(^(c1 | c2) == 0) { - break - } - v.reset(OpOr16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = c1 - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Or16 (Const16 [c1]) (And16 x (Const16 [c2]))) - // cond: ^(c1 | c2) == 0 - // result: (Or16 (Const16 [c1]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - t := v_0.Type - c1 := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAnd16 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst16 { - break - } - c2 := v_1_1.AuxInt - if !(^(c1 | c2) == 0) { - break - } - v.reset(OpOr16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = c1 - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Or16 (Const16 [c1]) (And16 (Const16 [c2]) x)) - // cond: ^(c1 | c2) == 0 - // result: (Or16 (Const16 [c1]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - t := v_0.Type - c1 := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAnd16 { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst16 { - break - } - c2 := v_1_0.AuxInt - if !(^(c1 | c2) == 0) { - break - } - v.reset(OpOr16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = c1 - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Or16 (Or16 i:(Const16 ) z) x) - // cond: (z.Op != OpConst16 && x.Op != OpConst16) - // result: (Or16 i (Or16 z x)) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOr16 { - break - } - z := v_0.Args[1] - i := v_0.Args[0] - if i.Op != OpConst16 { - break - } - t := i.Type - if !(z.Op != OpConst16 && x.Op != OpConst16) { - break - } - v.reset(OpOr16) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpOr16, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (Or16 (Or16 z i:(Const16 )) x) - // cond: (z.Op != OpConst16 && x.Op != OpConst16) - // result: (Or16 i (Or16 z x)) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOr16 { - break - } - _ = v_0.Args[1] - z := v_0.Args[0] - i := v_0.Args[1] - if i.Op != OpConst16 { - break - } - t := i.Type - if !(z.Op != OpConst16 && x.Op != OpConst16) { - break - } - v.reset(OpOr16) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpOr16, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (Or16 x (Or16 i:(Const16 ) z)) - // cond: (z.Op != OpConst16 && x.Op != OpConst16) - // result: (Or16 i (Or16 z x)) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpOr16 { - break - } - z := v_1.Args[1] - i := v_1.Args[0] - if i.Op != OpConst16 { - break - } - t := i.Type - if !(z.Op != OpConst16 && x.Op != OpConst16) { - break - } - v.reset(OpOr16) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpOr16, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (Or16 x (Or16 z i:(Const16 ))) - // cond: (z.Op != OpConst16 && x.Op != OpConst16) - // result: (Or16 i (Or16 z x)) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpOr16 { - break - } - _ = v_1.Args[1] - z := v_1.Args[0] - i := v_1.Args[1] - if i.Op != OpConst16 { - break - } - t := i.Type - if !(z.Op != OpConst16 && x.Op != OpConst16) { - break - } - v.reset(OpOr16) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpOr16, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (Or16 (Const16 [c]) (Or16 (Const16 [d]) x)) - // result: (Or16 (Const16 [int64(int16(c|d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpOr16 { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst16 || v_1_0.Type != t { - break - } - d := v_1_0.AuxInt - v.reset(OpOr16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c | d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - return false -} -func rewriteValuegeneric_OpOr16_20(v *Value) bool { - b := v.Block - // match: (Or16 (Const16 [c]) (Or16 x (Const16 [d]))) - // result: (Or16 (Const16 [int64(int16(c|d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpOr16 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst16 || v_1_1.Type != t { - break - } - d := v_1_1.AuxInt - v.reset(OpOr16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c | d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Or16 (Or16 (Const16 [d]) x) (Const16 [c])) - // result: (Or16 (Const16 [int64(int16(c|d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOr16 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst16 { - break - } - t := v_0_0.Type - d := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpOr16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c | d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Or16 (Or16 x (Const16 [d])) (Const16 [c])) - // result: (Or16 (Const16 [int64(int16(c|d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOr16 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst16 { - break - } - t := v_0_1.Type - d := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpOr16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c | d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - return false -} -func rewriteValuegeneric_OpOr32_0(v *Value) bool { - // match: (Or32 (Const32 [c]) (Const32 [d])) - // result: (Const32 [int64(int32(c|d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - d := v_1.AuxInt - v.reset(OpConst32) - v.AuxInt = int64(int32(c | d)) - return true - } - // match: (Or32 (Const32 [d]) (Const32 [c])) - // result: (Const32 [int64(int32(c|d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - c := v_1.AuxInt - v.reset(OpConst32) - v.AuxInt = int64(int32(c | d)) - return true - } - // match: (Or32 x x) - // result: x - for { - x := v.Args[1] - if x != v.Args[0] { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Or32 (Const32 [0]) x) - // result: x - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 || v_0.AuxInt != 0 { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Or32 x (Const32 [0])) - // result: x - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.AuxInt != 0 { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Or32 (Const32 [-1]) _) - // result: (Const32 [-1]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 || v_0.AuxInt != -1 { - break - } - v.reset(OpConst32) - v.AuxInt = -1 - return true - } - // match: (Or32 _ (Const32 [-1])) - // result: (Const32 [-1]) - for { - _ = v.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.AuxInt != -1 { - break - } - v.reset(OpConst32) - v.AuxInt = -1 - return true - } - // match: (Or32 x (Or32 x y)) - // result: (Or32 x y) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpOr32 { - break - } - y := v_1.Args[1] - if x != v_1.Args[0] { - break - } - v.reset(OpOr32) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Or32 x (Or32 y x)) - // result: (Or32 x y) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpOr32 { - break - } - _ = v_1.Args[1] - y := v_1.Args[0] - if x != v_1.Args[1] { - break - } - v.reset(OpOr32) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Or32 (Or32 x y) x) - // result: (Or32 x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOr32 { - break - } - y := v_0.Args[1] - if x != v_0.Args[0] { - break - } - v.reset(OpOr32) - v.AddArg(x) - v.AddArg(y) - return true - } - return false -} -func rewriteValuegeneric_OpOr32_10(v *Value) bool { - b := v.Block - // match: (Or32 (Or32 y x) x) - // result: (Or32 x y) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOr32 { - break - } - _ = v_0.Args[1] - y := v_0.Args[0] - if x != v_0.Args[1] { - break - } - v.reset(OpOr32) - v.AddArg(x) - v.AddArg(y) - return true - } - // match: (Or32 (And32 x (Const32 [c2])) (Const32 [c1])) - // cond: ^(c1 | c2) == 0 - // result: (Or32 (Const32 [c1]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd32 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { - break - } - c2 := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - t := v_1.Type - c1 := v_1.AuxInt - if !(^(c1 | c2) == 0) { - break - } - v.reset(OpOr32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = c1 - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Or32 (And32 (Const32 [c2]) x) (Const32 [c1])) - // cond: ^(c1 | c2) == 0 - // result: (Or32 (Const32 [c1]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd32 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break - } - c2 := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - t := v_1.Type - c1 := v_1.AuxInt - if !(^(c1 | c2) == 0) { - break - } - v.reset(OpOr32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = c1 - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Or32 (Const32 [c1]) (And32 x (Const32 [c2]))) - // cond: ^(c1 | c2) == 0 - // result: (Or32 (Const32 [c1]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - t := v_0.Type - c1 := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAnd32 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 { - break - } - c2 := v_1_1.AuxInt - if !(^(c1 | c2) == 0) { - break - } - v.reset(OpOr32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = c1 - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (Or32 (Const32 [c1]) (And32 (Const32 [c2]) x)) - // cond: ^(c1 | c2) == 0 - // result: (Or32 (Const32 [c1]) x) + // match: (Mul64 n (Const64 [c])) + // cond: t.IsSigned() && isPowerOfTwo(-c) + // result: (Neg64 (Lsh64x64 n (Const64 [log2(-c)]))) for { + t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - t := v_0.Type - c1 := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAnd32 { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 { - break - } - c2 := v_1_0.AuxInt - if !(^(c1 | c2) == 0) { - break - } - v.reset(OpOr32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = c1 - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Or32 (Or32 i:(Const32 ) z) x) - // cond: (z.Op != OpConst32 && x.Op != OpConst32) - // result: (Or32 i (Or32 z x)) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOr32 { - break - } - z := v_0.Args[1] - i := v_0.Args[0] - if i.Op != OpConst32 { - break - } - t := i.Type - if !(z.Op != OpConst32 && x.Op != OpConst32) { - break - } - v.reset(OpOr32) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpOr32, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (Or32 (Or32 z i:(Const32 )) x) - // cond: (z.Op != OpConst32 && x.Op != OpConst32) - // result: (Or32 i (Or32 z x)) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOr32 { - break - } - _ = v_0.Args[1] - z := v_0.Args[0] - i := v_0.Args[1] - if i.Op != OpConst32 { - break - } - t := i.Type - if !(z.Op != OpConst32 && x.Op != OpConst32) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + n := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst64 { + continue + } + c := v_1.AuxInt + if !(t.IsSigned() && isPowerOfTwo(-c)) { + continue + } + v.reset(OpNeg64) + v0 := b.NewValue0(v.Pos, OpLsh64x64, t) + v0.AddArg(n) + v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v1.AuxInt = log2(-c) + v0.AddArg(v1) + v.AddArg(v0) + return true } - v.reset(OpOr32) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpOr32, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (Or32 x (Or32 i:(Const32 ) z)) - // cond: (z.Op != OpConst32 && x.Op != OpConst32) - // result: (Or32 i (Or32 z x)) + // match: (Mul64 (Const64 [c]) (Add64 (Const64 [d]) x)) + // result: (Add64 (Const64 [c*d]) (Mul64 (Const64 [c]) x)) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpOr32 { - break - } - z := v_1.Args[1] - i := v_1.Args[0] - if i.Op != OpConst32 { - break - } - t := i.Type - if !(z.Op != OpConst32 && x.Op != OpConst32) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpAdd64 || v_1.Type != t { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst64 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpAdd64) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = c * d + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpMul64, t) + v2 := b.NewValue0(v.Pos, OpConst64, t) + v2.AuxInt = c + v1.AddArg(v2) + v1.AddArg(x) + v.AddArg(v1) + return true + } } - v.reset(OpOr32) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpOr32, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (Or32 x (Or32 z i:(Const32 ))) - // cond: (z.Op != OpConst32 && x.Op != OpConst32) - // result: (Or32 i (Or32 z x)) + // match: (Mul64 (Const64 [0]) _) + // result: (Const64 [0]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpOr32 { - break - } - _ = v_1.Args[1] - z := v_1.Args[0] - i := v_1.Args[1] - if i.Op != OpConst32 { - break - } - t := i.Type - if !(z.Op != OpConst32 && x.Op != OpConst32) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 || v_0.AuxInt != 0 { + continue + } + v.reset(OpConst64) + v.AuxInt = 0 + return true } - v.reset(OpOr32) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpOr32, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (Or32 (Const32 [c]) (Or32 (Const32 [d]) x)) - // result: (Or32 (Const32 [int64(int32(c|d))]) x) + // match: (Mul64 (Const64 [c]) (Mul64 (Const64 [d]) x)) + // result: (Mul64 (Const64 [c*d]) x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpOr32 { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 || v_1_0.Type != t { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpMul64 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst64 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpMul64) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = c * d + v.AddArg(v0) + v.AddArg(x) + return true + } } - d := v_1_0.AuxInt - v.reset(OpOr32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c | d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } return false } -func rewriteValuegeneric_OpOr32_20(v *Value) bool { - b := v.Block - // match: (Or32 (Const32 [c]) (Or32 x (Const32 [d]))) - // result: (Or32 (Const32 [int64(int32(c|d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpOr32 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 || v_1_1.Type != t { - break - } - d := v_1_1.AuxInt - v.reset(OpOr32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c | d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Or32 (Or32 (Const32 [d]) x) (Const32 [c])) - // result: (Or32 (Const32 [int64(int32(c|d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOr32 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { - break - } - t := v_0_0.Type - d := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpOr32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c | d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Or32 (Or32 x (Const32 [d])) (Const32 [c])) - // result: (Or32 (Const32 [int64(int32(c|d))]) x) +func rewriteValuegeneric_OpMul64F_0(v *Value) bool { + // match: (Mul64F (Const64F [c]) (Const64F [d])) + // result: (Const64F [auxFrom64F(auxTo64F(c) * auxTo64F(d))]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOr32 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { - break - } - t := v_0_1.Type - d := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.Type != t { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64F { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst64F { + continue + } + d := v_1.AuxInt + v.reset(OpConst64F) + v.AuxInt = auxFrom64F(auxTo64F(c) * auxTo64F(d)) + return true } - c := v_1.AuxInt - v.reset(OpOr32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c | d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } - return false -} -func rewriteValuegeneric_OpOr64_0(v *Value) bool { - // match: (Or64 (Const64 [c]) (Const64 [d])) - // result: (Const64 [c|d]) + // match: (Mul64F x (Const64F [auxFrom64F(1)])) + // result: x for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst64F || v_1.AuxInt != auxFrom64F(1) { + continue + } + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - d := v_1.AuxInt - v.reset(OpConst64) - v.AuxInt = c | d - return true + break } - // match: (Or64 (Const64 [d]) (Const64 [c])) - // result: (Const64 [c|d]) + // match: (Mul64F x (Const64F [auxFrom64F(-1)])) + // result: (Neg64F x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst64F || v_1.AuxInt != auxFrom64F(-1) { + continue + } + v.reset(OpNeg64F) + v.AddArg(x) + return true } - c := v_1.AuxInt - v.reset(OpConst64) - v.AuxInt = c | d - return true + break } - // match: (Or64 x x) - // result: x + // match: (Mul64F x (Const64F [auxFrom64F(2)])) + // result: (Add64F x x) for { - x := v.Args[1] - if x != v.Args[0] { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst64F || v_1.AuxInt != auxFrom64F(2) { + continue + } + v.reset(OpAdd64F) + v.AddArg(x) + v.AddArg(x) + return true } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true + break } - // match: (Or64 (Const64 [0]) x) - // result: x + return false +} +func rewriteValuegeneric_OpMul8_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (Mul8 (Const8 [c]) (Const8 [d])) + // result: (Const8 [int64(int8(c*d))]) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 || v_0.AuxInt != 0 { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst8 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst8 { + continue + } + d := v_1.AuxInt + v.reset(OpConst8) + v.AuxInt = int64(int8(c * d)) + return true } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true + break } - // match: (Or64 x (Const64 [0])) + // match: (Mul8 (Const8 [1]) x) // result: x for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 0 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst8 || v_0.AuxInt != 1 { + continue + } + x := v.Args[1^_i0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true + break } - // match: (Or64 (Const64 [-1]) _) - // result: (Const64 [-1]) + // match: (Mul8 (Const8 [-1]) x) + // result: (Neg8 x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 || v_0.AuxInt != -1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst8 || v_0.AuxInt != -1 { + continue + } + x := v.Args[1^_i0] + v.reset(OpNeg8) + v.AddArg(x) + return true } - v.reset(OpConst64) - v.AuxInt = -1 - return true + break } - // match: (Or64 _ (Const64 [-1])) - // result: (Const64 [-1]) + // match: (Mul8 n (Const8 [c])) + // cond: isPowerOfTwo(c) + // result: (Lsh8x64 n (Const64 [log2(c)])) for { + t := v.Type _ = v.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != -1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + n := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst8 { + continue + } + c := v_1.AuxInt + if !(isPowerOfTwo(c)) { + continue + } + v.reset(OpLsh8x64) + v.Type = t + v.AddArg(n) + v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v0.AuxInt = log2(c) + v.AddArg(v0) + return true } - v.reset(OpConst64) - v.AuxInt = -1 - return true + break } - // match: (Or64 x (Or64 x y)) - // result: (Or64 x y) + // match: (Mul8 n (Const8 [c])) + // cond: t.IsSigned() && isPowerOfTwo(-c) + // result: (Neg8 (Lsh8x64 n (Const64 [log2(-c)]))) for { + t := v.Type _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpOr64 { - break - } - y := v_1.Args[1] - if x != v_1.Args[0] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + n := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst8 { + continue + } + c := v_1.AuxInt + if !(t.IsSigned() && isPowerOfTwo(-c)) { + continue + } + v.reset(OpNeg8) + v0 := b.NewValue0(v.Pos, OpLsh8x64, t) + v0.AddArg(n) + v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v1.AuxInt = log2(-c) + v0.AddArg(v1) + v.AddArg(v0) + return true } - v.reset(OpOr64) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (Or64 x (Or64 y x)) - // result: (Or64 x y) + // match: (Mul8 (Const8 [0]) _) + // result: (Const8 [0]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpOr64 { - break - } - _ = v_1.Args[1] - y := v_1.Args[0] - if x != v_1.Args[1] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst8 || v_0.AuxInt != 0 { + continue + } + v.reset(OpConst8) + v.AuxInt = 0 + return true } - v.reset(OpOr64) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (Or64 (Or64 x y) x) - // result: (Or64 x y) + // match: (Mul8 (Const8 [c]) (Mul8 (Const8 [d]) x)) + // result: (Mul8 (Const8 [int64(int8(c*d))]) x) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOr64 { - break - } - y := v_0.Args[1] - if x != v_0.Args[0] { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst8 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpMul8 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst8 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpMul8) + v0 := b.NewValue0(v.Pos, OpConst8, t) + v0.AuxInt = int64(int8(c * d)) + v.AddArg(v0) + v.AddArg(x) + return true + } } - v.reset(OpOr64) - v.AddArg(x) - v.AddArg(y) - return true + break } return false } -func rewriteValuegeneric_OpOr64_10(v *Value) bool { +func rewriteValuegeneric_OpNeg16_0(v *Value) bool { b := v.Block - // match: (Or64 (Or64 y x) x) - // result: (Or64 x y) + // match: (Neg16 (Const16 [c])) + // result: (Const16 [int64(-int16(c))]) for { - x := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpOr64 { - break - } - _ = v_0.Args[1] - y := v_0.Args[0] - if x != v_0.Args[1] { + if v_0.Op != OpConst16 { break } - v.reset(OpOr64) - v.AddArg(x) - v.AddArg(y) + c := v_0.AuxInt + v.reset(OpConst16) + v.AuxInt = int64(-int16(c)) return true } - // match: (Or64 (And64 x (Const64 [c2])) (Const64 [c1])) - // cond: ^(c1 | c2) == 0 - // result: (Or64 (Const64 [c1]) x) + // match: (Neg16 (Sub16 x y)) + // result: (Sub16 y x) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpAnd64 { + if v_0.Op != OpSub16 { break } - _ = v_0.Args[1] + y := v_0.Args[1] x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c2 := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - t := v_1.Type - c1 := v_1.AuxInt - if !(^(c1 | c2) == 0) { - break - } - v.reset(OpOr64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c1 - v.AddArg(v0) + v.reset(OpSub16) + v.AddArg(y) v.AddArg(x) return true } - // match: (Or64 (And64 (Const64 [c2]) x) (Const64 [c1])) - // cond: ^(c1 | c2) == 0 - // result: (Or64 (Const64 [c1]) x) + // match: (Neg16 (Neg16 x)) + // result: x for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpAnd64 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 { - break - } - c2 := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - t := v_1.Type - c1 := v_1.AuxInt - if !(^(c1 | c2) == 0) { + if v_0.Op != OpNeg16 { break } - v.reset(OpOr64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c1 - v.AddArg(v0) + x := v_0.Args[0] + v.reset(OpCopy) + v.Type = x.Type v.AddArg(x) return true } - // match: (Or64 (Const64 [c1]) (And64 x (Const64 [c2]))) - // cond: ^(c1 | c2) == 0 - // result: (Or64 (Const64 [c1]) x) + // match: (Neg16 (Com16 x)) + // result: (Add16 (Const16 [1]) x) for { - _ = v.Args[1] + t := v.Type v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - t := v_0.Type - c1 := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAnd64 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 { - break - } - c2 := v_1_1.AuxInt - if !(^(c1 | c2) == 0) { + if v_0.Op != OpCom16 { break } - v.reset(OpOr64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c1 + x := v_0.Args[0] + v.reset(OpAdd16) + v0 := b.NewValue0(v.Pos, OpConst16, t) + v0.AuxInt = 1 v.AddArg(v0) v.AddArg(x) return true } - // match: (Or64 (Const64 [c1]) (And64 (Const64 [c2]) x)) - // cond: ^(c1 | c2) == 0 - // result: (Or64 (Const64 [c1]) x) + return false +} +func rewriteValuegeneric_OpNeg32_0(v *Value) bool { + b := v.Block + // match: (Neg32 (Const32 [c])) + // result: (Const32 [int64(-int32(c))]) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - t := v_0.Type - c1 := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAnd64 { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst64 { + if v_0.Op != OpConst32 { break } - c2 := v_1_0.AuxInt - if !(^(c1 | c2) == 0) { + c := v_0.AuxInt + v.reset(OpConst32) + v.AuxInt = int64(-int32(c)) + return true + } + // match: (Neg32 (Sub32 x y)) + // result: (Sub32 y x) + for { + v_0 := v.Args[0] + if v_0.Op != OpSub32 { break } - v.reset(OpOr64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c1 - v.AddArg(v0) + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpSub32) + v.AddArg(y) v.AddArg(x) return true } - // match: (Or64 (Or64 i:(Const64 ) z) x) - // cond: (z.Op != OpConst64 && x.Op != OpConst64) - // result: (Or64 i (Or64 z x)) + // match: (Neg32 (Neg32 x)) + // result: x for { - x := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpOr64 { - break - } - z := v_0.Args[1] - i := v_0.Args[0] - if i.Op != OpConst64 { - break - } - t := i.Type - if !(z.Op != OpConst64 && x.Op != OpConst64) { + if v_0.Op != OpNeg32 { break } - v.reset(OpOr64) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpOr64, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) + x := v_0.Args[0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (Or64 (Or64 z i:(Const64 )) x) - // cond: (z.Op != OpConst64 && x.Op != OpConst64) - // result: (Or64 i (Or64 z x)) + // match: (Neg32 (Com32 x)) + // result: (Add32 (Const32 [1]) x) for { - x := v.Args[1] + t := v.Type v_0 := v.Args[0] - if v_0.Op != OpOr64 { - break - } - _ = v_0.Args[1] - z := v_0.Args[0] - i := v_0.Args[1] - if i.Op != OpConst64 { - break - } - t := i.Type - if !(z.Op != OpConst64 && x.Op != OpConst64) { + if v_0.Op != OpCom32 { break } - v.reset(OpOr64) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpOr64, t) - v0.AddArg(z) - v0.AddArg(x) + x := v_0.Args[0] + v.reset(OpAdd32) + v0 := b.NewValue0(v.Pos, OpConst32, t) + v0.AuxInt = 1 v.AddArg(v0) + v.AddArg(x) return true } - // match: (Or64 x (Or64 i:(Const64 ) z)) - // cond: (z.Op != OpConst64 && x.Op != OpConst64) - // result: (Or64 i (Or64 z x)) + return false +} +func rewriteValuegeneric_OpNeg32F_0(v *Value) bool { + // match: (Neg32F (Const32F [c])) + // cond: auxTo32F(c) != 0 + // result: (Const32F [auxFrom32F(-auxTo32F(c))]) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpOr64 { + v_0 := v.Args[0] + if v_0.Op != OpConst32F { break } - z := v_1.Args[1] - i := v_1.Args[0] - if i.Op != OpConst64 { + c := v_0.AuxInt + if !(auxTo32F(c) != 0) { break } - t := i.Type - if !(z.Op != OpConst64 && x.Op != OpConst64) { + v.reset(OpConst32F) + v.AuxInt = auxFrom32F(-auxTo32F(c)) + return true + } + return false +} +func rewriteValuegeneric_OpNeg64_0(v *Value) bool { + b := v.Block + // match: (Neg64 (Const64 [c])) + // result: (Const64 [-c]) + for { + v_0 := v.Args[0] + if v_0.Op != OpConst64 { break } - v.reset(OpOr64) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpOr64, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) + c := v_0.AuxInt + v.reset(OpConst64) + v.AuxInt = -c return true } - // match: (Or64 x (Or64 z i:(Const64 ))) - // cond: (z.Op != OpConst64 && x.Op != OpConst64) - // result: (Or64 i (Or64 z x)) + // match: (Neg64 (Sub64 x y)) + // result: (Sub64 y x) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpOr64 { + v_0 := v.Args[0] + if v_0.Op != OpSub64 { break } - _ = v_1.Args[1] - z := v_1.Args[0] - i := v_1.Args[1] - if i.Op != OpConst64 { + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpSub64) + v.AddArg(y) + v.AddArg(x) + return true + } + // match: (Neg64 (Neg64 x)) + // result: x + for { + v_0 := v.Args[0] + if v_0.Op != OpNeg64 { break } - t := i.Type - if !(z.Op != OpConst64 && x.Op != OpConst64) { + x := v_0.Args[0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + // match: (Neg64 (Com64 x)) + // result: (Add64 (Const64 [1]) x) + for { + t := v.Type + v_0 := v.Args[0] + if v_0.Op != OpCom64 { break } - v.reset(OpOr64) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpOr64, t) - v0.AddArg(z) - v0.AddArg(x) + x := v_0.Args[0] + v.reset(OpAdd64) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = 1 v.AddArg(v0) + v.AddArg(x) return true } - // match: (Or64 (Const64 [c]) (Or64 (Const64 [d]) x)) - // result: (Or64 (Const64 [c|d]) x) + return false +} +func rewriteValuegeneric_OpNeg64F_0(v *Value) bool { + // match: (Neg64F (Const64F [c])) + // cond: auxTo64F(c) != 0 + // result: (Const64F [auxFrom64F(-auxTo64F(c))]) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst64 { + if v_0.Op != OpConst64F { break } - t := v_0.Type c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpOr64 { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst64 || v_1_0.Type != t { + if !(auxTo64F(c) != 0) { break } - d := v_1_0.AuxInt - v.reset(OpOr64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c | d - v.AddArg(v0) - v.AddArg(x) + v.reset(OpConst64F) + v.AuxInt = auxFrom64F(-auxTo64F(c)) return true } return false } -func rewriteValuegeneric_OpOr64_20(v *Value) bool { +func rewriteValuegeneric_OpNeg8_0(v *Value) bool { b := v.Block - // match: (Or64 (Const64 [c]) (Or64 x (Const64 [d]))) - // result: (Or64 (Const64 [c|d]) x) + // match: (Neg8 (Const8 [c])) + // result: (Const8 [int64( -int8(c))]) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst64 { + if v_0.Op != OpConst8 { break } - t := v_0.Type c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpOr64 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != t { + v.reset(OpConst8) + v.AuxInt = int64(-int8(c)) + return true + } + // match: (Neg8 (Sub8 x y)) + // result: (Sub8 y x) + for { + v_0 := v.Args[0] + if v_0.Op != OpSub8 { break } - d := v_1_1.AuxInt - v.reset(OpOr64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c | d - v.AddArg(v0) + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpSub8) + v.AddArg(y) v.AddArg(x) return true } - // match: (Or64 (Or64 (Const64 [d]) x) (Const64 [c])) - // result: (Or64 (Const64 [c|d]) x) + // match: (Neg8 (Neg8 x)) + // result: x for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpOr64 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 { - break - } - t := v_0_0.Type - d := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.Type != t { + if v_0.Op != OpNeg8 { break } - c := v_1.AuxInt - v.reset(OpOr64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c | d - v.AddArg(v0) + x := v_0.Args[0] + v.reset(OpCopy) + v.Type = x.Type v.AddArg(x) return true } - // match: (Or64 (Or64 x (Const64 [d])) (Const64 [c])) - // result: (Or64 (Const64 [c|d]) x) + // match: (Neg8 (Com8 x)) + // result: (Add8 (Const8 [1]) x) for { - _ = v.Args[1] + t := v.Type v_0 := v.Args[0] - if v_0.Op != OpOr64 { + if v_0.Op != OpCom8 { break } - _ = v_0.Args[1] x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - t := v_0_1.Type - d := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpOr64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c | d + v.reset(OpAdd8) + v0 := b.NewValue0(v.Pos, OpConst8, t) + v0.AuxInt = 1 v.AddArg(v0) v.AddArg(x) return true } return false } -func rewriteValuegeneric_OpOr8_0(v *Value) bool { - // match: (Or8 (Const8 [c]) (Const8 [d])) - // result: (Const8 [int64(int8(c|d))]) +func rewriteValuegeneric_OpNeq16_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (Neq16 x x) + // result: (ConstBool [0]) + for { + x := v.Args[1] + if x != v.Args[0] { + break + } + v.reset(OpConstBool) + v.AuxInt = 0 + return true + } + // match: (Neq16 (Const16 [c]) (Add16 (Const16 [d]) x)) + // result: (Neq16 (Const16 [int64(int16(c-d))]) x) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst16 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpAdd16 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst16 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpNeq16) + v0 := b.NewValue0(v.Pos, OpConst16, t) + v0.AuxInt = int64(int16(c - d)) + v.AddArg(v0) + v.AddArg(x) + return true + } + } + break + } + // match: (Neq16 (Const16 [c]) (Const16 [d])) + // result: (ConstBool [b2i(c != d)]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst16 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst16 { + continue + } + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c != d) + return true } - d := v_1.AuxInt - v.reset(OpConst8) - v.AuxInt = int64(int8(c | d)) - return true + break } - // match: (Or8 (Const8 [d]) (Const8 [c])) - // result: (Const8 [int64(int8(c|d))]) + // match: (Neq16 n (Lsh16x64 (Rsh16x64 (Add16 n (Rsh16Ux64 (Rsh16x64 n (Const64 [15])) (Const64 [kbar]))) (Const64 [k])) (Const64 [k])) ) + // cond: k > 0 && k < 15 && kbar == 16 - k + // result: (Neq16 (And16 n (Const16 [int64(1< [0])) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + n := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpLsh16x64 { + continue + } + _ = v_1.Args[1] + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpRsh16x64 { + continue + } + _ = v_1_0.Args[1] + v_1_0_0 := v_1_0.Args[0] + if v_1_0_0.Op != OpAdd16 { + continue + } + t := v_1_0_0.Type + _ = v_1_0_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + if n != v_1_0_0.Args[_i1] { + continue + } + v_1_0_0_1 := v_1_0_0.Args[1^_i1] + if v_1_0_0_1.Op != OpRsh16Ux64 || v_1_0_0_1.Type != t { + continue + } + _ = v_1_0_0_1.Args[1] + v_1_0_0_1_0 := v_1_0_0_1.Args[0] + if v_1_0_0_1_0.Op != OpRsh16x64 || v_1_0_0_1_0.Type != t { + continue + } + _ = v_1_0_0_1_0.Args[1] + if n != v_1_0_0_1_0.Args[0] { + continue + } + v_1_0_0_1_0_1 := v_1_0_0_1_0.Args[1] + if v_1_0_0_1_0_1.Op != OpConst64 || v_1_0_0_1_0_1.Type != typ.UInt64 || v_1_0_0_1_0_1.AuxInt != 15 { + continue + } + v_1_0_0_1_1 := v_1_0_0_1.Args[1] + if v_1_0_0_1_1.Op != OpConst64 || v_1_0_0_1_1.Type != typ.UInt64 { + continue + } + kbar := v_1_0_0_1_1.AuxInt + v_1_0_1 := v_1_0.Args[1] + if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 { + continue + } + k := v_1_0_1.AuxInt + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || v_1_1.AuxInt != k || !(k > 0 && k < 15 && kbar == 16-k) { + continue + } + v.reset(OpNeq16) + v0 := b.NewValue0(v.Pos, OpAnd16, t) + v0.AddArg(n) + v1 := b.NewValue0(v.Pos, OpConst16, t) + v1.AuxInt = int64(1< x (Const16 [y])) (Const16 [y])) + // cond: isPowerOfTwo(y) + // result: (Eq16 (And16 x (Const16 [y])) (Const16 [0])) for { - x := v.Args[1] - if x != v.Args[0] { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAnd16 { + continue + } + t := v_0.Type + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + x := v_0.Args[_i1] + v_0_1 := v_0.Args[1^_i1] + if v_0_1.Op != OpConst16 || v_0_1.Type != t { + continue + } + y := v_0_1.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst16 || v_1.Type != t || v_1.AuxInt != y || !(isPowerOfTwo(y)) { + continue + } + v.reset(OpEq16) + v0 := b.NewValue0(v.Pos, OpAnd16, t) + v0.AddArg(x) + v1 := b.NewValue0(v.Pos, OpConst16, t) + v1.AuxInt = y + v0.AddArg(v1) + v.AddArg(v0) + v2 := b.NewValue0(v.Pos, OpConst16, t) + v2.AuxInt = 0 + v.AddArg(v2) + return true + } } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true + break } - // match: (Or8 (Const8 [0]) x) - // result: x + return false +} +func rewriteValuegeneric_OpNeq32_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (Neq32 x x) + // result: (ConstBool [0]) for { x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 || v_0.AuxInt != 0 { + if x != v.Args[0] { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + v.reset(OpConstBool) + v.AuxInt = 0 return true } - // match: (Or8 x (Const8 [0])) - // result: x + // match: (Neq32 (Const32 [c]) (Add32 (Const32 [d]) x)) + // result: (Neq32 (Const32 [int64(int32(c-d))]) x) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.AuxInt != 0 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpAdd32 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst32 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpNeq32) + v0 := b.NewValue0(v.Pos, OpConst32, t) + v0.AuxInt = int64(int32(c - d)) + v.AddArg(v0) + v.AddArg(x) + return true + } } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true + break } - // match: (Or8 (Const8 [-1]) _) - // result: (Const8 [-1]) + // match: (Neq32 (Const32 [c]) (Const32 [d])) + // result: (ConstBool [b2i(c != d)]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 || v_0.AuxInt != -1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst32 { + continue + } + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c != d) + return true } - v.reset(OpConst8) - v.AuxInt = -1 - return true + break } - // match: (Or8 _ (Const8 [-1])) - // result: (Const8 [-1]) + // match: (Neq32 n (Lsh32x64 (Rsh32x64 (Add32 n (Rsh32Ux64 (Rsh32x64 n (Const64 [31])) (Const64 [kbar]))) (Const64 [k])) (Const64 [k])) ) + // cond: k > 0 && k < 31 && kbar == 32 - k + // result: (Neq32 (And32 n (Const32 [int64(1< [0])) for { _ = v.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.AuxInt != -1 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + n := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpLsh32x64 { + continue + } + _ = v_1.Args[1] + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpRsh32x64 { + continue + } + _ = v_1_0.Args[1] + v_1_0_0 := v_1_0.Args[0] + if v_1_0_0.Op != OpAdd32 { + continue + } + t := v_1_0_0.Type + _ = v_1_0_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + if n != v_1_0_0.Args[_i1] { + continue + } + v_1_0_0_1 := v_1_0_0.Args[1^_i1] + if v_1_0_0_1.Op != OpRsh32Ux64 || v_1_0_0_1.Type != t { + continue + } + _ = v_1_0_0_1.Args[1] + v_1_0_0_1_0 := v_1_0_0_1.Args[0] + if v_1_0_0_1_0.Op != OpRsh32x64 || v_1_0_0_1_0.Type != t { + continue + } + _ = v_1_0_0_1_0.Args[1] + if n != v_1_0_0_1_0.Args[0] { + continue + } + v_1_0_0_1_0_1 := v_1_0_0_1_0.Args[1] + if v_1_0_0_1_0_1.Op != OpConst64 || v_1_0_0_1_0_1.Type != typ.UInt64 || v_1_0_0_1_0_1.AuxInt != 31 { + continue + } + v_1_0_0_1_1 := v_1_0_0_1.Args[1] + if v_1_0_0_1_1.Op != OpConst64 || v_1_0_0_1_1.Type != typ.UInt64 { + continue + } + kbar := v_1_0_0_1_1.AuxInt + v_1_0_1 := v_1_0.Args[1] + if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 { + continue + } + k := v_1_0_1.AuxInt + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || v_1_1.AuxInt != k || !(k > 0 && k < 31 && kbar == 32-k) { + continue + } + v.reset(OpNeq32) + v0 := b.NewValue0(v.Pos, OpAnd32, t) + v0.AddArg(n) + v1 := b.NewValue0(v.Pos, OpConst32, t) + v1.AuxInt = int64(1< x (Const32 [y])) (Const32 [y])) + // cond: isPowerOfTwo(y) + // result: (Eq32 (And32 x (Const32 [y])) (Const32 [0])) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpOr8 { - break - } - _ = v_1.Args[1] - y := v_1.Args[0] - if x != v_1.Args[1] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAnd32 { + continue + } + t := v_0.Type + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + x := v_0.Args[_i1] + v_0_1 := v_0.Args[1^_i1] + if v_0_1.Op != OpConst32 || v_0_1.Type != t { + continue + } + y := v_0_1.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst32 || v_1.Type != t || v_1.AuxInt != y || !(isPowerOfTwo(y)) { + continue + } + v.reset(OpEq32) + v0 := b.NewValue0(v.Pos, OpAnd32, t) + v0.AddArg(x) + v1 := b.NewValue0(v.Pos, OpConst32, t) + v1.AuxInt = y + v0.AddArg(v1) + v.AddArg(v0) + v2 := b.NewValue0(v.Pos, OpConst32, t) + v2.AuxInt = 0 + v.AddArg(v2) + return true + } } - v.reset(OpOr8) - v.AddArg(x) - v.AddArg(y) - return true + break } - // match: (Or8 (Or8 x y) x) - // result: (Or8 x y) + return false +} +func rewriteValuegeneric_OpNeq32F_0(v *Value) bool { + // match: (Neq32F (Const32F [c]) (Const32F [d])) + // result: (ConstBool [b2i(auxTo32F(c) != auxTo32F(d))]) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOr8 { - break - } - y := v_0.Args[1] - if x != v_0.Args[0] { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32F { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst32F { + continue + } + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(auxTo32F(c) != auxTo32F(d)) + return true } - v.reset(OpOr8) - v.AddArg(x) - v.AddArg(y) - return true + break } return false } -func rewriteValuegeneric_OpOr8_10(v *Value) bool { +func rewriteValuegeneric_OpNeq64_0(v *Value) bool { b := v.Block - // match: (Or8 (Or8 y x) x) - // result: (Or8 x y) + typ := &b.Func.Config.Types + // match: (Neq64 x x) + // result: (ConstBool [0]) for { x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOr8 { - break - } - _ = v_0.Args[1] - y := v_0.Args[0] - if x != v_0.Args[1] { + if x != v.Args[0] { break } - v.reset(OpOr8) - v.AddArg(x) - v.AddArg(y) + v.reset(OpConstBool) + v.AuxInt = 0 return true } - // match: (Or8 (And8 x (Const8 [c2])) (Const8 [c1])) - // cond: ^(c1 | c2) == 0 - // result: (Or8 (Const8 [c1]) x) + // match: (Neq64 (Const64 [c]) (Add64 (Const64 [d]) x)) + // result: (Neq64 (Const64 [c-d]) x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd8 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpAdd64 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst64 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpNeq64) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = c - d + v.AddArg(v0) + v.AddArg(x) + return true + } } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst8 { - break + break + } + // match: (Neq64 (Const64 [c]) (Const64 [d])) + // result: (ConstBool [b2i(c != d)]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst64 { + continue + } + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c != d) + return true } - c2 := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break + break + } + // match: (Neq64 n (Lsh64x64 (Rsh64x64 (Add64 n (Rsh64Ux64 (Rsh64x64 n (Const64 [63])) (Const64 [kbar]))) (Const64 [k])) (Const64 [k])) ) + // cond: k > 0 && k < 63 && kbar == 64 - k + // result: (Neq64 (And64 n (Const64 [int64(1< [0])) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + n := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpLsh64x64 { + continue + } + _ = v_1.Args[1] + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpRsh64x64 { + continue + } + _ = v_1_0.Args[1] + v_1_0_0 := v_1_0.Args[0] + if v_1_0_0.Op != OpAdd64 { + continue + } + t := v_1_0_0.Type + _ = v_1_0_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + if n != v_1_0_0.Args[_i1] { + continue + } + v_1_0_0_1 := v_1_0_0.Args[1^_i1] + if v_1_0_0_1.Op != OpRsh64Ux64 || v_1_0_0_1.Type != t { + continue + } + _ = v_1_0_0_1.Args[1] + v_1_0_0_1_0 := v_1_0_0_1.Args[0] + if v_1_0_0_1_0.Op != OpRsh64x64 || v_1_0_0_1_0.Type != t { + continue + } + _ = v_1_0_0_1_0.Args[1] + if n != v_1_0_0_1_0.Args[0] { + continue + } + v_1_0_0_1_0_1 := v_1_0_0_1_0.Args[1] + if v_1_0_0_1_0_1.Op != OpConst64 || v_1_0_0_1_0_1.Type != typ.UInt64 || v_1_0_0_1_0_1.AuxInt != 63 { + continue + } + v_1_0_0_1_1 := v_1_0_0_1.Args[1] + if v_1_0_0_1_1.Op != OpConst64 || v_1_0_0_1_1.Type != typ.UInt64 { + continue + } + kbar := v_1_0_0_1_1.AuxInt + v_1_0_1 := v_1_0.Args[1] + if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 { + continue + } + k := v_1_0_1.AuxInt + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || v_1_1.AuxInt != k || !(k > 0 && k < 63 && kbar == 64-k) { + continue + } + v.reset(OpNeq64) + v0 := b.NewValue0(v.Pos, OpAnd64, t) + v0.AddArg(n) + v1 := b.NewValue0(v.Pos, OpConst64, t) + v1.AuxInt = int64(1< x (Const64 [y])) (Const64 [y])) + // cond: isPowerOfTwo(y) + // result: (Eq64 (And64 x (Const64 [y])) (Const64 [0])) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAnd64 { + continue + } + t := v_0.Type + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + x := v_0.Args[_i1] + v_0_1 := v_0.Args[1^_i1] + if v_0_1.Op != OpConst64 || v_0_1.Type != t { + continue + } + y := v_0_1.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst64 || v_1.Type != t || v_1.AuxInt != y || !(isPowerOfTwo(y)) { + continue + } + v.reset(OpEq64) + v0 := b.NewValue0(v.Pos, OpAnd64, t) + v0.AddArg(x) + v1 := b.NewValue0(v.Pos, OpConst64, t) + v1.AuxInt = y + v0.AddArg(v1) + v.AddArg(v0) + v2 := b.NewValue0(v.Pos, OpConst64, t) + v2.AuxInt = 0 + v.AddArg(v2) + return true + } + } + break + } + return false +} +func rewriteValuegeneric_OpNeq64F_0(v *Value) bool { + // match: (Neq64F (Const64F [c]) (Const64F [d])) + // result: (ConstBool [b2i(auxTo64F(c) != auxTo64F(d))]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64F { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst64F { + continue + } + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(auxTo64F(c) != auxTo64F(d)) + return true + } + break + } + return false +} +func rewriteValuegeneric_OpNeq8_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (Neq8 x x) + // result: (ConstBool [0]) + for { + x := v.Args[1] + if x != v.Args[0] { break } - v.reset(OpOr8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = c1 - v.AddArg(v0) - v.AddArg(x) + v.reset(OpConstBool) + v.AuxInt = 0 return true } - // match: (Or8 (And8 (Const8 [c2]) x) (Const8 [c1])) - // cond: ^(c1 | c2) == 0 - // result: (Or8 (Const8 [c1]) x) + // match: (Neq8 (Const8 [c]) (Add8 (Const8 [d]) x)) + // result: (Neq8 (Const8 [int64(int8(c-d))]) x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAnd8 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst8 { - break - } - c2 := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break - } - t := v_1.Type - c1 := v_1.AuxInt - if !(^(c1 | c2) == 0) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst8 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpAdd8 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst8 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpNeq8) + v0 := b.NewValue0(v.Pos, OpConst8, t) + v0.AuxInt = int64(int8(c - d)) + v.AddArg(v0) + v.AddArg(x) + return true + } } - v.reset(OpOr8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = c1 - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (Or8 (Const8 [c1]) (And8 x (Const8 [c2]))) - // cond: ^(c1 | c2) == 0 - // result: (Or8 (Const8 [c1]) x) + // match: (Neq8 (Const8 [c]) (Const8 [d])) + // result: (ConstBool [b2i(c != d)]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - t := v_0.Type - c1 := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpAnd8 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst8 { - break - } - c2 := v_1_1.AuxInt - if !(^(c1 | c2) == 0) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst8 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst8 { + continue + } + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c != d) + return true } - v.reset(OpOr8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = c1 - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (Or8 (Const8 [c1]) (And8 (Const8 [c2]) x)) - // cond: ^(c1 | c2) == 0 - // result: (Or8 (Const8 [c1]) x) + // match: (Neq8 n (Lsh8x64 (Rsh8x64 (Add8 n (Rsh8Ux64 (Rsh8x64 n (Const64 [ 7])) (Const64 [kbar]))) (Const64 [k])) (Const64 [k])) ) + // cond: k > 0 && k < 7 && kbar == 8 - k + // result: (Neq8 (And8 n (Const8 [int64(1< [0])) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + n := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpLsh8x64 { + continue + } + _ = v_1.Args[1] + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpRsh8x64 { + continue + } + _ = v_1_0.Args[1] + v_1_0_0 := v_1_0.Args[0] + if v_1_0_0.Op != OpAdd8 { + continue + } + t := v_1_0_0.Type + _ = v_1_0_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + if n != v_1_0_0.Args[_i1] { + continue + } + v_1_0_0_1 := v_1_0_0.Args[1^_i1] + if v_1_0_0_1.Op != OpRsh8Ux64 || v_1_0_0_1.Type != t { + continue + } + _ = v_1_0_0_1.Args[1] + v_1_0_0_1_0 := v_1_0_0_1.Args[0] + if v_1_0_0_1_0.Op != OpRsh8x64 || v_1_0_0_1_0.Type != t { + continue + } + _ = v_1_0_0_1_0.Args[1] + if n != v_1_0_0_1_0.Args[0] { + continue + } + v_1_0_0_1_0_1 := v_1_0_0_1_0.Args[1] + if v_1_0_0_1_0_1.Op != OpConst64 || v_1_0_0_1_0_1.Type != typ.UInt64 || v_1_0_0_1_0_1.AuxInt != 7 { + continue + } + v_1_0_0_1_1 := v_1_0_0_1.Args[1] + if v_1_0_0_1_1.Op != OpConst64 || v_1_0_0_1_1.Type != typ.UInt64 { + continue + } + kbar := v_1_0_0_1_1.AuxInt + v_1_0_1 := v_1_0.Args[1] + if v_1_0_1.Op != OpConst64 || v_1_0_1.Type != typ.UInt64 { + continue + } + k := v_1_0_1.AuxInt + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpConst64 || v_1_1.Type != typ.UInt64 || v_1_1.AuxInt != k || !(k > 0 && k < 7 && kbar == 8-k) { + continue + } + v.reset(OpNeq8) + v0 := b.NewValue0(v.Pos, OpAnd8, t) + v0.AddArg(n) + v1 := b.NewValue0(v.Pos, OpConst8, t) + v1.AuxInt = int64(1< x (Const8 [y])) (Const8 [y])) + // cond: isPowerOfTwo(y) + // result: (Eq8 (And8 x (Const8 [y])) (Const8 [0])) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAnd8 { + continue + } + t := v_0.Type + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + x := v_0.Args[_i1] + v_0_1 := v_0.Args[1^_i1] + if v_0_1.Op != OpConst8 || v_0_1.Type != t { + continue + } + y := v_0_1.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst8 || v_1.Type != t || v_1.AuxInt != y || !(isPowerOfTwo(y)) { + continue + } + v.reset(OpEq8) + v0 := b.NewValue0(v.Pos, OpAnd8, t) + v0.AddArg(x) + v1 := b.NewValue0(v.Pos, OpConst8, t) + v1.AuxInt = y + v0.AddArg(v1) + v.AddArg(v0) + v2 := b.NewValue0(v.Pos, OpConst8, t) + v2.AuxInt = 0 + v.AddArg(v2) + return true + } } - c2 := v_1_0.AuxInt - if !(^(c1 | c2) == 0) { - break + break + } + return false +} +func rewriteValuegeneric_OpNeqB_0(v *Value) bool { + // match: (NeqB (ConstBool [c]) (ConstBool [d])) + // result: (ConstBool [b2i(c != d)]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConstBool { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConstBool { + continue + } + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c != d) + return true } - v.reset(OpOr8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = c1 - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (Or8 (Or8 i:(Const8 ) z) x) - // cond: (z.Op != OpConst8 && x.Op != OpConst8) - // result: (Or8 i (Or8 z x)) + // match: (NeqB (ConstBool [0]) x) + // result: x for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOr8 { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConstBool || v_0.AuxInt != 0 { + continue + } + x := v.Args[1^_i0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - z := v_0.Args[1] - i := v_0.Args[0] - if i.Op != OpConst8 { - break + break + } + // match: (NeqB (ConstBool [1]) x) + // result: (Not x) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConstBool || v_0.AuxInt != 1 { + continue + } + x := v.Args[1^_i0] + v.reset(OpNot) + v.AddArg(x) + return true } - t := i.Type - if !(z.Op != OpConst8 && x.Op != OpConst8) { - break + break + } + // match: (NeqB (Not x) (Not y)) + // result: (NeqB x y) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpNot { + continue + } + x := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpNot { + continue + } + y := v_1.Args[0] + v.reset(OpNeqB) + v.AddArg(x) + v.AddArg(y) + return true } - v.reset(OpOr8) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpOr8, t) - v0.AddArg(z) + break + } + return false +} +func rewriteValuegeneric_OpNeqInter_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (NeqInter x y) + // result: (NeqPtr (ITab x) (ITab y)) + for { + y := v.Args[1] + x := v.Args[0] + v.reset(OpNeqPtr) + v0 := b.NewValue0(v.Pos, OpITab, typ.Uintptr) v0.AddArg(x) v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpITab, typ.Uintptr) + v1.AddArg(y) + v.AddArg(v1) return true } - // match: (Or8 (Or8 z i:(Const8 )) x) - // cond: (z.Op != OpConst8 && x.Op != OpConst8) - // result: (Or8 i (Or8 z x)) +} +func rewriteValuegeneric_OpNeqPtr_0(v *Value) bool { + // match: (NeqPtr x x) + // result: (ConstBool [0]) for { x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOr8 { - break - } - _ = v_0.Args[1] - z := v_0.Args[0] - i := v_0.Args[1] - if i.Op != OpConst8 { - break - } - t := i.Type - if !(z.Op != OpConst8 && x.Op != OpConst8) { + if x != v.Args[0] { break } - v.reset(OpOr8) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpOr8, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpConstBool) + v.AuxInt = 0 return true } - // match: (Or8 x (Or8 i:(Const8 ) z)) - // cond: (z.Op != OpConst8 && x.Op != OpConst8) - // result: (Or8 i (Or8 z x)) + // match: (NeqPtr (Addr {a} _) (Addr {b} _)) + // result: (ConstBool [b2i(a != b)]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpOr8 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAddr { + continue + } + a := v_0.Aux + v_1 := v.Args[1^_i0] + if v_1.Op != OpAddr { + continue + } + b := v_1.Aux + v.reset(OpConstBool) + v.AuxInt = b2i(a != b) + return true } - z := v_1.Args[1] - i := v_1.Args[0] - if i.Op != OpConst8 { - break + break + } + // match: (NeqPtr (Addr {a} _) (OffPtr [o] (Addr {b} _))) + // result: (ConstBool [b2i(a != b || o != 0)]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAddr { + continue + } + a := v_0.Aux + v_1 := v.Args[1^_i0] + if v_1.Op != OpOffPtr { + continue + } + o := v_1.AuxInt + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpAddr { + continue + } + b := v_1_0.Aux + v.reset(OpConstBool) + v.AuxInt = b2i(a != b || o != 0) + return true } - t := i.Type - if !(z.Op != OpConst8 && x.Op != OpConst8) { - break + break + } + // match: (NeqPtr (OffPtr [o1] (Addr {a} _)) (OffPtr [o2] (Addr {b} _))) + // result: (ConstBool [b2i(a != b || o1 != o2)]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpOffPtr { + continue + } + o1 := v_0.AuxInt + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpAddr { + continue + } + a := v_0_0.Aux + v_1 := v.Args[1^_i0] + if v_1.Op != OpOffPtr { + continue + } + o2 := v_1.AuxInt + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpAddr { + continue + } + b := v_1_0.Aux + v.reset(OpConstBool) + v.AuxInt = b2i(a != b || o1 != o2) + return true } - v.reset(OpOr8) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpOr8, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (Or8 x (Or8 z i:(Const8 ))) - // cond: (z.Op != OpConst8 && x.Op != OpConst8) - // result: (Or8 i (Or8 z x)) + // match: (NeqPtr (LocalAddr {a} _ _) (LocalAddr {b} _ _)) + // result: (ConstBool [b2i(a != b)]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpOr8 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpLocalAddr { + continue + } + a := v_0.Aux + _ = v_0.Args[1] + v_1 := v.Args[1^_i0] + if v_1.Op != OpLocalAddr { + continue + } + b := v_1.Aux + _ = v_1.Args[1] + v.reset(OpConstBool) + v.AuxInt = b2i(a != b) + return true } - _ = v_1.Args[1] - z := v_1.Args[0] - i := v_1.Args[1] - if i.Op != OpConst8 { - break + break + } + // match: (NeqPtr (LocalAddr {a} _ _) (OffPtr [o] (LocalAddr {b} _ _))) + // result: (ConstBool [b2i(a != b || o != 0)]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpLocalAddr { + continue + } + a := v_0.Aux + _ = v_0.Args[1] + v_1 := v.Args[1^_i0] + if v_1.Op != OpOffPtr { + continue + } + o := v_1.AuxInt + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpLocalAddr { + continue + } + b := v_1_0.Aux + _ = v_1_0.Args[1] + v.reset(OpConstBool) + v.AuxInt = b2i(a != b || o != 0) + return true } - t := i.Type - if !(z.Op != OpConst8 && x.Op != OpConst8) { - break + break + } + // match: (NeqPtr (OffPtr [o1] (LocalAddr {a} _ _)) (OffPtr [o2] (LocalAddr {b} _ _))) + // result: (ConstBool [b2i(a != b || o1 != o2)]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpOffPtr { + continue + } + o1 := v_0.AuxInt + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpLocalAddr { + continue + } + a := v_0_0.Aux + _ = v_0_0.Args[1] + v_1 := v.Args[1^_i0] + if v_1.Op != OpOffPtr { + continue + } + o2 := v_1.AuxInt + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpLocalAddr { + continue + } + b := v_1_0.Aux + _ = v_1_0.Args[1] + v.reset(OpConstBool) + v.AuxInt = b2i(a != b || o1 != o2) + return true } - v.reset(OpOr8) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpOr8, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (Or8 (Const8 [c]) (Or8 (Const8 [d]) x)) - // result: (Or8 (Const8 [int64(int8(c|d))]) x) + // match: (NeqPtr (OffPtr [o1] p1) p2) + // cond: isSamePtr(p1, p2) + // result: (ConstBool [b2i(o1 != 0)]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpOffPtr { + continue + } + o1 := v_0.AuxInt + p1 := v_0.Args[0] + p2 := v.Args[1^_i0] + if !(isSamePtr(p1, p2)) { + continue + } + v.reset(OpConstBool) + v.AuxInt = b2i(o1 != 0) + return true } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpOr8 { - break + break + } + // match: (NeqPtr (OffPtr [o1] p1) (OffPtr [o2] p2)) + // cond: isSamePtr(p1, p2) + // result: (ConstBool [b2i(o1 != o2)]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpOffPtr { + continue + } + o1 := v_0.AuxInt + p1 := v_0.Args[0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpOffPtr { + continue + } + o2 := v_1.AuxInt + p2 := v_1.Args[0] + if !(isSamePtr(p1, p2)) { + continue + } + v.reset(OpConstBool) + v.AuxInt = b2i(o1 != o2) + return true } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst8 || v_1_0.Type != t { - break + break + } + // match: (NeqPtr (Const32 [c]) (Const32 [d])) + // result: (ConstBool [b2i(c != d)]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst32 { + continue + } + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c != d) + return true } - d := v_1_0.AuxInt - v.reset(OpOr8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c | d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } return false } -func rewriteValuegeneric_OpOr8_20(v *Value) bool { - b := v.Block - // match: (Or8 (Const8 [c]) (Or8 x (Const8 [d]))) - // result: (Or8 (Const8 [int64(int8(c|d))]) x) +func rewriteValuegeneric_OpNeqPtr_10(v *Value) bool { + // match: (NeqPtr (Const64 [c]) (Const64 [d])) + // result: (ConstBool [b2i(c != d)]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpOr8 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst8 || v_1_1.Type != t { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst64 { + continue + } + d := v_1.AuxInt + v.reset(OpConstBool) + v.AuxInt = b2i(c != d) + return true } - d := v_1_1.AuxInt - v.reset(OpOr8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c | d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (Or8 (Or8 (Const8 [d]) x) (Const8 [c])) - // result: (Or8 (Const8 [int64(int8(c|d))]) x) + // match: (NeqPtr (LocalAddr _ _) (Addr _)) + // result: (ConstBool [1]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOr8 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst8 { - break - } - t := v_0_0.Type - d := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.Type != t { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpLocalAddr { + continue + } + _ = v_0.Args[1] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAddr { + continue + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true } - c := v_1.AuxInt - v.reset(OpOr8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c | d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (Or8 (Or8 x (Const8 [d])) (Const8 [c])) - // result: (Or8 (Const8 [int64(int8(c|d))]) x) + // match: (NeqPtr (OffPtr (LocalAddr _ _)) (Addr _)) + // result: (ConstBool [1]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpOr8 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst8 { - break - } - t := v_0_1.Type - d := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.Type != t { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpOffPtr { + continue + } + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpLocalAddr { + continue + } + _ = v_0_0.Args[1] + v_1 := v.Args[1^_i0] + if v_1.Op != OpAddr { + continue + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true } - c := v_1.AuxInt - v.reset(OpOr8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c | d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } - return false -} -func rewriteValuegeneric_OpPhi_0(v *Value) bool { - // match: (Phi (Const8 [c]) (Const8 [c])) - // result: (Const8 [c]) + // match: (NeqPtr (LocalAddr _ _) (OffPtr (Addr _))) + // result: (ConstBool [1]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.AuxInt != c || len(v.Args) != 2 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpLocalAddr { + continue + } + _ = v_0.Args[1] + v_1 := v.Args[1^_i0] + if v_1.Op != OpOffPtr { + continue + } + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpAddr { + continue + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true } - v.reset(OpConst8) - v.AuxInt = c - return true + break } - // match: (Phi (Const16 [c]) (Const16 [c])) - // result: (Const16 [c]) + // match: (NeqPtr (OffPtr (LocalAddr _ _)) (OffPtr (Addr _))) + // result: (ConstBool [1]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.AuxInt != c || len(v.Args) != 2 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpOffPtr { + continue + } + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpLocalAddr { + continue + } + _ = v_0_0.Args[1] + v_1 := v.Args[1^_i0] + if v_1.Op != OpOffPtr { + continue + } + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpAddr { + continue + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true } - v.reset(OpConst16) - v.AuxInt = c - return true + break } - // match: (Phi (Const32 [c]) (Const32 [c])) - // result: (Const32 [c]) + // match: (NeqPtr (AddPtr p1 o1) p2) + // cond: isSamePtr(p1, p2) + // result: (IsNonNil o1) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAddPtr { + continue + } + o1 := v_0.Args[1] + p1 := v_0.Args[0] + p2 := v.Args[1^_i0] + if !(isSamePtr(p1, p2)) { + continue + } + v.reset(OpIsNonNil) + v.AddArg(o1) + return true } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.AuxInt != c || len(v.Args) != 2 { - break + break + } + // match: (NeqPtr (Const32 [0]) p) + // result: (IsNonNil p) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 || v_0.AuxInt != 0 { + continue + } + p := v.Args[1^_i0] + v.reset(OpIsNonNil) + v.AddArg(p) + return true } - v.reset(OpConst32) - v.AuxInt = c - return true + break } - // match: (Phi (Const64 [c]) (Const64 [c])) - // result: (Const64 [c]) + // match: (NeqPtr (Const64 [0]) p) + // result: (IsNonNil p) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 || v_0.AuxInt != 0 { + continue + } + p := v.Args[1^_i0] + v.reset(OpIsNonNil) + v.AddArg(p) + return true } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != c || len(v.Args) != 2 { - break + break + } + // match: (NeqPtr (ConstNil) p) + // result: (IsNonNil p) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConstNil { + continue + } + p := v.Args[1^_i0] + v.reset(OpIsNonNil) + v.AddArg(p) + return true } - v.reset(OpConst64) - v.AuxInt = c - return true + break } return false } -func rewriteValuegeneric_OpPtrIndex_0(v *Value) bool { +func rewriteValuegeneric_OpNeqSlice_0(v *Value) bool { b := v.Block - config := b.Func.Config typ := &b.Func.Config.Types - // match: (PtrIndex ptr idx) - // cond: config.PtrSize == 4 - // result: (AddPtr ptr (Mul32 idx (Const32 [t.Elem().Size()]))) - for { - t := v.Type - idx := v.Args[1] - ptr := v.Args[0] - if !(config.PtrSize == 4) { - break - } - v.reset(OpAddPtr) - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpMul32, typ.Int) - v0.AddArg(idx) - v1 := b.NewValue0(v.Pos, OpConst32, typ.Int) - v1.AuxInt = t.Elem().Size() - v0.AddArg(v1) - v.AddArg(v0) - return true - } - // match: (PtrIndex ptr idx) - // cond: config.PtrSize == 8 - // result: (AddPtr ptr (Mul64 idx (Const64 [t.Elem().Size()]))) + // match: (NeqSlice x y) + // result: (NeqPtr (SlicePtr x) (SlicePtr y)) for { - t := v.Type - idx := v.Args[1] - ptr := v.Args[0] - if !(config.PtrSize == 8) { - break - } - v.reset(OpAddPtr) - v.AddArg(ptr) - v0 := b.NewValue0(v.Pos, OpMul64, typ.Int) - v0.AddArg(idx) - v1 := b.NewValue0(v.Pos, OpConst64, typ.Int) - v1.AuxInt = t.Elem().Size() - v0.AddArg(v1) + y := v.Args[1] + x := v.Args[0] + v.reset(OpNeqPtr) + v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) + v0.AddArg(x) v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) + v1.AddArg(y) + v.AddArg(v1) return true } - return false } -func rewriteValuegeneric_OpRotateLeft16_0(v *Value) bool { - // match: (RotateLeft16 x (Const16 [c])) - // cond: c%16 == 0 - // result: x +func rewriteValuegeneric_OpNilCheck_0(v *Value) bool { + b := v.Block + config := b.Func.Config + fe := b.Func.fe + // match: (NilCheck (GetG mem) mem) + // result: mem for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - c := v_1.AuxInt - if !(c%16 == 0) { + mem := v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpGetG || mem != v_0.Args[0] { break } v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + v.Type = mem.Type + v.AddArg(mem) return true } - return false -} -func rewriteValuegeneric_OpRotateLeft32_0(v *Value) bool { - // match: (RotateLeft32 x (Const32 [c])) - // cond: c%32 == 0 - // result: x + // match: (NilCheck (Load (OffPtr [c] (SP)) (StaticCall {sym} _)) _) + // cond: isSameSym(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize && warnRule(fe.Debug_checknil(), v, "removed nil check") + // result: (Invalid) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 { + v_0 := v.Args[0] + if v_0.Op != OpLoad { break } - c := v_1.AuxInt - if !(c%32 == 0) { + _ = v_0.Args[1] + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpOffPtr { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - return false -} -func rewriteValuegeneric_OpRotateLeft64_0(v *Value) bool { - // match: (RotateLeft64 x (Const64 [c])) - // cond: c%64 == 0 - // result: x - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 { + c := v_0_0.AuxInt + v_0_0_0 := v_0_0.Args[0] + if v_0_0_0.Op != OpSP { break } - c := v_1.AuxInt - if !(c%64 == 0) { + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpStaticCall { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + sym := v_0_1.Aux + if !(isSameSym(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize && warnRule(fe.Debug_checknil(), v, "removed nil check")) { + break + } + v.reset(OpInvalid) return true } - return false -} -func rewriteValuegeneric_OpRotateLeft8_0(v *Value) bool { - // match: (RotateLeft8 x (Const8 [c])) - // cond: c%8 == 0 - // result: x + // match: (NilCheck (OffPtr (Load (OffPtr [c] (SP)) (StaticCall {sym} _))) _) + // cond: isSameSym(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize && warnRule(fe.Debug_checknil(), v, "removed nil check") + // result: (Invalid) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst8 { + v_0 := v.Args[0] + if v_0.Op != OpOffPtr { break } - c := v_1.AuxInt - if !(c%8 == 0) { + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpLoad { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + _ = v_0_0.Args[1] + v_0_0_0 := v_0_0.Args[0] + if v_0_0_0.Op != OpOffPtr { + break + } + c := v_0_0_0.AuxInt + v_0_0_0_0 := v_0_0_0.Args[0] + if v_0_0_0_0.Op != OpSP { + break + } + v_0_0_1 := v_0_0.Args[1] + if v_0_0_1.Op != OpStaticCall { + break + } + sym := v_0_0_1.Aux + if !(isSameSym(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize && warnRule(fe.Debug_checknil(), v, "removed nil check")) { + break + } + v.reset(OpInvalid) return true } return false } -func rewriteValuegeneric_OpRound32F_0(v *Value) bool { - // match: (Round32F x:(Const32F)) - // result: x +func rewriteValuegeneric_OpNot_0(v *Value) bool { + // match: (Not (ConstBool [c])) + // result: (ConstBool [1-c]) for { - x := v.Args[0] - if x.Op != OpConst32F { + v_0 := v.Args[0] + if v_0.Op != OpConstBool { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + c := v_0.AuxInt + v.reset(OpConstBool) + v.AuxInt = 1 - c return true } - return false -} -func rewriteValuegeneric_OpRound64F_0(v *Value) bool { - // match: (Round64F x:(Const64F)) - // result: x + // match: (Not (Eq64 x y)) + // result: (Neq64 x y) for { - x := v.Args[0] - if x.Op != OpConst64F { + v_0 := v.Args[0] + if v_0.Op != OpEq64 { break } - v.reset(OpCopy) - v.Type = x.Type + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpNeq64) v.AddArg(x) + v.AddArg(y) return true } - return false -} -func rewriteValuegeneric_OpRsh16Ux16_0(v *Value) bool { - b := v.Block - // match: (Rsh16Ux16 x (Const16 [c])) - // result: (Rsh16Ux64 x (Const64 [int64(uint16(c))])) + // match: (Not (Eq32 x y)) + // result: (Neq32 x y) for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst16 { + v_0 := v.Args[0] + if v_0.Op != OpEq32 { break } - c := v_1.AuxInt - v.reset(OpRsh16Ux64) + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpNeq32) v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint16(c)) - v.AddArg(v0) + v.AddArg(y) return true } - // match: (Rsh16Ux16 (Const16 [0]) _) - // result: (Const16 [0]) + // match: (Not (Eq16 x y)) + // result: (Neq16 x y) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst16 || v_0.AuxInt != 0 { + if v_0.Op != OpEq16 { break } - v.reset(OpConst16) - v.AuxInt = 0 + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpNeq16) + v.AddArg(x) + v.AddArg(y) return true } - return false -} -func rewriteValuegeneric_OpRsh16Ux32_0(v *Value) bool { - b := v.Block - // match: (Rsh16Ux32 x (Const32 [c])) - // result: (Rsh16Ux64 x (Const64 [int64(uint32(c))])) + // match: (Not (Eq8 x y)) + // result: (Neq8 x y) for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 { + v_0 := v.Args[0] + if v_0.Op != OpEq8 { break } - c := v_1.AuxInt - v.reset(OpRsh16Ux64) + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpNeq8) v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint32(c)) - v.AddArg(v0) + v.AddArg(y) return true } - // match: (Rsh16Ux32 (Const16 [0]) _) - // result: (Const16 [0]) + // match: (Not (EqB x y)) + // result: (NeqB x y) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst16 || v_0.AuxInt != 0 { + if v_0.Op != OpEqB { break } - v.reset(OpConst16) - v.AuxInt = 0 + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpNeqB) + v.AddArg(x) + v.AddArg(y) return true } - return false -} -func rewriteValuegeneric_OpRsh16Ux64_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Rsh16Ux64 (Const16 [c]) (Const64 [d])) - // result: (Const16 [int64(int16(uint16(c) >> uint64(d)))]) + // match: (Not (EqPtr x y)) + // result: (NeqPtr x y) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { + if v_0.Op != OpEqPtr { break } - d := v_1.AuxInt - v.reset(OpConst16) - v.AuxInt = int64(int16(uint16(c) >> uint64(d))) + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpNeqPtr) + v.AddArg(x) + v.AddArg(y) return true } - // match: (Rsh16Ux64 x (Const64 [0])) - // result: x + // match: (Not (Eq64F x y)) + // result: (Neq64F x y) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 0 { + v_0 := v.Args[0] + if v_0.Op != OpEq64F { break } - v.reset(OpCopy) - v.Type = x.Type + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpNeq64F) v.AddArg(x) + v.AddArg(y) return true } - // match: (Rsh16Ux64 (Const16 [0]) _) - // result: (Const16 [0]) + // match: (Not (Eq32F x y)) + // result: (Neq32F x y) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst16 || v_0.AuxInt != 0 { + if v_0.Op != OpEq32F { break } - v.reset(OpConst16) - v.AuxInt = 0 + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpNeq32F) + v.AddArg(x) + v.AddArg(y) return true } - // match: (Rsh16Ux64 _ (Const64 [c])) - // cond: uint64(c) >= 16 - // result: (Const16 [0]) + // match: (Not (Neq64 x y)) + // result: (Eq64 x y) for { - _ = v.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c := v_1.AuxInt - if !(uint64(c) >= 16) { + v_0 := v.Args[0] + if v_0.Op != OpNeq64 { break } - v.reset(OpConst16) - v.AuxInt = 0 + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpEq64) + v.AddArg(x) + v.AddArg(y) return true } - // match: (Rsh16Ux64 (Rsh16Ux64 x (Const64 [c])) (Const64 [d])) - // cond: !uaddOvf(c,d) - // result: (Rsh16Ux64 x (Const64 [c+d])) + return false +} +func rewriteValuegeneric_OpNot_10(v *Value) bool { + // match: (Not (Neq32 x y)) + // result: (Eq32 x y) for { - t := v.Type - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpRsh16Ux64 { + if v_0.Op != OpNeq32 { break } - _ = v_0.Args[1] + y := v_0.Args[1] x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - if !(!uaddOvf(c, d)) { - break - } - v.reset(OpRsh16Ux64) + v.reset(OpEq32) v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c + d - v.AddArg(v0) + v.AddArg(y) return true } - // match: (Rsh16Ux64 (Rsh16x64 x _) (Const64 [15])) - // result: (Rsh16Ux64 x (Const64 [15])) + // match: (Not (Neq16 x y)) + // result: (Eq16 x y) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpRsh16x64 { + if v_0.Op != OpNeq16 { break } - _ = v_0.Args[1] + y := v_0.Args[1] x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - t := v_1.Type - if v_1.AuxInt != 15 { - break - } - v.reset(OpRsh16Ux64) + v.reset(OpEq16) v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = 15 - v.AddArg(v0) + v.AddArg(y) return true } - // match: (Rsh16Ux64 (Lsh16x64 (Rsh16Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) - // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) - // result: (Rsh16Ux64 x (Const64 [c1-c2+c3])) + // match: (Not (Neq8 x y)) + // result: (Eq8 x y) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpLsh16x64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh16Ux64 { - break - } - _ = v_0_0.Args[1] - x := v_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 { - break - } - c1 := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c2 := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c3 := v_1.AuxInt - if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { + if v_0.Op != OpNeq8 { break } - v.reset(OpRsh16Ux64) + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpEq8) v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v0.AuxInt = c1 - c2 + c3 - v.AddArg(v0) + v.AddArg(y) return true } - // match: (Rsh16Ux64 (Lsh16x64 x (Const64 [8])) (Const64 [8])) - // result: (ZeroExt8to16 (Trunc16to8 x)) + // match: (Not (NeqB x y)) + // result: (EqB x y) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpLsh16x64 { + if v_0.Op != OpNeqB { break } - _ = v_0.Args[1] + y := v_0.Args[1] x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.AuxInt != 8 { + v.reset(OpEqB) + v.AddArg(x) + v.AddArg(y) + return true + } + // match: (Not (NeqPtr x y)) + // result: (EqPtr x y) + for { + v_0 := v.Args[0] + if v_0.Op != OpNeqPtr { break } - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 8 { + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpEqPtr) + v.AddArg(x) + v.AddArg(y) + return true + } + // match: (Not (Neq64F x y)) + // result: (Eq64F x y) + for { + v_0 := v.Args[0] + if v_0.Op != OpNeq64F { break } - v.reset(OpZeroExt8to16) - v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.UInt8) - v0.AddArg(x) - v.AddArg(v0) + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpEq64F) + v.AddArg(x) + v.AddArg(y) return true } - return false -} -func rewriteValuegeneric_OpRsh16Ux8_0(v *Value) bool { - b := v.Block - // match: (Rsh16Ux8 x (Const8 [c])) - // result: (Rsh16Ux64 x (Const64 [int64(uint8(c))])) + // match: (Not (Neq32F x y)) + // result: (Eq32F x y) for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst8 { + v_0 := v.Args[0] + if v_0.Op != OpNeq32F { break } - c := v_1.AuxInt - v.reset(OpRsh16Ux64) + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpEq32F) v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint8(c)) - v.AddArg(v0) + v.AddArg(y) return true } - // match: (Rsh16Ux8 (Const16 [0]) _) - // result: (Const16 [0]) + // match: (Not (Greater64 x y)) + // result: (Leq64 x y) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst16 || v_0.AuxInt != 0 { + if v_0.Op != OpGreater64 { break } - v.reset(OpConst16) - v.AuxInt = 0 + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpLeq64) + v.AddArg(x) + v.AddArg(y) return true } - return false -} -func rewriteValuegeneric_OpRsh16x16_0(v *Value) bool { - b := v.Block - // match: (Rsh16x16 x (Const16 [c])) - // result: (Rsh16x64 x (Const64 [int64(uint16(c))])) + // match: (Not (Greater32 x y)) + // result: (Leq32 x y) for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst16 { + v_0 := v.Args[0] + if v_0.Op != OpGreater32 { break } - c := v_1.AuxInt - v.reset(OpRsh16x64) + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpLeq32) v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint16(c)) - v.AddArg(v0) + v.AddArg(y) return true } - // match: (Rsh16x16 (Const16 [0]) _) - // result: (Const16 [0]) + // match: (Not (Greater16 x y)) + // result: (Leq16 x y) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst16 || v_0.AuxInt != 0 { + if v_0.Op != OpGreater16 { break } - v.reset(OpConst16) - v.AuxInt = 0 + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpLeq16) + v.AddArg(x) + v.AddArg(y) return true } return false } -func rewriteValuegeneric_OpRsh16x32_0(v *Value) bool { - b := v.Block - // match: (Rsh16x32 x (Const32 [c])) - // result: (Rsh16x64 x (Const64 [int64(uint32(c))])) +func rewriteValuegeneric_OpNot_20(v *Value) bool { + // match: (Not (Greater8 x y)) + // result: (Leq8 x y) for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 { + v_0 := v.Args[0] + if v_0.Op != OpGreater8 { break } - c := v_1.AuxInt - v.reset(OpRsh16x64) + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpLeq8) v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint32(c)) - v.AddArg(v0) + v.AddArg(y) return true } - // match: (Rsh16x32 (Const16 [0]) _) - // result: (Const16 [0]) + // match: (Not (Greater64U x y)) + // result: (Leq64U x y) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst16 || v_0.AuxInt != 0 { + if v_0.Op != OpGreater64U { break } - v.reset(OpConst16) - v.AuxInt = 0 + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpLeq64U) + v.AddArg(x) + v.AddArg(y) return true } - return false -} -func rewriteValuegeneric_OpRsh16x64_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Rsh16x64 (Const16 [c]) (Const64 [d])) - // result: (Const16 [int64(int16(c) >> uint64(d))]) + // match: (Not (Greater32U x y)) + // result: (Leq32U x y) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { + if v_0.Op != OpGreater32U { break } - d := v_1.AuxInt - v.reset(OpConst16) - v.AuxInt = int64(int16(c) >> uint64(d)) + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpLeq32U) + v.AddArg(x) + v.AddArg(y) return true } - // match: (Rsh16x64 x (Const64 [0])) - // result: x + // match: (Not (Greater16U x y)) + // result: (Leq16U x y) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 0 { + v_0 := v.Args[0] + if v_0.Op != OpGreater16U { break } - v.reset(OpCopy) - v.Type = x.Type + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpLeq16U) v.AddArg(x) + v.AddArg(y) return true } - // match: (Rsh16x64 (Const16 [0]) _) - // result: (Const16 [0]) + // match: (Not (Greater8U x y)) + // result: (Leq8U x y) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst16 || v_0.AuxInt != 0 { + if v_0.Op != OpGreater8U { break } - v.reset(OpConst16) - v.AuxInt = 0 + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpLeq8U) + v.AddArg(x) + v.AddArg(y) return true } - // match: (Rsh16x64 (Rsh16x64 x (Const64 [c])) (Const64 [d])) - // cond: !uaddOvf(c,d) - // result: (Rsh16x64 x (Const64 [c+d])) + // match: (Not (Geq64 x y)) + // result: (Less64 x y) for { - t := v.Type - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpRsh16x64 { + if v_0.Op != OpGeq64 { break } - _ = v_0.Args[1] + y := v_0.Args[1] x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - if !(!uaddOvf(c, d)) { - break - } - v.reset(OpRsh16x64) + v.reset(OpLess64) v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c + d - v.AddArg(v0) + v.AddArg(y) return true } - // match: (Rsh16x64 (Lsh16x64 x (Const64 [8])) (Const64 [8])) - // result: (SignExt8to16 (Trunc16to8 x)) + // match: (Not (Geq32 x y)) + // result: (Less32 x y) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpLsh16x64 { + if v_0.Op != OpGeq32 { break } - _ = v_0.Args[1] + y := v_0.Args[1] x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.AuxInt != 8 { - break - } - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 8 { + v.reset(OpLess32) + v.AddArg(x) + v.AddArg(y) + return true + } + // match: (Not (Geq16 x y)) + // result: (Less16 x y) + for { + v_0 := v.Args[0] + if v_0.Op != OpGeq16 { break } - v.reset(OpSignExt8to16) - v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.Int8) - v0.AddArg(x) - v.AddArg(v0) + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpLess16) + v.AddArg(x) + v.AddArg(y) return true } - return false -} -func rewriteValuegeneric_OpRsh16x8_0(v *Value) bool { - b := v.Block - // match: (Rsh16x8 x (Const8 [c])) - // result: (Rsh16x64 x (Const64 [int64(uint8(c))])) + // match: (Not (Geq8 x y)) + // result: (Less8 x y) for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst8 { + v_0 := v.Args[0] + if v_0.Op != OpGeq8 { break } - c := v_1.AuxInt - v.reset(OpRsh16x64) + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpLess8) v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint8(c)) - v.AddArg(v0) + v.AddArg(y) return true } - // match: (Rsh16x8 (Const16 [0]) _) - // result: (Const16 [0]) + // match: (Not (Geq64U x y)) + // result: (Less64U x y) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst16 || v_0.AuxInt != 0 { + if v_0.Op != OpGeq64U { break } - v.reset(OpConst16) - v.AuxInt = 0 + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpLess64U) + v.AddArg(x) + v.AddArg(y) return true } return false } -func rewriteValuegeneric_OpRsh32Ux16_0(v *Value) bool { - b := v.Block - // match: (Rsh32Ux16 x (Const16 [c])) - // result: (Rsh32Ux64 x (Const64 [int64(uint16(c))])) +func rewriteValuegeneric_OpNot_30(v *Value) bool { + // match: (Not (Geq32U x y)) + // result: (Less32U x y) for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst16 { + v_0 := v.Args[0] + if v_0.Op != OpGeq32U { break } - c := v_1.AuxInt - v.reset(OpRsh32Ux64) + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpLess32U) v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint16(c)) - v.AddArg(v0) + v.AddArg(y) return true } - // match: (Rsh32Ux16 (Const32 [0]) _) - // result: (Const32 [0]) + // match: (Not (Geq16U x y)) + // result: (Less16U x y) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst32 || v_0.AuxInt != 0 { + if v_0.Op != OpGeq16U { break } - v.reset(OpConst32) - v.AuxInt = 0 + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpLess16U) + v.AddArg(x) + v.AddArg(y) return true } - return false -} -func rewriteValuegeneric_OpRsh32Ux32_0(v *Value) bool { - b := v.Block - // match: (Rsh32Ux32 x (Const32 [c])) - // result: (Rsh32Ux64 x (Const64 [int64(uint32(c))])) + // match: (Not (Geq8U x y)) + // result: (Less8U x y) for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 { + v_0 := v.Args[0] + if v_0.Op != OpGeq8U { break } - c := v_1.AuxInt - v.reset(OpRsh32Ux64) + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpLess8U) v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint32(c)) - v.AddArg(v0) + v.AddArg(y) return true } - // match: (Rsh32Ux32 (Const32 [0]) _) - // result: (Const32 [0]) + // match: (Not (Less64 x y)) + // result: (Geq64 x y) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst32 || v_0.AuxInt != 0 { + if v_0.Op != OpLess64 { break } - v.reset(OpConst32) - v.AuxInt = 0 + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpGeq64) + v.AddArg(x) + v.AddArg(y) return true } - return false -} -func rewriteValuegeneric_OpRsh32Ux64_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Rsh32Ux64 (Const32 [c]) (Const64 [d])) - // result: (Const32 [int64(int32(uint32(c) >> uint64(d)))]) + // match: (Not (Less32 x y)) + // result: (Geq32 x y) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { + if v_0.Op != OpLess32 { break } - d := v_1.AuxInt - v.reset(OpConst32) - v.AuxInt = int64(int32(uint32(c) >> uint64(d))) + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpGeq32) + v.AddArg(x) + v.AddArg(y) return true } - // match: (Rsh32Ux64 x (Const64 [0])) - // result: x + // match: (Not (Less16 x y)) + // result: (Geq16 x y) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 0 { + v_0 := v.Args[0] + if v_0.Op != OpLess16 { break } - v.reset(OpCopy) - v.Type = x.Type + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpGeq16) v.AddArg(x) + v.AddArg(y) return true } - // match: (Rsh32Ux64 (Const32 [0]) _) - // result: (Const32 [0]) + // match: (Not (Less8 x y)) + // result: (Geq8 x y) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst32 || v_0.AuxInt != 0 { + if v_0.Op != OpLess8 { break } - v.reset(OpConst32) - v.AuxInt = 0 + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpGeq8) + v.AddArg(x) + v.AddArg(y) return true } - // match: (Rsh32Ux64 _ (Const64 [c])) - // cond: uint64(c) >= 32 - // result: (Const32 [0]) + // match: (Not (Less64U x y)) + // result: (Geq64U x y) for { - _ = v.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c := v_1.AuxInt - if !(uint64(c) >= 32) { + v_0 := v.Args[0] + if v_0.Op != OpLess64U { break } - v.reset(OpConst32) - v.AuxInt = 0 + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpGeq64U) + v.AddArg(x) + v.AddArg(y) return true } - // match: (Rsh32Ux64 (Rsh32Ux64 x (Const64 [c])) (Const64 [d])) - // cond: !uaddOvf(c,d) - // result: (Rsh32Ux64 x (Const64 [c+d])) + // match: (Not (Less32U x y)) + // result: (Geq32U x y) for { - t := v.Type - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpRsh32Ux64 { + if v_0.Op != OpLess32U { break } - _ = v_0.Args[1] + y := v_0.Args[1] x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - if !(!uaddOvf(c, d)) { - break - } - v.reset(OpRsh32Ux64) + v.reset(OpGeq32U) v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c + d - v.AddArg(v0) + v.AddArg(y) return true } - // match: (Rsh32Ux64 (Rsh32x64 x _) (Const64 [31])) - // result: (Rsh32Ux64 x (Const64 [31])) + // match: (Not (Less16U x y)) + // result: (Geq16U x y) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpRsh32x64 { + if v_0.Op != OpLess16U { break } - _ = v_0.Args[1] + y := v_0.Args[1] x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - t := v_1.Type - if v_1.AuxInt != 31 { - break - } - v.reset(OpRsh32Ux64) + v.reset(OpGeq16U) v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = 31 - v.AddArg(v0) + v.AddArg(y) return true } - // match: (Rsh32Ux64 (Lsh32x64 (Rsh32Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) - // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) - // result: (Rsh32Ux64 x (Const64 [c1-c2+c3])) + return false +} +func rewriteValuegeneric_OpNot_40(v *Value) bool { + // match: (Not (Less8U x y)) + // result: (Geq8U x y) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpLsh32x64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh32Ux64 { - break - } - _ = v_0_0.Args[1] - x := v_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 { - break - } - c1 := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c2 := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c3 := v_1.AuxInt - if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { + if v_0.Op != OpLess8U { break } - v.reset(OpRsh32Ux64) + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpGeq8U) v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v0.AuxInt = c1 - c2 + c3 - v.AddArg(v0) + v.AddArg(y) return true } - // match: (Rsh32Ux64 (Lsh32x64 x (Const64 [24])) (Const64 [24])) - // result: (ZeroExt8to32 (Trunc32to8 x)) + // match: (Not (Leq64 x y)) + // result: (Greater64 x y) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpLsh32x64 { + if v_0.Op != OpLeq64 { break } - _ = v_0.Args[1] + y := v_0.Args[1] x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.AuxInt != 24 { - break - } - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 24 { - break - } - v.reset(OpZeroExt8to32) - v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.UInt8) - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpGreater64) + v.AddArg(x) + v.AddArg(y) return true } - // match: (Rsh32Ux64 (Lsh32x64 x (Const64 [16])) (Const64 [16])) - // result: (ZeroExt16to32 (Trunc32to16 x)) + // match: (Not (Leq32 x y)) + // result: (Greater32 x y) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpLsh32x64 { + if v_0.Op != OpLeq32 { break } - _ = v_0.Args[1] + y := v_0.Args[1] x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.AuxInt != 16 { + v.reset(OpGreater32) + v.AddArg(x) + v.AddArg(y) + return true + } + // match: (Not (Leq16 x y)) + // result: (Greater16 x y) + for { + v_0 := v.Args[0] + if v_0.Op != OpLeq16 { break } - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 16 { + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpGreater16) + v.AddArg(x) + v.AddArg(y) + return true + } + // match: (Not (Leq8 x y)) + // result: (Greater8 x y) + for { + v_0 := v.Args[0] + if v_0.Op != OpLeq8 { break } - v.reset(OpZeroExt16to32) - v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.UInt16) - v0.AddArg(x) - v.AddArg(v0) + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpGreater8) + v.AddArg(x) + v.AddArg(y) return true } - return false -} -func rewriteValuegeneric_OpRsh32Ux8_0(v *Value) bool { - b := v.Block - // match: (Rsh32Ux8 x (Const8 [c])) - // result: (Rsh32Ux64 x (Const64 [int64(uint8(c))])) + // match: (Not (Leq64U x y)) + // result: (Greater64U x y) for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst8 { + v_0 := v.Args[0] + if v_0.Op != OpLeq64U { break } - c := v_1.AuxInt - v.reset(OpRsh32Ux64) + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpGreater64U) v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint8(c)) - v.AddArg(v0) + v.AddArg(y) return true } - // match: (Rsh32Ux8 (Const32 [0]) _) - // result: (Const32 [0]) + // match: (Not (Leq32U x y)) + // result: (Greater32U x y) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst32 || v_0.AuxInt != 0 { + if v_0.Op != OpLeq32U { break } - v.reset(OpConst32) - v.AuxInt = 0 + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpGreater32U) + v.AddArg(x) + v.AddArg(y) return true } - return false -} -func rewriteValuegeneric_OpRsh32x16_0(v *Value) bool { - b := v.Block - // match: (Rsh32x16 x (Const16 [c])) - // result: (Rsh32x64 x (Const64 [int64(uint16(c))])) + // match: (Not (Leq16U x y)) + // result: (Greater16U x y) for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst16 { + v_0 := v.Args[0] + if v_0.Op != OpLeq16U { break } - c := v_1.AuxInt - v.reset(OpRsh32x64) + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpGreater16U) v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint16(c)) - v.AddArg(v0) + v.AddArg(y) return true } - // match: (Rsh32x16 (Const32 [0]) _) - // result: (Const32 [0]) + // match: (Not (Leq8U x y)) + // result: (Greater8U x y) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst32 || v_0.AuxInt != 0 { + if v_0.Op != OpLeq8U { break } - v.reset(OpConst32) - v.AuxInt = 0 + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpGreater8U) + v.AddArg(x) + v.AddArg(y) return true } return false } -func rewriteValuegeneric_OpRsh32x32_0(v *Value) bool { - b := v.Block - // match: (Rsh32x32 x (Const32 [c])) - // result: (Rsh32x64 x (Const64 [int64(uint32(c))])) +func rewriteValuegeneric_OpOffPtr_0(v *Value) bool { + // match: (OffPtr (OffPtr p [b]) [a]) + // result: (OffPtr p [a+b]) for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 { + a := v.AuxInt + v_0 := v.Args[0] + if v_0.Op != OpOffPtr { break } - c := v_1.AuxInt - v.reset(OpRsh32x64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint32(c)) - v.AddArg(v0) + b := v_0.AuxInt + p := v_0.Args[0] + v.reset(OpOffPtr) + v.AuxInt = a + b + v.AddArg(p) return true } - // match: (Rsh32x32 (Const32 [0]) _) - // result: (Const32 [0]) + // match: (OffPtr p [0]) + // cond: v.Type.Compare(p.Type) == types.CMPeq + // result: p for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 || v_0.AuxInt != 0 { + if v.AuxInt != 0 { break } - v.reset(OpConst32) - v.AuxInt = 0 + p := v.Args[0] + if !(v.Type.Compare(p.Type) == types.CMPeq) { + break + } + v.reset(OpCopy) + v.Type = p.Type + v.AddArg(p) return true } return false } -func rewriteValuegeneric_OpRsh32x64_0(v *Value) bool { +func rewriteValuegeneric_OpOr16_0(v *Value) bool { b := v.Block - typ := &b.Func.Config.Types - // match: (Rsh32x64 (Const32 [c]) (Const64 [d])) - // result: (Const32 [int64(int32(c) >> uint64(d))]) + // match: (Or16 (Const16 [c]) (Const16 [d])) + // result: (Const16 [int64(int16(c|d))]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst16 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst16 { + continue + } + d := v_1.AuxInt + v.reset(OpConst16) + v.AuxInt = int64(int16(c | d)) + return true } - d := v_1.AuxInt - v.reset(OpConst32) - v.AuxInt = int64(int32(c) >> uint64(d)) - return true + break } - // match: (Rsh32x64 x (Const64 [0])) + // match: (Or16 x x) // result: x for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 0 { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpCopy) @@ -41221,230 +17365,391 @@ func rewriteValuegeneric_OpRsh32x64_0(v *Value) bool { v.AddArg(x) return true } - // match: (Rsh32x64 (Const32 [0]) _) - // result: (Const32 [0]) + // match: (Or16 (Const16 [0]) x) + // result: x for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 || v_0.AuxInt != 0 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst16 || v_0.AuxInt != 0 { + continue + } + x := v.Args[1^_i0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - v.reset(OpConst32) - v.AuxInt = 0 - return true + break } - // match: (Rsh32x64 (Rsh32x64 x (Const64 [c])) (Const64 [d])) - // cond: !uaddOvf(c,d) - // result: (Rsh32x64 x (Const64 [c+d])) + // match: (Or16 (Const16 [-1]) _) + // result: (Const16 [-1]) for { - t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpRsh32x64 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - d := v_1.AuxInt - if !(!uaddOvf(c, d)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst16 || v_0.AuxInt != -1 { + continue + } + v.reset(OpConst16) + v.AuxInt = -1 + return true } - v.reset(OpRsh32x64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c + d - v.AddArg(v0) - return true + break } - // match: (Rsh32x64 (Lsh32x64 x (Const64 [24])) (Const64 [24])) - // result: (SignExt8to32 (Trunc32to8 x)) + // match: (Or16 x (Or16 x y)) + // result: (Or16 x y) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh32x64 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.AuxInt != 24 { - break - } - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 24 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpOr16 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + if x != v_1.Args[_i1] { + continue + } + y := v_1.Args[1^_i1] + v.reset(OpOr16) + v.AddArg(x) + v.AddArg(y) + return true + } } - v.reset(OpSignExt8to32) - v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.Int8) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (Rsh32x64 (Lsh32x64 x (Const64 [16])) (Const64 [16])) - // result: (SignExt16to32 (Trunc32to16 x)) + // match: (Or16 (And16 x (Const16 [c2])) (Const16 [c1])) + // cond: ^(c1 | c2) == 0 + // result: (Or16 (Const16 [c1]) x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh32x64 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.AuxInt != 16 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAnd16 { + continue + } + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + x := v_0.Args[_i1] + v_0_1 := v_0.Args[1^_i1] + if v_0_1.Op != OpConst16 { + continue + } + c2 := v_0_1.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst16 { + continue + } + t := v_1.Type + c1 := v_1.AuxInt + if !(^(c1 | c2) == 0) { + continue + } + v.reset(OpOr16) + v0 := b.NewValue0(v.Pos, OpConst16, t) + v0.AuxInt = c1 + v.AddArg(v0) + v.AddArg(x) + return true + } } - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 16 { - break + break + } + // match: (Or16 (Or16 i:(Const16 ) z) x) + // cond: (z.Op != OpConst16 && x.Op != OpConst16) + // result: (Or16 i (Or16 z x)) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpOr16 { + continue + } + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + i := v_0.Args[_i1] + if i.Op != OpConst16 { + continue + } + t := i.Type + z := v_0.Args[1^_i1] + x := v.Args[1^_i0] + if !(z.Op != OpConst16 && x.Op != OpConst16) { + continue + } + v.reset(OpOr16) + v.AddArg(i) + v0 := b.NewValue0(v.Pos, OpOr16, t) + v0.AddArg(z) + v0.AddArg(x) + v.AddArg(v0) + return true + } } - v.reset(OpSignExt16to32) - v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.Int16) - v0.AddArg(x) - v.AddArg(v0) - return true + break + } + // match: (Or16 (Const16 [c]) (Or16 (Const16 [d]) x)) + // result: (Or16 (Const16 [int64(int16(c|d))]) x) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst16 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpOr16 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst16 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpOr16) + v0 := b.NewValue0(v.Pos, OpConst16, t) + v0.AuxInt = int64(int16(c | d)) + v.AddArg(v0) + v.AddArg(x) + return true + } + } + break } return false } -func rewriteValuegeneric_OpRsh32x8_0(v *Value) bool { +func rewriteValuegeneric_OpOr32_0(v *Value) bool { b := v.Block - // match: (Rsh32x8 x (Const8 [c])) - // result: (Rsh32x64 x (Const64 [int64(uint8(c))])) + // match: (Or32 (Const32 [c]) (Const32 [d])) + // result: (Const32 [int64(int32(c|d))]) for { - t := v.Type _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst8 { + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst32 { + continue + } + d := v_1.AuxInt + v.reset(OpConst32) + v.AuxInt = int64(int32(c | d)) + return true + } + break + } + // match: (Or32 x x) + // result: x + for { + x := v.Args[1] + if x != v.Args[0] { break } - c := v_1.AuxInt - v.reset(OpRsh32x64) + v.reset(OpCopy) + v.Type = x.Type v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint8(c)) - v.AddArg(v0) return true } - // match: (Rsh32x8 (Const32 [0]) _) - // result: (Const32 [0]) + // match: (Or32 (Const32 [0]) x) + // result: x for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 || v_0.AuxInt != 0 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 || v_0.AuxInt != 0 { + continue + } + x := v.Args[1^_i0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - v.reset(OpConst32) - v.AuxInt = 0 - return true + break } - return false -} -func rewriteValuegeneric_OpRsh64Ux16_0(v *Value) bool { - b := v.Block - // match: (Rsh64Ux16 x (Const16 [c])) - // result: (Rsh64Ux64 x (Const64 [int64(uint16(c))])) + // match: (Or32 (Const32 [-1]) _) + // result: (Const32 [-1]) for { - t := v.Type _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 || v_0.AuxInt != -1 { + continue + } + v.reset(OpConst32) + v.AuxInt = -1 + return true } - c := v_1.AuxInt - v.reset(OpRsh64Ux64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint16(c)) - v.AddArg(v0) - return true + break } - // match: (Rsh64Ux16 (Const64 [0]) _) - // result: (Const64 [0]) + // match: (Or32 x (Or32 x y)) + // result: (Or32 x y) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 || v_0.AuxInt != 0 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpOr32 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + if x != v_1.Args[_i1] { + continue + } + y := v_1.Args[1^_i1] + v.reset(OpOr32) + v.AddArg(x) + v.AddArg(y) + return true + } } - v.reset(OpConst64) - v.AuxInt = 0 - return true + break } - return false -} -func rewriteValuegeneric_OpRsh64Ux32_0(v *Value) bool { - b := v.Block - // match: (Rsh64Ux32 x (Const32 [c])) - // result: (Rsh64Ux64 x (Const64 [int64(uint32(c))])) + // match: (Or32 (And32 x (Const32 [c2])) (Const32 [c1])) + // cond: ^(c1 | c2) == 0 + // result: (Or32 (Const32 [c1]) x) for { - t := v.Type _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAnd32 { + continue + } + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + x := v_0.Args[_i1] + v_0_1 := v_0.Args[1^_i1] + if v_0_1.Op != OpConst32 { + continue + } + c2 := v_0_1.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst32 { + continue + } + t := v_1.Type + c1 := v_1.AuxInt + if !(^(c1 | c2) == 0) { + continue + } + v.reset(OpOr32) + v0 := b.NewValue0(v.Pos, OpConst32, t) + v0.AuxInt = c1 + v.AddArg(v0) + v.AddArg(x) + return true + } } - c := v_1.AuxInt - v.reset(OpRsh64Ux64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint32(c)) - v.AddArg(v0) - return true + break } - // match: (Rsh64Ux32 (Const64 [0]) _) - // result: (Const64 [0]) + // match: (Or32 (Or32 i:(Const32 ) z) x) + // cond: (z.Op != OpConst32 && x.Op != OpConst32) + // result: (Or32 i (Or32 z x)) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 || v_0.AuxInt != 0 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpOr32 { + continue + } + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + i := v_0.Args[_i1] + if i.Op != OpConst32 { + continue + } + t := i.Type + z := v_0.Args[1^_i1] + x := v.Args[1^_i0] + if !(z.Op != OpConst32 && x.Op != OpConst32) { + continue + } + v.reset(OpOr32) + v.AddArg(i) + v0 := b.NewValue0(v.Pos, OpOr32, t) + v0.AddArg(z) + v0.AddArg(x) + v.AddArg(v0) + return true + } } - v.reset(OpConst64) - v.AuxInt = 0 - return true + break + } + // match: (Or32 (Const32 [c]) (Or32 (Const32 [d]) x)) + // result: (Or32 (Const32 [int64(int32(c|d))]) x) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpOr32 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst32 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpOr32) + v0 := b.NewValue0(v.Pos, OpConst32, t) + v0.AuxInt = int64(int32(c | d)) + v.AddArg(v0) + v.AddArg(x) + return true + } + } + break } return false } -func rewriteValuegeneric_OpRsh64Ux64_0(v *Value) bool { +func rewriteValuegeneric_OpOr64_0(v *Value) bool { b := v.Block - typ := &b.Func.Config.Types - // match: (Rsh64Ux64 (Const64 [c]) (Const64 [d])) - // result: (Const64 [int64(uint64(c) >> uint64(d))]) + // match: (Or64 (Const64 [c]) (Const64 [d])) + // result: (Const64 [c|d]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst64 { + continue + } + d := v_1.AuxInt + v.reset(OpConst64) + v.AuxInt = c | d + return true } - d := v_1.AuxInt - v.reset(OpConst64) - v.AuxInt = int64(uint64(c) >> uint64(d)) - return true + break } - // match: (Rsh64Ux64 x (Const64 [0])) + // match: (Or64 x x) // result: x for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 0 { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpCopy) @@ -41452,314 +17757,417 @@ func rewriteValuegeneric_OpRsh64Ux64_0(v *Value) bool { v.AddArg(x) return true } - // match: (Rsh64Ux64 (Const64 [0]) _) - // result: (Const64 [0]) + // match: (Or64 (Const64 [0]) x) + // result: x for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 || v_0.AuxInt != 0 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 || v_0.AuxInt != 0 { + continue + } + x := v.Args[1^_i0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - v.reset(OpConst64) - v.AuxInt = 0 - return true + break } - // match: (Rsh64Ux64 _ (Const64 [c])) - // cond: uint64(c) >= 64 - // result: (Const64 [0]) + // match: (Or64 (Const64 [-1]) _) + // result: (Const64 [-1]) for { _ = v.Args[1] - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c := v_1.AuxInt - if !(uint64(c) >= 64) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 || v_0.AuxInt != -1 { + continue + } + v.reset(OpConst64) + v.AuxInt = -1 + return true } - v.reset(OpConst64) - v.AuxInt = 0 - return true + break } - // match: (Rsh64Ux64 (Rsh64Ux64 x (Const64 [c])) (Const64 [d])) - // cond: !uaddOvf(c,d) - // result: (Rsh64Ux64 x (Const64 [c+d])) + // match: (Or64 x (Or64 x y)) + // result: (Or64 x y) for { - t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpRsh64Ux64 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpOr64 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + if x != v_1.Args[_i1] { + continue + } + y := v_1.Args[1^_i1] + v.reset(OpOr64) + v.AddArg(x) + v.AddArg(y) + return true + } } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break + break + } + // match: (Or64 (And64 x (Const64 [c2])) (Const64 [c1])) + // cond: ^(c1 | c2) == 0 + // result: (Or64 (Const64 [c1]) x) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAnd64 { + continue + } + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + x := v_0.Args[_i1] + v_0_1 := v_0.Args[1^_i1] + if v_0_1.Op != OpConst64 { + continue + } + c2 := v_0_1.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst64 { + continue + } + t := v_1.Type + c1 := v_1.AuxInt + if !(^(c1 | c2) == 0) { + continue + } + v.reset(OpOr64) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = c1 + v.AddArg(v0) + v.AddArg(x) + return true + } } - c := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break + break + } + // match: (Or64 (Or64 i:(Const64 ) z) x) + // cond: (z.Op != OpConst64 && x.Op != OpConst64) + // result: (Or64 i (Or64 z x)) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpOr64 { + continue + } + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + i := v_0.Args[_i1] + if i.Op != OpConst64 { + continue + } + t := i.Type + z := v_0.Args[1^_i1] + x := v.Args[1^_i0] + if !(z.Op != OpConst64 && x.Op != OpConst64) { + continue + } + v.reset(OpOr64) + v.AddArg(i) + v0 := b.NewValue0(v.Pos, OpOr64, t) + v0.AddArg(z) + v0.AddArg(x) + v.AddArg(v0) + return true + } } - d := v_1.AuxInt - if !(!uaddOvf(c, d)) { - break + break + } + // match: (Or64 (Const64 [c]) (Or64 (Const64 [d]) x)) + // result: (Or64 (Const64 [c|d]) x) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpOr64 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst64 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpOr64) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = c | d + v.AddArg(v0) + v.AddArg(x) + return true + } } - v.reset(OpRsh64Ux64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c + d - v.AddArg(v0) - return true + break } - // match: (Rsh64Ux64 (Rsh64x64 x _) (Const64 [63])) - // result: (Rsh64Ux64 x (Const64 [63])) + return false +} +func rewriteValuegeneric_OpOr8_0(v *Value) bool { + b := v.Block + // match: (Or8 (Const8 [c]) (Const8 [d])) + // result: (Const8 [int64(int8(c|d))]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpRsh64x64 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst8 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst8 { + continue + } + d := v_1.AuxInt + v.reset(OpConst8) + v.AuxInt = int64(int8(c | d)) + return true } - t := v_1.Type - if v_1.AuxInt != 63 { + break + } + // match: (Or8 x x) + // result: x + for { + x := v.Args[1] + if x != v.Args[0] { break } - v.reset(OpRsh64Ux64) + v.reset(OpCopy) + v.Type = x.Type v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = 63 - v.AddArg(v0) return true } - // match: (Rsh64Ux64 (Lsh64x64 (Rsh64Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) - // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) - // result: (Rsh64Ux64 x (Const64 [c1-c2+c3])) + // match: (Or8 (Const8 [0]) x) + // result: x for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh64x64 { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh64Ux64 { - break - } - _ = v_0_0.Args[1] - x := v_0_0.Args[0] - v_0_0_1 := v_0_0.Args[1] - if v_0_0_1.Op != OpConst64 { - break - } - c1 := v_0_0_1.AuxInt - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c2 := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break - } - c3 := v_1.AuxInt - if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst8 || v_0.AuxInt != 0 { + continue + } + x := v.Args[1^_i0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - v.reset(OpRsh64Ux64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) - v0.AuxInt = c1 - c2 + c3 - v.AddArg(v0) - return true + break } - // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [56])) (Const64 [56])) - // result: (ZeroExt8to64 (Trunc64to8 x)) + // match: (Or8 (Const8 [-1]) _) + // result: (Const8 [-1]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh64x64 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.AuxInt != 56 { - break - } - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 56 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst8 || v_0.AuxInt != -1 { + continue + } + v.reset(OpConst8) + v.AuxInt = -1 + return true } - v.reset(OpZeroExt8to64) - v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.UInt8) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [48])) (Const64 [48])) - // result: (ZeroExt16to64 (Trunc64to16 x)) + // match: (Or8 x (Or8 x y)) + // result: (Or8 x y) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh64x64 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.AuxInt != 48 { - break - } - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 48 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpOr8 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + if x != v_1.Args[_i1] { + continue + } + y := v_1.Args[1^_i1] + v.reset(OpOr8) + v.AddArg(x) + v.AddArg(y) + return true + } } - v.reset(OpZeroExt16to64) - v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.UInt16) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [32])) (Const64 [32])) - // result: (ZeroExt32to64 (Trunc64to32 x)) + // match: (Or8 (And8 x (Const8 [c2])) (Const8 [c1])) + // cond: ^(c1 | c2) == 0 + // result: (Or8 (Const8 [c1]) x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh64x64 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.AuxInt != 32 { - break - } - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 32 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpAnd8 { + continue + } + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + x := v_0.Args[_i1] + v_0_1 := v_0.Args[1^_i1] + if v_0_1.Op != OpConst8 { + continue + } + c2 := v_0_1.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst8 { + continue + } + t := v_1.Type + c1 := v_1.AuxInt + if !(^(c1 | c2) == 0) { + continue + } + v.reset(OpOr8) + v0 := b.NewValue0(v.Pos, OpConst8, t) + v0.AuxInt = c1 + v.AddArg(v0) + v.AddArg(x) + return true + } } - v.reset(OpZeroExt32to64) - v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.UInt32) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - return false -} -func rewriteValuegeneric_OpRsh64Ux8_0(v *Value) bool { - b := v.Block - // match: (Rsh64Ux8 x (Const8 [c])) - // result: (Rsh64Ux64 x (Const64 [int64(uint8(c))])) + // match: (Or8 (Or8 i:(Const8 ) z) x) + // cond: (z.Op != OpConst8 && x.Op != OpConst8) + // result: (Or8 i (Or8 z x)) for { - t := v.Type _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpOr8 { + continue + } + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + i := v_0.Args[_i1] + if i.Op != OpConst8 { + continue + } + t := i.Type + z := v_0.Args[1^_i1] + x := v.Args[1^_i0] + if !(z.Op != OpConst8 && x.Op != OpConst8) { + continue + } + v.reset(OpOr8) + v.AddArg(i) + v0 := b.NewValue0(v.Pos, OpOr8, t) + v0.AddArg(z) + v0.AddArg(x) + v.AddArg(v0) + return true + } } - c := v_1.AuxInt - v.reset(OpRsh64Ux64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint8(c)) - v.AddArg(v0) - return true + break } - // match: (Rsh64Ux8 (Const64 [0]) _) - // result: (Const64 [0]) + // match: (Or8 (Const8 [c]) (Or8 (Const8 [d]) x)) + // result: (Or8 (Const8 [int64(int8(c|d))]) x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 || v_0.AuxInt != 0 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst8 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpOr8 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst8 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpOr8) + v0 := b.NewValue0(v.Pos, OpConst8, t) + v0.AuxInt = int64(int8(c | d)) + v.AddArg(v0) + v.AddArg(x) + return true + } } - v.reset(OpConst64) - v.AuxInt = 0 - return true + break } return false } -func rewriteValuegeneric_OpRsh64x16_0(v *Value) bool { - b := v.Block - // match: (Rsh64x16 x (Const16 [c])) - // result: (Rsh64x64 x (Const64 [int64(uint16(c))])) +func rewriteValuegeneric_OpPhi_0(v *Value) bool { + // match: (Phi (Const8 [c]) (Const8 [c])) + // result: (Const8 [c]) for { - t := v.Type _ = v.Args[1] - x := v.Args[0] + v_0 := v.Args[0] + if v_0.Op != OpConst8 { + break + } + c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpConst16 { + if v_1.Op != OpConst8 || v_1.AuxInt != c || len(v.Args) != 2 { break } - c := v_1.AuxInt - v.reset(OpRsh64x64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint16(c)) - v.AddArg(v0) + v.reset(OpConst8) + v.AuxInt = c return true } - // match: (Rsh64x16 (Const64 [0]) _) - // result: (Const64 [0]) + // match: (Phi (Const16 [c]) (Const16 [c])) + // result: (Const16 [c]) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst64 || v_0.AuxInt != 0 { + if v_0.Op != OpConst16 { break } - v.reset(OpConst64) - v.AuxInt = 0 - return true - } - return false -} -func rewriteValuegeneric_OpRsh64x32_0(v *Value) bool { - b := v.Block - // match: (Rsh64x32 x (Const32 [c])) - // result: (Rsh64x64 x (Const64 [int64(uint32(c))])) - for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] + c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpConst32 { + if v_1.Op != OpConst16 || v_1.AuxInt != c || len(v.Args) != 2 { break } - c := v_1.AuxInt - v.reset(OpRsh64x64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint32(c)) - v.AddArg(v0) + v.reset(OpConst16) + v.AuxInt = c return true } - // match: (Rsh64x32 (Const64 [0]) _) - // result: (Const64 [0]) + // match: (Phi (Const32 [c]) (Const32 [c])) + // result: (Const32 [c]) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst64 || v_0.AuxInt != 0 { + if v_0.Op != OpConst32 { break } - v.reset(OpConst64) - v.AuxInt = 0 + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst32 || v_1.AuxInt != c || len(v.Args) != 2 { + break + } + v.reset(OpConst32) + v.AuxInt = c return true } - return false -} -func rewriteValuegeneric_OpRsh64x64_0(v *Value) bool { - b := v.Block - typ := &b.Func.Config.Types - // match: (Rsh64x64 (Const64 [c]) (Const64 [d])) - // result: (Const64 [c >> uint64(d)]) + // match: (Phi (Const64 [c]) (Const64 [c])) + // result: (Const64 [c]) for { _ = v.Args[1] v_0 := v.Args[0] @@ -41768,184 +18176,183 @@ func rewriteValuegeneric_OpRsh64x64_0(v *Value) bool { } c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpConst64 { + if v_1.Op != OpConst64 || v_1.AuxInt != c || len(v.Args) != 2 { break } - d := v_1.AuxInt v.reset(OpConst64) - v.AuxInt = c >> uint64(d) + v.AuxInt = c return true } - // match: (Rsh64x64 x (Const64 [0])) - // result: x + return false +} +func rewriteValuegeneric_OpPtrIndex_0(v *Value) bool { + b := v.Block + config := b.Func.Config + typ := &b.Func.Config.Types + // match: (PtrIndex ptr idx) + // cond: config.PtrSize == 4 + // result: (AddPtr ptr (Mul32 idx (Const32 [t.Elem().Size()]))) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 0 { + t := v.Type + idx := v.Args[1] + ptr := v.Args[0] + if !(config.PtrSize == 4) { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + v.reset(OpAddPtr) + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpMul32, typ.Int) + v0.AddArg(idx) + v1 := b.NewValue0(v.Pos, OpConst32, typ.Int) + v1.AuxInt = t.Elem().Size() + v0.AddArg(v1) + v.AddArg(v0) return true } - // match: (Rsh64x64 (Const64 [0]) _) - // result: (Const64 [0]) + // match: (PtrIndex ptr idx) + // cond: config.PtrSize == 8 + // result: (AddPtr ptr (Mul64 idx (Const64 [t.Elem().Size()]))) for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 || v_0.AuxInt != 0 { + t := v.Type + idx := v.Args[1] + ptr := v.Args[0] + if !(config.PtrSize == 8) { break } - v.reset(OpConst64) - v.AuxInt = 0 + v.reset(OpAddPtr) + v.AddArg(ptr) + v0 := b.NewValue0(v.Pos, OpMul64, typ.Int) + v0.AddArg(idx) + v1 := b.NewValue0(v.Pos, OpConst64, typ.Int) + v1.AuxInt = t.Elem().Size() + v0.AddArg(v1) + v.AddArg(v0) return true } - // match: (Rsh64x64 (Rsh64x64 x (Const64 [c])) (Const64 [d])) - // cond: !uaddOvf(c,d) - // result: (Rsh64x64 x (Const64 [c+d])) + return false +} +func rewriteValuegeneric_OpRotateLeft16_0(v *Value) bool { + // match: (RotateLeft16 x (Const16 [c])) + // cond: c%16 == 0 + // result: x for { - t := v.Type _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpRsh64x64 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - c := v_0_1.AuxInt + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpConst64 { + if v_1.Op != OpConst16 { break } - d := v_1.AuxInt - if !(!uaddOvf(c, d)) { + c := v_1.AuxInt + if !(c%16 == 0) { break } - v.reset(OpRsh64x64) + v.reset(OpCopy) + v.Type = x.Type v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c + d - v.AddArg(v0) return true } - // match: (Rsh64x64 (Lsh64x64 x (Const64 [56])) (Const64 [56])) - // result: (SignExt8to64 (Trunc64to8 x)) + return false +} +func rewriteValuegeneric_OpRotateLeft32_0(v *Value) bool { + // match: (RotateLeft32 x (Const32 [c])) + // cond: c%32 == 0 + // result: x for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh64x64 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.AuxInt != 56 { + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst32 { break } - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 56 { + c := v_1.AuxInt + if !(c%32 == 0) { break } - v.reset(OpSignExt8to64) - v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.Int8) - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (Rsh64x64 (Lsh64x64 x (Const64 [48])) (Const64 [48])) - // result: (SignExt16to64 (Trunc64to16 x)) + return false +} +func rewriteValuegeneric_OpRotateLeft64_0(v *Value) bool { + // match: (RotateLeft64 x (Const64 [c])) + // cond: c%64 == 0 + // result: x for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh64x64 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.AuxInt != 48 { + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 48 { + c := v_1.AuxInt + if !(c%64 == 0) { break } - v.reset(OpSignExt16to64) - v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.Int16) - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (Rsh64x64 (Lsh64x64 x (Const64 [32])) (Const64 [32])) - // result: (SignExt32to64 (Trunc64to32 x)) + return false +} +func rewriteValuegeneric_OpRotateLeft8_0(v *Value) bool { + // match: (RotateLeft8 x (Const8 [c])) + // cond: c%8 == 0 + // result: x for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpLsh64x64 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 || v_0_1.AuxInt != 32 { + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst8 { break } - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 32 { + c := v_1.AuxInt + if !(c%8 == 0) { break } - v.reset(OpSignExt32to64) - v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.Int32) - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } return false } -func rewriteValuegeneric_OpRsh64x8_0(v *Value) bool { - b := v.Block - // match: (Rsh64x8 x (Const8 [c])) - // result: (Rsh64x64 x (Const64 [int64(uint8(c))])) +func rewriteValuegeneric_OpRound32F_0(v *Value) bool { + // match: (Round32F x:(Const32F)) + // result: x for { - t := v.Type - _ = v.Args[1] x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst8 { + if x.Op != OpConst32F { break } - c := v_1.AuxInt - v.reset(OpRsh64x64) + v.reset(OpCopy) + v.Type = x.Type v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint8(c)) - v.AddArg(v0) return true } - // match: (Rsh64x8 (Const64 [0]) _) - // result: (Const64 [0]) + return false +} +func rewriteValuegeneric_OpRound64F_0(v *Value) bool { + // match: (Round64F x:(Const64F)) + // result: x for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 || v_0.AuxInt != 0 { + x := v.Args[0] + if x.Op != OpConst64F { break } - v.reset(OpConst64) - v.AuxInt = 0 + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } return false } -func rewriteValuegeneric_OpRsh8Ux16_0(v *Value) bool { +func rewriteValuegeneric_OpRsh16Ux16_0(v *Value) bool { b := v.Block - // match: (Rsh8Ux16 x (Const16 [c])) - // result: (Rsh8Ux64 x (Const64 [int64(uint16(c))])) + // match: (Rsh16Ux16 x (Const16 [c])) + // result: (Rsh16Ux64 x (Const64 [int64(uint16(c))])) for { t := v.Type _ = v.Args[1] @@ -41955,31 +18362,31 @@ func rewriteValuegeneric_OpRsh8Ux16_0(v *Value) bool { break } c := v_1.AuxInt - v.reset(OpRsh8Ux64) + v.reset(OpRsh16Ux64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpConst64, t) v0.AuxInt = int64(uint16(c)) v.AddArg(v0) return true } - // match: (Rsh8Ux16 (Const8 [0]) _) - // result: (Const8 [0]) + // match: (Rsh16Ux16 (Const16 [0]) _) + // result: (Const16 [0]) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst8 || v_0.AuxInt != 0 { + if v_0.Op != OpConst16 || v_0.AuxInt != 0 { break } - v.reset(OpConst8) + v.reset(OpConst16) v.AuxInt = 0 return true } return false } -func rewriteValuegeneric_OpRsh8Ux32_0(v *Value) bool { +func rewriteValuegeneric_OpRsh16Ux32_0(v *Value) bool { b := v.Block - // match: (Rsh8Ux32 x (Const32 [c])) - // result: (Rsh8Ux64 x (Const64 [int64(uint32(c))])) + // match: (Rsh16Ux32 x (Const32 [c])) + // result: (Rsh16Ux64 x (Const64 [int64(uint32(c))])) for { t := v.Type _ = v.Args[1] @@ -41989,36 +18396,36 @@ func rewriteValuegeneric_OpRsh8Ux32_0(v *Value) bool { break } c := v_1.AuxInt - v.reset(OpRsh8Ux64) + v.reset(OpRsh16Ux64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpConst64, t) v0.AuxInt = int64(uint32(c)) v.AddArg(v0) return true } - // match: (Rsh8Ux32 (Const8 [0]) _) - // result: (Const8 [0]) + // match: (Rsh16Ux32 (Const16 [0]) _) + // result: (Const16 [0]) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst8 || v_0.AuxInt != 0 { + if v_0.Op != OpConst16 || v_0.AuxInt != 0 { break } - v.reset(OpConst8) + v.reset(OpConst16) v.AuxInt = 0 return true } return false } -func rewriteValuegeneric_OpRsh8Ux64_0(v *Value) bool { +func rewriteValuegeneric_OpRsh16Ux64_0(v *Value) bool { b := v.Block - typ := &b.Func.Config.Types - // match: (Rsh8Ux64 (Const8 [c]) (Const64 [d])) - // result: (Const8 [int64(int8(uint8(c) >> uint64(d)))]) + typ := &b.Func.Config.Types + // match: (Rsh16Ux64 (Const16 [c]) (Const64 [d])) + // result: (Const16 [int64(int16(uint16(c) >> uint64(d)))]) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst8 { + if v_0.Op != OpConst16 { break } c := v_0.AuxInt @@ -42027,11 +18434,11 @@ func rewriteValuegeneric_OpRsh8Ux64_0(v *Value) bool { break } d := v_1.AuxInt - v.reset(OpConst8) - v.AuxInt = int64(int8(uint8(c) >> uint64(d))) + v.reset(OpConst16) + v.AuxInt = int64(int16(uint16(c) >> uint64(d))) return true } - // match: (Rsh8Ux64 x (Const64 [0])) + // match: (Rsh16Ux64 x (Const64 [0])) // result: x for { _ = v.Args[1] @@ -42045,21 +18452,21 @@ func rewriteValuegeneric_OpRsh8Ux64_0(v *Value) bool { v.AddArg(x) return true } - // match: (Rsh8Ux64 (Const8 [0]) _) - // result: (Const8 [0]) + // match: (Rsh16Ux64 (Const16 [0]) _) + // result: (Const16 [0]) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst8 || v_0.AuxInt != 0 { + if v_0.Op != OpConst16 || v_0.AuxInt != 0 { break } - v.reset(OpConst8) + v.reset(OpConst16) v.AuxInt = 0 return true } - // match: (Rsh8Ux64 _ (Const64 [c])) - // cond: uint64(c) >= 8 - // result: (Const8 [0]) + // match: (Rsh16Ux64 _ (Const64 [c])) + // cond: uint64(c) >= 16 + // result: (Const16 [0]) for { _ = v.Args[1] v_1 := v.Args[1] @@ -42067,21 +18474,21 @@ func rewriteValuegeneric_OpRsh8Ux64_0(v *Value) bool { break } c := v_1.AuxInt - if !(uint64(c) >= 8) { + if !(uint64(c) >= 16) { break } - v.reset(OpConst8) + v.reset(OpConst16) v.AuxInt = 0 return true } - // match: (Rsh8Ux64 (Rsh8Ux64 x (Const64 [c])) (Const64 [d])) + // match: (Rsh16Ux64 (Rsh16Ux64 x (Const64 [c])) (Const64 [d])) // cond: !uaddOvf(c,d) - // result: (Rsh8Ux64 x (Const64 [c+d])) + // result: (Rsh16Ux64 x (Const64 [c+d])) for { t := v.Type _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpRsh8Ux64 { + if v_0.Op != OpRsh16Ux64 { break } _ = v_0.Args[1] @@ -42099,19 +18506,19 @@ func rewriteValuegeneric_OpRsh8Ux64_0(v *Value) bool { if !(!uaddOvf(c, d)) { break } - v.reset(OpRsh8Ux64) + v.reset(OpRsh16Ux64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpConst64, t) v0.AuxInt = c + d v.AddArg(v0) return true } - // match: (Rsh8Ux64 (Rsh8x64 x _) (Const64 [7])) - // result: (Rsh8Ux64 x (Const64 [7] )) + // match: (Rsh16Ux64 (Rsh16x64 x _) (Const64 [15])) + // result: (Rsh16Ux64 x (Const64 [15])) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpRsh8x64 { + if v_0.Op != OpRsh16x64 { break } _ = v_0.Args[1] @@ -42121,28 +18528,28 @@ func rewriteValuegeneric_OpRsh8Ux64_0(v *Value) bool { break } t := v_1.Type - if v_1.AuxInt != 7 { + if v_1.AuxInt != 15 { break } - v.reset(OpRsh8Ux64) + v.reset(OpRsh16Ux64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = 7 + v0.AuxInt = 15 v.AddArg(v0) return true } - // match: (Rsh8Ux64 (Lsh8x64 (Rsh8Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) + // match: (Rsh16Ux64 (Lsh16x64 (Rsh16Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) - // result: (Rsh8Ux64 x (Const64 [c1-c2+c3])) + // result: (Rsh16Ux64 x (Const64 [c1-c2+c3])) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpLsh8x64 { + if v_0.Op != OpLsh16x64 { break } _ = v_0.Args[1] v_0_0 := v_0.Args[0] - if v_0_0.Op != OpRsh8Ux64 { + if v_0_0.Op != OpRsh16Ux64 { break } _ = v_0_0.Args[1] @@ -42165,19 +18572,43 @@ func rewriteValuegeneric_OpRsh8Ux64_0(v *Value) bool { if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { break } - v.reset(OpRsh8Ux64) + v.reset(OpRsh16Ux64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) v0.AuxInt = c1 - c2 + c3 v.AddArg(v0) return true } + // match: (Rsh16Ux64 (Lsh16x64 x (Const64 [8])) (Const64 [8])) + // result: (ZeroExt8to16 (Trunc16to8 x)) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpLsh16x64 { + break + } + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 || v_0_1.AuxInt != 8 { + break + } + v_1 := v.Args[1] + if v_1.Op != OpConst64 || v_1.AuxInt != 8 { + break + } + v.reset(OpZeroExt8to16) + v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.UInt8) + v0.AddArg(x) + v.AddArg(v0) + return true + } return false } -func rewriteValuegeneric_OpRsh8Ux8_0(v *Value) bool { +func rewriteValuegeneric_OpRsh16Ux8_0(v *Value) bool { b := v.Block - // match: (Rsh8Ux8 x (Const8 [c])) - // result: (Rsh8Ux64 x (Const64 [int64(uint8(c))])) + // match: (Rsh16Ux8 x (Const8 [c])) + // result: (Rsh16Ux64 x (Const64 [int64(uint8(c))])) for { t := v.Type _ = v.Args[1] @@ -42187,31 +18618,31 @@ func rewriteValuegeneric_OpRsh8Ux8_0(v *Value) bool { break } c := v_1.AuxInt - v.reset(OpRsh8Ux64) + v.reset(OpRsh16Ux64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpConst64, t) v0.AuxInt = int64(uint8(c)) v.AddArg(v0) return true } - // match: (Rsh8Ux8 (Const8 [0]) _) - // result: (Const8 [0]) + // match: (Rsh16Ux8 (Const16 [0]) _) + // result: (Const16 [0]) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst8 || v_0.AuxInt != 0 { + if v_0.Op != OpConst16 || v_0.AuxInt != 0 { break } - v.reset(OpConst8) + v.reset(OpConst16) v.AuxInt = 0 return true } return false } -func rewriteValuegeneric_OpRsh8x16_0(v *Value) bool { +func rewriteValuegeneric_OpRsh16x16_0(v *Value) bool { b := v.Block - // match: (Rsh8x16 x (Const16 [c])) - // result: (Rsh8x64 x (Const64 [int64(uint16(c))])) + // match: (Rsh16x16 x (Const16 [c])) + // result: (Rsh16x64 x (Const64 [int64(uint16(c))])) for { t := v.Type _ = v.Args[1] @@ -42221,31 +18652,31 @@ func rewriteValuegeneric_OpRsh8x16_0(v *Value) bool { break } c := v_1.AuxInt - v.reset(OpRsh8x64) + v.reset(OpRsh16x64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpConst64, t) v0.AuxInt = int64(uint16(c)) v.AddArg(v0) return true } - // match: (Rsh8x16 (Const8 [0]) _) - // result: (Const8 [0]) + // match: (Rsh16x16 (Const16 [0]) _) + // result: (Const16 [0]) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst8 || v_0.AuxInt != 0 { + if v_0.Op != OpConst16 || v_0.AuxInt != 0 { break } - v.reset(OpConst8) + v.reset(OpConst16) v.AuxInt = 0 return true } return false } -func rewriteValuegeneric_OpRsh8x32_0(v *Value) bool { +func rewriteValuegeneric_OpRsh16x32_0(v *Value) bool { b := v.Block - // match: (Rsh8x32 x (Const32 [c])) - // result: (Rsh8x64 x (Const64 [int64(uint32(c))])) + // match: (Rsh16x32 x (Const32 [c])) + // result: (Rsh16x64 x (Const64 [int64(uint32(c))])) for { t := v.Type _ = v.Args[1] @@ -42255,35 +18686,36 @@ func rewriteValuegeneric_OpRsh8x32_0(v *Value) bool { break } c := v_1.AuxInt - v.reset(OpRsh8x64) + v.reset(OpRsh16x64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpConst64, t) v0.AuxInt = int64(uint32(c)) v.AddArg(v0) return true } - // match: (Rsh8x32 (Const8 [0]) _) - // result: (Const8 [0]) + // match: (Rsh16x32 (Const16 [0]) _) + // result: (Const16 [0]) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst8 || v_0.AuxInt != 0 { + if v_0.Op != OpConst16 || v_0.AuxInt != 0 { break } - v.reset(OpConst8) + v.reset(OpConst16) v.AuxInt = 0 return true } return false } -func rewriteValuegeneric_OpRsh8x64_0(v *Value) bool { +func rewriteValuegeneric_OpRsh16x64_0(v *Value) bool { b := v.Block - // match: (Rsh8x64 (Const8 [c]) (Const64 [d])) - // result: (Const8 [int64(int8(c) >> uint64(d))]) + typ := &b.Func.Config.Types + // match: (Rsh16x64 (Const16 [c]) (Const64 [d])) + // result: (Const16 [int64(int16(c) >> uint64(d))]) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst8 { + if v_0.Op != OpConst16 { break } c := v_0.AuxInt @@ -42292,11 +18724,11 @@ func rewriteValuegeneric_OpRsh8x64_0(v *Value) bool { break } d := v_1.AuxInt - v.reset(OpConst8) - v.AuxInt = int64(int8(c) >> uint64(d)) + v.reset(OpConst16) + v.AuxInt = int64(int16(c) >> uint64(d)) return true } - // match: (Rsh8x64 x (Const64 [0])) + // match: (Rsh16x64 x (Const64 [0])) // result: x for { _ = v.Args[1] @@ -42310,26 +18742,26 @@ func rewriteValuegeneric_OpRsh8x64_0(v *Value) bool { v.AddArg(x) return true } - // match: (Rsh8x64 (Const8 [0]) _) - // result: (Const8 [0]) + // match: (Rsh16x64 (Const16 [0]) _) + // result: (Const16 [0]) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst8 || v_0.AuxInt != 0 { + if v_0.Op != OpConst16 || v_0.AuxInt != 0 { break } - v.reset(OpConst8) + v.reset(OpConst16) v.AuxInt = 0 return true } - // match: (Rsh8x64 (Rsh8x64 x (Const64 [c])) (Const64 [d])) + // match: (Rsh16x64 (Rsh16x64 x (Const64 [c])) (Const64 [d])) // cond: !uaddOvf(c,d) - // result: (Rsh8x64 x (Const64 [c+d])) + // result: (Rsh16x64 x (Const64 [c+d])) for { t := v.Type _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpRsh8x64 { + if v_0.Op != OpRsh16x64 { break } _ = v_0.Args[1] @@ -42347,287 +18779,169 @@ func rewriteValuegeneric_OpRsh8x64_0(v *Value) bool { if !(!uaddOvf(c, d)) { break } - v.reset(OpRsh8x64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c + d - v.AddArg(v0) - return true - } - return false -} -func rewriteValuegeneric_OpRsh8x8_0(v *Value) bool { - b := v.Block - // match: (Rsh8x8 x (Const8 [c])) - // result: (Rsh8x64 x (Const64 [int64(uint8(c))])) - for { - t := v.Type - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break - } - c := v_1.AuxInt - v.reset(OpRsh8x64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64(uint8(c)) - v.AddArg(v0) - return true - } - // match: (Rsh8x8 (Const8 [0]) _) - // result: (Const8 [0]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 || v_0.AuxInt != 0 { - break - } - v.reset(OpConst8) - v.AuxInt = 0 - return true - } - return false -} -func rewriteValuegeneric_OpSelect0_0(v *Value) bool { - // match: (Select0 (Div128u (Const64 [0]) lo y)) - // result: (Div64u lo y) - for { - v_0 := v.Args[0] - if v_0.Op != OpDiv128u { - break - } - y := v_0.Args[2] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 || v_0_0.AuxInt != 0 { - break - } - lo := v_0.Args[1] - v.reset(OpDiv64u) - v.AddArg(lo) - v.AddArg(y) - return true - } - return false -} -func rewriteValuegeneric_OpSelect1_0(v *Value) bool { - // match: (Select1 (Div128u (Const64 [0]) lo y)) - // result: (Mod64u lo y) - for { - v_0 := v.Args[0] - if v_0.Op != OpDiv128u { - break - } - y := v_0.Args[2] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 || v_0_0.AuxInt != 0 { - break - } - lo := v_0.Args[1] - v.reset(OpMod64u) - v.AddArg(lo) - v.AddArg(y) - return true - } - return false -} -func rewriteValuegeneric_OpSignExt16to32_0(v *Value) bool { - // match: (SignExt16to32 (Const16 [c])) - // result: (Const32 [int64( int16(c))]) - for { - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - c := v_0.AuxInt - v.reset(OpConst32) - v.AuxInt = int64(int16(c)) + v.reset(OpRsh16x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = c + d + v.AddArg(v0) return true } - // match: (SignExt16to32 (Trunc32to16 x:(Rsh32x64 _ (Const64 [s])))) - // cond: s >= 16 - // result: x + // match: (Rsh16x64 (Lsh16x64 x (Const64 [8])) (Const64 [8])) + // result: (SignExt8to16 (Trunc16to8 x)) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpTrunc32to16 { + if v_0.Op != OpLsh16x64 { break } + _ = v_0.Args[1] x := v_0.Args[0] - if x.Op != OpRsh32x64 { - break - } - _ = x.Args[1] - x_1 := x.Args[1] - if x_1.Op != OpConst64 { + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 || v_0_1.AuxInt != 8 { break } - s := x_1.AuxInt - if !(s >= 16) { + v_1 := v.Args[1] + if v_1.Op != OpConst64 || v_1.AuxInt != 8 { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + v.reset(OpSignExt8to16) + v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.Int8) + v0.AddArg(x) + v.AddArg(v0) return true } return false } -func rewriteValuegeneric_OpSignExt16to64_0(v *Value) bool { - // match: (SignExt16to64 (Const16 [c])) - // result: (Const64 [int64( int16(c))]) +func rewriteValuegeneric_OpRsh16x8_0(v *Value) bool { + b := v.Block + // match: (Rsh16x8 x (Const8 [c])) + // result: (Rsh16x64 x (Const64 [int64(uint8(c))])) for { - v_0 := v.Args[0] - if v_0.Op != OpConst16 { + t := v.Type + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst8 { break } - c := v_0.AuxInt - v.reset(OpConst64) - v.AuxInt = int64(int16(c)) + c := v_1.AuxInt + v.reset(OpRsh16x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint8(c)) + v.AddArg(v0) return true } - // match: (SignExt16to64 (Trunc64to16 x:(Rsh64x64 _ (Const64 [s])))) - // cond: s >= 48 - // result: x + // match: (Rsh16x8 (Const16 [0]) _) + // result: (Const16 [0]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpTrunc64to16 { - break - } - x := v_0.Args[0] - if x.Op != OpRsh64x64 { - break - } - _ = x.Args[1] - x_1 := x.Args[1] - if x_1.Op != OpConst64 { - break - } - s := x_1.AuxInt - if !(s >= 48) { + if v_0.Op != OpConst16 || v_0.AuxInt != 0 { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + v.reset(OpConst16) + v.AuxInt = 0 return true } return false } -func rewriteValuegeneric_OpSignExt32to64_0(v *Value) bool { - // match: (SignExt32to64 (Const32 [c])) - // result: (Const64 [int64( int32(c))]) +func rewriteValuegeneric_OpRsh32Ux16_0(v *Value) bool { + b := v.Block + // match: (Rsh32Ux16 x (Const16 [c])) + // result: (Rsh32Ux64 x (Const64 [int64(uint16(c))])) for { - v_0 := v.Args[0] - if v_0.Op != OpConst32 { + t := v.Type + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst16 { break } - c := v_0.AuxInt - v.reset(OpConst64) - v.AuxInt = int64(int32(c)) + c := v_1.AuxInt + v.reset(OpRsh32Ux64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint16(c)) + v.AddArg(v0) return true } - // match: (SignExt32to64 (Trunc64to32 x:(Rsh64x64 _ (Const64 [s])))) - // cond: s >= 32 - // result: x + // match: (Rsh32Ux16 (Const32 [0]) _) + // result: (Const32 [0]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpTrunc64to32 { - break - } - x := v_0.Args[0] - if x.Op != OpRsh64x64 { - break - } - _ = x.Args[1] - x_1 := x.Args[1] - if x_1.Op != OpConst64 { - break - } - s := x_1.AuxInt - if !(s >= 32) { + if v_0.Op != OpConst32 || v_0.AuxInt != 0 { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + v.reset(OpConst32) + v.AuxInt = 0 return true } return false } -func rewriteValuegeneric_OpSignExt8to16_0(v *Value) bool { - // match: (SignExt8to16 (Const8 [c])) - // result: (Const16 [int64( int8(c))]) +func rewriteValuegeneric_OpRsh32Ux32_0(v *Value) bool { + b := v.Block + // match: (Rsh32Ux32 x (Const32 [c])) + // result: (Rsh32Ux64 x (Const64 [int64(uint32(c))])) for { - v_0 := v.Args[0] - if v_0.Op != OpConst8 { + t := v.Type + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst32 { break } - c := v_0.AuxInt - v.reset(OpConst16) - v.AuxInt = int64(int8(c)) + c := v_1.AuxInt + v.reset(OpRsh32Ux64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint32(c)) + v.AddArg(v0) return true } - // match: (SignExt8to16 (Trunc16to8 x:(Rsh16x64 _ (Const64 [s])))) - // cond: s >= 8 - // result: x + // match: (Rsh32Ux32 (Const32 [0]) _) + // result: (Const32 [0]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpTrunc16to8 { - break - } - x := v_0.Args[0] - if x.Op != OpRsh16x64 { - break - } - _ = x.Args[1] - x_1 := x.Args[1] - if x_1.Op != OpConst64 { - break - } - s := x_1.AuxInt - if !(s >= 8) { + if v_0.Op != OpConst32 || v_0.AuxInt != 0 { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + v.reset(OpConst32) + v.AuxInt = 0 return true } return false } -func rewriteValuegeneric_OpSignExt8to32_0(v *Value) bool { - // match: (SignExt8to32 (Const8 [c])) - // result: (Const32 [int64( int8(c))]) +func rewriteValuegeneric_OpRsh32Ux64_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (Rsh32Ux64 (Const32 [c]) (Const64 [d])) + // result: (Const32 [int64(int32(uint32(c) >> uint64(d)))]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst8 { + if v_0.Op != OpConst32 { break } c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { + break + } + d := v_1.AuxInt v.reset(OpConst32) - v.AuxInt = int64(int8(c)) + v.AuxInt = int64(int32(uint32(c) >> uint64(d))) return true } - // match: (SignExt8to32 (Trunc32to8 x:(Rsh32x64 _ (Const64 [s])))) - // cond: s >= 24 + // match: (Rsh32Ux64 x (Const64 [0])) // result: x for { - v_0 := v.Args[0] - if v_0.Op != OpTrunc32to8 { - break - } - x := v_0.Args[0] - if x.Op != OpRsh32x64 { - break - } - _ = x.Args[1] - x_1 := x.Args[1] - if x_1.Op != OpConst64 { - break - } - s := x_1.AuxInt - if !(s >= 24) { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst64 || v_1.AuxInt != 0 { break } v.reset(OpCopy) @@ -42635,222 +18949,275 @@ func rewriteValuegeneric_OpSignExt8to32_0(v *Value) bool { v.AddArg(x) return true } - return false -} -func rewriteValuegeneric_OpSignExt8to64_0(v *Value) bool { - // match: (SignExt8to64 (Const8 [c])) - // result: (Const64 [int64( int8(c))]) + // match: (Rsh32Ux64 (Const32 [0]) _) + // result: (Const32 [0]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst8 { + if v_0.Op != OpConst32 || v_0.AuxInt != 0 { break } - c := v_0.AuxInt - v.reset(OpConst64) - v.AuxInt = int64(int8(c)) + v.reset(OpConst32) + v.AuxInt = 0 return true } - // match: (SignExt8to64 (Trunc64to8 x:(Rsh64x64 _ (Const64 [s])))) - // cond: s >= 56 - // result: x + // match: (Rsh32Ux64 _ (Const64 [c])) + // cond: uint64(c) >= 32 + // result: (Const32 [0]) + for { + _ = v.Args[1] + v_1 := v.Args[1] + if v_1.Op != OpConst64 { + break + } + c := v_1.AuxInt + if !(uint64(c) >= 32) { + break + } + v.reset(OpConst32) + v.AuxInt = 0 + return true + } + // match: (Rsh32Ux64 (Rsh32Ux64 x (Const64 [c])) (Const64 [d])) + // cond: !uaddOvf(c,d) + // result: (Rsh32Ux64 x (Const64 [c+d])) for { + t := v.Type + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpTrunc64to8 { + if v_0.Op != OpRsh32Ux64 { break } + _ = v_0.Args[1] x := v_0.Args[0] - if x.Op != OpRsh64x64 { + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 { break } - _ = x.Args[1] - x_1 := x.Args[1] - if x_1.Op != OpConst64 { + c := v_0_1.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - s := x_1.AuxInt - if !(s >= 56) { + d := v_1.AuxInt + if !(!uaddOvf(c, d)) { break } - v.reset(OpCopy) - v.Type = x.Type + v.reset(OpRsh32Ux64) v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = c + d + v.AddArg(v0) return true } - return false -} -func rewriteValuegeneric_OpSliceCap_0(v *Value) bool { - // match: (SliceCap (SliceMake _ _ (Const64 [c]))) - // result: (Const64 [c]) + // match: (Rsh32Ux64 (Rsh32x64 x _) (Const64 [31])) + // result: (Rsh32Ux64 x (Const64 [31])) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpSliceMake { + if v_0.Op != OpRsh32x64 { break } - _ = v_0.Args[2] - v_0_2 := v_0.Args[2] - if v_0_2.Op != OpConst64 { + _ = v_0.Args[1] + x := v_0.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - t := v_0_2.Type - c := v_0_2.AuxInt - v.reset(OpConst64) - v.Type = t - v.AuxInt = c + t := v_1.Type + if v_1.AuxInt != 31 { + break + } + v.reset(OpRsh32Ux64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = 31 + v.AddArg(v0) return true } - // match: (SliceCap (SliceMake _ _ (Const32 [c]))) - // result: (Const32 [c]) + // match: (Rsh32Ux64 (Lsh32x64 (Rsh32Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) + // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) + // result: (Rsh32Ux64 x (Const64 [c1-c2+c3])) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpSliceMake { + if v_0.Op != OpLsh32x64 { break } - _ = v_0.Args[2] - v_0_2 := v_0.Args[2] - if v_0_2.Op != OpConst32 { + _ = v_0.Args[1] + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpRsh32Ux64 { break } - t := v_0_2.Type - c := v_0_2.AuxInt - v.reset(OpConst32) - v.Type = t - v.AuxInt = c - return true - } - // match: (SliceCap (SliceMake _ _ (SliceCap x))) - // result: (SliceCap x) - for { - v_0 := v.Args[0] - if v_0.Op != OpSliceMake { + _ = v_0_0.Args[1] + x := v_0_0.Args[0] + v_0_0_1 := v_0_0.Args[1] + if v_0_0_1.Op != OpConst64 { break } - _ = v_0.Args[2] - v_0_2 := v_0.Args[2] - if v_0_2.Op != OpSliceCap { + c1 := v_0_0_1.AuxInt + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 { break } - x := v_0_2.Args[0] - v.reset(OpSliceCap) - v.AddArg(x) - return true - } - // match: (SliceCap (SliceMake _ _ (SliceLen x))) - // result: (SliceLen x) - for { - v_0 := v.Args[0] - if v_0.Op != OpSliceMake { + c2 := v_0_1.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - _ = v_0.Args[2] - v_0_2 := v_0.Args[2] - if v_0_2.Op != OpSliceLen { + c3 := v_1.AuxInt + if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { break } - x := v_0_2.Args[0] - v.reset(OpSliceLen) + v.reset(OpRsh32Ux64) v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v0.AuxInt = c1 - c2 + c3 + v.AddArg(v0) return true } - return false -} -func rewriteValuegeneric_OpSliceLen_0(v *Value) bool { - // match: (SliceLen (SliceMake _ (Const64 [c]) _)) - // result: (Const64 [c]) + // match: (Rsh32Ux64 (Lsh32x64 x (Const64 [24])) (Const64 [24])) + // result: (ZeroExt8to32 (Trunc32to8 x)) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpSliceMake { + if v_0.Op != OpLsh32x64 { break } - _ = v_0.Args[2] + _ = v_0.Args[1] + x := v_0.Args[0] v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { + if v_0_1.Op != OpConst64 || v_0_1.AuxInt != 24 { break } - t := v_0_1.Type - c := v_0_1.AuxInt - v.reset(OpConst64) - v.Type = t - v.AuxInt = c + v_1 := v.Args[1] + if v_1.Op != OpConst64 || v_1.AuxInt != 24 { + break + } + v.reset(OpZeroExt8to32) + v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.UInt8) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (SliceLen (SliceMake _ (Const32 [c]) _)) - // result: (Const32 [c]) + // match: (Rsh32Ux64 (Lsh32x64 x (Const64 [16])) (Const64 [16])) + // result: (ZeroExt16to32 (Trunc32to16 x)) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpSliceMake { + if v_0.Op != OpLsh32x64 { break } - _ = v_0.Args[2] + _ = v_0.Args[1] + x := v_0.Args[0] v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { + if v_0_1.Op != OpConst64 || v_0_1.AuxInt != 16 { break } - t := v_0_1.Type - c := v_0_1.AuxInt - v.reset(OpConst32) - v.Type = t - v.AuxInt = c + v_1 := v.Args[1] + if v_1.Op != OpConst64 || v_1.AuxInt != 16 { + break + } + v.reset(OpZeroExt16to32) + v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.UInt16) + v0.AddArg(x) + v.AddArg(v0) return true } - // match: (SliceLen (SliceMake _ (SliceLen x) _)) - // result: (SliceLen x) + return false +} +func rewriteValuegeneric_OpRsh32Ux8_0(v *Value) bool { + b := v.Block + // match: (Rsh32Ux8 x (Const8 [c])) + // result: (Rsh32Ux64 x (Const64 [int64(uint8(c))])) for { - v_0 := v.Args[0] - if v_0.Op != OpSliceMake { - break - } - _ = v_0.Args[2] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpSliceLen { + t := v.Type + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst8 { break } - x := v_0_1.Args[0] - v.reset(OpSliceLen) + c := v_1.AuxInt + v.reset(OpRsh32Ux64) v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint8(c)) + v.AddArg(v0) return true } - return false -} -func rewriteValuegeneric_OpSlicePtr_0(v *Value) bool { - // match: (SlicePtr (SliceMake (SlicePtr x) _ _)) - // result: (SlicePtr x) + // match: (Rsh32Ux8 (Const32 [0]) _) + // result: (Const32 [0]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpSliceMake { + if v_0.Op != OpConst32 || v_0.AuxInt != 0 { break } - _ = v_0.Args[2] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSlicePtr { + v.reset(OpConst32) + v.AuxInt = 0 + return true + } + return false +} +func rewriteValuegeneric_OpRsh32x16_0(v *Value) bool { + b := v.Block + // match: (Rsh32x16 x (Const16 [c])) + // result: (Rsh32x64 x (Const64 [int64(uint16(c))])) + for { + t := v.Type + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst16 { break } - x := v_0_0.Args[0] - v.reset(OpSlicePtr) + c := v_1.AuxInt + v.reset(OpRsh32x64) v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint16(c)) + v.AddArg(v0) return true } - return false -} -func rewriteValuegeneric_OpSlicemask_0(v *Value) bool { - // match: (Slicemask (Const32 [x])) - // cond: x > 0 - // result: (Const32 [-1]) + // match: (Rsh32x16 (Const32 [0]) _) + // result: (Const32 [0]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst32 { + if v_0.Op != OpConst32 || v_0.AuxInt != 0 { break } - x := v_0.AuxInt - if !(x > 0) { + v.reset(OpConst32) + v.AuxInt = 0 + return true + } + return false +} +func rewriteValuegeneric_OpRsh32x32_0(v *Value) bool { + b := v.Block + // match: (Rsh32x32 x (Const32 [c])) + // result: (Rsh32x64 x (Const64 [int64(uint32(c))])) + for { + t := v.Type + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst32 { break } - v.reset(OpConst32) - v.AuxInt = -1 + c := v_1.AuxInt + v.reset(OpRsh32x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint32(c)) + v.AddArg(v0) return true } - // match: (Slicemask (Const32 [0])) + // match: (Rsh32x32 (Const32 [0]) _) // result: (Const32 [0]) for { + _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst32 || v_0.AuxInt != 0 { break @@ -42859,1337 +19226,1329 @@ func rewriteValuegeneric_OpSlicemask_0(v *Value) bool { v.AuxInt = 0 return true } - // match: (Slicemask (Const64 [x])) - // cond: x > 0 - // result: (Const64 [-1]) + return false +} +func rewriteValuegeneric_OpRsh32x64_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (Rsh32x64 (Const32 [c]) (Const64 [d])) + // result: (Const32 [int64(int32(c) >> uint64(d))]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst64 { + if v_0.Op != OpConst32 { break } - x := v_0.AuxInt - if !(x > 0) { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - v.reset(OpConst64) - v.AuxInt = -1 + d := v_1.AuxInt + v.reset(OpConst32) + v.AuxInt = int64(int32(c) >> uint64(d)) return true } - // match: (Slicemask (Const64 [0])) - // result: (Const64 [0]) + // match: (Rsh32x64 x (Const64 [0])) + // result: x for { - v_0 := v.Args[0] - if v_0.Op != OpConst64 || v_0.AuxInt != 0 { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst64 || v_1.AuxInt != 0 { break } - v.reset(OpConst64) - v.AuxInt = 0 + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - return false -} -func rewriteValuegeneric_OpSqrt_0(v *Value) bool { - // match: (Sqrt (Const64F [c])) - // result: (Const64F [auxFrom64F(math.Sqrt(auxTo64F(c)))]) + // match: (Rsh32x64 (Const32 [0]) _) + // result: (Const32 [0]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst64F { + if v_0.Op != OpConst32 || v_0.AuxInt != 0 { break } - c := v_0.AuxInt - v.reset(OpConst64F) - v.AuxInt = auxFrom64F(math.Sqrt(auxTo64F(c))) + v.reset(OpConst32) + v.AuxInt = 0 return true } - return false -} -func rewriteValuegeneric_OpStaticCall_0(v *Value) bool { - b := v.Block - config := b.Func.Config - // match: (StaticCall {sym} s1:(Store _ (Const64 [sz]) s2:(Store _ src s3:(Store {t} _ dst mem)))) - // cond: isSameSym(sym,"runtime.memmove") && t.(*types.Type).IsPtr() && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmove(dst,src,sz,config) && clobber(s1) && clobber(s2) && clobber(s3) - // result: (Move {t.(*types.Type).Elem()} [sz] dst src mem) + // match: (Rsh32x64 (Rsh32x64 x (Const64 [c])) (Const64 [d])) + // cond: !uaddOvf(c,d) + // result: (Rsh32x64 x (Const64 [c+d])) for { - sym := v.Aux - s1 := v.Args[0] - if s1.Op != OpStore { - break - } - _ = s1.Args[2] - s1_1 := s1.Args[1] - if s1_1.Op != OpConst64 { + t := v.Type + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpRsh32x64 { break } - sz := s1_1.AuxInt - s2 := s1.Args[2] - if s2.Op != OpStore { + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 { break } - _ = s2.Args[2] - src := s2.Args[1] - s3 := s2.Args[2] - if s3.Op != OpStore { + c := v_0_1.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - t := s3.Aux - mem := s3.Args[2] - dst := s3.Args[1] - if !(isSameSym(sym, "runtime.memmove") && t.(*types.Type).IsPtr() && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmove(dst, src, sz, config) && clobber(s1) && clobber(s2) && clobber(s3)) { + d := v_1.AuxInt + if !(!uaddOvf(c, d)) { break } - v.reset(OpMove) - v.AuxInt = sz - v.Aux = t.(*types.Type).Elem() - v.AddArg(dst) - v.AddArg(src) - v.AddArg(mem) + v.reset(OpRsh32x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = c + d + v.AddArg(v0) return true } - // match: (StaticCall {sym} s1:(Store _ (Const32 [sz]) s2:(Store _ src s3:(Store {t} _ dst mem)))) - // cond: isSameSym(sym,"runtime.memmove") && t.(*types.Type).IsPtr() && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmove(dst,src,sz,config) && clobber(s1) && clobber(s2) && clobber(s3) - // result: (Move {t.(*types.Type).Elem()} [sz] dst src mem) + // match: (Rsh32x64 (Lsh32x64 x (Const64 [24])) (Const64 [24])) + // result: (SignExt8to32 (Trunc32to8 x)) for { - sym := v.Aux - s1 := v.Args[0] - if s1.Op != OpStore { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpLsh32x64 { break } - _ = s1.Args[2] - s1_1 := s1.Args[1] - if s1_1.Op != OpConst32 { + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 || v_0_1.AuxInt != 24 { break } - sz := s1_1.AuxInt - s2 := s1.Args[2] - if s2.Op != OpStore { + v_1 := v.Args[1] + if v_1.Op != OpConst64 || v_1.AuxInt != 24 { break } - _ = s2.Args[2] - src := s2.Args[1] - s3 := s2.Args[2] - if s3.Op != OpStore { + v.reset(OpSignExt8to32) + v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.Int8) + v0.AddArg(x) + v.AddArg(v0) + return true + } + // match: (Rsh32x64 (Lsh32x64 x (Const64 [16])) (Const64 [16])) + // result: (SignExt16to32 (Trunc32to16 x)) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpLsh32x64 { break } - t := s3.Aux - mem := s3.Args[2] - dst := s3.Args[1] - if !(isSameSym(sym, "runtime.memmove") && t.(*types.Type).IsPtr() && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmove(dst, src, sz, config) && clobber(s1) && clobber(s2) && clobber(s3)) { + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 || v_0_1.AuxInt != 16 { break } - v.reset(OpMove) - v.AuxInt = sz - v.Aux = t.(*types.Type).Elem() - v.AddArg(dst) - v.AddArg(src) - v.AddArg(mem) - return true - } - // match: (StaticCall {sym} x) - // cond: needRaceCleanup(sym,v) - // result: x - for { - sym := v.Aux - x := v.Args[0] - if !(needRaceCleanup(sym, v)) { + v_1 := v.Args[1] + if v_1.Op != OpConst64 || v_1.AuxInt != 16 { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + v.reset(OpSignExt16to32) + v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.Int16) + v0.AddArg(x) + v.AddArg(v0) return true } return false } -func rewriteValuegeneric_OpStore_0(v *Value) bool { +func rewriteValuegeneric_OpRsh32x8_0(v *Value) bool { b := v.Block - // match: (Store {t1} p1 (Load p2 mem) mem) - // cond: isSamePtr(p1, p2) && t2.Size() == sizeof(t1) - // result: mem + // match: (Rsh32x8 x (Const8 [c])) + // result: (Rsh32x64 x (Const64 [int64(uint8(c))])) for { - t1 := v.Aux - mem := v.Args[2] - p1 := v.Args[0] + t := v.Type + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpLoad { + if v_1.Op != OpConst8 { break } - t2 := v_1.Type - _ = v_1.Args[1] - p2 := v_1.Args[0] - if mem != v_1.Args[1] || !(isSamePtr(p1, p2) && t2.Size() == sizeof(t1)) { + c := v_1.AuxInt + v.reset(OpRsh32x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint8(c)) + v.AddArg(v0) + return true + } + // match: (Rsh32x8 (Const32 [0]) _) + // result: (Const32 [0]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst32 || v_0.AuxInt != 0 { break } - v.reset(OpCopy) - v.Type = mem.Type - v.AddArg(mem) + v.reset(OpConst32) + v.AuxInt = 0 return true } - // match: (Store {t1} p1 (Load p2 oldmem) mem:(Store {t3} p3 _ oldmem)) - // cond: isSamePtr(p1, p2) && t2.Size() == sizeof(t1) && disjoint(p1, sizeof(t1), p3, sizeof(t3)) - // result: mem + return false +} +func rewriteValuegeneric_OpRsh64Ux16_0(v *Value) bool { + b := v.Block + // match: (Rsh64Ux16 x (Const16 [c])) + // result: (Rsh64Ux64 x (Const64 [int64(uint16(c))])) for { - t1 := v.Aux - _ = v.Args[2] - p1 := v.Args[0] + t := v.Type + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpLoad { - break - } - t2 := v_1.Type - oldmem := v_1.Args[1] - p2 := v_1.Args[0] - mem := v.Args[2] - if mem.Op != OpStore { + if v_1.Op != OpConst16 { break } - t3 := mem.Aux - _ = mem.Args[2] - p3 := mem.Args[0] - if oldmem != mem.Args[2] || !(isSamePtr(p1, p2) && t2.Size() == sizeof(t1) && disjoint(p1, sizeof(t1), p3, sizeof(t3))) { + c := v_1.AuxInt + v.reset(OpRsh64Ux64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint16(c)) + v.AddArg(v0) + return true + } + // match: (Rsh64Ux16 (Const64 [0]) _) + // result: (Const64 [0]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst64 || v_0.AuxInt != 0 { break } - v.reset(OpCopy) - v.Type = mem.Type - v.AddArg(mem) + v.reset(OpConst64) + v.AuxInt = 0 return true } - // match: (Store {t1} p1 (Load p2 oldmem) mem:(Store {t3} p3 _ (Store {t4} p4 _ oldmem))) - // cond: isSamePtr(p1, p2) && t2.Size() == sizeof(t1) && disjoint(p1, sizeof(t1), p3, sizeof(t3)) && disjoint(p1, sizeof(t1), p4, sizeof(t4)) - // result: mem + return false +} +func rewriteValuegeneric_OpRsh64Ux32_0(v *Value) bool { + b := v.Block + // match: (Rsh64Ux32 x (Const32 [c])) + // result: (Rsh64Ux64 x (Const64 [int64(uint32(c))])) for { - t1 := v.Aux - _ = v.Args[2] - p1 := v.Args[0] + t := v.Type + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpLoad { + if v_1.Op != OpConst32 { break } - t2 := v_1.Type - oldmem := v_1.Args[1] - p2 := v_1.Args[0] - mem := v.Args[2] - if mem.Op != OpStore { + c := v_1.AuxInt + v.reset(OpRsh64Ux64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint32(c)) + v.AddArg(v0) + return true + } + // match: (Rsh64Ux32 (Const64 [0]) _) + // result: (Const64 [0]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst64 || v_0.AuxInt != 0 { break } - t3 := mem.Aux - _ = mem.Args[2] - p3 := mem.Args[0] - mem_2 := mem.Args[2] - if mem_2.Op != OpStore { + v.reset(OpConst64) + v.AuxInt = 0 + return true + } + return false +} +func rewriteValuegeneric_OpRsh64Ux64_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (Rsh64Ux64 (Const64 [c]) (Const64 [d])) + // result: (Const64 [int64(uint64(c) >> uint64(d))]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst64 { break } - t4 := mem_2.Aux - _ = mem_2.Args[2] - p4 := mem_2.Args[0] - if oldmem != mem_2.Args[2] || !(isSamePtr(p1, p2) && t2.Size() == sizeof(t1) && disjoint(p1, sizeof(t1), p3, sizeof(t3)) && disjoint(p1, sizeof(t1), p4, sizeof(t4))) { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - v.reset(OpCopy) - v.Type = mem.Type - v.AddArg(mem) + d := v_1.AuxInt + v.reset(OpConst64) + v.AuxInt = int64(uint64(c) >> uint64(d)) return true } - // match: (Store {t1} p1 (Load p2 oldmem) mem:(Store {t3} p3 _ (Store {t4} p4 _ (Store {t5} p5 _ oldmem)))) - // cond: isSamePtr(p1, p2) && t2.Size() == sizeof(t1) && disjoint(p1, sizeof(t1), p3, sizeof(t3)) && disjoint(p1, sizeof(t1), p4, sizeof(t4)) && disjoint(p1, sizeof(t1), p5, sizeof(t5)) - // result: mem + // match: (Rsh64Ux64 x (Const64 [0])) + // result: x for { - t1 := v.Aux - _ = v.Args[2] - p1 := v.Args[0] + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpLoad { - break - } - t2 := v_1.Type - oldmem := v_1.Args[1] - p2 := v_1.Args[0] - mem := v.Args[2] - if mem.Op != OpStore { - break - } - t3 := mem.Aux - _ = mem.Args[2] - p3 := mem.Args[0] - mem_2 := mem.Args[2] - if mem_2.Op != OpStore { - break - } - t4 := mem_2.Aux - _ = mem_2.Args[2] - p4 := mem_2.Args[0] - mem_2_2 := mem_2.Args[2] - if mem_2_2.Op != OpStore { - break - } - t5 := mem_2_2.Aux - _ = mem_2_2.Args[2] - p5 := mem_2_2.Args[0] - if oldmem != mem_2_2.Args[2] || !(isSamePtr(p1, p2) && t2.Size() == sizeof(t1) && disjoint(p1, sizeof(t1), p3, sizeof(t3)) && disjoint(p1, sizeof(t1), p4, sizeof(t4)) && disjoint(p1, sizeof(t1), p5, sizeof(t5))) { + if v_1.Op != OpConst64 || v_1.AuxInt != 0 { break } v.reset(OpCopy) - v.Type = mem.Type - v.AddArg(mem) + v.Type = x.Type + v.AddArg(x) return true } - // match: (Store {t} (OffPtr [o] p1) x mem:(Zero [n] p2 _)) - // cond: isConstZero(x) && o >= 0 && sizeof(t) + o <= n && isSamePtr(p1, p2) - // result: mem + // match: (Rsh64Ux64 (Const64 [0]) _) + // result: (Const64 [0]) for { - t := v.Aux - _ = v.Args[2] + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpOffPtr { + if v_0.Op != OpConst64 || v_0.AuxInt != 0 { break } - o := v_0.AuxInt - p1 := v_0.Args[0] - x := v.Args[1] - mem := v.Args[2] - if mem.Op != OpZero { + v.reset(OpConst64) + v.AuxInt = 0 + return true + } + // match: (Rsh64Ux64 _ (Const64 [c])) + // cond: uint64(c) >= 64 + // result: (Const64 [0]) + for { + _ = v.Args[1] + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - n := mem.AuxInt - _ = mem.Args[1] - p2 := mem.Args[0] - if !(isConstZero(x) && o >= 0 && sizeof(t)+o <= n && isSamePtr(p1, p2)) { + c := v_1.AuxInt + if !(uint64(c) >= 64) { break } - v.reset(OpCopy) - v.Type = mem.Type - v.AddArg(mem) + v.reset(OpConst64) + v.AuxInt = 0 return true } - // match: (Store {t1} op:(OffPtr [o1] p1) x mem:(Store {t2} p2 _ (Zero [n] p3 _))) - // cond: isConstZero(x) && o1 >= 0 && sizeof(t1) + o1 <= n && isSamePtr(p1, p3) && disjoint(op, sizeof(t1), p2, sizeof(t2)) - // result: mem + // match: (Rsh64Ux64 (Rsh64Ux64 x (Const64 [c])) (Const64 [d])) + // cond: !uaddOvf(c,d) + // result: (Rsh64Ux64 x (Const64 [c+d])) for { - t1 := v.Aux - _ = v.Args[2] - op := v.Args[0] - if op.Op != OpOffPtr { + t := v.Type + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpRsh64Ux64 { break } - o1 := op.AuxInt - p1 := op.Args[0] - x := v.Args[1] - mem := v.Args[2] - if mem.Op != OpStore { + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 { break } - t2 := mem.Aux - _ = mem.Args[2] - p2 := mem.Args[0] - mem_2 := mem.Args[2] - if mem_2.Op != OpZero { + c := v_0_1.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - n := mem_2.AuxInt - _ = mem_2.Args[1] - p3 := mem_2.Args[0] - if !(isConstZero(x) && o1 >= 0 && sizeof(t1)+o1 <= n && isSamePtr(p1, p3) && disjoint(op, sizeof(t1), p2, sizeof(t2))) { + d := v_1.AuxInt + if !(!uaddOvf(c, d)) { break } - v.reset(OpCopy) - v.Type = mem.Type - v.AddArg(mem) + v.reset(OpRsh64Ux64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = c + d + v.AddArg(v0) return true } - // match: (Store {t1} op:(OffPtr [o1] p1) x mem:(Store {t2} p2 _ (Store {t3} p3 _ (Zero [n] p4 _)))) - // cond: isConstZero(x) && o1 >= 0 && sizeof(t1) + o1 <= n && isSamePtr(p1, p4) && disjoint(op, sizeof(t1), p2, sizeof(t2)) && disjoint(op, sizeof(t1), p3, sizeof(t3)) - // result: mem + // match: (Rsh64Ux64 (Rsh64x64 x _) (Const64 [63])) + // result: (Rsh64Ux64 x (Const64 [63])) for { - t1 := v.Aux - _ = v.Args[2] - op := v.Args[0] - if op.Op != OpOffPtr { - break - } - o1 := op.AuxInt - p1 := op.Args[0] - x := v.Args[1] - mem := v.Args[2] - if mem.Op != OpStore { - break - } - t2 := mem.Aux - _ = mem.Args[2] - p2 := mem.Args[0] - mem_2 := mem.Args[2] - if mem_2.Op != OpStore { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpRsh64x64 { break } - t3 := mem_2.Aux - _ = mem_2.Args[2] - p3 := mem_2.Args[0] - mem_2_2 := mem_2.Args[2] - if mem_2_2.Op != OpZero { + _ = v_0.Args[1] + x := v_0.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - n := mem_2_2.AuxInt - _ = mem_2_2.Args[1] - p4 := mem_2_2.Args[0] - if !(isConstZero(x) && o1 >= 0 && sizeof(t1)+o1 <= n && isSamePtr(p1, p4) && disjoint(op, sizeof(t1), p2, sizeof(t2)) && disjoint(op, sizeof(t1), p3, sizeof(t3))) { + t := v_1.Type + if v_1.AuxInt != 63 { break } - v.reset(OpCopy) - v.Type = mem.Type - v.AddArg(mem) + v.reset(OpRsh64Ux64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = 63 + v.AddArg(v0) return true } - // match: (Store {t1} op:(OffPtr [o1] p1) x mem:(Store {t2} p2 _ (Store {t3} p3 _ (Store {t4} p4 _ (Zero [n] p5 _))))) - // cond: isConstZero(x) && o1 >= 0 && sizeof(t1) + o1 <= n && isSamePtr(p1, p5) && disjoint(op, sizeof(t1), p2, sizeof(t2)) && disjoint(op, sizeof(t1), p3, sizeof(t3)) && disjoint(op, sizeof(t1), p4, sizeof(t4)) - // result: mem + // match: (Rsh64Ux64 (Lsh64x64 (Rsh64Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) + // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) + // result: (Rsh64Ux64 x (Const64 [c1-c2+c3])) for { - t1 := v.Aux - _ = v.Args[2] - op := v.Args[0] - if op.Op != OpOffPtr { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpLsh64x64 { break } - o1 := op.AuxInt - p1 := op.Args[0] - x := v.Args[1] - mem := v.Args[2] - if mem.Op != OpStore { + _ = v_0.Args[1] + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpRsh64Ux64 { break } - t2 := mem.Aux - _ = mem.Args[2] - p2 := mem.Args[0] - mem_2 := mem.Args[2] - if mem_2.Op != OpStore { + _ = v_0_0.Args[1] + x := v_0_0.Args[0] + v_0_0_1 := v_0_0.Args[1] + if v_0_0_1.Op != OpConst64 { break } - t3 := mem_2.Aux - _ = mem_2.Args[2] - p3 := mem_2.Args[0] - mem_2_2 := mem_2.Args[2] - if mem_2_2.Op != OpStore { + c1 := v_0_0_1.AuxInt + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 { break } - t4 := mem_2_2.Aux - _ = mem_2_2.Args[2] - p4 := mem_2_2.Args[0] - mem_2_2_2 := mem_2_2.Args[2] - if mem_2_2_2.Op != OpZero { + c2 := v_0_1.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - n := mem_2_2_2.AuxInt - _ = mem_2_2_2.Args[1] - p5 := mem_2_2_2.Args[0] - if !(isConstZero(x) && o1 >= 0 && sizeof(t1)+o1 <= n && isSamePtr(p1, p5) && disjoint(op, sizeof(t1), p2, sizeof(t2)) && disjoint(op, sizeof(t1), p3, sizeof(t3)) && disjoint(op, sizeof(t1), p4, sizeof(t4))) { + c3 := v_1.AuxInt + if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { break } - v.reset(OpCopy) - v.Type = mem.Type - v.AddArg(mem) + v.reset(OpRsh64Ux64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v0.AuxInt = c1 - c2 + c3 + v.AddArg(v0) return true } - // match: (Store _ (StructMake0) mem) - // result: mem + // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [56])) (Const64 [56])) + // result: (ZeroExt8to64 (Trunc64to8 x)) for { - mem := v.Args[2] - v_1 := v.Args[1] - if v_1.Op != OpStructMake0 { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpLsh64x64 { break } - v.reset(OpCopy) - v.Type = mem.Type - v.AddArg(mem) - return true - } - // match: (Store dst (StructMake1 f0) mem) - // result: (Store {t.FieldType(0)} (OffPtr [0] dst) f0 mem) - for { - mem := v.Args[2] - dst := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpStructMake1 { + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 || v_0_1.AuxInt != 56 { break } - t := v_1.Type - f0 := v_1.Args[0] - v.reset(OpStore) - v.Aux = t.FieldType(0) - v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) - v0.AuxInt = 0 - v0.AddArg(dst) - v.AddArg(v0) - v.AddArg(f0) - v.AddArg(mem) - return true - } - return false -} -func rewriteValuegeneric_OpStore_10(v *Value) bool { - b := v.Block - config := b.Func.Config - fe := b.Func.fe - // match: (Store dst (StructMake2 f0 f1) mem) - // result: (Store {t.FieldType(1)} (OffPtr [t.FieldOff(1)] dst) f1 (Store {t.FieldType(0)} (OffPtr [0] dst) f0 mem)) - for { - mem := v.Args[2] - dst := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpStructMake2 { + if v_1.Op != OpConst64 || v_1.AuxInt != 56 { break } - t := v_1.Type - f1 := v_1.Args[1] - f0 := v_1.Args[0] - v.reset(OpStore) - v.Aux = t.FieldType(1) - v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) - v0.AuxInt = t.FieldOff(1) - v0.AddArg(dst) + v.reset(OpZeroExt8to64) + v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.UInt8) + v0.AddArg(x) v.AddArg(v0) - v.AddArg(f1) - v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v1.Aux = t.FieldType(0) - v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) - v2.AuxInt = 0 - v2.AddArg(dst) - v1.AddArg(v2) - v1.AddArg(f0) - v1.AddArg(mem) - v.AddArg(v1) return true } - // match: (Store dst (StructMake3 f0 f1 f2) mem) - // result: (Store {t.FieldType(2)} (OffPtr [t.FieldOff(2)] dst) f2 (Store {t.FieldType(1)} (OffPtr [t.FieldOff(1)] dst) f1 (Store {t.FieldType(0)} (OffPtr [0] dst) f0 mem))) + // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [48])) (Const64 [48])) + // result: (ZeroExt16to64 (Trunc64to16 x)) for { - mem := v.Args[2] - dst := v.Args[0] + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpLsh64x64 { + break + } + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 || v_0_1.AuxInt != 48 { + break + } v_1 := v.Args[1] - if v_1.Op != OpStructMake3 { + if v_1.Op != OpConst64 || v_1.AuxInt != 48 { break } - t := v_1.Type - f2 := v_1.Args[2] - f0 := v_1.Args[0] - f1 := v_1.Args[1] - v.reset(OpStore) - v.Aux = t.FieldType(2) - v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) - v0.AuxInt = t.FieldOff(2) - v0.AddArg(dst) + v.reset(OpZeroExt16to64) + v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.UInt16) + v0.AddArg(x) v.AddArg(v0) - v.AddArg(f2) - v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v1.Aux = t.FieldType(1) - v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) - v2.AuxInt = t.FieldOff(1) - v2.AddArg(dst) - v1.AddArg(v2) - v1.AddArg(f1) - v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v3.Aux = t.FieldType(0) - v4 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) - v4.AuxInt = 0 - v4.AddArg(dst) - v3.AddArg(v4) - v3.AddArg(f0) - v3.AddArg(mem) - v1.AddArg(v3) - v.AddArg(v1) return true } - // match: (Store dst (StructMake4 f0 f1 f2 f3) mem) - // result: (Store {t.FieldType(3)} (OffPtr [t.FieldOff(3)] dst) f3 (Store {t.FieldType(2)} (OffPtr [t.FieldOff(2)] dst) f2 (Store {t.FieldType(1)} (OffPtr [t.FieldOff(1)] dst) f1 (Store {t.FieldType(0)} (OffPtr [0] dst) f0 mem)))) + // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [32])) (Const64 [32])) + // result: (ZeroExt32to64 (Trunc64to32 x)) for { - mem := v.Args[2] - dst := v.Args[0] + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpLsh64x64 { + break + } + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 || v_0_1.AuxInt != 32 { + break + } v_1 := v.Args[1] - if v_1.Op != OpStructMake4 { + if v_1.Op != OpConst64 || v_1.AuxInt != 32 { break } - t := v_1.Type - f3 := v_1.Args[3] - f0 := v_1.Args[0] - f1 := v_1.Args[1] - f2 := v_1.Args[2] - v.reset(OpStore) - v.Aux = t.FieldType(3) - v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(3).PtrTo()) - v0.AuxInt = t.FieldOff(3) - v0.AddArg(dst) + v.reset(OpZeroExt32to64) + v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.UInt32) + v0.AddArg(x) v.AddArg(v0) - v.AddArg(f3) - v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v1.Aux = t.FieldType(2) - v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) - v2.AuxInt = t.FieldOff(2) - v2.AddArg(dst) - v1.AddArg(v2) - v1.AddArg(f2) - v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v3.Aux = t.FieldType(1) - v4 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) - v4.AuxInt = t.FieldOff(1) - v4.AddArg(dst) - v3.AddArg(v4) - v3.AddArg(f1) - v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v5.Aux = t.FieldType(0) - v6 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) - v6.AuxInt = 0 - v6.AddArg(dst) - v5.AddArg(v6) - v5.AddArg(f0) - v5.AddArg(mem) - v3.AddArg(v5) - v1.AddArg(v3) - v.AddArg(v1) return true } - // match: (Store {t} dst (Load src mem) mem) - // cond: !fe.CanSSA(t.(*types.Type)) - // result: (Move {t} [sizeof(t)] dst src mem) + return false +} +func rewriteValuegeneric_OpRsh64Ux8_0(v *Value) bool { + b := v.Block + // match: (Rsh64Ux8 x (Const8 [c])) + // result: (Rsh64Ux64 x (Const64 [int64(uint8(c))])) for { - t := v.Aux - mem := v.Args[2] - dst := v.Args[0] + t := v.Type + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpLoad { + if v_1.Op != OpConst8 { break } - _ = v_1.Args[1] - src := v_1.Args[0] - if mem != v_1.Args[1] || !(!fe.CanSSA(t.(*types.Type))) { + c := v_1.AuxInt + v.reset(OpRsh64Ux64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint8(c)) + v.AddArg(v0) + return true + } + // match: (Rsh64Ux8 (Const64 [0]) _) + // result: (Const64 [0]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst64 || v_0.AuxInt != 0 { break } - v.reset(OpMove) - v.AuxInt = sizeof(t) - v.Aux = t - v.AddArg(dst) - v.AddArg(src) - v.AddArg(mem) + v.reset(OpConst64) + v.AuxInt = 0 return true } - // match: (Store {t} dst (Load src mem) (VarDef {x} mem)) - // cond: !fe.CanSSA(t.(*types.Type)) - // result: (Move {t} [sizeof(t)] dst src (VarDef {x} mem)) + return false +} +func rewriteValuegeneric_OpRsh64x16_0(v *Value) bool { + b := v.Block + // match: (Rsh64x16 x (Const16 [c])) + // result: (Rsh64x64 x (Const64 [int64(uint16(c))])) for { - t := v.Aux - _ = v.Args[2] - dst := v.Args[0] + t := v.Type + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpLoad { - break - } - mem := v_1.Args[1] - src := v_1.Args[0] - v_2 := v.Args[2] - if v_2.Op != OpVarDef { - break - } - x := v_2.Aux - if mem != v_2.Args[0] || !(!fe.CanSSA(t.(*types.Type))) { + if v_1.Op != OpConst16 { break } - v.reset(OpMove) - v.AuxInt = sizeof(t) - v.Aux = t - v.AddArg(dst) - v.AddArg(src) - v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem) - v0.Aux = x - v0.AddArg(mem) + c := v_1.AuxInt + v.reset(OpRsh64x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint16(c)) v.AddArg(v0) return true } - // match: (Store _ (ArrayMake0) mem) - // result: mem + // match: (Rsh64x16 (Const64 [0]) _) + // result: (Const64 [0]) for { - mem := v.Args[2] - v_1 := v.Args[1] - if v_1.Op != OpArrayMake0 { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst64 || v_0.AuxInt != 0 { break } - v.reset(OpCopy) - v.Type = mem.Type - v.AddArg(mem) + v.reset(OpConst64) + v.AuxInt = 0 return true } - // match: (Store dst (ArrayMake1 e) mem) - // result: (Store {e.Type} dst e mem) + return false +} +func rewriteValuegeneric_OpRsh64x32_0(v *Value) bool { + b := v.Block + // match: (Rsh64x32 x (Const32 [c])) + // result: (Rsh64x64 x (Const64 [int64(uint32(c))])) for { - mem := v.Args[2] - dst := v.Args[0] + t := v.Type + _ = v.Args[1] + x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpArrayMake1 { + if v_1.Op != OpConst32 { break } - e := v_1.Args[0] - v.reset(OpStore) - v.Aux = e.Type - v.AddArg(dst) - v.AddArg(e) - v.AddArg(mem) + c := v_1.AuxInt + v.reset(OpRsh64x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint32(c)) + v.AddArg(v0) return true } - // match: (Store (Load (OffPtr [c] (SP)) mem) x mem) - // cond: isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize - // result: mem + // match: (Rsh64x32 (Const64 [0]) _) + // result: (Const64 [0]) for { - mem := v.Args[2] + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpLoad { - break - } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpOffPtr { - break - } - c := v_0_0.AuxInt - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpSP || mem != v_0.Args[1] { - break - } - x := v.Args[1] - if !(isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { + if v_0.Op != OpConst64 || v_0.AuxInt != 0 { break } - v.reset(OpCopy) - v.Type = mem.Type - v.AddArg(mem) + v.reset(OpConst64) + v.AuxInt = 0 return true } - // match: (Store (OffPtr (Load (OffPtr [c] (SP)) mem)) x mem) - // cond: isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize - // result: mem + return false +} +func rewriteValuegeneric_OpRsh64x64_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (Rsh64x64 (Const64 [c]) (Const64 [d])) + // result: (Const64 [c >> uint64(d)]) for { - mem := v.Args[2] + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpOffPtr { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpLoad { - break - } - _ = v_0_0.Args[1] - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpOffPtr { + if v_0.Op != OpConst64 { break } - c := v_0_0_0.AuxInt - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpSP || mem != v_0_0.Args[1] { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - x := v.Args[1] - if !(isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { + d := v_1.AuxInt + v.reset(OpConst64) + v.AuxInt = c >> uint64(d) + return true + } + // match: (Rsh64x64 x (Const64 [0])) + // result: x + for { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst64 || v_1.AuxInt != 0 { break } v.reset(OpCopy) - v.Type = mem.Type - v.AddArg(mem) + v.Type = x.Type + v.AddArg(x) return true } - // match: (Store {t1} op1:(OffPtr [o1] p1) d1 m2:(Store {t2} op2:(OffPtr [0] p2) d2 m3:(Move [n] p3 _ mem))) - // cond: m2.Uses == 1 && m3.Uses == 1 && o1 == sizeof(t2) && n == sizeof(t2) + sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && clobber(m2) && clobber(m3) - // result: (Store {t1} op1 d1 (Store {t2} op2 d2 mem)) + // match: (Rsh64x64 (Const64 [0]) _) + // result: (Const64 [0]) for { - t1 := v.Aux - _ = v.Args[2] - op1 := v.Args[0] - if op1.Op != OpOffPtr { - break - } - o1 := op1.AuxInt - p1 := op1.Args[0] - d1 := v.Args[1] - m2 := v.Args[2] - if m2.Op != OpStore { - break - } - t2 := m2.Aux - _ = m2.Args[2] - op2 := m2.Args[0] - if op2.Op != OpOffPtr || op2.AuxInt != 0 { - break - } - p2 := op2.Args[0] - d2 := m2.Args[1] - m3 := m2.Args[2] - if m3.Op != OpMove { - break - } - n := m3.AuxInt - mem := m3.Args[2] - p3 := m3.Args[0] - if !(m2.Uses == 1 && m3.Uses == 1 && o1 == sizeof(t2) && n == sizeof(t2)+sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && clobber(m2) && clobber(m3)) { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst64 || v_0.AuxInt != 0 { break } - v.reset(OpStore) - v.Aux = t1 - v.AddArg(op1) - v.AddArg(d1) - v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v0.Aux = t2 - v0.AddArg(op2) - v0.AddArg(d2) - v0.AddArg(mem) - v.AddArg(v0) + v.reset(OpConst64) + v.AuxInt = 0 return true } - return false -} -func rewriteValuegeneric_OpStore_20(v *Value) bool { - b := v.Block - // match: (Store {t1} op1:(OffPtr [o1] p1) d1 m2:(Store {t2} op2:(OffPtr [o2] p2) d2 m3:(Store {t3} op3:(OffPtr [0] p3) d3 m4:(Move [n] p4 _ mem)))) - // cond: m2.Uses == 1 && m3.Uses == 1 && m4.Uses == 1 && o2 == sizeof(t3) && o1-o2 == sizeof(t2) && n == sizeof(t3) + sizeof(t2) + sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && clobber(m2) && clobber(m3) && clobber(m4) - // result: (Store {t1} op1 d1 (Store {t2} op2 d2 (Store {t3} op3 d3 mem))) + // match: (Rsh64x64 (Rsh64x64 x (Const64 [c])) (Const64 [d])) + // cond: !uaddOvf(c,d) + // result: (Rsh64x64 x (Const64 [c+d])) for { - t1 := v.Aux - _ = v.Args[2] - op1 := v.Args[0] - if op1.Op != OpOffPtr { + t := v.Type + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpRsh64x64 { break } - o1 := op1.AuxInt - p1 := op1.Args[0] - d1 := v.Args[1] - m2 := v.Args[2] - if m2.Op != OpStore { + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 { break } - t2 := m2.Aux - _ = m2.Args[2] - op2 := m2.Args[0] - if op2.Op != OpOffPtr { + c := v_0_1.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - o2 := op2.AuxInt - p2 := op2.Args[0] - d2 := m2.Args[1] - m3 := m2.Args[2] - if m3.Op != OpStore { + d := v_1.AuxInt + if !(!uaddOvf(c, d)) { break } - t3 := m3.Aux - _ = m3.Args[2] - op3 := m3.Args[0] - if op3.Op != OpOffPtr || op3.AuxInt != 0 { + v.reset(OpRsh64x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = c + d + v.AddArg(v0) + return true + } + // match: (Rsh64x64 (Lsh64x64 x (Const64 [56])) (Const64 [56])) + // result: (SignExt8to64 (Trunc64to8 x)) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpLsh64x64 { break } - p3 := op3.Args[0] - d3 := m3.Args[1] - m4 := m3.Args[2] - if m4.Op != OpMove { + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 || v_0_1.AuxInt != 56 { break } - n := m4.AuxInt - mem := m4.Args[2] - p4 := m4.Args[0] - if !(m2.Uses == 1 && m3.Uses == 1 && m4.Uses == 1 && o2 == sizeof(t3) && o1-o2 == sizeof(t2) && n == sizeof(t3)+sizeof(t2)+sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && clobber(m2) && clobber(m3) && clobber(m4)) { + v_1 := v.Args[1] + if v_1.Op != OpConst64 || v_1.AuxInt != 56 { break } - v.reset(OpStore) - v.Aux = t1 - v.AddArg(op1) - v.AddArg(d1) - v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v0.Aux = t2 - v0.AddArg(op2) - v0.AddArg(d2) - v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v1.Aux = t3 - v1.AddArg(op3) - v1.AddArg(d3) - v1.AddArg(mem) - v0.AddArg(v1) + v.reset(OpSignExt8to64) + v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.Int8) + v0.AddArg(x) v.AddArg(v0) return true } - // match: (Store {t1} op1:(OffPtr [o1] p1) d1 m2:(Store {t2} op2:(OffPtr [o2] p2) d2 m3:(Store {t3} op3:(OffPtr [o3] p3) d3 m4:(Store {t4} op4:(OffPtr [0] p4) d4 m5:(Move [n] p5 _ mem))))) - // cond: m2.Uses == 1 && m3.Uses == 1 && m4.Uses == 1 && m5.Uses == 1 && o3 == sizeof(t4) && o2-o3 == sizeof(t3) && o1-o2 == sizeof(t2) && n == sizeof(t4) + sizeof(t3) + sizeof(t2) + sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && clobber(m2) && clobber(m3) && clobber(m4) && clobber(m5) - // result: (Store {t1} op1 d1 (Store {t2} op2 d2 (Store {t3} op3 d3 (Store {t4} op4 d4 mem)))) + // match: (Rsh64x64 (Lsh64x64 x (Const64 [48])) (Const64 [48])) + // result: (SignExt16to64 (Trunc64to16 x)) for { - t1 := v.Aux - _ = v.Args[2] - op1 := v.Args[0] - if op1.Op != OpOffPtr { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpLsh64x64 { break } - o1 := op1.AuxInt - p1 := op1.Args[0] - d1 := v.Args[1] - m2 := v.Args[2] - if m2.Op != OpStore { + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 || v_0_1.AuxInt != 48 { break } - t2 := m2.Aux - _ = m2.Args[2] - op2 := m2.Args[0] - if op2.Op != OpOffPtr { + v_1 := v.Args[1] + if v_1.Op != OpConst64 || v_1.AuxInt != 48 { break } - o2 := op2.AuxInt - p2 := op2.Args[0] - d2 := m2.Args[1] - m3 := m2.Args[2] - if m3.Op != OpStore { + v.reset(OpSignExt16to64) + v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.Int16) + v0.AddArg(x) + v.AddArg(v0) + return true + } + // match: (Rsh64x64 (Lsh64x64 x (Const64 [32])) (Const64 [32])) + // result: (SignExt32to64 (Trunc64to32 x)) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpLsh64x64 { break } - t3 := m3.Aux - _ = m3.Args[2] - op3 := m3.Args[0] - if op3.Op != OpOffPtr { + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 || v_0_1.AuxInt != 32 { break } - o3 := op3.AuxInt - p3 := op3.Args[0] - d3 := m3.Args[1] - m4 := m3.Args[2] - if m4.Op != OpStore { + v_1 := v.Args[1] + if v_1.Op != OpConst64 || v_1.AuxInt != 32 { break } - t4 := m4.Aux - _ = m4.Args[2] - op4 := m4.Args[0] - if op4.Op != OpOffPtr || op4.AuxInt != 0 { + v.reset(OpSignExt32to64) + v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.Int32) + v0.AddArg(x) + v.AddArg(v0) + return true + } + return false +} +func rewriteValuegeneric_OpRsh64x8_0(v *Value) bool { + b := v.Block + // match: (Rsh64x8 x (Const8 [c])) + // result: (Rsh64x64 x (Const64 [int64(uint8(c))])) + for { + t := v.Type + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst8 { break } - p4 := op4.Args[0] - d4 := m4.Args[1] - m5 := m4.Args[2] - if m5.Op != OpMove { + c := v_1.AuxInt + v.reset(OpRsh64x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint8(c)) + v.AddArg(v0) + return true + } + // match: (Rsh64x8 (Const64 [0]) _) + // result: (Const64 [0]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst64 || v_0.AuxInt != 0 { break } - n := m5.AuxInt - mem := m5.Args[2] - p5 := m5.Args[0] - if !(m2.Uses == 1 && m3.Uses == 1 && m4.Uses == 1 && m5.Uses == 1 && o3 == sizeof(t4) && o2-o3 == sizeof(t3) && o1-o2 == sizeof(t2) && n == sizeof(t4)+sizeof(t3)+sizeof(t2)+sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && clobber(m2) && clobber(m3) && clobber(m4) && clobber(m5)) { + v.reset(OpConst64) + v.AuxInt = 0 + return true + } + return false +} +func rewriteValuegeneric_OpRsh8Ux16_0(v *Value) bool { + b := v.Block + // match: (Rsh8Ux16 x (Const16 [c])) + // result: (Rsh8Ux64 x (Const64 [int64(uint16(c))])) + for { + t := v.Type + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst16 { break } - v.reset(OpStore) - v.Aux = t1 - v.AddArg(op1) - v.AddArg(d1) - v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v0.Aux = t2 - v0.AddArg(op2) - v0.AddArg(d2) - v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v1.Aux = t3 - v1.AddArg(op3) - v1.AddArg(d3) - v2 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v2.Aux = t4 - v2.AddArg(op4) - v2.AddArg(d4) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) + c := v_1.AuxInt + v.reset(OpRsh8Ux64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint16(c)) + v.AddArg(v0) + return true + } + // match: (Rsh8Ux16 (Const8 [0]) _) + // result: (Const8 [0]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst8 || v_0.AuxInt != 0 { + break + } + v.reset(OpConst8) + v.AuxInt = 0 + return true + } + return false +} +func rewriteValuegeneric_OpRsh8Ux32_0(v *Value) bool { + b := v.Block + // match: (Rsh8Ux32 x (Const32 [c])) + // result: (Rsh8Ux64 x (Const64 [int64(uint32(c))])) + for { + t := v.Type + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst32 { + break + } + c := v_1.AuxInt + v.reset(OpRsh8Ux64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint32(c)) v.AddArg(v0) return true } - // match: (Store {t1} op1:(OffPtr [o1] p1) d1 m2:(Store {t2} op2:(OffPtr [0] p2) d2 m3:(Zero [n] p3 mem))) - // cond: m2.Uses == 1 && m3.Uses == 1 && o1 == sizeof(t2) && n == sizeof(t2) + sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && clobber(m2) && clobber(m3) - // result: (Store {t1} op1 d1 (Store {t2} op2 d2 mem)) + // match: (Rsh8Ux32 (Const8 [0]) _) + // result: (Const8 [0]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst8 || v_0.AuxInt != 0 { + break + } + v.reset(OpConst8) + v.AuxInt = 0 + return true + } + return false +} +func rewriteValuegeneric_OpRsh8Ux64_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (Rsh8Ux64 (Const8 [c]) (Const64 [d])) + // result: (Const8 [int64(int8(uint8(c) >> uint64(d)))]) for { - t1 := v.Aux - _ = v.Args[2] - op1 := v.Args[0] - if op1.Op != OpOffPtr { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst8 { break } - o1 := op1.AuxInt - p1 := op1.Args[0] - d1 := v.Args[1] - m2 := v.Args[2] - if m2.Op != OpStore { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - t2 := m2.Aux - _ = m2.Args[2] - op2 := m2.Args[0] - if op2.Op != OpOffPtr || op2.AuxInt != 0 { + d := v_1.AuxInt + v.reset(OpConst8) + v.AuxInt = int64(int8(uint8(c) >> uint64(d))) + return true + } + // match: (Rsh8Ux64 x (Const64 [0])) + // result: x + for { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst64 || v_1.AuxInt != 0 { break } - p2 := op2.Args[0] - d2 := m2.Args[1] - m3 := m2.Args[2] - if m3.Op != OpZero { + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + // match: (Rsh8Ux64 (Const8 [0]) _) + // result: (Const8 [0]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst8 || v_0.AuxInt != 0 { break } - n := m3.AuxInt - mem := m3.Args[1] - p3 := m3.Args[0] - if !(m2.Uses == 1 && m3.Uses == 1 && o1 == sizeof(t2) && n == sizeof(t2)+sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && clobber(m2) && clobber(m3)) { + v.reset(OpConst8) + v.AuxInt = 0 + return true + } + // match: (Rsh8Ux64 _ (Const64 [c])) + // cond: uint64(c) >= 8 + // result: (Const8 [0]) + for { + _ = v.Args[1] + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - v.reset(OpStore) - v.Aux = t1 - v.AddArg(op1) - v.AddArg(d1) - v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v0.Aux = t2 - v0.AddArg(op2) - v0.AddArg(d2) - v0.AddArg(mem) - v.AddArg(v0) + c := v_1.AuxInt + if !(uint64(c) >= 8) { + break + } + v.reset(OpConst8) + v.AuxInt = 0 return true } - // match: (Store {t1} op1:(OffPtr [o1] p1) d1 m2:(Store {t2} op2:(OffPtr [o2] p2) d2 m3:(Store {t3} op3:(OffPtr [0] p3) d3 m4:(Zero [n] p4 mem)))) - // cond: m2.Uses == 1 && m3.Uses == 1 && m4.Uses == 1 && o2 == sizeof(t3) && o1-o2 == sizeof(t2) && n == sizeof(t3) + sizeof(t2) + sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && clobber(m2) && clobber(m3) && clobber(m4) - // result: (Store {t1} op1 d1 (Store {t2} op2 d2 (Store {t3} op3 d3 mem))) + // match: (Rsh8Ux64 (Rsh8Ux64 x (Const64 [c])) (Const64 [d])) + // cond: !uaddOvf(c,d) + // result: (Rsh8Ux64 x (Const64 [c+d])) for { - t1 := v.Aux - _ = v.Args[2] - op1 := v.Args[0] - if op1.Op != OpOffPtr { + t := v.Type + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpRsh8Ux64 { break } - o1 := op1.AuxInt - p1 := op1.Args[0] - d1 := v.Args[1] - m2 := v.Args[2] - if m2.Op != OpStore { + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 { break } - t2 := m2.Aux - _ = m2.Args[2] - op2 := m2.Args[0] - if op2.Op != OpOffPtr { + c := v_0_1.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - o2 := op2.AuxInt - p2 := op2.Args[0] - d2 := m2.Args[1] - m3 := m2.Args[2] - if m3.Op != OpStore { + d := v_1.AuxInt + if !(!uaddOvf(c, d)) { break } - t3 := m3.Aux - _ = m3.Args[2] - op3 := m3.Args[0] - if op3.Op != OpOffPtr || op3.AuxInt != 0 { + v.reset(OpRsh8Ux64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = c + d + v.AddArg(v0) + return true + } + // match: (Rsh8Ux64 (Rsh8x64 x _) (Const64 [7] )) + // result: (Rsh8Ux64 x (Const64 [7] )) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpRsh8x64 { break } - p3 := op3.Args[0] - d3 := m3.Args[1] - m4 := m3.Args[2] - if m4.Op != OpZero { + _ = v_0.Args[1] + x := v_0.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - n := m4.AuxInt - mem := m4.Args[1] - p4 := m4.Args[0] - if !(m2.Uses == 1 && m3.Uses == 1 && m4.Uses == 1 && o2 == sizeof(t3) && o1-o2 == sizeof(t2) && n == sizeof(t3)+sizeof(t2)+sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && clobber(m2) && clobber(m3) && clobber(m4)) { + t := v_1.Type + if v_1.AuxInt != 7 { break } - v.reset(OpStore) - v.Aux = t1 - v.AddArg(op1) - v.AddArg(d1) - v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v0.Aux = t2 - v0.AddArg(op2) - v0.AddArg(d2) - v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v1.Aux = t3 - v1.AddArg(op3) - v1.AddArg(d3) - v1.AddArg(mem) - v0.AddArg(v1) + v.reset(OpRsh8Ux64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = 7 v.AddArg(v0) return true } - // match: (Store {t1} op1:(OffPtr [o1] p1) d1 m2:(Store {t2} op2:(OffPtr [o2] p2) d2 m3:(Store {t3} op3:(OffPtr [o3] p3) d3 m4:(Store {t4} op4:(OffPtr [0] p4) d4 m5:(Zero [n] p5 mem))))) - // cond: m2.Uses == 1 && m3.Uses == 1 && m4.Uses == 1 && m5.Uses == 1 && o3 == sizeof(t4) && o2-o3 == sizeof(t3) && o1-o2 == sizeof(t2) && n == sizeof(t4) + sizeof(t3) + sizeof(t2) + sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && clobber(m2) && clobber(m3) && clobber(m4) && clobber(m5) - // result: (Store {t1} op1 d1 (Store {t2} op2 d2 (Store {t3} op3 d3 (Store {t4} op4 d4 mem)))) + // match: (Rsh8Ux64 (Lsh8x64 (Rsh8Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) + // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) + // result: (Rsh8Ux64 x (Const64 [c1-c2+c3])) for { - t1 := v.Aux - _ = v.Args[2] - op1 := v.Args[0] - if op1.Op != OpOffPtr { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpLsh8x64 { break } - o1 := op1.AuxInt - p1 := op1.Args[0] - d1 := v.Args[1] - m2 := v.Args[2] - if m2.Op != OpStore { + _ = v_0.Args[1] + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpRsh8Ux64 { break } - t2 := m2.Aux - _ = m2.Args[2] - op2 := m2.Args[0] - if op2.Op != OpOffPtr { + _ = v_0_0.Args[1] + x := v_0_0.Args[0] + v_0_0_1 := v_0_0.Args[1] + if v_0_0_1.Op != OpConst64 { break } - o2 := op2.AuxInt - p2 := op2.Args[0] - d2 := m2.Args[1] - m3 := m2.Args[2] - if m3.Op != OpStore { + c1 := v_0_0_1.AuxInt + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 { break } - t3 := m3.Aux - _ = m3.Args[2] - op3 := m3.Args[0] - if op3.Op != OpOffPtr { + c2 := v_0_1.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - o3 := op3.AuxInt - p3 := op3.Args[0] - d3 := m3.Args[1] - m4 := m3.Args[2] - if m4.Op != OpStore { + c3 := v_1.AuxInt + if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { break } - t4 := m4.Aux - _ = m4.Args[2] - op4 := m4.Args[0] - if op4.Op != OpOffPtr || op4.AuxInt != 0 { + v.reset(OpRsh8Ux64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) + v0.AuxInt = c1 - c2 + c3 + v.AddArg(v0) + return true + } + return false +} +func rewriteValuegeneric_OpRsh8Ux8_0(v *Value) bool { + b := v.Block + // match: (Rsh8Ux8 x (Const8 [c])) + // result: (Rsh8Ux64 x (Const64 [int64(uint8(c))])) + for { + t := v.Type + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst8 { + break + } + c := v_1.AuxInt + v.reset(OpRsh8Ux64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint8(c)) + v.AddArg(v0) + return true + } + // match: (Rsh8Ux8 (Const8 [0]) _) + // result: (Const8 [0]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst8 || v_0.AuxInt != 0 { break } - p4 := op4.Args[0] - d4 := m4.Args[1] - m5 := m4.Args[2] - if m5.Op != OpZero { + v.reset(OpConst8) + v.AuxInt = 0 + return true + } + return false +} +func rewriteValuegeneric_OpRsh8x16_0(v *Value) bool { + b := v.Block + // match: (Rsh8x16 x (Const16 [c])) + // result: (Rsh8x64 x (Const64 [int64(uint16(c))])) + for { + t := v.Type + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst16 { break } - n := m5.AuxInt - mem := m5.Args[1] - p5 := m5.Args[0] - if !(m2.Uses == 1 && m3.Uses == 1 && m4.Uses == 1 && m5.Uses == 1 && o3 == sizeof(t4) && o2-o3 == sizeof(t3) && o1-o2 == sizeof(t2) && n == sizeof(t4)+sizeof(t3)+sizeof(t2)+sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && clobber(m2) && clobber(m3) && clobber(m4) && clobber(m5)) { + c := v_1.AuxInt + v.reset(OpRsh8x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint16(c)) + v.AddArg(v0) + return true + } + // match: (Rsh8x16 (Const8 [0]) _) + // result: (Const8 [0]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst8 || v_0.AuxInt != 0 { break } - v.reset(OpStore) - v.Aux = t1 - v.AddArg(op1) - v.AddArg(d1) - v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v0.Aux = t2 - v0.AddArg(op2) - v0.AddArg(d2) - v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v1.Aux = t3 - v1.AddArg(op3) - v1.AddArg(d3) - v2 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v2.Aux = t4 - v2.AddArg(op4) - v2.AddArg(d4) - v2.AddArg(mem) - v1.AddArg(v2) - v0.AddArg(v1) - v.AddArg(v0) + v.reset(OpConst8) + v.AuxInt = 0 return true } return false } -func rewriteValuegeneric_OpStringLen_0(v *Value) bool { - // match: (StringLen (StringMake _ (Const64 [c]))) - // result: (Const64 [c]) +func rewriteValuegeneric_OpRsh8x32_0(v *Value) bool { + b := v.Block + // match: (Rsh8x32 x (Const32 [c])) + // result: (Rsh8x64 x (Const64 [int64(uint32(c))])) for { - v_0 := v.Args[0] - if v_0.Op != OpStringMake { + t := v.Type + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst32 { break } - _ = v_0.Args[1] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { + c := v_1.AuxInt + v.reset(OpRsh8x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint32(c)) + v.AddArg(v0) + return true + } + // match: (Rsh8x32 (Const8 [0]) _) + // result: (Const8 [0]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst8 || v_0.AuxInt != 0 { break } - t := v_0_1.Type - c := v_0_1.AuxInt - v.reset(OpConst64) - v.Type = t - v.AuxInt = c + v.reset(OpConst8) + v.AuxInt = 0 return true } return false } -func rewriteValuegeneric_OpStringPtr_0(v *Value) bool { - // match: (StringPtr (StringMake (Addr {s} base) _)) - // result: (Addr {s} base) +func rewriteValuegeneric_OpRsh8x64_0(v *Value) bool { + b := v.Block + // match: (Rsh8x64 (Const8 [c]) (Const64 [d])) + // result: (Const8 [int64(int8(c) >> uint64(d))]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpStringMake { + if v_0.Op != OpConst8 { break } - _ = v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAddr { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - t := v_0_0.Type - s := v_0_0.Aux - base := v_0_0.Args[0] - v.reset(OpAddr) - v.Type = t - v.Aux = s - v.AddArg(base) + d := v_1.AuxInt + v.reset(OpConst8) + v.AuxInt = int64(int8(c) >> uint64(d)) return true } - return false -} -func rewriteValuegeneric_OpStructSelect_0(v *Value) bool { - // match: (StructSelect (StructMake1 x)) + // match: (Rsh8x64 x (Const64 [0])) // result: x for { - v_0 := v.Args[0] - if v_0.Op != OpStructMake1 { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst64 || v_1.AuxInt != 0 { break } - x := v_0.Args[0] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) return true } - // match: (StructSelect [0] (StructMake2 x _)) - // result: x + // match: (Rsh8x64 (Const8 [0]) _) + // result: (Const8 [0]) for { - if v.AuxInt != 0 { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpConst8 || v_0.AuxInt != 0 { break } + v.reset(OpConst8) + v.AuxInt = 0 + return true + } + // match: (Rsh8x64 (Rsh8x64 x (Const64 [c])) (Const64 [d])) + // cond: !uaddOvf(c,d) + // result: (Rsh8x64 x (Const64 [c+d])) + for { + t := v.Type + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpStructMake2 { + if v_0.Op != OpRsh8x64 { break } _ = v_0.Args[1] x := v_0.Args[0] - v.reset(OpCopy) - v.Type = x.Type + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 { + break + } + c := v_0_1.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { + break + } + d := v_1.AuxInt + if !(!uaddOvf(c, d)) { + break + } + v.reset(OpRsh8x64) v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = c + d + v.AddArg(v0) return true } - // match: (StructSelect [1] (StructMake2 _ x)) - // result: x + return false +} +func rewriteValuegeneric_OpRsh8x8_0(v *Value) bool { + b := v.Block + // match: (Rsh8x8 x (Const8 [c])) + // result: (Rsh8x64 x (Const64 [int64(uint8(c))])) for { - if v.AuxInt != 1 { + t := v.Type + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst8 { break } + c := v_1.AuxInt + v.reset(OpRsh8x64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64(uint8(c)) + v.AddArg(v0) + return true + } + // match: (Rsh8x8 (Const8 [0]) _) + // result: (Const8 [0]) + for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpStructMake2 { + if v_0.Op != OpConst8 || v_0.AuxInt != 0 { break } - x := v_0.Args[1] - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + v.reset(OpConst8) + v.AuxInt = 0 return true } - // match: (StructSelect [0] (StructMake3 x _ _)) - // result: x + return false +} +func rewriteValuegeneric_OpSelect0_0(v *Value) bool { + // match: (Select0 (Div128u (Const64 [0]) lo y)) + // result: (Div64u lo y) for { - if v.AuxInt != 0 { + v_0 := v.Args[0] + if v_0.Op != OpDiv128u { break } + y := v_0.Args[2] + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpConst64 || v_0_0.AuxInt != 0 { + break + } + lo := v_0.Args[1] + v.reset(OpDiv64u) + v.AddArg(lo) + v.AddArg(y) + return true + } + return false +} +func rewriteValuegeneric_OpSelect1_0(v *Value) bool { + // match: (Select1 (Div128u (Const64 [0]) lo y)) + // result: (Mod64u lo y) + for { v_0 := v.Args[0] - if v_0.Op != OpStructMake3 { + if v_0.Op != OpDiv128u { + break + } + y := v_0.Args[2] + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpConst64 || v_0_0.AuxInt != 0 { break } - _ = v_0.Args[2] - x := v_0.Args[0] - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + lo := v_0.Args[1] + v.reset(OpMod64u) + v.AddArg(lo) + v.AddArg(y) return true } - // match: (StructSelect [1] (StructMake3 _ x _)) - // result: x + return false +} +func rewriteValuegeneric_OpSignExt16to32_0(v *Value) bool { + // match: (SignExt16to32 (Const16 [c])) + // result: (Const32 [int64( int16(c))]) for { - if v.AuxInt != 1 { - break - } v_0 := v.Args[0] - if v_0.Op != OpStructMake3 { + if v_0.Op != OpConst16 { break } - _ = v_0.Args[2] - x := v_0.Args[1] - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + c := v_0.AuxInt + v.reset(OpConst32) + v.AuxInt = int64(int16(c)) return true } - // match: (StructSelect [2] (StructMake3 _ _ x)) + // match: (SignExt16to32 (Trunc32to16 x:(Rsh32x64 _ (Const64 [s])))) + // cond: s >= 16 // result: x for { - if v.AuxInt != 2 { + v_0 := v.Args[0] + if v_0.Op != OpTrunc32to16 { break } - v_0 := v.Args[0] - if v_0.Op != OpStructMake3 { + x := v_0.Args[0] + if x.Op != OpRsh32x64 { break } - x := v_0.Args[2] - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (StructSelect [0] (StructMake4 x _ _ _)) - // result: x - for { - if v.AuxInt != 0 { + _ = x.Args[1] + x_1 := x.Args[1] + if x_1.Op != OpConst64 { break } - v_0 := v.Args[0] - if v_0.Op != OpStructMake4 { + s := x_1.AuxInt + if !(s >= 16) { break } - _ = v_0.Args[3] - x := v_0.Args[0] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) return true } - // match: (StructSelect [1] (StructMake4 _ x _ _)) - // result: x + return false +} +func rewriteValuegeneric_OpSignExt16to64_0(v *Value) bool { + // match: (SignExt16to64 (Const16 [c])) + // result: (Const64 [int64( int16(c))]) for { - if v.AuxInt != 1 { - break - } v_0 := v.Args[0] - if v_0.Op != OpStructMake4 { + if v_0.Op != OpConst16 { break } - _ = v_0.Args[3] - x := v_0.Args[1] - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + c := v_0.AuxInt + v.reset(OpConst64) + v.AuxInt = int64(int16(c)) return true } - // match: (StructSelect [2] (StructMake4 _ _ x _)) + // match: (SignExt16to64 (Trunc64to16 x:(Rsh64x64 _ (Const64 [s])))) + // cond: s >= 48 // result: x for { - if v.AuxInt != 2 { + v_0 := v.Args[0] + if v_0.Op != OpTrunc64to16 { break } - v_0 := v.Args[0] - if v_0.Op != OpStructMake4 { + x := v_0.Args[0] + if x.Op != OpRsh64x64 { break } - _ = v_0.Args[3] - x := v_0.Args[2] - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (StructSelect [3] (StructMake4 _ _ _ x)) - // result: x - for { - if v.AuxInt != 3 { + _ = x.Args[1] + x_1 := x.Args[1] + if x_1.Op != OpConst64 { break } - v_0 := v.Args[0] - if v_0.Op != OpStructMake4 { + s := x_1.AuxInt + if !(s >= 48) { break } - x := v_0.Args[3] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -44197,1508 +20556,1529 @@ func rewriteValuegeneric_OpStructSelect_0(v *Value) bool { } return false } -func rewriteValuegeneric_OpStructSelect_10(v *Value) bool { - b := v.Block - fe := b.Func.fe - // match: (StructSelect [i] x:(Load ptr mem)) - // cond: !fe.CanSSA(t) - // result: @x.Block (Load (OffPtr [t.FieldOff(int(i))] ptr) mem) +func rewriteValuegeneric_OpSignExt32to64_0(v *Value) bool { + // match: (SignExt32to64 (Const32 [c])) + // result: (Const64 [int64( int32(c))]) for { - i := v.AuxInt - x := v.Args[0] - if x.Op != OpLoad { - break - } - t := x.Type - mem := x.Args[1] - ptr := x.Args[0] - if !(!fe.CanSSA(t)) { + v_0 := v.Args[0] + if v_0.Op != OpConst32 { break } - b = x.Block - v0 := b.NewValue0(v.Pos, OpLoad, v.Type) - v.reset(OpCopy) - v.AddArg(v0) - v1 := b.NewValue0(v.Pos, OpOffPtr, v.Type.PtrTo()) - v1.AuxInt = t.FieldOff(int(i)) - v1.AddArg(ptr) - v0.AddArg(v1) - v0.AddArg(mem) + c := v_0.AuxInt + v.reset(OpConst64) + v.AuxInt = int64(int32(c)) return true } - // match: (StructSelect [0] (IData x)) - // result: (IData x) + // match: (SignExt32to64 (Trunc64to32 x:(Rsh64x64 _ (Const64 [s])))) + // cond: s >= 32 + // result: x for { - if v.AuxInt != 0 { - break - } v_0 := v.Args[0] - if v_0.Op != OpIData { + if v_0.Op != OpTrunc64to32 { break } x := v_0.Args[0] - v.reset(OpIData) + if x.Op != OpRsh64x64 { + break + } + _ = x.Args[1] + x_1 := x.Args[1] + if x_1.Op != OpConst64 { + break + } + s := x_1.AuxInt + if !(s >= 32) { + break + } + v.reset(OpCopy) + v.Type = x.Type v.AddArg(x) return true } return false } -func rewriteValuegeneric_OpSub16_0(v *Value) bool { - b := v.Block - // match: (Sub16 (Const16 [c]) (Const16 [d])) - // result: (Const16 [int64(int16(c-d))]) +func rewriteValuegeneric_OpSignExt8to16_0(v *Value) bool { + // match: (SignExt8to16 (Const8 [c])) + // result: (Const16 [int64( int8(c))]) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst16 { + if v_0.Op != OpConst8 { break } c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 { - break - } - d := v_1.AuxInt v.reset(OpConst16) - v.AuxInt = int64(int16(c - d)) + v.AuxInt = int64(int8(c)) return true } - // match: (Sub16 x (Const16 [c])) - // cond: x.Op != OpConst16 - // result: (Add16 (Const16 [int64(int16(-c))]) x) + // match: (SignExt8to16 (Trunc16to8 x:(Rsh16x64 _ (Const64 [s])))) + // cond: s >= 8 + // result: x for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst16 { + v_0 := v.Args[0] + if v_0.Op != OpTrunc16to8 { break } - t := v_1.Type - c := v_1.AuxInt - if !(x.Op != OpConst16) { + x := v_0.Args[0] + if x.Op != OpRsh16x64 { break } - v.reset(OpAdd16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(-c)) - v.AddArg(v0) + _ = x.Args[1] + x_1 := x.Args[1] + if x_1.Op != OpConst64 { + break + } + s := x_1.AuxInt + if !(s >= 8) { + break + } + v.reset(OpCopy) + v.Type = x.Type v.AddArg(x) return true } - // match: (Sub16 (Mul16 x y) (Mul16 x z)) - // result: (Mul16 x (Sub16 y z)) + return false +} +func rewriteValuegeneric_OpSignExt8to32_0(v *Value) bool { + // match: (SignExt8to32 (Const8 [c])) + // result: (Const32 [int64( int8(c))]) for { - t := v.Type - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpMul16 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - z := v_1.Args[1] - if x != v_1.Args[0] { + if v_0.Op != OpConst8 { break } - v.reset(OpMul16) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpSub16, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) + c := v_0.AuxInt + v.reset(OpConst32) + v.AuxInt = int64(int8(c)) return true } - // match: (Sub16 (Mul16 y x) (Mul16 x z)) - // result: (Mul16 x (Sub16 y z)) + // match: (SignExt8to32 (Trunc32to8 x:(Rsh32x64 _ (Const64 [s])))) + // cond: s >= 24 + // result: x for { - t := v.Type - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpMul16 { + if v_0.Op != OpTrunc32to8 { break } - x := v_0.Args[1] - y := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul16 { + x := v_0.Args[0] + if x.Op != OpRsh32x64 { + break + } + _ = x.Args[1] + x_1 := x.Args[1] + if x_1.Op != OpConst64 { break } - z := v_1.Args[1] - if x != v_1.Args[0] { + s := x_1.AuxInt + if !(s >= 24) { break } - v.reset(OpMul16) + v.reset(OpCopy) + v.Type = x.Type v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpSub16, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) return true } - // match: (Sub16 (Mul16 x y) (Mul16 z x)) - // result: (Mul16 x (Sub16 y z)) + return false +} +func rewriteValuegeneric_OpSignExt8to64_0(v *Value) bool { + // match: (SignExt8to64 (Const8 [c])) + // result: (Const64 [int64( int8(c))]) for { - t := v.Type - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpMul16 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul16 { - break - } - _ = v_1.Args[1] - z := v_1.Args[0] - if x != v_1.Args[1] { + if v_0.Op != OpConst8 { break } - v.reset(OpMul16) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpSub16, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) + c := v_0.AuxInt + v.reset(OpConst64) + v.AuxInt = int64(int8(c)) return true } - // match: (Sub16 (Mul16 y x) (Mul16 z x)) - // result: (Mul16 x (Sub16 y z)) + // match: (SignExt8to64 (Trunc64to8 x:(Rsh64x64 _ (Const64 [s])))) + // cond: s >= 56 + // result: x for { - t := v.Type - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpMul16 { + if v_0.Op != OpTrunc64to8 { break } - x := v_0.Args[1] - y := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul16 { + x := v_0.Args[0] + if x.Op != OpRsh64x64 { break } - _ = v_1.Args[1] - z := v_1.Args[0] - if x != v_1.Args[1] { + _ = x.Args[1] + x_1 := x.Args[1] + if x_1.Op != OpConst64 { break } - v.reset(OpMul16) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpSub16, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) - return true - } - // match: (Sub16 x x) - // result: (Const16 [0]) - for { - x := v.Args[1] - if x != v.Args[0] { + s := x_1.AuxInt + if !(s >= 56) { break } - v.reset(OpConst16) - v.AuxInt = 0 + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (Sub16 (Add16 x y) x) - // result: y + return false +} +func rewriteValuegeneric_OpSliceCap_0(v *Value) bool { + // match: (SliceCap (SliceMake _ _ (Const64 [c]))) + // result: (Const64 [c]) for { - x := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpAdd16 { + if v_0.Op != OpSliceMake { break } - y := v_0.Args[1] - if x != v_0.Args[0] { + _ = v_0.Args[2] + v_0_2 := v_0.Args[2] + if v_0_2.Op != OpConst64 { break } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) + t := v_0_2.Type + c := v_0_2.AuxInt + v.reset(OpConst64) + v.Type = t + v.AuxInt = c return true } - // match: (Sub16 (Add16 y x) x) - // result: y + // match: (SliceCap (SliceMake _ _ (Const32 [c]))) + // result: (Const32 [c]) for { - x := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpAdd16 { + if v_0.Op != OpSliceMake { break } - _ = v_0.Args[1] - y := v_0.Args[0] - if x != v_0.Args[1] { + _ = v_0.Args[2] + v_0_2 := v_0.Args[2] + if v_0_2.Op != OpConst32 { break } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) + t := v_0_2.Type + c := v_0_2.AuxInt + v.reset(OpConst32) + v.Type = t + v.AuxInt = c return true } - // match: (Sub16 (Add16 x y) y) - // result: x + // match: (SliceCap (SliceMake _ _ (SliceCap x))) + // result: (SliceCap x) for { - y := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpAdd16 { + if v_0.Op != OpSliceMake { break } - _ = v_0.Args[1] - x := v_0.Args[0] - if y != v_0.Args[1] { + _ = v_0.Args[2] + v_0_2 := v_0.Args[2] + if v_0_2.Op != OpSliceCap { break } - v.reset(OpCopy) - v.Type = x.Type + x := v_0_2.Args[0] + v.reset(OpSliceCap) v.AddArg(x) return true } - return false -} -func rewriteValuegeneric_OpSub16_10(v *Value) bool { - b := v.Block - // match: (Sub16 (Add16 y x) y) - // result: x + // match: (SliceCap (SliceMake _ _ (SliceLen x))) + // result: (SliceLen x) for { - y := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpAdd16 { + if v_0.Op != OpSliceMake { break } - x := v_0.Args[1] - if y != v_0.Args[0] { + _ = v_0.Args[2] + v_0_2 := v_0.Args[2] + if v_0_2.Op != OpSliceLen { break } - v.reset(OpCopy) - v.Type = x.Type + x := v_0_2.Args[0] + v.reset(OpSliceLen) v.AddArg(x) return true } - // match: (Sub16 x (Sub16 i:(Const16 ) z)) - // cond: (z.Op != OpConst16 && x.Op != OpConst16) - // result: (Sub16 (Add16 x z) i) + return false +} +func rewriteValuegeneric_OpSliceLen_0(v *Value) bool { + // match: (SliceLen (SliceMake _ (Const64 [c]) _)) + // result: (Const64 [c]) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpSub16 { - break - } - z := v_1.Args[1] - i := v_1.Args[0] - if i.Op != OpConst16 { + v_0 := v.Args[0] + if v_0.Op != OpSliceMake { break } - t := i.Type - if !(z.Op != OpConst16 && x.Op != OpConst16) { + _ = v_0.Args[2] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 { break } - v.reset(OpSub16) - v0 := b.NewValue0(v.Pos, OpAdd16, t) - v0.AddArg(x) - v0.AddArg(z) - v.AddArg(v0) - v.AddArg(i) + t := v_0_1.Type + c := v_0_1.AuxInt + v.reset(OpConst64) + v.Type = t + v.AuxInt = c return true } - // match: (Sub16 x (Sub16 z i:(Const16 ))) - // cond: (z.Op != OpConst16 && x.Op != OpConst16) - // result: (Add16 i (Sub16 x z)) + // match: (SliceLen (SliceMake _ (Const32 [c]) _)) + // result: (Const32 [c]) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpSub16 { - break - } - _ = v_1.Args[1] - z := v_1.Args[0] - i := v_1.Args[1] - if i.Op != OpConst16 { + v_0 := v.Args[0] + if v_0.Op != OpSliceMake { break } - t := i.Type - if !(z.Op != OpConst16 && x.Op != OpConst16) { + _ = v_0.Args[2] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst32 { break } - v.reset(OpAdd16) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpSub16, t) - v0.AddArg(x) - v0.AddArg(z) - v.AddArg(v0) + t := v_0_1.Type + c := v_0_1.AuxInt + v.reset(OpConst32) + v.Type = t + v.AuxInt = c return true } - // match: (Sub16 (Const16 [c]) (Sub16 x (Const16 [d]))) - // result: (Sub16 (Const16 [int64(int16(c+d))]) x) + // match: (SliceLen (SliceMake _ (SliceLen x) _)) + // result: (SliceLen x) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpSub16 { + if v_0.Op != OpSliceMake { break } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst16 || v_1_1.Type != t { + _ = v_0.Args[2] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpSliceLen { break } - d := v_1_1.AuxInt - v.reset(OpSub16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c + d)) - v.AddArg(v0) + x := v_0_1.Args[0] + v.reset(OpSliceLen) v.AddArg(x) return true } - // match: (Sub16 (Const16 [c]) (Sub16 (Const16 [d]) x)) - // result: (Add16 (Const16 [int64(int16(c-d))]) x) + return false +} +func rewriteValuegeneric_OpSlicePtr_0(v *Value) bool { + // match: (SlicePtr (SliceMake (SlicePtr x) _ _)) + // result: (SlicePtr x) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpSub16 { + if v_0.Op != OpSliceMake { break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst16 || v_1_0.Type != t { + } + _ = v_0.Args[2] + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpSlicePtr { break } - d := v_1_0.AuxInt - v.reset(OpAdd16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c - d)) - v.AddArg(v0) + x := v_0_0.Args[0] + v.reset(OpSlicePtr) v.AddArg(x) return true } return false } -func rewriteValuegeneric_OpSub32_0(v *Value) bool { - b := v.Block - // match: (Sub32 (Const32 [c]) (Const32 [d])) - // result: (Const32 [int64(int32(c-d))]) +func rewriteValuegeneric_OpSlicemask_0(v *Value) bool { + // match: (Slicemask (Const32 [x])) + // cond: x > 0 + // result: (Const32 [-1]) for { - _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst32 { break } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { + x := v_0.AuxInt + if !(x > 0) { break } - d := v_1.AuxInt v.reset(OpConst32) - v.AuxInt = int64(int32(c - d)) + v.AuxInt = -1 return true } - // match: (Sub32 x (Const32 [c])) - // cond: x.Op != OpConst32 - // result: (Add32 (Const32 [int64(int32(-c))]) x) + // match: (Slicemask (Const32 [0])) + // result: (Const32 [0]) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - t := v_1.Type - c := v_1.AuxInt - if !(x.Op != OpConst32) { + v_0 := v.Args[0] + if v_0.Op != OpConst32 || v_0.AuxInt != 0 { break } - v.reset(OpAdd32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(-c)) - v.AddArg(v0) - v.AddArg(x) + v.reset(OpConst32) + v.AuxInt = 0 return true } - // match: (Sub32 (Mul32 x y) (Mul32 x z)) - // result: (Mul32 x (Sub32 y z)) + // match: (Slicemask (Const64 [x])) + // cond: x > 0 + // result: (Const64 [-1]) for { - t := v.Type - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpMul32 { + if v_0.Op != OpConst64 { break } - y := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { + x := v_0.AuxInt + if !(x > 0) { break } - z := v_1.Args[1] - if x != v_1.Args[0] { + v.reset(OpConst64) + v.AuxInt = -1 + return true + } + // match: (Slicemask (Const64 [0])) + // result: (Const64 [0]) + for { + v_0 := v.Args[0] + if v_0.Op != OpConst64 || v_0.AuxInt != 0 { break } - v.reset(OpMul32) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpSub32, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) + v.reset(OpConst64) + v.AuxInt = 0 return true } - // match: (Sub32 (Mul32 y x) (Mul32 x z)) - // result: (Mul32 x (Sub32 y z)) + return false +} +func rewriteValuegeneric_OpSqrt_0(v *Value) bool { + // match: (Sqrt (Const64F [c])) + // result: (Const64F [auxFrom64F(math.Sqrt(auxTo64F(c)))]) for { - t := v.Type - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpMul32 { + if v_0.Op != OpConst64F { break } - x := v_0.Args[1] - y := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { + c := v_0.AuxInt + v.reset(OpConst64F) + v.AuxInt = auxFrom64F(math.Sqrt(auxTo64F(c))) + return true + } + return false +} +func rewriteValuegeneric_OpStaticCall_0(v *Value) bool { + b := v.Block + config := b.Func.Config + // match: (StaticCall {sym} s1:(Store _ (Const64 [sz]) s2:(Store _ src s3:(Store {t} _ dst mem)))) + // cond: isSameSym(sym,"runtime.memmove") && t.(*types.Type).IsPtr() && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmove(dst,src,sz,config) && clobber(s1) && clobber(s2) && clobber(s3) + // result: (Move {t.(*types.Type).Elem()} [sz] dst src mem) + for { + sym := v.Aux + s1 := v.Args[0] + if s1.Op != OpStore { break } - z := v_1.Args[1] - if x != v_1.Args[0] { + _ = s1.Args[2] + s1_1 := s1.Args[1] + if s1_1.Op != OpConst64 { break } - v.reset(OpMul32) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpSub32, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) - return true - } - // match: (Sub32 (Mul32 x y) (Mul32 z x)) - // result: (Mul32 x (Sub32 y z)) - for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { + sz := s1_1.AuxInt + s2 := s1.Args[2] + if s2.Op != OpStore { break } - y := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { + _ = s2.Args[2] + src := s2.Args[1] + s3 := s2.Args[2] + if s3.Op != OpStore { break } - _ = v_1.Args[1] - z := v_1.Args[0] - if x != v_1.Args[1] { + t := s3.Aux + mem := s3.Args[2] + dst := s3.Args[1] + if !(isSameSym(sym, "runtime.memmove") && t.(*types.Type).IsPtr() && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmove(dst, src, sz, config) && clobber(s1) && clobber(s2) && clobber(s3)) { break } - v.reset(OpMul32) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpSub32, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) + v.reset(OpMove) + v.AuxInt = sz + v.Aux = t.(*types.Type).Elem() + v.AddArg(dst) + v.AddArg(src) + v.AddArg(mem) return true } - // match: (Sub32 (Mul32 y x) (Mul32 z x)) - // result: (Mul32 x (Sub32 y z)) + // match: (StaticCall {sym} s1:(Store _ (Const32 [sz]) s2:(Store _ src s3:(Store {t} _ dst mem)))) + // cond: isSameSym(sym,"runtime.memmove") && t.(*types.Type).IsPtr() && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmove(dst,src,sz,config) && clobber(s1) && clobber(s2) && clobber(s3) + // result: (Move {t.(*types.Type).Elem()} [sz] dst src mem) for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul32 { + sym := v.Aux + s1 := v.Args[0] + if s1.Op != OpStore { break } - x := v_0.Args[1] - y := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul32 { + _ = s1.Args[2] + s1_1 := s1.Args[1] + if s1_1.Op != OpConst32 { break } - _ = v_1.Args[1] - z := v_1.Args[0] - if x != v_1.Args[1] { + sz := s1_1.AuxInt + s2 := s1.Args[2] + if s2.Op != OpStore { break } - v.reset(OpMul32) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpSub32, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) + _ = s2.Args[2] + src := s2.Args[1] + s3 := s2.Args[2] + if s3.Op != OpStore { + break + } + t := s3.Aux + mem := s3.Args[2] + dst := s3.Args[1] + if !(isSameSym(sym, "runtime.memmove") && t.(*types.Type).IsPtr() && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmove(dst, src, sz, config) && clobber(s1) && clobber(s2) && clobber(s3)) { + break + } + v.reset(OpMove) + v.AuxInt = sz + v.Aux = t.(*types.Type).Elem() + v.AddArg(dst) + v.AddArg(src) + v.AddArg(mem) return true } - // match: (Sub32 x x) - // result: (Const32 [0]) + // match: (StaticCall {sym} x) + // cond: needRaceCleanup(sym,v) + // result: x for { - x := v.Args[1] - if x != v.Args[0] { + sym := v.Aux + x := v.Args[0] + if !(needRaceCleanup(sym, v)) { break } - v.reset(OpConst32) - v.AuxInt = 0 + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (Sub32 (Add32 x y) x) - // result: y + return false +} +func rewriteValuegeneric_OpStore_0(v *Value) bool { + b := v.Block + // match: (Store {t1} p1 (Load p2 mem) mem) + // cond: isSamePtr(p1, p2) && t2.Size() == sizeof(t1) + // result: mem for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd32 { + t1 := v.Aux + mem := v.Args[2] + p1 := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpLoad { break } - y := v_0.Args[1] - if x != v_0.Args[0] { + t2 := v_1.Type + _ = v_1.Args[1] + p2 := v_1.Args[0] + if mem != v_1.Args[1] || !(isSamePtr(p1, p2) && t2.Size() == sizeof(t1)) { break } v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) + v.Type = mem.Type + v.AddArg(mem) return true } - // match: (Sub32 (Add32 y x) x) - // result: y + // match: (Store {t1} p1 (Load p2 oldmem) mem:(Store {t3} p3 _ oldmem)) + // cond: isSamePtr(p1, p2) && t2.Size() == sizeof(t1) && disjoint(p1, sizeof(t1), p3, sizeof(t3)) + // result: mem for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd32 { + t1 := v.Aux + _ = v.Args[2] + p1 := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpLoad { break } - _ = v_0.Args[1] - y := v_0.Args[0] - if x != v_0.Args[1] { + t2 := v_1.Type + oldmem := v_1.Args[1] + p2 := v_1.Args[0] + mem := v.Args[2] + if mem.Op != OpStore { + break + } + t3 := mem.Aux + _ = mem.Args[2] + p3 := mem.Args[0] + if oldmem != mem.Args[2] || !(isSamePtr(p1, p2) && t2.Size() == sizeof(t1) && disjoint(p1, sizeof(t1), p3, sizeof(t3))) { break } v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) + v.Type = mem.Type + v.AddArg(mem) return true } - // match: (Sub32 (Add32 x y) y) - // result: x + // match: (Store {t1} p1 (Load p2 oldmem) mem:(Store {t3} p3 _ (Store {t4} p4 _ oldmem))) + // cond: isSamePtr(p1, p2) && t2.Size() == sizeof(t1) && disjoint(p1, sizeof(t1), p3, sizeof(t3)) && disjoint(p1, sizeof(t1), p4, sizeof(t4)) + // result: mem for { - y := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd32 { + t1 := v.Aux + _ = v.Args[2] + p1 := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpLoad { break } - _ = v_0.Args[1] - x := v_0.Args[0] - if y != v_0.Args[1] { + t2 := v_1.Type + oldmem := v_1.Args[1] + p2 := v_1.Args[0] + mem := v.Args[2] + if mem.Op != OpStore { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - return false -} -func rewriteValuegeneric_OpSub32_10(v *Value) bool { - b := v.Block - // match: (Sub32 (Add32 y x) y) - // result: x - for { - y := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd32 { + t3 := mem.Aux + _ = mem.Args[2] + p3 := mem.Args[0] + mem_2 := mem.Args[2] + if mem_2.Op != OpStore { break } - x := v_0.Args[1] - if y != v_0.Args[0] { + t4 := mem_2.Aux + _ = mem_2.Args[2] + p4 := mem_2.Args[0] + if oldmem != mem_2.Args[2] || !(isSamePtr(p1, p2) && t2.Size() == sizeof(t1) && disjoint(p1, sizeof(t1), p3, sizeof(t3)) && disjoint(p1, sizeof(t1), p4, sizeof(t4))) { break } v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + v.Type = mem.Type + v.AddArg(mem) return true } - // match: (Sub32 x (Sub32 i:(Const32 ) z)) - // cond: (z.Op != OpConst32 && x.Op != OpConst32) - // result: (Sub32 (Add32 x z) i) + // match: (Store {t1} p1 (Load p2 oldmem) mem:(Store {t3} p3 _ (Store {t4} p4 _ (Store {t5} p5 _ oldmem)))) + // cond: isSamePtr(p1, p2) && t2.Size() == sizeof(t1) && disjoint(p1, sizeof(t1), p3, sizeof(t3)) && disjoint(p1, sizeof(t1), p4, sizeof(t4)) && disjoint(p1, sizeof(t1), p5, sizeof(t5)) + // result: mem for { - _ = v.Args[1] - x := v.Args[0] + t1 := v.Aux + _ = v.Args[2] + p1 := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpSub32 { - break - } - z := v_1.Args[1] - i := v_1.Args[0] - if i.Op != OpConst32 { + if v_1.Op != OpLoad { break } - t := i.Type - if !(z.Op != OpConst32 && x.Op != OpConst32) { + t2 := v_1.Type + oldmem := v_1.Args[1] + p2 := v_1.Args[0] + mem := v.Args[2] + if mem.Op != OpStore { break } - v.reset(OpSub32) - v0 := b.NewValue0(v.Pos, OpAdd32, t) - v0.AddArg(x) - v0.AddArg(z) - v.AddArg(v0) - v.AddArg(i) - return true - } - // match: (Sub32 x (Sub32 z i:(Const32 ))) - // cond: (z.Op != OpConst32 && x.Op != OpConst32) - // result: (Add32 i (Sub32 x z)) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpSub32 { + t3 := mem.Aux + _ = mem.Args[2] + p3 := mem.Args[0] + mem_2 := mem.Args[2] + if mem_2.Op != OpStore { break } - _ = v_1.Args[1] - z := v_1.Args[0] - i := v_1.Args[1] - if i.Op != OpConst32 { + t4 := mem_2.Aux + _ = mem_2.Args[2] + p4 := mem_2.Args[0] + mem_2_2 := mem_2.Args[2] + if mem_2_2.Op != OpStore { break } - t := i.Type - if !(z.Op != OpConst32 && x.Op != OpConst32) { + t5 := mem_2_2.Aux + _ = mem_2_2.Args[2] + p5 := mem_2_2.Args[0] + if oldmem != mem_2_2.Args[2] || !(isSamePtr(p1, p2) && t2.Size() == sizeof(t1) && disjoint(p1, sizeof(t1), p3, sizeof(t3)) && disjoint(p1, sizeof(t1), p4, sizeof(t4)) && disjoint(p1, sizeof(t1), p5, sizeof(t5))) { break } - v.reset(OpAdd32) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpSub32, t) - v0.AddArg(x) - v0.AddArg(z) - v.AddArg(v0) + v.reset(OpCopy) + v.Type = mem.Type + v.AddArg(mem) return true } - // match: (Sub32 (Const32 [c]) (Sub32 x (Const32 [d]))) - // result: (Sub32 (Const32 [int64(int32(c+d))]) x) + // match: (Store {t} (OffPtr [o] p1) x mem:(Zero [n] p2 _)) + // cond: isConstZero(x) && o >= 0 && sizeof(t) + o <= n && isSamePtr(p1, p2) + // result: mem for { - _ = v.Args[1] + t := v.Aux + _ = v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpConst32 { + if v_0.Op != OpOffPtr { break } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpSub32 { + o := v_0.AuxInt + p1 := v_0.Args[0] + x := v.Args[1] + mem := v.Args[2] + if mem.Op != OpZero { break } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 || v_1_1.Type != t { + n := mem.AuxInt + _ = mem.Args[1] + p2 := mem.Args[0] + if !(isConstZero(x) && o >= 0 && sizeof(t)+o <= n && isSamePtr(p1, p2)) { break } - d := v_1_1.AuxInt - v.reset(OpSub32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c + d)) - v.AddArg(v0) - v.AddArg(x) + v.reset(OpCopy) + v.Type = mem.Type + v.AddArg(mem) return true } - // match: (Sub32 (Const32 [c]) (Sub32 (Const32 [d]) x)) - // result: (Add32 (Const32 [int64(int32(c-d))]) x) + // match: (Store {t1} op:(OffPtr [o1] p1) x mem:(Store {t2} p2 _ (Zero [n] p3 _))) + // cond: isConstZero(x) && o1 >= 0 && sizeof(t1) + o1 <= n && isSamePtr(p1, p3) && disjoint(op, sizeof(t1), p2, sizeof(t2)) + // result: mem for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 { + t1 := v.Aux + _ = v.Args[2] + op := v.Args[0] + if op.Op != OpOffPtr { break } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpSub32 { + o1 := op.AuxInt + p1 := op.Args[0] + x := v.Args[1] + mem := v.Args[2] + if mem.Op != OpStore { break } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 || v_1_0.Type != t { + t2 := mem.Aux + _ = mem.Args[2] + p2 := mem.Args[0] + mem_2 := mem.Args[2] + if mem_2.Op != OpZero { break } - d := v_1_0.AuxInt - v.reset(OpAdd32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c - d)) - v.AddArg(v0) - v.AddArg(x) + n := mem_2.AuxInt + _ = mem_2.Args[1] + p3 := mem_2.Args[0] + if !(isConstZero(x) && o1 >= 0 && sizeof(t1)+o1 <= n && isSamePtr(p1, p3) && disjoint(op, sizeof(t1), p2, sizeof(t2))) { + break + } + v.reset(OpCopy) + v.Type = mem.Type + v.AddArg(mem) return true } - return false -} -func rewriteValuegeneric_OpSub32F_0(v *Value) bool { - // match: (Sub32F (Const32F [c]) (Const32F [d])) - // result: (Const32F [auxFrom32F(auxTo32F(c) - auxTo32F(d))]) + // match: (Store {t1} op:(OffPtr [o1] p1) x mem:(Store {t2} p2 _ (Store {t3} p3 _ (Zero [n] p4 _)))) + // cond: isConstZero(x) && o1 >= 0 && sizeof(t1) + o1 <= n && isSamePtr(p1, p4) && disjoint(op, sizeof(t1), p2, sizeof(t2)) && disjoint(op, sizeof(t1), p3, sizeof(t3)) + // result: mem for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32F { + t1 := v.Aux + _ = v.Args[2] + op := v.Args[0] + if op.Op != OpOffPtr { break } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32F { + o1 := op.AuxInt + p1 := op.Args[0] + x := v.Args[1] + mem := v.Args[2] + if mem.Op != OpStore { break } - d := v_1.AuxInt - v.reset(OpConst32F) - v.AuxInt = auxFrom32F(auxTo32F(c) - auxTo32F(d)) - return true - } - return false -} -func rewriteValuegeneric_OpSub64_0(v *Value) bool { - b := v.Block - // match: (Sub64 (Const64 [c]) (Const64 [d])) - // result: (Const64 [c-d]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { + t2 := mem.Aux + _ = mem.Args[2] + p2 := mem.Args[0] + mem_2 := mem.Args[2] + if mem_2.Op != OpStore { break } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { + t3 := mem_2.Aux + _ = mem_2.Args[2] + p3 := mem_2.Args[0] + mem_2_2 := mem_2.Args[2] + if mem_2_2.Op != OpZero { + break + } + n := mem_2_2.AuxInt + _ = mem_2_2.Args[1] + p4 := mem_2_2.Args[0] + if !(isConstZero(x) && o1 >= 0 && sizeof(t1)+o1 <= n && isSamePtr(p1, p4) && disjoint(op, sizeof(t1), p2, sizeof(t2)) && disjoint(op, sizeof(t1), p3, sizeof(t3))) { break } - d := v_1.AuxInt - v.reset(OpConst64) - v.AuxInt = c - d + v.reset(OpCopy) + v.Type = mem.Type + v.AddArg(mem) return true } - // match: (Sub64 x (Const64 [c])) - // cond: x.Op != OpConst64 - // result: (Add64 (Const64 [-c]) x) + // match: (Store {t1} op:(OffPtr [o1] p1) x mem:(Store {t2} p2 _ (Store {t3} p3 _ (Store {t4} p4 _ (Zero [n] p5 _))))) + // cond: isConstZero(x) && o1 >= 0 && sizeof(t1) + o1 <= n && isSamePtr(p1, p5) && disjoint(op, sizeof(t1), p2, sizeof(t2)) && disjoint(op, sizeof(t1), p3, sizeof(t3)) && disjoint(op, sizeof(t1), p4, sizeof(t4)) + // result: mem for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 { + t1 := v.Aux + _ = v.Args[2] + op := v.Args[0] + if op.Op != OpOffPtr { break } - t := v_1.Type - c := v_1.AuxInt - if !(x.Op != OpConst64) { + o1 := op.AuxInt + p1 := op.Args[0] + x := v.Args[1] + mem := v.Args[2] + if mem.Op != OpStore { break } - v.reset(OpAdd64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = -c - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Sub64 (Mul64 x y) (Mul64 x z)) - // result: (Mul64 x (Sub64 y z)) - for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { + t2 := mem.Aux + _ = mem.Args[2] + p2 := mem.Args[0] + mem_2 := mem.Args[2] + if mem_2.Op != OpStore { break } - y := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul64 { + t3 := mem_2.Aux + _ = mem_2.Args[2] + p3 := mem_2.Args[0] + mem_2_2 := mem_2.Args[2] + if mem_2_2.Op != OpStore { break } - z := v_1.Args[1] - if x != v_1.Args[0] { + t4 := mem_2_2.Aux + _ = mem_2_2.Args[2] + p4 := mem_2_2.Args[0] + mem_2_2_2 := mem_2_2.Args[2] + if mem_2_2_2.Op != OpZero { break } - v.reset(OpMul64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpSub64, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) + n := mem_2_2_2.AuxInt + _ = mem_2_2_2.Args[1] + p5 := mem_2_2_2.Args[0] + if !(isConstZero(x) && o1 >= 0 && sizeof(t1)+o1 <= n && isSamePtr(p1, p5) && disjoint(op, sizeof(t1), p2, sizeof(t2)) && disjoint(op, sizeof(t1), p3, sizeof(t3)) && disjoint(op, sizeof(t1), p4, sizeof(t4))) { + break + } + v.reset(OpCopy) + v.Type = mem.Type + v.AddArg(mem) return true } - // match: (Sub64 (Mul64 y x) (Mul64 x z)) - // result: (Mul64 x (Sub64 y z)) + // match: (Store _ (StructMake0) mem) + // result: mem for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - x := v_0.Args[1] - y := v_0.Args[0] + mem := v.Args[2] v_1 := v.Args[1] - if v_1.Op != OpMul64 { + if v_1.Op != OpStructMake0 { break } - z := v_1.Args[1] - if x != v_1.Args[0] { + v.reset(OpCopy) + v.Type = mem.Type + v.AddArg(mem) + return true + } + // match: (Store dst (StructMake1 f0) mem) + // result: (Store {t.FieldType(0)} (OffPtr [0] dst) f0 mem) + for { + mem := v.Args[2] + dst := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpStructMake1 { break } - v.reset(OpMul64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpSub64, t) - v0.AddArg(y) - v0.AddArg(z) + t := v_1.Type + f0 := v_1.Args[0] + v.reset(OpStore) + v.Aux = t.FieldType(0) + v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) + v0.AuxInt = 0 + v0.AddArg(dst) v.AddArg(v0) + v.AddArg(f0) + v.AddArg(mem) return true } - // match: (Sub64 (Mul64 x y) (Mul64 z x)) - // result: (Mul64 x (Sub64 y z)) + return false +} +func rewriteValuegeneric_OpStore_10(v *Value) bool { + b := v.Block + config := b.Func.Config + fe := b.Func.fe + // match: (Store dst (StructMake2 f0 f1) mem) + // result: (Store {t.FieldType(1)} (OffPtr [t.FieldOff(1)] dst) f1 (Store {t.FieldType(0)} (OffPtr [0] dst) f0 mem)) for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - y := v_0.Args[1] - x := v_0.Args[0] + mem := v.Args[2] + dst := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - z := v_1.Args[0] - if x != v_1.Args[1] { + if v_1.Op != OpStructMake2 { break } - v.reset(OpMul64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpSub64, t) - v0.AddArg(y) - v0.AddArg(z) + t := v_1.Type + f1 := v_1.Args[1] + f0 := v_1.Args[0] + v.reset(OpStore) + v.Aux = t.FieldType(1) + v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) + v0.AuxInt = t.FieldOff(1) + v0.AddArg(dst) v.AddArg(v0) + v.AddArg(f1) + v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v1.Aux = t.FieldType(0) + v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) + v2.AuxInt = 0 + v2.AddArg(dst) + v1.AddArg(v2) + v1.AddArg(f0) + v1.AddArg(mem) + v.AddArg(v1) return true } - // match: (Sub64 (Mul64 y x) (Mul64 z x)) - // result: (Mul64 x (Sub64 y z)) + // match: (Store dst (StructMake3 f0 f1 f2) mem) + // result: (Store {t.FieldType(2)} (OffPtr [t.FieldOff(2)] dst) f2 (Store {t.FieldType(1)} (OffPtr [t.FieldOff(1)] dst) f1 (Store {t.FieldType(0)} (OffPtr [0] dst) f0 mem))) for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul64 { - break - } - x := v_0.Args[1] - y := v_0.Args[0] + mem := v.Args[2] + dst := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpMul64 { - break - } - _ = v_1.Args[1] - z := v_1.Args[0] - if x != v_1.Args[1] { + if v_1.Op != OpStructMake3 { break } - v.reset(OpMul64) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpSub64, t) - v0.AddArg(y) - v0.AddArg(z) + t := v_1.Type + f2 := v_1.Args[2] + f0 := v_1.Args[0] + f1 := v_1.Args[1] + v.reset(OpStore) + v.Aux = t.FieldType(2) + v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) + v0.AuxInt = t.FieldOff(2) + v0.AddArg(dst) v.AddArg(v0) + v.AddArg(f2) + v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v1.Aux = t.FieldType(1) + v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) + v2.AuxInt = t.FieldOff(1) + v2.AddArg(dst) + v1.AddArg(v2) + v1.AddArg(f1) + v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v3.Aux = t.FieldType(0) + v4 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) + v4.AuxInt = 0 + v4.AddArg(dst) + v3.AddArg(v4) + v3.AddArg(f0) + v3.AddArg(mem) + v1.AddArg(v3) + v.AddArg(v1) return true } - // match: (Sub64 x x) - // result: (Const64 [0]) + // match: (Store dst (StructMake4 f0 f1 f2 f3) mem) + // result: (Store {t.FieldType(3)} (OffPtr [t.FieldOff(3)] dst) f3 (Store {t.FieldType(2)} (OffPtr [t.FieldOff(2)] dst) f2 (Store {t.FieldType(1)} (OffPtr [t.FieldOff(1)] dst) f1 (Store {t.FieldType(0)} (OffPtr [0] dst) f0 mem)))) for { - x := v.Args[1] - if x != v.Args[0] { + mem := v.Args[2] + dst := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpStructMake4 { break } - v.reset(OpConst64) - v.AuxInt = 0 + t := v_1.Type + f3 := v_1.Args[3] + f0 := v_1.Args[0] + f1 := v_1.Args[1] + f2 := v_1.Args[2] + v.reset(OpStore) + v.Aux = t.FieldType(3) + v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(3).PtrTo()) + v0.AuxInt = t.FieldOff(3) + v0.AddArg(dst) + v.AddArg(v0) + v.AddArg(f3) + v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v1.Aux = t.FieldType(2) + v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) + v2.AuxInt = t.FieldOff(2) + v2.AddArg(dst) + v1.AddArg(v2) + v1.AddArg(f2) + v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v3.Aux = t.FieldType(1) + v4 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) + v4.AuxInt = t.FieldOff(1) + v4.AddArg(dst) + v3.AddArg(v4) + v3.AddArg(f1) + v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v5.Aux = t.FieldType(0) + v6 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) + v6.AuxInt = 0 + v6.AddArg(dst) + v5.AddArg(v6) + v5.AddArg(f0) + v5.AddArg(mem) + v3.AddArg(v5) + v1.AddArg(v3) + v.AddArg(v1) return true } - // match: (Sub64 (Add64 x y) x) - // result: y + // match: (Store {t} dst (Load src mem) mem) + // cond: !fe.CanSSA(t.(*types.Type)) + // result: (Move {t} [sizeof(t)] dst src mem) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd64 { + t := v.Aux + mem := v.Args[2] + dst := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpLoad { break } - y := v_0.Args[1] - if x != v_0.Args[0] { + _ = v_1.Args[1] + src := v_1.Args[0] + if mem != v_1.Args[1] || !(!fe.CanSSA(t.(*types.Type))) { break } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) + v.reset(OpMove) + v.AuxInt = sizeof(t) + v.Aux = t + v.AddArg(dst) + v.AddArg(src) + v.AddArg(mem) return true } - // match: (Sub64 (Add64 y x) x) - // result: y + // match: (Store {t} dst (Load src mem) (VarDef {x} mem)) + // cond: !fe.CanSSA(t.(*types.Type)) + // result: (Move {t} [sizeof(t)] dst src (VarDef {x} mem)) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd64 { - break - } - _ = v_0.Args[1] - y := v_0.Args[0] - if x != v_0.Args[1] { + t := v.Aux + _ = v.Args[2] + dst := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpLoad { break } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) - return true - } - // match: (Sub64 (Add64 x y) y) - // result: x - for { - y := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd64 { + mem := v_1.Args[1] + src := v_1.Args[0] + v_2 := v.Args[2] + if v_2.Op != OpVarDef { break } - _ = v_0.Args[1] - x := v_0.Args[0] - if y != v_0.Args[1] { + x := v_2.Aux + if mem != v_2.Args[0] || !(!fe.CanSSA(t.(*types.Type))) { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + v.reset(OpMove) + v.AuxInt = sizeof(t) + v.Aux = t + v.AddArg(dst) + v.AddArg(src) + v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem) + v0.Aux = x + v0.AddArg(mem) + v.AddArg(v0) return true } - return false -} -func rewriteValuegeneric_OpSub64_10(v *Value) bool { - b := v.Block - // match: (Sub64 (Add64 y x) y) - // result: x + // match: (Store _ (ArrayMake0) mem) + // result: mem for { - y := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd64 { - break - } - x := v_0.Args[1] - if y != v_0.Args[0] { + mem := v.Args[2] + v_1 := v.Args[1] + if v_1.Op != OpArrayMake0 { break } v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + v.Type = mem.Type + v.AddArg(mem) return true } - // match: (Sub64 x (Sub64 i:(Const64 ) z)) - // cond: (z.Op != OpConst64 && x.Op != OpConst64) - // result: (Sub64 (Add64 x z) i) + // match: (Store dst (ArrayMake1 e) mem) + // result: (Store {e.Type} dst e mem) for { - _ = v.Args[1] - x := v.Args[0] + mem := v.Args[2] + dst := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpSub64 { - break - } - z := v_1.Args[1] - i := v_1.Args[0] - if i.Op != OpConst64 { - break - } - t := i.Type - if !(z.Op != OpConst64 && x.Op != OpConst64) { + if v_1.Op != OpArrayMake1 { break } - v.reset(OpSub64) - v0 := b.NewValue0(v.Pos, OpAdd64, t) - v0.AddArg(x) - v0.AddArg(z) - v.AddArg(v0) - v.AddArg(i) + e := v_1.Args[0] + v.reset(OpStore) + v.Aux = e.Type + v.AddArg(dst) + v.AddArg(e) + v.AddArg(mem) return true } - // match: (Sub64 x (Sub64 z i:(Const64 ))) - // cond: (z.Op != OpConst64 && x.Op != OpConst64) - // result: (Add64 i (Sub64 x z)) + // match: (Store (Load (OffPtr [c] (SP)) mem) x mem) + // cond: isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize + // result: mem for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpSub64 { + mem := v.Args[2] + v_0 := v.Args[0] + if v_0.Op != OpLoad { break } - _ = v_1.Args[1] - z := v_1.Args[0] - i := v_1.Args[1] - if i.Op != OpConst64 { + _ = v_0.Args[1] + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpOffPtr { break } - t := i.Type - if !(z.Op != OpConst64 && x.Op != OpConst64) { + c := v_0_0.AuxInt + v_0_0_0 := v_0_0.Args[0] + if v_0_0_0.Op != OpSP || mem != v_0.Args[1] { break } - v.reset(OpAdd64) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpSub64, t) - v0.AddArg(x) - v0.AddArg(z) - v.AddArg(v0) + x := v.Args[1] + if !(isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { + break + } + v.reset(OpCopy) + v.Type = mem.Type + v.AddArg(mem) return true } - // match: (Sub64 (Const64 [c]) (Sub64 x (Const64 [d]))) - // result: (Sub64 (Const64 [c+d]) x) + // match: (Store (OffPtr (Load (OffPtr [c] (SP)) mem)) x mem) + // cond: isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize + // result: mem for { - _ = v.Args[1] + mem := v.Args[2] v_0 := v.Args[0] - if v_0.Op != OpConst64 { + if v_0.Op != OpOffPtr { break } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpSub64 { + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpLoad { break } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != t { + _ = v_0_0.Args[1] + v_0_0_0 := v_0_0.Args[0] + if v_0_0_0.Op != OpOffPtr { break } - d := v_1_1.AuxInt - v.reset(OpSub64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c + d - v.AddArg(v0) - v.AddArg(x) + c := v_0_0_0.AuxInt + v_0_0_0_0 := v_0_0_0.Args[0] + if v_0_0_0_0.Op != OpSP || mem != v_0_0.Args[1] { + break + } + x := v.Args[1] + if !(isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { + break + } + v.reset(OpCopy) + v.Type = mem.Type + v.AddArg(mem) return true } - // match: (Sub64 (Const64 [c]) (Sub64 (Const64 [d]) x)) - // result: (Add64 (Const64 [c-d]) x) + // match: (Store {t1} op1:(OffPtr [o1] p1) d1 m2:(Store {t2} op2:(OffPtr [0] p2) d2 m3:(Move [n] p3 _ mem))) + // cond: m2.Uses == 1 && m3.Uses == 1 && o1 == sizeof(t2) && n == sizeof(t2) + sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && clobber(m2) && clobber(m3) + // result: (Store {t1} op1 d1 (Store {t2} op2 d2 mem)) for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64 { + t1 := v.Aux + _ = v.Args[2] + op1 := v.Args[0] + if op1.Op != OpOffPtr { break } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpSub64 { + o1 := op1.AuxInt + p1 := op1.Args[0] + d1 := v.Args[1] + m2 := v.Args[2] + if m2.Op != OpStore { break } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst64 || v_1_0.Type != t { + t2 := m2.Aux + _ = m2.Args[2] + op2 := m2.Args[0] + if op2.Op != OpOffPtr || op2.AuxInt != 0 { break } - d := v_1_0.AuxInt - v.reset(OpAdd64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c - d - v.AddArg(v0) - v.AddArg(x) - return true - } - return false -} -func rewriteValuegeneric_OpSub64F_0(v *Value) bool { - // match: (Sub64F (Const64F [c]) (Const64F [d])) - // result: (Const64F [auxFrom64F(auxTo64F(c) - auxTo64F(d))]) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst64F { + p2 := op2.Args[0] + d2 := m2.Args[1] + m3 := m2.Args[2] + if m3.Op != OpMove { break } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64F { + n := m3.AuxInt + mem := m3.Args[2] + p3 := m3.Args[0] + if !(m2.Uses == 1 && m3.Uses == 1 && o1 == sizeof(t2) && n == sizeof(t2)+sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && clobber(m2) && clobber(m3)) { break } - d := v_1.AuxInt - v.reset(OpConst64F) - v.AuxInt = auxFrom64F(auxTo64F(c) - auxTo64F(d)) + v.reset(OpStore) + v.Aux = t1 + v.AddArg(op1) + v.AddArg(d1) + v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v0.Aux = t2 + v0.AddArg(op2) + v0.AddArg(d2) + v0.AddArg(mem) + v.AddArg(v0) return true } return false } -func rewriteValuegeneric_OpSub8_0(v *Value) bool { +func rewriteValuegeneric_OpStore_20(v *Value) bool { b := v.Block - // match: (Sub8 (Const8 [c]) (Const8 [d])) - // result: (Const8 [int64(int8(c-d))]) + // match: (Store {t1} op1:(OffPtr [o1] p1) d1 m2:(Store {t2} op2:(OffPtr [o2] p2) d2 m3:(Store {t3} op3:(OffPtr [0] p3) d3 m4:(Move [n] p4 _ mem)))) + // cond: m2.Uses == 1 && m3.Uses == 1 && m4.Uses == 1 && o2 == sizeof(t3) && o1-o2 == sizeof(t2) && n == sizeof(t3) + sizeof(t2) + sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && clobber(m2) && clobber(m3) && clobber(m4) + // result: (Store {t1} op1 d1 (Store {t2} op2 d2 (Store {t3} op3 d3 mem))) for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { + t1 := v.Aux + _ = v.Args[2] + op1 := v.Args[0] + if op1.Op != OpOffPtr { break } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 { + o1 := op1.AuxInt + p1 := op1.Args[0] + d1 := v.Args[1] + m2 := v.Args[2] + if m2.Op != OpStore { break } - d := v_1.AuxInt - v.reset(OpConst8) - v.AuxInt = int64(int8(c - d)) - return true - } - // match: (Sub8 x (Const8 [c])) - // cond: x.Op != OpConst8 - // result: (Add8 (Const8 [int64(int8(-c))]) x) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst8 { + t2 := m2.Aux + _ = m2.Args[2] + op2 := m2.Args[0] + if op2.Op != OpOffPtr { break } - t := v_1.Type - c := v_1.AuxInt - if !(x.Op != OpConst8) { + o2 := op2.AuxInt + p2 := op2.Args[0] + d2 := m2.Args[1] + m3 := m2.Args[2] + if m3.Op != OpStore { break } - v.reset(OpAdd8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(-c)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Sub8 (Mul8 x y) (Mul8 x z)) - // result: (Mul8 x (Sub8 y z)) - for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul8 { + t3 := m3.Aux + _ = m3.Args[2] + op3 := m3.Args[0] + if op3.Op != OpOffPtr || op3.AuxInt != 0 { break } - y := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul8 { + p3 := op3.Args[0] + d3 := m3.Args[1] + m4 := m3.Args[2] + if m4.Op != OpMove { break } - z := v_1.Args[1] - if x != v_1.Args[0] { + n := m4.AuxInt + mem := m4.Args[2] + p4 := m4.Args[0] + if !(m2.Uses == 1 && m3.Uses == 1 && m4.Uses == 1 && o2 == sizeof(t3) && o1-o2 == sizeof(t2) && n == sizeof(t3)+sizeof(t2)+sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && clobber(m2) && clobber(m3) && clobber(m4)) { break } - v.reset(OpMul8) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpSub8, t) - v0.AddArg(y) - v0.AddArg(z) + v.reset(OpStore) + v.Aux = t1 + v.AddArg(op1) + v.AddArg(d1) + v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v0.Aux = t2 + v0.AddArg(op2) + v0.AddArg(d2) + v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v1.Aux = t3 + v1.AddArg(op3) + v1.AddArg(d3) + v1.AddArg(mem) + v0.AddArg(v1) v.AddArg(v0) return true } - // match: (Sub8 (Mul8 y x) (Mul8 x z)) - // result: (Mul8 x (Sub8 y z)) + // match: (Store {t1} op1:(OffPtr [o1] p1) d1 m2:(Store {t2} op2:(OffPtr [o2] p2) d2 m3:(Store {t3} op3:(OffPtr [o3] p3) d3 m4:(Store {t4} op4:(OffPtr [0] p4) d4 m5:(Move [n] p5 _ mem))))) + // cond: m2.Uses == 1 && m3.Uses == 1 && m4.Uses == 1 && m5.Uses == 1 && o3 == sizeof(t4) && o2-o3 == sizeof(t3) && o1-o2 == sizeof(t2) && n == sizeof(t4) + sizeof(t3) + sizeof(t2) + sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && clobber(m2) && clobber(m3) && clobber(m4) && clobber(m5) + // result: (Store {t1} op1 d1 (Store {t2} op2 d2 (Store {t3} op3 d3 (Store {t4} op4 d4 mem)))) for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul8 { + t1 := v.Aux + _ = v.Args[2] + op1 := v.Args[0] + if op1.Op != OpOffPtr { break } - x := v_0.Args[1] - y := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul8 { + o1 := op1.AuxInt + p1 := op1.Args[0] + d1 := v.Args[1] + m2 := v.Args[2] + if m2.Op != OpStore { break } - z := v_1.Args[1] - if x != v_1.Args[0] { + t2 := m2.Aux + _ = m2.Args[2] + op2 := m2.Args[0] + if op2.Op != OpOffPtr { break } - v.reset(OpMul8) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpSub8, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) - return true - } - // match: (Sub8 (Mul8 x y) (Mul8 z x)) - // result: (Mul8 x (Sub8 y z)) - for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul8 { + o2 := op2.AuxInt + p2 := op2.Args[0] + d2 := m2.Args[1] + m3 := m2.Args[2] + if m3.Op != OpStore { break } - y := v_0.Args[1] - x := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul8 { + t3 := m3.Aux + _ = m3.Args[2] + op3 := m3.Args[0] + if op3.Op != OpOffPtr { break } - _ = v_1.Args[1] - z := v_1.Args[0] - if x != v_1.Args[1] { + o3 := op3.AuxInt + p3 := op3.Args[0] + d3 := m3.Args[1] + m4 := m3.Args[2] + if m4.Op != OpStore { break } - v.reset(OpMul8) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpSub8, t) - v0.AddArg(y) - v0.AddArg(z) - v.AddArg(v0) - return true - } - // match: (Sub8 (Mul8 y x) (Mul8 z x)) - // result: (Mul8 x (Sub8 y z)) - for { - t := v.Type - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpMul8 { + t4 := m4.Aux + _ = m4.Args[2] + op4 := m4.Args[0] + if op4.Op != OpOffPtr || op4.AuxInt != 0 { break } - x := v_0.Args[1] - y := v_0.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpMul8 { + p4 := op4.Args[0] + d4 := m4.Args[1] + m5 := m4.Args[2] + if m5.Op != OpMove { break } - _ = v_1.Args[1] - z := v_1.Args[0] - if x != v_1.Args[1] { + n := m5.AuxInt + mem := m5.Args[2] + p5 := m5.Args[0] + if !(m2.Uses == 1 && m3.Uses == 1 && m4.Uses == 1 && m5.Uses == 1 && o3 == sizeof(t4) && o2-o3 == sizeof(t3) && o1-o2 == sizeof(t2) && n == sizeof(t4)+sizeof(t3)+sizeof(t2)+sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && clobber(m2) && clobber(m3) && clobber(m4) && clobber(m5)) { break } - v.reset(OpMul8) - v.AddArg(x) - v0 := b.NewValue0(v.Pos, OpSub8, t) - v0.AddArg(y) - v0.AddArg(z) + v.reset(OpStore) + v.Aux = t1 + v.AddArg(op1) + v.AddArg(d1) + v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v0.Aux = t2 + v0.AddArg(op2) + v0.AddArg(d2) + v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v1.Aux = t3 + v1.AddArg(op3) + v1.AddArg(d3) + v2 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v2.Aux = t4 + v2.AddArg(op4) + v2.AddArg(d4) + v2.AddArg(mem) + v1.AddArg(v2) + v0.AddArg(v1) v.AddArg(v0) return true } - // match: (Sub8 x x) - // result: (Const8 [0]) + // match: (Store {t1} op1:(OffPtr [o1] p1) d1 m2:(Store {t2} op2:(OffPtr [0] p2) d2 m3:(Zero [n] p3 mem))) + // cond: m2.Uses == 1 && m3.Uses == 1 && o1 == sizeof(t2) && n == sizeof(t2) + sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && clobber(m2) && clobber(m3) + // result: (Store {t1} op1 d1 (Store {t2} op2 d2 mem)) for { - x := v.Args[1] - if x != v.Args[0] { + t1 := v.Aux + _ = v.Args[2] + op1 := v.Args[0] + if op1.Op != OpOffPtr { break } - v.reset(OpConst8) - v.AuxInt = 0 - return true - } - // match: (Sub8 (Add8 x y) x) - // result: y - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd8 { + o1 := op1.AuxInt + p1 := op1.Args[0] + d1 := v.Args[1] + m2 := v.Args[2] + if m2.Op != OpStore { break } - y := v_0.Args[1] - if x != v_0.Args[0] { + t2 := m2.Aux + _ = m2.Args[2] + op2 := m2.Args[0] + if op2.Op != OpOffPtr || op2.AuxInt != 0 { + break + } + p2 := op2.Args[0] + d2 := m2.Args[1] + m3 := m2.Args[2] + if m3.Op != OpZero { + break + } + n := m3.AuxInt + mem := m3.Args[1] + p3 := m3.Args[0] + if !(m2.Uses == 1 && m3.Uses == 1 && o1 == sizeof(t2) && n == sizeof(t2)+sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && clobber(m2) && clobber(m3)) { break } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) + v.reset(OpStore) + v.Aux = t1 + v.AddArg(op1) + v.AddArg(d1) + v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v0.Aux = t2 + v0.AddArg(op2) + v0.AddArg(d2) + v0.AddArg(mem) + v.AddArg(v0) return true } - // match: (Sub8 (Add8 y x) x) - // result: y + // match: (Store {t1} op1:(OffPtr [o1] p1) d1 m2:(Store {t2} op2:(OffPtr [o2] p2) d2 m3:(Store {t3} op3:(OffPtr [0] p3) d3 m4:(Zero [n] p4 mem)))) + // cond: m2.Uses == 1 && m3.Uses == 1 && m4.Uses == 1 && o2 == sizeof(t3) && o1-o2 == sizeof(t2) && n == sizeof(t3) + sizeof(t2) + sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && clobber(m2) && clobber(m3) && clobber(m4) + // result: (Store {t1} op1 d1 (Store {t2} op2 d2 (Store {t3} op3 d3 mem))) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd8 { + t1 := v.Aux + _ = v.Args[2] + op1 := v.Args[0] + if op1.Op != OpOffPtr { break } - _ = v_0.Args[1] - y := v_0.Args[0] - if x != v_0.Args[1] { + o1 := op1.AuxInt + p1 := op1.Args[0] + d1 := v.Args[1] + m2 := v.Args[2] + if m2.Op != OpStore { break } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) - return true - } - // match: (Sub8 (Add8 x y) y) - // result: x - for { - y := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd8 { + t2 := m2.Aux + _ = m2.Args[2] + op2 := m2.Args[0] + if op2.Op != OpOffPtr { break } - _ = v_0.Args[1] - x := v_0.Args[0] - if y != v_0.Args[1] { + o2 := op2.AuxInt + p2 := op2.Args[0] + d2 := m2.Args[1] + m3 := m2.Args[2] + if m3.Op != OpStore { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - return false -} -func rewriteValuegeneric_OpSub8_10(v *Value) bool { - b := v.Block - // match: (Sub8 (Add8 y x) y) - // result: x - for { - y := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpAdd8 { + t3 := m3.Aux + _ = m3.Args[2] + op3 := m3.Args[0] + if op3.Op != OpOffPtr || op3.AuxInt != 0 { break } - x := v_0.Args[1] - if y != v_0.Args[0] { + p3 := op3.Args[0] + d3 := m3.Args[1] + m4 := m3.Args[2] + if m4.Op != OpZero { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + n := m4.AuxInt + mem := m4.Args[1] + p4 := m4.Args[0] + if !(m2.Uses == 1 && m3.Uses == 1 && m4.Uses == 1 && o2 == sizeof(t3) && o1-o2 == sizeof(t2) && n == sizeof(t3)+sizeof(t2)+sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && clobber(m2) && clobber(m3) && clobber(m4)) { + break + } + v.reset(OpStore) + v.Aux = t1 + v.AddArg(op1) + v.AddArg(d1) + v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v0.Aux = t2 + v0.AddArg(op2) + v0.AddArg(d2) + v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v1.Aux = t3 + v1.AddArg(op3) + v1.AddArg(d3) + v1.AddArg(mem) + v0.AddArg(v1) + v.AddArg(v0) return true } - // match: (Sub8 x (Sub8 i:(Const8 ) z)) - // cond: (z.Op != OpConst8 && x.Op != OpConst8) - // result: (Sub8 (Add8 x z) i) + // match: (Store {t1} op1:(OffPtr [o1] p1) d1 m2:(Store {t2} op2:(OffPtr [o2] p2) d2 m3:(Store {t3} op3:(OffPtr [o3] p3) d3 m4:(Store {t4} op4:(OffPtr [0] p4) d4 m5:(Zero [n] p5 mem))))) + // cond: m2.Uses == 1 && m3.Uses == 1 && m4.Uses == 1 && m5.Uses == 1 && o3 == sizeof(t4) && o2-o3 == sizeof(t3) && o1-o2 == sizeof(t2) && n == sizeof(t4) + sizeof(t3) + sizeof(t2) + sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && clobber(m2) && clobber(m3) && clobber(m4) && clobber(m5) + // result: (Store {t1} op1 d1 (Store {t2} op2 d2 (Store {t3} op3 d3 (Store {t4} op4 d4 mem)))) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpSub8 { + t1 := v.Aux + _ = v.Args[2] + op1 := v.Args[0] + if op1.Op != OpOffPtr { break } - z := v_1.Args[1] - i := v_1.Args[0] - if i.Op != OpConst8 { + o1 := op1.AuxInt + p1 := op1.Args[0] + d1 := v.Args[1] + m2 := v.Args[2] + if m2.Op != OpStore { break } - t := i.Type - if !(z.Op != OpConst8 && x.Op != OpConst8) { + t2 := m2.Aux + _ = m2.Args[2] + op2 := m2.Args[0] + if op2.Op != OpOffPtr { break } - v.reset(OpSub8) - v0 := b.NewValue0(v.Pos, OpAdd8, t) - v0.AddArg(x) - v0.AddArg(z) - v.AddArg(v0) - v.AddArg(i) - return true - } - // match: (Sub8 x (Sub8 z i:(Const8 ))) - // cond: (z.Op != OpConst8 && x.Op != OpConst8) - // result: (Add8 i (Sub8 x z)) - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpSub8 { + o2 := op2.AuxInt + p2 := op2.Args[0] + d2 := m2.Args[1] + m3 := m2.Args[2] + if m3.Op != OpStore { break } - _ = v_1.Args[1] - z := v_1.Args[0] - i := v_1.Args[1] - if i.Op != OpConst8 { + t3 := m3.Aux + _ = m3.Args[2] + op3 := m3.Args[0] + if op3.Op != OpOffPtr { break } - t := i.Type - if !(z.Op != OpConst8 && x.Op != OpConst8) { + o3 := op3.AuxInt + p3 := op3.Args[0] + d3 := m3.Args[1] + m4 := m3.Args[2] + if m4.Op != OpStore { break } - v.reset(OpAdd8) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpSub8, t) - v0.AddArg(x) - v0.AddArg(z) - v.AddArg(v0) - return true - } - // match: (Sub8 (Const8 [c]) (Sub8 x (Const8 [d]))) - // result: (Sub8 (Const8 [int64(int8(c+d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { + t4 := m4.Aux + _ = m4.Args[2] + op4 := m4.Args[0] + if op4.Op != OpOffPtr || op4.AuxInt != 0 { break } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpSub8 { + p4 := op4.Args[0] + d4 := m4.Args[1] + m5 := m4.Args[2] + if m5.Op != OpZero { break } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst8 || v_1_1.Type != t { + n := m5.AuxInt + mem := m5.Args[1] + p5 := m5.Args[0] + if !(m2.Uses == 1 && m3.Uses == 1 && m4.Uses == 1 && m5.Uses == 1 && o3 == sizeof(t4) && o2-o3 == sizeof(t3) && o1-o2 == sizeof(t2) && n == sizeof(t4)+sizeof(t3)+sizeof(t2)+sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && clobber(m2) && clobber(m3) && clobber(m4) && clobber(m5)) { break } - d := v_1_1.AuxInt - v.reset(OpSub8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c + d)) + v.reset(OpStore) + v.Aux = t1 + v.AddArg(op1) + v.AddArg(d1) + v0 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v0.Aux = t2 + v0.AddArg(op2) + v0.AddArg(d2) + v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v1.Aux = t3 + v1.AddArg(op3) + v1.AddArg(d3) + v2 := b.NewValue0(v.Pos, OpStore, types.TypeMem) + v2.Aux = t4 + v2.AddArg(op4) + v2.AddArg(d4) + v2.AddArg(mem) + v1.AddArg(v2) + v0.AddArg(v1) v.AddArg(v0) - v.AddArg(x) return true } - // match: (Sub8 (Const8 [c]) (Sub8 (Const8 [d]) x)) - // result: (Add8 (Const8 [int64(int8(c-d))]) x) + return false +} +func rewriteValuegeneric_OpStringLen_0(v *Value) bool { + // match: (StringLen (StringMake _ (Const64 [c]))) + // result: (Const64 [c]) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpSub8 { + if v_0.Op != OpStringMake { break } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst8 || v_1_0.Type != t { + _ = v_0.Args[1] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 { break } - d := v_1_0.AuxInt - v.reset(OpAdd8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c - d)) - v.AddArg(v0) - v.AddArg(x) + t := v_0_1.Type + c := v_0_1.AuxInt + v.reset(OpConst64) + v.Type = t + v.AuxInt = c return true } return false -} -func rewriteValuegeneric_OpTrunc16to8_0(v *Value) bool { - // match: (Trunc16to8 (Const16 [c])) - // result: (Const8 [int64(int8(c))]) +} +func rewriteValuegeneric_OpStringPtr_0(v *Value) bool { + // match: (StringPtr (StringMake (Addr {s} base) _)) + // result: (Addr {s} base) for { v_0 := v.Args[0] - if v_0.Op != OpConst16 { + if v_0.Op != OpStringMake { break } - c := v_0.AuxInt - v.reset(OpConst8) - v.AuxInt = int64(int8(c)) + _ = v_0.Args[1] + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpAddr { + break + } + t := v_0_0.Type + s := v_0_0.Aux + base := v_0_0.Args[0] + v.reset(OpAddr) + v.Type = t + v.Aux = s + v.AddArg(base) return true } - // match: (Trunc16to8 (ZeroExt8to16 x)) + return false +} +func rewriteValuegeneric_OpStructSelect_0(v *Value) bool { + // match: (StructSelect (StructMake1 x)) // result: x for { v_0 := v.Args[0] - if v_0.Op != OpZeroExt8to16 { + if v_0.Op != OpStructMake1 { break } x := v_0.Args[0] @@ -45707,2065 +22087,2271 @@ func rewriteValuegeneric_OpTrunc16to8_0(v *Value) bool { v.AddArg(x) return true } - // match: (Trunc16to8 (SignExt8to16 x)) + // match: (StructSelect [0] (StructMake2 x _)) // result: x for { + if v.AuxInt != 0 { + break + } v_0 := v.Args[0] - if v_0.Op != OpSignExt8to16 { + if v_0.Op != OpStructMake2 { break } + _ = v_0.Args[1] x := v_0.Args[0] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) return true } - // match: (Trunc16to8 (And16 (Const16 [y]) x)) - // cond: y&0xFF == 0xFF - // result: (Trunc16to8 x) + // match: (StructSelect [1] (StructMake2 _ x)) + // result: x for { - v_0 := v.Args[0] - if v_0.Op != OpAnd16 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst16 { + if v.AuxInt != 1 { break } - y := v_0_0.AuxInt - if !(y&0xFF == 0xFF) { + v_0 := v.Args[0] + if v_0.Op != OpStructMake2 { break } - v.reset(OpTrunc16to8) + x := v_0.Args[1] + v.reset(OpCopy) + v.Type = x.Type v.AddArg(x) return true } - // match: (Trunc16to8 (And16 x (Const16 [y]))) - // cond: y&0xFF == 0xFF - // result: (Trunc16to8 x) + // match: (StructSelect [0] (StructMake3 x _ _)) + // result: x for { - v_0 := v.Args[0] - if v_0.Op != OpAnd16 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst16 { + if v.AuxInt != 0 { break } - y := v_0_1.AuxInt - if !(y&0xFF == 0xFF) { + v_0 := v.Args[0] + if v_0.Op != OpStructMake3 { break } - v.reset(OpTrunc16to8) + _ = v_0.Args[2] + x := v_0.Args[0] + v.reset(OpCopy) + v.Type = x.Type v.AddArg(x) return true } - return false -} -func rewriteValuegeneric_OpTrunc32to16_0(v *Value) bool { - // match: (Trunc32to16 (Const32 [c])) - // result: (Const16 [int64(int16(c))]) + // match: (StructSelect [1] (StructMake3 _ x _)) + // result: x for { - v_0 := v.Args[0] - if v_0.Op != OpConst32 { + if v.AuxInt != 1 { break } - c := v_0.AuxInt - v.reset(OpConst16) - v.AuxInt = int64(int16(c)) - return true - } - // match: (Trunc32to16 (ZeroExt8to32 x)) - // result: (ZeroExt8to16 x) - for { v_0 := v.Args[0] - if v_0.Op != OpZeroExt8to32 { + if v_0.Op != OpStructMake3 { break } - x := v_0.Args[0] - v.reset(OpZeroExt8to16) + _ = v_0.Args[2] + x := v_0.Args[1] + v.reset(OpCopy) + v.Type = x.Type v.AddArg(x) return true } - // match: (Trunc32to16 (ZeroExt16to32 x)) + // match: (StructSelect [2] (StructMake3 _ _ x)) // result: x for { + if v.AuxInt != 2 { + break + } v_0 := v.Args[0] - if v_0.Op != OpZeroExt16to32 { + if v_0.Op != OpStructMake3 { break } - x := v_0.Args[0] + x := v_0.Args[2] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) return true } - // match: (Trunc32to16 (SignExt8to32 x)) - // result: (SignExt8to16 x) + // match: (StructSelect [0] (StructMake4 x _ _ _)) + // result: x for { + if v.AuxInt != 0 { + break + } v_0 := v.Args[0] - if v_0.Op != OpSignExt8to32 { + if v_0.Op != OpStructMake4 { break } + _ = v_0.Args[3] x := v_0.Args[0] - v.reset(OpSignExt8to16) + v.reset(OpCopy) + v.Type = x.Type v.AddArg(x) return true } - // match: (Trunc32to16 (SignExt16to32 x)) + // match: (StructSelect [1] (StructMake4 _ x _ _)) // result: x for { + if v.AuxInt != 1 { + break + } v_0 := v.Args[0] - if v_0.Op != OpSignExt16to32 { + if v_0.Op != OpStructMake4 { break } - x := v_0.Args[0] + _ = v_0.Args[3] + x := v_0.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) return true } - // match: (Trunc32to16 (And32 (Const32 [y]) x)) - // cond: y&0xFFFF == 0xFFFF - // result: (Trunc32to16 x) + // match: (StructSelect [2] (StructMake4 _ _ x _)) + // result: x for { - v_0 := v.Args[0] - if v_0.Op != OpAnd32 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { + if v.AuxInt != 2 { break } - y := v_0_0.AuxInt - if !(y&0xFFFF == 0xFFFF) { + v_0 := v.Args[0] + if v_0.Op != OpStructMake4 { break } - v.reset(OpTrunc32to16) + _ = v_0.Args[3] + x := v_0.Args[2] + v.reset(OpCopy) + v.Type = x.Type v.AddArg(x) return true } - // match: (Trunc32to16 (And32 x (Const32 [y]))) - // cond: y&0xFFFF == 0xFFFF - // result: (Trunc32to16 x) + // match: (StructSelect [3] (StructMake4 _ _ _ x)) + // result: x for { - v_0 := v.Args[0] - if v_0.Op != OpAnd32 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { + if v.AuxInt != 3 { break } - y := v_0_1.AuxInt - if !(y&0xFFFF == 0xFFFF) { + v_0 := v.Args[0] + if v_0.Op != OpStructMake4 { break } - v.reset(OpTrunc32to16) + x := v_0.Args[3] + v.reset(OpCopy) + v.Type = x.Type v.AddArg(x) return true } return false } -func rewriteValuegeneric_OpTrunc32to8_0(v *Value) bool { - // match: (Trunc32to8 (Const32 [c])) - // result: (Const8 [int64(int8(c))]) +func rewriteValuegeneric_OpStructSelect_10(v *Value) bool { + b := v.Block + fe := b.Func.fe + // match: (StructSelect [i] x:(Load ptr mem)) + // cond: !fe.CanSSA(t) + // result: @x.Block (Load (OffPtr [t.FieldOff(int(i))] ptr) mem) for { - v_0 := v.Args[0] - if v_0.Op != OpConst32 { + i := v.AuxInt + x := v.Args[0] + if x.Op != OpLoad { break } - c := v_0.AuxInt - v.reset(OpConst8) - v.AuxInt = int64(int8(c)) - return true - } - // match: (Trunc32to8 (ZeroExt8to32 x)) - // result: x - for { - v_0 := v.Args[0] - if v_0.Op != OpZeroExt8to32 { + t := x.Type + mem := x.Args[1] + ptr := x.Args[0] + if !(!fe.CanSSA(t)) { break } - x := v_0.Args[0] + b = x.Block + v0 := b.NewValue0(v.Pos, OpLoad, v.Type) v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpOffPtr, v.Type.PtrTo()) + v1.AuxInt = t.FieldOff(int(i)) + v1.AddArg(ptr) + v0.AddArg(v1) + v0.AddArg(mem) return true } - // match: (Trunc32to8 (SignExt8to32 x)) - // result: x + // match: (StructSelect [0] (IData x)) + // result: (IData x) for { + if v.AuxInt != 0 { + break + } v_0 := v.Args[0] - if v_0.Op != OpSignExt8to32 { + if v_0.Op != OpIData { break } x := v_0.Args[0] - v.reset(OpCopy) - v.Type = x.Type + v.reset(OpIData) v.AddArg(x) return true } - // match: (Trunc32to8 (And32 (Const32 [y]) x)) - // cond: y&0xFF == 0xFF - // result: (Trunc32to8 x) + return false +} +func rewriteValuegeneric_OpSub16_0(v *Value) bool { + b := v.Block + // match: (Sub16 (Const16 [c]) (Const16 [d])) + // result: (Const16 [int64(int16(c-d))]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpAnd32 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { + if v_0.Op != OpConst16 { break } - y := v_0_0.AuxInt - if !(y&0xFF == 0xFF) { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst16 { break } - v.reset(OpTrunc32to8) - v.AddArg(x) + d := v_1.AuxInt + v.reset(OpConst16) + v.AuxInt = int64(int16(c - d)) return true } - // match: (Trunc32to8 (And32 x (Const32 [y]))) - // cond: y&0xFF == 0xFF - // result: (Trunc32to8 x) + // match: (Sub16 x (Const16 [c])) + // cond: x.Op != OpConst16 + // result: (Add16 (Const16 [int64(int16(-c))]) x) for { - v_0 := v.Args[0] - if v_0.Op != OpAnd32 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst16 { break } - y := v_0_1.AuxInt - if !(y&0xFF == 0xFF) { + t := v_1.Type + c := v_1.AuxInt + if !(x.Op != OpConst16) { break } - v.reset(OpTrunc32to8) + v.reset(OpAdd16) + v0 := b.NewValue0(v.Pos, OpConst16, t) + v0.AuxInt = int64(int16(-c)) + v.AddArg(v0) v.AddArg(x) return true } - return false -} -func rewriteValuegeneric_OpTrunc64to16_0(v *Value) bool { - // match: (Trunc64to16 (Const64 [c])) - // result: (Const16 [int64(int16(c))]) + // match: (Sub16 (Mul16 x y) (Mul16 x z)) + // result: (Mul16 x (Sub16 y z)) for { + t := v.Type + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst64 { + if v_0.Op != OpMul16 { break } - c := v_0.AuxInt - v.reset(OpConst16) - v.AuxInt = int64(int16(c)) - return true - } - // match: (Trunc64to16 (ZeroExt8to64 x)) - // result: (ZeroExt8to16 x) - for { - v_0 := v.Args[0] - if v_0.Op != OpZeroExt8to64 { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v_0.Args[_i0] + y := v_0.Args[1^_i0] + v_1 := v.Args[1] + if v_1.Op != OpMul16 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + if x != v_1.Args[_i1] { + continue + } + z := v_1.Args[1^_i1] + v.reset(OpMul16) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpSub16, t) + v0.AddArg(y) + v0.AddArg(z) + v.AddArg(v0) + return true + } } - x := v_0.Args[0] - v.reset(OpZeroExt8to16) - v.AddArg(x) - return true + break } - // match: (Trunc64to16 (ZeroExt16to64 x)) - // result: x + // match: (Sub16 x x) + // result: (Const16 [0]) for { - v_0 := v.Args[0] - if v_0.Op != OpZeroExt16to64 { + x := v.Args[1] + if x != v.Args[0] { break } - x := v_0.Args[0] - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + v.reset(OpConst16) + v.AuxInt = 0 return true } - // match: (Trunc64to16 (SignExt8to64 x)) - // result: (SignExt8to16 x) + // match: (Sub16 (Add16 x y) x) + // result: y for { + x := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpSignExt8to64 { + if v_0.Op != OpAdd16 { break } - x := v_0.Args[0] - v.reset(OpSignExt8to16) - v.AddArg(x) - return true + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + if x != v_0.Args[_i0] { + continue + } + y := v_0.Args[1^_i0] + v.reset(OpCopy) + v.Type = y.Type + v.AddArg(y) + return true + } + break } - // match: (Trunc64to16 (SignExt16to64 x)) + // match: (Sub16 (Add16 x y) y) // result: x for { + y := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpSignExt16to64 { + if v_0.Op != OpAdd16 { break } - x := v_0.Args[0] - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v_0.Args[_i0] + if y != v_0.Args[1^_i0] { + continue + } + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + break } - // match: (Trunc64to16 (And64 (Const64 [y]) x)) - // cond: y&0xFFFF == 0xFFFF - // result: (Trunc64to16 x) + // match: (Sub16 x (Sub16 i:(Const16 ) z)) + // cond: (z.Op != OpConst16 && x.Op != OpConst16) + // result: (Sub16 (Add16 x z) i) for { - v_0 := v.Args[0] - if v_0.Op != OpAnd64 { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpSub16 { break } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 { + z := v_1.Args[1] + i := v_1.Args[0] + if i.Op != OpConst16 { break } - y := v_0_0.AuxInt - if !(y&0xFFFF == 0xFFFF) { + t := i.Type + if !(z.Op != OpConst16 && x.Op != OpConst16) { break } - v.reset(OpTrunc64to16) - v.AddArg(x) + v.reset(OpSub16) + v0 := b.NewValue0(v.Pos, OpAdd16, t) + v0.AddArg(x) + v0.AddArg(z) + v.AddArg(v0) + v.AddArg(i) return true } - // match: (Trunc64to16 (And64 x (Const64 [y]))) - // cond: y&0xFFFF == 0xFFFF - // result: (Trunc64to16 x) + // match: (Sub16 x (Sub16 z i:(Const16 ))) + // cond: (z.Op != OpConst16 && x.Op != OpConst16) + // result: (Add16 i (Sub16 x z)) for { - v_0 := v.Args[0] - if v_0.Op != OpAnd64 { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpSub16 { break } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { + _ = v_1.Args[1] + z := v_1.Args[0] + i := v_1.Args[1] + if i.Op != OpConst16 { break } - y := v_0_1.AuxInt - if !(y&0xFFFF == 0xFFFF) { + t := i.Type + if !(z.Op != OpConst16 && x.Op != OpConst16) { break } - v.reset(OpTrunc64to16) - v.AddArg(x) + v.reset(OpAdd16) + v.AddArg(i) + v0 := b.NewValue0(v.Pos, OpSub16, t) + v0.AddArg(x) + v0.AddArg(z) + v.AddArg(v0) return true } - return false -} -func rewriteValuegeneric_OpTrunc64to32_0(v *Value) bool { - // match: (Trunc64to32 (Const64 [c])) - // result: (Const32 [int64(int32(c))]) + // match: (Sub16 (Const16 [c]) (Sub16 x (Const16 [d]))) + // result: (Sub16 (Const16 [int64(int16(c+d))]) x) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst64 { + if v_0.Op != OpConst16 { break } + t := v_0.Type c := v_0.AuxInt - v.reset(OpConst32) - v.AuxInt = int64(int32(c)) - return true - } - // match: (Trunc64to32 (ZeroExt8to64 x)) - // result: (ZeroExt8to32 x) - for { - v_0 := v.Args[0] - if v_0.Op != OpZeroExt8to64 { + v_1 := v.Args[1] + if v_1.Op != OpSub16 { break } - x := v_0.Args[0] - v.reset(OpZeroExt8to32) - v.AddArg(x) - return true - } - // match: (Trunc64to32 (ZeroExt16to64 x)) - // result: (ZeroExt16to32 x) - for { - v_0 := v.Args[0] - if v_0.Op != OpZeroExt16to64 { + _ = v_1.Args[1] + x := v_1.Args[0] + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpConst16 || v_1_1.Type != t { break } - x := v_0.Args[0] - v.reset(OpZeroExt16to32) + d := v_1_1.AuxInt + v.reset(OpSub16) + v0 := b.NewValue0(v.Pos, OpConst16, t) + v0.AuxInt = int64(int16(c + d)) + v.AddArg(v0) v.AddArg(x) return true } - // match: (Trunc64to32 (ZeroExt32to64 x)) - // result: x + // match: (Sub16 (Const16 [c]) (Sub16 (Const16 [d]) x)) + // result: (Add16 (Const16 [int64(int16(c-d))]) x) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpZeroExt32to64 { + if v_0.Op != OpConst16 { break } - x := v_0.Args[0] - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Trunc64to32 (SignExt8to64 x)) - // result: (SignExt8to32 x) - for { - v_0 := v.Args[0] - if v_0.Op != OpSignExt8to64 { + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpSub16 { break } - x := v_0.Args[0] - v.reset(OpSignExt8to32) - v.AddArg(x) - return true - } - // match: (Trunc64to32 (SignExt16to64 x)) - // result: (SignExt16to32 x) - for { - v_0 := v.Args[0] - if v_0.Op != OpSignExt16to64 { + x := v_1.Args[1] + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpConst16 || v_1_0.Type != t { break } - x := v_0.Args[0] - v.reset(OpSignExt16to32) + d := v_1_0.AuxInt + v.reset(OpAdd16) + v0 := b.NewValue0(v.Pos, OpConst16, t) + v0.AuxInt = int64(int16(c - d)) + v.AddArg(v0) v.AddArg(x) return true } - // match: (Trunc64to32 (SignExt32to64 x)) - // result: x + return false +} +func rewriteValuegeneric_OpSub32_0(v *Value) bool { + b := v.Block + // match: (Sub32 (Const32 [c]) (Const32 [d])) + // result: (Const32 [int64(int32(c-d))]) for { + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpSignExt32to64 { + if v_0.Op != OpConst32 { break } - x := v_0.Args[0] - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Trunc64to32 (And64 (Const64 [y]) x)) - // cond: y&0xFFFFFFFF == 0xFFFFFFFF - // result: (Trunc64to32 x) - for { - v_0 := v.Args[0] - if v_0.Op != OpAnd64 { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst32 { break } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 { + d := v_1.AuxInt + v.reset(OpConst32) + v.AuxInt = int64(int32(c - d)) + return true + } + // match: (Sub32 x (Const32 [c])) + // cond: x.Op != OpConst32 + // result: (Add32 (Const32 [int64(int32(-c))]) x) + for { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpConst32 { break } - y := v_0_0.AuxInt - if !(y&0xFFFFFFFF == 0xFFFFFFFF) { + t := v_1.Type + c := v_1.AuxInt + if !(x.Op != OpConst32) { break } - v.reset(OpTrunc64to32) + v.reset(OpAdd32) + v0 := b.NewValue0(v.Pos, OpConst32, t) + v0.AuxInt = int64(int32(-c)) + v.AddArg(v0) v.AddArg(x) return true } - // match: (Trunc64to32 (And64 x (Const64 [y]))) - // cond: y&0xFFFFFFFF == 0xFFFFFFFF - // result: (Trunc64to32 x) + // match: (Sub32 (Mul32 x y) (Mul32 x z)) + // result: (Mul32 x (Sub32 y z)) for { + t := v.Type + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpAnd64 { + if v_0.Op != OpMul32 { break } _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { - break - } - y := v_0_1.AuxInt - if !(y&0xFFFFFFFF == 0xFFFFFFFF) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v_0.Args[_i0] + y := v_0.Args[1^_i0] + v_1 := v.Args[1] + if v_1.Op != OpMul32 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + if x != v_1.Args[_i1] { + continue + } + z := v_1.Args[1^_i1] + v.reset(OpMul32) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpSub32, t) + v0.AddArg(y) + v0.AddArg(z) + v.AddArg(v0) + return true + } } - v.reset(OpTrunc64to32) - v.AddArg(x) - return true + break } - return false -} -func rewriteValuegeneric_OpTrunc64to8_0(v *Value) bool { - // match: (Trunc64to8 (Const64 [c])) - // result: (Const8 [int64(int8(c))]) + // match: (Sub32 x x) + // result: (Const32 [0]) for { - v_0 := v.Args[0] - if v_0.Op != OpConst64 { + x := v.Args[1] + if x != v.Args[0] { break } - c := v_0.AuxInt - v.reset(OpConst8) - v.AuxInt = int64(int8(c)) + v.reset(OpConst32) + v.AuxInt = 0 return true } - // match: (Trunc64to8 (ZeroExt8to64 x)) - // result: x + // match: (Sub32 (Add32 x y) x) + // result: y for { + x := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpZeroExt8to64 { + if v_0.Op != OpAdd32 { break } - x := v_0.Args[0] - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + if x != v_0.Args[_i0] { + continue + } + y := v_0.Args[1^_i0] + v.reset(OpCopy) + v.Type = y.Type + v.AddArg(y) + return true + } + break } - // match: (Trunc64to8 (SignExt8to64 x)) + // match: (Sub32 (Add32 x y) y) // result: x for { + y := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpSignExt8to64 { + if v_0.Op != OpAdd32 { break } - x := v_0.Args[0] - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v_0.Args[_i0] + if y != v_0.Args[1^_i0] { + continue + } + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + break } - // match: (Trunc64to8 (And64 (Const64 [y]) x)) - // cond: y&0xFF == 0xFF - // result: (Trunc64to8 x) + // match: (Sub32 x (Sub32 i:(Const32 ) z)) + // cond: (z.Op != OpConst32 && x.Op != OpConst32) + // result: (Sub32 (Add32 x z) i) for { - v_0 := v.Args[0] - if v_0.Op != OpAnd64 { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpSub32 { break } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 { + z := v_1.Args[1] + i := v_1.Args[0] + if i.Op != OpConst32 { break } - y := v_0_0.AuxInt - if !(y&0xFF == 0xFF) { + t := i.Type + if !(z.Op != OpConst32 && x.Op != OpConst32) { break } - v.reset(OpTrunc64to8) - v.AddArg(x) + v.reset(OpSub32) + v0 := b.NewValue0(v.Pos, OpAdd32, t) + v0.AddArg(x) + v0.AddArg(z) + v.AddArg(v0) + v.AddArg(i) return true } - // match: (Trunc64to8 (And64 x (Const64 [y]))) - // cond: y&0xFF == 0xFF - // result: (Trunc64to8 x) + // match: (Sub32 x (Sub32 z i:(Const32 ))) + // cond: (z.Op != OpConst32 && x.Op != OpConst32) + // result: (Add32 i (Sub32 x z)) for { - v_0 := v.Args[0] - if v_0.Op != OpAnd64 { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpSub32 { break } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { + _ = v_1.Args[1] + z := v_1.Args[0] + i := v_1.Args[1] + if i.Op != OpConst32 { break } - y := v_0_1.AuxInt - if !(y&0xFF == 0xFF) { + t := i.Type + if !(z.Op != OpConst32 && x.Op != OpConst32) { break } - v.reset(OpTrunc64to8) - v.AddArg(x) + v.reset(OpAdd32) + v.AddArg(i) + v0 := b.NewValue0(v.Pos, OpSub32, t) + v0.AddArg(x) + v0.AddArg(z) + v.AddArg(v0) return true } - return false -} -func rewriteValuegeneric_OpXor16_0(v *Value) bool { - b := v.Block - // match: (Xor16 (Const16 [c]) (Const16 [d])) - // result: (Const16 [int64(int16(c^d))]) + // match: (Sub32 (Const32 [c]) (Sub32 x (Const32 [d]))) + // result: (Sub32 (Const32 [int64(int32(c+d))]) x) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst16 { + if v_0.Op != OpConst32 { break } + t := v_0.Type c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpConst16 { + if v_1.Op != OpSub32 { break } - d := v_1.AuxInt - v.reset(OpConst16) - v.AuxInt = int64(int16(c ^ d)) + _ = v_1.Args[1] + x := v_1.Args[0] + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpConst32 || v_1_1.Type != t { + break + } + d := v_1_1.AuxInt + v.reset(OpSub32) + v0 := b.NewValue0(v.Pos, OpConst32, t) + v0.AuxInt = int64(int32(c + d)) + v.AddArg(v0) + v.AddArg(x) return true } - // match: (Xor16 (Const16 [d]) (Const16 [c])) - // result: (Const16 [int64(int16(c^d))]) + // match: (Sub32 (Const32 [c]) (Sub32 (Const32 [d]) x)) + // result: (Add32 (Const32 [int64(int32(c-d))]) x) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst16 { + if v_0.Op != OpConst32 { break } - d := v_0.AuxInt + t := v_0.Type + c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpConst16 { + if v_1.Op != OpSub32 { break } - c := v_1.AuxInt - v.reset(OpConst16) - v.AuxInt = int64(int16(c ^ d)) - return true - } - // match: (Xor16 x x) - // result: (Const16 [0]) - for { - x := v.Args[1] - if x != v.Args[0] { + x := v_1.Args[1] + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpConst32 || v_1_0.Type != t { break } - v.reset(OpConst16) - v.AuxInt = 0 + d := v_1_0.AuxInt + v.reset(OpAdd32) + v0 := b.NewValue0(v.Pos, OpConst32, t) + v0.AuxInt = int64(int32(c - d)) + v.AddArg(v0) + v.AddArg(x) return true } - // match: (Xor16 (Const16 [0]) x) - // result: x + return false +} +func rewriteValuegeneric_OpSub32F_0(v *Value) bool { + // match: (Sub32F (Const32F [c]) (Const32F [d])) + // result: (Const32F [auxFrom32F(auxTo32F(c) - auxTo32F(d))]) for { - x := v.Args[1] + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst16 || v_0.AuxInt != 0 { + if v_0.Op != OpConst32F { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Xor16 x (Const16 [0])) - // result: x - for { - _ = v.Args[1] - x := v.Args[0] + c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.AuxInt != 0 { + if v_1.Op != OpConst32F { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) + d := v_1.AuxInt + v.reset(OpConst32F) + v.AuxInt = auxFrom32F(auxTo32F(c) - auxTo32F(d)) return true } - // match: (Xor16 x (Xor16 x y)) - // result: y + return false +} +func rewriteValuegeneric_OpSub64_0(v *Value) bool { + b := v.Block + // match: (Sub64 (Const64 [c]) (Const64 [d])) + // result: (Const64 [c-d]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpXor16 { + v_0 := v.Args[0] + if v_0.Op != OpConst64 { break } - y := v_1.Args[1] - if x != v_1.Args[0] { + c := v_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { break } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) + d := v_1.AuxInt + v.reset(OpConst64) + v.AuxInt = c - d return true } - // match: (Xor16 x (Xor16 y x)) - // result: y + // match: (Sub64 x (Const64 [c])) + // cond: x.Op != OpConst64 + // result: (Add64 (Const64 [-c]) x) for { _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpXor16 { + if v_1.Op != OpConst64 { break } - _ = v_1.Args[1] - y := v_1.Args[0] - if x != v_1.Args[1] { + t := v_1.Type + c := v_1.AuxInt + if !(x.Op != OpConst64) { break } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) + v.reset(OpAdd64) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = -c + v.AddArg(v0) + v.AddArg(x) return true } - // match: (Xor16 (Xor16 x y) x) - // result: y + // match: (Sub64 (Mul64 x y) (Mul64 x z)) + // result: (Mul64 x (Sub64 y z)) for { - x := v.Args[1] + t := v.Type + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpXor16 { + if v_0.Op != OpMul64 { break } - y := v_0.Args[1] - if x != v_0.Args[0] { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v_0.Args[_i0] + y := v_0.Args[1^_i0] + v_1 := v.Args[1] + if v_1.Op != OpMul64 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + if x != v_1.Args[_i1] { + continue + } + z := v_1.Args[1^_i1] + v.reset(OpMul64) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpSub64, t) + v0.AddArg(y) + v0.AddArg(z) + v.AddArg(v0) + return true + } } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) - return true + break } - // match: (Xor16 (Xor16 y x) x) - // result: y + // match: (Sub64 x x) + // result: (Const64 [0]) for { x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpXor16 { - break - } - _ = v_0.Args[1] - y := v_0.Args[0] - if x != v_0.Args[1] { + if x != v.Args[0] { break } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) + v.reset(OpConst64) + v.AuxInt = 0 return true } - // match: (Xor16 (Xor16 i:(Const16 ) z) x) - // cond: (z.Op != OpConst16 && x.Op != OpConst16) - // result: (Xor16 i (Xor16 z x)) + // match: (Sub64 (Add64 x y) x) + // result: y for { x := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpXor16 { - break - } - z := v_0.Args[1] - i := v_0.Args[0] - if i.Op != OpConst16 { + if v_0.Op != OpAdd64 { break } - t := i.Type - if !(z.Op != OpConst16 && x.Op != OpConst16) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + if x != v_0.Args[_i0] { + continue + } + y := v_0.Args[1^_i0] + v.reset(OpCopy) + v.Type = y.Type + v.AddArg(y) + return true } - v.reset(OpXor16) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpXor16, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - return false -} -func rewriteValuegeneric_OpXor16_10(v *Value) bool { - b := v.Block - // match: (Xor16 (Xor16 z i:(Const16 )) x) - // cond: (z.Op != OpConst16 && x.Op != OpConst16) - // result: (Xor16 i (Xor16 z x)) + // match: (Sub64 (Add64 x y) y) + // result: x for { - x := v.Args[1] + y := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpXor16 { + if v_0.Op != OpAdd64 { break } _ = v_0.Args[1] - z := v_0.Args[0] - i := v_0.Args[1] - if i.Op != OpConst16 { - break - } - t := i.Type - if !(z.Op != OpConst16 && x.Op != OpConst16) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v_0.Args[_i0] + if y != v_0.Args[1^_i0] { + continue + } + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - v.reset(OpXor16) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpXor16, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (Xor16 x (Xor16 i:(Const16 ) z)) - // cond: (z.Op != OpConst16 && x.Op != OpConst16) - // result: (Xor16 i (Xor16 z x)) + // match: (Sub64 x (Sub64 i:(Const64 ) z)) + // cond: (z.Op != OpConst64 && x.Op != OpConst64) + // result: (Sub64 (Add64 x z) i) for { _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpXor16 { + if v_1.Op != OpSub64 { break } z := v_1.Args[1] i := v_1.Args[0] - if i.Op != OpConst16 { + if i.Op != OpConst64 { break } t := i.Type - if !(z.Op != OpConst16 && x.Op != OpConst16) { + if !(z.Op != OpConst64 && x.Op != OpConst64) { break } - v.reset(OpXor16) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpXor16, t) - v0.AddArg(z) + v.reset(OpSub64) + v0 := b.NewValue0(v.Pos, OpAdd64, t) v0.AddArg(x) + v0.AddArg(z) v.AddArg(v0) + v.AddArg(i) return true } - // match: (Xor16 x (Xor16 z i:(Const16 ))) - // cond: (z.Op != OpConst16 && x.Op != OpConst16) - // result: (Xor16 i (Xor16 z x)) + // match: (Sub64 x (Sub64 z i:(Const64 ))) + // cond: (z.Op != OpConst64 && x.Op != OpConst64) + // result: (Add64 i (Sub64 x z)) for { _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpXor16 { + if v_1.Op != OpSub64 { break } _ = v_1.Args[1] z := v_1.Args[0] i := v_1.Args[1] - if i.Op != OpConst16 { + if i.Op != OpConst64 { break } t := i.Type - if !(z.Op != OpConst16 && x.Op != OpConst16) { + if !(z.Op != OpConst64 && x.Op != OpConst64) { break } - v.reset(OpXor16) + v.reset(OpAdd64) v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpXor16, t) - v0.AddArg(z) + v0 := b.NewValue0(v.Pos, OpSub64, t) v0.AddArg(x) + v0.AddArg(z) v.AddArg(v0) return true } - // match: (Xor16 (Const16 [c]) (Xor16 (Const16 [d]) x)) - // result: (Xor16 (Const16 [int64(int16(c^d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst16 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpXor16 { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst16 || v_1_0.Type != t { - break - } - d := v_1_0.AuxInt - v.reset(OpXor16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c ^ d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Xor16 (Const16 [c]) (Xor16 x (Const16 [d]))) - // result: (Xor16 (Const16 [int64(int16(c^d))]) x) + // match: (Sub64 (Const64 [c]) (Sub64 x (Const64 [d]))) + // result: (Sub64 (Const64 [c+d]) x) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst16 { + if v_0.Op != OpConst64 { break } t := v_0.Type c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpXor16 { + if v_1.Op != OpSub64 { break } _ = v_1.Args[1] x := v_1.Args[0] v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst16 || v_1_1.Type != t { + if v_1_1.Op != OpConst64 || v_1_1.Type != t { break } d := v_1_1.AuxInt - v.reset(OpXor16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c ^ d)) + v.reset(OpSub64) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = c + d v.AddArg(v0) v.AddArg(x) return true } - // match: (Xor16 (Xor16 (Const16 [d]) x) (Const16 [c])) - // result: (Xor16 (Const16 [int64(int16(c^d))]) x) + // match: (Sub64 (Const64 [c]) (Sub64 (Const64 [d]) x)) + // result: (Add64 (Const64 [c-d]) x) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpXor16 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst16 { + if v_0.Op != OpConst64 { break } - t := v_0_0.Type - d := v_0_0.AuxInt + t := v_0.Type + c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.Type != t { - break - } - c := v_1.AuxInt - v.reset(OpXor16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c ^ d)) - v.AddArg(v0) - v.AddArg(x) - return true - } - // match: (Xor16 (Xor16 x (Const16 [d])) (Const16 [c])) - // result: (Xor16 (Const16 [int64(int16(c^d))]) x) - for { - _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpXor16 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst16 { + if v_1.Op != OpSub64 { break } - t := v_0_1.Type - d := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst16 || v_1.Type != t { + x := v_1.Args[1] + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpConst64 || v_1_0.Type != t { break } - c := v_1.AuxInt - v.reset(OpXor16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int64(int16(c ^ d)) + d := v_1_0.AuxInt + v.reset(OpAdd64) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = c - d v.AddArg(v0) v.AddArg(x) return true } return false } -func rewriteValuegeneric_OpXor32_0(v *Value) bool { - b := v.Block - // match: (Xor32 (Const32 [c]) (Const32 [d])) - // result: (Const32 [int64(int32(c^d))]) +func rewriteValuegeneric_OpSub64F_0(v *Value) bool { + // match: (Sub64F (Const64F [c]) (Const64F [d])) + // result: (Const64F [auxFrom64F(auxTo64F(c) - auxTo64F(d))]) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst32 { + if v_0.Op != OpConst64F { break } c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpConst32 { + if v_1.Op != OpConst64F { break } d := v_1.AuxInt - v.reset(OpConst32) - v.AuxInt = int64(int32(c ^ d)) + v.reset(OpConst64F) + v.AuxInt = auxFrom64F(auxTo64F(c) - auxTo64F(d)) return true } - // match: (Xor32 (Const32 [d]) (Const32 [c])) - // result: (Const32 [int64(int32(c^d))]) + return false +} +func rewriteValuegeneric_OpSub8_0(v *Value) bool { + b := v.Block + // match: (Sub8 (Const8 [c]) (Const8 [d])) + // result: (Const8 [int64(int8(c-d))]) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst32 { - break - } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 { - break - } - c := v_1.AuxInt - v.reset(OpConst32) - v.AuxInt = int64(int32(c ^ d)) - return true - } - // match: (Xor32 x x) - // result: (Const32 [0]) - for { - x := v.Args[1] - if x != v.Args[0] { - break - } - v.reset(OpConst32) - v.AuxInt = 0 - return true - } - // match: (Xor32 (Const32 [0]) x) - // result: x - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst32 || v_0.AuxInt != 0 { - break - } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Xor32 x (Const32 [0])) - // result: x - for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.AuxInt != 0 { + if v_0.Op != OpConst8 { break } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true - } - // match: (Xor32 x (Xor32 x y)) - // result: y - for { - _ = v.Args[1] - x := v.Args[0] + c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpXor32 { - break - } - y := v_1.Args[1] - if x != v_1.Args[0] { + if v_1.Op != OpConst8 { break } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) + d := v_1.AuxInt + v.reset(OpConst8) + v.AuxInt = int64(int8(c - d)) return true } - // match: (Xor32 x (Xor32 y x)) - // result: y + // match: (Sub8 x (Const8 [c])) + // cond: x.Op != OpConst8 + // result: (Add8 (Const8 [int64(int8(-c))]) x) for { _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpXor32 { + if v_1.Op != OpConst8 { break } - _ = v_1.Args[1] - y := v_1.Args[0] - if x != v_1.Args[1] { + t := v_1.Type + c := v_1.AuxInt + if !(x.Op != OpConst8) { break } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) + v.reset(OpAdd8) + v0 := b.NewValue0(v.Pos, OpConst8, t) + v0.AuxInt = int64(int8(-c)) + v.AddArg(v0) + v.AddArg(x) return true } - // match: (Xor32 (Xor32 x y) x) - // result: y + // match: (Sub8 (Mul8 x y) (Mul8 x z)) + // result: (Mul8 x (Sub8 y z)) for { - x := v.Args[1] + t := v.Type + _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpXor32 { + if v_0.Op != OpMul8 { break } - y := v_0.Args[1] - if x != v_0.Args[0] { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v_0.Args[_i0] + y := v_0.Args[1^_i0] + v_1 := v.Args[1] + if v_1.Op != OpMul8 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + if x != v_1.Args[_i1] { + continue + } + z := v_1.Args[1^_i1] + v.reset(OpMul8) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpSub8, t) + v0.AddArg(y) + v0.AddArg(z) + v.AddArg(v0) + return true + } } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) - return true + break } - // match: (Xor32 (Xor32 y x) x) - // result: y + // match: (Sub8 x x) + // result: (Const8 [0]) for { x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpXor32 { - break - } - _ = v_0.Args[1] - y := v_0.Args[0] - if x != v_0.Args[1] { + if x != v.Args[0] { break } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) + v.reset(OpConst8) + v.AuxInt = 0 return true } - // match: (Xor32 (Xor32 i:(Const32 ) z) x) - // cond: (z.Op != OpConst32 && x.Op != OpConst32) - // result: (Xor32 i (Xor32 z x)) + // match: (Sub8 (Add8 x y) x) + // result: y for { x := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpXor32 { - break - } - z := v_0.Args[1] - i := v_0.Args[0] - if i.Op != OpConst32 { + if v_0.Op != OpAdd8 { break } - t := i.Type - if !(z.Op != OpConst32 && x.Op != OpConst32) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + if x != v_0.Args[_i0] { + continue + } + y := v_0.Args[1^_i0] + v.reset(OpCopy) + v.Type = y.Type + v.AddArg(y) + return true } - v.reset(OpXor32) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpXor32, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - return false -} -func rewriteValuegeneric_OpXor32_10(v *Value) bool { - b := v.Block - // match: (Xor32 (Xor32 z i:(Const32 )) x) - // cond: (z.Op != OpConst32 && x.Op != OpConst32) - // result: (Xor32 i (Xor32 z x)) + // match: (Sub8 (Add8 x y) y) + // result: x for { - x := v.Args[1] + y := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpXor32 { + if v_0.Op != OpAdd8 { break } _ = v_0.Args[1] - z := v_0.Args[0] - i := v_0.Args[1] - if i.Op != OpConst32 { - break - } - t := i.Type - if !(z.Op != OpConst32 && x.Op != OpConst32) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v_0.Args[_i0] + if y != v_0.Args[1^_i0] { + continue + } + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - v.reset(OpXor32) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpXor32, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (Xor32 x (Xor32 i:(Const32 ) z)) - // cond: (z.Op != OpConst32 && x.Op != OpConst32) - // result: (Xor32 i (Xor32 z x)) + // match: (Sub8 x (Sub8 i:(Const8 ) z)) + // cond: (z.Op != OpConst8 && x.Op != OpConst8) + // result: (Sub8 (Add8 x z) i) for { _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpXor32 { + if v_1.Op != OpSub8 { break } z := v_1.Args[1] i := v_1.Args[0] - if i.Op != OpConst32 { + if i.Op != OpConst8 { break } t := i.Type - if !(z.Op != OpConst32 && x.Op != OpConst32) { + if !(z.Op != OpConst8 && x.Op != OpConst8) { break } - v.reset(OpXor32) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpXor32, t) - v0.AddArg(z) + v.reset(OpSub8) + v0 := b.NewValue0(v.Pos, OpAdd8, t) v0.AddArg(x) + v0.AddArg(z) v.AddArg(v0) + v.AddArg(i) return true } - // match: (Xor32 x (Xor32 z i:(Const32 ))) - // cond: (z.Op != OpConst32 && x.Op != OpConst32) - // result: (Xor32 i (Xor32 z x)) + // match: (Sub8 x (Sub8 z i:(Const8 ))) + // cond: (z.Op != OpConst8 && x.Op != OpConst8) + // result: (Add8 i (Sub8 x z)) for { _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] - if v_1.Op != OpXor32 { + if v_1.Op != OpSub8 { break } _ = v_1.Args[1] z := v_1.Args[0] i := v_1.Args[1] - if i.Op != OpConst32 { + if i.Op != OpConst8 { break } t := i.Type - if !(z.Op != OpConst32 && x.Op != OpConst32) { + if !(z.Op != OpConst8 && x.Op != OpConst8) { break } - v.reset(OpXor32) + v.reset(OpAdd8) v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpXor32, t) - v0.AddArg(z) + v0 := b.NewValue0(v.Pos, OpSub8, t) v0.AddArg(x) + v0.AddArg(z) v.AddArg(v0) return true } - // match: (Xor32 (Const32 [c]) (Xor32 (Const32 [d]) x)) - // result: (Xor32 (Const32 [int64(int32(c^d))]) x) + // match: (Sub8 (Const8 [c]) (Sub8 x (Const8 [d]))) + // result: (Sub8 (Const8 [int64(int8(c+d))]) x) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst32 { + if v_0.Op != OpConst8 { break } t := v_0.Type c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpXor32 { + if v_1.Op != OpSub8 { break } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst32 || v_1_0.Type != t { + _ = v_1.Args[1] + x := v_1.Args[0] + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpConst8 || v_1_1.Type != t { break } - d := v_1_0.AuxInt - v.reset(OpXor32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c ^ d)) + d := v_1_1.AuxInt + v.reset(OpSub8) + v0 := b.NewValue0(v.Pos, OpConst8, t) + v0.AuxInt = int64(int8(c + d)) v.AddArg(v0) v.AddArg(x) return true } - // match: (Xor32 (Const32 [c]) (Xor32 x (Const32 [d]))) - // result: (Xor32 (Const32 [int64(int32(c^d))]) x) + // match: (Sub8 (Const8 [c]) (Sub8 (Const8 [d]) x)) + // result: (Add8 (Const8 [int64(int8(c-d))]) x) for { _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst32 { + if v_0.Op != OpConst8 { break } t := v_0.Type c := v_0.AuxInt v_1 := v.Args[1] - if v_1.Op != OpXor32 { + if v_1.Op != OpSub8 { break } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 || v_1_1.Type != t { + x := v_1.Args[1] + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpConst8 || v_1_0.Type != t { break } - d := v_1_1.AuxInt - v.reset(OpXor32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c ^ d)) + d := v_1_0.AuxInt + v.reset(OpAdd8) + v0 := b.NewValue0(v.Pos, OpConst8, t) + v0.AuxInt = int64(int8(c - d)) v.AddArg(v0) v.AddArg(x) return true } - // match: (Xor32 (Xor32 (Const32 [d]) x) (Const32 [c])) - // result: (Xor32 (Const32 [int64(int32(c^d))]) x) + return false +} +func rewriteValuegeneric_OpTrunc16to8_0(v *Value) bool { + // match: (Trunc16to8 (Const16 [c])) + // result: (Const8 [int64(int8(c))]) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpXor32 { + if v_0.Op != OpConst16 { break } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst32 { + c := v_0.AuxInt + v.reset(OpConst8) + v.AuxInt = int64(int8(c)) + return true + } + // match: (Trunc16to8 (ZeroExt8to16 x)) + // result: x + for { + v_0 := v.Args[0] + if v_0.Op != OpZeroExt8to16 { break } - t := v_0_0.Type - d := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.Type != t { + x := v_0.Args[0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + // match: (Trunc16to8 (SignExt8to16 x)) + // result: x + for { + v_0 := v.Args[0] + if v_0.Op != OpSignExt8to16 { break } - c := v_1.AuxInt - v.reset(OpXor32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c ^ d)) - v.AddArg(v0) + x := v_0.Args[0] + v.reset(OpCopy) + v.Type = x.Type v.AddArg(x) return true } - // match: (Xor32 (Xor32 x (Const32 [d])) (Const32 [c])) - // result: (Xor32 (Const32 [int64(int32(c^d))]) x) + // match: (Trunc16to8 (And16 (Const16 [y]) x)) + // cond: y&0xFF == 0xFF + // result: (Trunc16to8 x) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpXor32 { + if v_0.Op != OpAnd16 { break } _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst32 { + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpConst16 { + continue + } + y := v_0_0.AuxInt + x := v_0.Args[1^_i0] + if !(y&0xFF == 0xFF) { + continue + } + v.reset(OpTrunc16to8) + v.AddArg(x) + return true + } + break + } + return false +} +func rewriteValuegeneric_OpTrunc32to16_0(v *Value) bool { + // match: (Trunc32to16 (Const32 [c])) + // result: (Const16 [int64(int16(c))]) + for { + v_0 := v.Args[0] + if v_0.Op != OpConst32 { break } - t := v_0_1.Type - d := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst32 || v_1.Type != t { + c := v_0.AuxInt + v.reset(OpConst16) + v.AuxInt = int64(int16(c)) + return true + } + // match: (Trunc32to16 (ZeroExt8to32 x)) + // result: (ZeroExt8to16 x) + for { + v_0 := v.Args[0] + if v_0.Op != OpZeroExt8to32 { break } - c := v_1.AuxInt - v.reset(OpXor32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int64(int32(c ^ d)) - v.AddArg(v0) + x := v_0.Args[0] + v.reset(OpZeroExt8to16) + v.AddArg(x) + return true + } + // match: (Trunc32to16 (ZeroExt16to32 x)) + // result: x + for { + v_0 := v.Args[0] + if v_0.Op != OpZeroExt16to32 { + break + } + x := v_0.Args[0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + // match: (Trunc32to16 (SignExt8to32 x)) + // result: (SignExt8to16 x) + for { + v_0 := v.Args[0] + if v_0.Op != OpSignExt8to32 { + break + } + x := v_0.Args[0] + v.reset(OpSignExt8to16) v.AddArg(x) return true } - return false -} -func rewriteValuegeneric_OpXor64_0(v *Value) bool { - b := v.Block - // match: (Xor64 (Const64 [c]) (Const64 [d])) - // result: (Const64 [c^d]) + // match: (Trunc32to16 (SignExt16to32 x)) + // result: x for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { + if v_0.Op != OpSignExt16to32 { break } - d := v_1.AuxInt - v.reset(OpConst64) - v.AuxInt = c ^ d + x := v_0.Args[0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) return true } - // match: (Xor64 (Const64 [d]) (Const64 [c])) - // result: (Const64 [c^d]) + // match: (Trunc32to16 (And32 (Const32 [y]) x)) + // cond: y&0xFFFF == 0xFFFF + // result: (Trunc32to16 x) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst64 { + if v_0.Op != OpAnd32 { break } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpConst32 { + continue + } + y := v_0_0.AuxInt + x := v_0.Args[1^_i0] + if !(y&0xFFFF == 0xFFFF) { + continue + } + v.reset(OpTrunc32to16) + v.AddArg(x) + return true } - c := v_1.AuxInt - v.reset(OpConst64) - v.AuxInt = c ^ d - return true + break } - // match: (Xor64 x x) - // result: (Const64 [0]) + return false +} +func rewriteValuegeneric_OpTrunc32to8_0(v *Value) bool { + // match: (Trunc32to8 (Const32 [c])) + // result: (Const8 [int64(int8(c))]) for { - x := v.Args[1] - if x != v.Args[0] { + v_0 := v.Args[0] + if v_0.Op != OpConst32 { break } - v.reset(OpConst64) - v.AuxInt = 0 + c := v_0.AuxInt + v.reset(OpConst8) + v.AuxInt = int64(int8(c)) return true } - // match: (Xor64 (Const64 [0]) x) + // match: (Trunc32to8 (ZeroExt8to32 x)) // result: x for { - x := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst64 || v_0.AuxInt != 0 { + if v_0.Op != OpZeroExt8to32 { break } + x := v_0.Args[0] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) return true } - // match: (Xor64 x (Const64 [0])) + // match: (Trunc32to8 (SignExt8to32 x)) // result: x for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.AuxInt != 0 { + v_0 := v.Args[0] + if v_0.Op != OpSignExt8to32 { break } + x := v_0.Args[0] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) return true } - // match: (Xor64 x (Xor64 x y)) - // result: y + // match: (Trunc32to8 (And32 (Const32 [y]) x)) + // cond: y&0xFF == 0xFF + // result: (Trunc32to8 x) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpXor64 { + v_0 := v.Args[0] + if v_0.Op != OpAnd32 { break } - y := v_1.Args[1] - if x != v_1.Args[0] { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpConst32 { + continue + } + y := v_0_0.AuxInt + x := v_0.Args[1^_i0] + if !(y&0xFF == 0xFF) { + continue + } + v.reset(OpTrunc32to8) + v.AddArg(x) + return true } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) - return true + break } - // match: (Xor64 x (Xor64 y x)) - // result: y + return false +} +func rewriteValuegeneric_OpTrunc64to16_0(v *Value) bool { + // match: (Trunc64to16 (Const64 [c])) + // result: (Const16 [int64(int16(c))]) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpXor64 { - break - } - _ = v_1.Args[1] - y := v_1.Args[0] - if x != v_1.Args[1] { + v_0 := v.Args[0] + if v_0.Op != OpConst64 { break } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) + c := v_0.AuxInt + v.reset(OpConst16) + v.AuxInt = int64(int16(c)) return true } - // match: (Xor64 (Xor64 x y) x) - // result: y + // match: (Trunc64to16 (ZeroExt8to64 x)) + // result: (ZeroExt8to16 x) for { - x := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpXor64 { + if v_0.Op != OpZeroExt8to64 { break } - y := v_0.Args[1] - if x != v_0.Args[0] { + x := v_0.Args[0] + v.reset(OpZeroExt8to16) + v.AddArg(x) + return true + } + // match: (Trunc64to16 (ZeroExt16to64 x)) + // result: x + for { + v_0 := v.Args[0] + if v_0.Op != OpZeroExt16to64 { break } + x := v_0.Args[0] v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) + v.Type = x.Type + v.AddArg(x) return true } - // match: (Xor64 (Xor64 y x) x) - // result: y + // match: (Trunc64to16 (SignExt8to64 x)) + // result: (SignExt8to16 x) for { - x := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpXor64 { + if v_0.Op != OpSignExt8to64 { break } - _ = v_0.Args[1] - y := v_0.Args[0] - if x != v_0.Args[1] { + x := v_0.Args[0] + v.reset(OpSignExt8to16) + v.AddArg(x) + return true + } + // match: (Trunc64to16 (SignExt16to64 x)) + // result: x + for { + v_0 := v.Args[0] + if v_0.Op != OpSignExt16to64 { break } + x := v_0.Args[0] v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) + v.Type = x.Type + v.AddArg(x) return true } - // match: (Xor64 (Xor64 i:(Const64 ) z) x) - // cond: (z.Op != OpConst64 && x.Op != OpConst64) - // result: (Xor64 i (Xor64 z x)) + // match: (Trunc64to16 (And64 (Const64 [y]) x)) + // cond: y&0xFFFF == 0xFFFF + // result: (Trunc64to16 x) for { - x := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpXor64 { - break - } - z := v_0.Args[1] - i := v_0.Args[0] - if i.Op != OpConst64 { + if v_0.Op != OpAnd64 { break } - t := i.Type - if !(z.Op != OpConst64 && x.Op != OpConst64) { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpConst64 { + continue + } + y := v_0_0.AuxInt + x := v_0.Args[1^_i0] + if !(y&0xFFFF == 0xFFFF) { + continue + } + v.reset(OpTrunc64to16) + v.AddArg(x) + return true } - v.reset(OpXor64) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpXor64, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true + break } return false } -func rewriteValuegeneric_OpXor64_10(v *Value) bool { - b := v.Block - // match: (Xor64 (Xor64 z i:(Const64 )) x) - // cond: (z.Op != OpConst64 && x.Op != OpConst64) - // result: (Xor64 i (Xor64 z x)) +func rewriteValuegeneric_OpTrunc64to32_0(v *Value) bool { + // match: (Trunc64to32 (Const64 [c])) + // result: (Const32 [int64(int32(c))]) for { - x := v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpXor64 { - break - } - _ = v_0.Args[1] - z := v_0.Args[0] - i := v_0.Args[1] - if i.Op != OpConst64 { - break - } - t := i.Type - if !(z.Op != OpConst64 && x.Op != OpConst64) { + if v_0.Op != OpConst64 { break } - v.reset(OpXor64) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpXor64, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) + c := v_0.AuxInt + v.reset(OpConst32) + v.AuxInt = int64(int32(c)) return true } - // match: (Xor64 x (Xor64 i:(Const64 ) z)) - // cond: (z.Op != OpConst64 && x.Op != OpConst64) - // result: (Xor64 i (Xor64 z x)) + // match: (Trunc64to32 (ZeroExt8to64 x)) + // result: (ZeroExt8to32 x) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpXor64 { - break - } - z := v_1.Args[1] - i := v_1.Args[0] - if i.Op != OpConst64 { - break - } - t := i.Type - if !(z.Op != OpConst64 && x.Op != OpConst64) { + v_0 := v.Args[0] + if v_0.Op != OpZeroExt8to64 { break } - v.reset(OpXor64) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpXor64, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) + x := v_0.Args[0] + v.reset(OpZeroExt8to32) + v.AddArg(x) return true } - // match: (Xor64 x (Xor64 z i:(Const64 ))) - // cond: (z.Op != OpConst64 && x.Op != OpConst64) - // result: (Xor64 i (Xor64 z x)) + // match: (Trunc64to32 (ZeroExt16to64 x)) + // result: (ZeroExt16to32 x) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpXor64 { + v_0 := v.Args[0] + if v_0.Op != OpZeroExt16to64 { break } - _ = v_1.Args[1] - z := v_1.Args[0] - i := v_1.Args[1] - if i.Op != OpConst64 { + x := v_0.Args[0] + v.reset(OpZeroExt16to32) + v.AddArg(x) + return true + } + // match: (Trunc64to32 (ZeroExt32to64 x)) + // result: x + for { + v_0 := v.Args[0] + if v_0.Op != OpZeroExt32to64 { break } - t := i.Type - if !(z.Op != OpConst64 && x.Op != OpConst64) { + x := v_0.Args[0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + // match: (Trunc64to32 (SignExt8to64 x)) + // result: (SignExt8to32 x) + for { + v_0 := v.Args[0] + if v_0.Op != OpSignExt8to64 { break } - v.reset(OpXor64) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpXor64, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) + x := v_0.Args[0] + v.reset(OpSignExt8to32) + v.AddArg(x) return true } - // match: (Xor64 (Const64 [c]) (Xor64 (Const64 [d]) x)) - // result: (Xor64 (Const64 [c^d]) x) + // match: (Trunc64to32 (SignExt16to64 x)) + // result: (SignExt16to32 x) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpXor64 { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst64 || v_1_0.Type != t { + if v_0.Op != OpSignExt16to64 { break } - d := v_1_0.AuxInt - v.reset(OpXor64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c ^ d - v.AddArg(v0) + x := v_0.Args[0] + v.reset(OpSignExt16to32) v.AddArg(x) return true } - // match: (Xor64 (Const64 [c]) (Xor64 x (Const64 [d]))) - // result: (Xor64 (Const64 [c^d]) x) + // match: (Trunc64to32 (SignExt32to64 x)) + // result: x for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpConst64 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpXor64 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != t { + if v_0.Op != OpSignExt32to64 { break } - d := v_1_1.AuxInt - v.reset(OpXor64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c ^ d - v.AddArg(v0) + x := v_0.Args[0] + v.reset(OpCopy) + v.Type = x.Type v.AddArg(x) return true } - // match: (Xor64 (Xor64 (Const64 [d]) x) (Const64 [c])) - // result: (Xor64 (Const64 [c^d]) x) + // match: (Trunc64to32 (And64 (Const64 [y]) x)) + // cond: y&0xFFFFFFFF == 0xFFFFFFFF + // result: (Trunc64to32 x) for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpXor64 { + if v_0.Op != OpAnd64 { break } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst64 { + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpConst64 { + continue + } + y := v_0_0.AuxInt + x := v_0.Args[1^_i0] + if !(y&0xFFFFFFFF == 0xFFFFFFFF) { + continue + } + v.reset(OpTrunc64to32) + v.AddArg(x) + return true + } + break + } + return false +} +func rewriteValuegeneric_OpTrunc64to8_0(v *Value) bool { + // match: (Trunc64to8 (Const64 [c])) + // result: (Const8 [int64(int8(c))]) + for { + v_0 := v.Args[0] + if v_0.Op != OpConst64 { break } - t := v_0_0.Type - d := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.Type != t { + c := v_0.AuxInt + v.reset(OpConst8) + v.AuxInt = int64(int8(c)) + return true + } + // match: (Trunc64to8 (ZeroExt8to64 x)) + // result: x + for { + v_0 := v.Args[0] + if v_0.Op != OpZeroExt8to64 { break } - c := v_1.AuxInt - v.reset(OpXor64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c ^ d - v.AddArg(v0) + x := v_0.Args[0] + v.reset(OpCopy) + v.Type = x.Type v.AddArg(x) return true } - // match: (Xor64 (Xor64 x (Const64 [d])) (Const64 [c])) - // result: (Xor64 (Const64 [c^d]) x) + // match: (Trunc64to8 (SignExt8to64 x)) + // result: x for { - _ = v.Args[1] v_0 := v.Args[0] - if v_0.Op != OpXor64 { + if v_0.Op != OpSignExt8to64 { break } - _ = v_0.Args[1] x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst64 { + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } + // match: (Trunc64to8 (And64 (Const64 [y]) x)) + // cond: y&0xFF == 0xFF + // result: (Trunc64to8 x) + for { + v_0 := v.Args[0] + if v_0.Op != OpAnd64 { break } - t := v_0_1.Type - d := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst64 || v_1.Type != t { - break + _ = v_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0_0 := v_0.Args[_i0] + if v_0_0.Op != OpConst64 { + continue + } + y := v_0_0.AuxInt + x := v_0.Args[1^_i0] + if !(y&0xFF == 0xFF) { + continue + } + v.reset(OpTrunc64to8) + v.AddArg(x) + return true } - c := v_1.AuxInt - v.reset(OpXor64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = c ^ d - v.AddArg(v0) - v.AddArg(x) - return true + break } return false } -func rewriteValuegeneric_OpXor8_0(v *Value) bool { +func rewriteValuegeneric_OpXor16_0(v *Value) bool { b := v.Block - // match: (Xor8 (Const8 [c]) (Const8 [d])) - // result: (Const8 [int64(int8(c^d))]) + // match: (Xor16 (Const16 [c]) (Const16 [d])) + // result: (Const16 [int64(int16(c^d))]) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst16 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst16 { + continue + } + d := v_1.AuxInt + v.reset(OpConst16) + v.AuxInt = int64(int16(c ^ d)) + return true } - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 { + break + } + // match: (Xor16 x x) + // result: (Const16 [0]) + for { + x := v.Args[1] + if x != v.Args[0] { break } - d := v_1.AuxInt - v.reset(OpConst8) - v.AuxInt = int64(int8(c ^ d)) + v.reset(OpConst16) + v.AuxInt = 0 return true } - // match: (Xor8 (Const8 [d]) (Const8 [c])) - // result: (Const8 [int64(int8(c^d))]) + // match: (Xor16 (Const16 [0]) x) + // result: x for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst16 || v_0.AuxInt != 0 { + continue + } + x := v.Args[1^_i0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - d := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 { - break + break + } + // match: (Xor16 x (Xor16 x y)) + // result: y + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpXor16 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + if x != v_1.Args[_i1] { + continue + } + y := v_1.Args[1^_i1] + v.reset(OpCopy) + v.Type = y.Type + v.AddArg(y) + return true + } } - c := v_1.AuxInt - v.reset(OpConst8) - v.AuxInt = int64(int8(c ^ d)) - return true + break } - // match: (Xor8 x x) - // result: (Const8 [0]) + // match: (Xor16 (Xor16 i:(Const16 ) z) x) + // cond: (z.Op != OpConst16 && x.Op != OpConst16) + // result: (Xor16 i (Xor16 z x)) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpXor16 { + continue + } + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + i := v_0.Args[_i1] + if i.Op != OpConst16 { + continue + } + t := i.Type + z := v_0.Args[1^_i1] + x := v.Args[1^_i0] + if !(z.Op != OpConst16 && x.Op != OpConst16) { + continue + } + v.reset(OpXor16) + v.AddArg(i) + v0 := b.NewValue0(v.Pos, OpXor16, t) + v0.AddArg(z) + v0.AddArg(x) + v.AddArg(v0) + return true + } + } + break + } + // match: (Xor16 (Const16 [c]) (Xor16 (Const16 [d]) x)) + // result: (Xor16 (Const16 [int64(int16(c^d))]) x) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst16 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpXor16 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst16 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpXor16) + v0 := b.NewValue0(v.Pos, OpConst16, t) + v0.AuxInt = int64(int16(c ^ d)) + v.AddArg(v0) + v.AddArg(x) + return true + } + } + break + } + return false +} +func rewriteValuegeneric_OpXor32_0(v *Value) bool { + b := v.Block + // match: (Xor32 (Const32 [c]) (Const32 [d])) + // result: (Const32 [int64(int32(c^d))]) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst32 { + continue + } + d := v_1.AuxInt + v.reset(OpConst32) + v.AuxInt = int64(int32(c ^ d)) + return true + } + break + } + // match: (Xor32 x x) + // result: (Const32 [0]) for { x := v.Args[1] if x != v.Args[0] { break } - v.reset(OpConst8) + v.reset(OpConst32) v.AuxInt = 0 return true } - // match: (Xor8 (Const8 [0]) x) + // match: (Xor32 (Const32 [0]) x) // result: x for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 || v_0.AuxInt != 0 { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 || v_0.AuxInt != 0 { + continue + } + x := v.Args[1^_i0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true + break } - // match: (Xor8 x (Const8 [0])) - // result: x + // match: (Xor32 x (Xor32 x y)) + // result: y + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpXor32 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + if x != v_1.Args[_i1] { + continue + } + y := v_1.Args[1^_i1] + v.reset(OpCopy) + v.Type = y.Type + v.AddArg(y) + return true + } + } + break + } + // match: (Xor32 (Xor32 i:(Const32 ) z) x) + // cond: (z.Op != OpConst32 && x.Op != OpConst32) + // result: (Xor32 i (Xor32 z x)) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpXor32 { + continue + } + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + i := v_0.Args[_i1] + if i.Op != OpConst32 { + continue + } + t := i.Type + z := v_0.Args[1^_i1] + x := v.Args[1^_i0] + if !(z.Op != OpConst32 && x.Op != OpConst32) { + continue + } + v.reset(OpXor32) + v.AddArg(i) + v0 := b.NewValue0(v.Pos, OpXor32, t) + v0.AddArg(z) + v0.AddArg(x) + v.AddArg(v0) + return true + } + } + break + } + // match: (Xor32 (Const32 [c]) (Xor32 (Const32 [d]) x)) + // result: (Xor32 (Const32 [int64(int32(c^d))]) x) + for { + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst32 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpXor32 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst32 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpXor32) + v0 := b.NewValue0(v.Pos, OpConst32, t) + v0.AuxInt = int64(int32(c ^ d)) + v.AddArg(v0) + v.AddArg(x) + return true + } + } + break + } + return false +} +func rewriteValuegeneric_OpXor64_0(v *Value) bool { + b := v.Block + // match: (Xor64 (Const64 [c]) (Const64 [d])) + // result: (Const64 [c^d]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.AuxInt != 0 { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst64 { + continue + } + d := v_1.AuxInt + v.reset(OpConst64) + v.AuxInt = c ^ d + return true } - v.reset(OpCopy) - v.Type = x.Type - v.AddArg(x) - return true + break } - // match: (Xor8 x (Xor8 x y)) - // result: y + // match: (Xor64 x x) + // result: (Const64 [0]) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpXor8 { - break - } - y := v_1.Args[1] - if x != v_1.Args[0] { + x := v.Args[1] + if x != v.Args[0] { break } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) + v.reset(OpConst64) + v.AuxInt = 0 return true } - // match: (Xor8 x (Xor8 y x)) - // result: y + // match: (Xor64 (Const64 [0]) x) + // result: x for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpXor8 { - break - } - _ = v_1.Args[1] - y := v_1.Args[0] - if x != v_1.Args[1] { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 || v_0.AuxInt != 0 { + continue + } + x := v.Args[1^_i0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) - return true + break } - // match: (Xor8 (Xor8 x y) x) + // match: (Xor64 x (Xor64 x y)) // result: y for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpXor8 { - break - } - y := v_0.Args[1] - if x != v_0.Args[0] { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpXor64 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + if x != v_1.Args[_i1] { + continue + } + y := v_1.Args[1^_i1] + v.reset(OpCopy) + v.Type = y.Type + v.AddArg(y) + return true + } } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) - return true + break } - // match: (Xor8 (Xor8 y x) x) - // result: y + // match: (Xor64 (Xor64 i:(Const64 ) z) x) + // cond: (z.Op != OpConst64 && x.Op != OpConst64) + // result: (Xor64 i (Xor64 z x)) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpXor8 { - break - } - _ = v_0.Args[1] - y := v_0.Args[0] - if x != v_0.Args[1] { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpXor64 { + continue + } + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + i := v_0.Args[_i1] + if i.Op != OpConst64 { + continue + } + t := i.Type + z := v_0.Args[1^_i1] + x := v.Args[1^_i0] + if !(z.Op != OpConst64 && x.Op != OpConst64) { + continue + } + v.reset(OpXor64) + v.AddArg(i) + v0 := b.NewValue0(v.Pos, OpXor64, t) + v0.AddArg(z) + v0.AddArg(x) + v.AddArg(v0) + return true + } } - v.reset(OpCopy) - v.Type = y.Type - v.AddArg(y) - return true + break } - // match: (Xor8 (Xor8 i:(Const8 ) z) x) - // cond: (z.Op != OpConst8 && x.Op != OpConst8) - // result: (Xor8 i (Xor8 z x)) + // match: (Xor64 (Const64 [c]) (Xor64 (Const64 [d]) x)) + // result: (Xor64 (Const64 [c^d]) x) for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpXor8 { - break - } - z := v_0.Args[1] - i := v_0.Args[0] - if i.Op != OpConst8 { - break - } - t := i.Type - if !(z.Op != OpConst8 && x.Op != OpConst8) { - break + _ = v.Args[1] + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst64 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpXor64 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst64 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpXor64) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = c ^ d + v.AddArg(v0) + v.AddArg(x) + return true + } } - v.reset(OpXor8) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpXor8, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true + break } return false } -func rewriteValuegeneric_OpXor8_10(v *Value) bool { +func rewriteValuegeneric_OpXor8_0(v *Value) bool { b := v.Block - // match: (Xor8 (Xor8 z i:(Const8 )) x) - // cond: (z.Op != OpConst8 && x.Op != OpConst8) - // result: (Xor8 i (Xor8 z x)) - for { - x := v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpXor8 { - break - } - _ = v_0.Args[1] - z := v_0.Args[0] - i := v_0.Args[1] - if i.Op != OpConst8 { - break - } - t := i.Type - if !(z.Op != OpConst8 && x.Op != OpConst8) { - break - } - v.reset(OpXor8) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpXor8, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true - } - // match: (Xor8 x (Xor8 i:(Const8 ) z)) - // cond: (z.Op != OpConst8 && x.Op != OpConst8) - // result: (Xor8 i (Xor8 z x)) + // match: (Xor8 (Const8 [c]) (Const8 [d])) + // result: (Const8 [int64(int8(c^d))]) for { _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpXor8 { - break - } - z := v_1.Args[1] - i := v_1.Args[0] - if i.Op != OpConst8 { - break - } - t := i.Type - if !(z.Op != OpConst8 && x.Op != OpConst8) { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst8 { + continue + } + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpConst8 { + continue + } + d := v_1.AuxInt + v.reset(OpConst8) + v.AuxInt = int64(int8(c ^ d)) + return true } - v.reset(OpXor8) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpXor8, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) - return true + break } - // match: (Xor8 x (Xor8 z i:(Const8 ))) - // cond: (z.Op != OpConst8 && x.Op != OpConst8) - // result: (Xor8 i (Xor8 z x)) + // match: (Xor8 x x) + // result: (Const8 [0]) for { - _ = v.Args[1] - x := v.Args[0] - v_1 := v.Args[1] - if v_1.Op != OpXor8 { - break - } - _ = v_1.Args[1] - z := v_1.Args[0] - i := v_1.Args[1] - if i.Op != OpConst8 { - break - } - t := i.Type - if !(z.Op != OpConst8 && x.Op != OpConst8) { + x := v.Args[1] + if x != v.Args[0] { break } - v.reset(OpXor8) - v.AddArg(i) - v0 := b.NewValue0(v.Pos, OpXor8, t) - v0.AddArg(z) - v0.AddArg(x) - v.AddArg(v0) + v.reset(OpConst8) + v.AuxInt = 0 return true } - // match: (Xor8 (Const8 [c]) (Xor8 (Const8 [d]) x)) - // result: (Xor8 (Const8 [int64(int8(c^d))]) x) + // match: (Xor8 (Const8 [0]) x) + // result: x for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpXor8 { - break - } - x := v_1.Args[1] - v_1_0 := v_1.Args[0] - if v_1_0.Op != OpConst8 || v_1_0.Type != t { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst8 || v_0.AuxInt != 0 { + continue + } + x := v.Args[1^_i0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true } - d := v_1_0.AuxInt - v.reset(OpXor8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c ^ d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (Xor8 (Const8 [c]) (Xor8 x (Const8 [d]))) - // result: (Xor8 (Const8 [int64(int8(c^d))]) x) + // match: (Xor8 x (Xor8 x y)) + // result: y for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpConst8 { - break - } - t := v_0.Type - c := v_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpXor8 { - break - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst8 || v_1_1.Type != t { - break + for _i0 := 0; _i0 <= 1; _i0++ { + x := v.Args[_i0] + v_1 := v.Args[1^_i0] + if v_1.Op != OpXor8 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + if x != v_1.Args[_i1] { + continue + } + y := v_1.Args[1^_i1] + v.reset(OpCopy) + v.Type = y.Type + v.AddArg(y) + return true + } } - d := v_1_1.AuxInt - v.reset(OpXor8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c ^ d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (Xor8 (Xor8 (Const8 [d]) x) (Const8 [c])) - // result: (Xor8 (Const8 [int64(int8(c^d))]) x) + // match: (Xor8 (Xor8 i:(Const8 ) z) x) + // cond: (z.Op != OpConst8 && x.Op != OpConst8) + // result: (Xor8 i (Xor8 z x)) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpXor8 { - break - } - x := v_0.Args[1] - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpConst8 { - break - } - t := v_0_0.Type - d := v_0_0.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.Type != t { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpXor8 { + continue + } + _ = v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + i := v_0.Args[_i1] + if i.Op != OpConst8 { + continue + } + t := i.Type + z := v_0.Args[1^_i1] + x := v.Args[1^_i0] + if !(z.Op != OpConst8 && x.Op != OpConst8) { + continue + } + v.reset(OpXor8) + v.AddArg(i) + v0 := b.NewValue0(v.Pos, OpXor8, t) + v0.AddArg(z) + v0.AddArg(x) + v.AddArg(v0) + return true + } } - c := v_1.AuxInt - v.reset(OpXor8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c ^ d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } - // match: (Xor8 (Xor8 x (Const8 [d])) (Const8 [c])) + // match: (Xor8 (Const8 [c]) (Xor8 (Const8 [d]) x)) // result: (Xor8 (Const8 [int64(int8(c^d))]) x) for { _ = v.Args[1] - v_0 := v.Args[0] - if v_0.Op != OpXor8 { - break - } - _ = v_0.Args[1] - x := v_0.Args[0] - v_0_1 := v_0.Args[1] - if v_0_1.Op != OpConst8 { - break - } - t := v_0_1.Type - d := v_0_1.AuxInt - v_1 := v.Args[1] - if v_1.Op != OpConst8 || v_1.Type != t { - break + for _i0 := 0; _i0 <= 1; _i0++ { + v_0 := v.Args[_i0] + if v_0.Op != OpConst8 { + continue + } + t := v_0.Type + c := v_0.AuxInt + v_1 := v.Args[1^_i0] + if v_1.Op != OpXor8 { + continue + } + _ = v_1.Args[1] + for _i1 := 0; _i1 <= 1; _i1++ { + v_1_0 := v_1.Args[_i1] + if v_1_0.Op != OpConst8 || v_1_0.Type != t { + continue + } + d := v_1_0.AuxInt + x := v_1.Args[1^_i1] + v.reset(OpXor8) + v0 := b.NewValue0(v.Pos, OpConst8, t) + v0.AuxInt = int64(int8(c ^ d)) + v.AddArg(v0) + v.AddArg(x) + return true + } } - c := v_1.AuxInt - v.reset(OpXor8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int64(int8(c ^ d)) - v.AddArg(v0) - v.AddArg(x) - return true + break } return false } -- 2.51.0