1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GFX9 %s
3; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=fiji -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GFX8 %s
4; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=hawaii -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GFX7 %s
5
6define amdgpu_ps i8 @extractelement_sgpr_v4i8_sgpr_idx(<4 x i8> addrspace(4)* inreg %ptr, i32 inreg %idx) {
7; GCN-LABEL: extractelement_sgpr_v4i8_sgpr_idx:
8; GCN:       ; %bb.0:
9; GCN-NEXT:    s_load_dword s0, s[2:3], 0x0
10; GCN-NEXT:    s_movk_i32 s5, 0xff
11; GCN-NEXT:    s_waitcnt lgkmcnt(0)
12; GCN-NEXT:    s_lshr_b32 s1, s0, 8
13; GCN-NEXT:    s_and_b32 s1, s1, s5
14; GCN-NEXT:    s_lshr_b32 s2, s0, 16
15; GCN-NEXT:    s_lshr_b32 s3, s0, 24
16; GCN-NEXT:    s_and_b32 s0, s0, s5
17; GCN-NEXT:    s_lshl_b32 s1, s1, 8
18; GCN-NEXT:    s_or_b32 s0, s0, s1
19; GCN-NEXT:    s_and_b32 s1, s2, s5
20; GCN-NEXT:    s_lshl_b32 s1, s1, 16
21; GCN-NEXT:    s_or_b32 s0, s0, s1
22; GCN-NEXT:    s_and_b32 s1, s3, s5
23; GCN-NEXT:    s_lshl_b32 s1, s1, 24
24; GCN-NEXT:    s_or_b32 s0, s0, s1
25; GCN-NEXT:    s_and_b32 s1, s4, 3
26; GCN-NEXT:    s_lshl_b32 s1, s1, 3
27; GCN-NEXT:    s_lshr_b32 s0, s0, s1
28; GCN-NEXT:    ; return to shader part epilog
29  %vector = load <4 x i8>, <4 x i8> addrspace(4)* %ptr
30  %element = extractelement <4 x i8> %vector, i32 %idx
31  ret i8 %element
32}
33
34define amdgpu_ps i8 @extractelement_vgpr_v4i8_sgpr_idx(<4 x i8> addrspace(1)* %ptr, i32 inreg %idx) {
35; GFX9-LABEL: extractelement_vgpr_v4i8_sgpr_idx:
36; GFX9:       ; %bb.0:
37; GFX9-NEXT:    global_load_dword v0, v[0:1], off
38; GFX9-NEXT:    s_mov_b32 s0, 8
39; GFX9-NEXT:    s_movk_i32 s1, 0xff
40; GFX9-NEXT:    s_and_b32 s2, s2, 3
41; GFX9-NEXT:    s_waitcnt vmcnt(0)
42; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
43; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, s0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
44; GFX9-NEXT:    v_and_b32_sdwa v2, v0, s1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
45; GFX9-NEXT:    v_and_b32_sdwa v3, v0, s1 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
46; GFX9-NEXT:    v_and_or_b32 v0, v0, s1, v1
47; GFX9-NEXT:    v_or3_b32 v0, v0, v2, v3
48; GFX9-NEXT:    s_lshl_b32 s0, s2, 3
49; GFX9-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
50; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
51; GFX9-NEXT:    ; return to shader part epilog
52;
53; GFX8-LABEL: extractelement_vgpr_v4i8_sgpr_idx:
54; GFX8:       ; %bb.0:
55; GFX8-NEXT:    flat_load_dword v0, v[0:1]
56; GFX8-NEXT:    s_movk_i32 s0, 0xff
57; GFX8-NEXT:    v_mov_b32_e32 v1, 8
58; GFX8-NEXT:    v_mov_b32_e32 v2, s0
59; GFX8-NEXT:    s_and_b32 s0, s2, 3
60; GFX8-NEXT:    s_lshl_b32 s0, s0, 3
61; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
62; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v0
63; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
64; GFX8-NEXT:    v_and_b32_sdwa v4, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
65; GFX8-NEXT:    v_and_b32_sdwa v2, v0, v2 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
66; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
67; GFX8-NEXT:    v_or_b32_e32 v0, v0, v4
68; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
69; GFX8-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
70; GFX8-NEXT:    v_readfirstlane_b32 s0, v0
71; GFX8-NEXT:    ; return to shader part epilog
72;
73; GFX7-LABEL: extractelement_vgpr_v4i8_sgpr_idx:
74; GFX7:       ; %bb.0:
75; GFX7-NEXT:    s_mov_b32 s6, 0
76; GFX7-NEXT:    s_mov_b32 s7, 0xf000
77; GFX7-NEXT:    s_mov_b64 s[4:5], 0
78; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[4:7], 0 addr64
79; GFX7-NEXT:    s_movk_i32 s0, 0xff
80; GFX7-NEXT:    s_and_b32 s1, s2, 3
81; GFX7-NEXT:    s_waitcnt vmcnt(0)
82; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
83; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
84; GFX7-NEXT:    v_and_b32_e32 v1, s0, v1
85; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
86; GFX7-NEXT:    v_and_b32_e32 v2, s0, v2
87; GFX7-NEXT:    v_and_b32_e32 v0, s0, v0
88; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
89; GFX7-NEXT:    v_and_b32_e32 v3, s0, v3
90; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
91; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
92; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 24, v3
93; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
94; GFX7-NEXT:    v_or_b32_e32 v0, v0, v3
95; GFX7-NEXT:    s_lshl_b32 s0, s1, 3
96; GFX7-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
97; GFX7-NEXT:    v_readfirstlane_b32 s0, v0
98; GFX7-NEXT:    ; return to shader part epilog
99  %vector = load <4 x i8>, <4 x i8> addrspace(1)* %ptr
100  %element = extractelement <4 x i8> %vector, i32 %idx
101  ret i8 %element
102}
103
104define i8 @extractelement_vgpr_v4i8_vgpr_idx(<4 x i8> addrspace(1)* %ptr, i32 %idx) {
105; GFX9-LABEL: extractelement_vgpr_v4i8_vgpr_idx:
106; GFX9:       ; %bb.0:
107; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
108; GFX9-NEXT:    global_load_dword v0, v[0:1], off
109; GFX9-NEXT:    v_and_b32_e32 v1, 3, v2
110; GFX9-NEXT:    s_mov_b32 s4, 8
111; GFX9-NEXT:    s_movk_i32 s5, 0xff
112; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
113; GFX9-NEXT:    s_waitcnt vmcnt(0)
114; GFX9-NEXT:    v_lshrrev_b32_e32 v2, 8, v0
115; GFX9-NEXT:    v_lshlrev_b32_sdwa v2, s4, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
116; GFX9-NEXT:    v_and_b32_sdwa v3, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
117; GFX9-NEXT:    v_and_b32_sdwa v4, v0, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
118; GFX9-NEXT:    v_and_or_b32 v0, v0, s5, v2
119; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v4
120; GFX9-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
121; GFX9-NEXT:    s_setpc_b64 s[30:31]
122;
123; GFX8-LABEL: extractelement_vgpr_v4i8_vgpr_idx:
124; GFX8:       ; %bb.0:
125; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
126; GFX8-NEXT:    flat_load_dword v0, v[0:1]
127; GFX8-NEXT:    s_movk_i32 s4, 0xff
128; GFX8-NEXT:    v_mov_b32_e32 v1, 8
129; GFX8-NEXT:    v_mov_b32_e32 v3, s4
130; GFX8-NEXT:    v_and_b32_e32 v2, 3, v2
131; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
132; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 8, v0
133; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
134; GFX8-NEXT:    v_and_b32_sdwa v5, v0, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
135; GFX8-NEXT:    v_and_b32_sdwa v3, v0, v3 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
136; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
137; GFX8-NEXT:    v_or_b32_e32 v0, v0, v5
138; GFX8-NEXT:    v_or_b32_e32 v0, v0, v3
139; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 3, v2
140; GFX8-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
141; GFX8-NEXT:    s_setpc_b64 s[30:31]
142;
143; GFX7-LABEL: extractelement_vgpr_v4i8_vgpr_idx:
144; GFX7:       ; %bb.0:
145; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
146; GFX7-NEXT:    s_mov_b32 s6, 0
147; GFX7-NEXT:    s_mov_b32 s7, 0xf000
148; GFX7-NEXT:    s_mov_b64 s[4:5], 0
149; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[4:7], 0 addr64
150; GFX7-NEXT:    v_and_b32_e32 v1, 3, v2
151; GFX7-NEXT:    s_movk_i32 s4, 0xff
152; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
153; GFX7-NEXT:    s_waitcnt vmcnt(0)
154; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 8, v0
155; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
156; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
157; GFX7-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
158; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
159; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
160; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 8, v2
161; GFX7-NEXT:    v_and_b32_e32 v4, s4, v4
162; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
163; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
164; GFX7-NEXT:    v_lshlrev_b32_e32 v4, 24, v4
165; GFX7-NEXT:    v_or_b32_e32 v0, v0, v3
166; GFX7-NEXT:    v_or_b32_e32 v0, v0, v4
167; GFX7-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
168; GFX7-NEXT:    s_setpc_b64 s[30:31]
169  %vector = load <4 x i8>, <4 x i8> addrspace(1)* %ptr
170  %element = extractelement <4 x i8> %vector, i32 %idx
171  ret i8 %element
172}
173
174define amdgpu_ps i8 @extractelement_sgpr_v4i8_vgpr_idx(<4 x i8> addrspace(4)* inreg %ptr, i32 %idx) {
175; GFX9-LABEL: extractelement_sgpr_v4i8_vgpr_idx:
176; GFX9:       ; %bb.0:
177; GFX9-NEXT:    s_load_dword s0, s[2:3], 0x0
178; GFX9-NEXT:    s_movk_i32 s4, 0xff
179; GFX9-NEXT:    v_and_b32_e32 v0, 3, v0
180; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
181; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
182; GFX9-NEXT:    s_lshr_b32 s1, s0, 8
183; GFX9-NEXT:    s_and_b32 s1, s1, s4
184; GFX9-NEXT:    s_lshr_b32 s2, s0, 16
185; GFX9-NEXT:    s_lshr_b32 s3, s0, 24
186; GFX9-NEXT:    s_and_b32 s0, s0, s4
187; GFX9-NEXT:    s_lshl_b32 s1, s1, 8
188; GFX9-NEXT:    s_or_b32 s0, s0, s1
189; GFX9-NEXT:    s_and_b32 s1, s2, s4
190; GFX9-NEXT:    s_lshl_b32 s1, s1, 16
191; GFX9-NEXT:    s_or_b32 s0, s0, s1
192; GFX9-NEXT:    s_and_b32 s1, s3, s4
193; GFX9-NEXT:    s_lshl_b32 s1, s1, 24
194; GFX9-NEXT:    s_or_b32 s0, s0, s1
195; GFX9-NEXT:    v_lshrrev_b32_e64 v0, v0, s0
196; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
197; GFX9-NEXT:    ; return to shader part epilog
198;
199; GFX8-LABEL: extractelement_sgpr_v4i8_vgpr_idx:
200; GFX8:       ; %bb.0:
201; GFX8-NEXT:    s_load_dword s0, s[2:3], 0x0
202; GFX8-NEXT:    s_movk_i32 s4, 0xff
203; GFX8-NEXT:    v_and_b32_e32 v0, 3, v0
204; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
205; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
206; GFX8-NEXT:    s_lshr_b32 s1, s0, 8
207; GFX8-NEXT:    s_and_b32 s1, s1, s4
208; GFX8-NEXT:    s_lshr_b32 s2, s0, 16
209; GFX8-NEXT:    s_lshr_b32 s3, s0, 24
210; GFX8-NEXT:    s_and_b32 s0, s0, s4
211; GFX8-NEXT:    s_lshl_b32 s1, s1, 8
212; GFX8-NEXT:    s_or_b32 s0, s0, s1
213; GFX8-NEXT:    s_and_b32 s1, s2, s4
214; GFX8-NEXT:    s_lshl_b32 s1, s1, 16
215; GFX8-NEXT:    s_or_b32 s0, s0, s1
216; GFX8-NEXT:    s_and_b32 s1, s3, s4
217; GFX8-NEXT:    s_lshl_b32 s1, s1, 24
218; GFX8-NEXT:    s_or_b32 s0, s0, s1
219; GFX8-NEXT:    v_lshrrev_b32_e64 v0, v0, s0
220; GFX8-NEXT:    v_readfirstlane_b32 s0, v0
221; GFX8-NEXT:    ; return to shader part epilog
222;
223; GFX7-LABEL: extractelement_sgpr_v4i8_vgpr_idx:
224; GFX7:       ; %bb.0:
225; GFX7-NEXT:    s_load_dword s0, s[2:3], 0x0
226; GFX7-NEXT:    s_movk_i32 s4, 0xff
227; GFX7-NEXT:    v_and_b32_e32 v0, 3, v0
228; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
229; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
230; GFX7-NEXT:    s_lshr_b32 s1, s0, 8
231; GFX7-NEXT:    s_and_b32 s1, s1, s4
232; GFX7-NEXT:    s_lshr_b32 s2, s0, 16
233; GFX7-NEXT:    s_lshr_b32 s3, s0, 24
234; GFX7-NEXT:    s_and_b32 s0, s0, s4
235; GFX7-NEXT:    s_lshl_b32 s1, s1, 8
236; GFX7-NEXT:    s_or_b32 s0, s0, s1
237; GFX7-NEXT:    s_and_b32 s1, s2, s4
238; GFX7-NEXT:    s_lshl_b32 s1, s1, 16
239; GFX7-NEXT:    s_or_b32 s0, s0, s1
240; GFX7-NEXT:    s_and_b32 s1, s3, s4
241; GFX7-NEXT:    s_lshl_b32 s1, s1, 24
242; GFX7-NEXT:    s_or_b32 s0, s0, s1
243; GFX7-NEXT:    v_lshr_b32_e32 v0, s0, v0
244; GFX7-NEXT:    v_readfirstlane_b32 s0, v0
245; GFX7-NEXT:    ; return to shader part epilog
246  %vector = load <4 x i8>, <4 x i8> addrspace(4)* %ptr
247  %element = extractelement <4 x i8> %vector, i32 %idx
248  ret i8 %element
249}
250
251define amdgpu_ps i8 @extractelement_sgpr_v4i8_idx0(<4 x i8> addrspace(4)* inreg %ptr) {
252; GCN-LABEL: extractelement_sgpr_v4i8_idx0:
253; GCN:       ; %bb.0:
254; GCN-NEXT:    s_load_dword s1, s[2:3], 0x0
255; GCN-NEXT:    s_movk_i32 s0, 0xff
256; GCN-NEXT:    s_waitcnt lgkmcnt(0)
257; GCN-NEXT:    s_lshr_b32 s2, s1, 8
258; GCN-NEXT:    s_and_b32 s2, s2, s0
259; GCN-NEXT:    s_lshr_b32 s3, s1, 16
260; GCN-NEXT:    s_lshr_b32 s4, s1, 24
261; GCN-NEXT:    s_and_b32 s1, s1, s0
262; GCN-NEXT:    s_lshl_b32 s2, s2, 8
263; GCN-NEXT:    s_or_b32 s1, s1, s2
264; GCN-NEXT:    s_and_b32 s2, s3, s0
265; GCN-NEXT:    s_and_b32 s0, s4, s0
266; GCN-NEXT:    s_lshl_b32 s2, s2, 16
267; GCN-NEXT:    s_or_b32 s1, s1, s2
268; GCN-NEXT:    s_lshl_b32 s0, s0, 24
269; GCN-NEXT:    s_or_b32 s0, s1, s0
270; GCN-NEXT:    ; return to shader part epilog
271  %vector = load <4 x i8>, <4 x i8> addrspace(4)* %ptr
272  %element = extractelement <4 x i8> %vector, i32 0
273  ret i8 %element
274}
275
276define amdgpu_ps i8 @extractelement_sgpr_v4i8_idx1(<4 x i8> addrspace(4)* inreg %ptr) {
277; GCN-LABEL: extractelement_sgpr_v4i8_idx1:
278; GCN:       ; %bb.0:
279; GCN-NEXT:    s_load_dword s1, s[2:3], 0x0
280; GCN-NEXT:    s_movk_i32 s0, 0xff
281; GCN-NEXT:    s_waitcnt lgkmcnt(0)
282; GCN-NEXT:    s_lshr_b32 s2, s1, 8
283; GCN-NEXT:    s_and_b32 s2, s2, s0
284; GCN-NEXT:    s_lshr_b32 s3, s1, 16
285; GCN-NEXT:    s_lshr_b32 s4, s1, 24
286; GCN-NEXT:    s_and_b32 s1, s1, s0
287; GCN-NEXT:    s_lshl_b32 s2, s2, 8
288; GCN-NEXT:    s_or_b32 s1, s1, s2
289; GCN-NEXT:    s_and_b32 s2, s3, s0
290; GCN-NEXT:    s_and_b32 s0, s4, s0
291; GCN-NEXT:    s_lshl_b32 s2, s2, 16
292; GCN-NEXT:    s_or_b32 s1, s1, s2
293; GCN-NEXT:    s_lshl_b32 s0, s0, 24
294; GCN-NEXT:    s_or_b32 s0, s1, s0
295; GCN-NEXT:    s_lshr_b32 s0, s0, 8
296; GCN-NEXT:    ; return to shader part epilog
297  %vector = load <4 x i8>, <4 x i8> addrspace(4)* %ptr
298  %element = extractelement <4 x i8> %vector, i32 1
299  ret i8 %element
300}
301
302define amdgpu_ps i8 @extractelement_sgpr_v4i8_idx2(<4 x i8> addrspace(4)* inreg %ptr) {
303; GCN-LABEL: extractelement_sgpr_v4i8_idx2:
304; GCN:       ; %bb.0:
305; GCN-NEXT:    s_load_dword s1, s[2:3], 0x0
306; GCN-NEXT:    s_movk_i32 s0, 0xff
307; GCN-NEXT:    s_waitcnt lgkmcnt(0)
308; GCN-NEXT:    s_lshr_b32 s2, s1, 8
309; GCN-NEXT:    s_and_b32 s2, s2, s0
310; GCN-NEXT:    s_lshr_b32 s3, s1, 16
311; GCN-NEXT:    s_lshr_b32 s4, s1, 24
312; GCN-NEXT:    s_and_b32 s1, s1, s0
313; GCN-NEXT:    s_lshl_b32 s2, s2, 8
314; GCN-NEXT:    s_or_b32 s1, s1, s2
315; GCN-NEXT:    s_and_b32 s2, s3, s0
316; GCN-NEXT:    s_and_b32 s0, s4, s0
317; GCN-NEXT:    s_lshl_b32 s2, s2, 16
318; GCN-NEXT:    s_or_b32 s1, s1, s2
319; GCN-NEXT:    s_lshl_b32 s0, s0, 24
320; GCN-NEXT:    s_or_b32 s0, s1, s0
321; GCN-NEXT:    s_lshr_b32 s0, s0, 16
322; GCN-NEXT:    ; return to shader part epilog
323  %vector = load <4 x i8>, <4 x i8> addrspace(4)* %ptr
324  %element = extractelement <4 x i8> %vector, i32 2
325  ret i8 %element
326}
327
328define amdgpu_ps i8 @extractelement_sgpr_v4i8_idx3(<4 x i8> addrspace(4)* inreg %ptr) {
329; GCN-LABEL: extractelement_sgpr_v4i8_idx3:
330; GCN:       ; %bb.0:
331; GCN-NEXT:    s_load_dword s1, s[2:3], 0x0
332; GCN-NEXT:    s_movk_i32 s0, 0xff
333; GCN-NEXT:    s_waitcnt lgkmcnt(0)
334; GCN-NEXT:    s_lshr_b32 s2, s1, 8
335; GCN-NEXT:    s_and_b32 s2, s2, s0
336; GCN-NEXT:    s_lshr_b32 s3, s1, 16
337; GCN-NEXT:    s_lshr_b32 s4, s1, 24
338; GCN-NEXT:    s_and_b32 s1, s1, s0
339; GCN-NEXT:    s_lshl_b32 s2, s2, 8
340; GCN-NEXT:    s_or_b32 s1, s1, s2
341; GCN-NEXT:    s_and_b32 s2, s3, s0
342; GCN-NEXT:    s_and_b32 s0, s4, s0
343; GCN-NEXT:    s_lshl_b32 s2, s2, 16
344; GCN-NEXT:    s_or_b32 s1, s1, s2
345; GCN-NEXT:    s_lshl_b32 s0, s0, 24
346; GCN-NEXT:    s_or_b32 s0, s1, s0
347; GCN-NEXT:    s_lshr_b32 s0, s0, 24
348; GCN-NEXT:    ; return to shader part epilog
349  %vector = load <4 x i8>, <4 x i8> addrspace(4)* %ptr
350  %element = extractelement <4 x i8> %vector, i32 3
351  ret i8 %element
352}
353
354define i8 @extractelement_vgpr_v4i8_idx0(<4 x i8> addrspace(1)* %ptr) {
355; GFX9-LABEL: extractelement_vgpr_v4i8_idx0:
356; GFX9:       ; %bb.0:
357; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
358; GFX9-NEXT:    global_load_dword v0, v[0:1], off
359; GFX9-NEXT:    s_mov_b32 s4, 8
360; GFX9-NEXT:    s_movk_i32 s5, 0xff
361; GFX9-NEXT:    s_waitcnt vmcnt(0)
362; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
363; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
364; GFX9-NEXT:    v_and_b32_sdwa v2, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
365; GFX9-NEXT:    v_and_or_b32 v1, v0, s5, v1
366; GFX9-NEXT:    v_and_b32_sdwa v0, v0, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
367; GFX9-NEXT:    v_or3_b32 v0, v1, v2, v0
368; GFX9-NEXT:    s_setpc_b64 s[30:31]
369;
370; GFX8-LABEL: extractelement_vgpr_v4i8_idx0:
371; GFX8:       ; %bb.0:
372; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
373; GFX8-NEXT:    flat_load_dword v0, v[0:1]
374; GFX8-NEXT:    s_movk_i32 s4, 0xff
375; GFX8-NEXT:    v_mov_b32_e32 v1, 8
376; GFX8-NEXT:    v_mov_b32_e32 v2, s4
377; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
378; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v0
379; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
380; GFX8-NEXT:    v_and_b32_sdwa v4, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
381; GFX8-NEXT:    v_or_b32_sdwa v1, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
382; GFX8-NEXT:    v_or_b32_e32 v1, v1, v4
383; GFX8-NEXT:    v_and_b32_sdwa v0, v0, v2 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
384; GFX8-NEXT:    v_or_b32_e32 v0, v1, v0
385; GFX8-NEXT:    s_setpc_b64 s[30:31]
386;
387; GFX7-LABEL: extractelement_vgpr_v4i8_idx0:
388; GFX7:       ; %bb.0:
389; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
390; GFX7-NEXT:    s_mov_b32 s6, 0
391; GFX7-NEXT:    s_mov_b32 s7, 0xf000
392; GFX7-NEXT:    s_mov_b64 s[4:5], 0
393; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[4:7], 0 addr64
394; GFX7-NEXT:    s_movk_i32 s4, 0xff
395; GFX7-NEXT:    s_waitcnt vmcnt(0)
396; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
397; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
398; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
399; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
400; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
401; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
402; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
403; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
404; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
405; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
406; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
407; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
408; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
409; GFX7-NEXT:    s_setpc_b64 s[30:31]
410  %vector = load <4 x i8>, <4 x i8> addrspace(1)* %ptr
411  %element = extractelement <4 x i8> %vector, i32 0
412  ret i8 %element
413}
414
415define i8 @extractelement_vgpr_v4i8_idx1(<4 x i8> addrspace(1)* %ptr) {
416; GFX9-LABEL: extractelement_vgpr_v4i8_idx1:
417; GFX9:       ; %bb.0:
418; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
419; GFX9-NEXT:    global_load_dword v0, v[0:1], off
420; GFX9-NEXT:    s_mov_b32 s4, 8
421; GFX9-NEXT:    s_movk_i32 s5, 0xff
422; GFX9-NEXT:    s_waitcnt vmcnt(0)
423; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
424; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
425; GFX9-NEXT:    v_and_b32_sdwa v2, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
426; GFX9-NEXT:    v_and_or_b32 v1, v0, s5, v1
427; GFX9-NEXT:    v_and_b32_sdwa v0, v0, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
428; GFX9-NEXT:    v_or3_b32 v0, v1, v2, v0
429; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
430; GFX9-NEXT:    s_setpc_b64 s[30:31]
431;
432; GFX8-LABEL: extractelement_vgpr_v4i8_idx1:
433; GFX8:       ; %bb.0:
434; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
435; GFX8-NEXT:    flat_load_dword v0, v[0:1]
436; GFX8-NEXT:    s_movk_i32 s4, 0xff
437; GFX8-NEXT:    v_mov_b32_e32 v1, 8
438; GFX8-NEXT:    v_mov_b32_e32 v2, s4
439; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
440; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v0
441; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
442; GFX8-NEXT:    v_and_b32_sdwa v4, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
443; GFX8-NEXT:    v_or_b32_sdwa v1, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
444; GFX8-NEXT:    v_or_b32_e32 v1, v1, v4
445; GFX8-NEXT:    v_and_b32_sdwa v0, v0, v2 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
446; GFX8-NEXT:    v_or_b32_e32 v0, v1, v0
447; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
448; GFX8-NEXT:    s_setpc_b64 s[30:31]
449;
450; GFX7-LABEL: extractelement_vgpr_v4i8_idx1:
451; GFX7:       ; %bb.0:
452; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
453; GFX7-NEXT:    s_mov_b32 s6, 0
454; GFX7-NEXT:    s_mov_b32 s7, 0xf000
455; GFX7-NEXT:    s_mov_b64 s[4:5], 0
456; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[4:7], 0 addr64
457; GFX7-NEXT:    s_movk_i32 s4, 0xff
458; GFX7-NEXT:    s_waitcnt vmcnt(0)
459; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
460; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
461; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
462; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
463; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
464; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
465; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
466; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
467; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
468; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
469; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
470; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
471; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
472; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
473; GFX7-NEXT:    s_setpc_b64 s[30:31]
474  %vector = load <4 x i8>, <4 x i8> addrspace(1)* %ptr
475  %element = extractelement <4 x i8> %vector, i32 1
476  ret i8 %element
477}
478
479define i8 @extractelement_vgpr_v4i8_idx2(<4 x i8> addrspace(1)* %ptr) {
480; GFX9-LABEL: extractelement_vgpr_v4i8_idx2:
481; GFX9:       ; %bb.0:
482; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
483; GFX9-NEXT:    global_load_dword v0, v[0:1], off
484; GFX9-NEXT:    s_mov_b32 s4, 8
485; GFX9-NEXT:    s_movk_i32 s5, 0xff
486; GFX9-NEXT:    s_waitcnt vmcnt(0)
487; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
488; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
489; GFX9-NEXT:    v_and_b32_sdwa v2, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
490; GFX9-NEXT:    v_and_or_b32 v1, v0, s5, v1
491; GFX9-NEXT:    v_and_b32_sdwa v0, v0, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
492; GFX9-NEXT:    v_or3_b32 v0, v1, v2, v0
493; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
494; GFX9-NEXT:    s_setpc_b64 s[30:31]
495;
496; GFX8-LABEL: extractelement_vgpr_v4i8_idx2:
497; GFX8:       ; %bb.0:
498; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
499; GFX8-NEXT:    flat_load_dword v0, v[0:1]
500; GFX8-NEXT:    s_movk_i32 s4, 0xff
501; GFX8-NEXT:    v_mov_b32_e32 v1, 8
502; GFX8-NEXT:    v_mov_b32_e32 v2, s4
503; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
504; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v0
505; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
506; GFX8-NEXT:    v_and_b32_sdwa v4, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
507; GFX8-NEXT:    v_or_b32_sdwa v1, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
508; GFX8-NEXT:    v_or_b32_e32 v1, v1, v4
509; GFX8-NEXT:    v_and_b32_sdwa v0, v0, v2 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
510; GFX8-NEXT:    v_or_b32_e32 v0, v1, v0
511; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
512; GFX8-NEXT:    s_setpc_b64 s[30:31]
513;
514; GFX7-LABEL: extractelement_vgpr_v4i8_idx2:
515; GFX7:       ; %bb.0:
516; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
517; GFX7-NEXT:    s_mov_b32 s6, 0
518; GFX7-NEXT:    s_mov_b32 s7, 0xf000
519; GFX7-NEXT:    s_mov_b64 s[4:5], 0
520; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[4:7], 0 addr64
521; GFX7-NEXT:    s_movk_i32 s4, 0xff
522; GFX7-NEXT:    s_waitcnt vmcnt(0)
523; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
524; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
525; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
526; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
527; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
528; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
529; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
530; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
531; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
532; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
533; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
534; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
535; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
536; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
537; GFX7-NEXT:    s_setpc_b64 s[30:31]
538  %vector = load <4 x i8>, <4 x i8> addrspace(1)* %ptr
539  %element = extractelement <4 x i8> %vector, i32 2
540  ret i8 %element
541}
542
543define i8 @extractelement_vgpr_v4i8_idx3(<4 x i8> addrspace(1)* %ptr) {
544; GFX9-LABEL: extractelement_vgpr_v4i8_idx3:
545; GFX9:       ; %bb.0:
546; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
547; GFX9-NEXT:    global_load_dword v0, v[0:1], off
548; GFX9-NEXT:    s_mov_b32 s4, 8
549; GFX9-NEXT:    s_movk_i32 s5, 0xff
550; GFX9-NEXT:    s_waitcnt vmcnt(0)
551; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
552; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
553; GFX9-NEXT:    v_and_b32_sdwa v2, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
554; GFX9-NEXT:    v_and_or_b32 v1, v0, s5, v1
555; GFX9-NEXT:    v_and_b32_sdwa v0, v0, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
556; GFX9-NEXT:    v_or3_b32 v0, v1, v2, v0
557; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
558; GFX9-NEXT:    s_setpc_b64 s[30:31]
559;
560; GFX8-LABEL: extractelement_vgpr_v4i8_idx3:
561; GFX8:       ; %bb.0:
562; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
563; GFX8-NEXT:    flat_load_dword v0, v[0:1]
564; GFX8-NEXT:    s_movk_i32 s4, 0xff
565; GFX8-NEXT:    v_mov_b32_e32 v1, 8
566; GFX8-NEXT:    v_mov_b32_e32 v2, s4
567; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
568; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v0
569; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
570; GFX8-NEXT:    v_and_b32_sdwa v4, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
571; GFX8-NEXT:    v_or_b32_sdwa v1, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
572; GFX8-NEXT:    v_or_b32_e32 v1, v1, v4
573; GFX8-NEXT:    v_and_b32_sdwa v0, v0, v2 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
574; GFX8-NEXT:    v_or_b32_e32 v0, v1, v0
575; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
576; GFX8-NEXT:    s_setpc_b64 s[30:31]
577;
578; GFX7-LABEL: extractelement_vgpr_v4i8_idx3:
579; GFX7:       ; %bb.0:
580; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
581; GFX7-NEXT:    s_mov_b32 s6, 0
582; GFX7-NEXT:    s_mov_b32 s7, 0xf000
583; GFX7-NEXT:    s_mov_b64 s[4:5], 0
584; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[4:7], 0 addr64
585; GFX7-NEXT:    s_movk_i32 s4, 0xff
586; GFX7-NEXT:    s_waitcnt vmcnt(0)
587; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
588; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
589; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
590; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
591; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
592; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
593; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
594; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
595; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
596; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
597; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
598; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
599; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
600; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
601; GFX7-NEXT:    s_setpc_b64 s[30:31]
602  %vector = load <4 x i8>, <4 x i8> addrspace(1)* %ptr
603  %element = extractelement <4 x i8> %vector, i32 3
604  ret i8 %element
605}
606
607define amdgpu_ps i8 @extractelement_sgpr_v8i8_sgpr_idx(<8 x i8> addrspace(4)* inreg %ptr, i32 inreg %idx) {
608; GCN-LABEL: extractelement_sgpr_v8i8_sgpr_idx:
609; GCN:       ; %bb.0:
610; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
611; GCN-NEXT:    s_movk_i32 s9, 0xff
612; GCN-NEXT:    s_waitcnt lgkmcnt(0)
613; GCN-NEXT:    s_lshr_b32 s2, s0, 8
614; GCN-NEXT:    s_and_b32 s2, s2, s9
615; GCN-NEXT:    s_lshr_b32 s3, s0, 16
616; GCN-NEXT:    s_lshr_b32 s5, s0, 24
617; GCN-NEXT:    s_and_b32 s0, s0, s9
618; GCN-NEXT:    s_lshl_b32 s2, s2, 8
619; GCN-NEXT:    s_or_b32 s0, s0, s2
620; GCN-NEXT:    s_and_b32 s2, s3, s9
621; GCN-NEXT:    s_lshl_b32 s2, s2, 16
622; GCN-NEXT:    s_or_b32 s0, s0, s2
623; GCN-NEXT:    s_and_b32 s2, s5, s9
624; GCN-NEXT:    s_lshl_b32 s2, s2, 24
625; GCN-NEXT:    s_lshr_b32 s6, s1, 8
626; GCN-NEXT:    s_or_b32 s0, s0, s2
627; GCN-NEXT:    s_and_b32 s2, s6, s9
628; GCN-NEXT:    s_lshr_b32 s7, s1, 16
629; GCN-NEXT:    s_lshr_b32 s8, s1, 24
630; GCN-NEXT:    s_and_b32 s1, s1, s9
631; GCN-NEXT:    s_lshl_b32 s2, s2, 8
632; GCN-NEXT:    s_or_b32 s1, s1, s2
633; GCN-NEXT:    s_and_b32 s2, s7, s9
634; GCN-NEXT:    s_lshl_b32 s2, s2, 16
635; GCN-NEXT:    s_or_b32 s1, s1, s2
636; GCN-NEXT:    s_and_b32 s2, s8, s9
637; GCN-NEXT:    s_lshl_b32 s2, s2, 24
638; GCN-NEXT:    s_or_b32 s1, s1, s2
639; GCN-NEXT:    s_lshr_b32 s2, s4, 2
640; GCN-NEXT:    s_cmp_eq_u32 s2, 1
641; GCN-NEXT:    s_cselect_b32 s0, s1, s0
642; GCN-NEXT:    s_and_b32 s1, s4, 3
643; GCN-NEXT:    s_lshl_b32 s1, s1, 3
644; GCN-NEXT:    s_lshr_b32 s0, s0, s1
645; GCN-NEXT:    ; return to shader part epilog
646  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
647  %element = extractelement <8 x i8> %vector, i32 %idx
648  ret i8 %element
649}
650
651define amdgpu_ps i8 @extractelement_vgpr_v8i8_sgpr_idx(<8 x i8> addrspace(1)* %ptr, i32 inreg %idx) {
652; GFX9-LABEL: extractelement_vgpr_v8i8_sgpr_idx:
653; GFX9:       ; %bb.0:
654; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
655; GFX9-NEXT:    s_mov_b32 s0, 8
656; GFX9-NEXT:    v_mov_b32_e32 v2, 8
657; GFX9-NEXT:    s_movk_i32 s1, 0xff
658; GFX9-NEXT:    s_lshr_b32 s3, s2, 2
659; GFX9-NEXT:    s_and_b32 s2, s2, 3
660; GFX9-NEXT:    v_cmp_eq_u32_e64 vcc, s3, 1
661; GFX9-NEXT:    s_waitcnt vmcnt(0)
662; GFX9-NEXT:    v_lshrrev_b32_e32 v3, 8, v0
663; GFX9-NEXT:    v_lshrrev_b32_e32 v4, 8, v1
664; GFX9-NEXT:    v_lshlrev_b32_sdwa v3, s0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
665; GFX9-NEXT:    v_lshlrev_b32_sdwa v2, v2, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
666; GFX9-NEXT:    v_and_b32_sdwa v5, v0, s1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
667; GFX9-NEXT:    v_and_b32_sdwa v6, v0, s1 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
668; GFX9-NEXT:    v_and_or_b32 v0, v0, s1, v3
669; GFX9-NEXT:    v_and_b32_sdwa v7, v1, s1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
670; GFX9-NEXT:    v_and_b32_sdwa v8, v1, s1 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
671; GFX9-NEXT:    v_and_or_b32 v1, v1, s1, v2
672; GFX9-NEXT:    v_or3_b32 v0, v0, v5, v6
673; GFX9-NEXT:    v_or3_b32 v1, v1, v7, v8
674; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
675; GFX9-NEXT:    s_lshl_b32 s0, s2, 3
676; GFX9-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
677; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
678; GFX9-NEXT:    ; return to shader part epilog
679;
680; GFX8-LABEL: extractelement_vgpr_v8i8_sgpr_idx:
681; GFX8:       ; %bb.0:
682; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
683; GFX8-NEXT:    s_movk_i32 s0, 0xff
684; GFX8-NEXT:    v_mov_b32_e32 v2, 8
685; GFX8-NEXT:    v_mov_b32_e32 v3, 8
686; GFX8-NEXT:    v_mov_b32_e32 v4, s0
687; GFX8-NEXT:    s_lshr_b32 s0, s2, 2
688; GFX8-NEXT:    s_and_b32 s1, s2, 3
689; GFX8-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 1
690; GFX8-NEXT:    s_lshl_b32 s0, s1, 3
691; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
692; GFX8-NEXT:    v_lshrrev_b32_e32 v5, 8, v0
693; GFX8-NEXT:    v_lshrrev_b32_e32 v6, 8, v1
694; GFX8-NEXT:    v_lshlrev_b32_sdwa v2, v2, v5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
695; GFX8-NEXT:    v_lshlrev_b32_sdwa v3, v3, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
696; GFX8-NEXT:    v_and_b32_sdwa v7, v0, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
697; GFX8-NEXT:    v_and_b32_sdwa v8, v0, v4 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
698; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
699; GFX8-NEXT:    v_and_b32_sdwa v9, v1, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
700; GFX8-NEXT:    v_and_b32_sdwa v4, v1, v4 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
701; GFX8-NEXT:    v_or_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
702; GFX8-NEXT:    v_or_b32_e32 v0, v0, v7
703; GFX8-NEXT:    v_or_b32_e32 v1, v1, v9
704; GFX8-NEXT:    v_or_b32_e32 v0, v0, v8
705; GFX8-NEXT:    v_or_b32_e32 v1, v1, v4
706; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
707; GFX8-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
708; GFX8-NEXT:    v_readfirstlane_b32 s0, v0
709; GFX8-NEXT:    ; return to shader part epilog
710;
711; GFX7-LABEL: extractelement_vgpr_v8i8_sgpr_idx:
712; GFX7:       ; %bb.0:
713; GFX7-NEXT:    s_mov_b32 s6, 0
714; GFX7-NEXT:    s_mov_b32 s7, 0xf000
715; GFX7-NEXT:    s_mov_b64 s[4:5], 0
716; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
717; GFX7-NEXT:    s_movk_i32 s0, 0xff
718; GFX7-NEXT:    s_lshr_b32 s1, s2, 2
719; GFX7-NEXT:    s_and_b32 s2, s2, 3
720; GFX7-NEXT:    v_cmp_eq_u32_e64 vcc, s1, 1
721; GFX7-NEXT:    s_waitcnt vmcnt(0)
722; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 8, v0
723; GFX7-NEXT:    v_lshrrev_b32_e32 v5, 8, v1
724; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
725; GFX7-NEXT:    v_lshrrev_b32_e32 v6, 16, v1
726; GFX7-NEXT:    v_and_b32_e32 v2, s0, v2
727; GFX7-NEXT:    v_and_b32_e32 v5, s0, v5
728; GFX7-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
729; GFX7-NEXT:    v_lshrrev_b32_e32 v7, 24, v1
730; GFX7-NEXT:    v_and_b32_e32 v3, s0, v3
731; GFX7-NEXT:    v_and_b32_e32 v6, s0, v6
732; GFX7-NEXT:    v_and_b32_e32 v0, s0, v0
733; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 8, v2
734; GFX7-NEXT:    v_and_b32_e32 v1, s0, v1
735; GFX7-NEXT:    v_lshlrev_b32_e32 v5, 8, v5
736; GFX7-NEXT:    v_and_b32_e32 v4, s0, v4
737; GFX7-NEXT:    v_and_b32_e32 v7, s0, v7
738; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
739; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
740; GFX7-NEXT:    v_lshlrev_b32_e32 v6, 16, v6
741; GFX7-NEXT:    v_or_b32_e32 v1, v1, v5
742; GFX7-NEXT:    v_lshlrev_b32_e32 v4, 24, v4
743; GFX7-NEXT:    v_or_b32_e32 v0, v0, v3
744; GFX7-NEXT:    v_lshlrev_b32_e32 v7, 24, v7
745; GFX7-NEXT:    v_or_b32_e32 v1, v1, v6
746; GFX7-NEXT:    v_or_b32_e32 v0, v0, v4
747; GFX7-NEXT:    v_or_b32_e32 v1, v1, v7
748; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
749; GFX7-NEXT:    s_lshl_b32 s0, s2, 3
750; GFX7-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
751; GFX7-NEXT:    v_readfirstlane_b32 s0, v0
752; GFX7-NEXT:    ; return to shader part epilog
753  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
754  %element = extractelement <8 x i8> %vector, i32 %idx
755  ret i8 %element
756}
757
758define i8 @extractelement_vgpr_v8i8_vgpr_idx(<8 x i8> addrspace(1)* %ptr, i32 %idx) {
759; GFX9-LABEL: extractelement_vgpr_v8i8_vgpr_idx:
760; GFX9:       ; %bb.0:
761; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
762; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
763; GFX9-NEXT:    s_mov_b32 s4, 8
764; GFX9-NEXT:    v_mov_b32_e32 v3, 8
765; GFX9-NEXT:    s_movk_i32 s5, 0xff
766; GFX9-NEXT:    v_lshrrev_b32_e32 v4, 2, v2
767; GFX9-NEXT:    v_and_b32_e32 v2, 3, v2
768; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v4
769; GFX9-NEXT:    s_waitcnt vmcnt(0)
770; GFX9-NEXT:    v_lshrrev_b32_e32 v5, 8, v0
771; GFX9-NEXT:    v_lshrrev_b32_e32 v6, 8, v1
772; GFX9-NEXT:    v_lshlrev_b32_sdwa v5, s4, v5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
773; GFX9-NEXT:    v_lshlrev_b32_sdwa v3, v3, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
774; GFX9-NEXT:    v_and_b32_sdwa v7, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
775; GFX9-NEXT:    v_and_b32_sdwa v8, v0, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
776; GFX9-NEXT:    v_and_or_b32 v0, v0, s5, v5
777; GFX9-NEXT:    v_and_b32_sdwa v9, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
778; GFX9-NEXT:    v_and_b32_sdwa v10, v1, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
779; GFX9-NEXT:    v_and_or_b32 v1, v1, s5, v3
780; GFX9-NEXT:    v_or3_b32 v0, v0, v7, v8
781; GFX9-NEXT:    v_or3_b32 v1, v1, v9, v10
782; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
783; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 3, v2
784; GFX9-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
785; GFX9-NEXT:    s_setpc_b64 s[30:31]
786;
787; GFX8-LABEL: extractelement_vgpr_v8i8_vgpr_idx:
788; GFX8:       ; %bb.0:
789; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
790; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
791; GFX8-NEXT:    s_movk_i32 s4, 0xff
792; GFX8-NEXT:    v_mov_b32_e32 v3, 8
793; GFX8-NEXT:    v_mov_b32_e32 v4, 8
794; GFX8-NEXT:    v_mov_b32_e32 v5, s4
795; GFX8-NEXT:    v_lshrrev_b32_e32 v6, 2, v2
796; GFX8-NEXT:    v_and_b32_e32 v2, 3, v2
797; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v6
798; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
799; GFX8-NEXT:    v_lshrrev_b32_e32 v7, 8, v0
800; GFX8-NEXT:    v_lshrrev_b32_e32 v8, 8, v1
801; GFX8-NEXT:    v_lshlrev_b32_sdwa v3, v3, v7 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
802; GFX8-NEXT:    v_lshlrev_b32_sdwa v4, v4, v8 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
803; GFX8-NEXT:    v_and_b32_sdwa v9, v0, v5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
804; GFX8-NEXT:    v_and_b32_sdwa v10, v0, v5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
805; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
806; GFX8-NEXT:    v_and_b32_sdwa v11, v1, v5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
807; GFX8-NEXT:    v_and_b32_sdwa v5, v1, v5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
808; GFX8-NEXT:    v_or_b32_sdwa v1, v1, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
809; GFX8-NEXT:    v_or_b32_e32 v0, v0, v9
810; GFX8-NEXT:    v_or_b32_e32 v1, v1, v11
811; GFX8-NEXT:    v_or_b32_e32 v0, v0, v10
812; GFX8-NEXT:    v_or_b32_e32 v1, v1, v5
813; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
814; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 3, v2
815; GFX8-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
816; GFX8-NEXT:    s_setpc_b64 s[30:31]
817;
818; GFX7-LABEL: extractelement_vgpr_v8i8_vgpr_idx:
819; GFX7:       ; %bb.0:
820; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
821; GFX7-NEXT:    s_mov_b32 s6, 0
822; GFX7-NEXT:    s_mov_b32 s7, 0xf000
823; GFX7-NEXT:    s_mov_b64 s[4:5], 0
824; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
825; GFX7-NEXT:    s_movk_i32 s4, 0xff
826; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 2, v2
827; GFX7-NEXT:    v_and_b32_e32 v2, 3, v2
828; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v3
829; GFX7-NEXT:    s_waitcnt vmcnt(0)
830; GFX7-NEXT:    v_lshrrev_b32_e32 v4, 8, v0
831; GFX7-NEXT:    v_lshrrev_b32_e32 v7, 8, v1
832; GFX7-NEXT:    v_lshrrev_b32_e32 v5, 16, v0
833; GFX7-NEXT:    v_lshrrev_b32_e32 v8, 16, v1
834; GFX7-NEXT:    v_and_b32_e32 v4, s4, v4
835; GFX7-NEXT:    v_and_b32_e32 v7, s4, v7
836; GFX7-NEXT:    v_lshrrev_b32_e32 v6, 24, v0
837; GFX7-NEXT:    v_lshrrev_b32_e32 v9, 24, v1
838; GFX7-NEXT:    v_and_b32_e32 v5, s4, v5
839; GFX7-NEXT:    v_and_b32_e32 v8, s4, v8
840; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
841; GFX7-NEXT:    v_lshlrev_b32_e32 v4, 8, v4
842; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
843; GFX7-NEXT:    v_lshlrev_b32_e32 v7, 8, v7
844; GFX7-NEXT:    v_and_b32_e32 v6, s4, v6
845; GFX7-NEXT:    v_and_b32_e32 v9, s4, v9
846; GFX7-NEXT:    v_lshlrev_b32_e32 v5, 16, v5
847; GFX7-NEXT:    v_or_b32_e32 v0, v0, v4
848; GFX7-NEXT:    v_lshlrev_b32_e32 v8, 16, v8
849; GFX7-NEXT:    v_or_b32_e32 v1, v1, v7
850; GFX7-NEXT:    v_lshlrev_b32_e32 v6, 24, v6
851; GFX7-NEXT:    v_or_b32_e32 v0, v0, v5
852; GFX7-NEXT:    v_lshlrev_b32_e32 v9, 24, v9
853; GFX7-NEXT:    v_or_b32_e32 v1, v1, v8
854; GFX7-NEXT:    v_or_b32_e32 v0, v0, v6
855; GFX7-NEXT:    v_or_b32_e32 v1, v1, v9
856; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
857; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 3, v2
858; GFX7-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
859; GFX7-NEXT:    s_setpc_b64 s[30:31]
860  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
861  %element = extractelement <8 x i8> %vector, i32 %idx
862  ret i8 %element
863}
864
865define amdgpu_ps i8 @extractelement_sgpr_v8i8_vgpr_idx(<8 x i8> addrspace(4)* inreg %ptr, i32 %idx) {
866; GCN-LABEL: extractelement_sgpr_v8i8_vgpr_idx:
867; GCN:       ; %bb.0:
868; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
869; GCN-NEXT:    s_movk_i32 s8, 0xff
870; GCN-NEXT:    v_lshrrev_b32_e32 v1, 2, v0
871; GCN-NEXT:    v_and_b32_e32 v0, 3, v0
872; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v1
873; GCN-NEXT:    s_waitcnt lgkmcnt(0)
874; GCN-NEXT:    s_lshr_b32 s2, s0, 8
875; GCN-NEXT:    s_and_b32 s2, s2, s8
876; GCN-NEXT:    s_lshr_b32 s3, s0, 16
877; GCN-NEXT:    s_lshr_b32 s4, s0, 24
878; GCN-NEXT:    s_and_b32 s0, s0, s8
879; GCN-NEXT:    s_lshl_b32 s2, s2, 8
880; GCN-NEXT:    s_or_b32 s0, s0, s2
881; GCN-NEXT:    s_and_b32 s2, s3, s8
882; GCN-NEXT:    s_lshl_b32 s2, s2, 16
883; GCN-NEXT:    s_or_b32 s0, s0, s2
884; GCN-NEXT:    s_and_b32 s2, s4, s8
885; GCN-NEXT:    s_lshl_b32 s2, s2, 24
886; GCN-NEXT:    s_lshr_b32 s5, s1, 8
887; GCN-NEXT:    s_or_b32 s0, s0, s2
888; GCN-NEXT:    s_and_b32 s2, s5, s8
889; GCN-NEXT:    s_lshr_b32 s6, s1, 16
890; GCN-NEXT:    s_lshr_b32 s7, s1, 24
891; GCN-NEXT:    s_and_b32 s1, s1, s8
892; GCN-NEXT:    s_lshl_b32 s2, s2, 8
893; GCN-NEXT:    s_or_b32 s1, s1, s2
894; GCN-NEXT:    s_and_b32 s2, s6, s8
895; GCN-NEXT:    s_lshl_b32 s2, s2, 16
896; GCN-NEXT:    s_or_b32 s1, s1, s2
897; GCN-NEXT:    s_and_b32 s2, s7, s8
898; GCN-NEXT:    s_lshl_b32 s2, s2, 24
899; GCN-NEXT:    s_or_b32 s1, s1, s2
900; GCN-NEXT:    v_mov_b32_e32 v2, s0
901; GCN-NEXT:    v_mov_b32_e32 v3, s1
902; GCN-NEXT:    v_cndmask_b32_e32 v1, v2, v3, vcc
903; GCN-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
904; GCN-NEXT:    v_lshrrev_b32_e32 v0, v0, v1
905; GCN-NEXT:    v_readfirstlane_b32 s0, v0
906; GCN-NEXT:    ; return to shader part epilog
907  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
908  %element = extractelement <8 x i8> %vector, i32 %idx
909  ret i8 %element
910}
911
912define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx0(<8 x i8> addrspace(4)* inreg %ptr) {
913; GCN-LABEL: extractelement_sgpr_v8i8_idx0:
914; GCN:       ; %bb.0:
915; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
916; GCN-NEXT:    s_movk_i32 s4, 0xff
917; GCN-NEXT:    s_waitcnt lgkmcnt(0)
918; GCN-NEXT:    s_lshr_b32 s1, s0, 8
919; GCN-NEXT:    s_and_b32 s1, s1, s4
920; GCN-NEXT:    s_lshr_b32 s2, s0, 16
921; GCN-NEXT:    s_lshr_b32 s3, s0, 24
922; GCN-NEXT:    s_and_b32 s0, s0, s4
923; GCN-NEXT:    s_lshl_b32 s1, s1, 8
924; GCN-NEXT:    s_or_b32 s0, s0, s1
925; GCN-NEXT:    s_and_b32 s1, s2, s4
926; GCN-NEXT:    s_lshl_b32 s1, s1, 16
927; GCN-NEXT:    s_or_b32 s0, s0, s1
928; GCN-NEXT:    s_and_b32 s1, s3, s4
929; GCN-NEXT:    s_lshl_b32 s1, s1, 24
930; GCN-NEXT:    s_or_b32 s0, s0, s1
931; GCN-NEXT:    ; return to shader part epilog
932  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
933  %element = extractelement <8 x i8> %vector, i32 0
934  ret i8 %element
935}
936
937define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx1(<8 x i8> addrspace(4)* inreg %ptr) {
938; GCN-LABEL: extractelement_sgpr_v8i8_idx1:
939; GCN:       ; %bb.0:
940; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
941; GCN-NEXT:    s_movk_i32 s4, 0xff
942; GCN-NEXT:    s_waitcnt lgkmcnt(0)
943; GCN-NEXT:    s_lshr_b32 s1, s0, 8
944; GCN-NEXT:    s_and_b32 s1, s1, s4
945; GCN-NEXT:    s_lshr_b32 s2, s0, 16
946; GCN-NEXT:    s_lshr_b32 s3, s0, 24
947; GCN-NEXT:    s_and_b32 s0, s0, s4
948; GCN-NEXT:    s_lshl_b32 s1, s1, 8
949; GCN-NEXT:    s_or_b32 s0, s0, s1
950; GCN-NEXT:    s_and_b32 s1, s2, s4
951; GCN-NEXT:    s_lshl_b32 s1, s1, 16
952; GCN-NEXT:    s_or_b32 s0, s0, s1
953; GCN-NEXT:    s_and_b32 s1, s3, s4
954; GCN-NEXT:    s_lshl_b32 s1, s1, 24
955; GCN-NEXT:    s_or_b32 s0, s0, s1
956; GCN-NEXT:    s_lshr_b32 s0, s0, 8
957; GCN-NEXT:    ; return to shader part epilog
958  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
959  %element = extractelement <8 x i8> %vector, i32 1
960  ret i8 %element
961}
962
963define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx2(<8 x i8> addrspace(4)* inreg %ptr) {
964; GCN-LABEL: extractelement_sgpr_v8i8_idx2:
965; GCN:       ; %bb.0:
966; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
967; GCN-NEXT:    s_movk_i32 s4, 0xff
968; GCN-NEXT:    s_waitcnt lgkmcnt(0)
969; GCN-NEXT:    s_lshr_b32 s1, s0, 8
970; GCN-NEXT:    s_and_b32 s1, s1, s4
971; GCN-NEXT:    s_lshr_b32 s2, s0, 16
972; GCN-NEXT:    s_lshr_b32 s3, s0, 24
973; GCN-NEXT:    s_and_b32 s0, s0, s4
974; GCN-NEXT:    s_lshl_b32 s1, s1, 8
975; GCN-NEXT:    s_or_b32 s0, s0, s1
976; GCN-NEXT:    s_and_b32 s1, s2, s4
977; GCN-NEXT:    s_lshl_b32 s1, s1, 16
978; GCN-NEXT:    s_or_b32 s0, s0, s1
979; GCN-NEXT:    s_and_b32 s1, s3, s4
980; GCN-NEXT:    s_lshl_b32 s1, s1, 24
981; GCN-NEXT:    s_or_b32 s0, s0, s1
982; GCN-NEXT:    s_lshr_b32 s0, s0, 16
983; GCN-NEXT:    ; return to shader part epilog
984  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
985  %element = extractelement <8 x i8> %vector, i32 2
986  ret i8 %element
987}
988
989define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx3(<8 x i8> addrspace(4)* inreg %ptr) {
990; GCN-LABEL: extractelement_sgpr_v8i8_idx3:
991; GCN:       ; %bb.0:
992; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
993; GCN-NEXT:    s_movk_i32 s4, 0xff
994; GCN-NEXT:    s_waitcnt lgkmcnt(0)
995; GCN-NEXT:    s_lshr_b32 s1, s0, 8
996; GCN-NEXT:    s_and_b32 s1, s1, s4
997; GCN-NEXT:    s_lshr_b32 s2, s0, 16
998; GCN-NEXT:    s_lshr_b32 s3, s0, 24
999; GCN-NEXT:    s_and_b32 s0, s0, s4
1000; GCN-NEXT:    s_lshl_b32 s1, s1, 8
1001; GCN-NEXT:    s_or_b32 s0, s0, s1
1002; GCN-NEXT:    s_and_b32 s1, s2, s4
1003; GCN-NEXT:    s_lshl_b32 s1, s1, 16
1004; GCN-NEXT:    s_or_b32 s0, s0, s1
1005; GCN-NEXT:    s_and_b32 s1, s3, s4
1006; GCN-NEXT:    s_lshl_b32 s1, s1, 24
1007; GCN-NEXT:    s_or_b32 s0, s0, s1
1008; GCN-NEXT:    s_lshr_b32 s0, s0, 24
1009; GCN-NEXT:    ; return to shader part epilog
1010  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
1011  %element = extractelement <8 x i8> %vector, i32 3
1012  ret i8 %element
1013}
1014
1015define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx4(<8 x i8> addrspace(4)* inreg %ptr) {
1016; GCN-LABEL: extractelement_sgpr_v8i8_idx4:
1017; GCN:       ; %bb.0:
1018; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1019; GCN-NEXT:    s_movk_i32 s4, 0xff
1020; GCN-NEXT:    s_waitcnt lgkmcnt(0)
1021; GCN-NEXT:    s_lshr_b32 s0, s1, 8
1022; GCN-NEXT:    s_and_b32 s0, s0, s4
1023; GCN-NEXT:    s_lshr_b32 s2, s1, 16
1024; GCN-NEXT:    s_lshr_b32 s3, s1, 24
1025; GCN-NEXT:    s_and_b32 s1, s1, s4
1026; GCN-NEXT:    s_lshl_b32 s0, s0, 8
1027; GCN-NEXT:    s_or_b32 s0, s1, s0
1028; GCN-NEXT:    s_and_b32 s1, s2, s4
1029; GCN-NEXT:    s_lshl_b32 s1, s1, 16
1030; GCN-NEXT:    s_or_b32 s0, s0, s1
1031; GCN-NEXT:    s_and_b32 s1, s3, s4
1032; GCN-NEXT:    s_lshl_b32 s1, s1, 24
1033; GCN-NEXT:    s_or_b32 s0, s0, s1
1034; GCN-NEXT:    ; return to shader part epilog
1035  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
1036  %element = extractelement <8 x i8> %vector, i32 4
1037  ret i8 %element
1038}
1039
1040define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx5(<8 x i8> addrspace(4)* inreg %ptr) {
1041; GCN-LABEL: extractelement_sgpr_v8i8_idx5:
1042; GCN:       ; %bb.0:
1043; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1044; GCN-NEXT:    s_movk_i32 s4, 0xff
1045; GCN-NEXT:    s_waitcnt lgkmcnt(0)
1046; GCN-NEXT:    s_lshr_b32 s0, s1, 8
1047; GCN-NEXT:    s_and_b32 s0, s0, s4
1048; GCN-NEXT:    s_lshr_b32 s2, s1, 16
1049; GCN-NEXT:    s_lshr_b32 s3, s1, 24
1050; GCN-NEXT:    s_and_b32 s1, s1, s4
1051; GCN-NEXT:    s_lshl_b32 s0, s0, 8
1052; GCN-NEXT:    s_or_b32 s0, s1, s0
1053; GCN-NEXT:    s_and_b32 s1, s2, s4
1054; GCN-NEXT:    s_lshl_b32 s1, s1, 16
1055; GCN-NEXT:    s_or_b32 s0, s0, s1
1056; GCN-NEXT:    s_and_b32 s1, s3, s4
1057; GCN-NEXT:    s_lshl_b32 s1, s1, 24
1058; GCN-NEXT:    s_or_b32 s0, s0, s1
1059; GCN-NEXT:    s_lshr_b32 s0, s0, 8
1060; GCN-NEXT:    ; return to shader part epilog
1061  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
1062  %element = extractelement <8 x i8> %vector, i32 5
1063  ret i8 %element
1064}
1065
1066define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx6(<8 x i8> addrspace(4)* inreg %ptr) {
1067; GCN-LABEL: extractelement_sgpr_v8i8_idx6:
1068; GCN:       ; %bb.0:
1069; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1070; GCN-NEXT:    s_movk_i32 s4, 0xff
1071; GCN-NEXT:    s_waitcnt lgkmcnt(0)
1072; GCN-NEXT:    s_lshr_b32 s0, s1, 8
1073; GCN-NEXT:    s_and_b32 s0, s0, s4
1074; GCN-NEXT:    s_lshr_b32 s2, s1, 16
1075; GCN-NEXT:    s_lshr_b32 s3, s1, 24
1076; GCN-NEXT:    s_and_b32 s1, s1, s4
1077; GCN-NEXT:    s_lshl_b32 s0, s0, 8
1078; GCN-NEXT:    s_or_b32 s0, s1, s0
1079; GCN-NEXT:    s_and_b32 s1, s2, s4
1080; GCN-NEXT:    s_lshl_b32 s1, s1, 16
1081; GCN-NEXT:    s_or_b32 s0, s0, s1
1082; GCN-NEXT:    s_and_b32 s1, s3, s4
1083; GCN-NEXT:    s_lshl_b32 s1, s1, 24
1084; GCN-NEXT:    s_or_b32 s0, s0, s1
1085; GCN-NEXT:    s_lshr_b32 s0, s0, 16
1086; GCN-NEXT:    ; return to shader part epilog
1087  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
1088  %element = extractelement <8 x i8> %vector, i32 6
1089  ret i8 %element
1090}
1091
1092define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx7(<8 x i8> addrspace(4)* inreg %ptr) {
1093; GCN-LABEL: extractelement_sgpr_v8i8_idx7:
1094; GCN:       ; %bb.0:
1095; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1096; GCN-NEXT:    s_movk_i32 s4, 0xff
1097; GCN-NEXT:    s_waitcnt lgkmcnt(0)
1098; GCN-NEXT:    s_lshr_b32 s0, s1, 8
1099; GCN-NEXT:    s_and_b32 s0, s0, s4
1100; GCN-NEXT:    s_lshr_b32 s2, s1, 16
1101; GCN-NEXT:    s_lshr_b32 s3, s1, 24
1102; GCN-NEXT:    s_and_b32 s1, s1, s4
1103; GCN-NEXT:    s_lshl_b32 s0, s0, 8
1104; GCN-NEXT:    s_or_b32 s0, s1, s0
1105; GCN-NEXT:    s_and_b32 s1, s2, s4
1106; GCN-NEXT:    s_lshl_b32 s1, s1, 16
1107; GCN-NEXT:    s_or_b32 s0, s0, s1
1108; GCN-NEXT:    s_and_b32 s1, s3, s4
1109; GCN-NEXT:    s_lshl_b32 s1, s1, 24
1110; GCN-NEXT:    s_or_b32 s0, s0, s1
1111; GCN-NEXT:    s_lshr_b32 s0, s0, 24
1112; GCN-NEXT:    ; return to shader part epilog
1113  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
1114  %element = extractelement <8 x i8> %vector, i32 7
1115  ret i8 %element
1116}
1117
1118define i8 @extractelement_vgpr_v8i8_idx0(<8 x i8> addrspace(1)* %ptr) {
1119; GFX9-LABEL: extractelement_vgpr_v8i8_idx0:
1120; GFX9:       ; %bb.0:
1121; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1122; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1123; GFX9-NEXT:    s_mov_b32 s4, 8
1124; GFX9-NEXT:    s_movk_i32 s5, 0xff
1125; GFX9-NEXT:    s_waitcnt vmcnt(0)
1126; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
1127; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1128; GFX9-NEXT:    v_and_b32_sdwa v2, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1129; GFX9-NEXT:    v_and_or_b32 v1, v0, s5, v1
1130; GFX9-NEXT:    v_and_b32_sdwa v0, v0, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1131; GFX9-NEXT:    v_or3_b32 v0, v1, v2, v0
1132; GFX9-NEXT:    s_setpc_b64 s[30:31]
1133;
1134; GFX8-LABEL: extractelement_vgpr_v8i8_idx0:
1135; GFX8:       ; %bb.0:
1136; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1137; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1138; GFX8-NEXT:    s_movk_i32 s4, 0xff
1139; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1140; GFX8-NEXT:    v_mov_b32_e32 v1, 8
1141; GFX8-NEXT:    v_mov_b32_e32 v2, s4
1142; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v0
1143; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1144; GFX8-NEXT:    v_and_b32_sdwa v4, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1145; GFX8-NEXT:    v_or_b32_sdwa v1, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1146; GFX8-NEXT:    v_or_b32_e32 v1, v1, v4
1147; GFX8-NEXT:    v_and_b32_sdwa v0, v0, v2 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1148; GFX8-NEXT:    v_or_b32_e32 v0, v1, v0
1149; GFX8-NEXT:    s_setpc_b64 s[30:31]
1150;
1151; GFX7-LABEL: extractelement_vgpr_v8i8_idx0:
1152; GFX7:       ; %bb.0:
1153; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1154; GFX7-NEXT:    s_mov_b32 s6, 0
1155; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1156; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1157; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
1158; GFX7-NEXT:    s_movk_i32 s4, 0xff
1159; GFX7-NEXT:    s_waitcnt vmcnt(0)
1160; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
1161; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
1162; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
1163; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
1164; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
1165; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
1166; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
1167; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
1168; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
1169; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
1170; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
1171; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
1172; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
1173; GFX7-NEXT:    s_setpc_b64 s[30:31]
1174  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
1175  %element = extractelement <8 x i8> %vector, i32 0
1176  ret i8 %element
1177}
1178
1179define i8 @extractelement_vgpr_v8i8_idx1(<8 x i8> addrspace(1)* %ptr) {
1180; GFX9-LABEL: extractelement_vgpr_v8i8_idx1:
1181; GFX9:       ; %bb.0:
1182; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1183; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1184; GFX9-NEXT:    s_mov_b32 s4, 8
1185; GFX9-NEXT:    s_movk_i32 s5, 0xff
1186; GFX9-NEXT:    s_waitcnt vmcnt(0)
1187; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
1188; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1189; GFX9-NEXT:    v_and_b32_sdwa v2, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1190; GFX9-NEXT:    v_and_or_b32 v1, v0, s5, v1
1191; GFX9-NEXT:    v_and_b32_sdwa v0, v0, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1192; GFX9-NEXT:    v_or3_b32 v0, v1, v2, v0
1193; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
1194; GFX9-NEXT:    s_setpc_b64 s[30:31]
1195;
1196; GFX8-LABEL: extractelement_vgpr_v8i8_idx1:
1197; GFX8:       ; %bb.0:
1198; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1199; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1200; GFX8-NEXT:    s_movk_i32 s4, 0xff
1201; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1202; GFX8-NEXT:    v_mov_b32_e32 v1, 8
1203; GFX8-NEXT:    v_mov_b32_e32 v2, s4
1204; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v0
1205; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1206; GFX8-NEXT:    v_and_b32_sdwa v4, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1207; GFX8-NEXT:    v_or_b32_sdwa v1, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1208; GFX8-NEXT:    v_or_b32_e32 v1, v1, v4
1209; GFX8-NEXT:    v_and_b32_sdwa v0, v0, v2 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1210; GFX8-NEXT:    v_or_b32_e32 v0, v1, v0
1211; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
1212; GFX8-NEXT:    s_setpc_b64 s[30:31]
1213;
1214; GFX7-LABEL: extractelement_vgpr_v8i8_idx1:
1215; GFX7:       ; %bb.0:
1216; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1217; GFX7-NEXT:    s_mov_b32 s6, 0
1218; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1219; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1220; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
1221; GFX7-NEXT:    s_movk_i32 s4, 0xff
1222; GFX7-NEXT:    s_waitcnt vmcnt(0)
1223; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
1224; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
1225; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
1226; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
1227; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
1228; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
1229; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
1230; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
1231; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
1232; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
1233; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
1234; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
1235; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
1236; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
1237; GFX7-NEXT:    s_setpc_b64 s[30:31]
1238  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
1239  %element = extractelement <8 x i8> %vector, i32 1
1240  ret i8 %element
1241}
1242
1243define i8 @extractelement_vgpr_v8i8_idx2(<8 x i8> addrspace(1)* %ptr) {
1244; GFX9-LABEL: extractelement_vgpr_v8i8_idx2:
1245; GFX9:       ; %bb.0:
1246; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1247; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1248; GFX9-NEXT:    s_mov_b32 s4, 8
1249; GFX9-NEXT:    s_movk_i32 s5, 0xff
1250; GFX9-NEXT:    s_waitcnt vmcnt(0)
1251; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
1252; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1253; GFX9-NEXT:    v_and_b32_sdwa v2, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1254; GFX9-NEXT:    v_and_or_b32 v1, v0, s5, v1
1255; GFX9-NEXT:    v_and_b32_sdwa v0, v0, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1256; GFX9-NEXT:    v_or3_b32 v0, v1, v2, v0
1257; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1258; GFX9-NEXT:    s_setpc_b64 s[30:31]
1259;
1260; GFX8-LABEL: extractelement_vgpr_v8i8_idx2:
1261; GFX8:       ; %bb.0:
1262; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1263; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1264; GFX8-NEXT:    s_movk_i32 s4, 0xff
1265; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1266; GFX8-NEXT:    v_mov_b32_e32 v1, 8
1267; GFX8-NEXT:    v_mov_b32_e32 v2, s4
1268; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v0
1269; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1270; GFX8-NEXT:    v_and_b32_sdwa v4, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1271; GFX8-NEXT:    v_or_b32_sdwa v1, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1272; GFX8-NEXT:    v_or_b32_e32 v1, v1, v4
1273; GFX8-NEXT:    v_and_b32_sdwa v0, v0, v2 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1274; GFX8-NEXT:    v_or_b32_e32 v0, v1, v0
1275; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1276; GFX8-NEXT:    s_setpc_b64 s[30:31]
1277;
1278; GFX7-LABEL: extractelement_vgpr_v8i8_idx2:
1279; GFX7:       ; %bb.0:
1280; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1281; GFX7-NEXT:    s_mov_b32 s6, 0
1282; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1283; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1284; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
1285; GFX7-NEXT:    s_movk_i32 s4, 0xff
1286; GFX7-NEXT:    s_waitcnt vmcnt(0)
1287; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
1288; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
1289; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
1290; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
1291; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
1292; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
1293; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
1294; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
1295; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
1296; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
1297; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
1298; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
1299; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
1300; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1301; GFX7-NEXT:    s_setpc_b64 s[30:31]
1302  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
1303  %element = extractelement <8 x i8> %vector, i32 2
1304  ret i8 %element
1305}
1306
1307define i8 @extractelement_vgpr_v8i8_idx3(<8 x i8> addrspace(1)* %ptr) {
1308; GFX9-LABEL: extractelement_vgpr_v8i8_idx3:
1309; GFX9:       ; %bb.0:
1310; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1311; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1312; GFX9-NEXT:    s_mov_b32 s4, 8
1313; GFX9-NEXT:    s_movk_i32 s5, 0xff
1314; GFX9-NEXT:    s_waitcnt vmcnt(0)
1315; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
1316; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1317; GFX9-NEXT:    v_and_b32_sdwa v2, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1318; GFX9-NEXT:    v_and_or_b32 v1, v0, s5, v1
1319; GFX9-NEXT:    v_and_b32_sdwa v0, v0, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1320; GFX9-NEXT:    v_or3_b32 v0, v1, v2, v0
1321; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
1322; GFX9-NEXT:    s_setpc_b64 s[30:31]
1323;
1324; GFX8-LABEL: extractelement_vgpr_v8i8_idx3:
1325; GFX8:       ; %bb.0:
1326; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1327; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1328; GFX8-NEXT:    s_movk_i32 s4, 0xff
1329; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1330; GFX8-NEXT:    v_mov_b32_e32 v1, 8
1331; GFX8-NEXT:    v_mov_b32_e32 v2, s4
1332; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v0
1333; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1334; GFX8-NEXT:    v_and_b32_sdwa v4, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1335; GFX8-NEXT:    v_or_b32_sdwa v1, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1336; GFX8-NEXT:    v_or_b32_e32 v1, v1, v4
1337; GFX8-NEXT:    v_and_b32_sdwa v0, v0, v2 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1338; GFX8-NEXT:    v_or_b32_e32 v0, v1, v0
1339; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
1340; GFX8-NEXT:    s_setpc_b64 s[30:31]
1341;
1342; GFX7-LABEL: extractelement_vgpr_v8i8_idx3:
1343; GFX7:       ; %bb.0:
1344; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1345; GFX7-NEXT:    s_mov_b32 s6, 0
1346; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1347; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1348; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
1349; GFX7-NEXT:    s_movk_i32 s4, 0xff
1350; GFX7-NEXT:    s_waitcnt vmcnt(0)
1351; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
1352; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
1353; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
1354; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
1355; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
1356; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
1357; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
1358; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
1359; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
1360; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
1361; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
1362; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
1363; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
1364; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
1365; GFX7-NEXT:    s_setpc_b64 s[30:31]
1366  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
1367  %element = extractelement <8 x i8> %vector, i32 3
1368  ret i8 %element
1369}
1370
1371define i8 @extractelement_vgpr_v8i8_idx4(<8 x i8> addrspace(1)* %ptr) {
1372; GFX9-LABEL: extractelement_vgpr_v8i8_idx4:
1373; GFX9:       ; %bb.0:
1374; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1375; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1376; GFX9-NEXT:    s_mov_b32 s4, 8
1377; GFX9-NEXT:    s_movk_i32 s5, 0xff
1378; GFX9-NEXT:    s_waitcnt vmcnt(0)
1379; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
1380; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1381; GFX9-NEXT:    v_and_b32_sdwa v2, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1382; GFX9-NEXT:    v_and_or_b32 v0, v1, s5, v0
1383; GFX9-NEXT:    v_and_b32_sdwa v1, v1, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1384; GFX9-NEXT:    v_or3_b32 v0, v0, v2, v1
1385; GFX9-NEXT:    s_setpc_b64 s[30:31]
1386;
1387; GFX8-LABEL: extractelement_vgpr_v8i8_idx4:
1388; GFX8:       ; %bb.0:
1389; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1390; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1391; GFX8-NEXT:    s_movk_i32 s4, 0xff
1392; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1393; GFX8-NEXT:    v_mov_b32_e32 v0, 8
1394; GFX8-NEXT:    v_mov_b32_e32 v2, s4
1395; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v1
1396; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1397; GFX8-NEXT:    v_and_b32_sdwa v4, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1398; GFX8-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1399; GFX8-NEXT:    v_or_b32_e32 v0, v0, v4
1400; GFX8-NEXT:    v_and_b32_sdwa v1, v1, v2 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1401; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
1402; GFX8-NEXT:    s_setpc_b64 s[30:31]
1403;
1404; GFX7-LABEL: extractelement_vgpr_v8i8_idx4:
1405; GFX7:       ; %bb.0:
1406; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1407; GFX7-NEXT:    s_mov_b32 s6, 0
1408; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1409; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1410; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
1411; GFX7-NEXT:    s_movk_i32 s4, 0xff
1412; GFX7-NEXT:    s_waitcnt vmcnt(0)
1413; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
1414; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v1
1415; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
1416; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
1417; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
1418; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
1419; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
1420; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
1421; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
1422; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
1423; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
1424; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
1425; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
1426; GFX7-NEXT:    s_setpc_b64 s[30:31]
1427  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
1428  %element = extractelement <8 x i8> %vector, i32 4
1429  ret i8 %element
1430}
1431
1432define i8 @extractelement_vgpr_v8i8_idx5(<8 x i8> addrspace(1)* %ptr) {
1433; GFX9-LABEL: extractelement_vgpr_v8i8_idx5:
1434; GFX9:       ; %bb.0:
1435; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1436; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1437; GFX9-NEXT:    s_mov_b32 s4, 8
1438; GFX9-NEXT:    s_movk_i32 s5, 0xff
1439; GFX9-NEXT:    s_waitcnt vmcnt(0)
1440; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
1441; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1442; GFX9-NEXT:    v_and_b32_sdwa v2, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1443; GFX9-NEXT:    v_and_or_b32 v0, v1, s5, v0
1444; GFX9-NEXT:    v_and_b32_sdwa v1, v1, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1445; GFX9-NEXT:    v_or3_b32 v0, v0, v2, v1
1446; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
1447; GFX9-NEXT:    s_setpc_b64 s[30:31]
1448;
1449; GFX8-LABEL: extractelement_vgpr_v8i8_idx5:
1450; GFX8:       ; %bb.0:
1451; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1452; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1453; GFX8-NEXT:    s_movk_i32 s4, 0xff
1454; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1455; GFX8-NEXT:    v_mov_b32_e32 v0, 8
1456; GFX8-NEXT:    v_mov_b32_e32 v2, s4
1457; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v1
1458; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1459; GFX8-NEXT:    v_and_b32_sdwa v4, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1460; GFX8-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1461; GFX8-NEXT:    v_or_b32_e32 v0, v0, v4
1462; GFX8-NEXT:    v_and_b32_sdwa v1, v1, v2 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1463; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
1464; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
1465; GFX8-NEXT:    s_setpc_b64 s[30:31]
1466;
1467; GFX7-LABEL: extractelement_vgpr_v8i8_idx5:
1468; GFX7:       ; %bb.0:
1469; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1470; GFX7-NEXT:    s_mov_b32 s6, 0
1471; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1472; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1473; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
1474; GFX7-NEXT:    s_movk_i32 s4, 0xff
1475; GFX7-NEXT:    s_waitcnt vmcnt(0)
1476; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
1477; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v1
1478; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
1479; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
1480; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
1481; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
1482; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
1483; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
1484; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
1485; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
1486; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
1487; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
1488; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
1489; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
1490; GFX7-NEXT:    s_setpc_b64 s[30:31]
1491  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
1492  %element = extractelement <8 x i8> %vector, i32 5
1493  ret i8 %element
1494}
1495
1496define i8 @extractelement_vgpr_v8i8_idx6(<8 x i8> addrspace(1)* %ptr) {
1497; GFX9-LABEL: extractelement_vgpr_v8i8_idx6:
1498; GFX9:       ; %bb.0:
1499; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1500; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1501; GFX9-NEXT:    s_mov_b32 s4, 8
1502; GFX9-NEXT:    s_movk_i32 s5, 0xff
1503; GFX9-NEXT:    s_waitcnt vmcnt(0)
1504; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
1505; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1506; GFX9-NEXT:    v_and_b32_sdwa v2, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1507; GFX9-NEXT:    v_and_or_b32 v0, v1, s5, v0
1508; GFX9-NEXT:    v_and_b32_sdwa v1, v1, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1509; GFX9-NEXT:    v_or3_b32 v0, v0, v2, v1
1510; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1511; GFX9-NEXT:    s_setpc_b64 s[30:31]
1512;
1513; GFX8-LABEL: extractelement_vgpr_v8i8_idx6:
1514; GFX8:       ; %bb.0:
1515; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1516; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1517; GFX8-NEXT:    s_movk_i32 s4, 0xff
1518; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1519; GFX8-NEXT:    v_mov_b32_e32 v0, 8
1520; GFX8-NEXT:    v_mov_b32_e32 v2, s4
1521; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v1
1522; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1523; GFX8-NEXT:    v_and_b32_sdwa v4, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1524; GFX8-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1525; GFX8-NEXT:    v_or_b32_e32 v0, v0, v4
1526; GFX8-NEXT:    v_and_b32_sdwa v1, v1, v2 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1527; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
1528; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1529; GFX8-NEXT:    s_setpc_b64 s[30:31]
1530;
1531; GFX7-LABEL: extractelement_vgpr_v8i8_idx6:
1532; GFX7:       ; %bb.0:
1533; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1534; GFX7-NEXT:    s_mov_b32 s6, 0
1535; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1536; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1537; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
1538; GFX7-NEXT:    s_movk_i32 s4, 0xff
1539; GFX7-NEXT:    s_waitcnt vmcnt(0)
1540; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
1541; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v1
1542; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
1543; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
1544; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
1545; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
1546; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
1547; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
1548; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
1549; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
1550; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
1551; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
1552; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
1553; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1554; GFX7-NEXT:    s_setpc_b64 s[30:31]
1555  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
1556  %element = extractelement <8 x i8> %vector, i32 6
1557  ret i8 %element
1558}
1559
1560define i8 @extractelement_vgpr_v8i8_idx7(<8 x i8> addrspace(1)* %ptr) {
1561; GFX9-LABEL: extractelement_vgpr_v8i8_idx7:
1562; GFX9:       ; %bb.0:
1563; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1564; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1565; GFX9-NEXT:    s_mov_b32 s4, 8
1566; GFX9-NEXT:    s_movk_i32 s5, 0xff
1567; GFX9-NEXT:    s_waitcnt vmcnt(0)
1568; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
1569; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1570; GFX9-NEXT:    v_and_b32_sdwa v2, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1571; GFX9-NEXT:    v_and_or_b32 v0, v1, s5, v0
1572; GFX9-NEXT:    v_and_b32_sdwa v1, v1, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1573; GFX9-NEXT:    v_or3_b32 v0, v0, v2, v1
1574; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
1575; GFX9-NEXT:    s_setpc_b64 s[30:31]
1576;
1577; GFX8-LABEL: extractelement_vgpr_v8i8_idx7:
1578; GFX8:       ; %bb.0:
1579; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1580; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1581; GFX8-NEXT:    s_movk_i32 s4, 0xff
1582; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1583; GFX8-NEXT:    v_mov_b32_e32 v0, 8
1584; GFX8-NEXT:    v_mov_b32_e32 v2, s4
1585; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v1
1586; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1587; GFX8-NEXT:    v_and_b32_sdwa v4, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1588; GFX8-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1589; GFX8-NEXT:    v_or_b32_e32 v0, v0, v4
1590; GFX8-NEXT:    v_and_b32_sdwa v1, v1, v2 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1591; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
1592; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
1593; GFX8-NEXT:    s_setpc_b64 s[30:31]
1594;
1595; GFX7-LABEL: extractelement_vgpr_v8i8_idx7:
1596; GFX7:       ; %bb.0:
1597; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1598; GFX7-NEXT:    s_mov_b32 s6, 0
1599; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1600; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1601; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
1602; GFX7-NEXT:    s_movk_i32 s4, 0xff
1603; GFX7-NEXT:    s_waitcnt vmcnt(0)
1604; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
1605; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v1
1606; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
1607; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
1608; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
1609; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
1610; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
1611; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
1612; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
1613; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
1614; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
1615; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
1616; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
1617; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
1618; GFX7-NEXT:    s_setpc_b64 s[30:31]
1619  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
1620  %element = extractelement <8 x i8> %vector, i32 7
1621  ret i8 %element
1622}
1623
1624define amdgpu_ps i8 @extractelement_sgpr_v16i8_sgpr_idx(<16 x i8> addrspace(4)* inreg %ptr, i32 inreg %idx) {
1625; GCN-LABEL: extractelement_sgpr_v16i8_sgpr_idx:
1626; GCN:       ; %bb.0:
1627; GCN-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
1628; GCN-NEXT:    s_movk_i32 s17, 0xff
1629; GCN-NEXT:    s_waitcnt lgkmcnt(0)
1630; GCN-NEXT:    s_lshr_b32 s5, s0, 8
1631; GCN-NEXT:    s_and_b32 s5, s5, s17
1632; GCN-NEXT:    s_lshr_b32 s6, s0, 16
1633; GCN-NEXT:    s_lshr_b32 s7, s0, 24
1634; GCN-NEXT:    s_and_b32 s0, s0, s17
1635; GCN-NEXT:    s_lshl_b32 s5, s5, 8
1636; GCN-NEXT:    s_or_b32 s0, s0, s5
1637; GCN-NEXT:    s_and_b32 s5, s6, s17
1638; GCN-NEXT:    s_lshl_b32 s5, s5, 16
1639; GCN-NEXT:    s_or_b32 s0, s0, s5
1640; GCN-NEXT:    s_and_b32 s5, s7, s17
1641; GCN-NEXT:    s_lshl_b32 s5, s5, 24
1642; GCN-NEXT:    s_lshr_b32 s8, s1, 8
1643; GCN-NEXT:    s_or_b32 s0, s0, s5
1644; GCN-NEXT:    s_and_b32 s5, s8, s17
1645; GCN-NEXT:    s_lshr_b32 s9, s1, 16
1646; GCN-NEXT:    s_lshr_b32 s10, s1, 24
1647; GCN-NEXT:    s_and_b32 s1, s1, s17
1648; GCN-NEXT:    s_lshl_b32 s5, s5, 8
1649; GCN-NEXT:    s_or_b32 s1, s1, s5
1650; GCN-NEXT:    s_and_b32 s5, s9, s17
1651; GCN-NEXT:    s_lshl_b32 s5, s5, 16
1652; GCN-NEXT:    s_or_b32 s1, s1, s5
1653; GCN-NEXT:    s_and_b32 s5, s10, s17
1654; GCN-NEXT:    s_lshl_b32 s5, s5, 24
1655; GCN-NEXT:    s_lshr_b32 s11, s2, 8
1656; GCN-NEXT:    s_or_b32 s1, s1, s5
1657; GCN-NEXT:    s_and_b32 s5, s11, s17
1658; GCN-NEXT:    s_lshr_b32 s12, s2, 16
1659; GCN-NEXT:    s_lshr_b32 s13, s2, 24
1660; GCN-NEXT:    s_and_b32 s2, s2, s17
1661; GCN-NEXT:    s_lshl_b32 s5, s5, 8
1662; GCN-NEXT:    s_or_b32 s2, s2, s5
1663; GCN-NEXT:    s_and_b32 s5, s12, s17
1664; GCN-NEXT:    s_lshl_b32 s5, s5, 16
1665; GCN-NEXT:    s_or_b32 s2, s2, s5
1666; GCN-NEXT:    s_and_b32 s5, s13, s17
1667; GCN-NEXT:    s_lshl_b32 s5, s5, 24
1668; GCN-NEXT:    s_lshr_b32 s14, s3, 8
1669; GCN-NEXT:    s_or_b32 s2, s2, s5
1670; GCN-NEXT:    s_and_b32 s5, s14, s17
1671; GCN-NEXT:    s_lshr_b32 s15, s3, 16
1672; GCN-NEXT:    s_lshr_b32 s16, s3, 24
1673; GCN-NEXT:    s_and_b32 s3, s3, s17
1674; GCN-NEXT:    s_lshl_b32 s5, s5, 8
1675; GCN-NEXT:    s_or_b32 s3, s3, s5
1676; GCN-NEXT:    s_and_b32 s5, s15, s17
1677; GCN-NEXT:    s_lshl_b32 s5, s5, 16
1678; GCN-NEXT:    s_or_b32 s3, s3, s5
1679; GCN-NEXT:    s_and_b32 s5, s16, s17
1680; GCN-NEXT:    s_lshl_b32 s5, s5, 24
1681; GCN-NEXT:    s_or_b32 s3, s3, s5
1682; GCN-NEXT:    s_lshr_b32 s5, s4, 2
1683; GCN-NEXT:    s_cmp_eq_u32 s5, 1
1684; GCN-NEXT:    s_cselect_b32 s0, s1, s0
1685; GCN-NEXT:    s_cmp_eq_u32 s5, 2
1686; GCN-NEXT:    s_cselect_b32 s0, s2, s0
1687; GCN-NEXT:    s_cmp_eq_u32 s5, 3
1688; GCN-NEXT:    s_cselect_b32 s0, s3, s0
1689; GCN-NEXT:    s_and_b32 s1, s4, 3
1690; GCN-NEXT:    s_lshl_b32 s1, s1, 3
1691; GCN-NEXT:    s_lshr_b32 s0, s0, s1
1692; GCN-NEXT:    ; return to shader part epilog
1693  %vector = load <16 x i8>, <16 x i8> addrspace(4)* %ptr
1694  %element = extractelement <16 x i8> %vector, i32 %idx
1695  ret i8 %element
1696}
1697
1698define amdgpu_ps i8 @extractelement_vgpr_v16i8_sgpr_idx(<16 x i8> addrspace(1)* %ptr, i32 inreg %idx) {
1699; GFX9-LABEL: extractelement_vgpr_v16i8_sgpr_idx:
1700; GFX9:       ; %bb.0:
1701; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
1702; GFX9-NEXT:    s_mov_b32 s0, 8
1703; GFX9-NEXT:    v_mov_b32_e32 v5, 8
1704; GFX9-NEXT:    s_movk_i32 s1, 0xff
1705; GFX9-NEXT:    v_mov_b32_e32 v4, 0xff
1706; GFX9-NEXT:    s_lshr_b32 s3, s2, 2
1707; GFX9-NEXT:    v_cmp_eq_u32_e64 vcc, s3, 1
1708; GFX9-NEXT:    s_and_b32 s2, s2, 3
1709; GFX9-NEXT:    s_waitcnt vmcnt(0)
1710; GFX9-NEXT:    v_lshrrev_b32_e32 v6, 8, v0
1711; GFX9-NEXT:    v_lshrrev_b32_e32 v7, 8, v1
1712; GFX9-NEXT:    v_lshrrev_b32_e32 v8, 8, v2
1713; GFX9-NEXT:    v_lshlrev_b32_sdwa v6, s0, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1714; GFX9-NEXT:    v_lshlrev_b32_sdwa v7, v5, v7 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1715; GFX9-NEXT:    v_lshrrev_b32_e32 v9, 8, v3
1716; GFX9-NEXT:    v_lshlrev_b32_sdwa v8, v5, v8 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1717; GFX9-NEXT:    v_and_b32_sdwa v10, v0, s1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1718; GFX9-NEXT:    v_and_b32_sdwa v11, v0, s1 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1719; GFX9-NEXT:    v_and_or_b32 v0, v0, s1, v6
1720; GFX9-NEXT:    v_and_b32_sdwa v12, v1, s1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1721; GFX9-NEXT:    v_and_b32_sdwa v13, v1, s1 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1722; GFX9-NEXT:    v_and_or_b32 v1, v1, s1, v7
1723; GFX9-NEXT:    v_and_b32_sdwa v14, v2, s1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1724; GFX9-NEXT:    v_and_b32_sdwa v15, v2, v4 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1725; GFX9-NEXT:    v_and_or_b32 v2, v2, s1, v8
1726; GFX9-NEXT:    v_lshlrev_b32_sdwa v5, v5, v9 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1727; GFX9-NEXT:    v_or3_b32 v0, v0, v10, v11
1728; GFX9-NEXT:    v_or3_b32 v1, v1, v12, v13
1729; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
1730; GFX9-NEXT:    v_and_b32_sdwa v16, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1731; GFX9-NEXT:    v_and_b32_sdwa v17, v3, v4 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1732; GFX9-NEXT:    v_and_or_b32 v3, v3, v4, v5
1733; GFX9-NEXT:    v_or3_b32 v2, v2, v14, v15
1734; GFX9-NEXT:    v_cmp_eq_u32_e64 vcc, s3, 2
1735; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc
1736; GFX9-NEXT:    v_or3_b32 v3, v3, v16, v17
1737; GFX9-NEXT:    v_cmp_eq_u32_e64 vcc, s3, 3
1738; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
1739; GFX9-NEXT:    s_lshl_b32 s0, s2, 3
1740; GFX9-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
1741; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
1742; GFX9-NEXT:    ; return to shader part epilog
1743;
1744; GFX8-LABEL: extractelement_vgpr_v16i8_sgpr_idx:
1745; GFX8:       ; %bb.0:
1746; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
1747; GFX8-NEXT:    s_movk_i32 s0, 0xff
1748; GFX8-NEXT:    v_mov_b32_e32 v5, 8
1749; GFX8-NEXT:    v_mov_b32_e32 v6, 8
1750; GFX8-NEXT:    v_mov_b32_e32 v7, s0
1751; GFX8-NEXT:    v_mov_b32_e32 v4, 0xff
1752; GFX8-NEXT:    s_lshr_b32 s0, s2, 2
1753; GFX8-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 1
1754; GFX8-NEXT:    s_and_b32 s1, s2, 3
1755; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1756; GFX8-NEXT:    v_lshrrev_b32_e32 v8, 8, v0
1757; GFX8-NEXT:    v_lshrrev_b32_e32 v9, 8, v1
1758; GFX8-NEXT:    v_lshlrev_b32_sdwa v5, v5, v8 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1759; GFX8-NEXT:    v_lshrrev_b32_e32 v10, 8, v2
1760; GFX8-NEXT:    v_lshlrev_b32_sdwa v8, v6, v9 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1761; GFX8-NEXT:    v_lshrrev_b32_e32 v11, 8, v3
1762; GFX8-NEXT:    v_lshlrev_b32_sdwa v9, v6, v10 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1763; GFX8-NEXT:    v_and_b32_sdwa v12, v0, v7 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1764; GFX8-NEXT:    v_and_b32_sdwa v13, v0, v7 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1765; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1766; GFX8-NEXT:    v_and_b32_sdwa v14, v1, v7 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1767; GFX8-NEXT:    v_and_b32_sdwa v7, v1, v7 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1768; GFX8-NEXT:    v_or_b32_sdwa v1, v1, v8 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1769; GFX8-NEXT:    v_or_b32_e32 v0, v0, v12
1770; GFX8-NEXT:    v_or_b32_e32 v1, v1, v14
1771; GFX8-NEXT:    v_and_b32_sdwa v15, v2, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1772; GFX8-NEXT:    v_and_b32_sdwa v16, v2, v4 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1773; GFX8-NEXT:    v_or_b32_sdwa v2, v2, v9 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1774; GFX8-NEXT:    v_lshlrev_b32_sdwa v6, v6, v11 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1775; GFX8-NEXT:    v_or_b32_e32 v2, v2, v15
1776; GFX8-NEXT:    v_and_b32_sdwa v17, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1777; GFX8-NEXT:    v_and_b32_sdwa v4, v3, v4 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1778; GFX8-NEXT:    v_or_b32_sdwa v3, v3, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1779; GFX8-NEXT:    v_or_b32_e32 v0, v0, v13
1780; GFX8-NEXT:    v_or_b32_e32 v1, v1, v7
1781; GFX8-NEXT:    v_or_b32_e32 v3, v3, v17
1782; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
1783; GFX8-NEXT:    v_or_b32_e32 v2, v2, v16
1784; GFX8-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 2
1785; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc
1786; GFX8-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 3
1787; GFX8-NEXT:    v_or_b32_e32 v3, v3, v4
1788; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
1789; GFX8-NEXT:    s_lshl_b32 s0, s1, 3
1790; GFX8-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
1791; GFX8-NEXT:    v_readfirstlane_b32 s0, v0
1792; GFX8-NEXT:    ; return to shader part epilog
1793;
1794; GFX7-LABEL: extractelement_vgpr_v16i8_sgpr_idx:
1795; GFX7:       ; %bb.0:
1796; GFX7-NEXT:    s_mov_b32 s6, 0
1797; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1798; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1799; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
1800; GFX7-NEXT:    s_movk_i32 s0, 0xff
1801; GFX7-NEXT:    v_mov_b32_e32 v4, 0xff
1802; GFX7-NEXT:    s_lshr_b32 s1, s2, 2
1803; GFX7-NEXT:    v_cmp_eq_u32_e64 vcc, s1, 1
1804; GFX7-NEXT:    s_and_b32 s2, s2, 3
1805; GFX7-NEXT:    s_waitcnt vmcnt(0)
1806; GFX7-NEXT:    v_lshrrev_b32_e32 v5, 8, v0
1807; GFX7-NEXT:    v_lshrrev_b32_e32 v8, 8, v1
1808; GFX7-NEXT:    v_lshrrev_b32_e32 v6, 16, v0
1809; GFX7-NEXT:    v_lshrrev_b32_e32 v9, 16, v1
1810; GFX7-NEXT:    v_lshrrev_b32_e32 v11, 8, v2
1811; GFX7-NEXT:    v_and_b32_e32 v5, s0, v5
1812; GFX7-NEXT:    v_and_b32_e32 v8, s0, v8
1813; GFX7-NEXT:    v_lshrrev_b32_e32 v7, 24, v0
1814; GFX7-NEXT:    v_lshrrev_b32_e32 v10, 24, v1
1815; GFX7-NEXT:    v_lshrrev_b32_e32 v12, 16, v2
1816; GFX7-NEXT:    v_lshrrev_b32_e32 v14, 8, v3
1817; GFX7-NEXT:    v_and_b32_e32 v6, s0, v6
1818; GFX7-NEXT:    v_and_b32_e32 v9, s0, v9
1819; GFX7-NEXT:    v_and_b32_e32 v11, v11, v4
1820; GFX7-NEXT:    v_and_b32_e32 v0, s0, v0
1821; GFX7-NEXT:    v_lshlrev_b32_e32 v5, 8, v5
1822; GFX7-NEXT:    v_and_b32_e32 v1, s0, v1
1823; GFX7-NEXT:    v_lshlrev_b32_e32 v8, 8, v8
1824; GFX7-NEXT:    v_lshrrev_b32_e32 v13, 24, v2
1825; GFX7-NEXT:    v_lshrrev_b32_e32 v15, 16, v3
1826; GFX7-NEXT:    v_and_b32_e32 v7, s0, v7
1827; GFX7-NEXT:    v_and_b32_e32 v10, s0, v10
1828; GFX7-NEXT:    v_and_b32_e32 v12, v12, v4
1829; GFX7-NEXT:    v_and_b32_e32 v14, v14, v4
1830; GFX7-NEXT:    v_and_b32_e32 v2, s0, v2
1831; GFX7-NEXT:    v_lshlrev_b32_e32 v11, 8, v11
1832; GFX7-NEXT:    v_lshlrev_b32_e32 v6, 16, v6
1833; GFX7-NEXT:    v_or_b32_e32 v0, v0, v5
1834; GFX7-NEXT:    v_lshlrev_b32_e32 v9, 16, v9
1835; GFX7-NEXT:    v_or_b32_e32 v1, v1, v8
1836; GFX7-NEXT:    v_and_b32_e32 v13, v13, v4
1837; GFX7-NEXT:    v_and_b32_e32 v15, v15, v4
1838; GFX7-NEXT:    v_lshrrev_b32_e32 v16, 24, v3
1839; GFX7-NEXT:    v_and_b32_e32 v3, v3, v4
1840; GFX7-NEXT:    v_lshlrev_b32_e32 v14, 8, v14
1841; GFX7-NEXT:    v_lshlrev_b32_e32 v7, 24, v7
1842; GFX7-NEXT:    v_or_b32_e32 v0, v0, v6
1843; GFX7-NEXT:    v_lshlrev_b32_e32 v10, 24, v10
1844; GFX7-NEXT:    v_or_b32_e32 v1, v1, v9
1845; GFX7-NEXT:    v_lshlrev_b32_e32 v12, 16, v12
1846; GFX7-NEXT:    v_or_b32_e32 v2, v2, v11
1847; GFX7-NEXT:    v_and_b32_e32 v4, v16, v4
1848; GFX7-NEXT:    v_lshlrev_b32_e32 v13, 24, v13
1849; GFX7-NEXT:    v_or_b32_e32 v2, v2, v12
1850; GFX7-NEXT:    v_lshlrev_b32_e32 v15, 16, v15
1851; GFX7-NEXT:    v_or_b32_e32 v3, v3, v14
1852; GFX7-NEXT:    v_or_b32_e32 v0, v0, v7
1853; GFX7-NEXT:    v_or_b32_e32 v1, v1, v10
1854; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
1855; GFX7-NEXT:    v_lshlrev_b32_e32 v4, 24, v4
1856; GFX7-NEXT:    v_or_b32_e32 v3, v3, v15
1857; GFX7-NEXT:    v_or_b32_e32 v2, v2, v13
1858; GFX7-NEXT:    v_cmp_eq_u32_e64 vcc, s1, 2
1859; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc
1860; GFX7-NEXT:    v_or_b32_e32 v3, v3, v4
1861; GFX7-NEXT:    v_cmp_eq_u32_e64 vcc, s1, 3
1862; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
1863; GFX7-NEXT:    s_lshl_b32 s0, s2, 3
1864; GFX7-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
1865; GFX7-NEXT:    v_readfirstlane_b32 s0, v0
1866; GFX7-NEXT:    ; return to shader part epilog
1867  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
1868  %element = extractelement <16 x i8> %vector, i32 %idx
1869  ret i8 %element
1870}
1871
1872define i8 @extractelement_vgpr_v16i8_vgpr_idx(<16 x i8> addrspace(1)* %ptr, i32 %idx) {
1873; GFX9-LABEL: extractelement_vgpr_v16i8_vgpr_idx:
1874; GFX9:       ; %bb.0:
1875; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1876; GFX9-NEXT:    global_load_dwordx4 v[3:6], v[0:1], off
1877; GFX9-NEXT:    s_mov_b32 s4, 8
1878; GFX9-NEXT:    v_mov_b32_e32 v1, 8
1879; GFX9-NEXT:    s_movk_i32 s5, 0xff
1880; GFX9-NEXT:    v_mov_b32_e32 v0, 0xff
1881; GFX9-NEXT:    v_lshrrev_b32_e32 v7, 2, v2
1882; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v7
1883; GFX9-NEXT:    v_and_b32_e32 v2, 3, v2
1884; GFX9-NEXT:    s_waitcnt vmcnt(0)
1885; GFX9-NEXT:    v_lshrrev_b32_e32 v8, 8, v3
1886; GFX9-NEXT:    v_lshrrev_b32_e32 v9, 8, v4
1887; GFX9-NEXT:    v_lshrrev_b32_e32 v10, 8, v5
1888; GFX9-NEXT:    v_lshrrev_b32_e32 v11, 8, v6
1889; GFX9-NEXT:    v_lshlrev_b32_sdwa v8, s4, v8 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1890; GFX9-NEXT:    v_lshlrev_b32_sdwa v9, v1, v9 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1891; GFX9-NEXT:    v_lshlrev_b32_sdwa v10, v1, v10 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1892; GFX9-NEXT:    v_and_b32_sdwa v12, v3, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1893; GFX9-NEXT:    v_and_b32_sdwa v13, v3, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1894; GFX9-NEXT:    v_and_b32_sdwa v14, v4, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1895; GFX9-NEXT:    v_and_b32_sdwa v15, v4, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1896; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, v1, v11 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1897; GFX9-NEXT:    v_and_or_b32 v3, v3, s5, v8
1898; GFX9-NEXT:    v_and_or_b32 v4, v4, s5, v9
1899; GFX9-NEXT:    v_and_b32_sdwa v16, v5, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1900; GFX9-NEXT:    v_and_b32_sdwa v17, v5, v0 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1901; GFX9-NEXT:    v_and_b32_sdwa v18, v6, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1902; GFX9-NEXT:    v_and_b32_sdwa v19, v6, v0 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1903; GFX9-NEXT:    v_and_or_b32 v0, v6, v0, v1
1904; GFX9-NEXT:    v_or3_b32 v1, v3, v12, v13
1905; GFX9-NEXT:    v_or3_b32 v3, v4, v14, v15
1906; GFX9-NEXT:    v_and_or_b32 v5, v5, s5, v10
1907; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc
1908; GFX9-NEXT:    v_or3_b32 v4, v5, v16, v17
1909; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v7
1910; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v4, vcc
1911; GFX9-NEXT:    v_or3_b32 v0, v0, v18, v19
1912; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v7
1913; GFX9-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc
1914; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 3, v2
1915; GFX9-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
1916; GFX9-NEXT:    s_setpc_b64 s[30:31]
1917;
1918; GFX8-LABEL: extractelement_vgpr_v16i8_vgpr_idx:
1919; GFX8:       ; %bb.0:
1920; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1921; GFX8-NEXT:    flat_load_dwordx4 v[3:6], v[0:1]
1922; GFX8-NEXT:    s_movk_i32 s4, 0xff
1923; GFX8-NEXT:    v_mov_b32_e32 v1, 8
1924; GFX8-NEXT:    v_mov_b32_e32 v7, 8
1925; GFX8-NEXT:    v_mov_b32_e32 v8, s4
1926; GFX8-NEXT:    v_mov_b32_e32 v0, 0xff
1927; GFX8-NEXT:    v_lshrrev_b32_e32 v9, 2, v2
1928; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v9
1929; GFX8-NEXT:    v_and_b32_e32 v2, 3, v2
1930; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1931; GFX8-NEXT:    v_lshrrev_b32_e32 v10, 8, v3
1932; GFX8-NEXT:    v_lshrrev_b32_e32 v11, 8, v4
1933; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v10 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1934; GFX8-NEXT:    v_lshrrev_b32_e32 v12, 8, v5
1935; GFX8-NEXT:    v_lshlrev_b32_sdwa v10, v7, v11 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1936; GFX8-NEXT:    v_lshrrev_b32_e32 v13, 8, v6
1937; GFX8-NEXT:    v_lshlrev_b32_sdwa v11, v7, v12 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1938; GFX8-NEXT:    v_and_b32_sdwa v14, v3, v8 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1939; GFX8-NEXT:    v_or_b32_sdwa v1, v3, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1940; GFX8-NEXT:    v_and_b32_sdwa v15, v3, v8 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1941; GFX8-NEXT:    v_and_b32_sdwa v16, v4, v8 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1942; GFX8-NEXT:    v_or_b32_sdwa v3, v4, v10 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1943; GFX8-NEXT:    v_or_b32_e32 v1, v1, v14
1944; GFX8-NEXT:    v_and_b32_sdwa v8, v4, v8 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1945; GFX8-NEXT:    v_or_b32_e32 v3, v3, v16
1946; GFX8-NEXT:    v_and_b32_sdwa v17, v5, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1947; GFX8-NEXT:    v_or_b32_sdwa v4, v5, v11 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1948; GFX8-NEXT:    v_lshlrev_b32_sdwa v7, v7, v13 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1949; GFX8-NEXT:    v_and_b32_sdwa v18, v5, v0 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1950; GFX8-NEXT:    v_or_b32_e32 v4, v4, v17
1951; GFX8-NEXT:    v_and_b32_sdwa v19, v6, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1952; GFX8-NEXT:    v_or_b32_sdwa v5, v6, v7 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1953; GFX8-NEXT:    v_or_b32_e32 v1, v1, v15
1954; GFX8-NEXT:    v_or_b32_e32 v3, v3, v8
1955; GFX8-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc
1956; GFX8-NEXT:    v_and_b32_sdwa v0, v6, v0 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
1957; GFX8-NEXT:    v_or_b32_e32 v5, v5, v19
1958; GFX8-NEXT:    v_or_b32_e32 v4, v4, v18
1959; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v9
1960; GFX8-NEXT:    v_cndmask_b32_e32 v1, v1, v4, vcc
1961; GFX8-NEXT:    v_or_b32_e32 v0, v5, v0
1962; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v9
1963; GFX8-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc
1964; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 3, v2
1965; GFX8-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
1966; GFX8-NEXT:    s_setpc_b64 s[30:31]
1967;
1968; GFX7-LABEL: extractelement_vgpr_v16i8_vgpr_idx:
1969; GFX7:       ; %bb.0:
1970; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1971; GFX7-NEXT:    s_mov_b32 s6, 0
1972; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1973; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1974; GFX7-NEXT:    buffer_load_dwordx4 v[3:6], v[0:1], s[4:7], 0 addr64
1975; GFX7-NEXT:    s_movk_i32 s4, 0xff
1976; GFX7-NEXT:    v_mov_b32_e32 v0, 0xff
1977; GFX7-NEXT:    v_lshrrev_b32_e32 v18, 2, v2
1978; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v18
1979; GFX7-NEXT:    v_and_b32_e32 v2, 3, v2
1980; GFX7-NEXT:    s_waitcnt vmcnt(0)
1981; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 8, v3
1982; GFX7-NEXT:    v_lshrrev_b32_e32 v9, 8, v4
1983; GFX7-NEXT:    v_lshrrev_b32_e32 v7, 16, v3
1984; GFX7-NEXT:    v_lshrrev_b32_e32 v10, 16, v4
1985; GFX7-NEXT:    v_lshrrev_b32_e32 v12, 8, v5
1986; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
1987; GFX7-NEXT:    v_and_b32_e32 v9, s4, v9
1988; GFX7-NEXT:    v_lshrrev_b32_e32 v8, 24, v3
1989; GFX7-NEXT:    v_lshrrev_b32_e32 v11, 24, v4
1990; GFX7-NEXT:    v_lshrrev_b32_e32 v13, 16, v5
1991; GFX7-NEXT:    v_lshrrev_b32_e32 v15, 8, v6
1992; GFX7-NEXT:    v_and_b32_e32 v7, s4, v7
1993; GFX7-NEXT:    v_and_b32_e32 v10, s4, v10
1994; GFX7-NEXT:    v_and_b32_e32 v12, v12, v0
1995; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
1996; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
1997; GFX7-NEXT:    v_and_b32_e32 v4, s4, v4
1998; GFX7-NEXT:    v_lshlrev_b32_e32 v9, 8, v9
1999; GFX7-NEXT:    v_lshrrev_b32_e32 v14, 24, v5
2000; GFX7-NEXT:    v_lshrrev_b32_e32 v16, 16, v6
2001; GFX7-NEXT:    v_and_b32_e32 v8, s4, v8
2002; GFX7-NEXT:    v_and_b32_e32 v11, s4, v11
2003; GFX7-NEXT:    v_and_b32_e32 v13, v13, v0
2004; GFX7-NEXT:    v_and_b32_e32 v15, v15, v0
2005; GFX7-NEXT:    v_or_b32_e32 v1, v3, v1
2006; GFX7-NEXT:    v_lshlrev_b32_e32 v7, 16, v7
2007; GFX7-NEXT:    v_and_b32_e32 v5, s4, v5
2008; GFX7-NEXT:    v_lshlrev_b32_e32 v10, 16, v10
2009; GFX7-NEXT:    v_or_b32_e32 v3, v4, v9
2010; GFX7-NEXT:    v_lshlrev_b32_e32 v12, 8, v12
2011; GFX7-NEXT:    v_and_b32_e32 v14, v14, v0
2012; GFX7-NEXT:    v_and_b32_e32 v16, v16, v0
2013; GFX7-NEXT:    v_lshrrev_b32_e32 v17, 24, v6
2014; GFX7-NEXT:    v_and_b32_e32 v6, v6, v0
2015; GFX7-NEXT:    v_lshlrev_b32_e32 v8, 24, v8
2016; GFX7-NEXT:    v_or_b32_e32 v1, v1, v7
2017; GFX7-NEXT:    v_lshlrev_b32_e32 v11, 24, v11
2018; GFX7-NEXT:    v_or_b32_e32 v3, v3, v10
2019; GFX7-NEXT:    v_lshlrev_b32_e32 v13, 16, v13
2020; GFX7-NEXT:    v_or_b32_e32 v4, v5, v12
2021; GFX7-NEXT:    v_lshlrev_b32_e32 v15, 8, v15
2022; GFX7-NEXT:    v_and_b32_e32 v0, v17, v0
2023; GFX7-NEXT:    v_lshlrev_b32_e32 v14, 24, v14
2024; GFX7-NEXT:    v_or_b32_e32 v4, v4, v13
2025; GFX7-NEXT:    v_lshlrev_b32_e32 v16, 16, v16
2026; GFX7-NEXT:    v_or_b32_e32 v5, v6, v15
2027; GFX7-NEXT:    v_or_b32_e32 v1, v1, v8
2028; GFX7-NEXT:    v_or_b32_e32 v3, v3, v11
2029; GFX7-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc
2030; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 24, v0
2031; GFX7-NEXT:    v_or_b32_e32 v5, v5, v16
2032; GFX7-NEXT:    v_or_b32_e32 v4, v4, v14
2033; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v18
2034; GFX7-NEXT:    v_cndmask_b32_e32 v1, v1, v4, vcc
2035; GFX7-NEXT:    v_or_b32_e32 v0, v5, v0
2036; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v18
2037; GFX7-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc
2038; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 3, v2
2039; GFX7-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
2040; GFX7-NEXT:    s_setpc_b64 s[30:31]
2041  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
2042  %element = extractelement <16 x i8> %vector, i32 %idx
2043  ret i8 %element
2044}
2045
2046define amdgpu_ps i8 @extractelement_sgpr_v16i8_vgpr_idx(<16 x i8> addrspace(4)* inreg %ptr, i32 %idx) {
2047; GCN-LABEL: extractelement_sgpr_v16i8_vgpr_idx:
2048; GCN:       ; %bb.0:
2049; GCN-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
2050; GCN-NEXT:    s_movk_i32 s16, 0xff
2051; GCN-NEXT:    v_lshrrev_b32_e32 v1, 2, v0
2052; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v1
2053; GCN-NEXT:    v_and_b32_e32 v0, 3, v0
2054; GCN-NEXT:    s_waitcnt lgkmcnt(0)
2055; GCN-NEXT:    s_lshr_b32 s4, s0, 8
2056; GCN-NEXT:    s_and_b32 s4, s4, s16
2057; GCN-NEXT:    s_lshr_b32 s5, s0, 16
2058; GCN-NEXT:    s_lshr_b32 s6, s0, 24
2059; GCN-NEXT:    s_and_b32 s0, s0, s16
2060; GCN-NEXT:    s_lshl_b32 s4, s4, 8
2061; GCN-NEXT:    s_or_b32 s0, s0, s4
2062; GCN-NEXT:    s_and_b32 s4, s5, s16
2063; GCN-NEXT:    s_lshl_b32 s4, s4, 16
2064; GCN-NEXT:    s_or_b32 s0, s0, s4
2065; GCN-NEXT:    s_and_b32 s4, s6, s16
2066; GCN-NEXT:    s_lshl_b32 s4, s4, 24
2067; GCN-NEXT:    s_lshr_b32 s7, s1, 8
2068; GCN-NEXT:    s_or_b32 s0, s0, s4
2069; GCN-NEXT:    s_and_b32 s4, s7, s16
2070; GCN-NEXT:    s_lshr_b32 s8, s1, 16
2071; GCN-NEXT:    s_lshr_b32 s9, s1, 24
2072; GCN-NEXT:    s_and_b32 s1, s1, s16
2073; GCN-NEXT:    s_lshl_b32 s4, s4, 8
2074; GCN-NEXT:    s_or_b32 s1, s1, s4
2075; GCN-NEXT:    s_and_b32 s4, s8, s16
2076; GCN-NEXT:    s_lshl_b32 s4, s4, 16
2077; GCN-NEXT:    s_or_b32 s1, s1, s4
2078; GCN-NEXT:    s_and_b32 s4, s9, s16
2079; GCN-NEXT:    s_lshl_b32 s4, s4, 24
2080; GCN-NEXT:    s_lshr_b32 s10, s2, 8
2081; GCN-NEXT:    s_or_b32 s1, s1, s4
2082; GCN-NEXT:    s_and_b32 s4, s10, s16
2083; GCN-NEXT:    s_lshr_b32 s11, s2, 16
2084; GCN-NEXT:    s_lshr_b32 s12, s2, 24
2085; GCN-NEXT:    s_and_b32 s2, s2, s16
2086; GCN-NEXT:    s_lshl_b32 s4, s4, 8
2087; GCN-NEXT:    s_or_b32 s2, s2, s4
2088; GCN-NEXT:    s_and_b32 s4, s11, s16
2089; GCN-NEXT:    s_lshl_b32 s4, s4, 16
2090; GCN-NEXT:    s_or_b32 s2, s2, s4
2091; GCN-NEXT:    s_and_b32 s4, s12, s16
2092; GCN-NEXT:    s_lshl_b32 s4, s4, 24
2093; GCN-NEXT:    s_lshr_b32 s13, s3, 8
2094; GCN-NEXT:    s_or_b32 s2, s2, s4
2095; GCN-NEXT:    s_and_b32 s4, s13, s16
2096; GCN-NEXT:    s_lshr_b32 s14, s3, 16
2097; GCN-NEXT:    s_lshr_b32 s15, s3, 24
2098; GCN-NEXT:    s_and_b32 s3, s3, s16
2099; GCN-NEXT:    s_lshl_b32 s4, s4, 8
2100; GCN-NEXT:    s_or_b32 s3, s3, s4
2101; GCN-NEXT:    s_and_b32 s4, s14, s16
2102; GCN-NEXT:    s_lshl_b32 s4, s4, 16
2103; GCN-NEXT:    s_or_b32 s3, s3, s4
2104; GCN-NEXT:    s_and_b32 s4, s15, s16
2105; GCN-NEXT:    s_lshl_b32 s4, s4, 24
2106; GCN-NEXT:    v_mov_b32_e32 v2, s0
2107; GCN-NEXT:    v_mov_b32_e32 v3, s1
2108; GCN-NEXT:    s_or_b32 s3, s3, s4
2109; GCN-NEXT:    v_cndmask_b32_e32 v2, v2, v3, vcc
2110; GCN-NEXT:    v_mov_b32_e32 v4, s2
2111; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v1
2112; GCN-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
2113; GCN-NEXT:    v_mov_b32_e32 v5, s3
2114; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v1
2115; GCN-NEXT:    v_cndmask_b32_e32 v1, v2, v5, vcc
2116; GCN-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
2117; GCN-NEXT:    v_lshrrev_b32_e32 v0, v0, v1
2118; GCN-NEXT:    v_readfirstlane_b32 s0, v0
2119; GCN-NEXT:    ; return to shader part epilog
2120  %vector = load <16 x i8>, <16 x i8> addrspace(4)* %ptr
2121  %element = extractelement <16 x i8> %vector, i32 %idx
2122  ret i8 %element
2123}
2124
2125define i8 @extractelement_vgpr_v16i8_idx0(<16 x i8> addrspace(1)* %ptr) {
2126; GFX9-LABEL: extractelement_vgpr_v16i8_idx0:
2127; GFX9:       ; %bb.0:
2128; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2129; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
2130; GFX9-NEXT:    s_mov_b32 s4, 8
2131; GFX9-NEXT:    s_movk_i32 s5, 0xff
2132; GFX9-NEXT:    s_waitcnt vmcnt(0)
2133; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
2134; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2135; GFX9-NEXT:    v_and_b32_sdwa v2, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2136; GFX9-NEXT:    v_and_or_b32 v1, v0, s5, v1
2137; GFX9-NEXT:    v_and_b32_sdwa v0, v0, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2138; GFX9-NEXT:    v_or3_b32 v0, v1, v2, v0
2139; GFX9-NEXT:    s_setpc_b64 s[30:31]
2140;
2141; GFX8-LABEL: extractelement_vgpr_v16i8_idx0:
2142; GFX8:       ; %bb.0:
2143; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2144; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
2145; GFX8-NEXT:    s_movk_i32 s4, 0xff
2146; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2147; GFX8-NEXT:    v_mov_b32_e32 v1, 8
2148; GFX8-NEXT:    v_mov_b32_e32 v2, s4
2149; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v0
2150; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2151; GFX8-NEXT:    v_and_b32_sdwa v4, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2152; GFX8-NEXT:    v_or_b32_sdwa v1, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2153; GFX8-NEXT:    v_or_b32_e32 v1, v1, v4
2154; GFX8-NEXT:    v_and_b32_sdwa v0, v0, v2 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2155; GFX8-NEXT:    v_or_b32_e32 v0, v1, v0
2156; GFX8-NEXT:    s_setpc_b64 s[30:31]
2157;
2158; GFX7-LABEL: extractelement_vgpr_v16i8_idx0:
2159; GFX7:       ; %bb.0:
2160; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2161; GFX7-NEXT:    s_mov_b32 s6, 0
2162; GFX7-NEXT:    s_mov_b32 s7, 0xf000
2163; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2164; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
2165; GFX7-NEXT:    s_movk_i32 s4, 0xff
2166; GFX7-NEXT:    s_waitcnt vmcnt(0)
2167; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
2168; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
2169; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
2170; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
2171; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
2172; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
2173; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
2174; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
2175; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
2176; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
2177; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
2178; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
2179; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
2180; GFX7-NEXT:    s_setpc_b64 s[30:31]
2181  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
2182  %element = extractelement <16 x i8> %vector, i32 0
2183  ret i8 %element
2184}
2185
2186define i8 @extractelement_vgpr_v16i8_idx1(<16 x i8> addrspace(1)* %ptr) {
2187; GFX9-LABEL: extractelement_vgpr_v16i8_idx1:
2188; GFX9:       ; %bb.0:
2189; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2190; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
2191; GFX9-NEXT:    s_mov_b32 s4, 8
2192; GFX9-NEXT:    s_movk_i32 s5, 0xff
2193; GFX9-NEXT:    s_waitcnt vmcnt(0)
2194; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
2195; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2196; GFX9-NEXT:    v_and_b32_sdwa v2, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2197; GFX9-NEXT:    v_and_or_b32 v1, v0, s5, v1
2198; GFX9-NEXT:    v_and_b32_sdwa v0, v0, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2199; GFX9-NEXT:    v_or3_b32 v0, v1, v2, v0
2200; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
2201; GFX9-NEXT:    s_setpc_b64 s[30:31]
2202;
2203; GFX8-LABEL: extractelement_vgpr_v16i8_idx1:
2204; GFX8:       ; %bb.0:
2205; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2206; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
2207; GFX8-NEXT:    s_movk_i32 s4, 0xff
2208; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2209; GFX8-NEXT:    v_mov_b32_e32 v1, 8
2210; GFX8-NEXT:    v_mov_b32_e32 v2, s4
2211; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v0
2212; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2213; GFX8-NEXT:    v_and_b32_sdwa v4, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2214; GFX8-NEXT:    v_or_b32_sdwa v1, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2215; GFX8-NEXT:    v_or_b32_e32 v1, v1, v4
2216; GFX8-NEXT:    v_and_b32_sdwa v0, v0, v2 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2217; GFX8-NEXT:    v_or_b32_e32 v0, v1, v0
2218; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
2219; GFX8-NEXT:    s_setpc_b64 s[30:31]
2220;
2221; GFX7-LABEL: extractelement_vgpr_v16i8_idx1:
2222; GFX7:       ; %bb.0:
2223; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2224; GFX7-NEXT:    s_mov_b32 s6, 0
2225; GFX7-NEXT:    s_mov_b32 s7, 0xf000
2226; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2227; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
2228; GFX7-NEXT:    s_movk_i32 s4, 0xff
2229; GFX7-NEXT:    s_waitcnt vmcnt(0)
2230; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
2231; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
2232; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
2233; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
2234; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
2235; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
2236; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
2237; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
2238; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
2239; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
2240; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
2241; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
2242; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
2243; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
2244; GFX7-NEXT:    s_setpc_b64 s[30:31]
2245  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
2246  %element = extractelement <16 x i8> %vector, i32 1
2247  ret i8 %element
2248}
2249
2250define i8 @extractelement_vgpr_v16i8_idx2(<16 x i8> addrspace(1)* %ptr) {
2251; GFX9-LABEL: extractelement_vgpr_v16i8_idx2:
2252; GFX9:       ; %bb.0:
2253; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2254; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
2255; GFX9-NEXT:    s_mov_b32 s4, 8
2256; GFX9-NEXT:    s_movk_i32 s5, 0xff
2257; GFX9-NEXT:    s_waitcnt vmcnt(0)
2258; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
2259; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2260; GFX9-NEXT:    v_and_b32_sdwa v2, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2261; GFX9-NEXT:    v_and_or_b32 v1, v0, s5, v1
2262; GFX9-NEXT:    v_and_b32_sdwa v0, v0, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2263; GFX9-NEXT:    v_or3_b32 v0, v1, v2, v0
2264; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
2265; GFX9-NEXT:    s_setpc_b64 s[30:31]
2266;
2267; GFX8-LABEL: extractelement_vgpr_v16i8_idx2:
2268; GFX8:       ; %bb.0:
2269; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2270; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
2271; GFX8-NEXT:    s_movk_i32 s4, 0xff
2272; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2273; GFX8-NEXT:    v_mov_b32_e32 v1, 8
2274; GFX8-NEXT:    v_mov_b32_e32 v2, s4
2275; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v0
2276; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2277; GFX8-NEXT:    v_and_b32_sdwa v4, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2278; GFX8-NEXT:    v_or_b32_sdwa v1, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2279; GFX8-NEXT:    v_or_b32_e32 v1, v1, v4
2280; GFX8-NEXT:    v_and_b32_sdwa v0, v0, v2 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2281; GFX8-NEXT:    v_or_b32_e32 v0, v1, v0
2282; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
2283; GFX8-NEXT:    s_setpc_b64 s[30:31]
2284;
2285; GFX7-LABEL: extractelement_vgpr_v16i8_idx2:
2286; GFX7:       ; %bb.0:
2287; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2288; GFX7-NEXT:    s_mov_b32 s6, 0
2289; GFX7-NEXT:    s_mov_b32 s7, 0xf000
2290; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2291; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
2292; GFX7-NEXT:    s_movk_i32 s4, 0xff
2293; GFX7-NEXT:    s_waitcnt vmcnt(0)
2294; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
2295; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
2296; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
2297; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
2298; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
2299; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
2300; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
2301; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
2302; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
2303; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
2304; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
2305; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
2306; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
2307; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
2308; GFX7-NEXT:    s_setpc_b64 s[30:31]
2309  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
2310  %element = extractelement <16 x i8> %vector, i32 2
2311  ret i8 %element
2312}
2313
2314define i8 @extractelement_vgpr_v16i8_idx3(<16 x i8> addrspace(1)* %ptr) {
2315; GFX9-LABEL: extractelement_vgpr_v16i8_idx3:
2316; GFX9:       ; %bb.0:
2317; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2318; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
2319; GFX9-NEXT:    s_mov_b32 s4, 8
2320; GFX9-NEXT:    s_movk_i32 s5, 0xff
2321; GFX9-NEXT:    s_waitcnt vmcnt(0)
2322; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
2323; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2324; GFX9-NEXT:    v_and_b32_sdwa v2, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2325; GFX9-NEXT:    v_and_or_b32 v1, v0, s5, v1
2326; GFX9-NEXT:    v_and_b32_sdwa v0, v0, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2327; GFX9-NEXT:    v_or3_b32 v0, v1, v2, v0
2328; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
2329; GFX9-NEXT:    s_setpc_b64 s[30:31]
2330;
2331; GFX8-LABEL: extractelement_vgpr_v16i8_idx3:
2332; GFX8:       ; %bb.0:
2333; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2334; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
2335; GFX8-NEXT:    s_movk_i32 s4, 0xff
2336; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2337; GFX8-NEXT:    v_mov_b32_e32 v1, 8
2338; GFX8-NEXT:    v_mov_b32_e32 v2, s4
2339; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v0
2340; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2341; GFX8-NEXT:    v_and_b32_sdwa v4, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2342; GFX8-NEXT:    v_or_b32_sdwa v1, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2343; GFX8-NEXT:    v_or_b32_e32 v1, v1, v4
2344; GFX8-NEXT:    v_and_b32_sdwa v0, v0, v2 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2345; GFX8-NEXT:    v_or_b32_e32 v0, v1, v0
2346; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
2347; GFX8-NEXT:    s_setpc_b64 s[30:31]
2348;
2349; GFX7-LABEL: extractelement_vgpr_v16i8_idx3:
2350; GFX7:       ; %bb.0:
2351; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2352; GFX7-NEXT:    s_mov_b32 s6, 0
2353; GFX7-NEXT:    s_mov_b32 s7, 0xf000
2354; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2355; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
2356; GFX7-NEXT:    s_movk_i32 s4, 0xff
2357; GFX7-NEXT:    s_waitcnt vmcnt(0)
2358; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
2359; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
2360; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
2361; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
2362; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
2363; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
2364; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
2365; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
2366; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
2367; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
2368; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
2369; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
2370; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
2371; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
2372; GFX7-NEXT:    s_setpc_b64 s[30:31]
2373  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
2374  %element = extractelement <16 x i8> %vector, i32 3
2375  ret i8 %element
2376}
2377
2378define i8 @extractelement_vgpr_v16i8_idx4(<16 x i8> addrspace(1)* %ptr) {
2379; GFX9-LABEL: extractelement_vgpr_v16i8_idx4:
2380; GFX9:       ; %bb.0:
2381; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2382; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
2383; GFX9-NEXT:    s_mov_b32 s4, 8
2384; GFX9-NEXT:    s_movk_i32 s5, 0xff
2385; GFX9-NEXT:    s_waitcnt vmcnt(0)
2386; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
2387; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2388; GFX9-NEXT:    v_and_b32_sdwa v2, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2389; GFX9-NEXT:    v_and_or_b32 v0, v1, s5, v0
2390; GFX9-NEXT:    v_and_b32_sdwa v1, v1, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2391; GFX9-NEXT:    v_or3_b32 v0, v0, v2, v1
2392; GFX9-NEXT:    s_setpc_b64 s[30:31]
2393;
2394; GFX8-LABEL: extractelement_vgpr_v16i8_idx4:
2395; GFX8:       ; %bb.0:
2396; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2397; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
2398; GFX8-NEXT:    s_movk_i32 s4, 0xff
2399; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2400; GFX8-NEXT:    v_mov_b32_e32 v0, 8
2401; GFX8-NEXT:    v_mov_b32_e32 v2, s4
2402; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v1
2403; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2404; GFX8-NEXT:    v_and_b32_sdwa v4, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2405; GFX8-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2406; GFX8-NEXT:    v_or_b32_e32 v0, v0, v4
2407; GFX8-NEXT:    v_and_b32_sdwa v1, v1, v2 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2408; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
2409; GFX8-NEXT:    s_setpc_b64 s[30:31]
2410;
2411; GFX7-LABEL: extractelement_vgpr_v16i8_idx4:
2412; GFX7:       ; %bb.0:
2413; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2414; GFX7-NEXT:    s_mov_b32 s6, 0
2415; GFX7-NEXT:    s_mov_b32 s7, 0xf000
2416; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2417; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
2418; GFX7-NEXT:    s_movk_i32 s4, 0xff
2419; GFX7-NEXT:    s_waitcnt vmcnt(0)
2420; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
2421; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v1
2422; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
2423; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
2424; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
2425; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
2426; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
2427; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
2428; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
2429; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
2430; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
2431; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
2432; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
2433; GFX7-NEXT:    s_setpc_b64 s[30:31]
2434  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
2435  %element = extractelement <16 x i8> %vector, i32 4
2436  ret i8 %element
2437}
2438
2439define i8 @extractelement_vgpr_v16i8_idx5(<16 x i8> addrspace(1)* %ptr) {
2440; GFX9-LABEL: extractelement_vgpr_v16i8_idx5:
2441; GFX9:       ; %bb.0:
2442; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2443; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
2444; GFX9-NEXT:    s_mov_b32 s4, 8
2445; GFX9-NEXT:    s_movk_i32 s5, 0xff
2446; GFX9-NEXT:    s_waitcnt vmcnt(0)
2447; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
2448; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2449; GFX9-NEXT:    v_and_b32_sdwa v2, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2450; GFX9-NEXT:    v_and_or_b32 v0, v1, s5, v0
2451; GFX9-NEXT:    v_and_b32_sdwa v1, v1, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2452; GFX9-NEXT:    v_or3_b32 v0, v0, v2, v1
2453; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
2454; GFX9-NEXT:    s_setpc_b64 s[30:31]
2455;
2456; GFX8-LABEL: extractelement_vgpr_v16i8_idx5:
2457; GFX8:       ; %bb.0:
2458; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2459; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
2460; GFX8-NEXT:    s_movk_i32 s4, 0xff
2461; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2462; GFX8-NEXT:    v_mov_b32_e32 v0, 8
2463; GFX8-NEXT:    v_mov_b32_e32 v2, s4
2464; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v1
2465; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2466; GFX8-NEXT:    v_and_b32_sdwa v4, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2467; GFX8-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2468; GFX8-NEXT:    v_or_b32_e32 v0, v0, v4
2469; GFX8-NEXT:    v_and_b32_sdwa v1, v1, v2 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2470; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
2471; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
2472; GFX8-NEXT:    s_setpc_b64 s[30:31]
2473;
2474; GFX7-LABEL: extractelement_vgpr_v16i8_idx5:
2475; GFX7:       ; %bb.0:
2476; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2477; GFX7-NEXT:    s_mov_b32 s6, 0
2478; GFX7-NEXT:    s_mov_b32 s7, 0xf000
2479; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2480; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
2481; GFX7-NEXT:    s_movk_i32 s4, 0xff
2482; GFX7-NEXT:    s_waitcnt vmcnt(0)
2483; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
2484; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v1
2485; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
2486; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
2487; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
2488; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
2489; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
2490; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
2491; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
2492; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
2493; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
2494; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
2495; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
2496; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
2497; GFX7-NEXT:    s_setpc_b64 s[30:31]
2498  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
2499  %element = extractelement <16 x i8> %vector, i32 5
2500  ret i8 %element
2501}
2502
2503define i8 @extractelement_vgpr_v16i8_idx6(<16 x i8> addrspace(1)* %ptr) {
2504; GFX9-LABEL: extractelement_vgpr_v16i8_idx6:
2505; GFX9:       ; %bb.0:
2506; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2507; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
2508; GFX9-NEXT:    s_mov_b32 s4, 8
2509; GFX9-NEXT:    s_movk_i32 s5, 0xff
2510; GFX9-NEXT:    s_waitcnt vmcnt(0)
2511; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
2512; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2513; GFX9-NEXT:    v_and_b32_sdwa v2, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2514; GFX9-NEXT:    v_and_or_b32 v0, v1, s5, v0
2515; GFX9-NEXT:    v_and_b32_sdwa v1, v1, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2516; GFX9-NEXT:    v_or3_b32 v0, v0, v2, v1
2517; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
2518; GFX9-NEXT:    s_setpc_b64 s[30:31]
2519;
2520; GFX8-LABEL: extractelement_vgpr_v16i8_idx6:
2521; GFX8:       ; %bb.0:
2522; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2523; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
2524; GFX8-NEXT:    s_movk_i32 s4, 0xff
2525; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2526; GFX8-NEXT:    v_mov_b32_e32 v0, 8
2527; GFX8-NEXT:    v_mov_b32_e32 v2, s4
2528; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v1
2529; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2530; GFX8-NEXT:    v_and_b32_sdwa v4, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2531; GFX8-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2532; GFX8-NEXT:    v_or_b32_e32 v0, v0, v4
2533; GFX8-NEXT:    v_and_b32_sdwa v1, v1, v2 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2534; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
2535; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
2536; GFX8-NEXT:    s_setpc_b64 s[30:31]
2537;
2538; GFX7-LABEL: extractelement_vgpr_v16i8_idx6:
2539; GFX7:       ; %bb.0:
2540; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2541; GFX7-NEXT:    s_mov_b32 s6, 0
2542; GFX7-NEXT:    s_mov_b32 s7, 0xf000
2543; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2544; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
2545; GFX7-NEXT:    s_movk_i32 s4, 0xff
2546; GFX7-NEXT:    s_waitcnt vmcnt(0)
2547; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
2548; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v1
2549; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
2550; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
2551; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
2552; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
2553; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
2554; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
2555; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
2556; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
2557; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
2558; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
2559; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
2560; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
2561; GFX7-NEXT:    s_setpc_b64 s[30:31]
2562  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
2563  %element = extractelement <16 x i8> %vector, i32 6
2564  ret i8 %element
2565}
2566
2567define i8 @extractelement_vgpr_v16i8_idx7(<16 x i8> addrspace(1)* %ptr) {
2568; GFX9-LABEL: extractelement_vgpr_v16i8_idx7:
2569; GFX9:       ; %bb.0:
2570; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2571; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
2572; GFX9-NEXT:    s_mov_b32 s4, 8
2573; GFX9-NEXT:    s_movk_i32 s5, 0xff
2574; GFX9-NEXT:    s_waitcnt vmcnt(0)
2575; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
2576; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2577; GFX9-NEXT:    v_and_b32_sdwa v2, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2578; GFX9-NEXT:    v_and_or_b32 v0, v1, s5, v0
2579; GFX9-NEXT:    v_and_b32_sdwa v1, v1, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2580; GFX9-NEXT:    v_or3_b32 v0, v0, v2, v1
2581; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
2582; GFX9-NEXT:    s_setpc_b64 s[30:31]
2583;
2584; GFX8-LABEL: extractelement_vgpr_v16i8_idx7:
2585; GFX8:       ; %bb.0:
2586; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2587; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
2588; GFX8-NEXT:    s_movk_i32 s4, 0xff
2589; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2590; GFX8-NEXT:    v_mov_b32_e32 v0, 8
2591; GFX8-NEXT:    v_mov_b32_e32 v2, s4
2592; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v1
2593; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2594; GFX8-NEXT:    v_and_b32_sdwa v4, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2595; GFX8-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2596; GFX8-NEXT:    v_or_b32_e32 v0, v0, v4
2597; GFX8-NEXT:    v_and_b32_sdwa v1, v1, v2 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2598; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
2599; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
2600; GFX8-NEXT:    s_setpc_b64 s[30:31]
2601;
2602; GFX7-LABEL: extractelement_vgpr_v16i8_idx7:
2603; GFX7:       ; %bb.0:
2604; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2605; GFX7-NEXT:    s_mov_b32 s6, 0
2606; GFX7-NEXT:    s_mov_b32 s7, 0xf000
2607; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2608; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
2609; GFX7-NEXT:    s_movk_i32 s4, 0xff
2610; GFX7-NEXT:    s_waitcnt vmcnt(0)
2611; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
2612; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v1
2613; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
2614; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
2615; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
2616; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
2617; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
2618; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
2619; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
2620; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
2621; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
2622; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
2623; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
2624; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
2625; GFX7-NEXT:    s_setpc_b64 s[30:31]
2626  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
2627  %element = extractelement <16 x i8> %vector, i32 7
2628  ret i8 %element
2629}
2630
2631define i8 @extractelement_vgpr_v16i8_idx8(<16 x i8> addrspace(1)* %ptr) {
2632; GFX9-LABEL: extractelement_vgpr_v16i8_idx8:
2633; GFX9:       ; %bb.0:
2634; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2635; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
2636; GFX9-NEXT:    s_mov_b32 s4, 8
2637; GFX9-NEXT:    s_movk_i32 s5, 0xff
2638; GFX9-NEXT:    s_waitcnt vmcnt(0)
2639; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v2
2640; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2641; GFX9-NEXT:    v_and_b32_sdwa v1, v2, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2642; GFX9-NEXT:    v_and_or_b32 v0, v2, s5, v0
2643; GFX9-NEXT:    v_and_b32_sdwa v2, v2, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2644; GFX9-NEXT:    v_or3_b32 v0, v0, v1, v2
2645; GFX9-NEXT:    s_setpc_b64 s[30:31]
2646;
2647; GFX8-LABEL: extractelement_vgpr_v16i8_idx8:
2648; GFX8:       ; %bb.0:
2649; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2650; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
2651; GFX8-NEXT:    s_movk_i32 s4, 0xff
2652; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2653; GFX8-NEXT:    v_mov_b32_e32 v0, 8
2654; GFX8-NEXT:    v_mov_b32_e32 v1, s4
2655; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v2
2656; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2657; GFX8-NEXT:    v_and_b32_sdwa v4, v2, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2658; GFX8-NEXT:    v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2659; GFX8-NEXT:    v_or_b32_e32 v0, v0, v4
2660; GFX8-NEXT:    v_and_b32_sdwa v1, v2, v1 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2661; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
2662; GFX8-NEXT:    s_setpc_b64 s[30:31]
2663;
2664; GFX7-LABEL: extractelement_vgpr_v16i8_idx8:
2665; GFX7:       ; %bb.0:
2666; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2667; GFX7-NEXT:    s_mov_b32 s6, 0
2668; GFX7-NEXT:    s_mov_b32 s7, 0xf000
2669; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2670; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
2671; GFX7-NEXT:    s_movk_i32 s4, 0xff
2672; GFX7-NEXT:    s_waitcnt vmcnt(0)
2673; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v2
2674; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 16, v2
2675; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
2676; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v2
2677; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
2678; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
2679; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
2680; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
2681; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
2682; GFX7-NEXT:    v_or_b32_e32 v0, v2, v0
2683; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
2684; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
2685; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
2686; GFX7-NEXT:    s_setpc_b64 s[30:31]
2687  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
2688  %element = extractelement <16 x i8> %vector, i32 8
2689  ret i8 %element
2690}
2691
2692define i8 @extractelement_vgpr_v16i8_idx9(<16 x i8> addrspace(1)* %ptr) {
2693; GFX9-LABEL: extractelement_vgpr_v16i8_idx9:
2694; GFX9:       ; %bb.0:
2695; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2696; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
2697; GFX9-NEXT:    s_mov_b32 s4, 8
2698; GFX9-NEXT:    s_movk_i32 s5, 0xff
2699; GFX9-NEXT:    s_waitcnt vmcnt(0)
2700; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v2
2701; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2702; GFX9-NEXT:    v_and_b32_sdwa v1, v2, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2703; GFX9-NEXT:    v_and_or_b32 v0, v2, s5, v0
2704; GFX9-NEXT:    v_and_b32_sdwa v2, v2, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2705; GFX9-NEXT:    v_or3_b32 v0, v0, v1, v2
2706; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
2707; GFX9-NEXT:    s_setpc_b64 s[30:31]
2708;
2709; GFX8-LABEL: extractelement_vgpr_v16i8_idx9:
2710; GFX8:       ; %bb.0:
2711; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2712; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
2713; GFX8-NEXT:    s_movk_i32 s4, 0xff
2714; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2715; GFX8-NEXT:    v_mov_b32_e32 v0, 8
2716; GFX8-NEXT:    v_mov_b32_e32 v1, s4
2717; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v2
2718; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2719; GFX8-NEXT:    v_and_b32_sdwa v4, v2, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2720; GFX8-NEXT:    v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2721; GFX8-NEXT:    v_or_b32_e32 v0, v0, v4
2722; GFX8-NEXT:    v_and_b32_sdwa v1, v2, v1 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2723; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
2724; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
2725; GFX8-NEXT:    s_setpc_b64 s[30:31]
2726;
2727; GFX7-LABEL: extractelement_vgpr_v16i8_idx9:
2728; GFX7:       ; %bb.0:
2729; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2730; GFX7-NEXT:    s_mov_b32 s6, 0
2731; GFX7-NEXT:    s_mov_b32 s7, 0xf000
2732; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2733; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
2734; GFX7-NEXT:    s_movk_i32 s4, 0xff
2735; GFX7-NEXT:    s_waitcnt vmcnt(0)
2736; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v2
2737; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 16, v2
2738; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
2739; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v2
2740; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
2741; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
2742; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
2743; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
2744; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
2745; GFX7-NEXT:    v_or_b32_e32 v0, v2, v0
2746; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
2747; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
2748; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
2749; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
2750; GFX7-NEXT:    s_setpc_b64 s[30:31]
2751  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
2752  %element = extractelement <16 x i8> %vector, i32 9
2753  ret i8 %element
2754}
2755
2756define i8 @extractelement_vgpr_v16i8_idx10(<16 x i8> addrspace(1)* %ptr) {
2757; GFX9-LABEL: extractelement_vgpr_v16i8_idx10:
2758; GFX9:       ; %bb.0:
2759; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2760; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
2761; GFX9-NEXT:    s_mov_b32 s4, 8
2762; GFX9-NEXT:    s_movk_i32 s5, 0xff
2763; GFX9-NEXT:    s_waitcnt vmcnt(0)
2764; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v2
2765; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2766; GFX9-NEXT:    v_and_b32_sdwa v1, v2, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2767; GFX9-NEXT:    v_and_or_b32 v0, v2, s5, v0
2768; GFX9-NEXT:    v_and_b32_sdwa v2, v2, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2769; GFX9-NEXT:    v_or3_b32 v0, v0, v1, v2
2770; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
2771; GFX9-NEXT:    s_setpc_b64 s[30:31]
2772;
2773; GFX8-LABEL: extractelement_vgpr_v16i8_idx10:
2774; GFX8:       ; %bb.0:
2775; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2776; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
2777; GFX8-NEXT:    s_movk_i32 s4, 0xff
2778; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2779; GFX8-NEXT:    v_mov_b32_e32 v0, 8
2780; GFX8-NEXT:    v_mov_b32_e32 v1, s4
2781; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v2
2782; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2783; GFX8-NEXT:    v_and_b32_sdwa v4, v2, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2784; GFX8-NEXT:    v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2785; GFX8-NEXT:    v_or_b32_e32 v0, v0, v4
2786; GFX8-NEXT:    v_and_b32_sdwa v1, v2, v1 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2787; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
2788; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
2789; GFX8-NEXT:    s_setpc_b64 s[30:31]
2790;
2791; GFX7-LABEL: extractelement_vgpr_v16i8_idx10:
2792; GFX7:       ; %bb.0:
2793; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2794; GFX7-NEXT:    s_mov_b32 s6, 0
2795; GFX7-NEXT:    s_mov_b32 s7, 0xf000
2796; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2797; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
2798; GFX7-NEXT:    s_movk_i32 s4, 0xff
2799; GFX7-NEXT:    s_waitcnt vmcnt(0)
2800; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v2
2801; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 16, v2
2802; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
2803; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v2
2804; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
2805; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
2806; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
2807; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
2808; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
2809; GFX7-NEXT:    v_or_b32_e32 v0, v2, v0
2810; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
2811; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
2812; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
2813; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
2814; GFX7-NEXT:    s_setpc_b64 s[30:31]
2815  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
2816  %element = extractelement <16 x i8> %vector, i32 10
2817  ret i8 %element
2818}
2819
2820define i8 @extractelement_vgpr_v16i8_idx11(<16 x i8> addrspace(1)* %ptr) {
2821; GFX9-LABEL: extractelement_vgpr_v16i8_idx11:
2822; GFX9:       ; %bb.0:
2823; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2824; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
2825; GFX9-NEXT:    s_mov_b32 s4, 8
2826; GFX9-NEXT:    s_movk_i32 s5, 0xff
2827; GFX9-NEXT:    s_waitcnt vmcnt(0)
2828; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v2
2829; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2830; GFX9-NEXT:    v_and_b32_sdwa v1, v2, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2831; GFX9-NEXT:    v_and_or_b32 v0, v2, s5, v0
2832; GFX9-NEXT:    v_and_b32_sdwa v2, v2, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2833; GFX9-NEXT:    v_or3_b32 v0, v0, v1, v2
2834; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
2835; GFX9-NEXT:    s_setpc_b64 s[30:31]
2836;
2837; GFX8-LABEL: extractelement_vgpr_v16i8_idx11:
2838; GFX8:       ; %bb.0:
2839; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2840; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
2841; GFX8-NEXT:    s_movk_i32 s4, 0xff
2842; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2843; GFX8-NEXT:    v_mov_b32_e32 v0, 8
2844; GFX8-NEXT:    v_mov_b32_e32 v1, s4
2845; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v2
2846; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2847; GFX8-NEXT:    v_and_b32_sdwa v4, v2, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2848; GFX8-NEXT:    v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2849; GFX8-NEXT:    v_or_b32_e32 v0, v0, v4
2850; GFX8-NEXT:    v_and_b32_sdwa v1, v2, v1 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2851; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
2852; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
2853; GFX8-NEXT:    s_setpc_b64 s[30:31]
2854;
2855; GFX7-LABEL: extractelement_vgpr_v16i8_idx11:
2856; GFX7:       ; %bb.0:
2857; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2858; GFX7-NEXT:    s_mov_b32 s6, 0
2859; GFX7-NEXT:    s_mov_b32 s7, 0xf000
2860; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2861; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
2862; GFX7-NEXT:    s_movk_i32 s4, 0xff
2863; GFX7-NEXT:    s_waitcnt vmcnt(0)
2864; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v2
2865; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 16, v2
2866; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
2867; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v2
2868; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
2869; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
2870; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
2871; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
2872; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
2873; GFX7-NEXT:    v_or_b32_e32 v0, v2, v0
2874; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
2875; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
2876; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
2877; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
2878; GFX7-NEXT:    s_setpc_b64 s[30:31]
2879  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
2880  %element = extractelement <16 x i8> %vector, i32 11
2881  ret i8 %element
2882}
2883
2884define i8 @extractelement_vgpr_v16i8_idx12(<16 x i8> addrspace(1)* %ptr) {
2885; GFX9-LABEL: extractelement_vgpr_v16i8_idx12:
2886; GFX9:       ; %bb.0:
2887; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2888; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
2889; GFX9-NEXT:    s_mov_b32 s4, 8
2890; GFX9-NEXT:    s_movk_i32 s5, 0xff
2891; GFX9-NEXT:    s_waitcnt vmcnt(0)
2892; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v3
2893; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2894; GFX9-NEXT:    v_and_b32_sdwa v1, v3, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2895; GFX9-NEXT:    v_and_or_b32 v0, v3, s5, v0
2896; GFX9-NEXT:    v_and_b32_sdwa v2, v3, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2897; GFX9-NEXT:    v_or3_b32 v0, v0, v1, v2
2898; GFX9-NEXT:    s_setpc_b64 s[30:31]
2899;
2900; GFX8-LABEL: extractelement_vgpr_v16i8_idx12:
2901; GFX8:       ; %bb.0:
2902; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2903; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
2904; GFX8-NEXT:    s_movk_i32 s4, 0xff
2905; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2906; GFX8-NEXT:    v_mov_b32_e32 v0, 8
2907; GFX8-NEXT:    v_mov_b32_e32 v1, s4
2908; GFX8-NEXT:    v_lshrrev_b32_e32 v2, 8, v3
2909; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2910; GFX8-NEXT:    v_and_b32_sdwa v4, v3, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2911; GFX8-NEXT:    v_or_b32_sdwa v0, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2912; GFX8-NEXT:    v_or_b32_e32 v0, v0, v4
2913; GFX8-NEXT:    v_and_b32_sdwa v1, v3, v1 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2914; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
2915; GFX8-NEXT:    s_setpc_b64 s[30:31]
2916;
2917; GFX7-LABEL: extractelement_vgpr_v16i8_idx12:
2918; GFX7:       ; %bb.0:
2919; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2920; GFX7-NEXT:    s_mov_b32 s6, 0
2921; GFX7-NEXT:    s_mov_b32 s7, 0xf000
2922; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2923; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
2924; GFX7-NEXT:    s_movk_i32 s4, 0xff
2925; GFX7-NEXT:    s_waitcnt vmcnt(0)
2926; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v3
2927; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 16, v3
2928; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
2929; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 24, v3
2930; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
2931; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
2932; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
2933; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
2934; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
2935; GFX7-NEXT:    v_or_b32_e32 v0, v3, v0
2936; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
2937; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
2938; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
2939; GFX7-NEXT:    s_setpc_b64 s[30:31]
2940  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
2941  %element = extractelement <16 x i8> %vector, i32 12
2942  ret i8 %element
2943}
2944
2945define i8 @extractelement_vgpr_v16i8_idx13(<16 x i8> addrspace(1)* %ptr) {
2946; GFX9-LABEL: extractelement_vgpr_v16i8_idx13:
2947; GFX9:       ; %bb.0:
2948; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2949; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
2950; GFX9-NEXT:    s_mov_b32 s4, 8
2951; GFX9-NEXT:    s_movk_i32 s5, 0xff
2952; GFX9-NEXT:    s_waitcnt vmcnt(0)
2953; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v3
2954; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2955; GFX9-NEXT:    v_and_b32_sdwa v1, v3, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2956; GFX9-NEXT:    v_and_or_b32 v0, v3, s5, v0
2957; GFX9-NEXT:    v_and_b32_sdwa v2, v3, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2958; GFX9-NEXT:    v_or3_b32 v0, v0, v1, v2
2959; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
2960; GFX9-NEXT:    s_setpc_b64 s[30:31]
2961;
2962; GFX8-LABEL: extractelement_vgpr_v16i8_idx13:
2963; GFX8:       ; %bb.0:
2964; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2965; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
2966; GFX8-NEXT:    s_movk_i32 s4, 0xff
2967; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2968; GFX8-NEXT:    v_mov_b32_e32 v0, 8
2969; GFX8-NEXT:    v_mov_b32_e32 v1, s4
2970; GFX8-NEXT:    v_lshrrev_b32_e32 v2, 8, v3
2971; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2972; GFX8-NEXT:    v_and_b32_sdwa v4, v3, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2973; GFX8-NEXT:    v_or_b32_sdwa v0, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2974; GFX8-NEXT:    v_or_b32_e32 v0, v0, v4
2975; GFX8-NEXT:    v_and_b32_sdwa v1, v3, v1 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
2976; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
2977; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
2978; GFX8-NEXT:    s_setpc_b64 s[30:31]
2979;
2980; GFX7-LABEL: extractelement_vgpr_v16i8_idx13:
2981; GFX7:       ; %bb.0:
2982; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2983; GFX7-NEXT:    s_mov_b32 s6, 0
2984; GFX7-NEXT:    s_mov_b32 s7, 0xf000
2985; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2986; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
2987; GFX7-NEXT:    s_movk_i32 s4, 0xff
2988; GFX7-NEXT:    s_waitcnt vmcnt(0)
2989; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v3
2990; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 16, v3
2991; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
2992; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 24, v3
2993; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
2994; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
2995; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
2996; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
2997; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
2998; GFX7-NEXT:    v_or_b32_e32 v0, v3, v0
2999; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
3000; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
3001; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
3002; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
3003; GFX7-NEXT:    s_setpc_b64 s[30:31]
3004  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
3005  %element = extractelement <16 x i8> %vector, i32 13
3006  ret i8 %element
3007}
3008
3009define i8 @extractelement_vgpr_v16i8_idx14(<16 x i8> addrspace(1)* %ptr) {
3010; GFX9-LABEL: extractelement_vgpr_v16i8_idx14:
3011; GFX9:       ; %bb.0:
3012; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3013; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3014; GFX9-NEXT:    s_mov_b32 s4, 8
3015; GFX9-NEXT:    s_movk_i32 s5, 0xff
3016; GFX9-NEXT:    s_waitcnt vmcnt(0)
3017; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v3
3018; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3019; GFX9-NEXT:    v_and_b32_sdwa v1, v3, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3020; GFX9-NEXT:    v_and_or_b32 v0, v3, s5, v0
3021; GFX9-NEXT:    v_and_b32_sdwa v2, v3, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
3022; GFX9-NEXT:    v_or3_b32 v0, v0, v1, v2
3023; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
3024; GFX9-NEXT:    s_setpc_b64 s[30:31]
3025;
3026; GFX8-LABEL: extractelement_vgpr_v16i8_idx14:
3027; GFX8:       ; %bb.0:
3028; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3029; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
3030; GFX8-NEXT:    s_movk_i32 s4, 0xff
3031; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3032; GFX8-NEXT:    v_mov_b32_e32 v0, 8
3033; GFX8-NEXT:    v_mov_b32_e32 v1, s4
3034; GFX8-NEXT:    v_lshrrev_b32_e32 v2, 8, v3
3035; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3036; GFX8-NEXT:    v_and_b32_sdwa v4, v3, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3037; GFX8-NEXT:    v_or_b32_sdwa v0, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
3038; GFX8-NEXT:    v_or_b32_e32 v0, v0, v4
3039; GFX8-NEXT:    v_and_b32_sdwa v1, v3, v1 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
3040; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3041; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
3042; GFX8-NEXT:    s_setpc_b64 s[30:31]
3043;
3044; GFX7-LABEL: extractelement_vgpr_v16i8_idx14:
3045; GFX7:       ; %bb.0:
3046; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3047; GFX7-NEXT:    s_mov_b32 s6, 0
3048; GFX7-NEXT:    s_mov_b32 s7, 0xf000
3049; GFX7-NEXT:    s_mov_b64 s[4:5], 0
3050; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
3051; GFX7-NEXT:    s_movk_i32 s4, 0xff
3052; GFX7-NEXT:    s_waitcnt vmcnt(0)
3053; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v3
3054; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 16, v3
3055; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
3056; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 24, v3
3057; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
3058; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
3059; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
3060; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
3061; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
3062; GFX7-NEXT:    v_or_b32_e32 v0, v3, v0
3063; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
3064; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
3065; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
3066; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
3067; GFX7-NEXT:    s_setpc_b64 s[30:31]
3068  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
3069  %element = extractelement <16 x i8> %vector, i32 14
3070  ret i8 %element
3071}
3072
3073define i8 @extractelement_vgpr_v16i8_idx15(<16 x i8> addrspace(1)* %ptr) {
3074; GFX9-LABEL: extractelement_vgpr_v16i8_idx15:
3075; GFX9:       ; %bb.0:
3076; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3077; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3078; GFX9-NEXT:    s_mov_b32 s4, 8
3079; GFX9-NEXT:    s_movk_i32 s5, 0xff
3080; GFX9-NEXT:    s_waitcnt vmcnt(0)
3081; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v3
3082; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3083; GFX9-NEXT:    v_and_b32_sdwa v1, v3, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3084; GFX9-NEXT:    v_and_or_b32 v0, v3, s5, v0
3085; GFX9-NEXT:    v_and_b32_sdwa v2, v3, s5 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
3086; GFX9-NEXT:    v_or3_b32 v0, v0, v1, v2
3087; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
3088; GFX9-NEXT:    s_setpc_b64 s[30:31]
3089;
3090; GFX8-LABEL: extractelement_vgpr_v16i8_idx15:
3091; GFX8:       ; %bb.0:
3092; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3093; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
3094; GFX8-NEXT:    s_movk_i32 s4, 0xff
3095; GFX8-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3096; GFX8-NEXT:    v_mov_b32_e32 v0, 8
3097; GFX8-NEXT:    v_mov_b32_e32 v1, s4
3098; GFX8-NEXT:    v_lshrrev_b32_e32 v2, 8, v3
3099; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3100; GFX8-NEXT:    v_and_b32_sdwa v4, v3, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3101; GFX8-NEXT:    v_or_b32_sdwa v0, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
3102; GFX8-NEXT:    v_or_b32_e32 v0, v0, v4
3103; GFX8-NEXT:    v_and_b32_sdwa v1, v3, v1 dst_sel:BYTE_3 dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD
3104; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3105; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
3106; GFX8-NEXT:    s_setpc_b64 s[30:31]
3107;
3108; GFX7-LABEL: extractelement_vgpr_v16i8_idx15:
3109; GFX7:       ; %bb.0:
3110; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3111; GFX7-NEXT:    s_mov_b32 s6, 0
3112; GFX7-NEXT:    s_mov_b32 s7, 0xf000
3113; GFX7-NEXT:    s_mov_b64 s[4:5], 0
3114; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
3115; GFX7-NEXT:    s_movk_i32 s4, 0xff
3116; GFX7-NEXT:    s_waitcnt vmcnt(0)
3117; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v3
3118; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 16, v3
3119; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
3120; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 24, v3
3121; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
3122; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
3123; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
3124; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
3125; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
3126; GFX7-NEXT:    v_or_b32_e32 v0, v3, v0
3127; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
3128; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
3129; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
3130; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
3131; GFX7-NEXT:    s_setpc_b64 s[30:31]
3132  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
3133  %element = extractelement <16 x i8> %vector, i32 15
3134  ret i8 %element
3135}
3136