@@ -1871,40 +1871,92 @@ def : GCNPat <
1871
1871
// Conversion Patterns
1872
1872
//===----------------------------------------------------------------------===//
1873
1873
1874
- def : GCNPat<(i32 (sext_inreg i32:$src, i1)),
1874
+ class UniformSextInreg<ValueType VT> : PatFrag<
1875
+ (ops node:$src),
1876
+ (sext_inreg $src, VT),
1877
+ [{ return !N->isDivergent(); }]>;
1878
+
1879
+ def : GCNPat<(i32 (UniformSextInreg<i1> i32:$src)),
1875
1880
(S_BFE_I32 i32:$src, (i32 65536))>; // 0 | 1 << 16
1876
1881
1877
1882
// Handle sext_inreg in i64
1878
1883
def : GCNPat <
1879
- (i64 (sext_inreg i64:$src, i1 )),
1884
+ (i64 (UniformSextInreg<i1> i64:$src)),
1880
1885
(S_BFE_I64 i64:$src, (i32 0x10000)) // 0 | 1 << 16
1881
1886
>;
1882
1887
1883
1888
def : GCNPat <
1884
- (i16 (sext_inreg i16:$src, i1 )),
1889
+ (i16 (UniformSextInreg<i1> i16:$src)),
1885
1890
(S_BFE_I32 $src, (i32 0x00010000)) // 0 | 1 << 16
1886
1891
>;
1887
1892
1888
1893
def : GCNPat <
1889
- (i16 (sext_inreg i16:$src, i8 )),
1894
+ (i16 (UniformSextInreg<i8> i16:$src)),
1890
1895
(S_BFE_I32 $src, (i32 0x80000)) // 0 | 8 << 16
1891
1896
>;
1892
1897
1893
1898
def : GCNPat <
1894
- (i64 (sext_inreg i64:$src, i8 )),
1899
+ (i64 (UniformSextInreg<i8> i64:$src)),
1895
1900
(S_BFE_I64 i64:$src, (i32 0x80000)) // 0 | 8 << 16
1896
1901
>;
1897
1902
1898
1903
def : GCNPat <
1899
- (i64 (sext_inreg i64:$src, i16 )),
1904
+ (i64 (UniformSextInreg<i16> i64:$src)),
1900
1905
(S_BFE_I64 i64:$src, (i32 0x100000)) // 0 | 16 << 16
1901
1906
>;
1902
1907
1903
1908
def : GCNPat <
1904
- (i64 (sext_inreg i64:$src, i32 )),
1909
+ (i64 (UniformSextInreg<i32> i64:$src)),
1905
1910
(S_BFE_I64 i64:$src, (i32 0x200000)) // 0 | 32 << 16
1906
1911
>;
1907
1912
1913
+
1914
+ class DivergentSextInreg<ValueType VT> : PatFrag<
1915
+ (ops node:$src),
1916
+ (sext_inreg $src, VT),
1917
+ [{ return N->isDivergent(); }]>;
1918
+
1919
+ def : GCNPat<(i32 (DivergentSextInreg<i1> i32:$src)),
1920
+ (V_BFE_I32_e64 i32:$src, (i32 0), (i32 1))>;
1921
+
1922
+ def : GCNPat <
1923
+ (i16 (DivergentSextInreg<i1> i16:$src)),
1924
+ (V_BFE_I32_e64 $src, (i32 0), (i32 1)) // 0 | 1 << 16
1925
+ >;
1926
+
1927
+ def : GCNPat <
1928
+ (i16 (DivergentSextInreg<i8> i16:$src)),
1929
+ (V_BFE_I32_e64 $src, (i32 0), (i32 8)) // 0 | 8 << 16
1930
+ >;
1931
+
1932
+ def : GCNPat <
1933
+ (i64 (DivergentSextInreg<i1> i64:$src)),
1934
+ (REG_SEQUENCE VReg_64,
1935
+ (V_BFE_I32_e64 (i32 (EXTRACT_SUBREG i64:$src, sub0)), (i32 0), (i32 1)), sub0,
1936
+ (V_ASHRREV_I32_e32 (i32 31), (V_BFE_I32_e64 (i32 (EXTRACT_SUBREG i64:$src, sub0)), (i32 0), (i32 1))), sub1)
1937
+ >;
1938
+
1939
+ def : GCNPat <
1940
+ (i64 (DivergentSextInreg<i8> i64:$src)),
1941
+ (REG_SEQUENCE VReg_64,
1942
+ (V_BFE_I32_e64 (i32 (EXTRACT_SUBREG i64:$src, sub0)), (i32 0), (i32 8)/* 0 | 8 << 16 */), sub0,
1943
+ (V_ASHRREV_I32_e32 (i32 31), (V_BFE_I32_e64 (i32 (EXTRACT_SUBREG i64:$src, sub0)), (i32 0), (i32 8))), sub1)
1944
+ >;
1945
+
1946
+ def : GCNPat <
1947
+ (i64 (DivergentSextInreg<i16> i64:$src)),
1948
+ (REG_SEQUENCE VReg_64,
1949
+ (V_BFE_I32_e64 (i32 (EXTRACT_SUBREG i64:$src, sub0)), (i32 0), (i32 16)/* 0 | 16 << 16 */), sub0,
1950
+ (V_ASHRREV_I32_e32 (i32 31), (V_BFE_I32_e64 (i32 (EXTRACT_SUBREG i64:$src, sub0)), (i32 0), (i32 16))), sub1)
1951
+ >;
1952
+
1953
+ def : GCNPat <
1954
+ (i64 (DivergentSextInreg<i32> i64:$src)),
1955
+ (REG_SEQUENCE VReg_64,
1956
+ (i32 (EXTRACT_SUBREG i64:$src, sub0)), sub0,
1957
+ (V_ASHRREV_I32_e32 (i32 31), (i32 (EXTRACT_SUBREG i64:$src, sub0))), sub1)
1958
+ >;
1959
+
1908
1960
def : GCNPat <
1909
1961
(i64 (zext i32:$src)),
1910
1962
(REG_SEQUENCE SReg_64, $src, sub0, (S_MOV_B32 (i32 0)), sub1)
0 commit comments