|
|
|
|
@ -664,7 +664,7 @@ 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)
|
|
|
|
|
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)
|
|
|
|
|
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) || rewriteValueS390X_OpS390XORW_90(v)
|
|
|
|
|
case OpS390XORWconst:
|
|
|
|
|
@ -7585,6 +7585,49 @@ func rewriteValueS390X_OpS390XAND_0(v *Value) bool {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
func rewriteValueS390X_OpS390XAND_10(v *Value) bool {
|
|
|
|
|
b := v.Block
|
|
|
|
|
// match: (AND (MOVDconst [^(-1<<63)]) (LGDR <t> x))
|
|
|
|
|
// result: (LGDR <t> (LPDFR <x.Type> 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 <t> x) (MOVDconst [^(-1<<63)]))
|
|
|
|
|
// result: (LGDR <t> (LPDFR <x.Type> 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, OpS390XLPDFR, x.Type)
|
|
|
|
|
v0.AddArg(x)
|
|
|
|
|
v.AddArg(v0)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
// match: (AND (MOVDconst [c]) (MOVDconst [d]))
|
|
|
|
|
// result: (MOVDconst [c&d])
|
|
|
|
|
for {
|
|
|
|
|
@ -10134,6 +10177,45 @@ func rewriteValueS390X_OpS390XLDGR_0(v *Value) bool {
|
|
|
|
|
v.AddArg(v0)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
// match: (LDGR <t> (AND (MOVDconst [^(-1<<63)]) x))
|
|
|
|
|
// result: (LPDFR (LDGR <t> 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 <t> (AND x (MOVDconst [^(-1<<63)])))
|
|
|
|
|
// result: (LPDFR (LDGR <t> x))
|
|
|
|
|
for {
|
|
|
|
|
t := v.Type
|
|
|
|
|
v_0 := v.Args[0]
|
|
|
|
|
if v_0.Op != OpS390XAND {
|
|
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
v.reset(OpS390XLPDFR)
|
|
|
|
|
v0 := b.NewValue0(v.Pos, OpS390XLDGR, t)
|
|
|
|
|
v0.AddArg(x)
|
|
|
|
|
v.AddArg(v0)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
// match: (LDGR <t> (OR (MOVDconst [-1<<63]) x))
|
|
|
|
|
// result: (LNDFR (LDGR <t> x))
|
|
|
|
|
for {
|
|
|
|
|
@ -20469,7 +20551,287 @@ func rewriteValueS390X_OpS390XOR_0(v *Value) bool {
|
|
|
|
|
}
|
|
|
|
|
func rewriteValueS390X_OpS390XOR_10(v *Value) bool {
|
|
|
|
|
b := v.Block
|
|
|
|
|
typ := &b.Func.Config.Types
|
|
|
|
|
// match: (OR (AND (MOVDconst [-1<<63]) (LGDR x)) (LGDR (LPDFR <t> y)))
|
|
|
|
|
// result: (LGDR (CPSDR <t> 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 <t> y)))
|
|
|
|
|
// result: (LGDR (CPSDR <t> 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 <t> y)) (AND (MOVDconst [-1<<63]) (LGDR x)))
|
|
|
|
|
// result: (LGDR (CPSDR <t> 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 <t> y)) (AND (LGDR x) (MOVDconst [-1<<63])))
|
|
|
|
|
// result: (LGDR (CPSDR <t> 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 <x.Type> (FMOVDconst <x.Type> [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 <x.Type> (FMOVDconst <x.Type> [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 <x.Type> (FMOVDconst <x.Type> [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 <x.Type> (FMOVDconst <x.Type> [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 {
|
|
|
|
|
@ -20506,6 +20868,11 @@ func rewriteValueS390X_OpS390XOR_10(v *Value) bool {
|
|
|
|
|
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 {
|
|
|
|
|
@ -20741,11 +21108,6 @@ func rewriteValueS390X_OpS390XOR_10(v *Value) bool {
|
|
|
|
|
v0.AddArg(mem)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
func rewriteValueS390X_OpS390XOR_20(v *Value) bool {
|
|
|
|
|
b := v.Block
|
|
|
|
|
typ := &b.Func.Config.Types
|
|
|
|
|
// 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)
|
|
|
|
|
@ -20824,6 +21186,11 @@ func rewriteValueS390X_OpS390XOR_20(v *Value) bool {
|
|
|
|
|
v0.AddArg(mem)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
func rewriteValueS390X_OpS390XOR_30(v *Value) bool {
|
|
|
|
|
b := v.Block
|
|
|
|
|
typ := &b.Func.Config.Types
|
|
|
|
|
// 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)
|
|
|
|
|
@ -21258,11 +21625,6 @@ func rewriteValueS390X_OpS390XOR_20(v *Value) bool {
|
|
|
|
|
v0.AddArg(y)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
func rewriteValueS390X_OpS390XOR_30(v *Value) bool {
|
|
|
|
|
b := v.Block
|
|
|
|
|
typ := &b.Func.Config.Types
|
|
|
|
|
// 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 <v.Type> (SLDconst <v.Type> [j1] (MOVWZload [i0] {s} p mem)) y)
|
|
|
|
|
@ -21361,6 +21723,11 @@ func rewriteValueS390X_OpS390XOR_30(v *Value) bool {
|
|
|
|
|
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} 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)
|
|
|
|
|
@ -21689,11 +22056,6 @@ func rewriteValueS390X_OpS390XOR_30(v *Value) bool {
|
|
|
|
|
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:(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)
|
|
|
|
|
@ -21776,6 +22138,11 @@ func rewriteValueS390X_OpS390XOR_40(v *Value) bool {
|
|
|
|
|
v0.AddArg(mem)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
func rewriteValueS390X_OpS390XOR_50(v *Value) bool {
|
|
|
|
|
b := v.Block
|
|
|
|
|
typ := &b.Func.Config.Types
|
|
|
|
|
// 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)
|
|
|
|
|
@ -22104,11 +22471,6 @@ func rewriteValueS390X_OpS390XOR_40(v *Value) bool {
|
|
|
|
|
v0.AddArg(mem)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
func rewriteValueS390X_OpS390XOR_50(v *Value) bool {
|
|
|
|
|
b := v.Block
|
|
|
|
|
typ := &b.Func.Config.Types
|
|
|
|
|
// 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)
|
|
|
|
|
@ -22191,6 +22553,11 @@ func rewriteValueS390X_OpS390XOR_50(v *Value) bool {
|
|
|
|
|
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} 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)
|
|
|
|
|
@ -22605,11 +22972,6 @@ func rewriteValueS390X_OpS390XOR_50(v *Value) bool {
|
|
|
|
|
v0.AddArg(y)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
func rewriteValueS390X_OpS390XOR_60(v *Value) bool {
|
|
|
|
|
b := v.Block
|
|
|
|
|
typ := &b.Func.Config.Types
|
|
|
|
|
// 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 <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
|
|
|
|
|
@ -22728,6 +23090,11 @@ func rewriteValueS390X_OpS390XOR_60(v *Value) bool {
|
|
|
|
|
v0.AddArg(y)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
func rewriteValueS390X_OpS390XOR_70(v *Value) bool {
|
|
|
|
|
b := v.Block
|
|
|
|
|
typ := &b.Func.Config.Types
|
|
|
|
|
// 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 <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
|
|
|
|
|
@ -23196,11 +23563,6 @@ func rewriteValueS390X_OpS390XOR_60(v *Value) bool {
|
|
|
|
|
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 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 <v.Type> (SLDconst <v.Type> [j1] (MOVHZloadidx [i0] {s} p idx mem)) y)
|
|
|
|
|
@ -23318,6 +23680,11 @@ func rewriteValueS390X_OpS390XOR_70(v *Value) bool {
|
|
|
|
|
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} 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 <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y)
|
|
|
|
|
@ -23786,11 +24153,6 @@ func rewriteValueS390X_OpS390XOR_70(v *Value) bool {
|
|
|
|
|
v0.AddArg(y)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
func rewriteValueS390X_OpS390XOR_80(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} 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 <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y)
|
|
|
|
|
@ -23908,6 +24270,11 @@ func rewriteValueS390X_OpS390XOR_80(v *Value) bool {
|
|
|
|
|
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 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 <v.Type> (SLDconst <v.Type> [j1] (MOVWZloadidx [i0] {s} p idx mem)) y)
|
|
|
|
|
@ -24332,11 +24699,6 @@ func rewriteValueS390X_OpS390XOR_80(v *Value) bool {
|
|
|
|
|
v0.AddArg(v1)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
func rewriteValueS390X_OpS390XOR_90(v *Value) bool {
|
|
|
|
|
b := v.Block
|
|
|
|
|
typ := &b.Func.Config.Types
|
|
|
|
|
// 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))
|
|
|
|
|
@ -24433,6 +24795,11 @@ func rewriteValueS390X_OpS390XOR_90(v *Value) bool {
|
|
|
|
|
v0.AddArg(mem)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
func rewriteValueS390X_OpS390XOR_100(v *Value) bool {
|
|
|
|
|
b := v.Block
|
|
|
|
|
typ := &b.Func.Config.Types
|
|
|
|
|
// 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)
|
|
|
|
|
@ -24913,11 +25280,6 @@ func rewriteValueS390X_OpS390XOR_90(v *Value) bool {
|
|
|
|
|
v0.AddArg(y)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
func rewriteValueS390X_OpS390XOR_100(v *Value) bool {
|
|
|
|
|
b := v.Block
|
|
|
|
|
typ := &b.Func.Config.Types
|
|
|
|
|
// 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 <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y)
|
|
|
|
|
@ -25028,6 +25390,11 @@ func rewriteValueS390X_OpS390XOR_100(v *Value) bool {
|
|
|
|
|
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} 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))
|
|
|
|
|
@ -25380,11 +25747,6 @@ func rewriteValueS390X_OpS390XOR_100(v *Value) bool {
|
|
|
|
|
v0.AddArg(v1)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
func rewriteValueS390X_OpS390XOR_110(v *Value) bool {
|
|
|
|
|
b := v.Block
|
|
|
|
|
typ := &b.Func.Config.Types
|
|
|
|
|
// 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))
|
|
|
|
|
@ -25487,6 +25849,11 @@ func rewriteValueS390X_OpS390XOR_110(v *Value) bool {
|
|
|
|
|
v0.AddArg(v1)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
func rewriteValueS390X_OpS390XOR_120(v *Value) bool {
|
|
|
|
|
b := v.Block
|
|
|
|
|
typ := &b.Func.Config.Types
|
|
|
|
|
// 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))
|
|
|
|
|
@ -25889,11 +26256,6 @@ func rewriteValueS390X_OpS390XOR_110(v *Value) bool {
|
|
|
|
|
v0.AddArg(mem)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
func rewriteValueS390X_OpS390XOR_120(v *Value) bool {
|
|
|
|
|
b := v.Block
|
|
|
|
|
typ := &b.Func.Config.Types
|
|
|
|
|
// 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)
|
|
|
|
|
@ -25992,6 +26354,11 @@ func rewriteValueS390X_OpS390XOR_120(v *Value) bool {
|
|
|
|
|
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} 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)
|
|
|
|
|
@ -26440,11 +26807,6 @@ func rewriteValueS390X_OpS390XOR_120(v *Value) bool {
|
|
|
|
|
v0.AddArg(y)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
func rewriteValueS390X_OpS390XOR_130(v *Value) bool {
|
|
|
|
|
b := v.Block
|
|
|
|
|
typ := &b.Func.Config.Types
|
|
|
|
|
// 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 <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
|
|
|
|
|
@ -26567,6 +26929,11 @@ func rewriteValueS390X_OpS390XOR_130(v *Value) bool {
|
|
|
|
|
v0.AddArg(y)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
func rewriteValueS390X_OpS390XOR_140(v *Value) bool {
|
|
|
|
|
b := v.Block
|
|
|
|
|
typ := &b.Func.Config.Types
|
|
|
|
|
// 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 <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
|
|
|
|
|
@ -27051,11 +27418,6 @@ func rewriteValueS390X_OpS390XOR_130(v *Value) bool {
|
|
|
|
|
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 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 <v.Type> (SLDconst <v.Type> [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y)
|
|
|
|
|
@ -27185,6 +27547,11 @@ func rewriteValueS390X_OpS390XOR_140(v *Value) bool {
|
|
|
|
|
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} 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 <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y)
|
|
|
|
|
@ -27733,11 +28100,6 @@ func rewriteValueS390X_OpS390XOR_140(v *Value) bool {
|
|
|
|
|
v0.AddArg(y)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
func rewriteValueS390X_OpS390XOR_150(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} 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 <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y)
|
|
|
|
|
@ -27875,6 +28237,11 @@ func rewriteValueS390X_OpS390XOR_150(v *Value) bool {
|
|
|
|
|
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 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 <v.Type> (SLDconst <v.Type> [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y)
|
|
|
|
|
|