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; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX11 %s
7
8define amdgpu_ps i16 @extractelement_sgpr_v4i16_sgpr_idx(<4 x i16> addrspace(4)* inreg %ptr, i32 inreg %idx) {
9; GCN-LABEL: extractelement_sgpr_v4i16_sgpr_idx:
10; GCN:       ; %bb.0:
11; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
12; GCN-NEXT:    s_lshr_b32 s2, s4, 1
13; GCN-NEXT:    s_cmp_eq_u32 s2, 1
14; GCN-NEXT:    s_waitcnt lgkmcnt(0)
15; GCN-NEXT:    s_cselect_b32 s0, s1, s0
16; GCN-NEXT:    s_and_b32 s1, s4, 1
17; GCN-NEXT:    s_lshl_b32 s1, s1, 4
18; GCN-NEXT:    s_lshr_b32 s0, s0, s1
19; GCN-NEXT:    ; return to shader part epilog
20;
21; GFX10-LABEL: extractelement_sgpr_v4i16_sgpr_idx:
22; GFX10:       ; %bb.0:
23; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
24; GFX10-NEXT:    s_lshr_b32 s2, s4, 1
25; GFX10-NEXT:    s_cmp_eq_u32 s2, 1
26; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
27; GFX10-NEXT:    s_cselect_b32 s0, s1, s0
28; GFX10-NEXT:    s_and_b32 s1, s4, 1
29; GFX10-NEXT:    s_lshl_b32 s1, s1, 4
30; GFX10-NEXT:    s_lshr_b32 s0, s0, s1
31; GFX10-NEXT:    ; return to shader part epilog
32;
33; GFX11-LABEL: extractelement_sgpr_v4i16_sgpr_idx:
34; GFX11:       ; %bb.0:
35; GFX11-NEXT:    s_load_b64 s[0:1], s[2:3], 0x0
36; GFX11-NEXT:    s_lshr_b32 s2, s4, 1
37; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_3) | instid1(SALU_CYCLE_1)
38; GFX11-NEXT:    s_cmp_eq_u32 s2, 1
39; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
40; GFX11-NEXT:    s_cselect_b32 s0, s1, s0
41; GFX11-NEXT:    s_and_b32 s1, s4, 1
42; GFX11-NEXT:    s_lshl_b32 s1, s1, 4
43; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
44; GFX11-NEXT:    s_lshr_b32 s0, s0, s1
45; GFX11-NEXT:    ; return to shader part epilog
46  %vector = load <4 x i16>, <4 x i16> addrspace(4)* %ptr
47  %element = extractelement <4 x i16> %vector, i32 %idx
48  ret i16 %element
49}
50
51define amdgpu_ps i16 @extractelement_vgpr_v4i16_sgpr_idx(<4 x i16> addrspace(1)* %ptr, i32 inreg %idx) {
52; GFX9-LABEL: extractelement_vgpr_v4i16_sgpr_idx:
53; GFX9:       ; %bb.0:
54; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
55; GFX9-NEXT:    s_lshr_b32 s0, s2, 1
56; GFX9-NEXT:    s_and_b32 s1, s2, 1
57; GFX9-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 1
58; GFX9-NEXT:    s_lshl_b32 s0, s1, 4
59; GFX9-NEXT:    s_waitcnt vmcnt(0)
60; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
61; GFX9-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
62; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
63; GFX9-NEXT:    ; return to shader part epilog
64;
65; GFX8-LABEL: extractelement_vgpr_v4i16_sgpr_idx:
66; GFX8:       ; %bb.0:
67; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
68; GFX8-NEXT:    s_lshr_b32 s0, s2, 1
69; GFX8-NEXT:    s_and_b32 s1, s2, 1
70; GFX8-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 1
71; GFX8-NEXT:    s_lshl_b32 s0, s1, 4
72; GFX8-NEXT:    s_waitcnt vmcnt(0)
73; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
74; GFX8-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
75; GFX8-NEXT:    v_readfirstlane_b32 s0, v0
76; GFX8-NEXT:    ; return to shader part epilog
77;
78; GFX7-LABEL: extractelement_vgpr_v4i16_sgpr_idx:
79; GFX7:       ; %bb.0:
80; GFX7-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
81; GFX7-NEXT:    s_lshr_b32 s0, s2, 1
82; GFX7-NEXT:    s_and_b32 s1, s2, 1
83; GFX7-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 1
84; GFX7-NEXT:    s_lshl_b32 s0, s1, 4
85; GFX7-NEXT:    s_waitcnt vmcnt(0)
86; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
87; GFX7-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
88; GFX7-NEXT:    v_readfirstlane_b32 s0, v0
89; GFX7-NEXT:    ; return to shader part epilog
90;
91; GFX10-LABEL: extractelement_vgpr_v4i16_sgpr_idx:
92; GFX10:       ; %bb.0:
93; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
94; GFX10-NEXT:    s_lshr_b32 s0, s2, 1
95; GFX10-NEXT:    v_cmp_eq_u32_e64 vcc_lo, s0, 1
96; GFX10-NEXT:    s_and_b32 s0, s2, 1
97; GFX10-NEXT:    s_lshl_b32 s0, s0, 4
98; GFX10-NEXT:    s_waitcnt vmcnt(0)
99; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc_lo
100; GFX10-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
101; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
102; GFX10-NEXT:    ; return to shader part epilog
103;
104; GFX11-LABEL: extractelement_vgpr_v4i16_sgpr_idx:
105; GFX11:       ; %bb.0:
106; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off
107; GFX11-NEXT:    s_lshr_b32 s0, s2, 1
108; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_1) | instid1(SALU_CYCLE_1)
109; GFX11-NEXT:    v_cmp_eq_u32_e64 vcc_lo, s0, 1
110; GFX11-NEXT:    s_and_b32 s0, s2, 1
111; GFX11-NEXT:    s_lshl_b32 s0, s0, 4
112; GFX11-NEXT:    s_waitcnt vmcnt(0)
113; GFX11-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc_lo
114; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
115; GFX11-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
116; GFX11-NEXT:    v_readfirstlane_b32 s0, v0
117; GFX11-NEXT:    ; return to shader part epilog
118  %vector = load <4 x i16>, <4 x i16> addrspace(1)* %ptr
119  %element = extractelement <4 x i16> %vector, i32 %idx
120  ret i16 %element
121}
122
123define i16 @extractelement_vgpr_v4i16_vgpr_idx(<4 x i16> addrspace(1)* %ptr, i32 %idx) {
124; GFX9-LABEL: extractelement_vgpr_v4i16_vgpr_idx:
125; GFX9:       ; %bb.0:
126; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
127; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
128; GFX9-NEXT:    v_lshrrev_b32_e32 v3, 1, v2
129; GFX9-NEXT:    v_and_b32_e32 v2, 1, v2
130; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v3
131; GFX9-NEXT:    s_waitcnt vmcnt(0)
132; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
133; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 4, v2
134; GFX9-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
135; GFX9-NEXT:    s_setpc_b64 s[30:31]
136;
137; GFX8-LABEL: extractelement_vgpr_v4i16_vgpr_idx:
138; GFX8:       ; %bb.0:
139; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
140; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
141; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 1, v2
142; GFX8-NEXT:    v_and_b32_e32 v2, 1, v2
143; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v3
144; GFX8-NEXT:    s_waitcnt vmcnt(0)
145; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
146; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 4, v2
147; GFX8-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
148; GFX8-NEXT:    s_setpc_b64 s[30:31]
149;
150; GFX7-LABEL: extractelement_vgpr_v4i16_vgpr_idx:
151; GFX7:       ; %bb.0:
152; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
153; GFX7-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
154; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 1, v2
155; GFX7-NEXT:    v_and_b32_e32 v2, 1, v2
156; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v3
157; GFX7-NEXT:    s_waitcnt vmcnt(0)
158; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
159; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 4, v2
160; GFX7-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
161; GFX7-NEXT:    s_setpc_b64 s[30:31]
162;
163; GFX10-LABEL: extractelement_vgpr_v4i16_vgpr_idx:
164; GFX10:       ; %bb.0:
165; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
166; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
167; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
168; GFX10-NEXT:    v_lshrrev_b32_e32 v3, 1, v2
169; GFX10-NEXT:    v_and_b32_e32 v2, 1, v2
170; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 1, v3
171; GFX10-NEXT:    s_waitcnt vmcnt(0)
172; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc_lo
173; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 4, v2
174; GFX10-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
175; GFX10-NEXT:    s_setpc_b64 s[30:31]
176;
177; GFX11-LABEL: extractelement_vgpr_v4i16_vgpr_idx:
178; GFX11:       ; %bb.0:
179; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
180; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
181; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off
182; GFX11-NEXT:    v_lshrrev_b32_e32 v3, 1, v2
183; GFX11-NEXT:    v_and_b32_e32 v2, 1, v2
184; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
185; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 1, v3
186; GFX11-NEXT:    s_waitcnt vmcnt(0)
187; GFX11-NEXT:    v_dual_cndmask_b32 v0, v0, v1 :: v_dual_lshlrev_b32 v1, 4, v2
188; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
189; GFX11-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
190; GFX11-NEXT:    s_setpc_b64 s[30:31]
191  %vector = load <4 x i16>, <4 x i16> addrspace(1)* %ptr
192  %element = extractelement <4 x i16> %vector, i32 %idx
193  ret i16 %element
194}
195
196define amdgpu_ps i16 @extractelement_sgpr_v4i16_vgpr_idx(<4 x i16> addrspace(4)* inreg %ptr, i32 %idx) {
197; GCN-LABEL: extractelement_sgpr_v4i16_vgpr_idx:
198; GCN:       ; %bb.0:
199; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
200; GCN-NEXT:    v_lshrrev_b32_e32 v1, 1, v0
201; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v1
202; GCN-NEXT:    v_and_b32_e32 v0, 1, v0
203; GCN-NEXT:    v_lshlrev_b32_e32 v0, 4, v0
204; GCN-NEXT:    s_waitcnt lgkmcnt(0)
205; GCN-NEXT:    v_mov_b32_e32 v2, s0
206; GCN-NEXT:    v_mov_b32_e32 v3, s1
207; GCN-NEXT:    v_cndmask_b32_e32 v1, v2, v3, vcc
208; GCN-NEXT:    v_lshrrev_b32_e32 v0, v0, v1
209; GCN-NEXT:    v_readfirstlane_b32 s0, v0
210; GCN-NEXT:    ; return to shader part epilog
211;
212; GFX10-LABEL: extractelement_sgpr_v4i16_vgpr_idx:
213; GFX10:       ; %bb.0:
214; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
215; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 1, v0
216; GFX10-NEXT:    v_and_b32_e32 v0, 1, v0
217; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 1, v1
218; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 4, v0
219; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
220; GFX10-NEXT:    v_mov_b32_e32 v2, s1
221; GFX10-NEXT:    v_cndmask_b32_e32 v1, s0, v2, vcc_lo
222; GFX10-NEXT:    v_lshrrev_b32_e32 v0, v0, v1
223; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
224; GFX10-NEXT:    ; return to shader part epilog
225;
226; GFX11-LABEL: extractelement_sgpr_v4i16_vgpr_idx:
227; GFX11:       ; %bb.0:
228; GFX11-NEXT:    s_load_b64 s[0:1], s[2:3], 0x0
229; GFX11-NEXT:    v_lshrrev_b32_e32 v1, 1, v0
230; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_1)
231; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 1, v1
232; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
233; GFX11-NEXT:    v_mov_b32_e32 v2, s1
234; GFX11-NEXT:    v_dual_cndmask_b32 v1, s0, v2 :: v_dual_and_b32 v0, 1, v0
235; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
236; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 4, v0
237; GFX11-NEXT:    v_lshrrev_b32_e32 v0, v0, v1
238; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
239; GFX11-NEXT:    v_readfirstlane_b32 s0, v0
240; GFX11-NEXT:    ; return to shader part epilog
241  %vector = load <4 x i16>, <4 x i16> addrspace(4)* %ptr
242  %element = extractelement <4 x i16> %vector, i32 %idx
243  ret i16 %element
244}
245
246define amdgpu_ps i16 @extractelement_sgpr_v4i16_idx0(<4 x i16> addrspace(4)* inreg %ptr) {
247; GCN-LABEL: extractelement_sgpr_v4i16_idx0:
248; GCN:       ; %bb.0:
249; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
250; GCN-NEXT:    s_waitcnt lgkmcnt(0)
251; GCN-NEXT:    ; return to shader part epilog
252;
253; GFX10-LABEL: extractelement_sgpr_v4i16_idx0:
254; GFX10:       ; %bb.0:
255; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
256; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
257; GFX10-NEXT:    ; return to shader part epilog
258;
259; GFX11-LABEL: extractelement_sgpr_v4i16_idx0:
260; GFX11:       ; %bb.0:
261; GFX11-NEXT:    s_load_b64 s[0:1], s[2:3], 0x0
262; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
263; GFX11-NEXT:    ; return to shader part epilog
264  %vector = load <4 x i16>, <4 x i16> addrspace(4)* %ptr
265  %element = extractelement <4 x i16> %vector, i32 0
266  ret i16 %element
267}
268
269define amdgpu_ps i16 @extractelement_sgpr_v4i16_idx1(<4 x i16> addrspace(4)* inreg %ptr) {
270; GCN-LABEL: extractelement_sgpr_v4i16_idx1:
271; GCN:       ; %bb.0:
272; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
273; GCN-NEXT:    s_waitcnt lgkmcnt(0)
274; GCN-NEXT:    s_lshr_b32 s0, s0, 16
275; GCN-NEXT:    ; return to shader part epilog
276;
277; GFX10-LABEL: extractelement_sgpr_v4i16_idx1:
278; GFX10:       ; %bb.0:
279; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
280; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
281; GFX10-NEXT:    s_lshr_b32 s0, s0, 16
282; GFX10-NEXT:    ; return to shader part epilog
283;
284; GFX11-LABEL: extractelement_sgpr_v4i16_idx1:
285; GFX11:       ; %bb.0:
286; GFX11-NEXT:    s_load_b64 s[0:1], s[2:3], 0x0
287; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
288; GFX11-NEXT:    s_lshr_b32 s0, s0, 16
289; GFX11-NEXT:    ; return to shader part epilog
290  %vector = load <4 x i16>, <4 x i16> addrspace(4)* %ptr
291  %element = extractelement <4 x i16> %vector, i32 1
292  ret i16 %element
293}
294
295define amdgpu_ps i16 @extractelement_sgpr_v4i16_idx2(<4 x i16> addrspace(4)* inreg %ptr) {
296; GCN-LABEL: extractelement_sgpr_v4i16_idx2:
297; GCN:       ; %bb.0:
298; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
299; GCN-NEXT:    s_waitcnt lgkmcnt(0)
300; GCN-NEXT:    s_mov_b32 s0, s1
301; GCN-NEXT:    ; return to shader part epilog
302;
303; GFX10-LABEL: extractelement_sgpr_v4i16_idx2:
304; GFX10:       ; %bb.0:
305; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
306; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
307; GFX10-NEXT:    s_mov_b32 s0, s1
308; GFX10-NEXT:    ; return to shader part epilog
309;
310; GFX11-LABEL: extractelement_sgpr_v4i16_idx2:
311; GFX11:       ; %bb.0:
312; GFX11-NEXT:    s_load_b64 s[0:1], s[2:3], 0x0
313; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
314; GFX11-NEXT:    s_mov_b32 s0, s1
315; GFX11-NEXT:    ; return to shader part epilog
316  %vector = load <4 x i16>, <4 x i16> addrspace(4)* %ptr
317  %element = extractelement <4 x i16> %vector, i32 2
318  ret i16 %element
319}
320
321define amdgpu_ps i16 @extractelement_sgpr_v4i16_idx3(<4 x i16> addrspace(4)* inreg %ptr) {
322; GCN-LABEL: extractelement_sgpr_v4i16_idx3:
323; GCN:       ; %bb.0:
324; GCN-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
325; GCN-NEXT:    s_waitcnt lgkmcnt(0)
326; GCN-NEXT:    s_lshr_b32 s0, s1, 16
327; GCN-NEXT:    ; return to shader part epilog
328;
329; GFX10-LABEL: extractelement_sgpr_v4i16_idx3:
330; GFX10:       ; %bb.0:
331; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x0
332; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
333; GFX10-NEXT:    s_lshr_b32 s0, s1, 16
334; GFX10-NEXT:    ; return to shader part epilog
335;
336; GFX11-LABEL: extractelement_sgpr_v4i16_idx3:
337; GFX11:       ; %bb.0:
338; GFX11-NEXT:    s_load_b64 s[0:1], s[2:3], 0x0
339; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
340; GFX11-NEXT:    s_lshr_b32 s0, s1, 16
341; GFX11-NEXT:    ; return to shader part epilog
342  %vector = load <4 x i16>, <4 x i16> addrspace(4)* %ptr
343  %element = extractelement <4 x i16> %vector, i32 3
344  ret i16 %element
345}
346
347define i16 @extractelement_vgpr_v4i16_idx0(<4 x i16> addrspace(1)* %ptr) {
348; GFX9-LABEL: extractelement_vgpr_v4i16_idx0:
349; GFX9:       ; %bb.0:
350; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
351; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
352; GFX9-NEXT:    s_waitcnt vmcnt(0)
353; GFX9-NEXT:    s_setpc_b64 s[30:31]
354;
355; GFX8-LABEL: extractelement_vgpr_v4i16_idx0:
356; GFX8:       ; %bb.0:
357; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
358; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
359; GFX8-NEXT:    s_waitcnt vmcnt(0)
360; GFX8-NEXT:    s_setpc_b64 s[30:31]
361;
362; GFX7-LABEL: extractelement_vgpr_v4i16_idx0:
363; GFX7:       ; %bb.0:
364; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
365; GFX7-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
366; GFX7-NEXT:    s_waitcnt vmcnt(0)
367; GFX7-NEXT:    s_setpc_b64 s[30:31]
368;
369; GFX10-LABEL: extractelement_vgpr_v4i16_idx0:
370; GFX10:       ; %bb.0:
371; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
372; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
373; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
374; GFX10-NEXT:    s_waitcnt vmcnt(0)
375; GFX10-NEXT:    s_setpc_b64 s[30:31]
376;
377; GFX11-LABEL: extractelement_vgpr_v4i16_idx0:
378; GFX11:       ; %bb.0:
379; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
380; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
381; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off
382; GFX11-NEXT:    s_waitcnt vmcnt(0)
383; GFX11-NEXT:    s_setpc_b64 s[30:31]
384  %vector = load <4 x i16>, <4 x i16> addrspace(1)* %ptr
385  %element = extractelement <4 x i16> %vector, i32 0
386  ret i16 %element
387}
388
389define i16 @extractelement_vgpr_v4i16_idx1(<4 x i16> addrspace(1)* %ptr) {
390; GFX9-LABEL: extractelement_vgpr_v4i16_idx1:
391; GFX9:       ; %bb.0:
392; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
393; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
394; GFX9-NEXT:    s_waitcnt vmcnt(0)
395; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
396; GFX9-NEXT:    s_setpc_b64 s[30:31]
397;
398; GFX8-LABEL: extractelement_vgpr_v4i16_idx1:
399; GFX8:       ; %bb.0:
400; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
401; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
402; GFX8-NEXT:    s_waitcnt vmcnt(0)
403; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
404; GFX8-NEXT:    s_setpc_b64 s[30:31]
405;
406; GFX7-LABEL: extractelement_vgpr_v4i16_idx1:
407; GFX7:       ; %bb.0:
408; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
409; GFX7-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
410; GFX7-NEXT:    s_waitcnt vmcnt(0)
411; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
412; GFX7-NEXT:    s_setpc_b64 s[30:31]
413;
414; GFX10-LABEL: extractelement_vgpr_v4i16_idx1:
415; GFX10:       ; %bb.0:
416; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
417; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
418; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
419; GFX10-NEXT:    s_waitcnt vmcnt(0)
420; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
421; GFX10-NEXT:    s_setpc_b64 s[30:31]
422;
423; GFX11-LABEL: extractelement_vgpr_v4i16_idx1:
424; GFX11:       ; %bb.0:
425; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
426; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
427; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off
428; GFX11-NEXT:    s_waitcnt vmcnt(0)
429; GFX11-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
430; GFX11-NEXT:    s_setpc_b64 s[30:31]
431  %vector = load <4 x i16>, <4 x i16> addrspace(1)* %ptr
432  %element = extractelement <4 x i16> %vector, i32 1
433  ret i16 %element
434}
435
436define i16 @extractelement_vgpr_v4i16_idx2(<4 x i16> addrspace(1)* %ptr) {
437; GFX9-LABEL: extractelement_vgpr_v4i16_idx2:
438; GFX9:       ; %bb.0:
439; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
440; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
441; GFX9-NEXT:    s_waitcnt vmcnt(0)
442; GFX9-NEXT:    v_mov_b32_e32 v0, v1
443; GFX9-NEXT:    s_setpc_b64 s[30:31]
444;
445; GFX8-LABEL: extractelement_vgpr_v4i16_idx2:
446; GFX8:       ; %bb.0:
447; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
448; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
449; GFX8-NEXT:    s_waitcnt vmcnt(0)
450; GFX8-NEXT:    v_mov_b32_e32 v0, v1
451; GFX8-NEXT:    s_setpc_b64 s[30:31]
452;
453; GFX7-LABEL: extractelement_vgpr_v4i16_idx2:
454; GFX7:       ; %bb.0:
455; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
456; GFX7-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
457; GFX7-NEXT:    s_waitcnt vmcnt(0)
458; GFX7-NEXT:    v_mov_b32_e32 v0, v1
459; GFX7-NEXT:    s_setpc_b64 s[30:31]
460;
461; GFX10-LABEL: extractelement_vgpr_v4i16_idx2:
462; GFX10:       ; %bb.0:
463; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
464; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
465; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
466; GFX10-NEXT:    s_waitcnt vmcnt(0)
467; GFX10-NEXT:    v_mov_b32_e32 v0, v1
468; GFX10-NEXT:    s_setpc_b64 s[30:31]
469;
470; GFX11-LABEL: extractelement_vgpr_v4i16_idx2:
471; GFX11:       ; %bb.0:
472; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
473; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
474; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off
475; GFX11-NEXT:    s_waitcnt vmcnt(0)
476; GFX11-NEXT:    v_mov_b32_e32 v0, v1
477; GFX11-NEXT:    s_setpc_b64 s[30:31]
478  %vector = load <4 x i16>, <4 x i16> addrspace(1)* %ptr
479  %element = extractelement <4 x i16> %vector, i32 2
480  ret i16 %element
481}
482
483define i16 @extractelement_vgpr_v4i16_idx3(<4 x i16> addrspace(1)* %ptr) {
484; GFX9-LABEL: extractelement_vgpr_v4i16_idx3:
485; GFX9:       ; %bb.0:
486; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
487; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
488; GFX9-NEXT:    s_waitcnt vmcnt(0)
489; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v1
490; GFX9-NEXT:    s_setpc_b64 s[30:31]
491;
492; GFX8-LABEL: extractelement_vgpr_v4i16_idx3:
493; GFX8:       ; %bb.0:
494; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
495; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
496; GFX8-NEXT:    s_waitcnt vmcnt(0)
497; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v1
498; GFX8-NEXT:    s_setpc_b64 s[30:31]
499;
500; GFX7-LABEL: extractelement_vgpr_v4i16_idx3:
501; GFX7:       ; %bb.0:
502; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
503; GFX7-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
504; GFX7-NEXT:    s_waitcnt vmcnt(0)
505; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v1
506; GFX7-NEXT:    s_setpc_b64 s[30:31]
507;
508; GFX10-LABEL: extractelement_vgpr_v4i16_idx3:
509; GFX10:       ; %bb.0:
510; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
511; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
512; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
513; GFX10-NEXT:    s_waitcnt vmcnt(0)
514; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 16, v1
515; GFX10-NEXT:    s_setpc_b64 s[30:31]
516;
517; GFX11-LABEL: extractelement_vgpr_v4i16_idx3:
518; GFX11:       ; %bb.0:
519; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
520; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
521; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off
522; GFX11-NEXT:    s_waitcnt vmcnt(0)
523; GFX11-NEXT:    v_lshrrev_b32_e32 v0, 16, v1
524; GFX11-NEXT:    s_setpc_b64 s[30:31]
525  %vector = load <4 x i16>, <4 x i16> addrspace(1)* %ptr
526  %element = extractelement <4 x i16> %vector, i32 3
527  ret i16 %element
528}
529
530define amdgpu_ps i16 @extractelement_sgpr_v8i16_sgpr_idx(<8 x i16> addrspace(4)* inreg %ptr, i32 inreg %idx) {
531; GCN-LABEL: extractelement_sgpr_v8i16_sgpr_idx:
532; GCN:       ; %bb.0:
533; GCN-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
534; GCN-NEXT:    s_lshr_b32 s5, s4, 1
535; GCN-NEXT:    s_cmp_eq_u32 s5, 1
536; GCN-NEXT:    s_waitcnt lgkmcnt(0)
537; GCN-NEXT:    s_cselect_b32 s0, s1, s0
538; GCN-NEXT:    s_cmp_eq_u32 s5, 2
539; GCN-NEXT:    s_cselect_b32 s0, s2, s0
540; GCN-NEXT:    s_cmp_eq_u32 s5, 3
541; GCN-NEXT:    s_cselect_b32 s0, s3, s0
542; GCN-NEXT:    s_and_b32 s1, s4, 1
543; GCN-NEXT:    s_lshl_b32 s1, s1, 4
544; GCN-NEXT:    s_lshr_b32 s0, s0, s1
545; GCN-NEXT:    ; return to shader part epilog
546;
547; GFX10-LABEL: extractelement_sgpr_v8i16_sgpr_idx:
548; GFX10:       ; %bb.0:
549; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
550; GFX10-NEXT:    s_lshr_b32 s5, s4, 1
551; GFX10-NEXT:    s_cmp_eq_u32 s5, 1
552; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
553; GFX10-NEXT:    s_cselect_b32 s0, s1, s0
554; GFX10-NEXT:    s_cmp_eq_u32 s5, 2
555; GFX10-NEXT:    s_cselect_b32 s0, s2, s0
556; GFX10-NEXT:    s_cmp_eq_u32 s5, 3
557; GFX10-NEXT:    s_cselect_b32 s0, s3, s0
558; GFX10-NEXT:    s_and_b32 s1, s4, 1
559; GFX10-NEXT:    s_lshl_b32 s1, s1, 4
560; GFX10-NEXT:    s_lshr_b32 s0, s0, s1
561; GFX10-NEXT:    ; return to shader part epilog
562;
563; GFX11-LABEL: extractelement_sgpr_v8i16_sgpr_idx:
564; GFX11:       ; %bb.0:
565; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x0
566; GFX11-NEXT:    s_lshr_b32 s5, s4, 1
567; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
568; GFX11-NEXT:    s_cmp_eq_u32 s5, 1
569; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
570; GFX11-NEXT:    s_cselect_b32 s0, s1, s0
571; GFX11-NEXT:    s_cmp_eq_u32 s5, 2
572; GFX11-NEXT:    s_cselect_b32 s0, s2, s0
573; GFX11-NEXT:    s_cmp_eq_u32 s5, 3
574; GFX11-NEXT:    s_cselect_b32 s0, s3, s0
575; GFX11-NEXT:    s_and_b32 s1, s4, 1
576; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)
577; GFX11-NEXT:    s_lshl_b32 s1, s1, 4
578; GFX11-NEXT:    s_lshr_b32 s0, s0, s1
579; GFX11-NEXT:    ; return to shader part epilog
580  %vector = load <8 x i16>, <8 x i16> addrspace(4)* %ptr
581  %element = extractelement <8 x i16> %vector, i32 %idx
582  ret i16 %element
583}
584
585define amdgpu_ps i16 @extractelement_vgpr_v8i16_sgpr_idx(<8 x i16> addrspace(1)* %ptr, i32 inreg %idx) {
586; GFX9-LABEL: extractelement_vgpr_v8i16_sgpr_idx:
587; GFX9:       ; %bb.0:
588; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
589; GFX9-NEXT:    s_lshr_b32 s0, s2, 1
590; GFX9-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 1
591; GFX9-NEXT:    s_and_b32 s1, s2, 1
592; GFX9-NEXT:    s_waitcnt vmcnt(0)
593; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
594; GFX9-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 2
595; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc
596; GFX9-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 3
597; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
598; GFX9-NEXT:    s_lshl_b32 s0, s1, 4
599; GFX9-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
600; GFX9-NEXT:    v_readfirstlane_b32 s0, v0
601; GFX9-NEXT:    ; return to shader part epilog
602;
603; GFX8-LABEL: extractelement_vgpr_v8i16_sgpr_idx:
604; GFX8:       ; %bb.0:
605; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
606; GFX8-NEXT:    s_lshr_b32 s0, s2, 1
607; GFX8-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 1
608; GFX8-NEXT:    s_and_b32 s1, s2, 1
609; GFX8-NEXT:    s_waitcnt vmcnt(0)
610; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
611; GFX8-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 2
612; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc
613; GFX8-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 3
614; GFX8-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
615; GFX8-NEXT:    s_lshl_b32 s0, s1, 4
616; GFX8-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
617; GFX8-NEXT:    v_readfirstlane_b32 s0, v0
618; GFX8-NEXT:    ; return to shader part epilog
619;
620; GFX7-LABEL: extractelement_vgpr_v8i16_sgpr_idx:
621; GFX7:       ; %bb.0:
622; GFX7-NEXT:    s_mov_b32 s6, 0
623; GFX7-NEXT:    s_mov_b32 s7, 0xf000
624; GFX7-NEXT:    s_mov_b64 s[4:5], 0
625; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
626; GFX7-NEXT:    s_lshr_b32 s0, s2, 1
627; GFX7-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 1
628; GFX7-NEXT:    s_and_b32 s1, s2, 1
629; GFX7-NEXT:    s_waitcnt vmcnt(0)
630; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc
631; GFX7-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 2
632; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc
633; GFX7-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 3
634; GFX7-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc
635; GFX7-NEXT:    s_lshl_b32 s0, s1, 4
636; GFX7-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
637; GFX7-NEXT:    v_readfirstlane_b32 s0, v0
638; GFX7-NEXT:    ; return to shader part epilog
639;
640; GFX10-LABEL: extractelement_vgpr_v8i16_sgpr_idx:
641; GFX10:       ; %bb.0:
642; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
643; GFX10-NEXT:    s_lshr_b32 s0, s2, 1
644; GFX10-NEXT:    v_cmp_eq_u32_e64 vcc_lo, s0, 1
645; GFX10-NEXT:    s_waitcnt vmcnt(0)
646; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc_lo
647; GFX10-NEXT:    v_cmp_eq_u32_e64 vcc_lo, s0, 2
648; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc_lo
649; GFX10-NEXT:    v_cmp_eq_u32_e64 vcc_lo, s0, 3
650; GFX10-NEXT:    s_and_b32 s0, s2, 1
651; GFX10-NEXT:    s_lshl_b32 s0, s0, 4
652; GFX10-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc_lo
653; GFX10-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
654; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
655; GFX10-NEXT:    ; return to shader part epilog
656;
657; GFX11-LABEL: extractelement_vgpr_v8i16_sgpr_idx:
658; GFX11:       ; %bb.0:
659; GFX11-NEXT:    global_load_b128 v[0:3], v[0:1], off
660; GFX11-NEXT:    s_lshr_b32 s0, s2, 1
661; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_3) | instid1(VALU_DEP_2)
662; GFX11-NEXT:    v_cmp_eq_u32_e64 vcc_lo, s0, 1
663; GFX11-NEXT:    s_waitcnt vmcnt(0)
664; GFX11-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc_lo
665; GFX11-NEXT:    v_cmp_eq_u32_e64 vcc_lo, s0, 2
666; GFX11-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc_lo
667; GFX11-NEXT:    v_cmp_eq_u32_e64 vcc_lo, s0, 3
668; GFX11-NEXT:    s_and_b32 s0, s2, 1
669; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(VALU_DEP_2)
670; GFX11-NEXT:    s_lshl_b32 s0, s0, 4
671; GFX11-NEXT:    v_cndmask_b32_e32 v0, v0, v3, vcc_lo
672; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
673; GFX11-NEXT:    v_lshrrev_b32_e32 v0, s0, v0
674; GFX11-NEXT:    v_readfirstlane_b32 s0, v0
675; GFX11-NEXT:    ; return to shader part epilog
676  %vector = load <8 x i16>, <8 x i16> addrspace(1)* %ptr
677  %element = extractelement <8 x i16> %vector, i32 %idx
678  ret i16 %element
679}
680
681define i16 @extractelement_vgpr_v8i16_vgpr_idx(<8 x i16> addrspace(1)* %ptr, i32 %idx) {
682; GFX9-LABEL: extractelement_vgpr_v8i16_vgpr_idx:
683; GFX9:       ; %bb.0:
684; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
685; GFX9-NEXT:    global_load_dwordx4 v[3:6], v[0:1], off
686; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 1, v2
687; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v0
688; GFX9-NEXT:    v_and_b32_e32 v1, 1, v2
689; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 4, v1
690; GFX9-NEXT:    s_waitcnt vmcnt(0)
691; GFX9-NEXT:    v_cndmask_b32_e32 v2, v3, v4, vcc
692; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v0
693; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v5, vcc
694; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v0
695; GFX9-NEXT:    v_cndmask_b32_e32 v0, v2, v6, vcc
696; GFX9-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
697; GFX9-NEXT:    s_setpc_b64 s[30:31]
698;
699; GFX8-LABEL: extractelement_vgpr_v8i16_vgpr_idx:
700; GFX8:       ; %bb.0:
701; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
702; GFX8-NEXT:    flat_load_dwordx4 v[3:6], v[0:1]
703; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 1, v2
704; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v0
705; GFX8-NEXT:    v_and_b32_e32 v1, 1, v2
706; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 4, v1
707; GFX8-NEXT:    s_waitcnt vmcnt(0)
708; GFX8-NEXT:    v_cndmask_b32_e32 v2, v3, v4, vcc
709; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v0
710; GFX8-NEXT:    v_cndmask_b32_e32 v2, v2, v5, vcc
711; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v0
712; GFX8-NEXT:    v_cndmask_b32_e32 v0, v2, v6, vcc
713; GFX8-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
714; GFX8-NEXT:    s_setpc_b64 s[30:31]
715;
716; GFX7-LABEL: extractelement_vgpr_v8i16_vgpr_idx:
717; GFX7:       ; %bb.0:
718; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
719; GFX7-NEXT:    s_mov_b32 s6, 0
720; GFX7-NEXT:    s_mov_b32 s7, 0xf000
721; GFX7-NEXT:    s_mov_b64 s[4:5], 0
722; GFX7-NEXT:    buffer_load_dwordx4 v[3:6], v[0:1], s[4:7], 0 addr64
723; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 1, v2
724; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v0
725; GFX7-NEXT:    v_and_b32_e32 v1, 1, v2
726; GFX7-NEXT:    v_lshlrev_b32_e32 v1, 4, v1
727; GFX7-NEXT:    s_waitcnt vmcnt(0)
728; GFX7-NEXT:    v_cndmask_b32_e32 v2, v3, v4, vcc
729; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v0
730; GFX7-NEXT:    v_cndmask_b32_e32 v2, v2, v5, vcc
731; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v0
732; GFX7-NEXT:    v_cndmask_b32_e32 v0, v2, v6, vcc
733; GFX7-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
734; GFX7-NEXT:    s_setpc_b64 s[30:31]
735;
736; GFX10-LABEL: extractelement_vgpr_v8i16_vgpr_idx:
737; GFX10:       ; %bb.0:
738; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
739; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
740; GFX10-NEXT:    global_load_dwordx4 v[3:6], v[0:1], off
741; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 1, v2
742; GFX10-NEXT:    v_and_b32_e32 v2, 1, v2
743; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 1, v0
744; GFX10-NEXT:    s_waitcnt vmcnt(0)
745; GFX10-NEXT:    v_cndmask_b32_e32 v1, v3, v4, vcc_lo
746; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 2, v0
747; GFX10-NEXT:    v_cndmask_b32_e32 v1, v1, v5, vcc_lo
748; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 3, v0
749; GFX10-NEXT:    v_cndmask_b32_e32 v0, v1, v6, vcc_lo
750; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 4, v2
751; GFX10-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
752; GFX10-NEXT:    s_setpc_b64 s[30:31]
753;
754; GFX11-LABEL: extractelement_vgpr_v8i16_vgpr_idx:
755; GFX11:       ; %bb.0:
756; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
757; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
758; GFX11-NEXT:    global_load_b128 v[3:6], v[0:1], off
759; GFX11-NEXT:    v_lshrrev_b32_e32 v0, 1, v2
760; GFX11-NEXT:    v_and_b32_e32 v2, 1, v2
761; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_3) | instid1(VALU_DEP_2)
762; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 1, v0
763; GFX11-NEXT:    s_waitcnt vmcnt(0)
764; GFX11-NEXT:    v_cndmask_b32_e32 v1, v3, v4, vcc_lo
765; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 2, v0
766; GFX11-NEXT:    v_cndmask_b32_e32 v1, v1, v5, vcc_lo
767; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 3, v0
768; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_1)
769; GFX11-NEXT:    v_cndmask_b32_e32 v0, v1, v6, vcc_lo
770; GFX11-NEXT:    v_lshlrev_b32_e32 v1, 4, v2
771; GFX11-NEXT:    v_lshrrev_b32_e32 v0, v1, v0
772; GFX11-NEXT:    s_setpc_b64 s[30:31]
773  %vector = load <8 x i16>, <8 x i16> addrspace(1)* %ptr
774  %element = extractelement <8 x i16> %vector, i32 %idx
775  ret i16 %element
776}
777
778define amdgpu_ps i16 @extractelement_sgpr_v8i16_vgpr_idx(<8 x i16> addrspace(4)* inreg %ptr, i32 %idx) {
779; GCN-LABEL: extractelement_sgpr_v8i16_vgpr_idx:
780; GCN:       ; %bb.0:
781; GCN-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
782; GCN-NEXT:    v_lshrrev_b32_e32 v1, 1, v0
783; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v1
784; GCN-NEXT:    v_and_b32_e32 v0, 1, v0
785; GCN-NEXT:    v_lshlrev_b32_e32 v0, 4, v0
786; GCN-NEXT:    s_waitcnt lgkmcnt(0)
787; GCN-NEXT:    v_mov_b32_e32 v2, s0
788; GCN-NEXT:    v_mov_b32_e32 v3, s1
789; GCN-NEXT:    v_mov_b32_e32 v4, s2
790; GCN-NEXT:    v_cndmask_b32_e32 v2, v2, v3, vcc
791; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v1
792; GCN-NEXT:    v_mov_b32_e32 v5, s3
793; GCN-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
794; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 3, v1
795; GCN-NEXT:    v_cndmask_b32_e32 v1, v2, v5, vcc
796; GCN-NEXT:    v_lshrrev_b32_e32 v0, v0, v1
797; GCN-NEXT:    v_readfirstlane_b32 s0, v0
798; GCN-NEXT:    ; return to shader part epilog
799;
800; GFX10-LABEL: extractelement_sgpr_v8i16_vgpr_idx:
801; GFX10:       ; %bb.0:
802; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
803; GFX10-NEXT:    v_lshrrev_b32_e32 v1, 1, v0
804; GFX10-NEXT:    v_and_b32_e32 v0, 1, v0
805; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 1, v1
806; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 4, v0
807; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
808; GFX10-NEXT:    v_mov_b32_e32 v2, s1
809; GFX10-NEXT:    v_cndmask_b32_e32 v2, s0, v2, vcc_lo
810; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 2, v1
811; GFX10-NEXT:    v_cndmask_b32_e64 v2, v2, s2, vcc_lo
812; GFX10-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 3, v1
813; GFX10-NEXT:    v_cndmask_b32_e64 v1, v2, s3, vcc_lo
814; GFX10-NEXT:    v_lshrrev_b32_e32 v0, v0, v1
815; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
816; GFX10-NEXT:    ; return to shader part epilog
817;
818; GFX11-LABEL: extractelement_sgpr_v8i16_vgpr_idx:
819; GFX11:       ; %bb.0:
820; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x0
821; GFX11-NEXT:    v_lshrrev_b32_e32 v1, 1, v0
822; GFX11-NEXT:    v_and_b32_e32 v0, 1, v0
823; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
824; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 1, v1
825; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 4, v0
826; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
827; GFX11-NEXT:    v_mov_b32_e32 v2, s1
828; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2)
829; GFX11-NEXT:    v_cndmask_b32_e32 v2, s0, v2, vcc_lo
830; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 2, v1
831; GFX11-NEXT:    v_cndmask_b32_e64 v2, v2, s2, vcc_lo
832; GFX11-NEXT:    v_cmp_eq_u32_e32 vcc_lo, 3, v1
833; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
834; GFX11-NEXT:    v_cndmask_b32_e64 v1, v2, s3, vcc_lo
835; GFX11-NEXT:    v_lshrrev_b32_e32 v0, v0, v1
836; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
837; GFX11-NEXT:    v_readfirstlane_b32 s0, v0
838; GFX11-NEXT:    ; return to shader part epilog
839  %vector = load <8 x i16>, <8 x i16> addrspace(4)* %ptr
840  %element = extractelement <8 x i16> %vector, i32 %idx
841  ret i16 %element
842}
843
844define amdgpu_ps i16 @extractelement_sgpr_v8i16_idx0(<8 x i16> addrspace(4)* inreg %ptr) {
845; GCN-LABEL: extractelement_sgpr_v8i16_idx0:
846; GCN:       ; %bb.0:
847; GCN-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
848; GCN-NEXT:    s_waitcnt lgkmcnt(0)
849; GCN-NEXT:    ; return to shader part epilog
850;
851; GFX10-LABEL: extractelement_sgpr_v8i16_idx0:
852; GFX10:       ; %bb.0:
853; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
854; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
855; GFX10-NEXT:    ; return to shader part epilog
856;
857; GFX11-LABEL: extractelement_sgpr_v8i16_idx0:
858; GFX11:       ; %bb.0:
859; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x0
860; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
861; GFX11-NEXT:    ; return to shader part epilog
862  %vector = load <8 x i16>, <8 x i16> addrspace(4)* %ptr
863  %element = extractelement <8 x i16> %vector, i32 0
864  ret i16 %element
865}
866
867define amdgpu_ps i16 @extractelement_sgpr_v8i16_idx1(<8 x i16> addrspace(4)* inreg %ptr) {
868; GCN-LABEL: extractelement_sgpr_v8i16_idx1:
869; GCN:       ; %bb.0:
870; GCN-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
871; GCN-NEXT:    s_waitcnt lgkmcnt(0)
872; GCN-NEXT:    s_lshr_b32 s0, s0, 16
873; GCN-NEXT:    ; return to shader part epilog
874;
875; GFX10-LABEL: extractelement_sgpr_v8i16_idx1:
876; GFX10:       ; %bb.0:
877; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
878; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
879; GFX10-NEXT:    s_lshr_b32 s0, s0, 16
880; GFX10-NEXT:    ; return to shader part epilog
881;
882; GFX11-LABEL: extractelement_sgpr_v8i16_idx1:
883; GFX11:       ; %bb.0:
884; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x0
885; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
886; GFX11-NEXT:    s_lshr_b32 s0, s0, 16
887; GFX11-NEXT:    ; return to shader part epilog
888  %vector = load <8 x i16>, <8 x i16> addrspace(4)* %ptr
889  %element = extractelement <8 x i16> %vector, i32 1
890  ret i16 %element
891}
892
893define amdgpu_ps i16 @extractelement_sgpr_v8i16_idx2(<8 x i16> addrspace(4)* inreg %ptr) {
894; GCN-LABEL: extractelement_sgpr_v8i16_idx2:
895; GCN:       ; %bb.0:
896; GCN-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
897; GCN-NEXT:    s_waitcnt lgkmcnt(0)
898; GCN-NEXT:    s_mov_b32 s0, s1
899; GCN-NEXT:    ; return to shader part epilog
900;
901; GFX10-LABEL: extractelement_sgpr_v8i16_idx2:
902; GFX10:       ; %bb.0:
903; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
904; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
905; GFX10-NEXT:    s_mov_b32 s0, s1
906; GFX10-NEXT:    ; return to shader part epilog
907;
908; GFX11-LABEL: extractelement_sgpr_v8i16_idx2:
909; GFX11:       ; %bb.0:
910; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x0
911; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
912; GFX11-NEXT:    s_mov_b32 s0, s1
913; GFX11-NEXT:    ; return to shader part epilog
914  %vector = load <8 x i16>, <8 x i16> addrspace(4)* %ptr
915  %element = extractelement <8 x i16> %vector, i32 2
916  ret i16 %element
917}
918
919define amdgpu_ps i16 @extractelement_sgpr_v8i16_idx3(<8 x i16> addrspace(4)* inreg %ptr) {
920; GCN-LABEL: extractelement_sgpr_v8i16_idx3:
921; GCN:       ; %bb.0:
922; GCN-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
923; GCN-NEXT:    s_waitcnt lgkmcnt(0)
924; GCN-NEXT:    s_lshr_b32 s0, s1, 16
925; GCN-NEXT:    ; return to shader part epilog
926;
927; GFX10-LABEL: extractelement_sgpr_v8i16_idx3:
928; GFX10:       ; %bb.0:
929; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
930; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
931; GFX10-NEXT:    s_lshr_b32 s0, s1, 16
932; GFX10-NEXT:    ; return to shader part epilog
933;
934; GFX11-LABEL: extractelement_sgpr_v8i16_idx3:
935; GFX11:       ; %bb.0:
936; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x0
937; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
938; GFX11-NEXT:    s_lshr_b32 s0, s1, 16
939; GFX11-NEXT:    ; return to shader part epilog
940  %vector = load <8 x i16>, <8 x i16> addrspace(4)* %ptr
941  %element = extractelement <8 x i16> %vector, i32 3
942  ret i16 %element
943}
944
945define amdgpu_ps i16 @extractelement_sgpr_v8i16_idx4(<8 x i16> addrspace(4)* inreg %ptr) {
946; GCN-LABEL: extractelement_sgpr_v8i16_idx4:
947; GCN:       ; %bb.0:
948; GCN-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
949; GCN-NEXT:    s_waitcnt lgkmcnt(0)
950; GCN-NEXT:    s_mov_b32 s0, s2
951; GCN-NEXT:    ; return to shader part epilog
952;
953; GFX10-LABEL: extractelement_sgpr_v8i16_idx4:
954; GFX10:       ; %bb.0:
955; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
956; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
957; GFX10-NEXT:    s_mov_b32 s0, s2
958; GFX10-NEXT:    ; return to shader part epilog
959;
960; GFX11-LABEL: extractelement_sgpr_v8i16_idx4:
961; GFX11:       ; %bb.0:
962; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x0
963; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
964; GFX11-NEXT:    s_mov_b32 s0, s2
965; GFX11-NEXT:    ; return to shader part epilog
966  %vector = load <8 x i16>, <8 x i16> addrspace(4)* %ptr
967  %element = extractelement <8 x i16> %vector, i32 4
968  ret i16 %element
969}
970
971define amdgpu_ps i16 @extractelement_sgpr_v8i16_idx5(<8 x i16> addrspace(4)* inreg %ptr) {
972; GCN-LABEL: extractelement_sgpr_v8i16_idx5:
973; GCN:       ; %bb.0:
974; GCN-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
975; GCN-NEXT:    s_waitcnt lgkmcnt(0)
976; GCN-NEXT:    s_lshr_b32 s0, s2, 16
977; GCN-NEXT:    ; return to shader part epilog
978;
979; GFX10-LABEL: extractelement_sgpr_v8i16_idx5:
980; GFX10:       ; %bb.0:
981; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
982; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
983; GFX10-NEXT:    s_lshr_b32 s0, s2, 16
984; GFX10-NEXT:    ; return to shader part epilog
985;
986; GFX11-LABEL: extractelement_sgpr_v8i16_idx5:
987; GFX11:       ; %bb.0:
988; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x0
989; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
990; GFX11-NEXT:    s_lshr_b32 s0, s2, 16
991; GFX11-NEXT:    ; return to shader part epilog
992  %vector = load <8 x i16>, <8 x i16> addrspace(4)* %ptr
993  %element = extractelement <8 x i16> %vector, i32 5
994  ret i16 %element
995}
996
997define amdgpu_ps i16 @extractelement_sgpr_v8i16_idx6(<8 x i16> addrspace(4)* inreg %ptr) {
998; GCN-LABEL: extractelement_sgpr_v8i16_idx6:
999; GCN:       ; %bb.0:
1000; GCN-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
1001; GCN-NEXT:    s_waitcnt lgkmcnt(0)
1002; GCN-NEXT:    s_mov_b32 s0, s3
1003; GCN-NEXT:    ; return to shader part epilog
1004;
1005; GFX10-LABEL: extractelement_sgpr_v8i16_idx6:
1006; GFX10:       ; %bb.0:
1007; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
1008; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1009; GFX10-NEXT:    s_mov_b32 s0, s3
1010; GFX10-NEXT:    ; return to shader part epilog
1011;
1012; GFX11-LABEL: extractelement_sgpr_v8i16_idx6:
1013; GFX11:       ; %bb.0:
1014; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x0
1015; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1016; GFX11-NEXT:    s_mov_b32 s0, s3
1017; GFX11-NEXT:    ; return to shader part epilog
1018  %vector = load <8 x i16>, <8 x i16> addrspace(4)* %ptr
1019  %element = extractelement <8 x i16> %vector, i32 6
1020  ret i16 %element
1021}
1022
1023define amdgpu_ps i16 @extractelement_sgpr_v8i16_idx7(<8 x i16> addrspace(4)* inreg %ptr) {
1024; GCN-LABEL: extractelement_sgpr_v8i16_idx7:
1025; GCN:       ; %bb.0:
1026; GCN-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
1027; GCN-NEXT:    s_waitcnt lgkmcnt(0)
1028; GCN-NEXT:    s_lshr_b32 s0, s3, 16
1029; GCN-NEXT:    ; return to shader part epilog
1030;
1031; GFX10-LABEL: extractelement_sgpr_v8i16_idx7:
1032; GFX10:       ; %bb.0:
1033; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x0
1034; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1035; GFX10-NEXT:    s_lshr_b32 s0, s3, 16
1036; GFX10-NEXT:    ; return to shader part epilog
1037;
1038; GFX11-LABEL: extractelement_sgpr_v8i16_idx7:
1039; GFX11:       ; %bb.0:
1040; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x0
1041; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1042; GFX11-NEXT:    s_lshr_b32 s0, s3, 16
1043; GFX11-NEXT:    ; return to shader part epilog
1044  %vector = load <8 x i16>, <8 x i16> addrspace(4)* %ptr
1045  %element = extractelement <8 x i16> %vector, i32 7
1046  ret i16 %element
1047}
1048
1049define i16 @extractelement_vgpr_v8i16_idx0(<8 x i16> addrspace(1)* %ptr) {
1050; GFX9-LABEL: extractelement_vgpr_v8i16_idx0:
1051; GFX9:       ; %bb.0:
1052; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1053; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
1054; GFX9-NEXT:    s_waitcnt vmcnt(0)
1055; GFX9-NEXT:    s_setpc_b64 s[30:31]
1056;
1057; GFX8-LABEL: extractelement_vgpr_v8i16_idx0:
1058; GFX8:       ; %bb.0:
1059; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1060; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
1061; GFX8-NEXT:    s_waitcnt vmcnt(0)
1062; GFX8-NEXT:    s_setpc_b64 s[30:31]
1063;
1064; GFX7-LABEL: extractelement_vgpr_v8i16_idx0:
1065; GFX7:       ; %bb.0:
1066; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1067; GFX7-NEXT:    s_mov_b32 s6, 0
1068; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1069; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1070; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
1071; GFX7-NEXT:    s_waitcnt vmcnt(0)
1072; GFX7-NEXT:    s_setpc_b64 s[30:31]
1073;
1074; GFX10-LABEL: extractelement_vgpr_v8i16_idx0:
1075; GFX10:       ; %bb.0:
1076; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1077; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1078; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
1079; GFX10-NEXT:    s_waitcnt vmcnt(0)
1080; GFX10-NEXT:    s_setpc_b64 s[30:31]
1081;
1082; GFX11-LABEL: extractelement_vgpr_v8i16_idx0:
1083; GFX11:       ; %bb.0:
1084; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1085; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
1086; GFX11-NEXT:    global_load_b128 v[0:3], v[0:1], off
1087; GFX11-NEXT:    s_waitcnt vmcnt(0)
1088; GFX11-NEXT:    s_setpc_b64 s[30:31]
1089  %vector = load <8 x i16>, <8 x i16> addrspace(1)* %ptr
1090  %element = extractelement <8 x i16> %vector, i32 0
1091  ret i16 %element
1092}
1093
1094define i16 @extractelement_vgpr_v8i16_idx1(<8 x i16> addrspace(1)* %ptr) {
1095; GFX9-LABEL: extractelement_vgpr_v8i16_idx1:
1096; GFX9:       ; %bb.0:
1097; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1098; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
1099; GFX9-NEXT:    s_waitcnt vmcnt(0)
1100; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1101; GFX9-NEXT:    s_setpc_b64 s[30:31]
1102;
1103; GFX8-LABEL: extractelement_vgpr_v8i16_idx1:
1104; GFX8:       ; %bb.0:
1105; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1106; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
1107; GFX8-NEXT:    s_waitcnt vmcnt(0)
1108; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1109; GFX8-NEXT:    s_setpc_b64 s[30:31]
1110;
1111; GFX7-LABEL: extractelement_vgpr_v8i16_idx1:
1112; GFX7:       ; %bb.0:
1113; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1114; GFX7-NEXT:    s_mov_b32 s6, 0
1115; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1116; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1117; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
1118; GFX7-NEXT:    s_waitcnt vmcnt(0)
1119; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1120; GFX7-NEXT:    s_setpc_b64 s[30:31]
1121;
1122; GFX10-LABEL: extractelement_vgpr_v8i16_idx1:
1123; GFX10:       ; %bb.0:
1124; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1125; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1126; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
1127; GFX10-NEXT:    s_waitcnt vmcnt(0)
1128; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1129; GFX10-NEXT:    s_setpc_b64 s[30:31]
1130;
1131; GFX11-LABEL: extractelement_vgpr_v8i16_idx1:
1132; GFX11:       ; %bb.0:
1133; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1134; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
1135; GFX11-NEXT:    global_load_b128 v[0:3], v[0:1], off
1136; GFX11-NEXT:    s_waitcnt vmcnt(0)
1137; GFX11-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1138; GFX11-NEXT:    s_setpc_b64 s[30:31]
1139  %vector = load <8 x i16>, <8 x i16> addrspace(1)* %ptr
1140  %element = extractelement <8 x i16> %vector, i32 1
1141  ret i16 %element
1142}
1143
1144define i16 @extractelement_vgpr_v8i16_idx2(<8 x i16> addrspace(1)* %ptr) {
1145; GFX9-LABEL: extractelement_vgpr_v8i16_idx2:
1146; GFX9:       ; %bb.0:
1147; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1148; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
1149; GFX9-NEXT:    s_waitcnt vmcnt(0)
1150; GFX9-NEXT:    v_mov_b32_e32 v0, v1
1151; GFX9-NEXT:    s_setpc_b64 s[30:31]
1152;
1153; GFX8-LABEL: extractelement_vgpr_v8i16_idx2:
1154; GFX8:       ; %bb.0:
1155; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1156; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
1157; GFX8-NEXT:    s_waitcnt vmcnt(0)
1158; GFX8-NEXT:    v_mov_b32_e32 v0, v1
1159; GFX8-NEXT:    s_setpc_b64 s[30:31]
1160;
1161; GFX7-LABEL: extractelement_vgpr_v8i16_idx2:
1162; GFX7:       ; %bb.0:
1163; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1164; GFX7-NEXT:    s_mov_b32 s6, 0
1165; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1166; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1167; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
1168; GFX7-NEXT:    s_waitcnt vmcnt(0)
1169; GFX7-NEXT:    v_mov_b32_e32 v0, v1
1170; GFX7-NEXT:    s_setpc_b64 s[30:31]
1171;
1172; GFX10-LABEL: extractelement_vgpr_v8i16_idx2:
1173; GFX10:       ; %bb.0:
1174; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1175; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1176; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
1177; GFX10-NEXT:    s_waitcnt vmcnt(0)
1178; GFX10-NEXT:    v_mov_b32_e32 v0, v1
1179; GFX10-NEXT:    s_setpc_b64 s[30:31]
1180;
1181; GFX11-LABEL: extractelement_vgpr_v8i16_idx2:
1182; GFX11:       ; %bb.0:
1183; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1184; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
1185; GFX11-NEXT:    global_load_b128 v[0:3], v[0:1], off
1186; GFX11-NEXT:    s_waitcnt vmcnt(0)
1187; GFX11-NEXT:    v_mov_b32_e32 v0, v1
1188; GFX11-NEXT:    s_setpc_b64 s[30:31]
1189  %vector = load <8 x i16>, <8 x i16> addrspace(1)* %ptr
1190  %element = extractelement <8 x i16> %vector, i32 2
1191  ret i16 %element
1192}
1193
1194define i16 @extractelement_vgpr_v8i16_idx3(<8 x i16> addrspace(1)* %ptr) {
1195; GFX9-LABEL: extractelement_vgpr_v8i16_idx3:
1196; GFX9:       ; %bb.0:
1197; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1198; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
1199; GFX9-NEXT:    s_waitcnt vmcnt(0)
1200; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v1
1201; GFX9-NEXT:    s_setpc_b64 s[30:31]
1202;
1203; GFX8-LABEL: extractelement_vgpr_v8i16_idx3:
1204; GFX8:       ; %bb.0:
1205; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1206; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
1207; GFX8-NEXT:    s_waitcnt vmcnt(0)
1208; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v1
1209; GFX8-NEXT:    s_setpc_b64 s[30:31]
1210;
1211; GFX7-LABEL: extractelement_vgpr_v8i16_idx3:
1212; GFX7:       ; %bb.0:
1213; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1214; GFX7-NEXT:    s_mov_b32 s6, 0
1215; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1216; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1217; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
1218; GFX7-NEXT:    s_waitcnt vmcnt(0)
1219; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v1
1220; GFX7-NEXT:    s_setpc_b64 s[30:31]
1221;
1222; GFX10-LABEL: extractelement_vgpr_v8i16_idx3:
1223; GFX10:       ; %bb.0:
1224; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1225; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1226; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
1227; GFX10-NEXT:    s_waitcnt vmcnt(0)
1228; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 16, v1
1229; GFX10-NEXT:    s_setpc_b64 s[30:31]
1230;
1231; GFX11-LABEL: extractelement_vgpr_v8i16_idx3:
1232; GFX11:       ; %bb.0:
1233; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1234; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
1235; GFX11-NEXT:    global_load_b128 v[0:3], v[0:1], off
1236; GFX11-NEXT:    s_waitcnt vmcnt(0)
1237; GFX11-NEXT:    v_lshrrev_b32_e32 v0, 16, v1
1238; GFX11-NEXT:    s_setpc_b64 s[30:31]
1239  %vector = load <8 x i16>, <8 x i16> addrspace(1)* %ptr
1240  %element = extractelement <8 x i16> %vector, i32 3
1241  ret i16 %element
1242}
1243
1244define i16 @extractelement_vgpr_v8i16_idx4(<8 x i16> addrspace(1)* %ptr) {
1245; GFX9-LABEL: extractelement_vgpr_v8i16_idx4:
1246; GFX9:       ; %bb.0:
1247; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1248; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
1249; GFX9-NEXT:    s_waitcnt vmcnt(0)
1250; GFX9-NEXT:    v_mov_b32_e32 v0, v2
1251; GFX9-NEXT:    s_setpc_b64 s[30:31]
1252;
1253; GFX8-LABEL: extractelement_vgpr_v8i16_idx4:
1254; GFX8:       ; %bb.0:
1255; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1256; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
1257; GFX8-NEXT:    s_waitcnt vmcnt(0)
1258; GFX8-NEXT:    v_mov_b32_e32 v0, v2
1259; GFX8-NEXT:    s_setpc_b64 s[30:31]
1260;
1261; GFX7-LABEL: extractelement_vgpr_v8i16_idx4:
1262; GFX7:       ; %bb.0:
1263; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1264; GFX7-NEXT:    s_mov_b32 s6, 0
1265; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1266; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1267; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
1268; GFX7-NEXT:    s_waitcnt vmcnt(0)
1269; GFX7-NEXT:    v_mov_b32_e32 v0, v2
1270; GFX7-NEXT:    s_setpc_b64 s[30:31]
1271;
1272; GFX10-LABEL: extractelement_vgpr_v8i16_idx4:
1273; GFX10:       ; %bb.0:
1274; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1275; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1276; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
1277; GFX10-NEXT:    s_waitcnt vmcnt(0)
1278; GFX10-NEXT:    v_mov_b32_e32 v0, v2
1279; GFX10-NEXT:    s_setpc_b64 s[30:31]
1280;
1281; GFX11-LABEL: extractelement_vgpr_v8i16_idx4:
1282; GFX11:       ; %bb.0:
1283; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1284; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
1285; GFX11-NEXT:    global_load_b128 v[0:3], v[0:1], off
1286; GFX11-NEXT:    s_waitcnt vmcnt(0)
1287; GFX11-NEXT:    v_mov_b32_e32 v0, v2
1288; GFX11-NEXT:    s_setpc_b64 s[30:31]
1289  %vector = load <8 x i16>, <8 x i16> addrspace(1)* %ptr
1290  %element = extractelement <8 x i16> %vector, i32 4
1291  ret i16 %element
1292}
1293
1294define i16 @extractelement_vgpr_v8i16_idx5(<8 x i16> addrspace(1)* %ptr) {
1295; GFX9-LABEL: extractelement_vgpr_v8i16_idx5:
1296; GFX9:       ; %bb.0:
1297; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1298; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
1299; GFX9-NEXT:    s_waitcnt vmcnt(0)
1300; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v2
1301; GFX9-NEXT:    s_setpc_b64 s[30:31]
1302;
1303; GFX8-LABEL: extractelement_vgpr_v8i16_idx5:
1304; GFX8:       ; %bb.0:
1305; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1306; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
1307; GFX8-NEXT:    s_waitcnt vmcnt(0)
1308; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v2
1309; GFX8-NEXT:    s_setpc_b64 s[30:31]
1310;
1311; GFX7-LABEL: extractelement_vgpr_v8i16_idx5:
1312; GFX7:       ; %bb.0:
1313; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1314; GFX7-NEXT:    s_mov_b32 s6, 0
1315; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1316; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1317; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
1318; GFX7-NEXT:    s_waitcnt vmcnt(0)
1319; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v2
1320; GFX7-NEXT:    s_setpc_b64 s[30:31]
1321;
1322; GFX10-LABEL: extractelement_vgpr_v8i16_idx5:
1323; GFX10:       ; %bb.0:
1324; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1325; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1326; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
1327; GFX10-NEXT:    s_waitcnt vmcnt(0)
1328; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 16, v2
1329; GFX10-NEXT:    s_setpc_b64 s[30:31]
1330;
1331; GFX11-LABEL: extractelement_vgpr_v8i16_idx5:
1332; GFX11:       ; %bb.0:
1333; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1334; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
1335; GFX11-NEXT:    global_load_b128 v[0:3], v[0:1], off
1336; GFX11-NEXT:    s_waitcnt vmcnt(0)
1337; GFX11-NEXT:    v_lshrrev_b32_e32 v0, 16, v2
1338; GFX11-NEXT:    s_setpc_b64 s[30:31]
1339  %vector = load <8 x i16>, <8 x i16> addrspace(1)* %ptr
1340  %element = extractelement <8 x i16> %vector, i32 5
1341  ret i16 %element
1342}
1343
1344define i16 @extractelement_vgpr_v8i16_idx6(<8 x i16> addrspace(1)* %ptr) {
1345; GFX9-LABEL: extractelement_vgpr_v8i16_idx6:
1346; GFX9:       ; %bb.0:
1347; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1348; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
1349; GFX9-NEXT:    s_waitcnt vmcnt(0)
1350; GFX9-NEXT:    v_mov_b32_e32 v0, v3
1351; GFX9-NEXT:    s_setpc_b64 s[30:31]
1352;
1353; GFX8-LABEL: extractelement_vgpr_v8i16_idx6:
1354; GFX8:       ; %bb.0:
1355; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1356; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
1357; GFX8-NEXT:    s_waitcnt vmcnt(0)
1358; GFX8-NEXT:    v_mov_b32_e32 v0, v3
1359; GFX8-NEXT:    s_setpc_b64 s[30:31]
1360;
1361; GFX7-LABEL: extractelement_vgpr_v8i16_idx6:
1362; GFX7:       ; %bb.0:
1363; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1364; GFX7-NEXT:    s_mov_b32 s6, 0
1365; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1366; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1367; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
1368; GFX7-NEXT:    s_waitcnt vmcnt(0)
1369; GFX7-NEXT:    v_mov_b32_e32 v0, v3
1370; GFX7-NEXT:    s_setpc_b64 s[30:31]
1371;
1372; GFX10-LABEL: extractelement_vgpr_v8i16_idx6:
1373; GFX10:       ; %bb.0:
1374; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1375; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1376; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
1377; GFX10-NEXT:    s_waitcnt vmcnt(0)
1378; GFX10-NEXT:    v_mov_b32_e32 v0, v3
1379; GFX10-NEXT:    s_setpc_b64 s[30:31]
1380;
1381; GFX11-LABEL: extractelement_vgpr_v8i16_idx6:
1382; GFX11:       ; %bb.0:
1383; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1384; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
1385; GFX11-NEXT:    global_load_b128 v[0:3], v[0:1], off
1386; GFX11-NEXT:    s_waitcnt vmcnt(0)
1387; GFX11-NEXT:    v_mov_b32_e32 v0, v3
1388; GFX11-NEXT:    s_setpc_b64 s[30:31]
1389  %vector = load <8 x i16>, <8 x i16> addrspace(1)* %ptr
1390  %element = extractelement <8 x i16> %vector, i32 6
1391  ret i16 %element
1392}
1393
1394define i16 @extractelement_vgpr_v8i16_idx7(<8 x i16> addrspace(1)* %ptr) {
1395; GFX9-LABEL: extractelement_vgpr_v8i16_idx7:
1396; GFX9:       ; %bb.0:
1397; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1398; GFX9-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
1399; GFX9-NEXT:    s_waitcnt vmcnt(0)
1400; GFX9-NEXT:    v_lshrrev_b32_e32 v0, 16, v3
1401; GFX9-NEXT:    s_setpc_b64 s[30:31]
1402;
1403; GFX8-LABEL: extractelement_vgpr_v8i16_idx7:
1404; GFX8:       ; %bb.0:
1405; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1406; GFX8-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
1407; GFX8-NEXT:    s_waitcnt vmcnt(0)
1408; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v3
1409; GFX8-NEXT:    s_setpc_b64 s[30:31]
1410;
1411; GFX7-LABEL: extractelement_vgpr_v8i16_idx7:
1412; GFX7:       ; %bb.0:
1413; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1414; GFX7-NEXT:    s_mov_b32 s6, 0
1415; GFX7-NEXT:    s_mov_b32 s7, 0xf000
1416; GFX7-NEXT:    s_mov_b64 s[4:5], 0
1417; GFX7-NEXT:    buffer_load_dwordx4 v[0:3], v[0:1], s[4:7], 0 addr64
1418; GFX7-NEXT:    s_waitcnt vmcnt(0)
1419; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v3
1420; GFX7-NEXT:    s_setpc_b64 s[30:31]
1421;
1422; GFX10-LABEL: extractelement_vgpr_v8i16_idx7:
1423; GFX10:       ; %bb.0:
1424; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1425; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
1426; GFX10-NEXT:    global_load_dwordx4 v[0:3], v[0:1], off
1427; GFX10-NEXT:    s_waitcnt vmcnt(0)
1428; GFX10-NEXT:    v_lshrrev_b32_e32 v0, 16, v3
1429; GFX10-NEXT:    s_setpc_b64 s[30:31]
1430;
1431; GFX11-LABEL: extractelement_vgpr_v8i16_idx7:
1432; GFX11:       ; %bb.0:
1433; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1434; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0
1435; GFX11-NEXT:    global_load_b128 v[0:3], v[0:1], off
1436; GFX11-NEXT:    s_waitcnt vmcnt(0)
1437; GFX11-NEXT:    v_lshrrev_b32_e32 v0, 16, v3
1438; GFX11-NEXT:    s_setpc_b64 s[30:31]
1439  %vector = load <8 x i16>, <8 x i16> addrspace(1)* %ptr
1440  %element = extractelement <8 x i16> %vector, i32 7
1441  ret i16 %element
1442}
1443