@@ -1864,120 +1864,37 @@ def : Pat<(fshl GR64:$src1, GR64:$src2, (shiftMask64 CL)),
1864
1864
def : Pat<(fshr GR64:$src2, GR64:$src1, (shiftMask64 CL)),
1865
1865
(SHRD64rrCL GR64:$src1, GR64:$src2)>;
1866
1866
1867
- let Predicates = [HasBMI2, NoEGPR] in {
1867
+ multiclass bmi_shift_mask_patterns<SDNode op, string name, string Suffix = ""> {
1868
1868
let AddedComplexity = 1 in {
1869
- def : Pat<(sra GR32:$src1, (shiftMask32 GR8:$src2)),
1870
- (SARX32rr GR32:$src1,
1871
- (INSERT_SUBREG
1872
- (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1873
- def : Pat<(sra GR64:$src1, (shiftMask64 GR8:$src2)),
1874
- (SARX64rr GR64:$src1,
1875
- (INSERT_SUBREG
1876
- (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1877
-
1878
- def : Pat<(srl GR32:$src1, (shiftMask32 GR8:$src2)),
1879
- (SHRX32rr GR32:$src1,
1880
- (INSERT_SUBREG
1881
- (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1882
- def : Pat<(srl GR64:$src1, (shiftMask64 GR8:$src2)),
1883
- (SHRX64rr GR64:$src1,
1884
- (INSERT_SUBREG
1885
- (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1886
-
1887
- def : Pat<(shl GR32:$src1, (shiftMask32 GR8:$src2)),
1888
- (SHLX32rr GR32:$src1,
1869
+ def : Pat<(op GR32:$src1, (shiftMask32 GR8:$src2)),
1870
+ (!cast<Instruction>(name#"32rr"#Suffix) GR32:$src1,
1889
1871
(INSERT_SUBREG
1890
1872
(i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1891
- def : Pat<(shl GR64:$src1, (shiftMask64 GR8:$src2)),
1892
- (SHLX64rr GR64:$src1,
1873
+ def : Pat<(op GR64:$src1, (shiftMask64 GR8:$src2)),
1874
+ (!cast<Instruction>(name#"64rr"#Suffix) GR64:$src1,
1893
1875
(INSERT_SUBREG
1894
1876
(i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1895
1877
}
1896
-
1897
- def : Pat<(sra (loadi32 addr:$src1), (shiftMask32 GR8:$src2)),
1898
- (SARX32rm addr:$src1,
1878
+ def : Pat<(op (loadi32 addr:$src1), (shiftMask32 GR8:$src2)),
1879
+ (!cast<Instruction>(name#"32rm"#Suffix) addr:$src1,
1899
1880
(INSERT_SUBREG
1900
1881
(i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1901
- def : Pat<(sra (loadi64 addr:$src1), (shiftMask64 GR8:$src2)),
1902
- (SARX64rm addr:$src1,
1903
- (INSERT_SUBREG
1904
- (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1905
-
1906
- def : Pat<(srl (loadi32 addr:$src1), (shiftMask32 GR8:$src2)),
1907
- (SHRX32rm addr:$src1,
1908
- (INSERT_SUBREG
1909
- (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1910
- def : Pat<(srl (loadi64 addr:$src1), (shiftMask64 GR8:$src2)),
1911
- (SHRX64rm addr:$src1,
1882
+ def : Pat<(op (loadi64 addr:$src1), (shiftMask64 GR8:$src2)),
1883
+ (!cast<Instruction>(name#"64rm"#Suffix) addr:$src1,
1912
1884
(INSERT_SUBREG
1913
1885
(i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1886
+ }
1914
1887
1915
- def : Pat<(shl (loadi32 addr:$src1), (shiftMask32 GR8:$src2)),
1916
- (SHLX32rm addr:$src1,
1917
- (INSERT_SUBREG
1918
- (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1919
- def : Pat<(shl (loadi64 addr:$src1), (shiftMask64 GR8:$src2)),
1920
- (SHLX64rm addr:$src1,
1921
- (INSERT_SUBREG
1922
- (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1888
+ let Predicates = [HasBMI2, NoEGPR] in {
1889
+ defm : bmi_shift_mask_patterns<sra, "SARX">;
1890
+ defm : bmi_shift_mask_patterns<srl, "SHRX">;
1891
+ defm : bmi_shift_mask_patterns<shl, "SHLX">;
1923
1892
}
1924
1893
1925
1894
let Predicates = [HasBMI2, HasEGPR] in {
1926
- let AddedComplexity = 1 in {
1927
- def : Pat<(sra GR32:$src1, (shiftMask32 GR8:$src2)),
1928
- (SARX32rr_EVEX GR32:$src1,
1929
- (INSERT_SUBREG
1930
- (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1931
- def : Pat<(sra GR64:$src1, (shiftMask64 GR8:$src2)),
1932
- (SARX64rr_EVEX GR64:$src1,
1933
- (INSERT_SUBREG
1934
- (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1935
-
1936
- def : Pat<(srl GR32:$src1, (shiftMask32 GR8:$src2)),
1937
- (SHRX32rr_EVEX GR32:$src1,
1938
- (INSERT_SUBREG
1939
- (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1940
- def : Pat<(srl GR64:$src1, (shiftMask64 GR8:$src2)),
1941
- (SHRX64rr_EVEX GR64:$src1,
1942
- (INSERT_SUBREG
1943
- (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1944
-
1945
- def : Pat<(shl GR32:$src1, (shiftMask32 GR8:$src2)),
1946
- (SHLX32rr_EVEX GR32:$src1,
1947
- (INSERT_SUBREG
1948
- (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1949
- def : Pat<(shl GR64:$src1, (shiftMask64 GR8:$src2)),
1950
- (SHLX64rr_EVEX GR64:$src1,
1951
- (INSERT_SUBREG
1952
- (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1953
- }
1954
-
1955
- def : Pat<(sra (loadi32 addr:$src1), (shiftMask32 GR8:$src2)),
1956
- (SARX32rm_EVEX addr:$src1,
1957
- (INSERT_SUBREG
1958
- (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1959
- def : Pat<(sra (loadi64 addr:$src1), (shiftMask64 GR8:$src2)),
1960
- (SARX64rm_EVEX addr:$src1,
1961
- (INSERT_SUBREG
1962
- (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1963
-
1964
- def : Pat<(srl (loadi32 addr:$src1), (shiftMask32 GR8:$src2)),
1965
- (SHRX32rm_EVEX addr:$src1,
1966
- (INSERT_SUBREG
1967
- (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1968
- def : Pat<(srl (loadi64 addr:$src1), (shiftMask64 GR8:$src2)),
1969
- (SHRX64rm_EVEX addr:$src1,
1970
- (INSERT_SUBREG
1971
- (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1972
-
1973
- def : Pat<(shl (loadi32 addr:$src1), (shiftMask32 GR8:$src2)),
1974
- (SHLX32rm_EVEX addr:$src1,
1975
- (INSERT_SUBREG
1976
- (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1977
- def : Pat<(shl (loadi64 addr:$src1), (shiftMask64 GR8:$src2)),
1978
- (SHLX64rm_EVEX addr:$src1,
1979
- (INSERT_SUBREG
1980
- (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
1895
+ defm : bmi_shift_mask_patterns<sra, "SARX", "_EVEX">;
1896
+ defm : bmi_shift_mask_patterns<srl, "SHRX", "_EVEX">;
1897
+ defm : bmi_shift_mask_patterns<shl, "SHLX", "_EVEX">;
1981
1898
}
1982
1899
1983
1900
// Use BTR/BTS/BTC for clearing/setting/toggling a bit in a variable location.
0 commit comments