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; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1010 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX10 %s
6
7define amdgpu_ps i8 @extractelement_sgpr_v4i8_sgpr_idx(<4 x i8> addrspace(4)* inreg %ptr, i32 inreg %idx) {
8; GCN-LABEL: extractelement_sgpr_v4i8_sgpr_idx:
9; GCN:       ; %bb.0:
10; GCN-NEXT:    s_load_dword s0, s[2:3], 0x0
11; GCN-NEXT:    s_movk_i32 s5, 0xff
12; GCN-NEXT:    s_waitcnt lgkmcnt(0)
13; GCN-NEXT:    s_lshr_b32 s1, s0, 8
14; GCN-NEXT:    s_and_b32 s1, s1, s5
15; GCN-NEXT:    s_lshr_b32 s2, s0, 16
16; GCN-NEXT:    s_lshr_b32 s3, s0, 24
17; GCN-NEXT:    s_and_b32 s0, s0, s5
18; GCN-NEXT:    s_lshl_b32 s1, s1, 8
19; GCN-NEXT:    s_or_b32 s0, s0, s1
20; GCN-NEXT:    s_and_b32 s1, s2, s5
21; GCN-NEXT:    s_lshl_b32 s1, s1, 16
22; GCN-NEXT:    s_or_b32 s0, s0, s1
23; GCN-NEXT:    s_lshl_b32 s1, s3, 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;
30; GFX10-LABEL: extractelement_sgpr_v4i8_sgpr_idx:
31; GFX10:       ; %bb.0:
32; GFX10-NEXT:    s_load_dword s0, s[2:3], 0x0
33; GFX10-NEXT:    s_movk_i32 s1, 0xff
34; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
35; GFX10-NEXT:    s_lshr_b32 s2, s0, 8
36; GFX10-NEXT:    s_lshr_b32 s3, s0, 16
37; GFX10-NEXT:    s_and_b32 s2, s2, s1
38; GFX10-NEXT:    s_lshr_b32 s5, s0, 24
39; GFX10-NEXT:    s_and_b32 s0, s0, s1
40; GFX10-NEXT:    s_and_b32 s1, s3, s1
41; GFX10-NEXT:    s_lshl_b32 s2, s2, 8
42; GFX10-NEXT:    s_lshl_b32 s1, s1, 16
43; GFX10-NEXT:    s_or_b32 s0, s0, s2
44; GFX10-NEXT:    s_lshl_b32 s2, s5, 24
45; GFX10-NEXT:    s_or_b32 s0, s0, s1
46; GFX10-NEXT:    s_and_b32 s1, s4, 3
47; GFX10-NEXT:    s_or_b32 s0, s0, s2
48; GFX10-NEXT:    s_lshl_b32 s1, s1, 3
49; GFX10-NEXT:    s_lshr_b32 s0, s0, s1
50; GFX10-NEXT:    ; return to shader part epilog
51  %vector = load <4 x i8>, <4 x i8> addrspace(4)* %ptr
52  %element = extractelement <4 x i8> %vector, i32 %idx
53  ret i8 %element
54}
55
56define amdgpu_ps i8 @extractelement_vgpr_v4i8_sgpr_idx(<4 x i8> addrspace(1)* %ptr, i32 inreg %idx) {
57; GFX9-LABEL: extractelement_vgpr_v4i8_sgpr_idx:
58; GFX9:       ; %bb.0:
59; GFX9-NEXT:    global_load_dword v0, v[0:1], off
60; GFX9-NEXT:    s_mov_b32 s0, 8
61; GFX9-NEXT:    s_movk_i32 s1, 0xff
62; GFX9-NEXT:    s_and_b32 s2, s2, 3
63; GFX9-NEXT:    s_waitcnt vmcnt(0)
64; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
65; GFX9-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
66; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, s0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
67; GFX9-NEXT:    v_and_b32_sdwa v3, v0, s1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
68; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 24, v2
69; GFX9-NEXT:    v_and_or_b32 v0, v0, s1, v1
70; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v2
71; GFX9-NEXT:    s_lshl_b32 s0, s2, 3
72; GFX9-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
73; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
74; GFX9-NEXT:    ; return to shader part epilog
75;
76; GFX8-LABEL: extractelement_vgpr_v4i8_sgpr_idx:
77; GFX8:       ; %bb.0:
78; GFX8-NEXT:    flat_load_dword v0, v[0:1]
79; GFX8-NEXT:    s_movk_i32 s0, 0xff
80; GFX8-NEXT:    v_mov_b32_e32 v1, 8
81; GFX8-NEXT:    v_mov_b32_e32 v2, s0
82; GFX8-NEXT:    s_and_b32 s0, s2, 3
83; GFX8-NEXT:    s_lshl_b32 s0, s0, 3
84; GFX8-NEXT:    s_waitcnt vmcnt(0)
85; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v0
86; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
87; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
88; GFX8-NEXT:    v_and_b32_sdwa v2, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
89; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
90; GFX8-NEXT:    v_lshlrev_b32_e32 v3, 24, v4
91; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
92; GFX8-NEXT:    v_or_b32_e32 v0, v0, v3
93; GFX8-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
94; GFX8-NEXT:    v_readfirstlane_b32 s0, v0
95; GFX8-NEXT:    ; return to shader part epilog
96;
97; GFX7-LABEL: extractelement_vgpr_v4i8_sgpr_idx:
98; GFX7:       ; %bb.0:
99; GFX7-NEXT:    s_mov_b32 s6, 0
100; GFX7-NEXT:    s_mov_b32 s7, 0xf000
101; GFX7-NEXT:    s_mov_b64 s[4:5], 0
102; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[4:7], 0 addr64
103; GFX7-NEXT:    s_movk_i32 s0, 0xff
104; GFX7-NEXT:    s_and_b32 s1, s2, 3
105; GFX7-NEXT:    s_waitcnt vmcnt(0)
106; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
107; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
108; GFX7-NEXT:    v_and_b32_e32 v1, s0, v1
109; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
110; GFX7-NEXT:    v_and_b32_e32 v2, s0, v2
111; GFX7-NEXT:    v_and_b32_e32 v0, s0, v0
112; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
113; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
114; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
115; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 24, v3
116; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
117; GFX7-NEXT:    v_or_b32_e32 v0, v0, v3
118; GFX7-NEXT:    s_lshl_b32 s0, s1, 3
119; GFX7-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
120; GFX7-NEXT:    v_readfirstlane_b32 s0, v0
121; GFX7-NEXT:    ; return to shader part epilog
122;
123; GFX10-LABEL: extractelement_vgpr_v4i8_sgpr_idx:
124; GFX10:       ; %bb.0:
125; GFX10-NEXT:    global_load_dword v0, v[0:1], off
126; GFX10-NEXT:    s_mov_b32 s0, 8
127; GFX10-NEXT:    s_waitcnt vmcnt(0)
128; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
129; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
130; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, s0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
131; GFX10-NEXT:    s_movk_i32 s0, 0xff
132; GFX10-NEXT:    v_and_b32_sdwa v3, v0, s0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
133; GFX10-NEXT:    v_and_or_b32 v0, v0, s0, v1
134; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
135; GFX10-NEXT:    s_and_b32 s0, s2, 3
136; GFX10-NEXT:    s_lshl_b32 s0, s0, 3
137; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
138; GFX10-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
139; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
140; GFX10-NEXT:    ; return to shader part epilog
141  %vector = load <4 x i8>, <4 x i8> addrspace(1)* %ptr
142  %element = extractelement <4 x i8> %vector, i32 %idx
143  ret i8 %element
144}
145
146define i8 @extractelement_vgpr_v4i8_vgpr_idx(<4 x i8> addrspace(1)* %ptr, i32 %idx) {
147; GFX9-LABEL: extractelement_vgpr_v4i8_vgpr_idx:
148; GFX9:       ; %bb.0:
149; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
150; GFX9-NEXT:    global_load_dword v0, v[0:1], off
151; GFX9-NEXT:    v_and_b32_e32 v1, 3, v2
152; GFX9-NEXT:    s_mov_b32 s4, 8
153; GFX9-NEXT:    s_movk_i32 s5, 0xff
154; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
155; GFX9-NEXT:    s_waitcnt vmcnt(0)
156; GFX9-NEXT:    v_lshrrev_b32_e32 v2, 8, v0
157; GFX9-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
158; GFX9-NEXT:    v_lshlrev_b32_sdwa v2, s4, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
159; GFX9-NEXT:    v_and_b32_sdwa v4, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
160; GFX9-NEXT:    v_lshlrev_b32_e32 v3, 24, v3
161; GFX9-NEXT:    v_and_or_b32 v0, v0, s5, v2
162; GFX9-NEXT:    v_or3_b32 v0, v0, v4, v3
163; GFX9-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
164; GFX9-NEXT:    s_setpc_b64 s[30:31]
165;
166; GFX8-LABEL: extractelement_vgpr_v4i8_vgpr_idx:
167; GFX8:       ; %bb.0:
168; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
169; GFX8-NEXT:    flat_load_dword v0, v[0:1]
170; GFX8-NEXT:    s_movk_i32 s4, 0xff
171; GFX8-NEXT:    v_mov_b32_e32 v1, 8
172; GFX8-NEXT:    v_mov_b32_e32 v3, s4
173; GFX8-NEXT:    v_and_b32_e32 v2, 3, v2
174; GFX8-NEXT:    s_waitcnt vmcnt(0)
175; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 8, v0
176; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
177; GFX8-NEXT:    v_lshrrev_b32_e32 v5, 24, v0
178; GFX8-NEXT:    v_and_b32_sdwa v3, v0, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
179; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
180; GFX8-NEXT:    v_lshlrev_b32_e32 v4, 24, v5
181; GFX8-NEXT:    v_or_b32_e32 v0, v0, v3
182; GFX8-NEXT:    v_or_b32_e32 v0, v0, v4
183; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 3, v2
184; GFX8-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
185; GFX8-NEXT:    s_setpc_b64 s[30:31]
186;
187; GFX7-LABEL: extractelement_vgpr_v4i8_vgpr_idx:
188; GFX7:       ; %bb.0:
189; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
190; GFX7-NEXT:    s_mov_b32 s6, 0
191; GFX7-NEXT:    s_mov_b32 s7, 0xf000
192; GFX7-NEXT:    s_mov_b64 s[4:5], 0
193; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[4:7], 0 addr64
194; GFX7-NEXT:    v_and_b32_e32 v1, 3, v2
195; GFX7-NEXT:    s_movk_i32 s4, 0xff
196; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
197; GFX7-NEXT:    s_waitcnt vmcnt(0)
198; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 8, v0
199; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
200; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
201; GFX7-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
202; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
203; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
204; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 8, v2
205; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
206; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
207; GFX7-NEXT:    v_lshlrev_b32_e32 v4, 24, v4
208; GFX7-NEXT:    v_or_b32_e32 v0, v0, v3
209; GFX7-NEXT:    v_or_b32_e32 v0, v0, v4
210; GFX7-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
211; GFX7-NEXT:    s_setpc_b64 s[30:31]
212;
213; GFX10-LABEL: extractelement_vgpr_v4i8_vgpr_idx:
214; GFX10:       ; %bb.0:
215; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
216; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
217; GFX10-NEXT:    global_load_dword v0, v[0:1], off
218; GFX10-NEXT:    s_mov_b32 s4, 8
219; GFX10-NEXT:    s_waitcnt vmcnt(0)
220; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
221; GFX10-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
222; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
223; GFX10-NEXT:    s_movk_i32 s4, 0xff
224; GFX10-NEXT:    v_lshlrev_b32_e32 v3, 24, v3
225; GFX10-NEXT:    v_and_b32_sdwa v4, v0, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
226; GFX10-NEXT:    v_and_or_b32 v0, v0, s4, v1
227; GFX10-NEXT:    v_and_b32_e32 v1, 3, v2
228; GFX10-NEXT:    v_or3_b32 v0, v0, v4, v3
229; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 3, v1
230; GFX10-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
231; GFX10-NEXT:    s_setpc_b64 s[30:31]
232  %vector = load <4 x i8>, <4 x i8> addrspace(1)* %ptr
233  %element = extractelement <4 x i8> %vector, i32 %idx
234  ret i8 %element
235}
236
237define amdgpu_ps i8 @extractelement_sgpr_v4i8_vgpr_idx(<4 x i8> addrspace(4)* inreg %ptr, i32 %idx) {
238; GFX9-LABEL: extractelement_sgpr_v4i8_vgpr_idx:
239; GFX9:       ; %bb.0:
240; GFX9-NEXT:    s_load_dword s0, s[2:3], 0x0
241; GFX9-NEXT:    s_movk_i32 s4, 0xff
242; GFX9-NEXT:    v_and_b32_e32 v0, 3, v0
243; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
244; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
245; GFX9-NEXT:    s_lshr_b32 s1, s0, 8
246; GFX9-NEXT:    s_and_b32 s1, s1, s4
247; GFX9-NEXT:    s_lshr_b32 s2, s0, 16
248; GFX9-NEXT:    s_lshr_b32 s3, s0, 24
249; GFX9-NEXT:    s_and_b32 s0, s0, s4
250; GFX9-NEXT:    s_lshl_b32 s1, s1, 8
251; GFX9-NEXT:    s_or_b32 s0, s0, s1
252; GFX9-NEXT:    s_and_b32 s1, s2, s4
253; GFX9-NEXT:    s_lshl_b32 s1, s1, 16
254; GFX9-NEXT:    s_or_b32 s0, s0, s1
255; GFX9-NEXT:    s_lshl_b32 s1, s3, 24
256; GFX9-NEXT:    s_or_b32 s0, s0, s1
257; GFX9-NEXT:    v_lshrrev_b32_e64 v0, v0, s0
258; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
259; GFX9-NEXT:    ; return to shader part epilog
260;
261; GFX8-LABEL: extractelement_sgpr_v4i8_vgpr_idx:
262; GFX8:       ; %bb.0:
263; GFX8-NEXT:    s_load_dword s0, s[2:3], 0x0
264; GFX8-NEXT:    s_movk_i32 s4, 0xff
265; GFX8-NEXT:    v_and_b32_e32 v0, 3, v0
266; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
267; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
268; GFX8-NEXT:    s_lshr_b32 s1, s0, 8
269; GFX8-NEXT:    s_and_b32 s1, s1, s4
270; GFX8-NEXT:    s_lshr_b32 s2, s0, 16
271; GFX8-NEXT:    s_lshr_b32 s3, s0, 24
272; GFX8-NEXT:    s_and_b32 s0, s0, s4
273; GFX8-NEXT:    s_lshl_b32 s1, s1, 8
274; GFX8-NEXT:    s_or_b32 s0, s0, s1
275; GFX8-NEXT:    s_and_b32 s1, s2, s4
276; GFX8-NEXT:    s_lshl_b32 s1, s1, 16
277; GFX8-NEXT:    s_or_b32 s0, s0, s1
278; GFX8-NEXT:    s_lshl_b32 s1, s3, 24
279; GFX8-NEXT:    s_or_b32 s0, s0, s1
280; GFX8-NEXT:    v_lshrrev_b32_e64 v0, v0, s0
281; GFX8-NEXT:    v_readfirstlane_b32 s0, v0
282; GFX8-NEXT:    ; return to shader part epilog
283;
284; GFX7-LABEL: extractelement_sgpr_v4i8_vgpr_idx:
285; GFX7:       ; %bb.0:
286; GFX7-NEXT:    s_load_dword s0, s[2:3], 0x0
287; GFX7-NEXT:    s_movk_i32 s4, 0xff
288; GFX7-NEXT:    v_and_b32_e32 v0, 3, v0
289; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
290; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
291; GFX7-NEXT:    s_lshr_b32 s1, s0, 8
292; GFX7-NEXT:    s_and_b32 s1, s1, s4
293; GFX7-NEXT:    s_lshr_b32 s2, s0, 16
294; GFX7-NEXT:    s_lshr_b32 s3, s0, 24
295; GFX7-NEXT:    s_and_b32 s0, s0, s4
296; GFX7-NEXT:    s_lshl_b32 s1, s1, 8
297; GFX7-NEXT:    s_or_b32 s0, s0, s1
298; GFX7-NEXT:    s_and_b32 s1, s2, s4
299; GFX7-NEXT:    s_lshl_b32 s1, s1, 16
300; GFX7-NEXT:    s_or_b32 s0, s0, s1
301; GFX7-NEXT:    s_lshl_b32 s1, s3, 24
302; GFX7-NEXT:    s_or_b32 s0, s0, s1
303; GFX7-NEXT:    v_lshr_b32_e32 v0, s0, v0
304; GFX7-NEXT:    v_readfirstlane_b32 s0, v0
305; GFX7-NEXT:    ; return to shader part epilog
306;
307; GFX10-LABEL: extractelement_sgpr_v4i8_vgpr_idx:
308; GFX10:       ; %bb.0:
309; GFX10-NEXT:    s_load_dword s0, s[2:3], 0x0
310; GFX10-NEXT:    s_movk_i32 s1, 0xff
311; GFX10-NEXT:    v_and_b32_e32 v0, 3, v0
312; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
313; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
314; GFX10-NEXT:    s_lshr_b32 s2, s0, 8
315; GFX10-NEXT:    s_lshr_b32 s3, s0, 16
316; GFX10-NEXT:    s_and_b32 s2, s2, s1
317; GFX10-NEXT:    s_and_b32 s4, s0, s1
318; GFX10-NEXT:    s_and_b32 s1, s3, s1
319; GFX10-NEXT:    s_lshl_b32 s2, s2, 8
320; GFX10-NEXT:    s_lshr_b32 s0, s0, 24
321; GFX10-NEXT:    s_lshl_b32 s1, s1, 16
322; GFX10-NEXT:    s_or_b32 s2, s4, s2
323; GFX10-NEXT:    s_lshl_b32 s0, s0, 24
324; GFX10-NEXT:    s_or_b32 s1, s2, s1
325; GFX10-NEXT:    s_or_b32 s0, s1, s0
326; GFX10-NEXT:    v_lshrrev_b32_e64 v0, v0, s0
327; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
328; GFX10-NEXT:    ; return to shader part epilog
329  %vector = load <4 x i8>, <4 x i8> addrspace(4)* %ptr
330  %element = extractelement <4 x i8> %vector, i32 %idx
331  ret i8 %element
332}
333
334define amdgpu_ps i8 @extractelement_sgpr_v4i8_idx0(<4 x i8> addrspace(4)* inreg %ptr) {
335; GCN-LABEL: extractelement_sgpr_v4i8_idx0:
336; GCN:       ; %bb.0:
337; GCN-NEXT:    s_load_dword s1, s[2:3], 0x0
338; GCN-NEXT:    s_movk_i32 s0, 0xff
339; GCN-NEXT:    s_waitcnt lgkmcnt(0)
340; GCN-NEXT:    s_lshr_b32 s2, s1, 8
341; GCN-NEXT:    s_and_b32 s2, s2, s0
342; GCN-NEXT:    s_lshr_b32 s3, s1, 16
343; GCN-NEXT:    s_lshr_b32 s4, s1, 24
344; GCN-NEXT:    s_and_b32 s1, s1, s0
345; GCN-NEXT:    s_and_b32 s0, s3, s0
346; GCN-NEXT:    s_lshl_b32 s2, s2, 8
347; GCN-NEXT:    s_or_b32 s1, s1, s2
348; GCN-NEXT:    s_lshl_b32 s0, s0, 16
349; GCN-NEXT:    s_or_b32 s0, s1, s0
350; GCN-NEXT:    s_lshl_b32 s1, s4, 24
351; GCN-NEXT:    s_or_b32 s0, s0, s1
352; GCN-NEXT:    ; return to shader part epilog
353;
354; GFX10-LABEL: extractelement_sgpr_v4i8_idx0:
355; GFX10:       ; %bb.0:
356; GFX10-NEXT:    s_load_dword s0, s[2:3], 0x0
357; GFX10-NEXT:    s_movk_i32 s1, 0xff
358; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
359; GFX10-NEXT:    s_lshr_b32 s2, s0, 8
360; GFX10-NEXT:    s_lshr_b32 s3, s0, 16
361; GFX10-NEXT:    s_and_b32 s2, s2, s1
362; GFX10-NEXT:    s_and_b32 s4, s0, s1
363; GFX10-NEXT:    s_and_b32 s1, s3, s1
364; GFX10-NEXT:    s_lshl_b32 s2, s2, 8
365; GFX10-NEXT:    s_lshr_b32 s0, s0, 24
366; GFX10-NEXT:    s_lshl_b32 s1, s1, 16
367; GFX10-NEXT:    s_or_b32 s2, s4, s2
368; GFX10-NEXT:    s_lshl_b32 s0, s0, 24
369; GFX10-NEXT:    s_or_b32 s1, s2, s1
370; GFX10-NEXT:    s_or_b32 s0, s1, s0
371; GFX10-NEXT:    ; return to shader part epilog
372  %vector = load <4 x i8>, <4 x i8> addrspace(4)* %ptr
373  %element = extractelement <4 x i8> %vector, i32 0
374  ret i8 %element
375}
376
377define amdgpu_ps i8 @extractelement_sgpr_v4i8_idx1(<4 x i8> addrspace(4)* inreg %ptr) {
378; GCN-LABEL: extractelement_sgpr_v4i8_idx1:
379; GCN:       ; %bb.0:
380; GCN-NEXT:    s_load_dword s1, s[2:3], 0x0
381; GCN-NEXT:    s_movk_i32 s0, 0xff
382; GCN-NEXT:    s_waitcnt lgkmcnt(0)
383; GCN-NEXT:    s_lshr_b32 s2, s1, 8
384; GCN-NEXT:    s_and_b32 s2, s2, s0
385; GCN-NEXT:    s_lshr_b32 s3, s1, 16
386; GCN-NEXT:    s_lshr_b32 s4, s1, 24
387; GCN-NEXT:    s_and_b32 s1, s1, s0
388; GCN-NEXT:    s_and_b32 s0, s3, s0
389; GCN-NEXT:    s_lshl_b32 s2, s2, 8
390; GCN-NEXT:    s_or_b32 s1, s1, s2
391; GCN-NEXT:    s_lshl_b32 s0, s0, 16
392; GCN-NEXT:    s_or_b32 s0, s1, s0
393; GCN-NEXT:    s_lshl_b32 s1, s4, 24
394; GCN-NEXT:    s_or_b32 s0, s0, s1
395; GCN-NEXT:    s_lshr_b32 s0, s0, 8
396; GCN-NEXT:    ; return to shader part epilog
397;
398; GFX10-LABEL: extractelement_sgpr_v4i8_idx1:
399; GFX10:       ; %bb.0:
400; GFX10-NEXT:    s_load_dword s0, s[2:3], 0x0
401; GFX10-NEXT:    s_movk_i32 s1, 0xff
402; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
403; GFX10-NEXT:    s_lshr_b32 s2, s0, 8
404; GFX10-NEXT:    s_lshr_b32 s3, s0, 16
405; GFX10-NEXT:    s_and_b32 s2, s2, s1
406; GFX10-NEXT:    s_and_b32 s4, s0, s1
407; GFX10-NEXT:    s_and_b32 s1, s3, s1
408; GFX10-NEXT:    s_lshl_b32 s2, s2, 8
409; GFX10-NEXT:    s_lshr_b32 s0, s0, 24
410; GFX10-NEXT:    s_lshl_b32 s1, s1, 16
411; GFX10-NEXT:    s_or_b32 s2, s4, s2
412; GFX10-NEXT:    s_lshl_b32 s0, s0, 24
413; GFX10-NEXT:    s_or_b32 s1, s2, s1
414; GFX10-NEXT:    s_or_b32 s0, s1, s0
415; GFX10-NEXT:    s_lshr_b32 s0, s0, 8
416; GFX10-NEXT:    ; return to shader part epilog
417  %vector = load <4 x i8>, <4 x i8> addrspace(4)* %ptr
418  %element = extractelement <4 x i8> %vector, i32 1
419  ret i8 %element
420}
421
422define amdgpu_ps i8 @extractelement_sgpr_v4i8_idx2(<4 x i8> addrspace(4)* inreg %ptr) {
423; GCN-LABEL: extractelement_sgpr_v4i8_idx2:
424; GCN:       ; %bb.0:
425; GCN-NEXT:    s_load_dword s1, s[2:3], 0x0
426; GCN-NEXT:    s_movk_i32 s0, 0xff
427; GCN-NEXT:    s_waitcnt lgkmcnt(0)
428; GCN-NEXT:    s_lshr_b32 s2, s1, 8
429; GCN-NEXT:    s_and_b32 s2, s2, s0
430; GCN-NEXT:    s_lshr_b32 s3, s1, 16
431; GCN-NEXT:    s_lshr_b32 s4, s1, 24
432; GCN-NEXT:    s_and_b32 s1, s1, s0
433; GCN-NEXT:    s_and_b32 s0, s3, s0
434; GCN-NEXT:    s_lshl_b32 s2, s2, 8
435; GCN-NEXT:    s_or_b32 s1, s1, s2
436; GCN-NEXT:    s_lshl_b32 s0, s0, 16
437; GCN-NEXT:    s_or_b32 s0, s1, s0
438; GCN-NEXT:    s_lshl_b32 s1, s4, 24
439; GCN-NEXT:    s_or_b32 s0, s0, s1
440; GCN-NEXT:    s_lshr_b32 s0, s0, 16
441; GCN-NEXT:    ; return to shader part epilog
442;
443; GFX10-LABEL: extractelement_sgpr_v4i8_idx2:
444; GFX10:       ; %bb.0:
445; GFX10-NEXT:    s_load_dword s0, s[2:3], 0x0
446; GFX10-NEXT:    s_movk_i32 s1, 0xff
447; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
448; GFX10-NEXT:    s_lshr_b32 s2, s0, 8
449; GFX10-NEXT:    s_lshr_b32 s3, s0, 16
450; GFX10-NEXT:    s_and_b32 s2, s2, s1
451; GFX10-NEXT:    s_and_b32 s4, s0, s1
452; GFX10-NEXT:    s_and_b32 s1, s3, s1
453; GFX10-NEXT:    s_lshl_b32 s2, s2, 8
454; GFX10-NEXT:    s_lshr_b32 s0, s0, 24
455; GFX10-NEXT:    s_lshl_b32 s1, s1, 16
456; GFX10-NEXT:    s_or_b32 s2, s4, s2
457; GFX10-NEXT:    s_lshl_b32 s0, s0, 24
458; GFX10-NEXT:    s_or_b32 s1, s2, s1
459; GFX10-NEXT:    s_or_b32 s0, s1, s0
460; GFX10-NEXT:    s_lshr_b32 s0, s0, 16
461; GFX10-NEXT:    ; return to shader part epilog
462  %vector = load <4 x i8>, <4 x i8> addrspace(4)* %ptr
463  %element = extractelement <4 x i8> %vector, i32 2
464  ret i8 %element
465}
466
467define amdgpu_ps i8 @extractelement_sgpr_v4i8_idx3(<4 x i8> addrspace(4)* inreg %ptr) {
468; GCN-LABEL: extractelement_sgpr_v4i8_idx3:
469; GCN:       ; %bb.0:
470; GCN-NEXT:    s_load_dword s1, s[2:3], 0x0
471; GCN-NEXT:    s_movk_i32 s0, 0xff
472; GCN-NEXT:    s_waitcnt lgkmcnt(0)
473; GCN-NEXT:    s_lshr_b32 s2, s1, 8
474; GCN-NEXT:    s_and_b32 s2, s2, s0
475; GCN-NEXT:    s_lshr_b32 s3, s1, 16
476; GCN-NEXT:    s_lshr_b32 s4, s1, 24
477; GCN-NEXT:    s_and_b32 s1, s1, s0
478; GCN-NEXT:    s_and_b32 s0, s3, s0
479; GCN-NEXT:    s_lshl_b32 s2, s2, 8
480; GCN-NEXT:    s_or_b32 s1, s1, s2
481; GCN-NEXT:    s_lshl_b32 s0, s0, 16
482; GCN-NEXT:    s_or_b32 s0, s1, s0
483; GCN-NEXT:    s_lshl_b32 s1, s4, 24
484; GCN-NEXT:    s_or_b32 s0, s0, s1
485; GCN-NEXT:    s_lshr_b32 s0, s0, 24
486; GCN-NEXT:    ; return to shader part epilog
487;
488; GFX10-LABEL: extractelement_sgpr_v4i8_idx3:
489; GFX10:       ; %bb.0:
490; GFX10-NEXT:    s_load_dword s0, s[2:3], 0x0
491; GFX10-NEXT:    s_movk_i32 s1, 0xff
492; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
493; GFX10-NEXT:    s_lshr_b32 s2, s0, 8
494; GFX10-NEXT:    s_lshr_b32 s3, s0, 16
495; GFX10-NEXT:    s_and_b32 s2, s2, s1
496; GFX10-NEXT:    s_and_b32 s4, s0, s1
497; GFX10-NEXT:    s_and_b32 s1, s3, s1
498; GFX10-NEXT:    s_lshl_b32 s2, s2, 8
499; GFX10-NEXT:    s_lshr_b32 s0, s0, 24
500; GFX10-NEXT:    s_lshl_b32 s1, s1, 16
501; GFX10-NEXT:    s_or_b32 s2, s4, s2
502; GFX10-NEXT:    s_lshl_b32 s0, s0, 24
503; GFX10-NEXT:    s_or_b32 s1, s2, s1
504; GFX10-NEXT:    s_or_b32 s0, s1, s0
505; GFX10-NEXT:    s_lshr_b32 s0, s0, 24
506; GFX10-NEXT:    ; return to shader part epilog
507  %vector = load <4 x i8>, <4 x i8> addrspace(4)* %ptr
508  %element = extractelement <4 x i8> %vector, i32 3
509  ret i8 %element
510}
511
512define i8 @extractelement_vgpr_v4i8_idx0(<4 x i8> addrspace(1)* %ptr) {
513; GFX9-LABEL: extractelement_vgpr_v4i8_idx0:
514; GFX9:       ; %bb.0:
515; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
516; GFX9-NEXT:    global_load_dword v0, v[0:1], off
517; GFX9-NEXT:    s_mov_b32 s4, 8
518; GFX9-NEXT:    s_movk_i32 s5, 0xff
519; GFX9-NEXT:    s_waitcnt vmcnt(0)
520; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
521; GFX9-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
522; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
523; GFX9-NEXT:    v_and_b32_sdwa v3, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
524; GFX9-NEXT:    v_and_or_b32 v0, v0, s5, v1
525; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
526; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
527; GFX9-NEXT:    s_setpc_b64 s[30:31]
528;
529; GFX8-LABEL: extractelement_vgpr_v4i8_idx0:
530; GFX8:       ; %bb.0:
531; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
532; GFX8-NEXT:    flat_load_dword v0, v[0:1]
533; GFX8-NEXT:    s_movk_i32 s4, 0xff
534; GFX8-NEXT:    v_mov_b32_e32 v1, 8
535; GFX8-NEXT:    v_mov_b32_e32 v2, s4
536; GFX8-NEXT:    s_waitcnt vmcnt(0)
537; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v0
538; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
539; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
540; GFX8-NEXT:    v_and_b32_sdwa v2, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
541; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
542; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
543; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
544; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
545; GFX8-NEXT:    s_setpc_b64 s[30:31]
546;
547; GFX7-LABEL: extractelement_vgpr_v4i8_idx0:
548; GFX7:       ; %bb.0:
549; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
550; GFX7-NEXT:    s_mov_b32 s6, 0
551; GFX7-NEXT:    s_mov_b32 s7, 0xf000
552; GFX7-NEXT:    s_mov_b64 s[4:5], 0
553; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[4:7], 0 addr64
554; GFX7-NEXT:    s_movk_i32 s4, 0xff
555; GFX7-NEXT:    s_waitcnt vmcnt(0)
556; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
557; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
558; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
559; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
560; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
561; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
562; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
563; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
564; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
565; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
566; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
567; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
568; GFX7-NEXT:    s_setpc_b64 s[30:31]
569;
570; GFX10-LABEL: extractelement_vgpr_v4i8_idx0:
571; GFX10:       ; %bb.0:
572; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
573; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
574; GFX10-NEXT:    global_load_dword v0, v[0:1], off
575; GFX10-NEXT:    s_mov_b32 s4, 8
576; GFX10-NEXT:    s_waitcnt vmcnt(0)
577; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
578; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
579; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
580; GFX10-NEXT:    s_movk_i32 s4, 0xff
581; GFX10-NEXT:    v_and_b32_sdwa v3, v0, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
582; GFX10-NEXT:    v_and_or_b32 v0, v0, s4, v1
583; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
584; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
585; GFX10-NEXT:    s_setpc_b64 s[30:31]
586  %vector = load <4 x i8>, <4 x i8> addrspace(1)* %ptr
587  %element = extractelement <4 x i8> %vector, i32 0
588  ret i8 %element
589}
590
591define i8 @extractelement_vgpr_v4i8_idx1(<4 x i8> addrspace(1)* %ptr) {
592; GFX9-LABEL: extractelement_vgpr_v4i8_idx1:
593; GFX9:       ; %bb.0:
594; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
595; GFX9-NEXT:    global_load_dword v0, v[0:1], off
596; GFX9-NEXT:    s_mov_b32 s4, 8
597; GFX9-NEXT:    s_movk_i32 s5, 0xff
598; GFX9-NEXT:    s_waitcnt vmcnt(0)
599; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
600; GFX9-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
601; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
602; GFX9-NEXT:    v_and_b32_sdwa v3, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
603; GFX9-NEXT:    v_and_or_b32 v0, v0, s5, v1
604; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
605; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
606; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
607; GFX9-NEXT:    s_setpc_b64 s[30:31]
608;
609; GFX8-LABEL: extractelement_vgpr_v4i8_idx1:
610; GFX8:       ; %bb.0:
611; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
612; GFX8-NEXT:    flat_load_dword v0, v[0:1]
613; GFX8-NEXT:    s_movk_i32 s4, 0xff
614; GFX8-NEXT:    v_mov_b32_e32 v1, 8
615; GFX8-NEXT:    v_mov_b32_e32 v2, s4
616; GFX8-NEXT:    s_waitcnt vmcnt(0)
617; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v0
618; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
619; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
620; GFX8-NEXT:    v_and_b32_sdwa v2, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
621; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
622; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
623; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
624; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
625; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
626; GFX8-NEXT:    s_setpc_b64 s[30:31]
627;
628; GFX7-LABEL: extractelement_vgpr_v4i8_idx1:
629; GFX7:       ; %bb.0:
630; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
631; GFX7-NEXT:    s_mov_b32 s6, 0
632; GFX7-NEXT:    s_mov_b32 s7, 0xf000
633; GFX7-NEXT:    s_mov_b64 s[4:5], 0
634; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[4:7], 0 addr64
635; GFX7-NEXT:    s_movk_i32 s4, 0xff
636; GFX7-NEXT:    s_waitcnt vmcnt(0)
637; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
638; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
639; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
640; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
641; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
642; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
643; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
644; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
645; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
646; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
647; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
648; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
649; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
650; GFX7-NEXT:    s_setpc_b64 s[30:31]
651;
652; GFX10-LABEL: extractelement_vgpr_v4i8_idx1:
653; GFX10:       ; %bb.0:
654; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
655; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
656; GFX10-NEXT:    global_load_dword v0, v[0:1], off
657; GFX10-NEXT:    s_mov_b32 s4, 8
658; GFX10-NEXT:    s_waitcnt vmcnt(0)
659; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
660; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
661; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
662; GFX10-NEXT:    s_movk_i32 s4, 0xff
663; GFX10-NEXT:    v_and_b32_sdwa v3, v0, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
664; GFX10-NEXT:    v_and_or_b32 v0, v0, s4, v1
665; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
666; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
667; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
668; GFX10-NEXT:    s_setpc_b64 s[30:31]
669  %vector = load <4 x i8>, <4 x i8> addrspace(1)* %ptr
670  %element = extractelement <4 x i8> %vector, i32 1
671  ret i8 %element
672}
673
674define i8 @extractelement_vgpr_v4i8_idx2(<4 x i8> addrspace(1)* %ptr) {
675; GFX9-LABEL: extractelement_vgpr_v4i8_idx2:
676; GFX9:       ; %bb.0:
677; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
678; GFX9-NEXT:    global_load_dword v0, v[0:1], off
679; GFX9-NEXT:    s_mov_b32 s4, 8
680; GFX9-NEXT:    s_movk_i32 s5, 0xff
681; GFX9-NEXT:    s_waitcnt vmcnt(0)
682; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
683; GFX9-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
684; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
685; GFX9-NEXT:    v_and_b32_sdwa v3, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
686; GFX9-NEXT:    v_and_or_b32 v0, v0, s5, v1
687; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
688; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
689; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
690; GFX9-NEXT:    s_setpc_b64 s[30:31]
691;
692; GFX8-LABEL: extractelement_vgpr_v4i8_idx2:
693; GFX8:       ; %bb.0:
694; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
695; GFX8-NEXT:    flat_load_dword v0, v[0:1]
696; GFX8-NEXT:    s_movk_i32 s4, 0xff
697; GFX8-NEXT:    v_mov_b32_e32 v1, 8
698; GFX8-NEXT:    v_mov_b32_e32 v2, s4
699; GFX8-NEXT:    s_waitcnt vmcnt(0)
700; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v0
701; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
702; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
703; GFX8-NEXT:    v_and_b32_sdwa v2, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
704; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
705; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
706; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
707; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
708; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
709; GFX8-NEXT:    s_setpc_b64 s[30:31]
710;
711; GFX7-LABEL: extractelement_vgpr_v4i8_idx2:
712; GFX7:       ; %bb.0:
713; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
714; GFX7-NEXT:    s_mov_b32 s6, 0
715; GFX7-NEXT:    s_mov_b32 s7, 0xf000
716; GFX7-NEXT:    s_mov_b64 s[4:5], 0
717; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[4:7], 0 addr64
718; GFX7-NEXT:    s_movk_i32 s4, 0xff
719; GFX7-NEXT:    s_waitcnt vmcnt(0)
720; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
721; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
722; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
723; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
724; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
725; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
726; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
727; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
728; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
729; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
730; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
731; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
732; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
733; GFX7-NEXT:    s_setpc_b64 s[30:31]
734;
735; GFX10-LABEL: extractelement_vgpr_v4i8_idx2:
736; GFX10:       ; %bb.0:
737; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
738; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
739; GFX10-NEXT:    global_load_dword v0, v[0:1], off
740; GFX10-NEXT:    s_mov_b32 s4, 8
741; GFX10-NEXT:    s_waitcnt vmcnt(0)
742; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
743; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
744; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
745; GFX10-NEXT:    s_movk_i32 s4, 0xff
746; GFX10-NEXT:    v_and_b32_sdwa v3, v0, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
747; GFX10-NEXT:    v_and_or_b32 v0, v0, s4, v1
748; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
749; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
750; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
751; GFX10-NEXT:    s_setpc_b64 s[30:31]
752  %vector = load <4 x i8>, <4 x i8> addrspace(1)* %ptr
753  %element = extractelement <4 x i8> %vector, i32 2
754  ret i8 %element
755}
756
757define i8 @extractelement_vgpr_v4i8_idx3(<4 x i8> addrspace(1)* %ptr) {
758; GFX9-LABEL: extractelement_vgpr_v4i8_idx3:
759; GFX9:       ; %bb.0:
760; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
761; GFX9-NEXT:    global_load_dword v0, v[0:1], off
762; GFX9-NEXT:    s_mov_b32 s4, 8
763; GFX9-NEXT:    s_movk_i32 s5, 0xff
764; GFX9-NEXT:    s_waitcnt vmcnt(0)
765; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
766; GFX9-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
767; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
768; GFX9-NEXT:    v_and_b32_sdwa v3, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
769; GFX9-NEXT:    v_and_or_b32 v0, v0, s5, v1
770; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
771; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
772; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
773; GFX9-NEXT:    s_setpc_b64 s[30:31]
774;
775; GFX8-LABEL: extractelement_vgpr_v4i8_idx3:
776; GFX8:       ; %bb.0:
777; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
778; GFX8-NEXT:    flat_load_dword v0, v[0:1]
779; GFX8-NEXT:    s_movk_i32 s4, 0xff
780; GFX8-NEXT:    v_mov_b32_e32 v1, 8
781; GFX8-NEXT:    v_mov_b32_e32 v2, s4
782; GFX8-NEXT:    s_waitcnt vmcnt(0)
783; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v0
784; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
785; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
786; GFX8-NEXT:    v_and_b32_sdwa v2, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
787; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
788; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
789; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
790; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
791; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
792; GFX8-NEXT:    s_setpc_b64 s[30:31]
793;
794; GFX7-LABEL: extractelement_vgpr_v4i8_idx3:
795; GFX7:       ; %bb.0:
796; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
797; GFX7-NEXT:    s_mov_b32 s6, 0
798; GFX7-NEXT:    s_mov_b32 s7, 0xf000
799; GFX7-NEXT:    s_mov_b64 s[4:5], 0
800; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[4:7], 0 addr64
801; GFX7-NEXT:    s_movk_i32 s4, 0xff
802; GFX7-NEXT:    s_waitcnt vmcnt(0)
803; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
804; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
805; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
806; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
807; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
808; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
809; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
810; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
811; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
812; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
813; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
814; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
815; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
816; GFX7-NEXT:    s_setpc_b64 s[30:31]
817;
818; GFX10-LABEL: extractelement_vgpr_v4i8_idx3:
819; GFX10:       ; %bb.0:
820; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
821; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
822; GFX10-NEXT:    global_load_dword v0, v[0:1], off
823; GFX10-NEXT:    s_mov_b32 s4, 8
824; GFX10-NEXT:    s_waitcnt vmcnt(0)
825; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
826; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
827; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
828; GFX10-NEXT:    s_movk_i32 s4, 0xff
829; GFX10-NEXT:    v_and_b32_sdwa v3, v0, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
830; GFX10-NEXT:    v_and_or_b32 v0, v0, s4, v1
831; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
832; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
833; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
834; GFX10-NEXT:    s_setpc_b64 s[30:31]
835  %vector = load <4 x i8>, <4 x i8> addrspace(1)* %ptr
836  %element = extractelement <4 x i8> %vector, i32 3
837  ret i8 %element
838}
839
840define amdgpu_ps i8 @extractelement_sgpr_v8i8_sgpr_idx(<8 x i8> addrspace(4)* inreg %ptr, i32 inreg %idx) {
841; GCN-LABEL: extractelement_sgpr_v8i8_sgpr_idx:
842; GCN:       ; %bb.0:
843; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
844; GCN-NEXT:    s_movk_i32 s9, 0xff
845; GCN-NEXT:    s_waitcnt lgkmcnt(0)
846; GCN-NEXT:    s_lshr_b32 s2, s0, 8
847; GCN-NEXT:    s_and_b32 s2, s2, s9
848; GCN-NEXT:    s_lshr_b32 s3, s0, 16
849; GCN-NEXT:    s_lshr_b32 s5, s0, 24
850; GCN-NEXT:    s_and_b32 s0, s0, s9
851; GCN-NEXT:    s_lshl_b32 s2, s2, 8
852; GCN-NEXT:    s_or_b32 s0, s0, s2
853; GCN-NEXT:    s_and_b32 s2, s3, s9
854; GCN-NEXT:    s_lshl_b32 s2, s2, 16
855; GCN-NEXT:    s_or_b32 s0, s0, s2
856; GCN-NEXT:    s_lshl_b32 s2, s5, 24
857; GCN-NEXT:    s_lshr_b32 s6, s1, 8
858; GCN-NEXT:    s_or_b32 s0, s0, s2
859; GCN-NEXT:    s_and_b32 s2, s6, s9
860; GCN-NEXT:    s_lshr_b32 s7, s1, 16
861; GCN-NEXT:    s_lshr_b32 s8, s1, 24
862; GCN-NEXT:    s_and_b32 s1, s1, s9
863; GCN-NEXT:    s_lshl_b32 s2, s2, 8
864; GCN-NEXT:    s_or_b32 s1, s1, s2
865; GCN-NEXT:    s_and_b32 s2, s7, s9
866; GCN-NEXT:    s_lshl_b32 s2, s2, 16
867; GCN-NEXT:    s_or_b32 s1, s1, s2
868; GCN-NEXT:    s_lshl_b32 s2, s8, 24
869; GCN-NEXT:    s_or_b32 s1, s1, s2
870; GCN-NEXT:    s_lshr_b32 s2, s4, 2
871; GCN-NEXT:    s_cmp_eq_u32 s2, 1
872; GCN-NEXT:    s_cselect_b32 s0, s1, s0
873; GCN-NEXT:    s_and_b32 s1, s4, 3
874; GCN-NEXT:    s_lshl_b32 s1, s1, 3
875; GCN-NEXT:    s_lshr_b32 s0, s0, s1
876; GCN-NEXT:    ; return to shader part epilog
877;
878; GFX10-LABEL: extractelement_sgpr_v8i8_sgpr_idx:
879; GFX10:       ; %bb.0:
880; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
881; GFX10-NEXT:    s_movk_i32 s2, 0xff
882; GFX10-NEXT:    s_lshr_b32 s3, s4, 2
883; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
884; GFX10-NEXT:    s_lshr_b32 s5, s0, 8
885; GFX10-NEXT:    s_lshr_b32 s8, s1, 8
886; GFX10-NEXT:    s_lshr_b32 s6, s0, 16
887; GFX10-NEXT:    s_and_b32 s5, s5, s2
888; GFX10-NEXT:    s_and_b32 s8, s8, s2
889; GFX10-NEXT:    s_lshr_b32 s9, s1, 16
890; GFX10-NEXT:    s_lshr_b32 s7, s0, 24
891; GFX10-NEXT:    s_and_b32 s6, s6, s2
892; GFX10-NEXT:    s_lshr_b32 s10, s1, 24
893; GFX10-NEXT:    s_and_b32 s0, s0, s2
894; GFX10-NEXT:    s_and_b32 s1, s1, s2
895; GFX10-NEXT:    s_and_b32 s2, s9, s2
896; GFX10-NEXT:    s_lshl_b32 s5, s5, 8
897; GFX10-NEXT:    s_lshl_b32 s8, s8, 8
898; GFX10-NEXT:    s_lshl_b32 s6, s6, 16
899; GFX10-NEXT:    s_or_b32 s0, s0, s5
900; GFX10-NEXT:    s_lshl_b32 s2, s2, 16
901; GFX10-NEXT:    s_or_b32 s1, s1, s8
902; GFX10-NEXT:    s_lshl_b32 s7, s7, 24
903; GFX10-NEXT:    s_or_b32 s0, s0, s6
904; GFX10-NEXT:    s_lshl_b32 s9, s10, 24
905; GFX10-NEXT:    s_or_b32 s1, s1, s2
906; GFX10-NEXT:    s_or_b32 s0, s0, s7
907; GFX10-NEXT:    s_or_b32 s1, s1, s9
908; GFX10-NEXT:    s_cmp_eq_u32 s3, 1
909; GFX10-NEXT:    s_cselect_b32 s0, s1, s0
910; GFX10-NEXT:    s_and_b32 s1, s4, 3
911; GFX10-NEXT:    s_lshl_b32 s1, s1, 3
912; GFX10-NEXT:    s_lshr_b32 s0, s0, s1
913; GFX10-NEXT:    ; return to shader part epilog
914  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
915  %element = extractelement <8 x i8> %vector, i32 %idx
916  ret i8 %element
917}
918
919define amdgpu_ps i8 @extractelement_vgpr_v8i8_sgpr_idx(<8 x i8> addrspace(1)* %ptr, i32 inreg %idx) {
920; GFX9-LABEL: extractelement_vgpr_v8i8_sgpr_idx:
921; GFX9:       ; %bb.0:
922; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
923; GFX9-NEXT:    s_mov_b32 s0, 8
924; GFX9-NEXT:    s_movk_i32 s1, 0xff
925; GFX9-NEXT:    s_lshr_b32 s3, s2, 2
926; GFX9-NEXT:    s_and_b32 s2, s2, 3
927; GFX9-NEXT:    v_cmp_eq_u32_e64 vcc, s3, 1
928; GFX9-NEXT:    s_waitcnt vmcnt(0)
929; GFX9-NEXT:    v_lshrrev_b32_e32 v2, 8, v0
930; GFX9-NEXT:    v_lshrrev_b32_e32 v4, 8, v1
931; GFX9-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
932; GFX9-NEXT:    v_lshrrev_b32_e32 v5, 24, v1
933; GFX9-NEXT:    v_lshlrev_b32_sdwa v2, s0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
934; GFX9-NEXT:    v_lshlrev_b32_sdwa v4, s0, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
935; GFX9-NEXT:    v_and_b32_sdwa v6, v0, s1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
936; GFX9-NEXT:    v_and_b32_sdwa v7, v1, s1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
937; GFX9-NEXT:    v_lshlrev_b32_e32 v3, 24, v3
938; GFX9-NEXT:    v_and_or_b32 v0, v0, s1, v2
939; GFX9-NEXT:    v_lshlrev_b32_e32 v5, 24, v5
940; GFX9-NEXT:    v_and_or_b32 v1, v1, s1, v4
941; GFX9-NEXT:    v_or3_b32 v0, v0, v6, v3
942; GFX9-NEXT:    v_or3_b32 v1, v1, v7, v5
943; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
944; GFX9-NEXT:    s_lshl_b32 s0, s2, 3
945; GFX9-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
946; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
947; GFX9-NEXT:    ; return to shader part epilog
948;
949; GFX8-LABEL: extractelement_vgpr_v8i8_sgpr_idx:
950; GFX8:       ; %bb.0:
951; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
952; GFX8-NEXT:    s_movk_i32 s0, 0xff
953; GFX8-NEXT:    v_mov_b32_e32 v2, 8
954; GFX8-NEXT:    v_mov_b32_e32 v3, 8
955; GFX8-NEXT:    v_mov_b32_e32 v4, s0
956; GFX8-NEXT:    s_lshr_b32 s0, s2, 2
957; GFX8-NEXT:    s_and_b32 s1, s2, 3
958; GFX8-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 1
959; GFX8-NEXT:    s_lshl_b32 s0, s1, 3
960; GFX8-NEXT:    s_waitcnt vmcnt(0)
961; GFX8-NEXT:    v_lshrrev_b32_e32 v5, 8, v0
962; GFX8-NEXT:    v_lshrrev_b32_e32 v7, 8, v1
963; GFX8-NEXT:    v_lshlrev_b32_sdwa v2, v2, v5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
964; GFX8-NEXT:    v_lshlrev_b32_sdwa v3, v3, v7 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
965; GFX8-NEXT:    v_lshrrev_b32_e32 v6, 24, v0
966; GFX8-NEXT:    v_and_b32_sdwa v9, v0, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
967; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
968; GFX8-NEXT:    v_lshrrev_b32_e32 v8, 24, v1
969; GFX8-NEXT:    v_and_b32_sdwa v4, v1, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
970; GFX8-NEXT:    v_or_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
971; GFX8-NEXT:    v_lshlrev_b32_e32 v5, 24, v6
972; GFX8-NEXT:    v_or_b32_e32 v0, v0, v9
973; GFX8-NEXT:    v_lshlrev_b32_e32 v6, 24, v8
974; GFX8-NEXT:    v_or_b32_e32 v1, v1, v4
975; GFX8-NEXT:    v_or_b32_e32 v0, v0, v5
976; GFX8-NEXT:    v_or_b32_e32 v1, v1, v6
977; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
978; GFX8-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
979; GFX8-NEXT:    v_readfirstlane_b32 s0, v0
980; GFX8-NEXT:    ; return to shader part epilog
981;
982; GFX7-LABEL: extractelement_vgpr_v8i8_sgpr_idx:
983; GFX7:       ; %bb.0:
984; GFX7-NEXT:    s_mov_b32 s6, 0
985; GFX7-NEXT:    s_mov_b32 s7, 0xf000
986; GFX7-NEXT:    s_mov_b64 s[4:5], 0
987; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
988; GFX7-NEXT:    s_movk_i32 s0, 0xff
989; GFX7-NEXT:    s_lshr_b32 s1, s2, 2
990; GFX7-NEXT:    s_and_b32 s2, s2, 3
991; GFX7-NEXT:    v_cmp_eq_u32_e64 vcc, s1, 1
992; GFX7-NEXT:    s_waitcnt vmcnt(0)
993; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 8, v0
994; GFX7-NEXT:    v_lshrrev_b32_e32 v5, 8, v1
995; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
996; GFX7-NEXT:    v_lshrrev_b32_e32 v6, 16, v1
997; GFX7-NEXT:    v_and_b32_e32 v2, s0, v2
998; GFX7-NEXT:    v_and_b32_e32 v5, s0, v5
999; GFX7-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
1000; GFX7-NEXT:    v_lshrrev_b32_e32 v7, 24, v1
1001; GFX7-NEXT:    v_and_b32_e32 v3, s0, v3
1002; GFX7-NEXT:    v_and_b32_e32 v6, s0, v6
1003; GFX7-NEXT:    v_and_b32_e32 v0, s0, v0
1004; GFX7-NEXT:    v_and_b32_e32 v1, s0, v1
1005; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 8, v2
1006; GFX7-NEXT:    v_lshlrev_b32_e32 v5, 8, v5
1007; GFX7-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
1008; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
1009; GFX7-NEXT:    v_lshlrev_b32_e32 v6, 16, v6
1010; GFX7-NEXT:    v_or_b32_e32 v1, v1, v5
1011; GFX7-NEXT:    v_lshlrev_b32_e32 v4, 24, v4
1012; GFX7-NEXT:    v_or_b32_e32 v0, v0, v3
1013; GFX7-NEXT:    v_lshlrev_b32_e32 v7, 24, v7
1014; GFX7-NEXT:    v_or_b32_e32 v1, v1, v6
1015; GFX7-NEXT:    v_or_b32_e32 v0, v0, v4
1016; GFX7-NEXT:    v_or_b32_e32 v1, v1, v7
1017; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
1018; GFX7-NEXT:    s_lshl_b32 s0, s2, 3
1019; GFX7-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
1020; GFX7-NEXT:    v_readfirstlane_b32 s0, v0
1021; GFX7-NEXT:    ; return to shader part epilog
1022;
1023; GFX10-LABEL: extractelement_vgpr_v8i8_sgpr_idx:
1024; GFX10:       ; %bb.0:
1025; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1026; GFX10-NEXT:    s_mov_b32 s0, 8
1027; GFX10-NEXT:    s_movk_i32 s1, 0xff
1028; GFX10-NEXT:    s_waitcnt vmcnt(0)
1029; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 8, v0
1030; GFX10-NEXT:    v_lshrrev_b32_e32 v3, 8, v1
1031; GFX10-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
1032; GFX10-NEXT:    v_lshrrev_b32_e32 v5, 24, v1
1033; GFX10-NEXT:    v_and_b32_sdwa v6, v0, s1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1034; GFX10-NEXT:    v_lshlrev_b32_sdwa v2, s0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1035; GFX10-NEXT:    v_lshlrev_b32_sdwa v3, s0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1036; GFX10-NEXT:    v_and_b32_sdwa v7, v1, s1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1037; GFX10-NEXT:    v_lshlrev_b32_e32 v4, 24, v4
1038; GFX10-NEXT:    v_lshlrev_b32_e32 v5, 24, v5
1039; GFX10-NEXT:    v_and_or_b32 v0, v0, s1, v2
1040; GFX10-NEXT:    v_and_or_b32 v1, v1, s1, v3
1041; GFX10-NEXT:    s_lshr_b32 s0, s2, 2
1042; GFX10-NEXT:    v_cmp_eq_u32_e64 vcc_lo, s0, 1
1043; GFX10-NEXT:    v_or3_b32 v0, v0, v6, v4
1044; GFX10-NEXT:    v_or3_b32 v1, v1, v7, v5
1045; GFX10-NEXT:    s_and_b32 s0, s2, 3
1046; GFX10-NEXT:    s_lshl_b32 s0, s0, 3
1047; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc_lo
1048; GFX10-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
1049; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
1050; GFX10-NEXT:    ; return to shader part epilog
1051  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
1052  %element = extractelement <8 x i8> %vector, i32 %idx
1053  ret i8 %element
1054}
1055
1056define i8 @extractelement_vgpr_v8i8_vgpr_idx(<8 x i8> addrspace(1)* %ptr, i32 %idx) {
1057; GFX9-LABEL: extractelement_vgpr_v8i8_vgpr_idx:
1058; GFX9:       ; %bb.0:
1059; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1060; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1061; GFX9-NEXT:    s_mov_b32 s4, 8
1062; GFX9-NEXT:    s_movk_i32 s5, 0xff
1063; GFX9-NEXT:    v_lshrrev_b32_e32 v3, 2, v2
1064; GFX9-NEXT:    v_and_b32_e32 v2, 3, v2
1065; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v3
1066; GFX9-NEXT:    s_waitcnt vmcnt(0)
1067; GFX9-NEXT:    v_lshrrev_b32_e32 v4, 8, v0
1068; GFX9-NEXT:    v_lshrrev_b32_e32 v6, 8, v1
1069; GFX9-NEXT:    v_lshrrev_b32_e32 v5, 24, v0
1070; GFX9-NEXT:    v_lshrrev_b32_e32 v7, 24, v1
1071; GFX9-NEXT:    v_lshlrev_b32_sdwa v4, s4, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1072; GFX9-NEXT:    v_lshlrev_b32_sdwa v6, s4, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1073; GFX9-NEXT:    v_and_b32_sdwa v8, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1074; GFX9-NEXT:    v_and_b32_sdwa v9, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1075; GFX9-NEXT:    v_lshlrev_b32_e32 v5, 24, v5
1076; GFX9-NEXT:    v_and_or_b32 v0, v0, s5, v4
1077; GFX9-NEXT:    v_lshlrev_b32_e32 v7, 24, v7
1078; GFX9-NEXT:    v_and_or_b32 v1, v1, s5, v6
1079; GFX9-NEXT:    v_or3_b32 v0, v0, v8, v5
1080; GFX9-NEXT:    v_or3_b32 v1, v1, v9, v7
1081; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
1082; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 3, v2
1083; GFX9-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
1084; GFX9-NEXT:    s_setpc_b64 s[30:31]
1085;
1086; GFX8-LABEL: extractelement_vgpr_v8i8_vgpr_idx:
1087; GFX8:       ; %bb.0:
1088; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1089; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1090; GFX8-NEXT:    s_movk_i32 s4, 0xff
1091; GFX8-NEXT:    v_mov_b32_e32 v3, 8
1092; GFX8-NEXT:    v_mov_b32_e32 v4, 8
1093; GFX8-NEXT:    v_mov_b32_e32 v5, s4
1094; GFX8-NEXT:    v_lshrrev_b32_e32 v6, 2, v2
1095; GFX8-NEXT:    v_and_b32_e32 v2, 3, v2
1096; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v6
1097; GFX8-NEXT:    s_waitcnt vmcnt(0)
1098; GFX8-NEXT:    v_lshrrev_b32_e32 v7, 8, v0
1099; GFX8-NEXT:    v_lshrrev_b32_e32 v9, 8, v1
1100; GFX8-NEXT:    v_lshlrev_b32_sdwa v3, v3, v7 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1101; GFX8-NEXT:    v_lshlrev_b32_sdwa v4, v4, v9 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1102; GFX8-NEXT:    v_lshrrev_b32_e32 v8, 24, v0
1103; GFX8-NEXT:    v_and_b32_sdwa v11, v0, v5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1104; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1105; GFX8-NEXT:    v_lshrrev_b32_e32 v10, 24, v1
1106; GFX8-NEXT:    v_and_b32_sdwa v5, v1, v5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1107; GFX8-NEXT:    v_or_b32_sdwa v1, v1, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1108; GFX8-NEXT:    v_lshlrev_b32_e32 v7, 24, v8
1109; GFX8-NEXT:    v_or_b32_e32 v0, v0, v11
1110; GFX8-NEXT:    v_lshlrev_b32_e32 v8, 24, v10
1111; GFX8-NEXT:    v_or_b32_e32 v1, v1, v5
1112; GFX8-NEXT:    v_or_b32_e32 v0, v0, v7
1113; GFX8-NEXT:    v_or_b32_e32 v1, v1, v8
1114; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
1115; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 3, v2
1116; GFX8-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
1117; GFX8-NEXT:    s_setpc_b64 s[30:31]
1118;
1119; GFX7-LABEL: extractelement_vgpr_v8i8_vgpr_idx:
1120; GFX7:       ; %bb.0:
1121; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1122; GFX7-NEXT:    s_mov_b32 s6, 0
1123; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1124; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1125; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
1126; GFX7-NEXT:    s_movk_i32 s4, 0xff
1127; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 2, v2
1128; GFX7-NEXT:    v_and_b32_e32 v2, 3, v2
1129; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v3
1130; GFX7-NEXT:    s_waitcnt vmcnt(0)
1131; GFX7-NEXT:    v_lshrrev_b32_e32 v4, 8, v0
1132; GFX7-NEXT:    v_lshrrev_b32_e32 v7, 8, v1
1133; GFX7-NEXT:    v_lshrrev_b32_e32 v5, 16, v0
1134; GFX7-NEXT:    v_lshrrev_b32_e32 v8, 16, v1
1135; GFX7-NEXT:    v_and_b32_e32 v4, s4, v4
1136; GFX7-NEXT:    v_and_b32_e32 v7, s4, v7
1137; GFX7-NEXT:    v_lshrrev_b32_e32 v6, 24, v0
1138; GFX7-NEXT:    v_lshrrev_b32_e32 v9, 24, v1
1139; GFX7-NEXT:    v_and_b32_e32 v5, s4, v5
1140; GFX7-NEXT:    v_and_b32_e32 v8, s4, v8
1141; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
1142; GFX7-NEXT:    v_lshlrev_b32_e32 v4, 8, v4
1143; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
1144; GFX7-NEXT:    v_lshlrev_b32_e32 v7, 8, v7
1145; GFX7-NEXT:    v_lshlrev_b32_e32 v5, 16, v5
1146; GFX7-NEXT:    v_or_b32_e32 v0, v0, v4
1147; GFX7-NEXT:    v_lshlrev_b32_e32 v8, 16, v8
1148; GFX7-NEXT:    v_or_b32_e32 v1, v1, v7
1149; GFX7-NEXT:    v_lshlrev_b32_e32 v6, 24, v6
1150; GFX7-NEXT:    v_or_b32_e32 v0, v0, v5
1151; GFX7-NEXT:    v_lshlrev_b32_e32 v9, 24, v9
1152; GFX7-NEXT:    v_or_b32_e32 v1, v1, v8
1153; GFX7-NEXT:    v_or_b32_e32 v0, v0, v6
1154; GFX7-NEXT:    v_or_b32_e32 v1, v1, v9
1155; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
1156; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 3, v2
1157; GFX7-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
1158; GFX7-NEXT:    s_setpc_b64 s[30:31]
1159;
1160; GFX10-LABEL: extractelement_vgpr_v8i8_vgpr_idx:
1161; GFX10:       ; %bb.0:
1162; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1163; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1164; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1165; GFX10-NEXT:    s_mov_b32 s4, 8
1166; GFX10-NEXT:    s_movk_i32 s5, 0xff
1167; GFX10-NEXT:    s_waitcnt vmcnt(0)
1168; GFX10-NEXT:    v_lshrrev_b32_e32 v3, 8, v0
1169; GFX10-NEXT:    v_lshrrev_b32_e32 v4, 8, v1
1170; GFX10-NEXT:    v_lshrrev_b32_e32 v5, 24, v0
1171; GFX10-NEXT:    v_lshrrev_b32_e32 v6, 24, v1
1172; GFX10-NEXT:    v_and_b32_sdwa v7, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1173; GFX10-NEXT:    v_lshlrev_b32_sdwa v3, s4, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1174; GFX10-NEXT:    v_lshlrev_b32_sdwa v4, s4, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1175; GFX10-NEXT:    v_and_b32_sdwa v8, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1176; GFX10-NEXT:    v_lshlrev_b32_e32 v5, 24, v5
1177; GFX10-NEXT:    v_lshlrev_b32_e32 v6, 24, v6
1178; GFX10-NEXT:    v_and_or_b32 v0, v0, s5, v3
1179; GFX10-NEXT:    v_and_or_b32 v1, v1, s5, v4
1180; GFX10-NEXT:    v_lshrrev_b32_e32 v3, 2, v2
1181; GFX10-NEXT:    v_and_b32_e32 v2, 3, v2
1182; GFX10-NEXT:    v_or3_b32 v0, v0, v7, v5
1183; GFX10-NEXT:    v_or3_b32 v1, v1, v8, v6
1184; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 1, v3
1185; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc_lo
1186; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 3, v2
1187; GFX10-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
1188; GFX10-NEXT:    s_setpc_b64 s[30:31]
1189  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
1190  %element = extractelement <8 x i8> %vector, i32 %idx
1191  ret i8 %element
1192}
1193
1194define amdgpu_ps i8 @extractelement_sgpr_v8i8_vgpr_idx(<8 x i8> addrspace(4)* inreg %ptr, i32 %idx) {
1195; GCN-LABEL: extractelement_sgpr_v8i8_vgpr_idx:
1196; GCN:       ; %bb.0:
1197; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1198; GCN-NEXT:    s_movk_i32 s8, 0xff
1199; GCN-NEXT:    v_lshrrev_b32_e32 v1, 2, v0
1200; GCN-NEXT:    v_and_b32_e32 v0, 3, v0
1201; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v1
1202; GCN-NEXT:    s_waitcnt lgkmcnt(0)
1203; GCN-NEXT:    s_lshr_b32 s2, s0, 8
1204; GCN-NEXT:    s_and_b32 s2, s2, s8
1205; GCN-NEXT:    s_lshr_b32 s3, s0, 16
1206; GCN-NEXT:    s_lshr_b32 s4, s0, 24
1207; GCN-NEXT:    s_and_b32 s0, s0, s8
1208; GCN-NEXT:    s_lshl_b32 s2, s2, 8
1209; GCN-NEXT:    s_or_b32 s0, s0, s2
1210; GCN-NEXT:    s_and_b32 s2, s3, s8
1211; GCN-NEXT:    s_lshl_b32 s2, s2, 16
1212; GCN-NEXT:    s_or_b32 s0, s0, s2
1213; GCN-NEXT:    s_lshl_b32 s2, s4, 24
1214; GCN-NEXT:    s_lshr_b32 s5, s1, 8
1215; GCN-NEXT:    s_or_b32 s0, s0, s2
1216; GCN-NEXT:    s_and_b32 s2, s5, s8
1217; GCN-NEXT:    s_lshr_b32 s6, s1, 16
1218; GCN-NEXT:    s_lshr_b32 s7, s1, 24
1219; GCN-NEXT:    s_and_b32 s1, s1, s8
1220; GCN-NEXT:    s_lshl_b32 s2, s2, 8
1221; GCN-NEXT:    s_or_b32 s1, s1, s2
1222; GCN-NEXT:    s_and_b32 s2, s6, s8
1223; GCN-NEXT:    s_lshl_b32 s2, s2, 16
1224; GCN-NEXT:    s_or_b32 s1, s1, s2
1225; GCN-NEXT:    s_lshl_b32 s2, s7, 24
1226; GCN-NEXT:    s_or_b32 s1, s1, s2
1227; GCN-NEXT:    v_mov_b32_e32 v2, s0
1228; GCN-NEXT:    v_mov_b32_e32 v3, s1
1229; GCN-NEXT:    v_cndmask_b32_e32 v1, v2, v3, vcc
1230; GCN-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
1231; GCN-NEXT:    v_lshrrev_b32_e32 v0, v0, v1
1232; GCN-NEXT:    v_readfirstlane_b32 s0, v0
1233; GCN-NEXT:    ; return to shader part epilog
1234;
1235; GFX10-LABEL: extractelement_sgpr_v8i8_vgpr_idx:
1236; GFX10:       ; %bb.0:
1237; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1238; GFX10-NEXT:    s_movk_i32 s2, 0xff
1239; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 2, v0
1240; GFX10-NEXT:    v_and_b32_e32 v0, 3, v0
1241; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 1, v1
1242; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
1243; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1244; GFX10-NEXT:    s_lshr_b32 s6, s1, 8
1245; GFX10-NEXT:    s_lshr_b32 s3, s0, 8
1246; GFX10-NEXT:    s_lshr_b32 s4, s0, 16
1247; GFX10-NEXT:    s_and_b32 s6, s6, s2
1248; GFX10-NEXT:    s_lshr_b32 s7, s1, 16
1249; GFX10-NEXT:    s_lshr_b32 s5, s0, 24
1250; GFX10-NEXT:    s_and_b32 s3, s3, s2
1251; GFX10-NEXT:    s_lshr_b32 s8, s1, 24
1252; GFX10-NEXT:    s_and_b32 s0, s0, s2
1253; GFX10-NEXT:    s_and_b32 s1, s1, s2
1254; GFX10-NEXT:    s_and_b32 s4, s4, s2
1255; GFX10-NEXT:    s_and_b32 s2, s7, s2
1256; GFX10-NEXT:    s_lshl_b32 s6, s6, 8
1257; GFX10-NEXT:    s_lshl_b32 s2, s2, 16
1258; GFX10-NEXT:    s_or_b32 s1, s1, s6
1259; GFX10-NEXT:    s_lshl_b32 s7, s8, 24
1260; GFX10-NEXT:    s_or_b32 s1, s1, s2
1261; GFX10-NEXT:    s_lshl_b32 s3, s3, 8
1262; GFX10-NEXT:    s_or_b32 s1, s1, s7
1263; GFX10-NEXT:    s_lshl_b32 s2, s4, 16
1264; GFX10-NEXT:    s_or_b32 s0, s0, s3
1265; GFX10-NEXT:    v_mov_b32_e32 v2, s1
1266; GFX10-NEXT:    s_lshl_b32 s5, s5, 24
1267; GFX10-NEXT:    s_or_b32 s0, s0, s2
1268; GFX10-NEXT:    s_or_b32 s0, s0, s5
1269; GFX10-NEXT:    v_cndmask_b32_e32 v1, s0, v2, vcc_lo
1270; GFX10-NEXT:    v_lshrrev_b32_e32 v0, v0, v1
1271; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
1272; GFX10-NEXT:    ; return to shader part epilog
1273  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
1274  %element = extractelement <8 x i8> %vector, i32 %idx
1275  ret i8 %element
1276}
1277
1278define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx0(<8 x i8> addrspace(4)* inreg %ptr) {
1279; GCN-LABEL: extractelement_sgpr_v8i8_idx0:
1280; GCN:       ; %bb.0:
1281; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1282; GCN-NEXT:    s_movk_i32 s4, 0xff
1283; GCN-NEXT:    s_waitcnt lgkmcnt(0)
1284; GCN-NEXT:    s_lshr_b32 s1, s0, 8
1285; GCN-NEXT:    s_and_b32 s1, s1, s4
1286; GCN-NEXT:    s_lshr_b32 s2, s0, 16
1287; GCN-NEXT:    s_lshr_b32 s3, s0, 24
1288; GCN-NEXT:    s_and_b32 s0, s0, s4
1289; GCN-NEXT:    s_lshl_b32 s1, s1, 8
1290; GCN-NEXT:    s_or_b32 s0, s0, s1
1291; GCN-NEXT:    s_and_b32 s1, s2, s4
1292; GCN-NEXT:    s_lshl_b32 s1, s1, 16
1293; GCN-NEXT:    s_or_b32 s0, s0, s1
1294; GCN-NEXT:    s_lshl_b32 s1, s3, 24
1295; GCN-NEXT:    s_or_b32 s0, s0, s1
1296; GCN-NEXT:    ; return to shader part epilog
1297;
1298; GFX10-LABEL: extractelement_sgpr_v8i8_idx0:
1299; GFX10:       ; %bb.0:
1300; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1301; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1302; GFX10-NEXT:    s_movk_i32 s1, 0xff
1303; GFX10-NEXT:    s_lshr_b32 s2, s0, 8
1304; GFX10-NEXT:    s_lshr_b32 s3, s0, 16
1305; GFX10-NEXT:    s_and_b32 s2, s2, s1
1306; GFX10-NEXT:    s_and_b32 s4, s0, s1
1307; GFX10-NEXT:    s_and_b32 s1, s3, s1
1308; GFX10-NEXT:    s_lshl_b32 s2, s2, 8
1309; GFX10-NEXT:    s_lshr_b32 s0, s0, 24
1310; GFX10-NEXT:    s_lshl_b32 s1, s1, 16
1311; GFX10-NEXT:    s_or_b32 s2, s4, s2
1312; GFX10-NEXT:    s_lshl_b32 s0, s0, 24
1313; GFX10-NEXT:    s_or_b32 s1, s2, s1
1314; GFX10-NEXT:    s_or_b32 s0, s1, s0
1315; GFX10-NEXT:    ; return to shader part epilog
1316  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
1317  %element = extractelement <8 x i8> %vector, i32 0
1318  ret i8 %element
1319}
1320
1321define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx1(<8 x i8> addrspace(4)* inreg %ptr) {
1322; GCN-LABEL: extractelement_sgpr_v8i8_idx1:
1323; GCN:       ; %bb.0:
1324; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1325; GCN-NEXT:    s_movk_i32 s4, 0xff
1326; GCN-NEXT:    s_waitcnt lgkmcnt(0)
1327; GCN-NEXT:    s_lshr_b32 s1, s0, 8
1328; GCN-NEXT:    s_and_b32 s1, s1, s4
1329; GCN-NEXT:    s_lshr_b32 s2, s0, 16
1330; GCN-NEXT:    s_lshr_b32 s3, s0, 24
1331; GCN-NEXT:    s_and_b32 s0, s0, s4
1332; GCN-NEXT:    s_lshl_b32 s1, s1, 8
1333; GCN-NEXT:    s_or_b32 s0, s0, s1
1334; GCN-NEXT:    s_and_b32 s1, s2, s4
1335; GCN-NEXT:    s_lshl_b32 s1, s1, 16
1336; GCN-NEXT:    s_or_b32 s0, s0, s1
1337; GCN-NEXT:    s_lshl_b32 s1, s3, 24
1338; GCN-NEXT:    s_or_b32 s0, s0, s1
1339; GCN-NEXT:    s_lshr_b32 s0, s0, 8
1340; GCN-NEXT:    ; return to shader part epilog
1341;
1342; GFX10-LABEL: extractelement_sgpr_v8i8_idx1:
1343; GFX10:       ; %bb.0:
1344; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1345; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1346; GFX10-NEXT:    s_movk_i32 s1, 0xff
1347; GFX10-NEXT:    s_lshr_b32 s2, s0, 8
1348; GFX10-NEXT:    s_lshr_b32 s3, s0, 16
1349; GFX10-NEXT:    s_and_b32 s2, s2, s1
1350; GFX10-NEXT:    s_and_b32 s4, s0, s1
1351; GFX10-NEXT:    s_and_b32 s1, s3, s1
1352; GFX10-NEXT:    s_lshl_b32 s2, s2, 8
1353; GFX10-NEXT:    s_lshr_b32 s0, s0, 24
1354; GFX10-NEXT:    s_lshl_b32 s1, s1, 16
1355; GFX10-NEXT:    s_or_b32 s2, s4, s2
1356; GFX10-NEXT:    s_lshl_b32 s0, s0, 24
1357; GFX10-NEXT:    s_or_b32 s1, s2, s1
1358; GFX10-NEXT:    s_or_b32 s0, s1, s0
1359; GFX10-NEXT:    s_lshr_b32 s0, s0, 8
1360; GFX10-NEXT:    ; return to shader part epilog
1361  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
1362  %element = extractelement <8 x i8> %vector, i32 1
1363  ret i8 %element
1364}
1365
1366define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx2(<8 x i8> addrspace(4)* inreg %ptr) {
1367; GCN-LABEL: extractelement_sgpr_v8i8_idx2:
1368; GCN:       ; %bb.0:
1369; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1370; GCN-NEXT:    s_movk_i32 s4, 0xff
1371; GCN-NEXT:    s_waitcnt lgkmcnt(0)
1372; GCN-NEXT:    s_lshr_b32 s1, s0, 8
1373; GCN-NEXT:    s_and_b32 s1, s1, s4
1374; GCN-NEXT:    s_lshr_b32 s2, s0, 16
1375; GCN-NEXT:    s_lshr_b32 s3, s0, 24
1376; GCN-NEXT:    s_and_b32 s0, s0, s4
1377; GCN-NEXT:    s_lshl_b32 s1, s1, 8
1378; GCN-NEXT:    s_or_b32 s0, s0, s1
1379; GCN-NEXT:    s_and_b32 s1, s2, s4
1380; GCN-NEXT:    s_lshl_b32 s1, s1, 16
1381; GCN-NEXT:    s_or_b32 s0, s0, s1
1382; GCN-NEXT:    s_lshl_b32 s1, s3, 24
1383; GCN-NEXT:    s_or_b32 s0, s0, s1
1384; GCN-NEXT:    s_lshr_b32 s0, s0, 16
1385; GCN-NEXT:    ; return to shader part epilog
1386;
1387; GFX10-LABEL: extractelement_sgpr_v8i8_idx2:
1388; GFX10:       ; %bb.0:
1389; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1390; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1391; GFX10-NEXT:    s_movk_i32 s1, 0xff
1392; GFX10-NEXT:    s_lshr_b32 s2, s0, 8
1393; GFX10-NEXT:    s_lshr_b32 s3, s0, 16
1394; GFX10-NEXT:    s_and_b32 s2, s2, s1
1395; GFX10-NEXT:    s_and_b32 s4, s0, s1
1396; GFX10-NEXT:    s_and_b32 s1, s3, s1
1397; GFX10-NEXT:    s_lshl_b32 s2, s2, 8
1398; GFX10-NEXT:    s_lshr_b32 s0, s0, 24
1399; GFX10-NEXT:    s_lshl_b32 s1, s1, 16
1400; GFX10-NEXT:    s_or_b32 s2, s4, s2
1401; GFX10-NEXT:    s_lshl_b32 s0, s0, 24
1402; GFX10-NEXT:    s_or_b32 s1, s2, s1
1403; GFX10-NEXT:    s_or_b32 s0, s1, s0
1404; GFX10-NEXT:    s_lshr_b32 s0, s0, 16
1405; GFX10-NEXT:    ; return to shader part epilog
1406  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
1407  %element = extractelement <8 x i8> %vector, i32 2
1408  ret i8 %element
1409}
1410
1411define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx3(<8 x i8> addrspace(4)* inreg %ptr) {
1412; GCN-LABEL: extractelement_sgpr_v8i8_idx3:
1413; GCN:       ; %bb.0:
1414; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1415; GCN-NEXT:    s_movk_i32 s4, 0xff
1416; GCN-NEXT:    s_waitcnt lgkmcnt(0)
1417; GCN-NEXT:    s_lshr_b32 s1, s0, 8
1418; GCN-NEXT:    s_and_b32 s1, s1, s4
1419; GCN-NEXT:    s_lshr_b32 s2, s0, 16
1420; GCN-NEXT:    s_lshr_b32 s3, s0, 24
1421; GCN-NEXT:    s_and_b32 s0, s0, s4
1422; GCN-NEXT:    s_lshl_b32 s1, s1, 8
1423; GCN-NEXT:    s_or_b32 s0, s0, s1
1424; GCN-NEXT:    s_and_b32 s1, s2, s4
1425; GCN-NEXT:    s_lshl_b32 s1, s1, 16
1426; GCN-NEXT:    s_or_b32 s0, s0, s1
1427; GCN-NEXT:    s_lshl_b32 s1, s3, 24
1428; GCN-NEXT:    s_or_b32 s0, s0, s1
1429; GCN-NEXT:    s_lshr_b32 s0, s0, 24
1430; GCN-NEXT:    ; return to shader part epilog
1431;
1432; GFX10-LABEL: extractelement_sgpr_v8i8_idx3:
1433; GFX10:       ; %bb.0:
1434; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1435; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1436; GFX10-NEXT:    s_movk_i32 s1, 0xff
1437; GFX10-NEXT:    s_lshr_b32 s2, s0, 8
1438; GFX10-NEXT:    s_lshr_b32 s3, s0, 16
1439; GFX10-NEXT:    s_and_b32 s2, s2, s1
1440; GFX10-NEXT:    s_and_b32 s4, s0, s1
1441; GFX10-NEXT:    s_and_b32 s1, s3, s1
1442; GFX10-NEXT:    s_lshl_b32 s2, s2, 8
1443; GFX10-NEXT:    s_lshr_b32 s0, s0, 24
1444; GFX10-NEXT:    s_lshl_b32 s1, s1, 16
1445; GFX10-NEXT:    s_or_b32 s2, s4, s2
1446; GFX10-NEXT:    s_lshl_b32 s0, s0, 24
1447; GFX10-NEXT:    s_or_b32 s1, s2, s1
1448; GFX10-NEXT:    s_or_b32 s0, s1, s0
1449; GFX10-NEXT:    s_lshr_b32 s0, s0, 24
1450; GFX10-NEXT:    ; return to shader part epilog
1451  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
1452  %element = extractelement <8 x i8> %vector, i32 3
1453  ret i8 %element
1454}
1455
1456define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx4(<8 x i8> addrspace(4)* inreg %ptr) {
1457; GCN-LABEL: extractelement_sgpr_v8i8_idx4:
1458; GCN:       ; %bb.0:
1459; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1460; GCN-NEXT:    s_movk_i32 s4, 0xff
1461; GCN-NEXT:    s_waitcnt lgkmcnt(0)
1462; GCN-NEXT:    s_lshr_b32 s0, s1, 8
1463; GCN-NEXT:    s_and_b32 s0, s0, s4
1464; GCN-NEXT:    s_lshr_b32 s2, s1, 16
1465; GCN-NEXT:    s_lshr_b32 s3, s1, 24
1466; GCN-NEXT:    s_and_b32 s1, s1, s4
1467; GCN-NEXT:    s_lshl_b32 s0, s0, 8
1468; GCN-NEXT:    s_or_b32 s0, s1, s0
1469; GCN-NEXT:    s_and_b32 s1, s2, s4
1470; GCN-NEXT:    s_lshl_b32 s1, s1, 16
1471; GCN-NEXT:    s_or_b32 s0, s0, s1
1472; GCN-NEXT:    s_lshl_b32 s1, s3, 24
1473; GCN-NEXT:    s_or_b32 s0, s0, s1
1474; GCN-NEXT:    ; return to shader part epilog
1475;
1476; GFX10-LABEL: extractelement_sgpr_v8i8_idx4:
1477; GFX10:       ; %bb.0:
1478; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1479; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1480; GFX10-NEXT:    s_movk_i32 s0, 0xff
1481; GFX10-NEXT:    s_lshr_b32 s2, s1, 8
1482; GFX10-NEXT:    s_lshr_b32 s3, s1, 16
1483; GFX10-NEXT:    s_and_b32 s2, s2, s0
1484; GFX10-NEXT:    s_and_b32 s4, s1, s0
1485; GFX10-NEXT:    s_and_b32 s0, s3, s0
1486; GFX10-NEXT:    s_lshl_b32 s2, s2, 8
1487; GFX10-NEXT:    s_lshr_b32 s1, s1, 24
1488; GFX10-NEXT:    s_lshl_b32 s0, s0, 16
1489; GFX10-NEXT:    s_or_b32 s2, s4, s2
1490; GFX10-NEXT:    s_lshl_b32 s1, s1, 24
1491; GFX10-NEXT:    s_or_b32 s0, s2, s0
1492; GFX10-NEXT:    s_or_b32 s0, s0, s1
1493; GFX10-NEXT:    ; return to shader part epilog
1494  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
1495  %element = extractelement <8 x i8> %vector, i32 4
1496  ret i8 %element
1497}
1498
1499define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx5(<8 x i8> addrspace(4)* inreg %ptr) {
1500; GCN-LABEL: extractelement_sgpr_v8i8_idx5:
1501; GCN:       ; %bb.0:
1502; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1503; GCN-NEXT:    s_movk_i32 s4, 0xff
1504; GCN-NEXT:    s_waitcnt lgkmcnt(0)
1505; GCN-NEXT:    s_lshr_b32 s0, s1, 8
1506; GCN-NEXT:    s_and_b32 s0, s0, s4
1507; GCN-NEXT:    s_lshr_b32 s2, s1, 16
1508; GCN-NEXT:    s_lshr_b32 s3, s1, 24
1509; GCN-NEXT:    s_and_b32 s1, s1, s4
1510; GCN-NEXT:    s_lshl_b32 s0, s0, 8
1511; GCN-NEXT:    s_or_b32 s0, s1, s0
1512; GCN-NEXT:    s_and_b32 s1, s2, s4
1513; GCN-NEXT:    s_lshl_b32 s1, s1, 16
1514; GCN-NEXT:    s_or_b32 s0, s0, s1
1515; GCN-NEXT:    s_lshl_b32 s1, s3, 24
1516; GCN-NEXT:    s_or_b32 s0, s0, s1
1517; GCN-NEXT:    s_lshr_b32 s0, s0, 8
1518; GCN-NEXT:    ; return to shader part epilog
1519;
1520; GFX10-LABEL: extractelement_sgpr_v8i8_idx5:
1521; GFX10:       ; %bb.0:
1522; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1523; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1524; GFX10-NEXT:    s_movk_i32 s0, 0xff
1525; GFX10-NEXT:    s_lshr_b32 s2, s1, 8
1526; GFX10-NEXT:    s_lshr_b32 s3, s1, 16
1527; GFX10-NEXT:    s_and_b32 s2, s2, s0
1528; GFX10-NEXT:    s_and_b32 s4, s1, s0
1529; GFX10-NEXT:    s_and_b32 s0, s3, s0
1530; GFX10-NEXT:    s_lshl_b32 s2, s2, 8
1531; GFX10-NEXT:    s_lshr_b32 s1, s1, 24
1532; GFX10-NEXT:    s_lshl_b32 s0, s0, 16
1533; GFX10-NEXT:    s_or_b32 s2, s4, s2
1534; GFX10-NEXT:    s_lshl_b32 s1, s1, 24
1535; GFX10-NEXT:    s_or_b32 s0, s2, s0
1536; GFX10-NEXT:    s_or_b32 s0, s0, s1
1537; GFX10-NEXT:    s_lshr_b32 s0, s0, 8
1538; GFX10-NEXT:    ; return to shader part epilog
1539  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
1540  %element = extractelement <8 x i8> %vector, i32 5
1541  ret i8 %element
1542}
1543
1544define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx6(<8 x i8> addrspace(4)* inreg %ptr) {
1545; GCN-LABEL: extractelement_sgpr_v8i8_idx6:
1546; GCN:       ; %bb.0:
1547; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1548; GCN-NEXT:    s_movk_i32 s4, 0xff
1549; GCN-NEXT:    s_waitcnt lgkmcnt(0)
1550; GCN-NEXT:    s_lshr_b32 s0, s1, 8
1551; GCN-NEXT:    s_and_b32 s0, s0, s4
1552; GCN-NEXT:    s_lshr_b32 s2, s1, 16
1553; GCN-NEXT:    s_lshr_b32 s3, s1, 24
1554; GCN-NEXT:    s_and_b32 s1, s1, s4
1555; GCN-NEXT:    s_lshl_b32 s0, s0, 8
1556; GCN-NEXT:    s_or_b32 s0, s1, s0
1557; GCN-NEXT:    s_and_b32 s1, s2, s4
1558; GCN-NEXT:    s_lshl_b32 s1, s1, 16
1559; GCN-NEXT:    s_or_b32 s0, s0, s1
1560; GCN-NEXT:    s_lshl_b32 s1, s3, 24
1561; GCN-NEXT:    s_or_b32 s0, s0, s1
1562; GCN-NEXT:    s_lshr_b32 s0, s0, 16
1563; GCN-NEXT:    ; return to shader part epilog
1564;
1565; GFX10-LABEL: extractelement_sgpr_v8i8_idx6:
1566; GFX10:       ; %bb.0:
1567; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1568; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1569; GFX10-NEXT:    s_movk_i32 s0, 0xff
1570; GFX10-NEXT:    s_lshr_b32 s2, s1, 8
1571; GFX10-NEXT:    s_lshr_b32 s3, s1, 16
1572; GFX10-NEXT:    s_and_b32 s2, s2, s0
1573; GFX10-NEXT:    s_and_b32 s4, s1, s0
1574; GFX10-NEXT:    s_and_b32 s0, s3, s0
1575; GFX10-NEXT:    s_lshl_b32 s2, s2, 8
1576; GFX10-NEXT:    s_lshr_b32 s1, s1, 24
1577; GFX10-NEXT:    s_lshl_b32 s0, s0, 16
1578; GFX10-NEXT:    s_or_b32 s2, s4, s2
1579; GFX10-NEXT:    s_lshl_b32 s1, s1, 24
1580; GFX10-NEXT:    s_or_b32 s0, s2, s0
1581; GFX10-NEXT:    s_or_b32 s0, s0, s1
1582; GFX10-NEXT:    s_lshr_b32 s0, s0, 16
1583; GFX10-NEXT:    ; return to shader part epilog
1584  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
1585  %element = extractelement <8 x i8> %vector, i32 6
1586  ret i8 %element
1587}
1588
1589define amdgpu_ps i8 @extractelement_sgpr_v8i8_idx7(<8 x i8> addrspace(4)* inreg %ptr) {
1590; GCN-LABEL: extractelement_sgpr_v8i8_idx7:
1591; GCN:       ; %bb.0:
1592; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1593; GCN-NEXT:    s_movk_i32 s4, 0xff
1594; GCN-NEXT:    s_waitcnt lgkmcnt(0)
1595; GCN-NEXT:    s_lshr_b32 s0, s1, 8
1596; GCN-NEXT:    s_and_b32 s0, s0, s4
1597; GCN-NEXT:    s_lshr_b32 s2, s1, 16
1598; GCN-NEXT:    s_lshr_b32 s3, s1, 24
1599; GCN-NEXT:    s_and_b32 s1, s1, s4
1600; GCN-NEXT:    s_lshl_b32 s0, s0, 8
1601; GCN-NEXT:    s_or_b32 s0, s1, s0
1602; GCN-NEXT:    s_and_b32 s1, s2, s4
1603; GCN-NEXT:    s_lshl_b32 s1, s1, 16
1604; GCN-NEXT:    s_or_b32 s0, s0, s1
1605; GCN-NEXT:    s_lshl_b32 s1, s3, 24
1606; GCN-NEXT:    s_or_b32 s0, s0, s1
1607; GCN-NEXT:    s_lshr_b32 s0, s0, 24
1608; GCN-NEXT:    ; return to shader part epilog
1609;
1610; GFX10-LABEL: extractelement_sgpr_v8i8_idx7:
1611; GFX10:       ; %bb.0:
1612; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
1613; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1614; GFX10-NEXT:    s_movk_i32 s0, 0xff
1615; GFX10-NEXT:    s_lshr_b32 s2, s1, 8
1616; GFX10-NEXT:    s_lshr_b32 s3, s1, 16
1617; GFX10-NEXT:    s_and_b32 s2, s2, s0
1618; GFX10-NEXT:    s_and_b32 s4, s1, s0
1619; GFX10-NEXT:    s_and_b32 s0, s3, s0
1620; GFX10-NEXT:    s_lshl_b32 s2, s2, 8
1621; GFX10-NEXT:    s_lshr_b32 s1, s1, 24
1622; GFX10-NEXT:    s_lshl_b32 s0, s0, 16
1623; GFX10-NEXT:    s_or_b32 s2, s4, s2
1624; GFX10-NEXT:    s_lshl_b32 s1, s1, 24
1625; GFX10-NEXT:    s_or_b32 s0, s2, s0
1626; GFX10-NEXT:    s_or_b32 s0, s0, s1
1627; GFX10-NEXT:    s_lshr_b32 s0, s0, 24
1628; GFX10-NEXT:    ; return to shader part epilog
1629  %vector = load <8 x i8>, <8 x i8> addrspace(4)* %ptr
1630  %element = extractelement <8 x i8> %vector, i32 7
1631  ret i8 %element
1632}
1633
1634define i8 @extractelement_vgpr_v8i8_idx0(<8 x i8> addrspace(1)* %ptr) {
1635; GFX9-LABEL: extractelement_vgpr_v8i8_idx0:
1636; GFX9:       ; %bb.0:
1637; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1638; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1639; GFX9-NEXT:    s_mov_b32 s4, 8
1640; GFX9-NEXT:    s_movk_i32 s5, 0xff
1641; GFX9-NEXT:    s_waitcnt vmcnt(0)
1642; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
1643; GFX9-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
1644; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1645; GFX9-NEXT:    v_and_b32_sdwa v3, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1646; GFX9-NEXT:    v_and_or_b32 v0, v0, s5, v1
1647; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
1648; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
1649; GFX9-NEXT:    s_setpc_b64 s[30:31]
1650;
1651; GFX8-LABEL: extractelement_vgpr_v8i8_idx0:
1652; GFX8:       ; %bb.0:
1653; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1654; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1655; GFX8-NEXT:    s_movk_i32 s4, 0xff
1656; GFX8-NEXT:    s_waitcnt vmcnt(0)
1657; GFX8-NEXT:    v_mov_b32_e32 v1, 8
1658; GFX8-NEXT:    v_mov_b32_e32 v2, s4
1659; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v0
1660; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1661; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
1662; GFX8-NEXT:    v_and_b32_sdwa v2, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1663; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1664; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
1665; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
1666; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
1667; GFX8-NEXT:    s_setpc_b64 s[30:31]
1668;
1669; GFX7-LABEL: extractelement_vgpr_v8i8_idx0:
1670; GFX7:       ; %bb.0:
1671; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1672; GFX7-NEXT:    s_mov_b32 s6, 0
1673; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1674; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1675; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
1676; GFX7-NEXT:    s_movk_i32 s4, 0xff
1677; GFX7-NEXT:    s_waitcnt vmcnt(0)
1678; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
1679; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
1680; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
1681; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
1682; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
1683; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
1684; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
1685; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
1686; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
1687; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
1688; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
1689; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
1690; GFX7-NEXT:    s_setpc_b64 s[30:31]
1691;
1692; GFX10-LABEL: extractelement_vgpr_v8i8_idx0:
1693; GFX10:       ; %bb.0:
1694; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1695; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1696; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1697; GFX10-NEXT:    s_mov_b32 s4, 8
1698; GFX10-NEXT:    s_waitcnt vmcnt(0)
1699; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
1700; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
1701; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1702; GFX10-NEXT:    s_movk_i32 s4, 0xff
1703; GFX10-NEXT:    v_and_b32_sdwa v3, v0, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1704; GFX10-NEXT:    v_and_or_b32 v0, v0, s4, v1
1705; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
1706; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
1707; GFX10-NEXT:    s_setpc_b64 s[30:31]
1708  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
1709  %element = extractelement <8 x i8> %vector, i32 0
1710  ret i8 %element
1711}
1712
1713define i8 @extractelement_vgpr_v8i8_idx1(<8 x i8> addrspace(1)* %ptr) {
1714; GFX9-LABEL: extractelement_vgpr_v8i8_idx1:
1715; GFX9:       ; %bb.0:
1716; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1717; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1718; GFX9-NEXT:    s_mov_b32 s4, 8
1719; GFX9-NEXT:    s_movk_i32 s5, 0xff
1720; GFX9-NEXT:    s_waitcnt vmcnt(0)
1721; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
1722; GFX9-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
1723; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1724; GFX9-NEXT:    v_and_b32_sdwa v3, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1725; GFX9-NEXT:    v_and_or_b32 v0, v0, s5, v1
1726; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
1727; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
1728; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
1729; GFX9-NEXT:    s_setpc_b64 s[30:31]
1730;
1731; GFX8-LABEL: extractelement_vgpr_v8i8_idx1:
1732; GFX8:       ; %bb.0:
1733; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1734; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1735; GFX8-NEXT:    s_movk_i32 s4, 0xff
1736; GFX8-NEXT:    s_waitcnt vmcnt(0)
1737; GFX8-NEXT:    v_mov_b32_e32 v1, 8
1738; GFX8-NEXT:    v_mov_b32_e32 v2, s4
1739; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v0
1740; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1741; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
1742; GFX8-NEXT:    v_and_b32_sdwa v2, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1743; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1744; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
1745; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
1746; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
1747; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
1748; GFX8-NEXT:    s_setpc_b64 s[30:31]
1749;
1750; GFX7-LABEL: extractelement_vgpr_v8i8_idx1:
1751; GFX7:       ; %bb.0:
1752; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1753; GFX7-NEXT:    s_mov_b32 s6, 0
1754; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1755; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1756; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
1757; GFX7-NEXT:    s_movk_i32 s4, 0xff
1758; GFX7-NEXT:    s_waitcnt vmcnt(0)
1759; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
1760; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
1761; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
1762; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
1763; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
1764; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
1765; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
1766; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
1767; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
1768; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
1769; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
1770; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
1771; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
1772; GFX7-NEXT:    s_setpc_b64 s[30:31]
1773;
1774; GFX10-LABEL: extractelement_vgpr_v8i8_idx1:
1775; GFX10:       ; %bb.0:
1776; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1777; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1778; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1779; GFX10-NEXT:    s_mov_b32 s4, 8
1780; GFX10-NEXT:    s_waitcnt vmcnt(0)
1781; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
1782; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
1783; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1784; GFX10-NEXT:    s_movk_i32 s4, 0xff
1785; GFX10-NEXT:    v_and_b32_sdwa v3, v0, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1786; GFX10-NEXT:    v_and_or_b32 v0, v0, s4, v1
1787; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
1788; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
1789; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
1790; GFX10-NEXT:    s_setpc_b64 s[30:31]
1791  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
1792  %element = extractelement <8 x i8> %vector, i32 1
1793  ret i8 %element
1794}
1795
1796define i8 @extractelement_vgpr_v8i8_idx2(<8 x i8> addrspace(1)* %ptr) {
1797; GFX9-LABEL: extractelement_vgpr_v8i8_idx2:
1798; GFX9:       ; %bb.0:
1799; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1800; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1801; GFX9-NEXT:    s_mov_b32 s4, 8
1802; GFX9-NEXT:    s_movk_i32 s5, 0xff
1803; GFX9-NEXT:    s_waitcnt vmcnt(0)
1804; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
1805; GFX9-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
1806; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1807; GFX9-NEXT:    v_and_b32_sdwa v3, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1808; GFX9-NEXT:    v_and_or_b32 v0, v0, s5, v1
1809; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
1810; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
1811; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1812; GFX9-NEXT:    s_setpc_b64 s[30:31]
1813;
1814; GFX8-LABEL: extractelement_vgpr_v8i8_idx2:
1815; GFX8:       ; %bb.0:
1816; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1817; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1818; GFX8-NEXT:    s_movk_i32 s4, 0xff
1819; GFX8-NEXT:    s_waitcnt vmcnt(0)
1820; GFX8-NEXT:    v_mov_b32_e32 v1, 8
1821; GFX8-NEXT:    v_mov_b32_e32 v2, s4
1822; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v0
1823; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1824; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
1825; GFX8-NEXT:    v_and_b32_sdwa v2, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1826; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1827; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
1828; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
1829; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
1830; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1831; GFX8-NEXT:    s_setpc_b64 s[30:31]
1832;
1833; GFX7-LABEL: extractelement_vgpr_v8i8_idx2:
1834; GFX7:       ; %bb.0:
1835; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1836; GFX7-NEXT:    s_mov_b32 s6, 0
1837; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1838; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1839; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
1840; GFX7-NEXT:    s_movk_i32 s4, 0xff
1841; GFX7-NEXT:    s_waitcnt vmcnt(0)
1842; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
1843; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
1844; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
1845; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
1846; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
1847; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
1848; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
1849; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
1850; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
1851; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
1852; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
1853; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
1854; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1855; GFX7-NEXT:    s_setpc_b64 s[30:31]
1856;
1857; GFX10-LABEL: extractelement_vgpr_v8i8_idx2:
1858; GFX10:       ; %bb.0:
1859; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1860; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1861; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1862; GFX10-NEXT:    s_mov_b32 s4, 8
1863; GFX10-NEXT:    s_waitcnt vmcnt(0)
1864; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
1865; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
1866; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1867; GFX10-NEXT:    s_movk_i32 s4, 0xff
1868; GFX10-NEXT:    v_and_b32_sdwa v3, v0, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1869; GFX10-NEXT:    v_and_or_b32 v0, v0, s4, v1
1870; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
1871; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
1872; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1873; GFX10-NEXT:    s_setpc_b64 s[30:31]
1874  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
1875  %element = extractelement <8 x i8> %vector, i32 2
1876  ret i8 %element
1877}
1878
1879define i8 @extractelement_vgpr_v8i8_idx3(<8 x i8> addrspace(1)* %ptr) {
1880; GFX9-LABEL: extractelement_vgpr_v8i8_idx3:
1881; GFX9:       ; %bb.0:
1882; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1883; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1884; GFX9-NEXT:    s_mov_b32 s4, 8
1885; GFX9-NEXT:    s_movk_i32 s5, 0xff
1886; GFX9-NEXT:    s_waitcnt vmcnt(0)
1887; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
1888; GFX9-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
1889; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1890; GFX9-NEXT:    v_and_b32_sdwa v3, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1891; GFX9-NEXT:    v_and_or_b32 v0, v0, s5, v1
1892; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
1893; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
1894; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
1895; GFX9-NEXT:    s_setpc_b64 s[30:31]
1896;
1897; GFX8-LABEL: extractelement_vgpr_v8i8_idx3:
1898; GFX8:       ; %bb.0:
1899; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1900; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1901; GFX8-NEXT:    s_movk_i32 s4, 0xff
1902; GFX8-NEXT:    s_waitcnt vmcnt(0)
1903; GFX8-NEXT:    v_mov_b32_e32 v1, 8
1904; GFX8-NEXT:    v_mov_b32_e32 v2, s4
1905; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v0
1906; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1907; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
1908; GFX8-NEXT:    v_and_b32_sdwa v2, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1909; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1910; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
1911; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
1912; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
1913; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
1914; GFX8-NEXT:    s_setpc_b64 s[30:31]
1915;
1916; GFX7-LABEL: extractelement_vgpr_v8i8_idx3:
1917; GFX7:       ; %bb.0:
1918; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1919; GFX7-NEXT:    s_mov_b32 s6, 0
1920; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1921; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1922; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
1923; GFX7-NEXT:    s_movk_i32 s4, 0xff
1924; GFX7-NEXT:    s_waitcnt vmcnt(0)
1925; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
1926; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
1927; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
1928; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
1929; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
1930; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
1931; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
1932; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
1933; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
1934; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
1935; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
1936; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
1937; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
1938; GFX7-NEXT:    s_setpc_b64 s[30:31]
1939;
1940; GFX10-LABEL: extractelement_vgpr_v8i8_idx3:
1941; GFX10:       ; %bb.0:
1942; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1943; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1944; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1945; GFX10-NEXT:    s_mov_b32 s4, 8
1946; GFX10-NEXT:    s_waitcnt vmcnt(0)
1947; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
1948; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
1949; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1950; GFX10-NEXT:    s_movk_i32 s4, 0xff
1951; GFX10-NEXT:    v_and_b32_sdwa v3, v0, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1952; GFX10-NEXT:    v_and_or_b32 v0, v0, s4, v1
1953; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
1954; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
1955; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
1956; GFX10-NEXT:    s_setpc_b64 s[30:31]
1957  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
1958  %element = extractelement <8 x i8> %vector, i32 3
1959  ret i8 %element
1960}
1961
1962define i8 @extractelement_vgpr_v8i8_idx4(<8 x i8> addrspace(1)* %ptr) {
1963; GFX9-LABEL: extractelement_vgpr_v8i8_idx4:
1964; GFX9:       ; %bb.0:
1965; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1966; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1967; GFX9-NEXT:    s_mov_b32 s4, 8
1968; GFX9-NEXT:    s_movk_i32 s5, 0xff
1969; GFX9-NEXT:    s_waitcnt vmcnt(0)
1970; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
1971; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1972; GFX9-NEXT:    v_lshrrev_b32_e32 v2, 24, v1
1973; GFX9-NEXT:    v_and_b32_sdwa v3, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1974; GFX9-NEXT:    v_and_or_b32 v0, v1, s5, v0
1975; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
1976; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
1977; GFX9-NEXT:    s_setpc_b64 s[30:31]
1978;
1979; GFX8-LABEL: extractelement_vgpr_v8i8_idx4:
1980; GFX8:       ; %bb.0:
1981; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1982; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1983; GFX8-NEXT:    s_movk_i32 s4, 0xff
1984; GFX8-NEXT:    s_waitcnt vmcnt(0)
1985; GFX8-NEXT:    v_mov_b32_e32 v0, 8
1986; GFX8-NEXT:    v_mov_b32_e32 v2, s4
1987; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v1
1988; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
1989; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v1
1990; GFX8-NEXT:    v_and_b32_sdwa v2, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1991; GFX8-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
1992; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
1993; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
1994; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
1995; GFX8-NEXT:    s_setpc_b64 s[30:31]
1996;
1997; GFX7-LABEL: extractelement_vgpr_v8i8_idx4:
1998; GFX7:       ; %bb.0:
1999; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2000; GFX7-NEXT:    s_mov_b32 s6, 0
2001; GFX7-NEXT:    s_mov_b32 s7, 0xf000
2002; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2003; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
2004; GFX7-NEXT:    s_movk_i32 s4, 0xff
2005; GFX7-NEXT:    s_waitcnt vmcnt(0)
2006; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
2007; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v1
2008; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
2009; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
2010; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
2011; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
2012; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
2013; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
2014; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
2015; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
2016; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
2017; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
2018; GFX7-NEXT:    s_setpc_b64 s[30:31]
2019;
2020; GFX10-LABEL: extractelement_vgpr_v8i8_idx4:
2021; GFX10:       ; %bb.0:
2022; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2023; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
2024; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
2025; GFX10-NEXT:    s_mov_b32 s4, 8
2026; GFX10-NEXT:    s_waitcnt vmcnt(0)
2027; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
2028; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v1
2029; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2030; GFX10-NEXT:    s_movk_i32 s4, 0xff
2031; GFX10-NEXT:    v_and_b32_sdwa v3, v1, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2032; GFX10-NEXT:    v_and_or_b32 v0, v1, s4, v0
2033; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
2034; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
2035; GFX10-NEXT:    s_setpc_b64 s[30:31]
2036  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
2037  %element = extractelement <8 x i8> %vector, i32 4
2038  ret i8 %element
2039}
2040
2041define i8 @extractelement_vgpr_v8i8_idx5(<8 x i8> addrspace(1)* %ptr) {
2042; GFX9-LABEL: extractelement_vgpr_v8i8_idx5:
2043; GFX9:       ; %bb.0:
2044; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2045; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
2046; GFX9-NEXT:    s_mov_b32 s4, 8
2047; GFX9-NEXT:    s_movk_i32 s5, 0xff
2048; GFX9-NEXT:    s_waitcnt vmcnt(0)
2049; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
2050; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2051; GFX9-NEXT:    v_lshrrev_b32_e32 v2, 24, v1
2052; GFX9-NEXT:    v_and_b32_sdwa v3, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2053; GFX9-NEXT:    v_and_or_b32 v0, v1, s5, v0
2054; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
2055; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
2056; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
2057; GFX9-NEXT:    s_setpc_b64 s[30:31]
2058;
2059; GFX8-LABEL: extractelement_vgpr_v8i8_idx5:
2060; GFX8:       ; %bb.0:
2061; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2062; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
2063; GFX8-NEXT:    s_movk_i32 s4, 0xff
2064; GFX8-NEXT:    s_waitcnt vmcnt(0)
2065; GFX8-NEXT:    v_mov_b32_e32 v0, 8
2066; GFX8-NEXT:    v_mov_b32_e32 v2, s4
2067; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v1
2068; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2069; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v1
2070; GFX8-NEXT:    v_and_b32_sdwa v2, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2071; GFX8-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2072; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
2073; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
2074; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
2075; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
2076; GFX8-NEXT:    s_setpc_b64 s[30:31]
2077;
2078; GFX7-LABEL: extractelement_vgpr_v8i8_idx5:
2079; GFX7:       ; %bb.0:
2080; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2081; GFX7-NEXT:    s_mov_b32 s6, 0
2082; GFX7-NEXT:    s_mov_b32 s7, 0xf000
2083; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2084; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
2085; GFX7-NEXT:    s_movk_i32 s4, 0xff
2086; GFX7-NEXT:    s_waitcnt vmcnt(0)
2087; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
2088; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v1
2089; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
2090; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
2091; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
2092; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
2093; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
2094; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
2095; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
2096; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
2097; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
2098; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
2099; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
2100; GFX7-NEXT:    s_setpc_b64 s[30:31]
2101;
2102; GFX10-LABEL: extractelement_vgpr_v8i8_idx5:
2103; GFX10:       ; %bb.0:
2104; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2105; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
2106; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
2107; GFX10-NEXT:    s_mov_b32 s4, 8
2108; GFX10-NEXT:    s_waitcnt vmcnt(0)
2109; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
2110; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v1
2111; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2112; GFX10-NEXT:    s_movk_i32 s4, 0xff
2113; GFX10-NEXT:    v_and_b32_sdwa v3, v1, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2114; GFX10-NEXT:    v_and_or_b32 v0, v1, s4, v0
2115; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
2116; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
2117; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
2118; GFX10-NEXT:    s_setpc_b64 s[30:31]
2119  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
2120  %element = extractelement <8 x i8> %vector, i32 5
2121  ret i8 %element
2122}
2123
2124define i8 @extractelement_vgpr_v8i8_idx6(<8 x i8> addrspace(1)* %ptr) {
2125; GFX9-LABEL: extractelement_vgpr_v8i8_idx6:
2126; GFX9:       ; %bb.0:
2127; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2128; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
2129; GFX9-NEXT:    s_mov_b32 s4, 8
2130; GFX9-NEXT:    s_movk_i32 s5, 0xff
2131; GFX9-NEXT:    s_waitcnt vmcnt(0)
2132; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
2133; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2134; GFX9-NEXT:    v_lshrrev_b32_e32 v2, 24, v1
2135; GFX9-NEXT:    v_and_b32_sdwa v3, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2136; GFX9-NEXT:    v_and_or_b32 v0, v1, s5, v0
2137; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
2138; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
2139; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
2140; GFX9-NEXT:    s_setpc_b64 s[30:31]
2141;
2142; GFX8-LABEL: extractelement_vgpr_v8i8_idx6:
2143; GFX8:       ; %bb.0:
2144; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2145; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
2146; GFX8-NEXT:    s_movk_i32 s4, 0xff
2147; GFX8-NEXT:    s_waitcnt vmcnt(0)
2148; GFX8-NEXT:    v_mov_b32_e32 v0, 8
2149; GFX8-NEXT:    v_mov_b32_e32 v2, s4
2150; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v1
2151; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2152; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v1
2153; GFX8-NEXT:    v_and_b32_sdwa v2, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2154; GFX8-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2155; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
2156; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
2157; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
2158; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
2159; GFX8-NEXT:    s_setpc_b64 s[30:31]
2160;
2161; GFX7-LABEL: extractelement_vgpr_v8i8_idx6:
2162; GFX7:       ; %bb.0:
2163; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2164; GFX7-NEXT:    s_mov_b32 s6, 0
2165; GFX7-NEXT:    s_mov_b32 s7, 0xf000
2166; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2167; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
2168; GFX7-NEXT:    s_movk_i32 s4, 0xff
2169; GFX7-NEXT:    s_waitcnt vmcnt(0)
2170; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
2171; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v1
2172; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
2173; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
2174; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
2175; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
2176; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
2177; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
2178; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
2179; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
2180; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
2181; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
2182; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
2183; GFX7-NEXT:    s_setpc_b64 s[30:31]
2184;
2185; GFX10-LABEL: extractelement_vgpr_v8i8_idx6:
2186; GFX10:       ; %bb.0:
2187; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2188; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
2189; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
2190; GFX10-NEXT:    s_mov_b32 s4, 8
2191; GFX10-NEXT:    s_waitcnt vmcnt(0)
2192; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
2193; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v1
2194; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2195; GFX10-NEXT:    s_movk_i32 s4, 0xff
2196; GFX10-NEXT:    v_and_b32_sdwa v3, v1, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2197; GFX10-NEXT:    v_and_or_b32 v0, v1, s4, v0
2198; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
2199; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
2200; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
2201; GFX10-NEXT:    s_setpc_b64 s[30:31]
2202  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
2203  %element = extractelement <8 x i8> %vector, i32 6
2204  ret i8 %element
2205}
2206
2207define i8 @extractelement_vgpr_v8i8_idx7(<8 x i8> addrspace(1)* %ptr) {
2208; GFX9-LABEL: extractelement_vgpr_v8i8_idx7:
2209; GFX9:       ; %bb.0:
2210; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2211; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
2212; GFX9-NEXT:    s_mov_b32 s4, 8
2213; GFX9-NEXT:    s_movk_i32 s5, 0xff
2214; GFX9-NEXT:    s_waitcnt vmcnt(0)
2215; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
2216; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2217; GFX9-NEXT:    v_lshrrev_b32_e32 v2, 24, v1
2218; GFX9-NEXT:    v_and_b32_sdwa v3, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2219; GFX9-NEXT:    v_and_or_b32 v0, v1, s5, v0
2220; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
2221; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
2222; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
2223; GFX9-NEXT:    s_setpc_b64 s[30:31]
2224;
2225; GFX8-LABEL: extractelement_vgpr_v8i8_idx7:
2226; GFX8:       ; %bb.0:
2227; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2228; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
2229; GFX8-NEXT:    s_movk_i32 s4, 0xff
2230; GFX8-NEXT:    s_waitcnt vmcnt(0)
2231; GFX8-NEXT:    v_mov_b32_e32 v0, 8
2232; GFX8-NEXT:    v_mov_b32_e32 v2, s4
2233; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v1
2234; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2235; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v1
2236; GFX8-NEXT:    v_and_b32_sdwa v2, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2237; GFX8-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2238; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
2239; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
2240; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
2241; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
2242; GFX8-NEXT:    s_setpc_b64 s[30:31]
2243;
2244; GFX7-LABEL: extractelement_vgpr_v8i8_idx7:
2245; GFX7:       ; %bb.0:
2246; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2247; GFX7-NEXT:    s_mov_b32 s6, 0
2248; GFX7-NEXT:    s_mov_b32 s7, 0xf000
2249; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2250; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
2251; GFX7-NEXT:    s_movk_i32 s4, 0xff
2252; GFX7-NEXT:    s_waitcnt vmcnt(0)
2253; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
2254; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v1
2255; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
2256; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
2257; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
2258; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
2259; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
2260; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
2261; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
2262; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
2263; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
2264; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
2265; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
2266; GFX7-NEXT:    s_setpc_b64 s[30:31]
2267;
2268; GFX10-LABEL: extractelement_vgpr_v8i8_idx7:
2269; GFX10:       ; %bb.0:
2270; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2271; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
2272; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
2273; GFX10-NEXT:    s_mov_b32 s4, 8
2274; GFX10-NEXT:    s_waitcnt vmcnt(0)
2275; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
2276; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v1
2277; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2278; GFX10-NEXT:    s_movk_i32 s4, 0xff
2279; GFX10-NEXT:    v_and_b32_sdwa v3, v1, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2280; GFX10-NEXT:    v_and_or_b32 v0, v1, s4, v0
2281; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
2282; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
2283; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
2284; GFX10-NEXT:    s_setpc_b64 s[30:31]
2285  %vector = load <8 x i8>, <8 x i8> addrspace(1)* %ptr
2286  %element = extractelement <8 x i8> %vector, i32 7
2287  ret i8 %element
2288}
2289
2290define amdgpu_ps i8 @extractelement_sgpr_v16i8_sgpr_idx(<16 x i8> addrspace(4)* inreg %ptr, i32 inreg %idx) {
2291; GCN-LABEL: extractelement_sgpr_v16i8_sgpr_idx:
2292; GCN:       ; %bb.0:
2293; GCN-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
2294; GCN-NEXT:    s_movk_i32 s17, 0xff
2295; GCN-NEXT:    s_waitcnt lgkmcnt(0)
2296; GCN-NEXT:    s_lshr_b32 s5, s0, 8
2297; GCN-NEXT:    s_and_b32 s5, s5, s17
2298; GCN-NEXT:    s_lshr_b32 s6, s0, 16
2299; GCN-NEXT:    s_lshr_b32 s7, s0, 24
2300; GCN-NEXT:    s_and_b32 s0, s0, s17
2301; GCN-NEXT:    s_lshl_b32 s5, s5, 8
2302; GCN-NEXT:    s_or_b32 s0, s0, s5
2303; GCN-NEXT:    s_and_b32 s5, s6, s17
2304; GCN-NEXT:    s_lshl_b32 s5, s5, 16
2305; GCN-NEXT:    s_or_b32 s0, s0, s5
2306; GCN-NEXT:    s_lshl_b32 s5, s7, 24
2307; GCN-NEXT:    s_lshr_b32 s8, s1, 8
2308; GCN-NEXT:    s_or_b32 s0, s0, s5
2309; GCN-NEXT:    s_and_b32 s5, s8, s17
2310; GCN-NEXT:    s_lshr_b32 s9, s1, 16
2311; GCN-NEXT:    s_lshr_b32 s10, s1, 24
2312; GCN-NEXT:    s_and_b32 s1, s1, s17
2313; GCN-NEXT:    s_lshl_b32 s5, s5, 8
2314; GCN-NEXT:    s_or_b32 s1, s1, s5
2315; GCN-NEXT:    s_and_b32 s5, s9, s17
2316; GCN-NEXT:    s_lshl_b32 s5, s5, 16
2317; GCN-NEXT:    s_or_b32 s1, s1, s5
2318; GCN-NEXT:    s_lshl_b32 s5, s10, 24
2319; GCN-NEXT:    s_lshr_b32 s11, s2, 8
2320; GCN-NEXT:    s_or_b32 s1, s1, s5
2321; GCN-NEXT:    s_and_b32 s5, s11, s17
2322; GCN-NEXT:    s_lshr_b32 s12, s2, 16
2323; GCN-NEXT:    s_lshr_b32 s13, s2, 24
2324; GCN-NEXT:    s_and_b32 s2, s2, s17
2325; GCN-NEXT:    s_lshl_b32 s5, s5, 8
2326; GCN-NEXT:    s_or_b32 s2, s2, s5
2327; GCN-NEXT:    s_and_b32 s5, s12, s17
2328; GCN-NEXT:    s_lshl_b32 s5, s5, 16
2329; GCN-NEXT:    s_or_b32 s2, s2, s5
2330; GCN-NEXT:    s_lshl_b32 s5, s13, 24
2331; GCN-NEXT:    s_lshr_b32 s14, s3, 8
2332; GCN-NEXT:    s_or_b32 s2, s2, s5
2333; GCN-NEXT:    s_and_b32 s5, s14, s17
2334; GCN-NEXT:    s_lshr_b32 s15, s3, 16
2335; GCN-NEXT:    s_lshr_b32 s16, s3, 24
2336; GCN-NEXT:    s_and_b32 s3, s3, s17
2337; GCN-NEXT:    s_lshl_b32 s5, s5, 8
2338; GCN-NEXT:    s_or_b32 s3, s3, s5
2339; GCN-NEXT:    s_and_b32 s5, s15, s17
2340; GCN-NEXT:    s_lshl_b32 s5, s5, 16
2341; GCN-NEXT:    s_or_b32 s3, s3, s5
2342; GCN-NEXT:    s_lshl_b32 s5, s16, 24
2343; GCN-NEXT:    s_or_b32 s3, s3, s5
2344; GCN-NEXT:    s_lshr_b32 s5, s4, 2
2345; GCN-NEXT:    s_cmp_eq_u32 s5, 1
2346; GCN-NEXT:    s_cselect_b32 s0, s1, s0
2347; GCN-NEXT:    s_cmp_eq_u32 s5, 2
2348; GCN-NEXT:    s_cselect_b32 s0, s2, s0
2349; GCN-NEXT:    s_cmp_eq_u32 s5, 3
2350; GCN-NEXT:    s_cselect_b32 s0, s3, s0
2351; GCN-NEXT:    s_and_b32 s1, s4, 3
2352; GCN-NEXT:    s_lshl_b32 s1, s1, 3
2353; GCN-NEXT:    s_lshr_b32 s0, s0, s1
2354; GCN-NEXT:    ; return to shader part epilog
2355;
2356; GFX10-LABEL: extractelement_sgpr_v16i8_sgpr_idx:
2357; GFX10:       ; %bb.0:
2358; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
2359; GFX10-NEXT:    s_movk_i32 s5, 0xff
2360; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
2361; GFX10-NEXT:    s_lshr_b32 s6, s0, 8
2362; GFX10-NEXT:    s_lshr_b32 s7, s0, 16
2363; GFX10-NEXT:    s_and_b32 s6, s6, s5
2364; GFX10-NEXT:    s_lshr_b32 s8, s0, 24
2365; GFX10-NEXT:    s_and_b32 s7, s7, s5
2366; GFX10-NEXT:    s_and_b32 s0, s0, s5
2367; GFX10-NEXT:    s_lshl_b32 s6, s6, 8
2368; GFX10-NEXT:    s_lshr_b32 s12, s2, 8
2369; GFX10-NEXT:    s_lshl_b32 s7, s7, 16
2370; GFX10-NEXT:    s_or_b32 s0, s0, s6
2371; GFX10-NEXT:    s_lshr_b32 s13, s2, 16
2372; GFX10-NEXT:    s_or_b32 s0, s0, s7
2373; GFX10-NEXT:    s_and_b32 s7, s12, s5
2374; GFX10-NEXT:    s_lshl_b32 s8, s8, 24
2375; GFX10-NEXT:    s_lshr_b32 s9, s1, 8
2376; GFX10-NEXT:    s_lshr_b32 s14, s2, 24
2377; GFX10-NEXT:    s_or_b32 s0, s0, s8
2378; GFX10-NEXT:    s_and_b32 s2, s2, s5
2379; GFX10-NEXT:    s_lshl_b32 s7, s7, 8
2380; GFX10-NEXT:    s_and_b32 s8, s13, s5
2381; GFX10-NEXT:    s_lshr_b32 s10, s1, 16
2382; GFX10-NEXT:    s_and_b32 s9, s9, s5
2383; GFX10-NEXT:    s_or_b32 s2, s2, s7
2384; GFX10-NEXT:    s_lshl_b32 s7, s8, 16
2385; GFX10-NEXT:    s_lshr_b32 s15, s3, 8
2386; GFX10-NEXT:    s_lshr_b32 s11, s1, 24
2387; GFX10-NEXT:    s_and_b32 s10, s10, s5
2388; GFX10-NEXT:    s_and_b32 s1, s1, s5
2389; GFX10-NEXT:    s_lshl_b32 s9, s9, 8
2390; GFX10-NEXT:    s_or_b32 s2, s2, s7
2391; GFX10-NEXT:    s_and_b32 s7, s15, s5
2392; GFX10-NEXT:    s_lshr_b32 s16, s3, 16
2393; GFX10-NEXT:    s_lshl_b32 s10, s10, 16
2394; GFX10-NEXT:    s_or_b32 s1, s1, s9
2395; GFX10-NEXT:    s_lshr_b32 s17, s3, 24
2396; GFX10-NEXT:    s_and_b32 s3, s3, s5
2397; GFX10-NEXT:    s_and_b32 s5, s16, s5
2398; GFX10-NEXT:    s_lshl_b32 s7, s7, 8
2399; GFX10-NEXT:    s_or_b32 s1, s1, s10
2400; GFX10-NEXT:    s_lshl_b32 s6, s11, 24
2401; GFX10-NEXT:    s_or_b32 s3, s3, s7
2402; GFX10-NEXT:    s_lshl_b32 s5, s5, 16
2403; GFX10-NEXT:    s_or_b32 s1, s1, s6
2404; GFX10-NEXT:    s_lshl_b32 s6, s14, 24
2405; GFX10-NEXT:    s_or_b32 s3, s3, s5
2406; GFX10-NEXT:    s_lshl_b32 s5, s17, 24
2407; GFX10-NEXT:    s_or_b32 s2, s2, s6
2408; GFX10-NEXT:    s_lshr_b32 s6, s4, 2
2409; GFX10-NEXT:    s_or_b32 s3, s3, s5
2410; GFX10-NEXT:    s_cmp_eq_u32 s6, 1
2411; GFX10-NEXT:    s_cselect_b32 s0, s1, s0
2412; GFX10-NEXT:    s_cmp_eq_u32 s6, 2
2413; GFX10-NEXT:    s_cselect_b32 s0, s2, s0
2414; GFX10-NEXT:    s_cmp_eq_u32 s6, 3
2415; GFX10-NEXT:    s_cselect_b32 s0, s3, s0
2416; GFX10-NEXT:    s_and_b32 s1, s4, 3
2417; GFX10-NEXT:    s_lshl_b32 s1, s1, 3
2418; GFX10-NEXT:    s_lshr_b32 s0, s0, s1
2419; GFX10-NEXT:    ; return to shader part epilog
2420  %vector = load <16 x i8>, <16 x i8> addrspace(4)* %ptr
2421  %element = extractelement <16 x i8> %vector, i32 %idx
2422  ret i8 %element
2423}
2424
2425define amdgpu_ps i8 @extractelement_vgpr_v16i8_sgpr_idx(<16 x i8> addrspace(1)* %ptr, i32 inreg %idx) {
2426; GFX9-LABEL: extractelement_vgpr_v16i8_sgpr_idx:
2427; GFX9:       ; %bb.0:
2428; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
2429; GFX9-NEXT:    s_mov_b32 s0, 8
2430; GFX9-NEXT:    v_mov_b32_e32 v5, 8
2431; GFX9-NEXT:    s_movk_i32 s1, 0xff
2432; GFX9-NEXT:    s_lshr_b32 s3, s2, 2
2433; GFX9-NEXT:    v_mov_b32_e32 v4, 0xff
2434; GFX9-NEXT:    v_cmp_eq_u32_e64 vcc, s3, 1
2435; GFX9-NEXT:    s_and_b32 s2, s2, 3
2436; GFX9-NEXT:    s_waitcnt vmcnt(0)
2437; GFX9-NEXT:    v_lshrrev_b32_e32 v6, 8, v0
2438; GFX9-NEXT:    v_lshrrev_b32_e32 v8, 8, v1
2439; GFX9-NEXT:    v_lshrrev_b32_e32 v7, 24, v0
2440; GFX9-NEXT:    v_lshrrev_b32_e32 v9, 24, v1
2441; GFX9-NEXT:    v_lshrrev_b32_e32 v10, 8, v2
2442; GFX9-NEXT:    v_lshlrev_b32_sdwa v6, s0, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2443; GFX9-NEXT:    v_lshlrev_b32_sdwa v8, v5, v8 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2444; GFX9-NEXT:    v_lshrrev_b32_e32 v11, 24, v2
2445; GFX9-NEXT:    v_and_b32_sdwa v14, v0, s1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2446; GFX9-NEXT:    v_and_b32_sdwa v15, v1, s1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2447; GFX9-NEXT:    v_lshrrev_b32_e32 v12, 8, v3
2448; GFX9-NEXT:    v_lshlrev_b32_sdwa v10, v5, v10 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2449; GFX9-NEXT:    v_lshlrev_b32_e32 v7, 24, v7
2450; GFX9-NEXT:    v_and_or_b32 v0, v0, s1, v6
2451; GFX9-NEXT:    v_lshlrev_b32_e32 v9, 24, v9
2452; GFX9-NEXT:    v_and_or_b32 v1, v1, s1, v8
2453; GFX9-NEXT:    v_and_b32_sdwa v16, v2, s1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2454; GFX9-NEXT:    v_lshrrev_b32_e32 v13, 24, v3
2455; GFX9-NEXT:    v_lshlrev_b32_sdwa v5, v5, v12 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2456; GFX9-NEXT:    v_lshlrev_b32_e32 v11, 24, v11
2457; GFX9-NEXT:    v_and_or_b32 v2, v2, s1, v10
2458; GFX9-NEXT:    v_or3_b32 v0, v0, v14, v7
2459; GFX9-NEXT:    v_or3_b32 v1, v1, v15, v9
2460; GFX9-NEXT:    v_and_b32_sdwa v17, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2461; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
2462; GFX9-NEXT:    v_lshlrev_b32_e32 v12, 24, v13
2463; GFX9-NEXT:    v_and_or_b32 v3, v3, v4, v5
2464; GFX9-NEXT:    v_or3_b32 v2, v2, v16, v11
2465; GFX9-NEXT:    v_cmp_eq_u32_e64 vcc, s3, 2
2466; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc
2467; GFX9-NEXT:    v_or3_b32 v3, v3, v17, v12
2468; GFX9-NEXT:    v_cmp_eq_u32_e64 vcc, s3, 3
2469; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
2470; GFX9-NEXT:    s_lshl_b32 s0, s2, 3
2471; GFX9-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
2472; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
2473; GFX9-NEXT:    ; return to shader part epilog
2474;
2475; GFX8-LABEL: extractelement_vgpr_v16i8_sgpr_idx:
2476; GFX8:       ; %bb.0:
2477; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
2478; GFX8-NEXT:    s_movk_i32 s0, 0xff
2479; GFX8-NEXT:    v_mov_b32_e32 v5, 8
2480; GFX8-NEXT:    v_mov_b32_e32 v6, 8
2481; GFX8-NEXT:    v_mov_b32_e32 v7, s0
2482; GFX8-NEXT:    v_mov_b32_e32 v4, 0xff
2483; GFX8-NEXT:    s_lshr_b32 s0, s2, 2
2484; GFX8-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 1
2485; GFX8-NEXT:    s_and_b32 s1, s2, 3
2486; GFX8-NEXT:    s_waitcnt vmcnt(0)
2487; GFX8-NEXT:    v_lshrrev_b32_e32 v8, 8, v0
2488; GFX8-NEXT:    v_lshrrev_b32_e32 v9, 24, v0
2489; GFX8-NEXT:    v_lshrrev_b32_e32 v10, 8, v1
2490; GFX8-NEXT:    v_lshlrev_b32_sdwa v5, v5, v8 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2491; GFX8-NEXT:    v_lshlrev_b32_e32 v8, 24, v9
2492; GFX8-NEXT:    v_lshrrev_b32_e32 v11, 24, v1
2493; GFX8-NEXT:    v_lshlrev_b32_sdwa v9, v6, v10 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2494; GFX8-NEXT:    v_lshrrev_b32_e32 v12, 8, v2
2495; GFX8-NEXT:    v_and_b32_sdwa v16, v0, v7 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2496; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2497; GFX8-NEXT:    v_and_b32_sdwa v7, v1, v7 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2498; GFX8-NEXT:    v_or_b32_sdwa v1, v1, v9 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2499; GFX8-NEXT:    v_lshlrev_b32_e32 v10, 24, v11
2500; GFX8-NEXT:    v_lshrrev_b32_e32 v14, 8, v3
2501; GFX8-NEXT:    v_lshlrev_b32_sdwa v11, v6, v12 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2502; GFX8-NEXT:    v_or_b32_e32 v0, v0, v16
2503; GFX8-NEXT:    v_or_b32_e32 v1, v1, v7
2504; GFX8-NEXT:    v_lshrrev_b32_e32 v13, 24, v2
2505; GFX8-NEXT:    v_and_b32_sdwa v17, v2, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2506; GFX8-NEXT:    v_or_b32_sdwa v2, v2, v11 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2507; GFX8-NEXT:    v_lshlrev_b32_sdwa v6, v6, v14 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2508; GFX8-NEXT:    v_lshrrev_b32_e32 v15, 24, v3
2509; GFX8-NEXT:    v_and_b32_sdwa v4, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2510; GFX8-NEXT:    v_or_b32_sdwa v3, v3, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2511; GFX8-NEXT:    v_lshlrev_b32_e32 v12, 24, v13
2512; GFX8-NEXT:    v_or_b32_e32 v2, v2, v17
2513; GFX8-NEXT:    v_or_b32_e32 v0, v0, v8
2514; GFX8-NEXT:    v_or_b32_e32 v1, v1, v10
2515; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
2516; GFX8-NEXT:    v_lshlrev_b32_e32 v13, 24, v15
2517; GFX8-NEXT:    v_or_b32_e32 v3, v3, v4
2518; GFX8-NEXT:    v_or_b32_e32 v2, v2, v12
2519; GFX8-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 2
2520; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc
2521; GFX8-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 3
2522; GFX8-NEXT:    v_or_b32_e32 v3, v3, v13
2523; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
2524; GFX8-NEXT:    s_lshl_b32 s0, s1, 3
2525; GFX8-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
2526; GFX8-NEXT:    v_readfirstlane_b32 s0, v0
2527; GFX8-NEXT:    ; return to shader part epilog
2528;
2529; GFX7-LABEL: extractelement_vgpr_v16i8_sgpr_idx:
2530; GFX7:       ; %bb.0:
2531; GFX7-NEXT:    s_mov_b32 s6, 0
2532; GFX7-NEXT:    s_mov_b32 s7, 0xf000
2533; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2534; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
2535; GFX7-NEXT:    s_movk_i32 s0, 0xff
2536; GFX7-NEXT:    v_mov_b32_e32 v4, 0xff
2537; GFX7-NEXT:    s_lshr_b32 s1, s2, 2
2538; GFX7-NEXT:    v_cmp_eq_u32_e64 vcc, s1, 1
2539; GFX7-NEXT:    s_and_b32 s2, s2, 3
2540; GFX7-NEXT:    s_waitcnt vmcnt(0)
2541; GFX7-NEXT:    v_lshrrev_b32_e32 v5, 8, v0
2542; GFX7-NEXT:    v_lshrrev_b32_e32 v8, 8, v1
2543; GFX7-NEXT:    v_lshrrev_b32_e32 v6, 16, v0
2544; GFX7-NEXT:    v_lshrrev_b32_e32 v9, 16, v1
2545; GFX7-NEXT:    v_lshrrev_b32_e32 v11, 8, v2
2546; GFX7-NEXT:    v_and_b32_e32 v5, s0, v5
2547; GFX7-NEXT:    v_and_b32_e32 v8, s0, v8
2548; GFX7-NEXT:    v_lshrrev_b32_e32 v7, 24, v0
2549; GFX7-NEXT:    v_lshrrev_b32_e32 v10, 24, v1
2550; GFX7-NEXT:    v_lshrrev_b32_e32 v12, 16, v2
2551; GFX7-NEXT:    v_lshrrev_b32_e32 v14, 8, v3
2552; GFX7-NEXT:    v_and_b32_e32 v6, s0, v6
2553; GFX7-NEXT:    v_and_b32_e32 v9, s0, v9
2554; GFX7-NEXT:    v_and_b32_e32 v11, s0, v11
2555; GFX7-NEXT:    v_and_b32_e32 v0, s0, v0
2556; GFX7-NEXT:    v_lshlrev_b32_e32 v5, 8, v5
2557; GFX7-NEXT:    v_and_b32_e32 v1, s0, v1
2558; GFX7-NEXT:    v_lshlrev_b32_e32 v8, 8, v8
2559; GFX7-NEXT:    v_lshrrev_b32_e32 v13, 24, v2
2560; GFX7-NEXT:    v_and_b32_e32 v12, v12, v4
2561; GFX7-NEXT:    v_and_b32_e32 v14, v14, v4
2562; GFX7-NEXT:    v_and_b32_e32 v2, s0, v2
2563; GFX7-NEXT:    v_lshlrev_b32_e32 v11, 8, v11
2564; GFX7-NEXT:    v_lshrrev_b32_e32 v15, 16, v3
2565; GFX7-NEXT:    v_lshlrev_b32_e32 v6, 16, v6
2566; GFX7-NEXT:    v_or_b32_e32 v0, v0, v5
2567; GFX7-NEXT:    v_lshlrev_b32_e32 v9, 16, v9
2568; GFX7-NEXT:    v_or_b32_e32 v1, v1, v8
2569; GFX7-NEXT:    v_lshrrev_b32_e32 v16, 24, v3
2570; GFX7-NEXT:    v_and_b32_e32 v3, v3, v4
2571; GFX7-NEXT:    v_and_b32_e32 v4, v15, v4
2572; GFX7-NEXT:    v_lshlrev_b32_e32 v14, 8, v14
2573; GFX7-NEXT:    v_lshlrev_b32_e32 v7, 24, v7
2574; GFX7-NEXT:    v_or_b32_e32 v0, v0, v6
2575; GFX7-NEXT:    v_lshlrev_b32_e32 v10, 24, v10
2576; GFX7-NEXT:    v_or_b32_e32 v1, v1, v9
2577; GFX7-NEXT:    v_lshlrev_b32_e32 v12, 16, v12
2578; GFX7-NEXT:    v_or_b32_e32 v2, v2, v11
2579; GFX7-NEXT:    v_lshlrev_b32_e32 v13, 24, v13
2580; GFX7-NEXT:    v_or_b32_e32 v2, v2, v12
2581; GFX7-NEXT:    v_lshlrev_b32_e32 v4, 16, v4
2582; GFX7-NEXT:    v_or_b32_e32 v3, v3, v14
2583; GFX7-NEXT:    v_or_b32_e32 v0, v0, v7
2584; GFX7-NEXT:    v_or_b32_e32 v1, v1, v10
2585; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
2586; GFX7-NEXT:    v_lshlrev_b32_e32 v15, 24, v16
2587; GFX7-NEXT:    v_or_b32_e32 v3, v3, v4
2588; GFX7-NEXT:    v_or_b32_e32 v2, v2, v13
2589; GFX7-NEXT:    v_cmp_eq_u32_e64 vcc, s1, 2
2590; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc
2591; GFX7-NEXT:    v_or_b32_e32 v3, v3, v15
2592; GFX7-NEXT:    v_cmp_eq_u32_e64 vcc, s1, 3
2593; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
2594; GFX7-NEXT:    s_lshl_b32 s0, s2, 3
2595; GFX7-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
2596; GFX7-NEXT:    v_readfirstlane_b32 s0, v0
2597; GFX7-NEXT:    ; return to shader part epilog
2598;
2599; GFX10-LABEL: extractelement_vgpr_v16i8_sgpr_idx:
2600; GFX10:       ; %bb.0:
2601; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
2602; GFX10-NEXT:    v_mov_b32_e32 v5, 8
2603; GFX10-NEXT:    s_mov_b32 s0, 8
2604; GFX10-NEXT:    s_movk_i32 s1, 0xff
2605; GFX10-NEXT:    v_mov_b32_e32 v4, 0xff
2606; GFX10-NEXT:    s_waitcnt vmcnt(0)
2607; GFX10-NEXT:    v_lshrrev_b32_e32 v6, 8, v0
2608; GFX10-NEXT:    v_lshrrev_b32_e32 v8, 8, v1
2609; GFX10-NEXT:    v_lshrrev_b32_e32 v7, 24, v0
2610; GFX10-NEXT:    v_lshrrev_b32_e32 v9, 24, v1
2611; GFX10-NEXT:    v_lshrrev_b32_e32 v10, 8, v2
2612; GFX10-NEXT:    v_lshlrev_b32_sdwa v6, s0, v6 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2613; GFX10-NEXT:    v_lshlrev_b32_sdwa v8, v5, v8 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2614; GFX10-NEXT:    v_lshrrev_b32_e32 v11, 24, v2
2615; GFX10-NEXT:    v_and_b32_sdwa v13, v0, s1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2616; GFX10-NEXT:    v_and_b32_sdwa v14, v1, s1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2617; GFX10-NEXT:    v_and_or_b32 v0, v0, s1, v6
2618; GFX10-NEXT:    v_lshlrev_b32_e32 v7, 24, v7
2619; GFX10-NEXT:    v_lshrrev_b32_e32 v12, 8, v3
2620; GFX10-NEXT:    v_lshlrev_b32_sdwa v10, v5, v10 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2621; GFX10-NEXT:    v_lshlrev_b32_e32 v9, 24, v9
2622; GFX10-NEXT:    v_and_or_b32 v1, v1, s1, v8
2623; GFX10-NEXT:    s_lshr_b32 s0, s2, 2
2624; GFX10-NEXT:    v_lshlrev_b32_sdwa v5, v5, v12 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2625; GFX10-NEXT:    v_and_b32_sdwa v15, v2, s1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2626; GFX10-NEXT:    v_lshlrev_b32_e32 v11, 24, v11
2627; GFX10-NEXT:    v_and_or_b32 v2, v2, s1, v10
2628; GFX10-NEXT:    v_lshrrev_b32_e32 v6, 24, v3
2629; GFX10-NEXT:    v_or3_b32 v0, v0, v13, v7
2630; GFX10-NEXT:    v_or3_b32 v1, v1, v14, v9
2631; GFX10-NEXT:    v_cmp_eq_u32_e64 vcc_lo, s0, 1
2632; GFX10-NEXT:    v_and_or_b32 v5, v3, v4, v5
2633; GFX10-NEXT:    v_and_b32_sdwa v3, v3, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2634; GFX10-NEXT:    v_or3_b32 v2, v2, v15, v11
2635; GFX10-NEXT:    v_lshlrev_b32_e32 v4, 24, v6
2636; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc_lo
2637; GFX10-NEXT:    v_cmp_eq_u32_e64 vcc_lo, s0, 2
2638; GFX10-NEXT:    v_or3_b32 v1, v5, v3, v4
2639; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc_lo
2640; GFX10-NEXT:    v_cmp_eq_u32_e64 vcc_lo, s0, 3
2641; GFX10-NEXT:    s_and_b32 s0, s2, 3
2642; GFX10-NEXT:    s_lshl_b32 s0, s0, 3
2643; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc_lo
2644; GFX10-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
2645; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
2646; GFX10-NEXT:    ; return to shader part epilog
2647  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
2648  %element = extractelement <16 x i8> %vector, i32 %idx
2649  ret i8 %element
2650}
2651
2652define i8 @extractelement_vgpr_v16i8_vgpr_idx(<16 x i8> addrspace(1)* %ptr, i32 %idx) {
2653; GFX9-LABEL: extractelement_vgpr_v16i8_vgpr_idx:
2654; GFX9:       ; %bb.0:
2655; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2656; GFX9-NEXT:    global_load_dwordx4 v[3:6], v[0:1], off
2657; GFX9-NEXT:    s_mov_b32 s4, 8
2658; GFX9-NEXT:    v_mov_b32_e32 v1, 8
2659; GFX9-NEXT:    s_movk_i32 s5, 0xff
2660; GFX9-NEXT:    v_lshrrev_b32_e32 v7, 2, v2
2661; GFX9-NEXT:    v_mov_b32_e32 v0, 0xff
2662; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v7
2663; GFX9-NEXT:    v_and_b32_e32 v2, 3, v2
2664; GFX9-NEXT:    s_waitcnt vmcnt(0)
2665; GFX9-NEXT:    v_lshrrev_b32_e32 v8, 8, v3
2666; GFX9-NEXT:    v_lshrrev_b32_e32 v10, 8, v4
2667; GFX9-NEXT:    v_lshrrev_b32_e32 v9, 24, v3
2668; GFX9-NEXT:    v_lshrrev_b32_e32 v11, 24, v4
2669; GFX9-NEXT:    v_lshrrev_b32_e32 v12, 8, v5
2670; GFX9-NEXT:    v_lshrrev_b32_e32 v14, 8, v6
2671; GFX9-NEXT:    v_lshlrev_b32_sdwa v8, s4, v8 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2672; GFX9-NEXT:    v_lshlrev_b32_sdwa v10, v1, v10 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2673; GFX9-NEXT:    v_lshrrev_b32_e32 v13, 24, v5
2674; GFX9-NEXT:    v_and_b32_sdwa v16, v3, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2675; GFX9-NEXT:    v_and_b32_sdwa v17, v4, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2676; GFX9-NEXT:    v_lshlrev_b32_sdwa v12, v1, v12 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2677; GFX9-NEXT:    v_lshlrev_b32_e32 v9, 24, v9
2678; GFX9-NEXT:    v_lshlrev_b32_e32 v11, 24, v11
2679; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, v1, v14 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2680; GFX9-NEXT:    v_and_or_b32 v3, v3, s5, v8
2681; GFX9-NEXT:    v_and_or_b32 v4, v4, s5, v10
2682; GFX9-NEXT:    v_lshrrev_b32_e32 v15, 24, v6
2683; GFX9-NEXT:    v_and_b32_sdwa v18, v5, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2684; GFX9-NEXT:    v_and_b32_sdwa v19, v6, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2685; GFX9-NEXT:    v_and_or_b32 v0, v6, v0, v1
2686; GFX9-NEXT:    v_or3_b32 v1, v3, v16, v9
2687; GFX9-NEXT:    v_or3_b32 v3, v4, v17, v11
2688; GFX9-NEXT:    v_lshlrev_b32_e32 v13, 24, v13
2689; GFX9-NEXT:    v_and_or_b32 v5, v5, s5, v12
2690; GFX9-NEXT:    v_lshlrev_b32_e32 v14, 24, v15
2691; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc
2692; GFX9-NEXT:    v_or3_b32 v4, v5, v18, v13
2693; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v7
2694; GFX9-NEXT:    v_cndmask_b32_e32 v1, v1, v4, vcc
2695; GFX9-NEXT:    v_or3_b32 v0, v0, v19, v14
2696; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v7
2697; GFX9-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc
2698; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 3, v2
2699; GFX9-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
2700; GFX9-NEXT:    s_setpc_b64 s[30:31]
2701;
2702; GFX8-LABEL: extractelement_vgpr_v16i8_vgpr_idx:
2703; GFX8:       ; %bb.0:
2704; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2705; GFX8-NEXT:    flat_load_dwordx4 v[3:6], v[0:1]
2706; GFX8-NEXT:    s_movk_i32 s4, 0xff
2707; GFX8-NEXT:    v_mov_b32_e32 v1, 8
2708; GFX8-NEXT:    v_mov_b32_e32 v7, 8
2709; GFX8-NEXT:    v_mov_b32_e32 v8, s4
2710; GFX8-NEXT:    v_mov_b32_e32 v0, 0xff
2711; GFX8-NEXT:    v_lshrrev_b32_e32 v9, 2, v2
2712; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v9
2713; GFX8-NEXT:    v_and_b32_e32 v2, 3, v2
2714; GFX8-NEXT:    s_waitcnt vmcnt(0)
2715; GFX8-NEXT:    v_lshrrev_b32_e32 v10, 8, v3
2716; GFX8-NEXT:    v_lshrrev_b32_e32 v11, 24, v3
2717; GFX8-NEXT:    v_lshrrev_b32_e32 v12, 8, v4
2718; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v10 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2719; GFX8-NEXT:    v_lshlrev_b32_e32 v10, 24, v11
2720; GFX8-NEXT:    v_lshrrev_b32_e32 v13, 24, v4
2721; GFX8-NEXT:    v_lshlrev_b32_sdwa v11, v7, v12 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2722; GFX8-NEXT:    v_lshrrev_b32_e32 v14, 8, v5
2723; GFX8-NEXT:    v_and_b32_sdwa v18, v3, v8 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2724; GFX8-NEXT:    v_or_b32_sdwa v1, v3, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2725; GFX8-NEXT:    v_lshlrev_b32_e32 v12, 24, v13
2726; GFX8-NEXT:    v_lshrrev_b32_e32 v16, 8, v6
2727; GFX8-NEXT:    v_lshlrev_b32_sdwa v13, v7, v14 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2728; GFX8-NEXT:    v_and_b32_sdwa v8, v4, v8 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2729; GFX8-NEXT:    v_or_b32_sdwa v3, v4, v11 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2730; GFX8-NEXT:    v_or_b32_e32 v1, v1, v18
2731; GFX8-NEXT:    v_or_b32_e32 v3, v3, v8
2732; GFX8-NEXT:    v_lshrrev_b32_e32 v15, 24, v5
2733; GFX8-NEXT:    v_and_b32_sdwa v19, v5, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2734; GFX8-NEXT:    v_or_b32_sdwa v4, v5, v13 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2735; GFX8-NEXT:    v_lshlrev_b32_sdwa v7, v7, v16 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2736; GFX8-NEXT:    v_lshrrev_b32_e32 v17, 24, v6
2737; GFX8-NEXT:    v_lshlrev_b32_e32 v14, 24, v15
2738; GFX8-NEXT:    v_or_b32_e32 v4, v4, v19
2739; GFX8-NEXT:    v_and_b32_sdwa v0, v6, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2740; GFX8-NEXT:    v_or_b32_sdwa v5, v6, v7 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
2741; GFX8-NEXT:    v_or_b32_e32 v1, v1, v10
2742; GFX8-NEXT:    v_or_b32_e32 v3, v3, v12
2743; GFX8-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc
2744; GFX8-NEXT:    v_lshlrev_b32_e32 v15, 24, v17
2745; GFX8-NEXT:    v_or_b32_e32 v0, v5, v0
2746; GFX8-NEXT:    v_or_b32_e32 v4, v4, v14
2747; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v9
2748; GFX8-NEXT:    v_cndmask_b32_e32 v1, v1, v4, vcc
2749; GFX8-NEXT:    v_or_b32_e32 v0, v0, v15
2750; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v9
2751; GFX8-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc
2752; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 3, v2
2753; GFX8-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
2754; GFX8-NEXT:    s_setpc_b64 s[30:31]
2755;
2756; GFX7-LABEL: extractelement_vgpr_v16i8_vgpr_idx:
2757; GFX7:       ; %bb.0:
2758; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2759; GFX7-NEXT:    s_mov_b32 s6, 0
2760; GFX7-NEXT:    s_mov_b32 s7, 0xf000
2761; GFX7-NEXT:    s_mov_b64 s[4:5], 0
2762; GFX7-NEXT:    buffer_load_dwordx4 v[3:6], v[0:1], s[4:7], 0 addr64
2763; GFX7-NEXT:    s_movk_i32 s4, 0xff
2764; GFX7-NEXT:    v_mov_b32_e32 v0, 0xff
2765; GFX7-NEXT:    v_lshrrev_b32_e32 v18, 2, v2
2766; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v18
2767; GFX7-NEXT:    v_and_b32_e32 v2, 3, v2
2768; GFX7-NEXT:    s_waitcnt vmcnt(0)
2769; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 8, v3
2770; GFX7-NEXT:    v_lshrrev_b32_e32 v9, 8, v4
2771; GFX7-NEXT:    v_lshrrev_b32_e32 v7, 16, v3
2772; GFX7-NEXT:    v_lshrrev_b32_e32 v10, 16, v4
2773; GFX7-NEXT:    v_lshrrev_b32_e32 v12, 8, v5
2774; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
2775; GFX7-NEXT:    v_and_b32_e32 v9, s4, v9
2776; GFX7-NEXT:    v_lshrrev_b32_e32 v8, 24, v3
2777; GFX7-NEXT:    v_lshrrev_b32_e32 v11, 24, v4
2778; GFX7-NEXT:    v_lshrrev_b32_e32 v13, 16, v5
2779; GFX7-NEXT:    v_lshrrev_b32_e32 v15, 8, v6
2780; GFX7-NEXT:    v_and_b32_e32 v7, s4, v7
2781; GFX7-NEXT:    v_and_b32_e32 v10, s4, v10
2782; GFX7-NEXT:    v_and_b32_e32 v12, s4, v12
2783; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
2784; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
2785; GFX7-NEXT:    v_and_b32_e32 v4, s4, v4
2786; GFX7-NEXT:    v_lshlrev_b32_e32 v9, 8, v9
2787; GFX7-NEXT:    v_lshrrev_b32_e32 v14, 24, v5
2788; GFX7-NEXT:    v_and_b32_e32 v13, v13, v0
2789; GFX7-NEXT:    v_and_b32_e32 v15, v15, v0
2790; GFX7-NEXT:    v_or_b32_e32 v1, v3, v1
2791; GFX7-NEXT:    v_lshlrev_b32_e32 v7, 16, v7
2792; GFX7-NEXT:    v_lshrrev_b32_e32 v16, 16, v6
2793; GFX7-NEXT:    v_and_b32_e32 v5, s4, v5
2794; GFX7-NEXT:    v_lshlrev_b32_e32 v10, 16, v10
2795; GFX7-NEXT:    v_or_b32_e32 v3, v4, v9
2796; GFX7-NEXT:    v_lshlrev_b32_e32 v12, 8, v12
2797; GFX7-NEXT:    v_lshrrev_b32_e32 v17, 24, v6
2798; GFX7-NEXT:    v_and_b32_e32 v6, v6, v0
2799; GFX7-NEXT:    v_and_b32_e32 v0, v16, v0
2800; GFX7-NEXT:    v_lshlrev_b32_e32 v8, 24, v8
2801; GFX7-NEXT:    v_or_b32_e32 v1, v1, v7
2802; GFX7-NEXT:    v_lshlrev_b32_e32 v11, 24, v11
2803; GFX7-NEXT:    v_or_b32_e32 v3, v3, v10
2804; GFX7-NEXT:    v_lshlrev_b32_e32 v13, 16, v13
2805; GFX7-NEXT:    v_or_b32_e32 v4, v5, v12
2806; GFX7-NEXT:    v_lshlrev_b32_e32 v15, 8, v15
2807; GFX7-NEXT:    v_lshlrev_b32_e32 v14, 24, v14
2808; GFX7-NEXT:    v_or_b32_e32 v4, v4, v13
2809; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
2810; GFX7-NEXT:    v_or_b32_e32 v5, v6, v15
2811; GFX7-NEXT:    v_or_b32_e32 v1, v1, v8
2812; GFX7-NEXT:    v_or_b32_e32 v3, v3, v11
2813; GFX7-NEXT:    v_cndmask_b32_e32 v1, v1, v3, vcc
2814; GFX7-NEXT:    v_lshlrev_b32_e32 v16, 24, v17
2815; GFX7-NEXT:    v_or_b32_e32 v0, v5, v0
2816; GFX7-NEXT:    v_or_b32_e32 v4, v4, v14
2817; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v18
2818; GFX7-NEXT:    v_cndmask_b32_e32 v1, v1, v4, vcc
2819; GFX7-NEXT:    v_or_b32_e32 v0, v0, v16
2820; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v18
2821; GFX7-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc
2822; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 3, v2
2823; GFX7-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
2824; GFX7-NEXT:    s_setpc_b64 s[30:31]
2825;
2826; GFX10-LABEL: extractelement_vgpr_v16i8_vgpr_idx:
2827; GFX10:       ; %bb.0:
2828; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2829; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
2830; GFX10-NEXT:    global_load_dwordx4 v[3:6], v[0:1], off
2831; GFX10-NEXT:    v_mov_b32_e32 v1, 8
2832; GFX10-NEXT:    s_mov_b32 s4, 8
2833; GFX10-NEXT:    s_movk_i32 s5, 0xff
2834; GFX10-NEXT:    v_lshrrev_b32_e32 v7, 2, v2
2835; GFX10-NEXT:    v_mov_b32_e32 v0, 0xff
2836; GFX10-NEXT:    v_and_b32_e32 v2, 3, v2
2837; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 1, v7
2838; GFX10-NEXT:    s_waitcnt vmcnt(0)
2839; GFX10-NEXT:    v_lshrrev_b32_e32 v8, 8, v3
2840; GFX10-NEXT:    v_lshrrev_b32_e32 v10, 8, v4
2841; GFX10-NEXT:    v_lshrrev_b32_e32 v9, 24, v3
2842; GFX10-NEXT:    v_lshrrev_b32_e32 v11, 24, v4
2843; GFX10-NEXT:    v_lshrrev_b32_e32 v12, 8, v5
2844; GFX10-NEXT:    v_lshlrev_b32_sdwa v8, s4, v8 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2845; GFX10-NEXT:    v_lshlrev_b32_sdwa v10, v1, v10 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2846; GFX10-NEXT:    v_and_b32_sdwa v16, v3, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2847; GFX10-NEXT:    v_and_b32_sdwa v17, v4, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2848; GFX10-NEXT:    v_lshrrev_b32_e32 v13, 24, v5
2849; GFX10-NEXT:    v_and_or_b32 v3, v3, s5, v8
2850; GFX10-NEXT:    v_lshlrev_b32_e32 v9, 24, v9
2851; GFX10-NEXT:    v_lshrrev_b32_e32 v14, 8, v6
2852; GFX10-NEXT:    v_lshlrev_b32_sdwa v12, v1, v12 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2853; GFX10-NEXT:    v_lshlrev_b32_e32 v11, 24, v11
2854; GFX10-NEXT:    v_and_or_b32 v4, v4, s5, v10
2855; GFX10-NEXT:    v_and_b32_sdwa v18, v5, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2856; GFX10-NEXT:    v_lshrrev_b32_e32 v15, 24, v6
2857; GFX10-NEXT:    v_or3_b32 v3, v3, v16, v9
2858; GFX10-NEXT:    v_lshlrev_b32_e32 v8, 24, v13
2859; GFX10-NEXT:    v_or3_b32 v4, v4, v17, v11
2860; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, v1, v14 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
2861; GFX10-NEXT:    v_and_or_b32 v5, v5, s5, v12
2862; GFX10-NEXT:    v_and_b32_sdwa v19, v6, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
2863; GFX10-NEXT:    v_lshlrev_b32_e32 v9, 24, v15
2864; GFX10-NEXT:    v_cndmask_b32_e32 v3, v3, v4, vcc_lo
2865; GFX10-NEXT:    v_and_or_b32 v0, v6, v0, v1
2866; GFX10-NEXT:    v_or3_b32 v1, v5, v18, v8
2867; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 2, v7
2868; GFX10-NEXT:    v_or3_b32 v0, v0, v19, v9
2869; GFX10-NEXT:    v_cndmask_b32_e32 v1, v3, v1, vcc_lo
2870; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 3, v7
2871; GFX10-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc_lo
2872; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 3, v2
2873; GFX10-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
2874; GFX10-NEXT:    s_setpc_b64 s[30:31]
2875  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
2876  %element = extractelement <16 x i8> %vector, i32 %idx
2877  ret i8 %element
2878}
2879
2880define amdgpu_ps i8 @extractelement_sgpr_v16i8_vgpr_idx(<16 x i8> addrspace(4)* inreg %ptr, i32 %idx) {
2881; GCN-LABEL: extractelement_sgpr_v16i8_vgpr_idx:
2882; GCN:       ; %bb.0:
2883; GCN-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
2884; GCN-NEXT:    s_movk_i32 s16, 0xff
2885; GCN-NEXT:    v_lshrrev_b32_e32 v1, 2, v0
2886; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v1
2887; GCN-NEXT:    v_and_b32_e32 v0, 3, v0
2888; GCN-NEXT:    s_waitcnt lgkmcnt(0)
2889; GCN-NEXT:    s_lshr_b32 s4, s0, 8
2890; GCN-NEXT:    s_and_b32 s4, s4, s16
2891; GCN-NEXT:    s_lshr_b32 s5, s0, 16
2892; GCN-NEXT:    s_lshr_b32 s6, s0, 24
2893; GCN-NEXT:    s_and_b32 s0, s0, s16
2894; GCN-NEXT:    s_lshl_b32 s4, s4, 8
2895; GCN-NEXT:    s_or_b32 s0, s0, s4
2896; GCN-NEXT:    s_and_b32 s4, s5, s16
2897; GCN-NEXT:    s_lshl_b32 s4, s4, 16
2898; GCN-NEXT:    s_or_b32 s0, s0, s4
2899; GCN-NEXT:    s_lshl_b32 s4, s6, 24
2900; GCN-NEXT:    s_lshr_b32 s7, s1, 8
2901; GCN-NEXT:    s_or_b32 s0, s0, s4
2902; GCN-NEXT:    s_and_b32 s4, s7, s16
2903; GCN-NEXT:    s_lshr_b32 s8, s1, 16
2904; GCN-NEXT:    s_lshr_b32 s9, s1, 24
2905; GCN-NEXT:    s_and_b32 s1, s1, s16
2906; GCN-NEXT:    s_lshl_b32 s4, s4, 8
2907; GCN-NEXT:    s_or_b32 s1, s1, s4
2908; GCN-NEXT:    s_and_b32 s4, s8, s16
2909; GCN-NEXT:    s_lshl_b32 s4, s4, 16
2910; GCN-NEXT:    s_or_b32 s1, s1, s4
2911; GCN-NEXT:    s_lshl_b32 s4, s9, 24
2912; GCN-NEXT:    s_lshr_b32 s10, s2, 8
2913; GCN-NEXT:    s_or_b32 s1, s1, s4
2914; GCN-NEXT:    s_and_b32 s4, s10, s16
2915; GCN-NEXT:    s_lshr_b32 s11, s2, 16
2916; GCN-NEXT:    s_lshr_b32 s12, s2, 24
2917; GCN-NEXT:    s_and_b32 s2, s2, s16
2918; GCN-NEXT:    s_lshl_b32 s4, s4, 8
2919; GCN-NEXT:    s_or_b32 s2, s2, s4
2920; GCN-NEXT:    s_and_b32 s4, s11, s16
2921; GCN-NEXT:    s_lshl_b32 s4, s4, 16
2922; GCN-NEXT:    s_or_b32 s2, s2, s4
2923; GCN-NEXT:    s_lshl_b32 s4, s12, 24
2924; GCN-NEXT:    s_lshr_b32 s13, s3, 8
2925; GCN-NEXT:    s_or_b32 s2, s2, s4
2926; GCN-NEXT:    s_and_b32 s4, s13, s16
2927; GCN-NEXT:    s_lshr_b32 s14, s3, 16
2928; GCN-NEXT:    s_lshr_b32 s15, s3, 24
2929; GCN-NEXT:    s_and_b32 s3, s3, s16
2930; GCN-NEXT:    s_lshl_b32 s4, s4, 8
2931; GCN-NEXT:    s_or_b32 s3, s3, s4
2932; GCN-NEXT:    s_and_b32 s4, s14, s16
2933; GCN-NEXT:    s_lshl_b32 s4, s4, 16
2934; GCN-NEXT:    s_or_b32 s3, s3, s4
2935; GCN-NEXT:    s_lshl_b32 s4, s15, 24
2936; GCN-NEXT:    v_mov_b32_e32 v2, s0
2937; GCN-NEXT:    v_mov_b32_e32 v3, s1
2938; GCN-NEXT:    s_or_b32 s3, s3, s4
2939; GCN-NEXT:    v_cndmask_b32_e32 v2, v2, v3, vcc
2940; GCN-NEXT:    v_mov_b32_e32 v4, s2
2941; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v1
2942; GCN-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
2943; GCN-NEXT:    v_mov_b32_e32 v5, s3
2944; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v1
2945; GCN-NEXT:    v_cndmask_b32_e32 v1, v2, v5, vcc
2946; GCN-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
2947; GCN-NEXT:    v_lshrrev_b32_e32 v0, v0, v1
2948; GCN-NEXT:    v_readfirstlane_b32 s0, v0
2949; GCN-NEXT:    ; return to shader part epilog
2950;
2951; GFX10-LABEL: extractelement_sgpr_v16i8_vgpr_idx:
2952; GFX10:       ; %bb.0:
2953; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
2954; GFX10-NEXT:    s_movk_i32 s4, 0xff
2955; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 2, v0
2956; GFX10-NEXT:    v_and_b32_e32 v0, 3, v0
2957; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 1, v1
2958; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
2959; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
2960; GFX10-NEXT:    s_lshr_b32 s8, s1, 8
2961; GFX10-NEXT:    s_lshr_b32 s5, s0, 8
2962; GFX10-NEXT:    s_lshr_b32 s9, s1, 16
2963; GFX10-NEXT:    s_and_b32 s8, s8, s4
2964; GFX10-NEXT:    s_and_b32 s5, s5, s4
2965; GFX10-NEXT:    s_and_b32 s9, s9, s4
2966; GFX10-NEXT:    s_lshr_b32 s10, s1, 24
2967; GFX10-NEXT:    s_and_b32 s1, s1, s4
2968; GFX10-NEXT:    s_lshl_b32 s8, s8, 8
2969; GFX10-NEXT:    s_lshr_b32 s6, s0, 16
2970; GFX10-NEXT:    s_lshr_b32 s7, s0, 24
2971; GFX10-NEXT:    s_and_b32 s0, s0, s4
2972; GFX10-NEXT:    s_lshl_b32 s5, s5, 8
2973; GFX10-NEXT:    s_lshl_b32 s9, s9, 16
2974; GFX10-NEXT:    s_or_b32 s1, s1, s8
2975; GFX10-NEXT:    s_and_b32 s6, s6, s4
2976; GFX10-NEXT:    s_or_b32 s0, s0, s5
2977; GFX10-NEXT:    s_or_b32 s1, s1, s9
2978; GFX10-NEXT:    s_lshl_b32 s5, s10, 24
2979; GFX10-NEXT:    s_lshl_b32 s6, s6, 16
2980; GFX10-NEXT:    s_lshr_b32 s11, s2, 8
2981; GFX10-NEXT:    s_or_b32 s1, s1, s5
2982; GFX10-NEXT:    s_or_b32 s0, s0, s6
2983; GFX10-NEXT:    s_and_b32 s6, s11, s4
2984; GFX10-NEXT:    s_lshl_b32 s7, s7, 24
2985; GFX10-NEXT:    s_lshr_b32 s12, s2, 16
2986; GFX10-NEXT:    v_mov_b32_e32 v2, s1
2987; GFX10-NEXT:    s_lshr_b32 s13, s2, 24
2988; GFX10-NEXT:    s_or_b32 s0, s0, s7
2989; GFX10-NEXT:    s_and_b32 s2, s2, s4
2990; GFX10-NEXT:    s_lshl_b32 s6, s6, 8
2991; GFX10-NEXT:    s_and_b32 s7, s12, s4
2992; GFX10-NEXT:    s_or_b32 s2, s2, s6
2993; GFX10-NEXT:    s_lshl_b32 s6, s7, 16
2994; GFX10-NEXT:    s_lshr_b32 s14, s3, 8
2995; GFX10-NEXT:    s_lshr_b32 s15, s3, 16
2996; GFX10-NEXT:    s_or_b32 s2, s2, s6
2997; GFX10-NEXT:    s_and_b32 s6, s14, s4
2998; GFX10-NEXT:    v_cndmask_b32_e32 v2, s0, v2, vcc_lo
2999; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 2, v1
3000; GFX10-NEXT:    s_lshl_b32 s5, s13, 24
3001; GFX10-NEXT:    s_and_b32 s1, s15, s4
3002; GFX10-NEXT:    s_lshr_b32 s16, s3, 24
3003; GFX10-NEXT:    s_and_b32 s3, s3, s4
3004; GFX10-NEXT:    s_lshl_b32 s6, s6, 8
3005; GFX10-NEXT:    s_or_b32 s2, s2, s5
3006; GFX10-NEXT:    s_or_b32 s3, s3, s6
3007; GFX10-NEXT:    s_lshl_b32 s1, s1, 16
3008; GFX10-NEXT:    v_cndmask_b32_e64 v2, v2, s2, vcc_lo
3009; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 3, v1
3010; GFX10-NEXT:    s_or_b32 s0, s3, s1
3011; GFX10-NEXT:    s_lshl_b32 s1, s16, 24
3012; GFX10-NEXT:    s_or_b32 s3, s0, s1
3013; GFX10-NEXT:    v_cndmask_b32_e64 v1, v2, s3, vcc_lo
3014; GFX10-NEXT:    v_lshrrev_b32_e32 v0, v0, v1
3015; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
3016; GFX10-NEXT:    ; return to shader part epilog
3017  %vector = load <16 x i8>, <16 x i8> addrspace(4)* %ptr
3018  %element = extractelement <16 x i8> %vector, i32 %idx
3019  ret i8 %element
3020}
3021
3022define i8 @extractelement_vgpr_v16i8_idx0(<16 x i8> addrspace(1)* %ptr) {
3023; GFX9-LABEL: extractelement_vgpr_v16i8_idx0:
3024; GFX9:       ; %bb.0:
3025; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3026; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3027; GFX9-NEXT:    s_mov_b32 s4, 8
3028; GFX9-NEXT:    s_movk_i32 s5, 0xff
3029; GFX9-NEXT:    s_waitcnt vmcnt(0)
3030; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
3031; GFX9-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
3032; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3033; GFX9-NEXT:    v_and_b32_sdwa v3, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3034; GFX9-NEXT:    v_and_or_b32 v0, v0, s5, v1
3035; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
3036; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
3037; GFX9-NEXT:    s_setpc_b64 s[30:31]
3038;
3039; GFX8-LABEL: extractelement_vgpr_v16i8_idx0:
3040; GFX8:       ; %bb.0:
3041; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3042; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
3043; GFX8-NEXT:    s_movk_i32 s4, 0xff
3044; GFX8-NEXT:    s_waitcnt vmcnt(0)
3045; GFX8-NEXT:    v_mov_b32_e32 v1, 8
3046; GFX8-NEXT:    v_mov_b32_e32 v2, s4
3047; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v0
3048; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3049; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
3050; GFX8-NEXT:    v_and_b32_sdwa v2, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3051; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
3052; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
3053; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
3054; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3055; GFX8-NEXT:    s_setpc_b64 s[30:31]
3056;
3057; GFX7-LABEL: extractelement_vgpr_v16i8_idx0:
3058; GFX7:       ; %bb.0:
3059; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3060; GFX7-NEXT:    s_mov_b32 s6, 0
3061; GFX7-NEXT:    s_mov_b32 s7, 0xf000
3062; GFX7-NEXT:    s_mov_b64 s[4:5], 0
3063; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
3064; GFX7-NEXT:    s_movk_i32 s4, 0xff
3065; GFX7-NEXT:    s_waitcnt vmcnt(0)
3066; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
3067; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
3068; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
3069; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
3070; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
3071; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
3072; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
3073; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
3074; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
3075; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
3076; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
3077; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
3078; GFX7-NEXT:    s_setpc_b64 s[30:31]
3079;
3080; GFX10-LABEL: extractelement_vgpr_v16i8_idx0:
3081; GFX10:       ; %bb.0:
3082; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3083; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3084; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3085; GFX10-NEXT:    s_mov_b32 s4, 8
3086; GFX10-NEXT:    s_waitcnt vmcnt(0)
3087; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
3088; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
3089; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3090; GFX10-NEXT:    s_movk_i32 s4, 0xff
3091; GFX10-NEXT:    v_and_b32_sdwa v3, v0, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3092; GFX10-NEXT:    v_and_or_b32 v0, v0, s4, v1
3093; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
3094; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
3095; GFX10-NEXT:    s_setpc_b64 s[30:31]
3096  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
3097  %element = extractelement <16 x i8> %vector, i32 0
3098  ret i8 %element
3099}
3100
3101define i8 @extractelement_vgpr_v16i8_idx1(<16 x i8> addrspace(1)* %ptr) {
3102; GFX9-LABEL: extractelement_vgpr_v16i8_idx1:
3103; GFX9:       ; %bb.0:
3104; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3105; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3106; GFX9-NEXT:    s_mov_b32 s4, 8
3107; GFX9-NEXT:    s_movk_i32 s5, 0xff
3108; GFX9-NEXT:    s_waitcnt vmcnt(0)
3109; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
3110; GFX9-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
3111; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3112; GFX9-NEXT:    v_and_b32_sdwa v3, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3113; GFX9-NEXT:    v_and_or_b32 v0, v0, s5, v1
3114; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
3115; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
3116; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
3117; GFX9-NEXT:    s_setpc_b64 s[30:31]
3118;
3119; GFX8-LABEL: extractelement_vgpr_v16i8_idx1:
3120; GFX8:       ; %bb.0:
3121; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3122; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
3123; GFX8-NEXT:    s_movk_i32 s4, 0xff
3124; GFX8-NEXT:    s_waitcnt vmcnt(0)
3125; GFX8-NEXT:    v_mov_b32_e32 v1, 8
3126; GFX8-NEXT:    v_mov_b32_e32 v2, s4
3127; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v0
3128; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3129; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
3130; GFX8-NEXT:    v_and_b32_sdwa v2, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3131; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
3132; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
3133; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
3134; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3135; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
3136; GFX8-NEXT:    s_setpc_b64 s[30:31]
3137;
3138; GFX7-LABEL: extractelement_vgpr_v16i8_idx1:
3139; GFX7:       ; %bb.0:
3140; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3141; GFX7-NEXT:    s_mov_b32 s6, 0
3142; GFX7-NEXT:    s_mov_b32 s7, 0xf000
3143; GFX7-NEXT:    s_mov_b64 s[4:5], 0
3144; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
3145; GFX7-NEXT:    s_movk_i32 s4, 0xff
3146; GFX7-NEXT:    s_waitcnt vmcnt(0)
3147; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
3148; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
3149; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
3150; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
3151; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
3152; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
3153; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
3154; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
3155; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
3156; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
3157; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
3158; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
3159; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
3160; GFX7-NEXT:    s_setpc_b64 s[30:31]
3161;
3162; GFX10-LABEL: extractelement_vgpr_v16i8_idx1:
3163; GFX10:       ; %bb.0:
3164; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3165; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3166; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3167; GFX10-NEXT:    s_mov_b32 s4, 8
3168; GFX10-NEXT:    s_waitcnt vmcnt(0)
3169; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
3170; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
3171; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3172; GFX10-NEXT:    s_movk_i32 s4, 0xff
3173; GFX10-NEXT:    v_and_b32_sdwa v3, v0, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3174; GFX10-NEXT:    v_and_or_b32 v0, v0, s4, v1
3175; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
3176; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
3177; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
3178; GFX10-NEXT:    s_setpc_b64 s[30:31]
3179  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
3180  %element = extractelement <16 x i8> %vector, i32 1
3181  ret i8 %element
3182}
3183
3184define i8 @extractelement_vgpr_v16i8_idx2(<16 x i8> addrspace(1)* %ptr) {
3185; GFX9-LABEL: extractelement_vgpr_v16i8_idx2:
3186; GFX9:       ; %bb.0:
3187; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3188; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3189; GFX9-NEXT:    s_mov_b32 s4, 8
3190; GFX9-NEXT:    s_movk_i32 s5, 0xff
3191; GFX9-NEXT:    s_waitcnt vmcnt(0)
3192; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
3193; GFX9-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
3194; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3195; GFX9-NEXT:    v_and_b32_sdwa v3, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3196; GFX9-NEXT:    v_and_or_b32 v0, v0, s5, v1
3197; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
3198; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
3199; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
3200; GFX9-NEXT:    s_setpc_b64 s[30:31]
3201;
3202; GFX8-LABEL: extractelement_vgpr_v16i8_idx2:
3203; GFX8:       ; %bb.0:
3204; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3205; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
3206; GFX8-NEXT:    s_movk_i32 s4, 0xff
3207; GFX8-NEXT:    s_waitcnt vmcnt(0)
3208; GFX8-NEXT:    v_mov_b32_e32 v1, 8
3209; GFX8-NEXT:    v_mov_b32_e32 v2, s4
3210; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v0
3211; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3212; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
3213; GFX8-NEXT:    v_and_b32_sdwa v2, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3214; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
3215; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
3216; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
3217; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3218; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
3219; GFX8-NEXT:    s_setpc_b64 s[30:31]
3220;
3221; GFX7-LABEL: extractelement_vgpr_v16i8_idx2:
3222; GFX7:       ; %bb.0:
3223; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3224; GFX7-NEXT:    s_mov_b32 s6, 0
3225; GFX7-NEXT:    s_mov_b32 s7, 0xf000
3226; GFX7-NEXT:    s_mov_b64 s[4:5], 0
3227; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
3228; GFX7-NEXT:    s_movk_i32 s4, 0xff
3229; GFX7-NEXT:    s_waitcnt vmcnt(0)
3230; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
3231; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
3232; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
3233; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
3234; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
3235; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
3236; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
3237; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
3238; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
3239; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
3240; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
3241; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
3242; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
3243; GFX7-NEXT:    s_setpc_b64 s[30:31]
3244;
3245; GFX10-LABEL: extractelement_vgpr_v16i8_idx2:
3246; GFX10:       ; %bb.0:
3247; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3248; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3249; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3250; GFX10-NEXT:    s_mov_b32 s4, 8
3251; GFX10-NEXT:    s_waitcnt vmcnt(0)
3252; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
3253; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
3254; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3255; GFX10-NEXT:    s_movk_i32 s4, 0xff
3256; GFX10-NEXT:    v_and_b32_sdwa v3, v0, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3257; GFX10-NEXT:    v_and_or_b32 v0, v0, s4, v1
3258; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
3259; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
3260; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
3261; GFX10-NEXT:    s_setpc_b64 s[30:31]
3262  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
3263  %element = extractelement <16 x i8> %vector, i32 2
3264  ret i8 %element
3265}
3266
3267define i8 @extractelement_vgpr_v16i8_idx3(<16 x i8> addrspace(1)* %ptr) {
3268; GFX9-LABEL: extractelement_vgpr_v16i8_idx3:
3269; GFX9:       ; %bb.0:
3270; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3271; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3272; GFX9-NEXT:    s_mov_b32 s4, 8
3273; GFX9-NEXT:    s_movk_i32 s5, 0xff
3274; GFX9-NEXT:    s_waitcnt vmcnt(0)
3275; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
3276; GFX9-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
3277; GFX9-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3278; GFX9-NEXT:    v_and_b32_sdwa v3, v0, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3279; GFX9-NEXT:    v_and_or_b32 v0, v0, s5, v1
3280; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
3281; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
3282; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
3283; GFX9-NEXT:    s_setpc_b64 s[30:31]
3284;
3285; GFX8-LABEL: extractelement_vgpr_v16i8_idx3:
3286; GFX8:       ; %bb.0:
3287; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3288; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
3289; GFX8-NEXT:    s_movk_i32 s4, 0xff
3290; GFX8-NEXT:    s_waitcnt vmcnt(0)
3291; GFX8-NEXT:    v_mov_b32_e32 v1, 8
3292; GFX8-NEXT:    v_mov_b32_e32 v2, s4
3293; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v0
3294; GFX8-NEXT:    v_lshlrev_b32_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3295; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v0
3296; GFX8-NEXT:    v_and_b32_sdwa v2, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3297; GFX8-NEXT:    v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
3298; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
3299; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
3300; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3301; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
3302; GFX8-NEXT:    s_setpc_b64 s[30:31]
3303;
3304; GFX7-LABEL: extractelement_vgpr_v16i8_idx3:
3305; GFX7:       ; %bb.0:
3306; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3307; GFX7-NEXT:    s_mov_b32 s6, 0
3308; GFX7-NEXT:    s_mov_b32 s7, 0xf000
3309; GFX7-NEXT:    s_mov_b64 s[4:5], 0
3310; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
3311; GFX7-NEXT:    s_movk_i32 s4, 0xff
3312; GFX7-NEXT:    s_waitcnt vmcnt(0)
3313; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
3314; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
3315; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
3316; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
3317; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v0
3318; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
3319; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 8, v1
3320; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
3321; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
3322; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
3323; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
3324; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
3325; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
3326; GFX7-NEXT:    s_setpc_b64 s[30:31]
3327;
3328; GFX10-LABEL: extractelement_vgpr_v16i8_idx3:
3329; GFX10:       ; %bb.0:
3330; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3331; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3332; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3333; GFX10-NEXT:    s_mov_b32 s4, 8
3334; GFX10-NEXT:    s_waitcnt vmcnt(0)
3335; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 8, v0
3336; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v0
3337; GFX10-NEXT:    v_lshlrev_b32_sdwa v1, s4, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3338; GFX10-NEXT:    s_movk_i32 s4, 0xff
3339; GFX10-NEXT:    v_and_b32_sdwa v3, v0, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3340; GFX10-NEXT:    v_and_or_b32 v0, v0, s4, v1
3341; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
3342; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
3343; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
3344; GFX10-NEXT:    s_setpc_b64 s[30:31]
3345  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
3346  %element = extractelement <16 x i8> %vector, i32 3
3347  ret i8 %element
3348}
3349
3350define i8 @extractelement_vgpr_v16i8_idx4(<16 x i8> addrspace(1)* %ptr) {
3351; GFX9-LABEL: extractelement_vgpr_v16i8_idx4:
3352; GFX9:       ; %bb.0:
3353; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3354; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3355; GFX9-NEXT:    s_mov_b32 s4, 8
3356; GFX9-NEXT:    s_movk_i32 s5, 0xff
3357; GFX9-NEXT:    s_waitcnt vmcnt(0)
3358; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
3359; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3360; GFX9-NEXT:    v_lshrrev_b32_e32 v2, 24, v1
3361; GFX9-NEXT:    v_and_b32_sdwa v3, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3362; GFX9-NEXT:    v_and_or_b32 v0, v1, s5, v0
3363; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
3364; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
3365; GFX9-NEXT:    s_setpc_b64 s[30:31]
3366;
3367; GFX8-LABEL: extractelement_vgpr_v16i8_idx4:
3368; GFX8:       ; %bb.0:
3369; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3370; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
3371; GFX8-NEXT:    s_movk_i32 s4, 0xff
3372; GFX8-NEXT:    s_waitcnt vmcnt(0)
3373; GFX8-NEXT:    v_mov_b32_e32 v0, 8
3374; GFX8-NEXT:    v_mov_b32_e32 v2, s4
3375; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v1
3376; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3377; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v1
3378; GFX8-NEXT:    v_and_b32_sdwa v2, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3379; GFX8-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
3380; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
3381; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
3382; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3383; GFX8-NEXT:    s_setpc_b64 s[30:31]
3384;
3385; GFX7-LABEL: extractelement_vgpr_v16i8_idx4:
3386; GFX7:       ; %bb.0:
3387; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3388; GFX7-NEXT:    s_mov_b32 s6, 0
3389; GFX7-NEXT:    s_mov_b32 s7, 0xf000
3390; GFX7-NEXT:    s_mov_b64 s[4:5], 0
3391; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
3392; GFX7-NEXT:    s_movk_i32 s4, 0xff
3393; GFX7-NEXT:    s_waitcnt vmcnt(0)
3394; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
3395; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v1
3396; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
3397; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
3398; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
3399; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
3400; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
3401; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
3402; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
3403; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
3404; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
3405; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
3406; GFX7-NEXT:    s_setpc_b64 s[30:31]
3407;
3408; GFX10-LABEL: extractelement_vgpr_v16i8_idx4:
3409; GFX10:       ; %bb.0:
3410; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3411; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3412; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3413; GFX10-NEXT:    s_mov_b32 s4, 8
3414; GFX10-NEXT:    s_waitcnt vmcnt(0)
3415; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
3416; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v1
3417; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3418; GFX10-NEXT:    s_movk_i32 s4, 0xff
3419; GFX10-NEXT:    v_and_b32_sdwa v3, v1, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3420; GFX10-NEXT:    v_and_or_b32 v0, v1, s4, v0
3421; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
3422; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
3423; GFX10-NEXT:    s_setpc_b64 s[30:31]
3424  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
3425  %element = extractelement <16 x i8> %vector, i32 4
3426  ret i8 %element
3427}
3428
3429define i8 @extractelement_vgpr_v16i8_idx5(<16 x i8> addrspace(1)* %ptr) {
3430; GFX9-LABEL: extractelement_vgpr_v16i8_idx5:
3431; GFX9:       ; %bb.0:
3432; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3433; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3434; GFX9-NEXT:    s_mov_b32 s4, 8
3435; GFX9-NEXT:    s_movk_i32 s5, 0xff
3436; GFX9-NEXT:    s_waitcnt vmcnt(0)
3437; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
3438; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3439; GFX9-NEXT:    v_lshrrev_b32_e32 v2, 24, v1
3440; GFX9-NEXT:    v_and_b32_sdwa v3, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3441; GFX9-NEXT:    v_and_or_b32 v0, v1, s5, v0
3442; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
3443; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
3444; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
3445; GFX9-NEXT:    s_setpc_b64 s[30:31]
3446;
3447; GFX8-LABEL: extractelement_vgpr_v16i8_idx5:
3448; GFX8:       ; %bb.0:
3449; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3450; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
3451; GFX8-NEXT:    s_movk_i32 s4, 0xff
3452; GFX8-NEXT:    s_waitcnt vmcnt(0)
3453; GFX8-NEXT:    v_mov_b32_e32 v0, 8
3454; GFX8-NEXT:    v_mov_b32_e32 v2, s4
3455; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v1
3456; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3457; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v1
3458; GFX8-NEXT:    v_and_b32_sdwa v2, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3459; GFX8-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
3460; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
3461; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
3462; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3463; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
3464; GFX8-NEXT:    s_setpc_b64 s[30:31]
3465;
3466; GFX7-LABEL: extractelement_vgpr_v16i8_idx5:
3467; GFX7:       ; %bb.0:
3468; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3469; GFX7-NEXT:    s_mov_b32 s6, 0
3470; GFX7-NEXT:    s_mov_b32 s7, 0xf000
3471; GFX7-NEXT:    s_mov_b64 s[4:5], 0
3472; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
3473; GFX7-NEXT:    s_movk_i32 s4, 0xff
3474; GFX7-NEXT:    s_waitcnt vmcnt(0)
3475; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
3476; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v1
3477; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
3478; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
3479; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
3480; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
3481; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
3482; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
3483; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
3484; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
3485; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
3486; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
3487; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
3488; GFX7-NEXT:    s_setpc_b64 s[30:31]
3489;
3490; GFX10-LABEL: extractelement_vgpr_v16i8_idx5:
3491; GFX10:       ; %bb.0:
3492; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3493; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3494; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3495; GFX10-NEXT:    s_mov_b32 s4, 8
3496; GFX10-NEXT:    s_waitcnt vmcnt(0)
3497; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
3498; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v1
3499; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3500; GFX10-NEXT:    s_movk_i32 s4, 0xff
3501; GFX10-NEXT:    v_and_b32_sdwa v3, v1, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3502; GFX10-NEXT:    v_and_or_b32 v0, v1, s4, v0
3503; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
3504; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
3505; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
3506; GFX10-NEXT:    s_setpc_b64 s[30:31]
3507  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
3508  %element = extractelement <16 x i8> %vector, i32 5
3509  ret i8 %element
3510}
3511
3512define i8 @extractelement_vgpr_v16i8_idx6(<16 x i8> addrspace(1)* %ptr) {
3513; GFX9-LABEL: extractelement_vgpr_v16i8_idx6:
3514; GFX9:       ; %bb.0:
3515; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3516; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3517; GFX9-NEXT:    s_mov_b32 s4, 8
3518; GFX9-NEXT:    s_movk_i32 s5, 0xff
3519; GFX9-NEXT:    s_waitcnt vmcnt(0)
3520; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
3521; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3522; GFX9-NEXT:    v_lshrrev_b32_e32 v2, 24, v1
3523; GFX9-NEXT:    v_and_b32_sdwa v3, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3524; GFX9-NEXT:    v_and_or_b32 v0, v1, s5, v0
3525; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
3526; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
3527; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
3528; GFX9-NEXT:    s_setpc_b64 s[30:31]
3529;
3530; GFX8-LABEL: extractelement_vgpr_v16i8_idx6:
3531; GFX8:       ; %bb.0:
3532; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3533; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
3534; GFX8-NEXT:    s_movk_i32 s4, 0xff
3535; GFX8-NEXT:    s_waitcnt vmcnt(0)
3536; GFX8-NEXT:    v_mov_b32_e32 v0, 8
3537; GFX8-NEXT:    v_mov_b32_e32 v2, s4
3538; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v1
3539; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3540; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v1
3541; GFX8-NEXT:    v_and_b32_sdwa v2, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3542; GFX8-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
3543; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
3544; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
3545; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3546; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
3547; GFX8-NEXT:    s_setpc_b64 s[30:31]
3548;
3549; GFX7-LABEL: extractelement_vgpr_v16i8_idx6:
3550; GFX7:       ; %bb.0:
3551; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3552; GFX7-NEXT:    s_mov_b32 s6, 0
3553; GFX7-NEXT:    s_mov_b32 s7, 0xf000
3554; GFX7-NEXT:    s_mov_b64 s[4:5], 0
3555; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
3556; GFX7-NEXT:    s_movk_i32 s4, 0xff
3557; GFX7-NEXT:    s_waitcnt vmcnt(0)
3558; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
3559; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v1
3560; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
3561; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
3562; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
3563; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
3564; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
3565; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
3566; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
3567; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
3568; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
3569; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
3570; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
3571; GFX7-NEXT:    s_setpc_b64 s[30:31]
3572;
3573; GFX10-LABEL: extractelement_vgpr_v16i8_idx6:
3574; GFX10:       ; %bb.0:
3575; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3576; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3577; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3578; GFX10-NEXT:    s_mov_b32 s4, 8
3579; GFX10-NEXT:    s_waitcnt vmcnt(0)
3580; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
3581; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v1
3582; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3583; GFX10-NEXT:    s_movk_i32 s4, 0xff
3584; GFX10-NEXT:    v_and_b32_sdwa v3, v1, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3585; GFX10-NEXT:    v_and_or_b32 v0, v1, s4, v0
3586; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
3587; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
3588; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
3589; GFX10-NEXT:    s_setpc_b64 s[30:31]
3590  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
3591  %element = extractelement <16 x i8> %vector, i32 6
3592  ret i8 %element
3593}
3594
3595define i8 @extractelement_vgpr_v16i8_idx7(<16 x i8> addrspace(1)* %ptr) {
3596; GFX9-LABEL: extractelement_vgpr_v16i8_idx7:
3597; GFX9:       ; %bb.0:
3598; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3599; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3600; GFX9-NEXT:    s_mov_b32 s4, 8
3601; GFX9-NEXT:    s_movk_i32 s5, 0xff
3602; GFX9-NEXT:    s_waitcnt vmcnt(0)
3603; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
3604; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3605; GFX9-NEXT:    v_lshrrev_b32_e32 v2, 24, v1
3606; GFX9-NEXT:    v_and_b32_sdwa v3, v1, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3607; GFX9-NEXT:    v_and_or_b32 v0, v1, s5, v0
3608; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
3609; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
3610; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
3611; GFX9-NEXT:    s_setpc_b64 s[30:31]
3612;
3613; GFX8-LABEL: extractelement_vgpr_v16i8_idx7:
3614; GFX8:       ; %bb.0:
3615; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3616; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
3617; GFX8-NEXT:    s_movk_i32 s4, 0xff
3618; GFX8-NEXT:    s_waitcnt vmcnt(0)
3619; GFX8-NEXT:    v_mov_b32_e32 v0, 8
3620; GFX8-NEXT:    v_mov_b32_e32 v2, s4
3621; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v1
3622; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3623; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v1
3624; GFX8-NEXT:    v_and_b32_sdwa v2, v1, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3625; GFX8-NEXT:    v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
3626; GFX8-NEXT:    v_or_b32_e32 v0, v0, v2
3627; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
3628; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3629; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
3630; GFX8-NEXT:    s_setpc_b64 s[30:31]
3631;
3632; GFX7-LABEL: extractelement_vgpr_v16i8_idx7:
3633; GFX7:       ; %bb.0:
3634; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3635; GFX7-NEXT:    s_mov_b32 s6, 0
3636; GFX7-NEXT:    s_mov_b32 s7, 0xf000
3637; GFX7-NEXT:    s_mov_b64 s[4:5], 0
3638; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
3639; GFX7-NEXT:    s_movk_i32 s4, 0xff
3640; GFX7-NEXT:    s_waitcnt vmcnt(0)
3641; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
3642; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v1
3643; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
3644; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
3645; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v1
3646; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
3647; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
3648; GFX7-NEXT:    v_or_b32_e32 v0, v1, v0
3649; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
3650; GFX7-NEXT:    v_or_b32_e32 v0, v0, v2
3651; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
3652; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
3653; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
3654; GFX7-NEXT:    s_setpc_b64 s[30:31]
3655;
3656; GFX10-LABEL: extractelement_vgpr_v16i8_idx7:
3657; GFX10:       ; %bb.0:
3658; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3659; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3660; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3661; GFX10-NEXT:    s_mov_b32 s4, 8
3662; GFX10-NEXT:    s_waitcnt vmcnt(0)
3663; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v1
3664; GFX10-NEXT:    v_lshrrev_b32_e32 v2, 24, v1
3665; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3666; GFX10-NEXT:    s_movk_i32 s4, 0xff
3667; GFX10-NEXT:    v_and_b32_sdwa v3, v1, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3668; GFX10-NEXT:    v_and_or_b32 v0, v1, s4, v0
3669; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
3670; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
3671; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
3672; GFX10-NEXT:    s_setpc_b64 s[30:31]
3673  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
3674  %element = extractelement <16 x i8> %vector, i32 7
3675  ret i8 %element
3676}
3677
3678define i8 @extractelement_vgpr_v16i8_idx8(<16 x i8> addrspace(1)* %ptr) {
3679; GFX9-LABEL: extractelement_vgpr_v16i8_idx8:
3680; GFX9:       ; %bb.0:
3681; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3682; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3683; GFX9-NEXT:    s_mov_b32 s4, 8
3684; GFX9-NEXT:    s_movk_i32 s5, 0xff
3685; GFX9-NEXT:    s_waitcnt vmcnt(0)
3686; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v2
3687; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 24, v2
3688; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3689; GFX9-NEXT:    v_and_b32_sdwa v3, v2, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3690; GFX9-NEXT:    v_and_or_b32 v0, v2, s5, v0
3691; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
3692; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
3693; GFX9-NEXT:    s_setpc_b64 s[30:31]
3694;
3695; GFX8-LABEL: extractelement_vgpr_v16i8_idx8:
3696; GFX8:       ; %bb.0:
3697; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3698; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
3699; GFX8-NEXT:    s_movk_i32 s4, 0xff
3700; GFX8-NEXT:    s_waitcnt vmcnt(0)
3701; GFX8-NEXT:    v_mov_b32_e32 v0, 8
3702; GFX8-NEXT:    v_mov_b32_e32 v1, s4
3703; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v2
3704; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3705; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v2
3706; GFX8-NEXT:    v_and_b32_sdwa v1, v2, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3707; GFX8-NEXT:    v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
3708; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3709; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
3710; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3711; GFX8-NEXT:    s_setpc_b64 s[30:31]
3712;
3713; GFX7-LABEL: extractelement_vgpr_v16i8_idx8:
3714; GFX7:       ; %bb.0:
3715; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3716; GFX7-NEXT:    s_mov_b32 s6, 0
3717; GFX7-NEXT:    s_mov_b32 s7, 0xf000
3718; GFX7-NEXT:    s_mov_b64 s[4:5], 0
3719; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
3720; GFX7-NEXT:    s_movk_i32 s4, 0xff
3721; GFX7-NEXT:    s_waitcnt vmcnt(0)
3722; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v2
3723; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 16, v2
3724; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
3725; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
3726; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v2
3727; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
3728; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
3729; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
3730; GFX7-NEXT:    v_or_b32_e32 v0, v2, v0
3731; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
3732; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
3733; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
3734; GFX7-NEXT:    s_setpc_b64 s[30:31]
3735;
3736; GFX10-LABEL: extractelement_vgpr_v16i8_idx8:
3737; GFX10:       ; %bb.0:
3738; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3739; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3740; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3741; GFX10-NEXT:    s_mov_b32 s4, 8
3742; GFX10-NEXT:    s_waitcnt vmcnt(0)
3743; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v2
3744; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 24, v2
3745; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3746; GFX10-NEXT:    s_movk_i32 s4, 0xff
3747; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
3748; GFX10-NEXT:    v_and_b32_sdwa v3, v2, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3749; GFX10-NEXT:    v_and_or_b32 v0, v2, s4, v0
3750; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
3751; GFX10-NEXT:    s_setpc_b64 s[30:31]
3752  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
3753  %element = extractelement <16 x i8> %vector, i32 8
3754  ret i8 %element
3755}
3756
3757define i8 @extractelement_vgpr_v16i8_idx9(<16 x i8> addrspace(1)* %ptr) {
3758; GFX9-LABEL: extractelement_vgpr_v16i8_idx9:
3759; GFX9:       ; %bb.0:
3760; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3761; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3762; GFX9-NEXT:    s_mov_b32 s4, 8
3763; GFX9-NEXT:    s_movk_i32 s5, 0xff
3764; GFX9-NEXT:    s_waitcnt vmcnt(0)
3765; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v2
3766; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 24, v2
3767; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3768; GFX9-NEXT:    v_and_b32_sdwa v3, v2, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3769; GFX9-NEXT:    v_and_or_b32 v0, v2, s5, v0
3770; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
3771; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
3772; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
3773; GFX9-NEXT:    s_setpc_b64 s[30:31]
3774;
3775; GFX8-LABEL: extractelement_vgpr_v16i8_idx9:
3776; GFX8:       ; %bb.0:
3777; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3778; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
3779; GFX8-NEXT:    s_movk_i32 s4, 0xff
3780; GFX8-NEXT:    s_waitcnt vmcnt(0)
3781; GFX8-NEXT:    v_mov_b32_e32 v0, 8
3782; GFX8-NEXT:    v_mov_b32_e32 v1, s4
3783; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v2
3784; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3785; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v2
3786; GFX8-NEXT:    v_and_b32_sdwa v1, v2, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3787; GFX8-NEXT:    v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
3788; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3789; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
3790; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3791; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
3792; GFX8-NEXT:    s_setpc_b64 s[30:31]
3793;
3794; GFX7-LABEL: extractelement_vgpr_v16i8_idx9:
3795; GFX7:       ; %bb.0:
3796; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3797; GFX7-NEXT:    s_mov_b32 s6, 0
3798; GFX7-NEXT:    s_mov_b32 s7, 0xf000
3799; GFX7-NEXT:    s_mov_b64 s[4:5], 0
3800; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
3801; GFX7-NEXT:    s_movk_i32 s4, 0xff
3802; GFX7-NEXT:    s_waitcnt vmcnt(0)
3803; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v2
3804; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 16, v2
3805; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
3806; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
3807; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v2
3808; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
3809; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
3810; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
3811; GFX7-NEXT:    v_or_b32_e32 v0, v2, v0
3812; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
3813; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
3814; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
3815; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
3816; GFX7-NEXT:    s_setpc_b64 s[30:31]
3817;
3818; GFX10-LABEL: extractelement_vgpr_v16i8_idx9:
3819; GFX10:       ; %bb.0:
3820; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3821; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3822; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3823; GFX10-NEXT:    s_mov_b32 s4, 8
3824; GFX10-NEXT:    s_waitcnt vmcnt(0)
3825; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v2
3826; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 24, v2
3827; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3828; GFX10-NEXT:    s_movk_i32 s4, 0xff
3829; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
3830; GFX10-NEXT:    v_and_b32_sdwa v3, v2, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3831; GFX10-NEXT:    v_and_or_b32 v0, v2, s4, v0
3832; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
3833; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
3834; GFX10-NEXT:    s_setpc_b64 s[30:31]
3835  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
3836  %element = extractelement <16 x i8> %vector, i32 9
3837  ret i8 %element
3838}
3839
3840define i8 @extractelement_vgpr_v16i8_idx10(<16 x i8> addrspace(1)* %ptr) {
3841; GFX9-LABEL: extractelement_vgpr_v16i8_idx10:
3842; GFX9:       ; %bb.0:
3843; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3844; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3845; GFX9-NEXT:    s_mov_b32 s4, 8
3846; GFX9-NEXT:    s_movk_i32 s5, 0xff
3847; GFX9-NEXT:    s_waitcnt vmcnt(0)
3848; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v2
3849; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 24, v2
3850; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3851; GFX9-NEXT:    v_and_b32_sdwa v3, v2, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3852; GFX9-NEXT:    v_and_or_b32 v0, v2, s5, v0
3853; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
3854; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
3855; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
3856; GFX9-NEXT:    s_setpc_b64 s[30:31]
3857;
3858; GFX8-LABEL: extractelement_vgpr_v16i8_idx10:
3859; GFX8:       ; %bb.0:
3860; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3861; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
3862; GFX8-NEXT:    s_movk_i32 s4, 0xff
3863; GFX8-NEXT:    s_waitcnt vmcnt(0)
3864; GFX8-NEXT:    v_mov_b32_e32 v0, 8
3865; GFX8-NEXT:    v_mov_b32_e32 v1, s4
3866; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v2
3867; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3868; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v2
3869; GFX8-NEXT:    v_and_b32_sdwa v1, v2, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3870; GFX8-NEXT:    v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
3871; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3872; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
3873; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3874; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
3875; GFX8-NEXT:    s_setpc_b64 s[30:31]
3876;
3877; GFX7-LABEL: extractelement_vgpr_v16i8_idx10:
3878; GFX7:       ; %bb.0:
3879; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3880; GFX7-NEXT:    s_mov_b32 s6, 0
3881; GFX7-NEXT:    s_mov_b32 s7, 0xf000
3882; GFX7-NEXT:    s_mov_b64 s[4:5], 0
3883; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
3884; GFX7-NEXT:    s_movk_i32 s4, 0xff
3885; GFX7-NEXT:    s_waitcnt vmcnt(0)
3886; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v2
3887; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 16, v2
3888; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
3889; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
3890; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v2
3891; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
3892; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
3893; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
3894; GFX7-NEXT:    v_or_b32_e32 v0, v2, v0
3895; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
3896; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
3897; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
3898; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
3899; GFX7-NEXT:    s_setpc_b64 s[30:31]
3900;
3901; GFX10-LABEL: extractelement_vgpr_v16i8_idx10:
3902; GFX10:       ; %bb.0:
3903; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3904; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3905; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3906; GFX10-NEXT:    s_mov_b32 s4, 8
3907; GFX10-NEXT:    s_waitcnt vmcnt(0)
3908; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v2
3909; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 24, v2
3910; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3911; GFX10-NEXT:    s_movk_i32 s4, 0xff
3912; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
3913; GFX10-NEXT:    v_and_b32_sdwa v3, v2, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3914; GFX10-NEXT:    v_and_or_b32 v0, v2, s4, v0
3915; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
3916; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
3917; GFX10-NEXT:    s_setpc_b64 s[30:31]
3918  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
3919  %element = extractelement <16 x i8> %vector, i32 10
3920  ret i8 %element
3921}
3922
3923define i8 @extractelement_vgpr_v16i8_idx11(<16 x i8> addrspace(1)* %ptr) {
3924; GFX9-LABEL: extractelement_vgpr_v16i8_idx11:
3925; GFX9:       ; %bb.0:
3926; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3927; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3928; GFX9-NEXT:    s_mov_b32 s4, 8
3929; GFX9-NEXT:    s_movk_i32 s5, 0xff
3930; GFX9-NEXT:    s_waitcnt vmcnt(0)
3931; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v2
3932; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 24, v2
3933; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3934; GFX9-NEXT:    v_and_b32_sdwa v3, v2, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3935; GFX9-NEXT:    v_and_or_b32 v0, v2, s5, v0
3936; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
3937; GFX9-NEXT:    v_or3_b32 v0, v0, v3, v1
3938; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
3939; GFX9-NEXT:    s_setpc_b64 s[30:31]
3940;
3941; GFX8-LABEL: extractelement_vgpr_v16i8_idx11:
3942; GFX8:       ; %bb.0:
3943; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3944; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
3945; GFX8-NEXT:    s_movk_i32 s4, 0xff
3946; GFX8-NEXT:    s_waitcnt vmcnt(0)
3947; GFX8-NEXT:    v_mov_b32_e32 v0, 8
3948; GFX8-NEXT:    v_mov_b32_e32 v1, s4
3949; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 8, v2
3950; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3951; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v2
3952; GFX8-NEXT:    v_and_b32_sdwa v1, v2, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3953; GFX8-NEXT:    v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
3954; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3955; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
3956; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
3957; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
3958; GFX8-NEXT:    s_setpc_b64 s[30:31]
3959;
3960; GFX7-LABEL: extractelement_vgpr_v16i8_idx11:
3961; GFX7:       ; %bb.0:
3962; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3963; GFX7-NEXT:    s_mov_b32 s6, 0
3964; GFX7-NEXT:    s_mov_b32 s7, 0xf000
3965; GFX7-NEXT:    s_mov_b64 s[4:5], 0
3966; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
3967; GFX7-NEXT:    s_movk_i32 s4, 0xff
3968; GFX7-NEXT:    s_waitcnt vmcnt(0)
3969; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v2
3970; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 16, v2
3971; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
3972; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
3973; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 24, v2
3974; GFX7-NEXT:    v_and_b32_e32 v2, s4, v2
3975; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
3976; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
3977; GFX7-NEXT:    v_or_b32_e32 v0, v2, v0
3978; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
3979; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v3
3980; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
3981; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
3982; GFX7-NEXT:    s_setpc_b64 s[30:31]
3983;
3984; GFX10-LABEL: extractelement_vgpr_v16i8_idx11:
3985; GFX10:       ; %bb.0:
3986; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3987; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
3988; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
3989; GFX10-NEXT:    s_mov_b32 s4, 8
3990; GFX10-NEXT:    s_waitcnt vmcnt(0)
3991; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v2
3992; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 24, v2
3993; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
3994; GFX10-NEXT:    s_movk_i32 s4, 0xff
3995; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
3996; GFX10-NEXT:    v_and_b32_sdwa v3, v2, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
3997; GFX10-NEXT:    v_and_or_b32 v0, v2, s4, v0
3998; GFX10-NEXT:    v_or3_b32 v0, v0, v3, v1
3999; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
4000; GFX10-NEXT:    s_setpc_b64 s[30:31]
4001  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
4002  %element = extractelement <16 x i8> %vector, i32 11
4003  ret i8 %element
4004}
4005
4006define i8 @extractelement_vgpr_v16i8_idx12(<16 x i8> addrspace(1)* %ptr) {
4007; GFX9-LABEL: extractelement_vgpr_v16i8_idx12:
4008; GFX9:       ; %bb.0:
4009; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4010; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
4011; GFX9-NEXT:    s_mov_b32 s4, 8
4012; GFX9-NEXT:    s_movk_i32 s5, 0xff
4013; GFX9-NEXT:    s_waitcnt vmcnt(0)
4014; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v3
4015; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 24, v3
4016; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
4017; GFX9-NEXT:    v_and_b32_sdwa v2, v3, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
4018; GFX9-NEXT:    v_and_or_b32 v0, v3, s5, v0
4019; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
4020; GFX9-NEXT:    v_or3_b32 v0, v0, v2, v1
4021; GFX9-NEXT:    s_setpc_b64 s[30:31]
4022;
4023; GFX8-LABEL: extractelement_vgpr_v16i8_idx12:
4024; GFX8:       ; %bb.0:
4025; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4026; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
4027; GFX8-NEXT:    s_movk_i32 s4, 0xff
4028; GFX8-NEXT:    s_waitcnt vmcnt(0)
4029; GFX8-NEXT:    v_mov_b32_e32 v0, 8
4030; GFX8-NEXT:    v_mov_b32_e32 v1, s4
4031; GFX8-NEXT:    v_lshrrev_b32_e32 v2, 8, v3
4032; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
4033; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v3
4034; GFX8-NEXT:    v_and_b32_sdwa v1, v3, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
4035; GFX8-NEXT:    v_or_b32_sdwa v0, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
4036; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
4037; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
4038; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
4039; GFX8-NEXT:    s_setpc_b64 s[30:31]
4040;
4041; GFX7-LABEL: extractelement_vgpr_v16i8_idx12:
4042; GFX7:       ; %bb.0:
4043; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4044; GFX7-NEXT:    s_mov_b32 s6, 0
4045; GFX7-NEXT:    s_mov_b32 s7, 0xf000
4046; GFX7-NEXT:    s_mov_b64 s[4:5], 0
4047; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
4048; GFX7-NEXT:    s_movk_i32 s4, 0xff
4049; GFX7-NEXT:    s_waitcnt vmcnt(0)
4050; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v3
4051; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 16, v3
4052; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
4053; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
4054; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 24, v3
4055; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
4056; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
4057; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
4058; GFX7-NEXT:    v_or_b32_e32 v0, v3, v0
4059; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
4060; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
4061; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
4062; GFX7-NEXT:    s_setpc_b64 s[30:31]
4063;
4064; GFX10-LABEL: extractelement_vgpr_v16i8_idx12:
4065; GFX10:       ; %bb.0:
4066; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4067; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
4068; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
4069; GFX10-NEXT:    s_mov_b32 s4, 8
4070; GFX10-NEXT:    s_waitcnt vmcnt(0)
4071; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v3
4072; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 24, v3
4073; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
4074; GFX10-NEXT:    s_movk_i32 s4, 0xff
4075; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
4076; GFX10-NEXT:    v_and_b32_sdwa v2, v3, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
4077; GFX10-NEXT:    v_and_or_b32 v0, v3, s4, v0
4078; GFX10-NEXT:    v_or3_b32 v0, v0, v2, v1
4079; GFX10-NEXT:    s_setpc_b64 s[30:31]
4080  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
4081  %element = extractelement <16 x i8> %vector, i32 12
4082  ret i8 %element
4083}
4084
4085define i8 @extractelement_vgpr_v16i8_idx13(<16 x i8> addrspace(1)* %ptr) {
4086; GFX9-LABEL: extractelement_vgpr_v16i8_idx13:
4087; GFX9:       ; %bb.0:
4088; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4089; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
4090; GFX9-NEXT:    s_mov_b32 s4, 8
4091; GFX9-NEXT:    s_movk_i32 s5, 0xff
4092; GFX9-NEXT:    s_waitcnt vmcnt(0)
4093; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v3
4094; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 24, v3
4095; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
4096; GFX9-NEXT:    v_and_b32_sdwa v2, v3, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
4097; GFX9-NEXT:    v_and_or_b32 v0, v3, s5, v0
4098; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
4099; GFX9-NEXT:    v_or3_b32 v0, v0, v2, v1
4100; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
4101; GFX9-NEXT:    s_setpc_b64 s[30:31]
4102;
4103; GFX8-LABEL: extractelement_vgpr_v16i8_idx13:
4104; GFX8:       ; %bb.0:
4105; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4106; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
4107; GFX8-NEXT:    s_movk_i32 s4, 0xff
4108; GFX8-NEXT:    s_waitcnt vmcnt(0)
4109; GFX8-NEXT:    v_mov_b32_e32 v0, 8
4110; GFX8-NEXT:    v_mov_b32_e32 v1, s4
4111; GFX8-NEXT:    v_lshrrev_b32_e32 v2, 8, v3
4112; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
4113; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v3
4114; GFX8-NEXT:    v_and_b32_sdwa v1, v3, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
4115; GFX8-NEXT:    v_or_b32_sdwa v0, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
4116; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
4117; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
4118; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
4119; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
4120; GFX8-NEXT:    s_setpc_b64 s[30:31]
4121;
4122; GFX7-LABEL: extractelement_vgpr_v16i8_idx13:
4123; GFX7:       ; %bb.0:
4124; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4125; GFX7-NEXT:    s_mov_b32 s6, 0
4126; GFX7-NEXT:    s_mov_b32 s7, 0xf000
4127; GFX7-NEXT:    s_mov_b64 s[4:5], 0
4128; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
4129; GFX7-NEXT:    s_movk_i32 s4, 0xff
4130; GFX7-NEXT:    s_waitcnt vmcnt(0)
4131; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v3
4132; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 16, v3
4133; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
4134; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
4135; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 24, v3
4136; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
4137; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
4138; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
4139; GFX7-NEXT:    v_or_b32_e32 v0, v3, v0
4140; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
4141; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
4142; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
4143; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
4144; GFX7-NEXT:    s_setpc_b64 s[30:31]
4145;
4146; GFX10-LABEL: extractelement_vgpr_v16i8_idx13:
4147; GFX10:       ; %bb.0:
4148; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4149; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
4150; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
4151; GFX10-NEXT:    s_mov_b32 s4, 8
4152; GFX10-NEXT:    s_waitcnt vmcnt(0)
4153; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v3
4154; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 24, v3
4155; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
4156; GFX10-NEXT:    s_movk_i32 s4, 0xff
4157; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
4158; GFX10-NEXT:    v_and_b32_sdwa v2, v3, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
4159; GFX10-NEXT:    v_and_or_b32 v0, v3, s4, v0
4160; GFX10-NEXT:    v_or3_b32 v0, v0, v2, v1
4161; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v0
4162; GFX10-NEXT:    s_setpc_b64 s[30:31]
4163  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
4164  %element = extractelement <16 x i8> %vector, i32 13
4165  ret i8 %element
4166}
4167
4168define i8 @extractelement_vgpr_v16i8_idx14(<16 x i8> addrspace(1)* %ptr) {
4169; GFX9-LABEL: extractelement_vgpr_v16i8_idx14:
4170; GFX9:       ; %bb.0:
4171; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4172; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
4173; GFX9-NEXT:    s_mov_b32 s4, 8
4174; GFX9-NEXT:    s_movk_i32 s5, 0xff
4175; GFX9-NEXT:    s_waitcnt vmcnt(0)
4176; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v3
4177; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 24, v3
4178; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
4179; GFX9-NEXT:    v_and_b32_sdwa v2, v3, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
4180; GFX9-NEXT:    v_and_or_b32 v0, v3, s5, v0
4181; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
4182; GFX9-NEXT:    v_or3_b32 v0, v0, v2, v1
4183; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
4184; GFX9-NEXT:    s_setpc_b64 s[30:31]
4185;
4186; GFX8-LABEL: extractelement_vgpr_v16i8_idx14:
4187; GFX8:       ; %bb.0:
4188; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4189; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
4190; GFX8-NEXT:    s_movk_i32 s4, 0xff
4191; GFX8-NEXT:    s_waitcnt vmcnt(0)
4192; GFX8-NEXT:    v_mov_b32_e32 v0, 8
4193; GFX8-NEXT:    v_mov_b32_e32 v1, s4
4194; GFX8-NEXT:    v_lshrrev_b32_e32 v2, 8, v3
4195; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
4196; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v3
4197; GFX8-NEXT:    v_and_b32_sdwa v1, v3, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
4198; GFX8-NEXT:    v_or_b32_sdwa v0, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
4199; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
4200; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
4201; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
4202; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
4203; GFX8-NEXT:    s_setpc_b64 s[30:31]
4204;
4205; GFX7-LABEL: extractelement_vgpr_v16i8_idx14:
4206; GFX7:       ; %bb.0:
4207; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4208; GFX7-NEXT:    s_mov_b32 s6, 0
4209; GFX7-NEXT:    s_mov_b32 s7, 0xf000
4210; GFX7-NEXT:    s_mov_b64 s[4:5], 0
4211; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
4212; GFX7-NEXT:    s_movk_i32 s4, 0xff
4213; GFX7-NEXT:    s_waitcnt vmcnt(0)
4214; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v3
4215; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 16, v3
4216; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
4217; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
4218; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 24, v3
4219; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
4220; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
4221; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
4222; GFX7-NEXT:    v_or_b32_e32 v0, v3, v0
4223; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
4224; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
4225; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
4226; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
4227; GFX7-NEXT:    s_setpc_b64 s[30:31]
4228;
4229; GFX10-LABEL: extractelement_vgpr_v16i8_idx14:
4230; GFX10:       ; %bb.0:
4231; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4232; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
4233; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
4234; GFX10-NEXT:    s_mov_b32 s4, 8
4235; GFX10-NEXT:    s_waitcnt vmcnt(0)
4236; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v3
4237; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 24, v3
4238; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
4239; GFX10-NEXT:    s_movk_i32 s4, 0xff
4240; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
4241; GFX10-NEXT:    v_and_b32_sdwa v2, v3, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
4242; GFX10-NEXT:    v_and_or_b32 v0, v3, s4, v0
4243; GFX10-NEXT:    v_or3_b32 v0, v0, v2, v1
4244; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
4245; GFX10-NEXT:    s_setpc_b64 s[30:31]
4246  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
4247  %element = extractelement <16 x i8> %vector, i32 14
4248  ret i8 %element
4249}
4250
4251define i8 @extractelement_vgpr_v16i8_idx15(<16 x i8> addrspace(1)* %ptr) {
4252; GFX9-LABEL: extractelement_vgpr_v16i8_idx15:
4253; GFX9:       ; %bb.0:
4254; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4255; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
4256; GFX9-NEXT:    s_mov_b32 s4, 8
4257; GFX9-NEXT:    s_movk_i32 s5, 0xff
4258; GFX9-NEXT:    s_waitcnt vmcnt(0)
4259; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 8, v3
4260; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 24, v3
4261; GFX9-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
4262; GFX9-NEXT:    v_and_b32_sdwa v2, v3, s5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
4263; GFX9-NEXT:    v_and_or_b32 v0, v3, s5, v0
4264; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
4265; GFX9-NEXT:    v_or3_b32 v0, v0, v2, v1
4266; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
4267; GFX9-NEXT:    s_setpc_b64 s[30:31]
4268;
4269; GFX8-LABEL: extractelement_vgpr_v16i8_idx15:
4270; GFX8:       ; %bb.0:
4271; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4272; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
4273; GFX8-NEXT:    s_movk_i32 s4, 0xff
4274; GFX8-NEXT:    s_waitcnt vmcnt(0)
4275; GFX8-NEXT:    v_mov_b32_e32 v0, 8
4276; GFX8-NEXT:    v_mov_b32_e32 v1, s4
4277; GFX8-NEXT:    v_lshrrev_b32_e32 v2, 8, v3
4278; GFX8-NEXT:    v_lshlrev_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
4279; GFX8-NEXT:    v_lshrrev_b32_e32 v4, 24, v3
4280; GFX8-NEXT:    v_and_b32_sdwa v1, v3, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
4281; GFX8-NEXT:    v_or_b32_sdwa v0, v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:DWORD
4282; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
4283; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 24, v4
4284; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1
4285; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
4286; GFX8-NEXT:    s_setpc_b64 s[30:31]
4287;
4288; GFX7-LABEL: extractelement_vgpr_v16i8_idx15:
4289; GFX7:       ; %bb.0:
4290; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4291; GFX7-NEXT:    s_mov_b32 s6, 0
4292; GFX7-NEXT:    s_mov_b32 s7, 0xf000
4293; GFX7-NEXT:    s_mov_b64 s[4:5], 0
4294; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
4295; GFX7-NEXT:    s_movk_i32 s4, 0xff
4296; GFX7-NEXT:    s_waitcnt vmcnt(0)
4297; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 8, v3
4298; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 16, v3
4299; GFX7-NEXT:    v_and_b32_e32 v0, s4, v0
4300; GFX7-NEXT:    v_and_b32_e32 v1, s4, v1
4301; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 24, v3
4302; GFX7-NEXT:    v_and_b32_e32 v3, s4, v3
4303; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 8, v0
4304; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
4305; GFX7-NEXT:    v_or_b32_e32 v0, v3, v0
4306; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
4307; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 24, v2
4308; GFX7-NEXT:    v_or_b32_e32 v0, v0, v1
4309; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
4310; GFX7-NEXT:    s_setpc_b64 s[30:31]
4311;
4312; GFX10-LABEL: extractelement_vgpr_v16i8_idx15:
4313; GFX10:       ; %bb.0:
4314; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4315; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
4316; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
4317; GFX10-NEXT:    s_mov_b32 s4, 8
4318; GFX10-NEXT:    s_waitcnt vmcnt(0)
4319; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 8, v3
4320; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 24, v3
4321; GFX10-NEXT:    v_lshlrev_b32_sdwa v0, s4, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
4322; GFX10-NEXT:    s_movk_i32 s4, 0xff
4323; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 24, v1
4324; GFX10-NEXT:    v_and_b32_sdwa v2, v3, s4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
4325; GFX10-NEXT:    v_and_or_b32 v0, v3, s4, v0
4326; GFX10-NEXT:    v_or3_b32 v0, v0, v2, v1
4327; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 24, v0
4328; GFX10-NEXT:    s_setpc_b64 s[30:31]
4329  %vector = load <16 x i8>, <16 x i8> addrspace(1)* %ptr
4330  %element = extractelement <16 x i8> %vector, i32 15
4331  ret i8 %element
4332}
4333