[AMDGPU] Make v8i16/v8f16 legal
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / GlobalISel / extractelement.i16.ll
blob1316c7f303dd458682a778d6610652962660913c
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
7 define 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
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
36 define 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:    s_and_b32 s1, s2, 1
42 ; GFX9-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 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
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:    s_and_b32 s1, s2, 1
55 ; GFX8-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 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
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:    s_and_b32 s1, s2, 1
68 ; GFX7-NEXT:    v_cmp_eq_u32_e64 vcc, s0, 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
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
93 define 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_and_b32_e32 v2, 1, v2
100 ; GFX9-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v3
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]
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_and_b32_e32 v2, 1, v2
113 ; GFX8-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v3
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]
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_and_b32_e32 v2, 1, v2
126 ; GFX7-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v3
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]
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
151 define 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_cmp_eq_u32_e32 vcc, 1, v1
157 ; GCN-NEXT:    v_and_b32_e32 v0, 1, v0
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
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
185 define 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
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
202 define 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
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
221 define 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
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
240 define 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
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
259 define 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]
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]
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]
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
293 define 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]
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]
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]
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
331 define 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]
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]
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]
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
369 define 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]
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]
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]
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
407 define 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
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
444 define 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
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
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
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
520 define 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]
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]
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]
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
597 define 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_mov_b32_e32 v4, s2
609 ; GCN-NEXT:    v_cndmask_b32_e32 v2, v2, v3, vcc
610 ; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v1
611 ; GCN-NEXT:    v_mov_b32_e32 v5, s3
612 ; GCN-NEXT:    v_cndmask_b32_e32 v2, v2, v4, vcc
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
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
641 define 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
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
658 define 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
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
677 define 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
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
696 define 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
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
715 define 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
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
734 define 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
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
753 define 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
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
772 define 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
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
791 define 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]
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]
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]
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
828 define 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]
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]
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]
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
869 define 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]
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]
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]
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
910 define 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]
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]
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]
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
951 define 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]
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]
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]
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
992 define 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]
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]
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]
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
1033 define 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]
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]
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]
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
1074 define 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]
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]
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]
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