diff options
Diffstat (limited to 'src/cmd/compile/internal/ssa/rewritePPC64.go')
-rw-r--r-- | src/cmd/compile/internal/ssa/rewritePPC64.go | 706 |
1 files changed, 324 insertions, 382 deletions
diff --git a/src/cmd/compile/internal/ssa/rewritePPC64.go b/src/cmd/compile/internal/ssa/rewritePPC64.go index 4ac5eec073..6e39ee5576 100644 --- a/src/cmd/compile/internal/ssa/rewritePPC64.go +++ b/src/cmd/compile/internal/ssa/rewritePPC64.go @@ -611,6 +611,8 @@ func rewriteValuePPC64(v *Value) bool { return rewriteValuePPC64_OpPPC64ORN(v) case OpPPC64ORconst: return rewriteValuePPC64_OpPPC64ORconst(v) + case OpPPC64RLWINM: + return rewriteValuePPC64_OpPPC64RLWINM(v) case OpPPC64ROTL: return rewriteValuePPC64_OpPPC64ROTL(v) case OpPPC64ROTLW: @@ -4628,6 +4630,24 @@ func rewriteValuePPC64_OpPPC64CLRLSLDI(v *Value) bool { v.AddArg(x) return true } + // match: (CLRLSLDI [c] (SRDconst [s] x)) + // cond: mergePPC64ClrlsldiSrd(int64(c),s) != 0 + // result: (RLWINM [mergePPC64ClrlsldiSrd(int64(c),s)] x) + for { + c := auxIntToInt32(v.AuxInt) + if v_0.Op != OpPPC64SRDconst { + break + } + s := auxIntToInt64(v_0.AuxInt) + x := v_0.Args[0] + if !(mergePPC64ClrlsldiSrd(int64(c), s) != 0) { + break + } + v.reset(OpPPC64RLWINM) + v.AuxInt = int64ToAuxInt(mergePPC64ClrlsldiSrd(int64(c), s)) + v.AddArg(x) + return true + } // match: (CLRLSLDI [c] i:(RLWINM [s] x)) // cond: mergePPC64ClrlsldiRlwinm(c,s) != 0 // result: (RLWINM [mergePPC64ClrlsldiRlwinm(c,s)] x) @@ -4829,6 +4849,21 @@ func rewriteValuePPC64_OpPPC64CMPUconst(v *Value) bool { v.reset(OpPPC64FlagGT) return true } + // match: (CMPUconst [0] (Select0 a:(ANDCCconst [n] z))) + // result: (Select1 <types.TypeFlags> a) + for { + if auxIntToInt64(v.AuxInt) != 0 || v_0.Op != OpSelect0 { + break + } + a := v_0.Args[0] + if a.Op != OpPPC64ANDCCconst { + break + } + v.reset(OpSelect1) + v.Type = types.TypeFlags + v.AddArg(a) + return true + } return false } func rewriteValuePPC64_OpPPC64CMPW(v *Value) bool { @@ -5059,6 +5094,21 @@ func rewriteValuePPC64_OpPPC64CMPWUconst(v *Value) bool { v.reset(OpPPC64FlagGT) return true } + // match: (CMPWUconst [0] (Select0 a:(ANDCCconst [n] z))) + // result: (Select1 <types.TypeFlags> a) + for { + if auxIntToInt32(v.AuxInt) != 0 || v_0.Op != OpSelect0 { + break + } + a := v_0.Args[0] + if a.Op != OpPPC64ANDCCconst { + break + } + v.reset(OpSelect1) + v.Type = types.TypeFlags + v.AddArg(a) + return true + } return false } func rewriteValuePPC64_OpPPC64CMPWconst(v *Value) bool { @@ -5108,6 +5158,21 @@ func rewriteValuePPC64_OpPPC64CMPWconst(v *Value) bool { v.reset(OpPPC64FlagGT) return true } + // match: (CMPWconst [0] (Select0 a:(ANDCCconst [n] z))) + // result: (Select1 <types.TypeFlags> a) + for { + if auxIntToInt32(v.AuxInt) != 0 || v_0.Op != OpSelect0 { + break + } + a := v_0.Args[0] + if a.Op != OpPPC64ANDCCconst { + break + } + v.reset(OpSelect1) + v.Type = types.TypeFlags + v.AddArg(a) + return true + } return false } func rewriteValuePPC64_OpPPC64CMPconst(v *Value) bool { @@ -5157,6 +5222,21 @@ func rewriteValuePPC64_OpPPC64CMPconst(v *Value) bool { v.reset(OpPPC64FlagGT) return true } + // match: (CMPconst [0] (Select0 a:(ANDCCconst [n] z))) + // result: (Select1 <types.TypeFlags> a) + for { + if auxIntToInt64(v.AuxInt) != 0 || v_0.Op != OpSelect0 { + break + } + a := v_0.Args[0] + if a.Op != OpPPC64ANDCCconst { + break + } + v.reset(OpSelect1) + v.Type = types.TypeFlags + v.AddArg(a) + return true + } return false } func rewriteValuePPC64_OpPPC64Equal(v *Value) bool { @@ -5841,8 +5921,6 @@ func rewriteValuePPC64_OpPPC64ISEL(v *Value) bool { v_2 := v.Args[2] v_1 := v.Args[1] v_0 := v.Args[0] - b := v.Block - typ := &b.Func.Config.Types // match: (ISEL [6] x y (Select1 (ANDCCconst [1] (SETBC [c] cmp)))) // result: (ISEL [c] x y cmp) for { @@ -6191,130 +6269,6 @@ func rewriteValuePPC64_OpPPC64ISEL(v *Value) bool { v.copyOf(y) return true } - // match: (ISEL [2] x y (CMPconst [0] (Select0 (ANDCCconst [n] z)))) - // result: (ISEL [2] x y (Select1 <types.TypeFlags> (ANDCCconst [n] z ))) - for { - if auxIntToInt32(v.AuxInt) != 2 { - break - } - x := v_0 - y := v_1 - if v_2.Op != OpPPC64CMPconst || auxIntToInt64(v_2.AuxInt) != 0 { - break - } - v_2_0 := v_2.Args[0] - if v_2_0.Op != OpSelect0 { - break - } - v_2_0_0 := v_2_0.Args[0] - if v_2_0_0.Op != OpPPC64ANDCCconst { - break - } - n := auxIntToInt64(v_2_0_0.AuxInt) - z := v_2_0_0.Args[0] - v.reset(OpPPC64ISEL) - v.AuxInt = int32ToAuxInt(2) - v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags) - v1 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags)) - v1.AuxInt = int64ToAuxInt(n) - v1.AddArg(z) - v0.AddArg(v1) - v.AddArg3(x, y, v0) - return true - } - // match: (ISEL [2] x y (CMPWconst [0] (Select0 (ANDCCconst [n] z)))) - // result: (ISEL [2] x y (Select1 <types.TypeFlags> (ANDCCconst [n] z ))) - for { - if auxIntToInt32(v.AuxInt) != 2 { - break - } - x := v_0 - y := v_1 - if v_2.Op != OpPPC64CMPWconst || auxIntToInt32(v_2.AuxInt) != 0 { - break - } - v_2_0 := v_2.Args[0] - if v_2_0.Op != OpSelect0 { - break - } - v_2_0_0 := v_2_0.Args[0] - if v_2_0_0.Op != OpPPC64ANDCCconst { - break - } - n := auxIntToInt64(v_2_0_0.AuxInt) - z := v_2_0_0.Args[0] - v.reset(OpPPC64ISEL) - v.AuxInt = int32ToAuxInt(2) - v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags) - v1 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags)) - v1.AuxInt = int64ToAuxInt(n) - v1.AddArg(z) - v0.AddArg(v1) - v.AddArg3(x, y, v0) - return true - } - // match: (ISEL [6] x y (CMPconst [0] (Select0 (ANDCCconst [n] z)))) - // result: (ISEL [6] x y (Select1 <types.TypeFlags> (ANDCCconst [n] z ))) - for { - if auxIntToInt32(v.AuxInt) != 6 { - break - } - x := v_0 - y := v_1 - if v_2.Op != OpPPC64CMPconst || auxIntToInt64(v_2.AuxInt) != 0 { - break - } - v_2_0 := v_2.Args[0] - if v_2_0.Op != OpSelect0 { - break - } - v_2_0_0 := v_2_0.Args[0] - if v_2_0_0.Op != OpPPC64ANDCCconst { - break - } - n := auxIntToInt64(v_2_0_0.AuxInt) - z := v_2_0_0.Args[0] - v.reset(OpPPC64ISEL) - v.AuxInt = int32ToAuxInt(6) - v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags) - v1 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags)) - v1.AuxInt = int64ToAuxInt(n) - v1.AddArg(z) - v0.AddArg(v1) - v.AddArg3(x, y, v0) - return true - } - // match: (ISEL [6] x y (CMPWconst [0] (Select0 (ANDCCconst [n] z)))) - // result: (ISEL [6] x y (Select1 <types.TypeFlags> (ANDCCconst [n] z ))) - for { - if auxIntToInt32(v.AuxInt) != 6 { - break - } - x := v_0 - y := v_1 - if v_2.Op != OpPPC64CMPWconst || auxIntToInt32(v_2.AuxInt) != 0 { - break - } - v_2_0 := v_2.Args[0] - if v_2_0.Op != OpSelect0 { - break - } - v_2_0_0 := v_2_0.Args[0] - if v_2_0_0.Op != OpPPC64ANDCCconst { - break - } - n := auxIntToInt64(v_2_0_0.AuxInt) - z := v_2_0_0.Args[0] - v.reset(OpPPC64ISEL) - v.AuxInt = int32ToAuxInt(6) - v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags) - v1 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags)) - v1.AuxInt = int64ToAuxInt(n) - v1.AddArg(z) - v0.AddArg(v1) - v.AddArg3(x, y, v0) - return true - } // match: (ISEL [n] x y (InvertFlags bool)) // cond: n%4 == 0 // result: (ISEL [n+1] x y bool) @@ -6747,6 +6701,40 @@ func rewriteValuePPC64_OpPPC64MOVBZreg(v *Value) bool { v.AddArg(x) return true } + // match: (MOVBZreg (SRWconst x [s])) + // cond: mergePPC64AndSrwi(0xFF,s) != 0 + // result: (RLWINM [mergePPC64AndSrwi(0xFF,s)] x) + for { + if v_0.Op != OpPPC64SRWconst { + break + } + s := auxIntToInt64(v_0.AuxInt) + x := v_0.Args[0] + if !(mergePPC64AndSrwi(0xFF, s) != 0) { + break + } + v.reset(OpPPC64RLWINM) + v.AuxInt = int64ToAuxInt(mergePPC64AndSrwi(0xFF, s)) + v.AddArg(x) + return true + } + // match: (MOVBZreg (RLWINM [r] y)) + // cond: mergePPC64AndRlwinm(0xFF,r) != 0 + // result: (RLWINM [mergePPC64AndRlwinm(0xFF,r)] y) + for { + if v_0.Op != OpPPC64RLWINM { + break + } + r := auxIntToInt64(v_0.AuxInt) + y := v_0.Args[0] + if !(mergePPC64AndRlwinm(0xFF, r) != 0) { + break + } + v.reset(OpPPC64RLWINM) + v.AuxInt = int64ToAuxInt(mergePPC64AndRlwinm(0xFF, r)) + v.AddArg(y) + return true + } // match: (MOVBZreg (OR <t> x (MOVWZreg y))) // result: (MOVBZreg (OR <t> x y)) for { @@ -8592,6 +8580,23 @@ func rewriteValuePPC64_OpPPC64MOVHZreg(v *Value) bool { v.AddArg(x) return true } + // match: (MOVHZreg (RLWINM [r] y)) + // cond: mergePPC64AndRlwinm(0xFFFF,r) != 0 + // result: (RLWINM [mergePPC64AndRlwinm(0xFFFF,r)] y) + for { + if v_0.Op != OpPPC64RLWINM { + break + } + r := auxIntToInt64(v_0.AuxInt) + y := v_0.Args[0] + if !(mergePPC64AndRlwinm(0xFFFF, r) != 0) { + break + } + v.reset(OpPPC64RLWINM) + v.AuxInt = int64ToAuxInt(mergePPC64AndRlwinm(0xFFFF, r)) + v.AddArg(y) + return true + } // match: (MOVHZreg y:(MOVHZreg _)) // result: y for { @@ -9942,6 +9947,33 @@ func rewriteValuePPC64_OpPPC64MOVWZreg(v *Value) bool { v.AddArg(x) return true } + // match: (MOVWZreg (RLWINM [r] y)) + // cond: mergePPC64AndRlwinm(0xFFFFFFFF,r) != 0 + // result: (RLWINM [mergePPC64AndRlwinm(0xFFFFFFFF,r)] y) + for { + if v_0.Op != OpPPC64RLWINM { + break + } + r := auxIntToInt64(v_0.AuxInt) + y := v_0.Args[0] + if !(mergePPC64AndRlwinm(0xFFFFFFFF, r) != 0) { + break + } + v.reset(OpPPC64RLWINM) + v.AuxInt = int64ToAuxInt(mergePPC64AndRlwinm(0xFFFFFFFF, r)) + v.AddArg(y) + return true + } + // match: (MOVWZreg w:(SLWconst u)) + // result: w + for { + w := v_0 + if w.Op != OpPPC64SLWconst { + break + } + v.copyOf(w) + return true + } // match: (MOVWZreg y:(MOVWZreg _)) // result: y for { @@ -11328,6 +11360,49 @@ func rewriteValuePPC64_OpPPC64ORconst(v *Value) bool { } return false } +func rewriteValuePPC64_OpPPC64RLWINM(v *Value) bool { + v_0 := v.Args[0] + // match: (RLWINM [r] (MOVHZreg u)) + // cond: mergePPC64RlwinmAnd(r,0xFFFF) != 0 + // result: (RLWINM [mergePPC64RlwinmAnd(r,0xFFFF)] u) + for { + r := auxIntToInt64(v.AuxInt) + if v_0.Op != OpPPC64MOVHZreg { + break + } + u := v_0.Args[0] + if !(mergePPC64RlwinmAnd(r, 0xFFFF) != 0) { + break + } + v.reset(OpPPC64RLWINM) + v.AuxInt = int64ToAuxInt(mergePPC64RlwinmAnd(r, 0xFFFF)) + v.AddArg(u) + return true + } + // match: (RLWINM [r] (Select0 (ANDCCconst [a] u))) + // cond: mergePPC64RlwinmAnd(r,uint32(a)) != 0 + // result: (RLWINM [mergePPC64RlwinmAnd(r,uint32(a))] u) + for { + r := auxIntToInt64(v.AuxInt) + if v_0.Op != OpSelect0 { + break + } + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpPPC64ANDCCconst { + break + } + a := auxIntToInt64(v_0_0.AuxInt) + u := v_0_0.Args[0] + if !(mergePPC64RlwinmAnd(r, uint32(a)) != 0) { + break + } + v.reset(OpPPC64RLWINM) + v.AuxInt = int64ToAuxInt(mergePPC64RlwinmAnd(r, uint32(a))) + v.AddArg(u) + return true + } + return false +} func rewriteValuePPC64_OpPPC64ROTL(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] @@ -11560,79 +11635,24 @@ func rewriteValuePPC64_OpPPC64SETBC(v *Value) bool { v.AddArg(bool) return true } - // match: (SETBC [2] (CMPconst [0] (Select0 (ANDCCconst [1] z)))) - // result: (XORconst [1] (Select0 <typ.UInt64> (ANDCCconst [1] z ))) - for { - if auxIntToInt32(v.AuxInt) != 2 || v_0.Op != OpPPC64CMPconst || auxIntToInt64(v_0.AuxInt) != 0 { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSelect0 { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0_0_0.AuxInt) != 1 { - break - } - z := v_0_0_0.Args[0] - v.reset(OpPPC64XORconst) - v.AuxInt = int64ToAuxInt(1) - v0 := b.NewValue0(v.Pos, OpSelect0, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags)) - v1.AuxInt = int64ToAuxInt(1) - v1.AddArg(z) - v0.AddArg(v1) - v.AddArg(v0) - return true - } - // match: (SETBC [2] (CMPWconst [0] (Select0 (ANDCCconst [1] z)))) - // result: (XORconst [1] (Select0 <typ.UInt64> (ANDCCconst [1] z ))) + // match: (SETBC [2] (Select1 a:(ANDCCconst <t> [1] _))) + // result: (XORconst [1] (Select0 <t.FieldType(0)> a)) for { - if auxIntToInt32(v.AuxInt) != 2 || v_0.Op != OpPPC64CMPWconst || auxIntToInt32(v_0.AuxInt) != 0 { + if auxIntToInt32(v.AuxInt) != 2 || v_0.Op != OpSelect1 { break } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSelect0 { + a := v_0.Args[0] + if a.Op != OpPPC64ANDCCconst { break } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0_0_0.AuxInt) != 1 { + t := a.Type + if auxIntToInt64(a.AuxInt) != 1 { break } - z := v_0_0_0.Args[0] v.reset(OpPPC64XORconst) v.AuxInt = int64ToAuxInt(1) - v0 := b.NewValue0(v.Pos, OpSelect0, typ.UInt64) - v1 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags)) - v1.AuxInt = int64ToAuxInt(1) - v1.AddArg(z) - v0.AddArg(v1) - v.AddArg(v0) - return true - } - // match: (SETBC [2] (CMPWconst [0] (Select0 (ANDCCconst [n] z)))) - // result: (SETBC [2] (Select1 <types.TypeFlags> (ANDCCconst [n] z ))) - for { - if auxIntToInt32(v.AuxInt) != 2 || v_0.Op != OpPPC64CMPWconst || auxIntToInt32(v_0.AuxInt) != 0 { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSelect0 { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpPPC64ANDCCconst { - break - } - n := auxIntToInt64(v_0_0_0.AuxInt) - z := v_0_0_0.Args[0] - v.reset(OpPPC64SETBC) - v.AuxInt = int32ToAuxInt(2) - v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags) - v1 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags)) - v1.AuxInt = int64ToAuxInt(n) - v1.AddArg(z) - v0.AddArg(v1) + v0 := b.NewValue0(v.Pos, OpSelect0, t.FieldType(0)) + v0.AddArg(a) v.AddArg(v0) return true } @@ -11856,76 +11876,18 @@ func rewriteValuePPC64_OpPPC64SETBCR(v *Value) bool { v.AddArg(bool) return true } - // match: (SETBCR [2] (CMPconst [0] (Select0 (ANDCCconst [1] z)))) - // result: (Select0 <typ.UInt64> (ANDCCconst [1] z )) + // match: (SETBCR [2] (Select1 a:(ANDCCconst [1] _))) + // result: (Select0 a) for { - if auxIntToInt32(v.AuxInt) != 2 || v_0.Op != OpPPC64CMPconst || auxIntToInt64(v_0.AuxInt) != 0 { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSelect0 { + if auxIntToInt32(v.AuxInt) != 2 || v_0.Op != OpSelect1 { break } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0_0_0.AuxInt) != 1 { + a := v_0.Args[0] + if a.Op != OpPPC64ANDCCconst || auxIntToInt64(a.AuxInt) != 1 { break } - z := v_0_0_0.Args[0] v.reset(OpSelect0) - v.Type = typ.UInt64 - v0 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags)) - v0.AuxInt = int64ToAuxInt(1) - v0.AddArg(z) - v.AddArg(v0) - return true - } - // match: (SETBCR [2] (CMPWconst [0] (Select0 (ANDCCconst [1] z)))) - // result: (Select0 <typ.UInt64> (ANDCCconst [1] z )) - for { - if auxIntToInt32(v.AuxInt) != 2 || v_0.Op != OpPPC64CMPWconst || auxIntToInt32(v_0.AuxInt) != 0 { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSelect0 { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0_0_0.AuxInt) != 1 { - break - } - z := v_0_0_0.Args[0] - v.reset(OpSelect0) - v.Type = typ.UInt64 - v0 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags)) - v0.AuxInt = int64ToAuxInt(1) - v0.AddArg(z) - v.AddArg(v0) - return true - } - // match: (SETBCR [2] (CMPWconst [0] (Select0 (ANDCCconst [n] z)))) - // result: (SETBCR [2] (Select1 <types.TypeFlags> (ANDCCconst [n] z ))) - for { - if auxIntToInt32(v.AuxInt) != 2 || v_0.Op != OpPPC64CMPWconst || auxIntToInt32(v_0.AuxInt) != 0 { - break - } - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSelect0 { - break - } - v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpPPC64ANDCCconst { - break - } - n := auxIntToInt64(v_0_0_0.AuxInt) - z := v_0_0_0.Args[0] - v.reset(OpPPC64SETBCR) - v.AuxInt = int32ToAuxInt(2) - v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags) - v1 := b.NewValue0(v.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags)) - v1.AuxInt = int64ToAuxInt(n) - v1.AddArg(z) - v0.AddArg(v1) - v.AddArg(v0) + v.AddArg(a) return true } // match: (SETBCR [2] (CMPconst [0] a:(AND y z))) @@ -12043,6 +12005,24 @@ func rewriteValuePPC64_OpPPC64SLDconst(v *Value) bool { v.AddArg(x) return true } + // match: (SLDconst [s] (RLWINM [r] y)) + // cond: mergePPC64SldiRlwinm(s,r) != 0 + // result: (RLWINM [mergePPC64SldiRlwinm(s,r)] y) + for { + s := auxIntToInt64(v.AuxInt) + if v_0.Op != OpPPC64RLWINM { + break + } + r := auxIntToInt64(v_0.AuxInt) + y := v_0.Args[0] + if !(mergePPC64SldiRlwinm(s, r) != 0) { + break + } + v.reset(OpPPC64RLWINM) + v.AuxInt = int64ToAuxInt(mergePPC64SldiRlwinm(s, r)) + v.AddArg(y) + return true + } // match: (SLDconst [c] z:(MOVBZreg x)) // cond: c < 8 && z.Uses == 1 // result: (CLRLSLDI [newPPC64ShiftAuxInt(c,56,63,64)] x) @@ -12188,6 +12168,19 @@ func rewriteValuePPC64_OpPPC64SLW(v *Value) bool { } func rewriteValuePPC64_OpPPC64SLWconst(v *Value) bool { v_0 := v.Args[0] + // match: (SLWconst [s] (MOVWZreg w)) + // result: (SLWconst [s] w) + for { + s := auxIntToInt64(v.AuxInt) + if v_0.Op != OpPPC64MOVWZreg { + break + } + w := v_0.Args[0] + v.reset(OpPPC64SLWconst) + v.AuxInt = int64ToAuxInt(s) + v.AddArg(w) + return true + } // match: (SLWconst [c] z:(MOVBZreg x)) // cond: z.Uses == 1 && c < 8 // result: (CLRLSLWI [newPPC64ShiftAuxInt(c,24,31,32)] x) @@ -14647,6 +14640,28 @@ func rewriteValuePPC64_OpSelect0(v *Value) bool { v.AddArg(v0) return true } + // match: (Select0 (ANDCCconst [m] (RLWINM [r] y))) + // cond: mergePPC64AndRlwinm(uint32(m),r) != 0 + // result: (RLWINM [mergePPC64AndRlwinm(uint32(m),r)] y) + for { + if v_0.Op != OpPPC64ANDCCconst { + break + } + m := auxIntToInt64(v_0.AuxInt) + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpPPC64RLWINM { + break + } + r := auxIntToInt64(v_0_0.AuxInt) + y := v_0_0.Args[0] + if !(mergePPC64AndRlwinm(uint32(m), r) != 0) { + break + } + v.reset(OpPPC64RLWINM) + v.AuxInt = int64ToAuxInt(mergePPC64AndRlwinm(uint32(m), r)) + v.AddArg(y) + return true + } // match: (Select0 (ANDCCconst [1] z:(SRADconst [63] x))) // cond: z.Uses == 1 // result: (SRDconst [63] x) @@ -15935,16 +15950,13 @@ func rewriteBlockPPC64(b *Block) bool { return true } // match: (If cond yes no) - // result: (NE (CMPWconst [0] (Select0 <typ.UInt32> (ANDCCconst [1] cond))) yes no) + // result: (NE (Select1 <types.TypeFlags> (ANDCCconst [1] cond)) yes no) for { cond := b.Controls[0] - v0 := b.NewValue0(cond.Pos, OpPPC64CMPWconst, types.TypeFlags) - v0.AuxInt = int32ToAuxInt(0) - v1 := b.NewValue0(cond.Pos, OpSelect0, typ.UInt32) - v2 := b.NewValue0(cond.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags)) - v2.AuxInt = int64ToAuxInt(1) - v2.AddArg(cond) - v1.AddArg(v2) + v0 := b.NewValue0(cond.Pos, OpSelect1, types.TypeFlags) + v1 := b.NewValue0(cond.Pos, OpPPC64ANDCCconst, types.NewTuple(typ.Int, types.TypeFlags)) + v1.AuxInt = int64ToAuxInt(1) + v1.AddArg(cond) v0.AddArg(v1) b.resetWithControl(BlockPPC64NE, v0) return true @@ -16267,233 +16279,163 @@ func rewriteBlockPPC64(b *Block) bool { break } case BlockPPC64NE: - // match: (NE (CMPWconst [0] (Select0 (ANDCCconst [1] (Equal cc)))) yes no) + // match: (NE (Select1 (ANDCCconst [1] (Equal cc))) yes no) // result: (EQ cc yes no) - for b.Controls[0].Op == OpPPC64CMPWconst { + for b.Controls[0].Op == OpSelect1 { v_0 := b.Controls[0] - if auxIntToInt32(v_0.AuxInt) != 0 { - break - } v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSelect0 { + if v_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0_0.AuxInt) != 1 { break } v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0_0_0.AuxInt) != 1 { - break - } - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpPPC64Equal { + if v_0_0_0.Op != OpPPC64Equal { break } - cc := v_0_0_0_0.Args[0] + cc := v_0_0_0.Args[0] b.resetWithControl(BlockPPC64EQ, cc) return true } - // match: (NE (CMPWconst [0] (Select0 (ANDCCconst [1] (NotEqual cc)))) yes no) + // match: (NE (Select1 (ANDCCconst [1] (NotEqual cc))) yes no) // result: (NE cc yes no) - for b.Controls[0].Op == OpPPC64CMPWconst { + for b.Controls[0].Op == OpSelect1 { v_0 := b.Controls[0] - if auxIntToInt32(v_0.AuxInt) != 0 { - break - } v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSelect0 { + if v_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0_0.AuxInt) != 1 { break } v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0_0_0.AuxInt) != 1 { + if v_0_0_0.Op != OpPPC64NotEqual { break } - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpPPC64NotEqual { - break - } - cc := v_0_0_0_0.Args[0] + cc := v_0_0_0.Args[0] b.resetWithControl(BlockPPC64NE, cc) return true } - // match: (NE (CMPWconst [0] (Select0 (ANDCCconst [1] (LessThan cc)))) yes no) + // match: (NE (Select1 (ANDCCconst [1] (LessThan cc))) yes no) // result: (LT cc yes no) - for b.Controls[0].Op == OpPPC64CMPWconst { + for b.Controls[0].Op == OpSelect1 { v_0 := b.Controls[0] - if auxIntToInt32(v_0.AuxInt) != 0 { - break - } v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSelect0 { + if v_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0_0.AuxInt) != 1 { break } v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0_0_0.AuxInt) != 1 { - break - } - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpPPC64LessThan { + if v_0_0_0.Op != OpPPC64LessThan { break } - cc := v_0_0_0_0.Args[0] + cc := v_0_0_0.Args[0] b.resetWithControl(BlockPPC64LT, cc) return true } - // match: (NE (CMPWconst [0] (Select0 (ANDCCconst [1] (LessEqual cc)))) yes no) + // match: (NE (Select1 (ANDCCconst [1] (LessEqual cc))) yes no) // result: (LE cc yes no) - for b.Controls[0].Op == OpPPC64CMPWconst { + for b.Controls[0].Op == OpSelect1 { v_0 := b.Controls[0] - if auxIntToInt32(v_0.AuxInt) != 0 { - break - } v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSelect0 { + if v_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0_0.AuxInt) != 1 { break } v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0_0_0.AuxInt) != 1 { - break - } - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpPPC64LessEqual { + if v_0_0_0.Op != OpPPC64LessEqual { break } - cc := v_0_0_0_0.Args[0] + cc := v_0_0_0.Args[0] b.resetWithControl(BlockPPC64LE, cc) return true } - // match: (NE (CMPWconst [0] (Select0 (ANDCCconst [1] (GreaterThan cc)))) yes no) + // match: (NE (Select1 (ANDCCconst [1] (GreaterThan cc))) yes no) // result: (GT cc yes no) - for b.Controls[0].Op == OpPPC64CMPWconst { + for b.Controls[0].Op == OpSelect1 { v_0 := b.Controls[0] - if auxIntToInt32(v_0.AuxInt) != 0 { - break - } v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSelect0 { + if v_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0_0.AuxInt) != 1 { break } v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0_0_0.AuxInt) != 1 { + if v_0_0_0.Op != OpPPC64GreaterThan { break } - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpPPC64GreaterThan { - break - } - cc := v_0_0_0_0.Args[0] + cc := v_0_0_0.Args[0] b.resetWithControl(BlockPPC64GT, cc) return true } - // match: (NE (CMPWconst [0] (Select0 (ANDCCconst [1] (GreaterEqual cc)))) yes no) + // match: (NE (Select1 (ANDCCconst [1] (GreaterEqual cc))) yes no) // result: (GE cc yes no) - for b.Controls[0].Op == OpPPC64CMPWconst { + for b.Controls[0].Op == OpSelect1 { v_0 := b.Controls[0] - if auxIntToInt32(v_0.AuxInt) != 0 { - break - } v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSelect0 { + if v_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0_0.AuxInt) != 1 { break } v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0_0_0.AuxInt) != 1 { + if v_0_0_0.Op != OpPPC64GreaterEqual { break } - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpPPC64GreaterEqual { - break - } - cc := v_0_0_0_0.Args[0] + cc := v_0_0_0.Args[0] b.resetWithControl(BlockPPC64GE, cc) return true } - // match: (NE (CMPWconst [0] (Select0 (ANDCCconst [1] (FLessThan cc)))) yes no) + // match: (NE (Select1 (ANDCCconst [1] (FLessThan cc))) yes no) // result: (FLT cc yes no) - for b.Controls[0].Op == OpPPC64CMPWconst { + for b.Controls[0].Op == OpSelect1 { v_0 := b.Controls[0] - if auxIntToInt32(v_0.AuxInt) != 0 { - break - } v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSelect0 { + if v_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0_0.AuxInt) != 1 { break } v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0_0_0.AuxInt) != 1 { - break - } - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpPPC64FLessThan { + if v_0_0_0.Op != OpPPC64FLessThan { break } - cc := v_0_0_0_0.Args[0] + cc := v_0_0_0.Args[0] b.resetWithControl(BlockPPC64FLT, cc) return true } - // match: (NE (CMPWconst [0] (Select0 (ANDCCconst [1] (FLessEqual cc)))) yes no) + // match: (NE (Select1 (ANDCCconst [1] (FLessEqual cc))) yes no) // result: (FLE cc yes no) - for b.Controls[0].Op == OpPPC64CMPWconst { + for b.Controls[0].Op == OpSelect1 { v_0 := b.Controls[0] - if auxIntToInt32(v_0.AuxInt) != 0 { - break - } v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSelect0 { + if v_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0_0.AuxInt) != 1 { break } v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0_0_0.AuxInt) != 1 { - break - } - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpPPC64FLessEqual { + if v_0_0_0.Op != OpPPC64FLessEqual { break } - cc := v_0_0_0_0.Args[0] + cc := v_0_0_0.Args[0] b.resetWithControl(BlockPPC64FLE, cc) return true } - // match: (NE (CMPWconst [0] (Select0 (ANDCCconst [1] (FGreaterThan cc)))) yes no) + // match: (NE (Select1 (ANDCCconst [1] (FGreaterThan cc))) yes no) // result: (FGT cc yes no) - for b.Controls[0].Op == OpPPC64CMPWconst { + for b.Controls[0].Op == OpSelect1 { v_0 := b.Controls[0] - if auxIntToInt32(v_0.AuxInt) != 0 { - break - } v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSelect0 { + if v_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0_0.AuxInt) != 1 { break } v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0_0_0.AuxInt) != 1 { + if v_0_0_0.Op != OpPPC64FGreaterThan { break } - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpPPC64FGreaterThan { - break - } - cc := v_0_0_0_0.Args[0] + cc := v_0_0_0.Args[0] b.resetWithControl(BlockPPC64FGT, cc) return true } - // match: (NE (CMPWconst [0] (Select0 (ANDCCconst [1] (FGreaterEqual cc)))) yes no) + // match: (NE (Select1 (ANDCCconst [1] (FGreaterEqual cc))) yes no) // result: (FGE cc yes no) - for b.Controls[0].Op == OpPPC64CMPWconst { + for b.Controls[0].Op == OpSelect1 { v_0 := b.Controls[0] - if auxIntToInt32(v_0.AuxInt) != 0 { - break - } v_0_0 := v_0.Args[0] - if v_0_0.Op != OpSelect0 { + if v_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0_0.AuxInt) != 1 { break } v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpPPC64ANDCCconst || auxIntToInt64(v_0_0_0.AuxInt) != 1 { - break - } - v_0_0_0_0 := v_0_0_0.Args[0] - if v_0_0_0_0.Op != OpPPC64FGreaterEqual { + if v_0_0_0.Op != OpPPC64FGreaterEqual { break } - cc := v_0_0_0_0.Args[0] + cc := v_0_0_0.Args[0] b.resetWithControl(BlockPPC64FGE, cc) return true } |