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 i16 @extractelement_sgpr_v4i16_sgpr_idx(<4 x i16> addrspace(4)* inreg %ptr, i32 inreg %idx) {
8; GCN-LABEL: extractelement_sgpr_v4i16_sgpr_idx:
9; GCN:       ; %bb.0:
10; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
11; GCN-NEXT:    s_lshr_b32 s2, s4, 1
12; GCN-NEXT:    s_cmp_eq_u32 s2, 1
13; GCN-NEXT:    s_waitcnt lgkmcnt(0)
14; GCN-NEXT:    s_cselect_b32 s0, s1, s0
15; GCN-NEXT:    s_and_b32 s1, s4, 1
16; GCN-NEXT:    s_lshl_b32 s1, s1, 4
17; GCN-NEXT:    s_lshr_b32 s0, s0, s1
18; GCN-NEXT:    ; return to shader part epilog
19;
20; GFX10-LABEL: extractelement_sgpr_v4i16_sgpr_idx:
21; GFX10:       ; %bb.0:
22; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
23; GFX10-NEXT:    s_lshr_b32 s2, s4, 1
24; GFX10-NEXT:    s_cmp_eq_u32 s2, 1
25; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
26; GFX10-NEXT:    s_cselect_b32 s0, s1, s0
27; GFX10-NEXT:    s_and_b32 s1, s4, 1
28; GFX10-NEXT:    s_lshl_b32 s1, s1, 4
29; GFX10-NEXT:    s_lshr_b32 s0, s0, s1
30; GFX10-NEXT:    ; return to shader part epilog
31  %vector = load <4 x i16>, <4 x i16> addrspace(4)* %ptr
32  %element = extractelement <4 x i16> %vector, i32 %idx
33  ret i16 %element
34}
35
36define amdgpu_ps i16 @extractelement_vgpr_v4i16_sgpr_idx(<4 x i16> addrspace(1)* %ptr, i32 inreg %idx) {
37; GFX9-LABEL: extractelement_vgpr_v4i16_sgpr_idx:
38; GFX9:       ; %bb.0:
39; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
40; GFX9-NEXT:    s_lshr_b32 s0, s2, 1
41; GFX9-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 1
42; GFX9-NEXT:    s_and_b32 s1, s2, 1
43; GFX9-NEXT:    s_lshl_b32 s0, s1, 4
44; GFX9-NEXT:    s_waitcnt vmcnt(0)
45; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
46; GFX9-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
47; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
48; GFX9-NEXT:    ; return to shader part epilog
49;
50; GFX8-LABEL: extractelement_vgpr_v4i16_sgpr_idx:
51; GFX8:       ; %bb.0:
52; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
53; GFX8-NEXT:    s_lshr_b32 s0, s2, 1
54; GFX8-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 1
55; GFX8-NEXT:    s_and_b32 s1, s2, 1
56; GFX8-NEXT:    s_lshl_b32 s0, s1, 4
57; GFX8-NEXT:    s_waitcnt vmcnt(0)
58; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
59; GFX8-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
60; GFX8-NEXT:    v_readfirstlane_b32 s0, v0
61; GFX8-NEXT:    ; return to shader part epilog
62;
63; GFX7-LABEL: extractelement_vgpr_v4i16_sgpr_idx:
64; GFX7:       ; %bb.0:
65; GFX7-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
66; GFX7-NEXT:    s_lshr_b32 s0, s2, 1
67; GFX7-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 1
68; GFX7-NEXT:    s_and_b32 s1, s2, 1
69; GFX7-NEXT:    s_lshl_b32 s0, s1, 4
70; GFX7-NEXT:    s_waitcnt vmcnt(0)
71; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
72; GFX7-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
73; GFX7-NEXT:    v_readfirstlane_b32 s0, v0
74; GFX7-NEXT:    ; return to shader part epilog
75;
76; GFX10-LABEL: extractelement_vgpr_v4i16_sgpr_idx:
77; GFX10:       ; %bb.0:
78; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
79; GFX10-NEXT:    s_lshr_b32 s0, s2, 1
80; GFX10-NEXT:    v_cmp_eq_u32_e64 vcc_lo, s0, 1
81; GFX10-NEXT:    s_and_b32 s0, s2, 1
82; GFX10-NEXT:    s_lshl_b32 s0, s0, 4
83; GFX10-NEXT:    s_waitcnt vmcnt(0)
84; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc_lo
85; GFX10-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
86; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
87; GFX10-NEXT:    ; return to shader part epilog
88  %vector = load <4 x i16>, <4 x i16> addrspace(1)* %ptr
89  %element = extractelement <4 x i16> %vector, i32 %idx
90  ret i16 %element
91}
92
93define i16 @extractelement_vgpr_v4i16_vgpr_idx(<4 x i16> addrspace(1)* %ptr, i32 %idx) {
94; GFX9-LABEL: extractelement_vgpr_v4i16_vgpr_idx:
95; GFX9:       ; %bb.0:
96; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
97; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
98; GFX9-NEXT:    v_lshrrev_b32_e32 v3, 1, v2
99; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v3
100; GFX9-NEXT:    v_and_b32_e32 v2, 1, v2
101; GFX9-NEXT:    s_waitcnt vmcnt(0)
102; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
103; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 4, v2
104; GFX9-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
105; GFX9-NEXT:    s_setpc_b64 s[30:31]
106;
107; GFX8-LABEL: extractelement_vgpr_v4i16_vgpr_idx:
108; GFX8:       ; %bb.0:
109; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
110; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
111; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 1, v2
112; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v3
113; GFX8-NEXT:    v_and_b32_e32 v2, 1, v2
114; GFX8-NEXT:    s_waitcnt vmcnt(0)
115; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
116; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 4, v2
117; GFX8-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
118; GFX8-NEXT:    s_setpc_b64 s[30:31]
119;
120; GFX7-LABEL: extractelement_vgpr_v4i16_vgpr_idx:
121; GFX7:       ; %bb.0:
122; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
123; GFX7-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
124; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 1, v2
125; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v3
126; GFX7-NEXT:    v_and_b32_e32 v2, 1, v2
127; GFX7-NEXT:    s_waitcnt vmcnt(0)
128; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
129; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 4, v2
130; GFX7-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
131; GFX7-NEXT:    s_setpc_b64 s[30:31]
132;
133; GFX10-LABEL: extractelement_vgpr_v4i16_vgpr_idx:
134; GFX10:       ; %bb.0:
135; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
136; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
137; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
138; GFX10-NEXT:    v_lshrrev_b32_e32 v3, 1, v2
139; GFX10-NEXT:    v_and_b32_e32 v2, 1, v2
140; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 1, v3
141; GFX10-NEXT:    s_waitcnt vmcnt(0)
142; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc_lo
143; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 4, v2
144; GFX10-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
145; GFX10-NEXT:    s_setpc_b64 s[30:31]
146  %vector = load <4 x i16>, <4 x i16> addrspace(1)* %ptr
147  %element = extractelement <4 x i16> %vector, i32 %idx
148  ret i16 %element
149}
150
151define amdgpu_ps i16 @extractelement_sgpr_v4i16_vgpr_idx(<4 x i16> addrspace(4)* inreg %ptr, i32 %idx) {
152; GCN-LABEL: extractelement_sgpr_v4i16_vgpr_idx:
153; GCN:       ; %bb.0:
154; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
155; GCN-NEXT:    v_lshrrev_b32_e32 v1, 1, v0
156; GCN-NEXT:    v_and_b32_e32 v0, 1, v0
157; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v1
158; GCN-NEXT:    v_lshlrev_b32_e32 v0, 4, v0
159; GCN-NEXT:    s_waitcnt lgkmcnt(0)
160; GCN-NEXT:    v_mov_b32_e32 v2, s0
161; GCN-NEXT:    v_mov_b32_e32 v3, s1
162; GCN-NEXT:    v_cndmask_b32_e32 v1, v2, v3, vcc
163; GCN-NEXT:    v_lshrrev_b32_e32 v0, v0, v1
164; GCN-NEXT:    v_readfirstlane_b32 s0, v0
165; GCN-NEXT:    ; return to shader part epilog
166;
167; GFX10-LABEL: extractelement_sgpr_v4i16_vgpr_idx:
168; GFX10:       ; %bb.0:
169; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
170; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 1, v0
171; GFX10-NEXT:    v_and_b32_e32 v0, 1, v0
172; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 1, v1
173; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 4, v0
174; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
175; GFX10-NEXT:    v_mov_b32_e32 v2, s1
176; GFX10-NEXT:    v_cndmask_b32_e32 v1, s0, v2, vcc_lo
177; GFX10-NEXT:    v_lshrrev_b32_e32 v0, v0, v1
178; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
179; GFX10-NEXT:    ; return to shader part epilog
180  %vector = load <4 x i16>, <4 x i16> addrspace(4)* %ptr
181  %element = extractelement <4 x i16> %vector, i32 %idx
182  ret i16 %element
183}
184
185define amdgpu_ps i16 @extractelement_sgpr_v4i16_idx0(<4 x i16> addrspace(4)* inreg %ptr) {
186; GCN-LABEL: extractelement_sgpr_v4i16_idx0:
187; GCN:       ; %bb.0:
188; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
189; GCN-NEXT:    s_waitcnt lgkmcnt(0)
190; GCN-NEXT:    ; return to shader part epilog
191;
192; GFX10-LABEL: extractelement_sgpr_v4i16_idx0:
193; GFX10:       ; %bb.0:
194; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
195; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
196; GFX10-NEXT:    ; return to shader part epilog
197  %vector = load <4 x i16>, <4 x i16> addrspace(4)* %ptr
198  %element = extractelement <4 x i16> %vector, i32 0
199  ret i16 %element
200}
201
202define amdgpu_ps i16 @extractelement_sgpr_v4i16_idx1(<4 x i16> addrspace(4)* inreg %ptr) {
203; GCN-LABEL: extractelement_sgpr_v4i16_idx1:
204; GCN:       ; %bb.0:
205; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
206; GCN-NEXT:    s_waitcnt lgkmcnt(0)
207; GCN-NEXT:    s_lshr_b32 s0, s0, 16
208; GCN-NEXT:    ; return to shader part epilog
209;
210; GFX10-LABEL: extractelement_sgpr_v4i16_idx1:
211; GFX10:       ; %bb.0:
212; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
213; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
214; GFX10-NEXT:    s_lshr_b32 s0, s0, 16
215; GFX10-NEXT:    ; return to shader part epilog
216  %vector = load <4 x i16>, <4 x i16> addrspace(4)* %ptr
217  %element = extractelement <4 x i16> %vector, i32 1
218  ret i16 %element
219}
220
221define amdgpu_ps i16 @extractelement_sgpr_v4i16_idx2(<4 x i16> addrspace(4)* inreg %ptr) {
222; GCN-LABEL: extractelement_sgpr_v4i16_idx2:
223; GCN:       ; %bb.0:
224; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
225; GCN-NEXT:    s_waitcnt lgkmcnt(0)
226; GCN-NEXT:    s_mov_b32 s0, s1
227; GCN-NEXT:    ; return to shader part epilog
228;
229; GFX10-LABEL: extractelement_sgpr_v4i16_idx2:
230; GFX10:       ; %bb.0:
231; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
232; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
233; GFX10-NEXT:    s_mov_b32 s0, s1
234; GFX10-NEXT:    ; return to shader part epilog
235  %vector = load <4 x i16>, <4 x i16> addrspace(4)* %ptr
236  %element = extractelement <4 x i16> %vector, i32 2
237  ret i16 %element
238}
239
240define amdgpu_ps i16 @extractelement_sgpr_v4i16_idx3(<4 x i16> addrspace(4)* inreg %ptr) {
241; GCN-LABEL: extractelement_sgpr_v4i16_idx3:
242; GCN:       ; %bb.0:
243; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
244; GCN-NEXT:    s_waitcnt lgkmcnt(0)
245; GCN-NEXT:    s_lshr_b32 s0, s1, 16
246; GCN-NEXT:    ; return to shader part epilog
247;
248; GFX10-LABEL: extractelement_sgpr_v4i16_idx3:
249; GFX10:       ; %bb.0:
250; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
251; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
252; GFX10-NEXT:    s_lshr_b32 s0, s1, 16
253; GFX10-NEXT:    ; return to shader part epilog
254  %vector = load <4 x i16>, <4 x i16> addrspace(4)* %ptr
255  %element = extractelement <4 x i16> %vector, i32 3
256  ret i16 %element
257}
258
259define i16 @extractelement_vgpr_v4i16_idx0(<4 x i16> addrspace(1)* %ptr) {
260; GFX9-LABEL: extractelement_vgpr_v4i16_idx0:
261; GFX9:       ; %bb.0:
262; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
263; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
264; GFX9-NEXT:    s_waitcnt vmcnt(0)
265; GFX9-NEXT:    s_setpc_b64 s[30:31]
266;
267; GFX8-LABEL: extractelement_vgpr_v4i16_idx0:
268; GFX8:       ; %bb.0:
269; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
270; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
271; GFX8-NEXT:    s_waitcnt vmcnt(0)
272; GFX8-NEXT:    s_setpc_b64 s[30:31]
273;
274; GFX7-LABEL: extractelement_vgpr_v4i16_idx0:
275; GFX7:       ; %bb.0:
276; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
277; GFX7-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
278; GFX7-NEXT:    s_waitcnt vmcnt(0)
279; GFX7-NEXT:    s_setpc_b64 s[30:31]
280;
281; GFX10-LABEL: extractelement_vgpr_v4i16_idx0:
282; GFX10:       ; %bb.0:
283; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
284; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
285; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
286; GFX10-NEXT:    s_waitcnt vmcnt(0)
287; GFX10-NEXT:    s_setpc_b64 s[30:31]
288  %vector = load <4 x i16>, <4 x i16> addrspace(1)* %ptr
289  %element = extractelement <4 x i16> %vector, i32 0
290  ret i16 %element
291}
292
293define i16 @extractelement_vgpr_v4i16_idx1(<4 x i16> addrspace(1)* %ptr) {
294; GFX9-LABEL: extractelement_vgpr_v4i16_idx1:
295; GFX9:       ; %bb.0:
296; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
297; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
298; GFX9-NEXT:    s_waitcnt vmcnt(0)
299; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
300; GFX9-NEXT:    s_setpc_b64 s[30:31]
301;
302; GFX8-LABEL: extractelement_vgpr_v4i16_idx1:
303; GFX8:       ; %bb.0:
304; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
305; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
306; GFX8-NEXT:    s_waitcnt vmcnt(0)
307; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
308; GFX8-NEXT:    s_setpc_b64 s[30:31]
309;
310; GFX7-LABEL: extractelement_vgpr_v4i16_idx1:
311; GFX7:       ; %bb.0:
312; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
313; GFX7-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
314; GFX7-NEXT:    s_waitcnt vmcnt(0)
315; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
316; GFX7-NEXT:    s_setpc_b64 s[30:31]
317;
318; GFX10-LABEL: extractelement_vgpr_v4i16_idx1:
319; GFX10:       ; %bb.0:
320; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
321; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
322; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
323; GFX10-NEXT:    s_waitcnt vmcnt(0)
324; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
325; GFX10-NEXT:    s_setpc_b64 s[30:31]
326  %vector = load <4 x i16>, <4 x i16> addrspace(1)* %ptr
327  %element = extractelement <4 x i16> %vector, i32 1
328  ret i16 %element
329}
330
331define i16 @extractelement_vgpr_v4i16_idx2(<4 x i16> addrspace(1)* %ptr) {
332; GFX9-LABEL: extractelement_vgpr_v4i16_idx2:
333; GFX9:       ; %bb.0:
334; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
335; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
336; GFX9-NEXT:    s_waitcnt vmcnt(0)
337; GFX9-NEXT:    v_mov_b32_e32 v0, v1
338; GFX9-NEXT:    s_setpc_b64 s[30:31]
339;
340; GFX8-LABEL: extractelement_vgpr_v4i16_idx2:
341; GFX8:       ; %bb.0:
342; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
343; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
344; GFX8-NEXT:    s_waitcnt vmcnt(0)
345; GFX8-NEXT:    v_mov_b32_e32 v0, v1
346; GFX8-NEXT:    s_setpc_b64 s[30:31]
347;
348; GFX7-LABEL: extractelement_vgpr_v4i16_idx2:
349; GFX7:       ; %bb.0:
350; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
351; GFX7-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
352; GFX7-NEXT:    s_waitcnt vmcnt(0)
353; GFX7-NEXT:    v_mov_b32_e32 v0, v1
354; GFX7-NEXT:    s_setpc_b64 s[30:31]
355;
356; GFX10-LABEL: extractelement_vgpr_v4i16_idx2:
357; GFX10:       ; %bb.0:
358; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
359; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
360; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
361; GFX10-NEXT:    s_waitcnt vmcnt(0)
362; GFX10-NEXT:    v_mov_b32_e32 v0, v1
363; GFX10-NEXT:    s_setpc_b64 s[30:31]
364  %vector = load <4 x i16>, <4 x i16> addrspace(1)* %ptr
365  %element = extractelement <4 x i16> %vector, i32 2
366  ret i16 %element
367}
368
369define i16 @extractelement_vgpr_v4i16_idx3(<4 x i16> addrspace(1)* %ptr) {
370; GFX9-LABEL: extractelement_vgpr_v4i16_idx3:
371; GFX9:       ; %bb.0:
372; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
373; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
374; GFX9-NEXT:    s_waitcnt vmcnt(0)
375; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v1
376; GFX9-NEXT:    s_setpc_b64 s[30:31]
377;
378; GFX8-LABEL: extractelement_vgpr_v4i16_idx3:
379; GFX8:       ; %bb.0:
380; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
381; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
382; GFX8-NEXT:    s_waitcnt vmcnt(0)
383; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v1
384; GFX8-NEXT:    s_setpc_b64 s[30:31]
385;
386; GFX7-LABEL: extractelement_vgpr_v4i16_idx3:
387; GFX7:       ; %bb.0:
388; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
389; GFX7-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
390; GFX7-NEXT:    s_waitcnt vmcnt(0)
391; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v1
392; GFX7-NEXT:    s_setpc_b64 s[30:31]
393;
394; GFX10-LABEL: extractelement_vgpr_v4i16_idx3:
395; GFX10:       ; %bb.0:
396; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
397; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
398; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
399; GFX10-NEXT:    s_waitcnt vmcnt(0)
400; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 16, v1
401; GFX10-NEXT:    s_setpc_b64 s[30:31]
402  %vector = load <4 x i16>, <4 x i16> addrspace(1)* %ptr
403  %element = extractelement <4 x i16> %vector, i32 3
404  ret i16 %element
405}
406
407define amdgpu_ps i16 @extractelement_sgpr_v8i16_sgpr_idx(<8 x i16> addrspace(4)* inreg %ptr, i32 inreg %idx) {
408; GCN-LABEL: extractelement_sgpr_v8i16_sgpr_idx:
409; GCN:       ; %bb.0:
410; GCN-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
411; GCN-NEXT:    s_lshr_b32 s5, s4, 1
412; GCN-NEXT:    s_cmp_eq_u32 s5, 1
413; GCN-NEXT:    s_waitcnt lgkmcnt(0)
414; GCN-NEXT:    s_cselect_b32 s0, s1, s0
415; GCN-NEXT:    s_cmp_eq_u32 s5, 2
416; GCN-NEXT:    s_cselect_b32 s0, s2, s0
417; GCN-NEXT:    s_cmp_eq_u32 s5, 3
418; GCN-NEXT:    s_cselect_b32 s0, s3, s0
419; GCN-NEXT:    s_and_b32 s1, s4, 1
420; GCN-NEXT:    s_lshl_b32 s1, s1, 4
421; GCN-NEXT:    s_lshr_b32 s0, s0, s1
422; GCN-NEXT:    ; return to shader part epilog
423;
424; GFX10-LABEL: extractelement_sgpr_v8i16_sgpr_idx:
425; GFX10:       ; %bb.0:
426; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
427; GFX10-NEXT:    s_lshr_b32 s5, s4, 1
428; GFX10-NEXT:    s_cmp_eq_u32 s5, 1
429; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
430; GFX10-NEXT:    s_cselect_b32 s0, s1, s0
431; GFX10-NEXT:    s_cmp_eq_u32 s5, 2
432; GFX10-NEXT:    s_cselect_b32 s0, s2, s0
433; GFX10-NEXT:    s_cmp_eq_u32 s5, 3
434; GFX10-NEXT:    s_cselect_b32 s0, s3, s0
435; GFX10-NEXT:    s_and_b32 s1, s4, 1
436; GFX10-NEXT:    s_lshl_b32 s1, s1, 4
437; GFX10-NEXT:    s_lshr_b32 s0, s0, s1
438; GFX10-NEXT:    ; return to shader part epilog
439  %vector = load <8 x i16>, <8 x i16> addrspace(4)* %ptr
440  %element = extractelement <8 x i16> %vector, i32 %idx
441  ret i16 %element
442}
443
444define amdgpu_ps i16 @extractelement_vgpr_v8i16_sgpr_idx(<8 x i16> addrspace(1)* %ptr, i32 inreg %idx) {
445; GFX9-LABEL: extractelement_vgpr_v8i16_sgpr_idx:
446; GFX9:       ; %bb.0:
447; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
448; GFX9-NEXT:    s_lshr_b32 s0, s2, 1
449; GFX9-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 1
450; GFX9-NEXT:    s_and_b32 s1, s2, 1
451; GFX9-NEXT:    s_waitcnt vmcnt(0)
452; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
453; GFX9-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 2
454; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc
455; GFX9-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 3
456; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
457; GFX9-NEXT:    s_lshl_b32 s0, s1, 4
458; GFX9-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
459; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
460; GFX9-NEXT:    ; return to shader part epilog
461;
462; GFX8-LABEL: extractelement_vgpr_v8i16_sgpr_idx:
463; GFX8:       ; %bb.0:
464; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
465; GFX8-NEXT:    s_lshr_b32 s0, s2, 1
466; GFX8-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 1
467; GFX8-NEXT:    s_and_b32 s1, s2, 1
468; GFX8-NEXT:    s_waitcnt vmcnt(0)
469; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
470; GFX8-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 2
471; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc
472; GFX8-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 3
473; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
474; GFX8-NEXT:    s_lshl_b32 s0, s1, 4
475; GFX8-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
476; GFX8-NEXT:    v_readfirstlane_b32 s0, v0
477; GFX8-NEXT:    ; return to shader part epilog
478;
479; GFX7-LABEL: extractelement_vgpr_v8i16_sgpr_idx:
480; GFX7:       ; %bb.0:
481; GFX7-NEXT:    s_mov_b32 s6, 0
482; GFX7-NEXT:    s_mov_b32 s7, 0xf000
483; GFX7-NEXT:    s_mov_b64 s[4:5], 0
484; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
485; GFX7-NEXT:    s_lshr_b32 s0, s2, 1
486; GFX7-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 1
487; GFX7-NEXT:    s_and_b32 s1, s2, 1
488; GFX7-NEXT:    s_waitcnt vmcnt(0)
489; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
490; GFX7-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 2
491; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc
492; GFX7-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 3
493; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
494; GFX7-NEXT:    s_lshl_b32 s0, s1, 4
495; GFX7-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
496; GFX7-NEXT:    v_readfirstlane_b32 s0, v0
497; GFX7-NEXT:    ; return to shader part epilog
498;
499; GFX10-LABEL: extractelement_vgpr_v8i16_sgpr_idx:
500; GFX10:       ; %bb.0:
501; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
502; GFX10-NEXT:    s_lshr_b32 s0, s2, 1
503; GFX10-NEXT:    v_cmp_eq_u32_e64 vcc_lo, s0, 1
504; GFX10-NEXT:    s_waitcnt vmcnt(0)
505; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc_lo
506; GFX10-NEXT:    v_cmp_eq_u32_e64 vcc_lo, s0, 2
507; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc_lo
508; GFX10-NEXT:    v_cmp_eq_u32_e64 vcc_lo, s0, 3
509; GFX10-NEXT:    s_and_b32 s0, s2, 1
510; GFX10-NEXT:    s_lshl_b32 s0, s0, 4
511; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc_lo
512; GFX10-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
513; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
514; GFX10-NEXT:    ; return to shader part epilog
515  %vector = load <8 x i16>, <8 x i16> addrspace(1)* %ptr
516  %element = extractelement <8 x i16> %vector, i32 %idx
517  ret i16 %element
518}
519
520define i16 @extractelement_vgpr_v8i16_vgpr_idx(<8 x i16> addrspace(1)* %ptr, i32 %idx) {
521; GFX9-LABEL: extractelement_vgpr_v8i16_vgpr_idx:
522; GFX9:       ; %bb.0:
523; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
524; GFX9-NEXT:    global_load_dwordx4 v[3:6], v[0:1], off
525; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 1, v2
526; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v0
527; GFX9-NEXT:    v_and_b32_e32 v1, 1, v2
528; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 4, v1
529; GFX9-NEXT:    s_waitcnt vmcnt(0)
530; GFX9-NEXT:    v_cndmask_b32_e32 v2, v3, v4, vcc
531; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v0
532; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v5, vcc
533; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v0
534; GFX9-NEXT:    v_cndmask_b32_e32 v0, v2, v6, vcc
535; GFX9-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
536; GFX9-NEXT:    s_setpc_b64 s[30:31]
537;
538; GFX8-LABEL: extractelement_vgpr_v8i16_vgpr_idx:
539; GFX8:       ; %bb.0:
540; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
541; GFX8-NEXT:    flat_load_dwordx4 v[3:6], v[0:1]
542; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 1, v2
543; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v0
544; GFX8-NEXT:    v_and_b32_e32 v1, 1, v2
545; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 4, v1
546; GFX8-NEXT:    s_waitcnt vmcnt(0)
547; GFX8-NEXT:    v_cndmask_b32_e32 v2, v3, v4, vcc
548; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v0
549; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v5, vcc
550; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v0
551; GFX8-NEXT:    v_cndmask_b32_e32 v0, v2, v6, vcc
552; GFX8-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
553; GFX8-NEXT:    s_setpc_b64 s[30:31]
554;
555; GFX7-LABEL: extractelement_vgpr_v8i16_vgpr_idx:
556; GFX7:       ; %bb.0:
557; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
558; GFX7-NEXT:    s_mov_b32 s6, 0
559; GFX7-NEXT:    s_mov_b32 s7, 0xf000
560; GFX7-NEXT:    s_mov_b64 s[4:5], 0
561; GFX7-NEXT:    buffer_load_dwordx4 v[3:6], v[0:1], s[4:7], 0 addr64
562; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 1, v2
563; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v0
564; GFX7-NEXT:    v_and_b32_e32 v1, 1, v2
565; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 4, v1
566; GFX7-NEXT:    s_waitcnt vmcnt(0)
567; GFX7-NEXT:    v_cndmask_b32_e32 v2, v3, v4, vcc
568; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v0
569; GFX7-NEXT:    v_cndmask_b32_e32 v2, v2, v5, vcc
570; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v0
571; GFX7-NEXT:    v_cndmask_b32_e32 v0, v2, v6, vcc
572; GFX7-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
573; GFX7-NEXT:    s_setpc_b64 s[30:31]
574;
575; GFX10-LABEL: extractelement_vgpr_v8i16_vgpr_idx:
576; GFX10:       ; %bb.0:
577; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
578; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
579; GFX10-NEXT:    global_load_dwordx4 v[3:6], v[0:1], off
580; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 1, v2
581; GFX10-NEXT:    v_and_b32_e32 v2, 1, v2
582; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 1, v0
583; GFX10-NEXT:    s_waitcnt vmcnt(0)
584; GFX10-NEXT:    v_cndmask_b32_e32 v1, v3, v4, vcc_lo
585; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 2, v0
586; GFX10-NEXT:    v_cndmask_b32_e32 v1, v1, v5, vcc_lo
587; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 3, v0
588; GFX10-NEXT:    v_cndmask_b32_e32 v0, v1, v6, vcc_lo
589; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 4, v2
590; GFX10-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
591; GFX10-NEXT:    s_setpc_b64 s[30:31]
592  %vector = load <8 x i16>, <8 x i16> addrspace(1)* %ptr
593  %element = extractelement <8 x i16> %vector, i32 %idx
594  ret i16 %element
595}
596
597define amdgpu_ps i16 @extractelement_sgpr_v8i16_vgpr_idx(<8 x i16> addrspace(4)* inreg %ptr, i32 %idx) {
598; GCN-LABEL: extractelement_sgpr_v8i16_vgpr_idx:
599; GCN:       ; %bb.0:
600; GCN-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
601; GCN-NEXT:    v_lshrrev_b32_e32 v1, 1, v0
602; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v1
603; GCN-NEXT:    v_and_b32_e32 v0, 1, v0
604; GCN-NEXT:    v_lshlrev_b32_e32 v0, 4, v0
605; GCN-NEXT:    s_waitcnt lgkmcnt(0)
606; GCN-NEXT:    v_mov_b32_e32 v2, s0
607; GCN-NEXT:    v_mov_b32_e32 v3, s1
608; GCN-NEXT:    v_cndmask_b32_e32 v2, v2, v3, vcc
609; GCN-NEXT:    v_mov_b32_e32 v4, s2
610; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v1
611; GCN-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
612; GCN-NEXT:    v_mov_b32_e32 v5, s3
613; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v1
614; GCN-NEXT:    v_cndmask_b32_e32 v1, v2, v5, vcc
615; GCN-NEXT:    v_lshrrev_b32_e32 v0, v0, v1
616; GCN-NEXT:    v_readfirstlane_b32 s0, v0
617; GCN-NEXT:    ; return to shader part epilog
618;
619; GFX10-LABEL: extractelement_sgpr_v8i16_vgpr_idx:
620; GFX10:       ; %bb.0:
621; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
622; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 1, v0
623; GFX10-NEXT:    v_and_b32_e32 v0, 1, v0
624; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 1, v1
625; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 4, v0
626; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
627; GFX10-NEXT:    v_mov_b32_e32 v2, s1
628; GFX10-NEXT:    v_cndmask_b32_e32 v2, s0, v2, vcc_lo
629; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 2, v1
630; GFX10-NEXT:    v_cndmask_b32_e64 v2, v2, s2, vcc_lo
631; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 3, v1
632; GFX10-NEXT:    v_cndmask_b32_e64 v1, v2, s3, vcc_lo
633; GFX10-NEXT:    v_lshrrev_b32_e32 v0, v0, v1
634; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
635; GFX10-NEXT:    ; return to shader part epilog
636  %vector = load <8 x i16>, <8 x i16> addrspace(4)* %ptr
637  %element = extractelement <8 x i16> %vector, i32 %idx
638  ret i16 %element
639}
640
641define amdgpu_ps i16 @extractelement_sgpr_v8i16_idx0(<8 x i16> addrspace(4)* inreg %ptr) {
642; GCN-LABEL: extractelement_sgpr_v8i16_idx0:
643; GCN:       ; %bb.0:
644; GCN-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
645; GCN-NEXT:    s_waitcnt lgkmcnt(0)
646; GCN-NEXT:    ; return to shader part epilog
647;
648; GFX10-LABEL: extractelement_sgpr_v8i16_idx0:
649; GFX10:       ; %bb.0:
650; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
651; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
652; GFX10-NEXT:    ; return to shader part epilog
653  %vector = load <8 x i16>, <8 x i16> addrspace(4)* %ptr
654  %element = extractelement <8 x i16> %vector, i32 0
655  ret i16 %element
656}
657
658define amdgpu_ps i16 @extractelement_sgpr_v8i16_idx1(<8 x i16> addrspace(4)* inreg %ptr) {
659; GCN-LABEL: extractelement_sgpr_v8i16_idx1:
660; GCN:       ; %bb.0:
661; GCN-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
662; GCN-NEXT:    s_waitcnt lgkmcnt(0)
663; GCN-NEXT:    s_lshr_b32 s0, s0, 16
664; GCN-NEXT:    ; return to shader part epilog
665;
666; GFX10-LABEL: extractelement_sgpr_v8i16_idx1:
667; GFX10:       ; %bb.0:
668; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
669; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
670; GFX10-NEXT:    s_lshr_b32 s0, s0, 16
671; GFX10-NEXT:    ; return to shader part epilog
672  %vector = load <8 x i16>, <8 x i16> addrspace(4)* %ptr
673  %element = extractelement <8 x i16> %vector, i32 1
674  ret i16 %element
675}
676
677define amdgpu_ps i16 @extractelement_sgpr_v8i16_idx2(<8 x i16> addrspace(4)* inreg %ptr) {
678; GCN-LABEL: extractelement_sgpr_v8i16_idx2:
679; GCN:       ; %bb.0:
680; GCN-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
681; GCN-NEXT:    s_waitcnt lgkmcnt(0)
682; GCN-NEXT:    s_mov_b32 s0, s1
683; GCN-NEXT:    ; return to shader part epilog
684;
685; GFX10-LABEL: extractelement_sgpr_v8i16_idx2:
686; GFX10:       ; %bb.0:
687; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
688; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
689; GFX10-NEXT:    s_mov_b32 s0, s1
690; GFX10-NEXT:    ; return to shader part epilog
691  %vector = load <8 x i16>, <8 x i16> addrspace(4)* %ptr
692  %element = extractelement <8 x i16> %vector, i32 2
693  ret i16 %element
694}
695
696define amdgpu_ps i16 @extractelement_sgpr_v8i16_idx3(<8 x i16> addrspace(4)* inreg %ptr) {
697; GCN-LABEL: extractelement_sgpr_v8i16_idx3:
698; GCN:       ; %bb.0:
699; GCN-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
700; GCN-NEXT:    s_waitcnt lgkmcnt(0)
701; GCN-NEXT:    s_lshr_b32 s0, s1, 16
702; GCN-NEXT:    ; return to shader part epilog
703;
704; GFX10-LABEL: extractelement_sgpr_v8i16_idx3:
705; GFX10:       ; %bb.0:
706; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
707; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
708; GFX10-NEXT:    s_lshr_b32 s0, s1, 16
709; GFX10-NEXT:    ; return to shader part epilog
710  %vector = load <8 x i16>, <8 x i16> addrspace(4)* %ptr
711  %element = extractelement <8 x i16> %vector, i32 3
712  ret i16 %element
713}
714
715define amdgpu_ps i16 @extractelement_sgpr_v8i16_idx4(<8 x i16> addrspace(4)* inreg %ptr) {
716; GCN-LABEL: extractelement_sgpr_v8i16_idx4:
717; GCN:       ; %bb.0:
718; GCN-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
719; GCN-NEXT:    s_waitcnt lgkmcnt(0)
720; GCN-NEXT:    s_mov_b32 s0, s2
721; GCN-NEXT:    ; return to shader part epilog
722;
723; GFX10-LABEL: extractelement_sgpr_v8i16_idx4:
724; GFX10:       ; %bb.0:
725; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
726; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
727; GFX10-NEXT:    s_mov_b32 s0, s2
728; GFX10-NEXT:    ; return to shader part epilog
729  %vector = load <8 x i16>, <8 x i16> addrspace(4)* %ptr
730  %element = extractelement <8 x i16> %vector, i32 4
731  ret i16 %element
732}
733
734define amdgpu_ps i16 @extractelement_sgpr_v8i16_idx5(<8 x i16> addrspace(4)* inreg %ptr) {
735; GCN-LABEL: extractelement_sgpr_v8i16_idx5:
736; GCN:       ; %bb.0:
737; GCN-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
738; GCN-NEXT:    s_waitcnt lgkmcnt(0)
739; GCN-NEXT:    s_lshr_b32 s0, s2, 16
740; GCN-NEXT:    ; return to shader part epilog
741;
742; GFX10-LABEL: extractelement_sgpr_v8i16_idx5:
743; GFX10:       ; %bb.0:
744; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
745; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
746; GFX10-NEXT:    s_lshr_b32 s0, s2, 16
747; GFX10-NEXT:    ; return to shader part epilog
748  %vector = load <8 x i16>, <8 x i16> addrspace(4)* %ptr
749  %element = extractelement <8 x i16> %vector, i32 5
750  ret i16 %element
751}
752
753define amdgpu_ps i16 @extractelement_sgpr_v8i16_idx6(<8 x i16> addrspace(4)* inreg %ptr) {
754; GCN-LABEL: extractelement_sgpr_v8i16_idx6:
755; GCN:       ; %bb.0:
756; GCN-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
757; GCN-NEXT:    s_waitcnt lgkmcnt(0)
758; GCN-NEXT:    s_mov_b32 s0, s3
759; GCN-NEXT:    ; return to shader part epilog
760;
761; GFX10-LABEL: extractelement_sgpr_v8i16_idx6:
762; GFX10:       ; %bb.0:
763; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
764; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
765; GFX10-NEXT:    s_mov_b32 s0, s3
766; GFX10-NEXT:    ; return to shader part epilog
767  %vector = load <8 x i16>, <8 x i16> addrspace(4)* %ptr
768  %element = extractelement <8 x i16> %vector, i32 6
769  ret i16 %element
770}
771
772define amdgpu_ps i16 @extractelement_sgpr_v8i16_idx7(<8 x i16> addrspace(4)* inreg %ptr) {
773; GCN-LABEL: extractelement_sgpr_v8i16_idx7:
774; GCN:       ; %bb.0:
775; GCN-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
776; GCN-NEXT:    s_waitcnt lgkmcnt(0)
777; GCN-NEXT:    s_lshr_b32 s0, s3, 16
778; GCN-NEXT:    ; return to shader part epilog
779;
780; GFX10-LABEL: extractelement_sgpr_v8i16_idx7:
781; GFX10:       ; %bb.0:
782; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
783; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
784; GFX10-NEXT:    s_lshr_b32 s0, s3, 16
785; GFX10-NEXT:    ; return to shader part epilog
786  %vector = load <8 x i16>, <8 x i16> addrspace(4)* %ptr
787  %element = extractelement <8 x i16> %vector, i32 7
788  ret i16 %element
789}
790
791define i16 @extractelement_vgpr_v8i16_idx0(<8 x i16> addrspace(1)* %ptr) {
792; GFX9-LABEL: extractelement_vgpr_v8i16_idx0:
793; GFX9:       ; %bb.0:
794; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
795; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
796; GFX9-NEXT:    s_waitcnt vmcnt(0)
797; GFX9-NEXT:    s_setpc_b64 s[30:31]
798;
799; GFX8-LABEL: extractelement_vgpr_v8i16_idx0:
800; GFX8:       ; %bb.0:
801; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
802; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
803; GFX8-NEXT:    s_waitcnt vmcnt(0)
804; GFX8-NEXT:    s_setpc_b64 s[30:31]
805;
806; GFX7-LABEL: extractelement_vgpr_v8i16_idx0:
807; GFX7:       ; %bb.0:
808; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
809; GFX7-NEXT:    s_mov_b32 s6, 0
810; GFX7-NEXT:    s_mov_b32 s7, 0xf000
811; GFX7-NEXT:    s_mov_b64 s[4:5], 0
812; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
813; GFX7-NEXT:    s_waitcnt vmcnt(0)
814; GFX7-NEXT:    s_setpc_b64 s[30:31]
815;
816; GFX10-LABEL: extractelement_vgpr_v8i16_idx0:
817; GFX10:       ; %bb.0:
818; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
819; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
820; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
821; GFX10-NEXT:    s_waitcnt vmcnt(0)
822; GFX10-NEXT:    s_setpc_b64 s[30:31]
823  %vector = load <8 x i16>, <8 x i16> addrspace(1)* %ptr
824  %element = extractelement <8 x i16> %vector, i32 0
825  ret i16 %element
826}
827
828define i16 @extractelement_vgpr_v8i16_idx1(<8 x i16> addrspace(1)* %ptr) {
829; GFX9-LABEL: extractelement_vgpr_v8i16_idx1:
830; GFX9:       ; %bb.0:
831; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
832; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
833; GFX9-NEXT:    s_waitcnt vmcnt(0)
834; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
835; GFX9-NEXT:    s_setpc_b64 s[30:31]
836;
837; GFX8-LABEL: extractelement_vgpr_v8i16_idx1:
838; GFX8:       ; %bb.0:
839; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
840; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
841; GFX8-NEXT:    s_waitcnt vmcnt(0)
842; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
843; GFX8-NEXT:    s_setpc_b64 s[30:31]
844;
845; GFX7-LABEL: extractelement_vgpr_v8i16_idx1:
846; GFX7:       ; %bb.0:
847; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
848; GFX7-NEXT:    s_mov_b32 s6, 0
849; GFX7-NEXT:    s_mov_b32 s7, 0xf000
850; GFX7-NEXT:    s_mov_b64 s[4:5], 0
851; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
852; GFX7-NEXT:    s_waitcnt vmcnt(0)
853; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
854; GFX7-NEXT:    s_setpc_b64 s[30:31]
855;
856; GFX10-LABEL: extractelement_vgpr_v8i16_idx1:
857; GFX10:       ; %bb.0:
858; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
859; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
860; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
861; GFX10-NEXT:    s_waitcnt vmcnt(0)
862; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
863; GFX10-NEXT:    s_setpc_b64 s[30:31]
864  %vector = load <8 x i16>, <8 x i16> addrspace(1)* %ptr
865  %element = extractelement <8 x i16> %vector, i32 1
866  ret i16 %element
867}
868
869define i16 @extractelement_vgpr_v8i16_idx2(<8 x i16> addrspace(1)* %ptr) {
870; GFX9-LABEL: extractelement_vgpr_v8i16_idx2:
871; GFX9:       ; %bb.0:
872; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
873; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
874; GFX9-NEXT:    s_waitcnt vmcnt(0)
875; GFX9-NEXT:    v_mov_b32_e32 v0, v1
876; GFX9-NEXT:    s_setpc_b64 s[30:31]
877;
878; GFX8-LABEL: extractelement_vgpr_v8i16_idx2:
879; GFX8:       ; %bb.0:
880; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
881; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
882; GFX8-NEXT:    s_waitcnt vmcnt(0)
883; GFX8-NEXT:    v_mov_b32_e32 v0, v1
884; GFX8-NEXT:    s_setpc_b64 s[30:31]
885;
886; GFX7-LABEL: extractelement_vgpr_v8i16_idx2:
887; GFX7:       ; %bb.0:
888; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
889; GFX7-NEXT:    s_mov_b32 s6, 0
890; GFX7-NEXT:    s_mov_b32 s7, 0xf000
891; GFX7-NEXT:    s_mov_b64 s[4:5], 0
892; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
893; GFX7-NEXT:    s_waitcnt vmcnt(0)
894; GFX7-NEXT:    v_mov_b32_e32 v0, v1
895; GFX7-NEXT:    s_setpc_b64 s[30:31]
896;
897; GFX10-LABEL: extractelement_vgpr_v8i16_idx2:
898; GFX10:       ; %bb.0:
899; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
900; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
901; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
902; GFX10-NEXT:    s_waitcnt vmcnt(0)
903; GFX10-NEXT:    v_mov_b32_e32 v0, v1
904; GFX10-NEXT:    s_setpc_b64 s[30:31]
905  %vector = load <8 x i16>, <8 x i16> addrspace(1)* %ptr
906  %element = extractelement <8 x i16> %vector, i32 2
907  ret i16 %element
908}
909
910define i16 @extractelement_vgpr_v8i16_idx3(<8 x i16> addrspace(1)* %ptr) {
911; GFX9-LABEL: extractelement_vgpr_v8i16_idx3:
912; GFX9:       ; %bb.0:
913; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
914; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
915; GFX9-NEXT:    s_waitcnt vmcnt(0)
916; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v1
917; GFX9-NEXT:    s_setpc_b64 s[30:31]
918;
919; GFX8-LABEL: extractelement_vgpr_v8i16_idx3:
920; GFX8:       ; %bb.0:
921; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
922; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
923; GFX8-NEXT:    s_waitcnt vmcnt(0)
924; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v1
925; GFX8-NEXT:    s_setpc_b64 s[30:31]
926;
927; GFX7-LABEL: extractelement_vgpr_v8i16_idx3:
928; GFX7:       ; %bb.0:
929; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
930; GFX7-NEXT:    s_mov_b32 s6, 0
931; GFX7-NEXT:    s_mov_b32 s7, 0xf000
932; GFX7-NEXT:    s_mov_b64 s[4:5], 0
933; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
934; GFX7-NEXT:    s_waitcnt vmcnt(0)
935; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v1
936; GFX7-NEXT:    s_setpc_b64 s[30:31]
937;
938; GFX10-LABEL: extractelement_vgpr_v8i16_idx3:
939; GFX10:       ; %bb.0:
940; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
941; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
942; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
943; GFX10-NEXT:    s_waitcnt vmcnt(0)
944; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 16, v1
945; GFX10-NEXT:    s_setpc_b64 s[30:31]
946  %vector = load <8 x i16>, <8 x i16> addrspace(1)* %ptr
947  %element = extractelement <8 x i16> %vector, i32 3
948  ret i16 %element
949}
950
951define i16 @extractelement_vgpr_v8i16_idx4(<8 x i16> addrspace(1)* %ptr) {
952; GFX9-LABEL: extractelement_vgpr_v8i16_idx4:
953; GFX9:       ; %bb.0:
954; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
955; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
956; GFX9-NEXT:    s_waitcnt vmcnt(0)
957; GFX9-NEXT:    v_mov_b32_e32 v0, v2
958; GFX9-NEXT:    s_setpc_b64 s[30:31]
959;
960; GFX8-LABEL: extractelement_vgpr_v8i16_idx4:
961; GFX8:       ; %bb.0:
962; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
963; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
964; GFX8-NEXT:    s_waitcnt vmcnt(0)
965; GFX8-NEXT:    v_mov_b32_e32 v0, v2
966; GFX8-NEXT:    s_setpc_b64 s[30:31]
967;
968; GFX7-LABEL: extractelement_vgpr_v8i16_idx4:
969; GFX7:       ; %bb.0:
970; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
971; GFX7-NEXT:    s_mov_b32 s6, 0
972; GFX7-NEXT:    s_mov_b32 s7, 0xf000
973; GFX7-NEXT:    s_mov_b64 s[4:5], 0
974; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
975; GFX7-NEXT:    s_waitcnt vmcnt(0)
976; GFX7-NEXT:    v_mov_b32_e32 v0, v2
977; GFX7-NEXT:    s_setpc_b64 s[30:31]
978;
979; GFX10-LABEL: extractelement_vgpr_v8i16_idx4:
980; GFX10:       ; %bb.0:
981; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
982; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
983; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
984; GFX10-NEXT:    s_waitcnt vmcnt(0)
985; GFX10-NEXT:    v_mov_b32_e32 v0, v2
986; GFX10-NEXT:    s_setpc_b64 s[30:31]
987  %vector = load <8 x i16>, <8 x i16> addrspace(1)* %ptr
988  %element = extractelement <8 x i16> %vector, i32 4
989  ret i16 %element
990}
991
992define i16 @extractelement_vgpr_v8i16_idx5(<8 x i16> addrspace(1)* %ptr) {
993; GFX9-LABEL: extractelement_vgpr_v8i16_idx5:
994; GFX9:       ; %bb.0:
995; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
996; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
997; GFX9-NEXT:    s_waitcnt vmcnt(0)
998; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v2
999; GFX9-NEXT:    s_setpc_b64 s[30:31]
1000;
1001; GFX8-LABEL: extractelement_vgpr_v8i16_idx5:
1002; GFX8:       ; %bb.0:
1003; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1004; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
1005; GFX8-NEXT:    s_waitcnt vmcnt(0)
1006; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v2
1007; GFX8-NEXT:    s_setpc_b64 s[30:31]
1008;
1009; GFX7-LABEL: extractelement_vgpr_v8i16_idx5:
1010; GFX7:       ; %bb.0:
1011; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1012; GFX7-NEXT:    s_mov_b32 s6, 0
1013; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1014; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1015; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
1016; GFX7-NEXT:    s_waitcnt vmcnt(0)
1017; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v2
1018; GFX7-NEXT:    s_setpc_b64 s[30:31]
1019;
1020; GFX10-LABEL: extractelement_vgpr_v8i16_idx5:
1021; GFX10:       ; %bb.0:
1022; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1023; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1024; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
1025; GFX10-NEXT:    s_waitcnt vmcnt(0)
1026; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 16, v2
1027; GFX10-NEXT:    s_setpc_b64 s[30:31]
1028  %vector = load <8 x i16>, <8 x i16> addrspace(1)* %ptr
1029  %element = extractelement <8 x i16> %vector, i32 5
1030  ret i16 %element
1031}
1032
1033define i16 @extractelement_vgpr_v8i16_idx6(<8 x i16> addrspace(1)* %ptr) {
1034; GFX9-LABEL: extractelement_vgpr_v8i16_idx6:
1035; GFX9:       ; %bb.0:
1036; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1037; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
1038; GFX9-NEXT:    s_waitcnt vmcnt(0)
1039; GFX9-NEXT:    v_mov_b32_e32 v0, v3
1040; GFX9-NEXT:    s_setpc_b64 s[30:31]
1041;
1042; GFX8-LABEL: extractelement_vgpr_v8i16_idx6:
1043; GFX8:       ; %bb.0:
1044; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1045; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
1046; GFX8-NEXT:    s_waitcnt vmcnt(0)
1047; GFX8-NEXT:    v_mov_b32_e32 v0, v3
1048; GFX8-NEXT:    s_setpc_b64 s[30:31]
1049;
1050; GFX7-LABEL: extractelement_vgpr_v8i16_idx6:
1051; GFX7:       ; %bb.0:
1052; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1053; GFX7-NEXT:    s_mov_b32 s6, 0
1054; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1055; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1056; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
1057; GFX7-NEXT:    s_waitcnt vmcnt(0)
1058; GFX7-NEXT:    v_mov_b32_e32 v0, v3
1059; GFX7-NEXT:    s_setpc_b64 s[30:31]
1060;
1061; GFX10-LABEL: extractelement_vgpr_v8i16_idx6:
1062; GFX10:       ; %bb.0:
1063; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1064; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1065; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
1066; GFX10-NEXT:    s_waitcnt vmcnt(0)
1067; GFX10-NEXT:    v_mov_b32_e32 v0, v3
1068; GFX10-NEXT:    s_setpc_b64 s[30:31]
1069  %vector = load <8 x i16>, <8 x i16> addrspace(1)* %ptr
1070  %element = extractelement <8 x i16> %vector, i32 6
1071  ret i16 %element
1072}
1073
1074define i16 @extractelement_vgpr_v8i16_idx7(<8 x i16> addrspace(1)* %ptr) {
1075; GFX9-LABEL: extractelement_vgpr_v8i16_idx7:
1076; GFX9:       ; %bb.0:
1077; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1078; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
1079; GFX9-NEXT:    s_waitcnt vmcnt(0)
1080; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v3
1081; GFX9-NEXT:    s_setpc_b64 s[30:31]
1082;
1083; GFX8-LABEL: extractelement_vgpr_v8i16_idx7:
1084; GFX8:       ; %bb.0:
1085; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1086; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
1087; GFX8-NEXT:    s_waitcnt vmcnt(0)
1088; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v3
1089; GFX8-NEXT:    s_setpc_b64 s[30:31]
1090;
1091; GFX7-LABEL: extractelement_vgpr_v8i16_idx7:
1092; GFX7:       ; %bb.0:
1093; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1094; GFX7-NEXT:    s_mov_b32 s6, 0
1095; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1096; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1097; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
1098; GFX7-NEXT:    s_waitcnt vmcnt(0)
1099; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v3
1100; GFX7-NEXT:    s_setpc_b64 s[30:31]
1101;
1102; GFX10-LABEL: extractelement_vgpr_v8i16_idx7:
1103; GFX10:       ; %bb.0:
1104; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1105; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1106; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
1107; GFX10-NEXT:    s_waitcnt vmcnt(0)
1108; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 16, v3
1109; GFX10-NEXT:    s_setpc_b64 s[30:31]
1110  %vector = load <8 x i16>, <8 x i16> addrspace(1)* %ptr
1111  %element = extractelement <8 x i16> %vector, i32 7
1112  ret i16 %element
1113}
1114