@@ -1912,56 +1912,65 @@ define i32 @v_bfi_seq_i32(i32 %x, i32 %y, i32 %z) {
19121912; GFX7-LABEL: v_bfi_seq_i32:
19131913; GFX7: ; %bb.0:
19141914; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1915+ ; GFX7-NEXT: v_lshlrev_b32_e32 v0, 20, v0
19151916; GFX7-NEXT: s_mov_b32 s4, 0xffc00
1916- ; GFX7-NEXT: v_bfi_b32 v0, s4 , v0, v1
1917- ; GFX7-NEXT: v_xor_b32_e32 v1 , v1, v2
1918- ; GFX7-NEXT: v_and_b32_e32 v1 , 0x3ff00000, v1
1919- ; GFX7-NEXT: v_xor_b32_e32 v0, v1, v0
1917+ ; GFX7-NEXT: v_xor_b32_e32 v0, v0, v1
1918+ ; GFX7-NEXT: v_bfi_b32 v2, s4 , v1, v2
1919+ ; GFX7-NEXT: v_and_b32_e32 v0 , 0x3ff00000, v0
1920+ ; GFX7-NEXT: v_xor_b32_e32 v0, v0, v2
19201921; GFX7-NEXT: s_setpc_b64 s[30:31]
19211922;
19221923; GFX8-LABEL: v_bfi_seq_i32:
19231924; GFX8: ; %bb.0:
19241925; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1926+ ; GFX8-NEXT: v_lshlrev_b32_e32 v0, 20, v0
19251927; GFX8-NEXT: s_mov_b32 s4, 0xffc00
1926- ; GFX8-NEXT: v_bfi_b32 v0, s4 , v0, v1
1927- ; GFX8-NEXT: v_xor_b32_e32 v1 , v1, v2
1928- ; GFX8-NEXT: v_and_b32_e32 v1 , 0x3ff00000, v1
1929- ; GFX8-NEXT: v_xor_b32_e32 v0, v1, v0
1928+ ; GFX8-NEXT: v_xor_b32_e32 v0, v0, v1
1929+ ; GFX8-NEXT: v_bfi_b32 v2, s4 , v1, v2
1930+ ; GFX8-NEXT: v_and_b32_e32 v0 , 0x3ff00000, v0
1931+ ; GFX8-NEXT: v_xor_b32_e32 v0, v0, v2
19301932; GFX8-NEXT: s_setpc_b64 s[30:31]
19311933;
19321934; GFX10-LABEL: v_bfi_seq_i32:
19331935; GFX10: ; %bb.0:
19341936; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
19351937; GFX10-NEXT: s_waitcnt_vscnt null, 0x0
1936- ; GFX10-NEXT: v_xor_b32_e32 v2, v1, v2
1937- ; GFX10-NEXT: v_bfi_b32 v0, 0xffc00, v0, v1
1938- ; GFX10-NEXT: v_and_b32_e32 v1, 0x3ff00000, v2
1939- ; GFX10-NEXT: v_xor_b32_e32 v0, v1, v0
1938+ ; GFX10-NEXT: v_lshlrev_b32_e32 v0, 20, v0
1939+ ; GFX10-NEXT: v_xor_b32_e32 v0, v0, v1
1940+ ; GFX10-NEXT: v_bfi_b32 v1, 0xffc00, v1, v2
1941+ ; GFX10-NEXT: v_and_b32_e32 v0, 0x3ff00000, v0
1942+ ; GFX10-NEXT: v_xor_b32_e32 v0, v0, v1
19401943; GFX10-NEXT: s_setpc_b64 s[30:31]
19411944;
19421945; GFX8-GISEL-LABEL: v_bfi_seq_i32:
19431946; GFX8-GISEL: ; %bb.0:
19441947; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1945- ; GFX8-GISEL-NEXT: v_and_b32_e32 v0, 0xffc00, v0
1946- ; GFX8-GISEL-NEXT: v_and_b32_e32 v1, 0xfff003ff, v1
1947- ; GFX8-GISEL-NEXT: v_or_b32_e32 v0, v0, v1
1948- ; GFX8-GISEL-NEXT: v_mov_b32_e32 v1, 0x3ff00000
1949- ; GFX8-GISEL-NEXT: v_bfi_b32 v0, v1, v2, v0
1948+ ; GFX8-GISEL-NEXT: v_lshlrev_b32_e32 v0, 20, v0
1949+ ; GFX8-GISEL-NEXT: v_and_b32_e32 v3, 0xffc00, v1
1950+ ; GFX8-GISEL-NEXT: v_and_b32_e32 v2, 0xfff003ff, v2
1951+ ; GFX8-GISEL-NEXT: v_xor_b32_e32 v0, v0, v1
1952+ ; GFX8-GISEL-NEXT: v_or_b32_e32 v2, v3, v2
1953+ ; GFX8-GISEL-NEXT: v_and_b32_e32 v0, 0x3ff00000, v0
1954+ ; GFX8-GISEL-NEXT: v_xor_b32_e32 v0, v0, v2
19501955; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31]
19511956;
19521957; GFX10-GISEL-LABEL: v_bfi_seq_i32:
19531958; GFX10-GISEL: ; %bb.0:
19541959; GFX10-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
19551960; GFX10-GISEL-NEXT: s_waitcnt_vscnt null, 0x0
1956- ; GFX10-GISEL-NEXT: v_and_b32_e32 v1, 0xfff003ff, v1
1957- ; GFX10-GISEL-NEXT: v_and_or_b32 v0, 0xffc00, v0, v1
1958- ; GFX10-GISEL-NEXT: v_bfi_b32 v0, 0x3ff00000, v2, v0
1961+ ; GFX10-GISEL-NEXT: v_lshlrev_b32_e32 v0, 20, v0
1962+ ; GFX10-GISEL-NEXT: v_and_b32_e32 v2, 0xfff003ff, v2
1963+ ; GFX10-GISEL-NEXT: v_xor_b32_e32 v0, v0, v1
1964+ ; GFX10-GISEL-NEXT: v_and_or_b32 v1, 0xffc00, v1, v2
1965+ ; GFX10-GISEL-NEXT: v_and_b32_e32 v0, 0x3ff00000, v0
1966+ ; GFX10-GISEL-NEXT: v_xor_b32_e32 v0, v0, v1
19591967; GFX10-GISEL-NEXT: s_setpc_b64 s[30:31]
1960- %1 = and i32 %x , 1047552
1961- %2 = and i32 %y , -1047553
1962- %3 = or i32 %1 , %2
1963- %4 = xor i32 %3 , %z
1964- %5 = and i32 %4 , 1072693248
1965- %6 = xor i32 %5 , %3
1966- ret i32 %6
1968+ %1 = shl i32 %x , 20
1969+ %2 = and i32 %y , 1047552
1970+ %3 = and i32 %z , -1047553
1971+ %4 = or i32 %2 , %3
1972+ %5 = xor i32 %1 , %y
1973+ %6 = and i32 %5 , 1072693248
1974+ %7 = xor i32 %6 , %4
1975+ ret i32 %7
19671976}
0 commit comments