@@ -1787,63 +1787,62 @@ let Predicates = [HasNDD] in {
1787
1787
}
1788
1788
1789
1789
// Shift amount is implicitly masked.
1790
- multiclass MaskedShiftAmountPats<SDNode frag, string name > {
1790
+ multiclass MaskedShiftAmountPats<SDNode frag> {
1791
1791
// (shift x (and y, 31)) ==> (shift x, y)
1792
1792
def : Pat<(frag GR8:$src1, (shiftMask32 CL)),
1793
- (!cast<Instruction>(name # "8rCL") GR8:$src1)>;
1793
+ (!cast<Instruction>(NAME # "8rCL") GR8:$src1)>;
1794
1794
def : Pat<(frag GR16:$src1, (shiftMask32 CL)),
1795
- (!cast<Instruction>(name # "16rCL") GR16:$src1)>;
1795
+ (!cast<Instruction>(NAME # "16rCL") GR16:$src1)>;
1796
1796
def : Pat<(frag GR32:$src1, (shiftMask32 CL)),
1797
- (!cast<Instruction>(name # "32rCL") GR32:$src1)>;
1797
+ (!cast<Instruction>(NAME # "32rCL") GR32:$src1)>;
1798
1798
def : Pat<(store (frag (loadi8 addr:$dst), (shiftMask32 CL)), addr:$dst),
1799
- (!cast<Instruction>(name # "8mCL") addr:$dst)>;
1799
+ (!cast<Instruction>(NAME # "8mCL") addr:$dst)>;
1800
1800
def : Pat<(store (frag (loadi16 addr:$dst), (shiftMask32 CL)), addr:$dst),
1801
- (!cast<Instruction>(name # "16mCL") addr:$dst)>;
1801
+ (!cast<Instruction>(NAME # "16mCL") addr:$dst)>;
1802
1802
def : Pat<(store (frag (loadi32 addr:$dst), (shiftMask32 CL)), addr:$dst),
1803
- (!cast<Instruction>(name # "32mCL") addr:$dst)>;
1803
+ (!cast<Instruction>(NAME # "32mCL") addr:$dst)>;
1804
1804
1805
1805
// (shift x (and y, 63)) ==> (shift x, y)
1806
1806
def : Pat<(frag GR64:$src1, (shiftMask64 CL)),
1807
- (!cast<Instruction>(name # "64rCL") GR64:$src1)>;
1807
+ (!cast<Instruction>(NAME # "64rCL") GR64:$src1)>;
1808
1808
def : Pat<(store (frag (loadi64 addr:$dst), (shiftMask64 CL)), addr:$dst),
1809
- (!cast<Instruction>(name # "64mCL") addr:$dst)>;
1809
+ (!cast<Instruction>(NAME # "64mCL") addr:$dst)>;
1810
1810
}
1811
1811
1812
- defm : MaskedShiftAmountPats<shl, "SHL" >;
1813
- defm : MaskedShiftAmountPats<srl, "SHR" >;
1814
- defm : MaskedShiftAmountPats<sra, "SAR" >;
1812
+ defm SHL : MaskedShiftAmountPats<shl>;
1813
+ defm SHR : MaskedShiftAmountPats<srl>;
1814
+ defm SAR : MaskedShiftAmountPats<sra>;
1815
1815
1816
1816
// ROL/ROR instructions allow a stronger mask optimization than shift for 8- and
1817
1817
// 16-bit. We can remove a mask of any (bitwidth - 1) on the rotation amount
1818
1818
// because over-rotating produces the same result. This is noted in the Intel
1819
1819
// docs with: "tempCOUNT <- (COUNT & COUNTMASK) MOD SIZE". Masking the rotation
1820
1820
// amount could affect EFLAGS results, but that does not matter because we are
1821
1821
// not tracking flags for these nodes.
1822
- multiclass MaskedRotateAmountPats<SDNode frag, string name > {
1822
+ multiclass MaskedRotateAmountPats<SDNode frag> {
1823
1823
// (rot x (and y, BitWidth - 1)) ==> (rot x, y)
1824
1824
def : Pat<(frag GR8:$src1, (shiftMask8 CL)),
1825
- (!cast<Instruction>(name # "8rCL") GR8:$src1)>;
1825
+ (!cast<Instruction>(NAME # "8rCL") GR8:$src1)>;
1826
1826
def : Pat<(frag GR16:$src1, (shiftMask16 CL)),
1827
- (!cast<Instruction>(name # "16rCL") GR16:$src1)>;
1827
+ (!cast<Instruction>(NAME # "16rCL") GR16:$src1)>;
1828
1828
def : Pat<(frag GR32:$src1, (shiftMask32 CL)),
1829
- (!cast<Instruction>(name # "32rCL") GR32:$src1)>;
1829
+ (!cast<Instruction>(NAME # "32rCL") GR32:$src1)>;
1830
1830
def : Pat<(store (frag (loadi8 addr:$dst), (shiftMask8 CL)), addr:$dst),
1831
- (!cast<Instruction>(name # "8mCL") addr:$dst)>;
1831
+ (!cast<Instruction>(NAME # "8mCL") addr:$dst)>;
1832
1832
def : Pat<(store (frag (loadi16 addr:$dst), (shiftMask16 CL)), addr:$dst),
1833
- (!cast<Instruction>(name # "16mCL") addr:$dst)>;
1833
+ (!cast<Instruction>(NAME # "16mCL") addr:$dst)>;
1834
1834
def : Pat<(store (frag (loadi32 addr:$dst), (shiftMask32 CL)), addr:$dst),
1835
- (!cast<Instruction>(name # "32mCL") addr:$dst)>;
1835
+ (!cast<Instruction>(NAME # "32mCL") addr:$dst)>;
1836
1836
1837
1837
// (rot x (and y, 63)) ==> (rot x, y)
1838
1838
def : Pat<(frag GR64:$src1, (shiftMask64 CL)),
1839
- (!cast<Instruction>(name # "64rCL") GR64:$src1)>;
1839
+ (!cast<Instruction>(NAME # "64rCL") GR64:$src1)>;
1840
1840
def : Pat<(store (frag (loadi64 addr:$dst), (shiftMask64 CL)), addr:$dst),
1841
- (!cast<Instruction>(name # "64mCL") addr:$dst)>;
1841
+ (!cast<Instruction>(NAME # "64mCL") addr:$dst)>;
1842
1842
}
1843
1843
1844
-
1845
- defm : MaskedRotateAmountPats<rotl, "ROL">;
1846
- defm : MaskedRotateAmountPats<rotr, "ROR">;
1844
+ defm ROL : MaskedRotateAmountPats<rotl>;
1845
+ defm ROR : MaskedRotateAmountPats<rotr>;
1847
1846
1848
1847
// Double "funnel" shift amount is implicitly masked.
1849
1848
// (fshl/fshr x (and y, 31)) ==> (fshl/fshr x, y) (NOTE: modulo32)
@@ -1865,34 +1864,33 @@ def : Pat<(fshr GR64:$src2, GR64:$src1, (shiftMask64 CL)),
1865
1864
(SHRD64rrCL GR64:$src1, GR64:$src2)>;
1866
1865
1867
1866
// Use BTR/BTS/BTC for clearing/setting/toggling a bit in a variable location.
1868
- multiclass one_bit_patterns<RegisterClass RC, ValueType VT, Instruction BTR,
1869
- Instruction BTS, Instruction BTC,
1870
- PatFrag ShiftMask> {
1871
- def : Pat<(and RC:$src1, (rotl -2, GR8:$src2)),
1872
- (BTR RC:$src1,
1873
- (INSERT_SUBREG (VT (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1874
- def : Pat<(or RC:$src1, (shl 1, GR8:$src2)),
1875
- (BTS RC:$src1,
1876
- (INSERT_SUBREG (VT (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1877
- def : Pat<(xor RC:$src1, (shl 1, GR8:$src2)),
1878
- (BTC RC:$src1,
1879
- (INSERT_SUBREG (VT (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1867
+ multiclass OneBitPats<RegisterClass rc, ValueType vt, Instruction btr,
1868
+ Instruction bts, Instruction btc, PatFrag mask> {
1869
+ def : Pat<(and rc:$src1, (rotl -2, GR8:$src2)),
1870
+ (btr rc:$src1,
1871
+ (INSERT_SUBREG (vt (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1872
+ def : Pat<(or rc:$src1, (shl 1, GR8:$src2)),
1873
+ (bts rc:$src1,
1874
+ (INSERT_SUBREG (vt (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1875
+ def : Pat<(xor rc:$src1, (shl 1, GR8:$src2)),
1876
+ (btc rc:$src1,
1877
+ (INSERT_SUBREG (vt (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1880
1878
1881
1879
// Similar to above, but removing unneeded masking of the shift amount.
1882
- def : Pat<(and RC :$src1, (rotl -2, (ShiftMask GR8:$src2))),
1883
- (BTR RC :$src1,
1884
- (INSERT_SUBREG (VT (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1885
- def : Pat<(or RC :$src1, (shl 1, (ShiftMask GR8:$src2))),
1886
- (BTS RC :$src1,
1887
- (INSERT_SUBREG (VT (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1888
- def : Pat<(xor RC :$src1, (shl 1, (ShiftMask GR8:$src2))),
1889
- (BTC RC :$src1,
1890
- (INSERT_SUBREG (VT (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1880
+ def : Pat<(and rc :$src1, (rotl -2, (mask GR8:$src2))),
1881
+ (btr rc :$src1,
1882
+ (INSERT_SUBREG (vt (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1883
+ def : Pat<(or rc :$src1, (shl 1, (mask GR8:$src2))),
1884
+ (bts rc :$src1,
1885
+ (INSERT_SUBREG (vt (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1886
+ def : Pat<(xor rc :$src1, (shl 1, (mask GR8:$src2))),
1887
+ (btc rc :$src1,
1888
+ (INSERT_SUBREG (vt (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1891
1889
}
1892
1890
1893
- defm : one_bit_patterns <GR16, i16, BTR16rr, BTS16rr, BTC16rr, shiftMask16>;
1894
- defm : one_bit_patterns <GR32, i32, BTR32rr, BTS32rr, BTC32rr, shiftMask32>;
1895
- defm : one_bit_patterns <GR64, i64, BTR64rr, BTS64rr, BTC64rr, shiftMask64>;
1891
+ defm : OneBitPats <GR16, i16, BTR16rr, BTS16rr, BTC16rr, shiftMask16>;
1892
+ defm : OneBitPats <GR32, i32, BTR32rr, BTS32rr, BTC32rr, shiftMask32>;
1893
+ defm : OneBitPats <GR64, i64, BTR64rr, BTS64rr, BTC64rr, shiftMask64>;
1896
1894
1897
1895
//===----------------------------------------------------------------------===//
1898
1896
// EFLAGS-defining Patterns
0 commit comments