Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / vector_shuffle.packed.ll
blob2797c5b7988810e66e44dc5f5fb8922de52c2e6f
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -check-prefix=GFX9 %s
3 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -verify-machineinstrs < %s | FileCheck -check-prefix=GFX10 %s
4 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -verify-machineinstrs < %s | FileCheck -check-prefix=GFX11 %s
6 define <4 x half> @shuffle_v4f16_23uu(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
7 ; GFX9-LABEL: shuffle_v4f16_23uu:
8 ; GFX9:       ; %bb.0:
9 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
10 ; GFX9-NEXT:    global_load_dword v0, v[0:1], off offset:4
11 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
12 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
14 ; GFX10-LABEL: shuffle_v4f16_23uu:
15 ; GFX10:       ; %bb.0:
16 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
17 ; GFX10-NEXT:    global_load_dword v0, v[0:1], off offset:4
18 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
19 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
21 ; GFX11-LABEL: shuffle_v4f16_23uu:
22 ; GFX11:       ; %bb.0:
23 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
24 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:4
25 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
26 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
27   %val0 = load <4 x half>, ptr addrspace(1) %arg0
28   %val1 = load <4 x half>, ptr addrspace(1) %arg1
29   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef>
30   ret <4 x half> %shuffle
33 define <4 x half> @shuffle_v4f16_234u(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
34 ; GFX9-LABEL: shuffle_v4f16_234u:
35 ; GFX9:       ; %bb.0:
36 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
37 ; GFX9-NEXT:    global_load_dword v6, v[0:1], off offset:4
38 ; GFX9-NEXT:    global_load_dwordx2 v[4:5], v[2:3], off
39 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
40 ; GFX9-NEXT:    v_mov_b32_e32 v0, v6
41 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
42 ; GFX9-NEXT:    v_mov_b32_e32 v1, v4
43 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
45 ; GFX10-LABEL: shuffle_v4f16_234u:
46 ; GFX10:       ; %bb.0:
47 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
48 ; GFX10-NEXT:    global_load_dword v6, v[0:1], off offset:4
49 ; GFX10-NEXT:    global_load_dwordx2 v[4:5], v[2:3], off
50 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
51 ; GFX10-NEXT:    v_mov_b32_e32 v0, v6
52 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
53 ; GFX10-NEXT:    v_mov_b32_e32 v1, v4
54 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
56 ; GFX11-LABEL: shuffle_v4f16_234u:
57 ; GFX11:       ; %bb.0:
58 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
59 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:4
60 ; GFX11-NEXT:    global_load_b64 v[1:2], v[2:3], off
61 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
62 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
63   %val0 = load <4 x half>, ptr addrspace(1) %arg0
64   %val1 = load <4 x half>, ptr addrspace(1) %arg1
65   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 2, i32 3, i32 4, i32 undef>
66   ret <4 x half> %shuffle
69 define <4 x half> @shuffle_v4f16_u1u3(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
70 ; GFX9-LABEL: shuffle_v4f16_u1u3:
71 ; GFX9:       ; %bb.0:
72 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
73 ; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
74 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
75 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
77 ; GFX10-LABEL: shuffle_v4f16_u1u3:
78 ; GFX10:       ; %bb.0:
79 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
80 ; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
81 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
82 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
84 ; GFX11-LABEL: shuffle_v4f16_u1u3:
85 ; GFX11:       ; %bb.0:
86 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
87 ; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off
88 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
89 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
90   %val0 = load <4 x half>, ptr addrspace(1) %arg0
91   %val1 = load <4 x half>, ptr addrspace(1) %arg1
92   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 undef, i32 1, i32 undef, i32 3>
93   ret <4 x half> %shuffle
96 define <4 x half> @shuffle_v4f16_u3u1(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
97 ; GFX9-LABEL: shuffle_v4f16_u3u1:
98 ; GFX9:       ; %bb.0:
99 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
100 ; GFX9-NEXT:    global_load_dwordx2 v[1:2], v[0:1], off
101 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
102 ; GFX9-NEXT:    v_mov_b32_e32 v0, v2
103 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
105 ; GFX10-LABEL: shuffle_v4f16_u3u1:
106 ; GFX10:       ; %bb.0:
107 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
108 ; GFX10-NEXT:    global_load_dwordx2 v[1:2], v[0:1], off
109 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
110 ; GFX10-NEXT:    v_mov_b32_e32 v0, v2
111 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
113 ; GFX11-LABEL: shuffle_v4f16_u3u1:
114 ; GFX11:       ; %bb.0:
115 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
116 ; GFX11-NEXT:    global_load_b64 v[1:2], v[0:1], off
117 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
118 ; GFX11-NEXT:    v_mov_b32_e32 v0, v2
119 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
120   %val0 = load <4 x half>, ptr addrspace(1) %arg0
121   %val1 = load <4 x half>, ptr addrspace(1) %arg1
122   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 undef, i32 3, i32 undef, i32 1>
123   ret <4 x half> %shuffle
126 define <4 x half> @shuffle_v4f16_u3uu(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
127 ; GFX9-LABEL: shuffle_v4f16_u3uu:
128 ; GFX9:       ; %bb.0:
129 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
130 ; GFX9-NEXT:    global_load_dword v0, v[0:1], off offset:4
131 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
132 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
134 ; GFX10-LABEL: shuffle_v4f16_u3uu:
135 ; GFX10:       ; %bb.0:
136 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
137 ; GFX10-NEXT:    global_load_dword v0, v[0:1], off offset:4
138 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
139 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
141 ; GFX11-LABEL: shuffle_v4f16_u3uu:
142 ; GFX11:       ; %bb.0:
143 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
144 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:4
145 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
146 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
147   %val0 = load <4 x half>, ptr addrspace(1) %arg0
148   %val1 = load <4 x half>, ptr addrspace(1) %arg1
149   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 undef, i32 3, i32 undef, i32 undef>
150   ret <4 x half> %shuffle
153 define <4 x half> @shuffle_v4f16_3u6u(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
154 ; GFX9-LABEL: shuffle_v4f16_3u6u:
155 ; GFX9:       ; %bb.0:
156 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
157 ; GFX9-NEXT:    global_load_dword v5, v[0:1], off offset:4
158 ; GFX9-NEXT:    global_load_dword v4, v[2:3], off offset:4
159 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
160 ; GFX9-NEXT:    v_alignbit_b32 v0, s4, v5, 16
161 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
162 ; GFX9-NEXT:    v_mov_b32_e32 v1, v4
163 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
165 ; GFX10-LABEL: shuffle_v4f16_3u6u:
166 ; GFX10:       ; %bb.0:
167 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
168 ; GFX10-NEXT:    global_load_dword v5, v[0:1], off offset:4
169 ; GFX10-NEXT:    global_load_dword v4, v[2:3], off offset:4
170 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
171 ; GFX10-NEXT:    v_alignbit_b32 v0, s4, v5, 16
172 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
173 ; GFX10-NEXT:    v_mov_b32_e32 v1, v4
174 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
176 ; GFX11-LABEL: shuffle_v4f16_3u6u:
177 ; GFX11:       ; %bb.0:
178 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
179 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:4
180 ; GFX11-NEXT:    global_load_b32 v1, v[2:3], off offset:4
181 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
182 ; GFX11-NEXT:    v_alignbit_b32 v0, s0, v0, 16
183 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
184 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
185   %val0 = load <4 x half>, ptr addrspace(1) %arg0
186   %val1 = load <4 x half>, ptr addrspace(1) %arg1
187   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 3, i32 undef, i32 6, i32 undef>
188   ret <4 x half> %shuffle
191 define <4 x half> @shuffle_v4f16_3uu7(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
192 ; GFX9-LABEL: shuffle_v4f16_3uu7:
193 ; GFX9:       ; %bb.0:
194 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
195 ; GFX9-NEXT:    global_load_dword v5, v[0:1], off offset:4
196 ; GFX9-NEXT:    global_load_dword v4, v[2:3], off offset:4
197 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
198 ; GFX9-NEXT:    v_alignbit_b32 v0, s4, v5, 16
199 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
200 ; GFX9-NEXT:    v_mov_b32_e32 v1, v4
201 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
203 ; GFX10-LABEL: shuffle_v4f16_3uu7:
204 ; GFX10:       ; %bb.0:
205 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
206 ; GFX10-NEXT:    global_load_dword v5, v[0:1], off offset:4
207 ; GFX10-NEXT:    global_load_dword v4, v[2:3], off offset:4
208 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
209 ; GFX10-NEXT:    v_alignbit_b32 v0, s4, v5, 16
210 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
211 ; GFX10-NEXT:    v_mov_b32_e32 v1, v4
212 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
214 ; GFX11-LABEL: shuffle_v4f16_3uu7:
215 ; GFX11:       ; %bb.0:
216 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
217 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:4
218 ; GFX11-NEXT:    global_load_b32 v1, v[2:3], off offset:4
219 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
220 ; GFX11-NEXT:    v_alignbit_b32 v0, s0, v0, 16
221 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
222 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
223   %val0 = load <4 x half>, ptr addrspace(1) %arg0
224   %val1 = load <4 x half>, ptr addrspace(1) %arg1
225   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 3, i32 undef, i32 undef, i32 7>
226   ret <4 x half> %shuffle
229 define <4 x half> @shuffle_v4f16_35u5(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
230 ; GFX9-LABEL: shuffle_v4f16_35u5:
231 ; GFX9:       ; %bb.0:
232 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
233 ; GFX9-NEXT:    global_load_dword v5, v[0:1], off offset:4
234 ; GFX9-NEXT:    global_load_dword v4, v[2:3], off
235 ; GFX9-NEXT:    s_mov_b32 s4, 0x7060302
236 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
237 ; GFX9-NEXT:    v_perm_b32 v0, v4, v5, s4
238 ; GFX9-NEXT:    v_mov_b32_e32 v1, v4
239 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
241 ; GFX10-LABEL: shuffle_v4f16_35u5:
242 ; GFX10:       ; %bb.0:
243 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
244 ; GFX10-NEXT:    global_load_dword v5, v[0:1], off offset:4
245 ; GFX10-NEXT:    global_load_dword v4, v[2:3], off
246 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
247 ; GFX10-NEXT:    v_perm_b32 v0, v4, v5, 0x7060302
248 ; GFX10-NEXT:    v_mov_b32_e32 v1, v4
249 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
251 ; GFX11-LABEL: shuffle_v4f16_35u5:
252 ; GFX11:       ; %bb.0:
253 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
254 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:4
255 ; GFX11-NEXT:    global_load_b32 v1, v[2:3], off
256 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
257 ; GFX11-NEXT:    v_perm_b32 v0, v1, v0, 0x7060302
258 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
259   %val0 = load <4 x half>, ptr addrspace(1) %arg0
260   %val1 = load <4 x half>, ptr addrspace(1) %arg1
261   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 3, i32 5, i32 undef, i32 5>
262   ret <4 x half> %shuffle
265 define <4 x half> @shuffle_v4f16_357u(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
266 ; GFX9-LABEL: shuffle_v4f16_357u:
267 ; GFX9:       ; %bb.0:
268 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
269 ; GFX9-NEXT:    global_load_dwordx2 v[4:5], v[2:3], off
270 ; GFX9-NEXT:    global_load_dword v6, v[0:1], off offset:4
271 ; GFX9-NEXT:    s_mov_b32 s4, 0x7060302
272 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
273 ; GFX9-NEXT:    v_alignbit_b32 v1, s4, v5, 16
274 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
275 ; GFX9-NEXT:    v_perm_b32 v0, v4, v6, s4
276 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
278 ; GFX10-LABEL: shuffle_v4f16_357u:
279 ; GFX10:       ; %bb.0:
280 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
281 ; GFX10-NEXT:    global_load_dwordx2 v[4:5], v[2:3], off
282 ; GFX10-NEXT:    global_load_dword v6, v[0:1], off offset:4
283 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
284 ; GFX10-NEXT:    v_alignbit_b32 v1, s4, v5, 16
285 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
286 ; GFX10-NEXT:    v_perm_b32 v0, v4, v6, 0x7060302
287 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
289 ; GFX11-LABEL: shuffle_v4f16_357u:
290 ; GFX11:       ; %bb.0:
291 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
292 ; GFX11-NEXT:    global_load_b64 v[2:3], v[2:3], off
293 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:4
294 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
295 ; GFX11-NEXT:    v_alignbit_b32 v1, s0, v3, 16
296 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
297 ; GFX11-NEXT:    v_perm_b32 v0, v2, v0, 0x7060302
298 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
299   %val0 = load <4 x half>, ptr addrspace(1) %arg0
300   %val1 = load <4 x half>, ptr addrspace(1) %arg1
301   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 3, i32 5, i32 7, i32 undef>
302   ret <4 x half> %shuffle
305 define <4 x half> @shuffle_v4f16_0101(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
306 ; GFX9-LABEL: shuffle_v4f16_0101:
307 ; GFX9:       ; %bb.0:
308 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
309 ; GFX9-NEXT:    global_load_dword v0, v[0:1], off
310 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
311 ; GFX9-NEXT:    v_mov_b32_e32 v1, v0
312 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
314 ; GFX10-LABEL: shuffle_v4f16_0101:
315 ; GFX10:       ; %bb.0:
316 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
317 ; GFX10-NEXT:    global_load_dword v0, v[0:1], off
318 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
319 ; GFX10-NEXT:    v_mov_b32_e32 v1, v0
320 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
322 ; GFX11-LABEL: shuffle_v4f16_0101:
323 ; GFX11:       ; %bb.0:
324 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
325 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off
326 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
327 ; GFX11-NEXT:    v_mov_b32_e32 v1, v0
328 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
329   %val0 = load <4 x half>, ptr addrspace(1) %arg0
330   %val1 = load <4 x half>, ptr addrspace(1) %arg1
331   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 0, i32 1, i32 0, i32 1>
332   ret <4 x half> %shuffle
335 define <4 x half> @shuffle_v4f16_0123(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
336 ; GFX9-LABEL: shuffle_v4f16_0123:
337 ; GFX9:       ; %bb.0:
338 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
339 ; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
340 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
341 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
343 ; GFX10-LABEL: shuffle_v4f16_0123:
344 ; GFX10:       ; %bb.0:
345 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
346 ; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
347 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
348 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
350 ; GFX11-LABEL: shuffle_v4f16_0123:
351 ; GFX11:       ; %bb.0:
352 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
353 ; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off
354 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
355 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
356   %val0 = load <4 x half>, ptr addrspace(1) %arg0
357   %val1 = load <4 x half>, ptr addrspace(1) %arg1
358   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
359   ret <4 x half> %shuffle
362 define <4 x half> @shuffle_v4f16_0145(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
363 ; GFX9-LABEL: shuffle_v4f16_0145:
364 ; GFX9:       ; %bb.0:
365 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
366 ; GFX9-NEXT:    global_load_dword v4, v[0:1], off
367 ; GFX9-NEXT:    global_load_dword v5, v[2:3], off
368 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
369 ; GFX9-NEXT:    v_mov_b32_e32 v0, v4
370 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
371 ; GFX9-NEXT:    v_mov_b32_e32 v1, v5
372 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
374 ; GFX10-LABEL: shuffle_v4f16_0145:
375 ; GFX10:       ; %bb.0:
376 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
377 ; GFX10-NEXT:    global_load_dword v4, v[0:1], off
378 ; GFX10-NEXT:    global_load_dword v5, v[2:3], off
379 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
380 ; GFX10-NEXT:    v_mov_b32_e32 v0, v4
381 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
382 ; GFX10-NEXT:    v_mov_b32_e32 v1, v5
383 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
385 ; GFX11-LABEL: shuffle_v4f16_0145:
386 ; GFX11:       ; %bb.0:
387 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
388 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off
389 ; GFX11-NEXT:    global_load_b32 v1, v[2:3], off
390 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
391 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
392   %val0 = load <4 x half>, ptr addrspace(1) %arg0
393   %val1 = load <4 x half>, ptr addrspace(1) %arg1
394   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 0, i32 1, i32 4, i32 5>
395   ret <4 x half> %shuffle
398 define <4 x half> @shuffle_v4f16_0167(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
399 ; GFX9-LABEL: shuffle_v4f16_0167:
400 ; GFX9:       ; %bb.0:
401 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
402 ; GFX9-NEXT:    global_load_dword v4, v[0:1], off
403 ; GFX9-NEXT:    global_load_dword v5, v[2:3], off offset:4
404 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
405 ; GFX9-NEXT:    v_mov_b32_e32 v0, v4
406 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
407 ; GFX9-NEXT:    v_mov_b32_e32 v1, v5
408 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
410 ; GFX10-LABEL: shuffle_v4f16_0167:
411 ; GFX10:       ; %bb.0:
412 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
413 ; GFX10-NEXT:    global_load_dword v4, v[0:1], off
414 ; GFX10-NEXT:    global_load_dword v5, v[2:3], off offset:4
415 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
416 ; GFX10-NEXT:    v_mov_b32_e32 v0, v4
417 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
418 ; GFX10-NEXT:    v_mov_b32_e32 v1, v5
419 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
421 ; GFX11-LABEL: shuffle_v4f16_0167:
422 ; GFX11:       ; %bb.0:
423 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
424 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off
425 ; GFX11-NEXT:    global_load_b32 v1, v[2:3], off offset:4
426 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
427 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
428   %val0 = load <4 x half>, ptr addrspace(1) %arg0
429   %val1 = load <4 x half>, ptr addrspace(1) %arg1
430   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
431   ret <4 x half> %shuffle
434 define <4 x half> @shuffle_v4f16_2301(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
435 ; GFX9-LABEL: shuffle_v4f16_2301:
436 ; GFX9:       ; %bb.0:
437 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
438 ; GFX9-NEXT:    global_load_dwordx2 v[1:2], v[0:1], off
439 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
440 ; GFX9-NEXT:    v_mov_b32_e32 v0, v2
441 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
443 ; GFX10-LABEL: shuffle_v4f16_2301:
444 ; GFX10:       ; %bb.0:
445 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
446 ; GFX10-NEXT:    global_load_dwordx2 v[1:2], v[0:1], off
447 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
448 ; GFX10-NEXT:    v_mov_b32_e32 v0, v2
449 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
451 ; GFX11-LABEL: shuffle_v4f16_2301:
452 ; GFX11:       ; %bb.0:
453 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
454 ; GFX11-NEXT:    global_load_b64 v[1:2], v[0:1], off
455 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
456 ; GFX11-NEXT:    v_mov_b32_e32 v0, v2
457 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
458   %val0 = load <4 x half>, ptr addrspace(1) %arg0
459   %val1 = load <4 x half>, ptr addrspace(1) %arg1
460   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 2, i32 3, i32 0, i32 1>
461   ret <4 x half> %shuffle
464 define <4 x half> @shuffle_v4f16_2323(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
465 ; GFX9-LABEL: shuffle_v4f16_2323:
466 ; GFX9:       ; %bb.0:
467 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
468 ; GFX9-NEXT:    global_load_dword v0, v[0:1], off offset:4
469 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
470 ; GFX9-NEXT:    v_mov_b32_e32 v1, v0
471 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
473 ; GFX10-LABEL: shuffle_v4f16_2323:
474 ; GFX10:       ; %bb.0:
475 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
476 ; GFX10-NEXT:    global_load_dword v0, v[0:1], off offset:4
477 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
478 ; GFX10-NEXT:    v_mov_b32_e32 v1, v0
479 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
481 ; GFX11-LABEL: shuffle_v4f16_2323:
482 ; GFX11:       ; %bb.0:
483 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
484 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:4
485 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
486 ; GFX11-NEXT:    v_mov_b32_e32 v1, v0
487 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
488   %val0 = load <4 x half>, ptr addrspace(1) %arg0
489   %val1 = load <4 x half>, ptr addrspace(1) %arg1
490   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 2, i32 3, i32 2, i32 3>
491   ret <4 x half> %shuffle
494 define <4 x half> @shuffle_v4f16_2345(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
495 ; GFX9-LABEL: shuffle_v4f16_2345:
496 ; GFX9:       ; %bb.0:
497 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
498 ; GFX9-NEXT:    global_load_dword v4, v[0:1], off offset:4
499 ; GFX9-NEXT:    global_load_dword v5, v[2:3], off
500 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
501 ; GFX9-NEXT:    v_mov_b32_e32 v0, v4
502 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
503 ; GFX9-NEXT:    v_mov_b32_e32 v1, v5
504 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
506 ; GFX10-LABEL: shuffle_v4f16_2345:
507 ; GFX10:       ; %bb.0:
508 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
509 ; GFX10-NEXT:    global_load_dword v4, v[0:1], off offset:4
510 ; GFX10-NEXT:    global_load_dword v5, v[2:3], off
511 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
512 ; GFX10-NEXT:    v_mov_b32_e32 v0, v4
513 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
514 ; GFX10-NEXT:    v_mov_b32_e32 v1, v5
515 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
517 ; GFX11-LABEL: shuffle_v4f16_2345:
518 ; GFX11:       ; %bb.0:
519 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
520 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:4
521 ; GFX11-NEXT:    global_load_b32 v1, v[2:3], off
522 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
523 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
524   %val0 = load <4 x half>, ptr addrspace(1) %arg0
525   %val1 = load <4 x half>, ptr addrspace(1) %arg1
526   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 2, i32 3, i32 4, i32 5>
527   ret <4 x half> %shuffle
530 define <4 x half> @shuffle_v4f16_2367(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
531 ; GFX9-LABEL: shuffle_v4f16_2367:
532 ; GFX9:       ; %bb.0:
533 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
534 ; GFX9-NEXT:    global_load_dword v4, v[0:1], off offset:4
535 ; GFX9-NEXT:    global_load_dword v5, v[2:3], off offset:4
536 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
537 ; GFX9-NEXT:    v_mov_b32_e32 v0, v4
538 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
539 ; GFX9-NEXT:    v_mov_b32_e32 v1, v5
540 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
542 ; GFX10-LABEL: shuffle_v4f16_2367:
543 ; GFX10:       ; %bb.0:
544 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
545 ; GFX10-NEXT:    global_load_dword v4, v[0:1], off offset:4
546 ; GFX10-NEXT:    global_load_dword v5, v[2:3], off offset:4
547 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
548 ; GFX10-NEXT:    v_mov_b32_e32 v0, v4
549 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
550 ; GFX10-NEXT:    v_mov_b32_e32 v1, v5
551 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
553 ; GFX11-LABEL: shuffle_v4f16_2367:
554 ; GFX11:       ; %bb.0:
555 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
556 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:4
557 ; GFX11-NEXT:    global_load_b32 v1, v[2:3], off offset:4
558 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
559 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
560   %val0 = load <4 x half>, ptr addrspace(1) %arg0
561   %val1 = load <4 x half>, ptr addrspace(1) %arg1
562   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 2, i32 3, i32 6, i32 7>
563   ret <4 x half> %shuffle
566 define <4 x half> @shuffle_v4f16_4501(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
567 ; GFX9-LABEL: shuffle_v4f16_4501:
568 ; GFX9:       ; %bb.0:
569 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
570 ; GFX9-NEXT:    global_load_dword v4, v[2:3], off
571 ; GFX9-NEXT:    global_load_dword v5, v[0:1], off
572 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
573 ; GFX9-NEXT:    v_mov_b32_e32 v0, v4
574 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
575 ; GFX9-NEXT:    v_mov_b32_e32 v1, v5
576 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
578 ; GFX10-LABEL: shuffle_v4f16_4501:
579 ; GFX10:       ; %bb.0:
580 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
581 ; GFX10-NEXT:    global_load_dword v4, v[2:3], off
582 ; GFX10-NEXT:    global_load_dword v5, v[0:1], off
583 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
584 ; GFX10-NEXT:    v_mov_b32_e32 v0, v4
585 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
586 ; GFX10-NEXT:    v_mov_b32_e32 v1, v5
587 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
589 ; GFX11-LABEL: shuffle_v4f16_4501:
590 ; GFX11:       ; %bb.0:
591 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
592 ; GFX11-NEXT:    global_load_b32 v2, v[2:3], off
593 ; GFX11-NEXT:    global_load_b32 v1, v[0:1], off
594 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
595 ; GFX11-NEXT:    v_mov_b32_e32 v0, v2
596 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
597 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
598   %val0 = load <4 x half>, ptr addrspace(1) %arg0
599   %val1 = load <4 x half>, ptr addrspace(1) %arg1
600   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
601   ret <4 x half> %shuffle
604 define <4 x half> @shuffle_v4f16_4523(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
605 ; GFX9-LABEL: shuffle_v4f16_4523:
606 ; GFX9:       ; %bb.0:
607 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
608 ; GFX9-NEXT:    global_load_dword v4, v[2:3], off
609 ; GFX9-NEXT:    global_load_dword v5, v[0:1], off offset:4
610 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
611 ; GFX9-NEXT:    v_mov_b32_e32 v0, v4
612 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
613 ; GFX9-NEXT:    v_mov_b32_e32 v1, v5
614 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
616 ; GFX10-LABEL: shuffle_v4f16_4523:
617 ; GFX10:       ; %bb.0:
618 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
619 ; GFX10-NEXT:    global_load_dword v4, v[2:3], off
620 ; GFX10-NEXT:    global_load_dword v5, v[0:1], off offset:4
621 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
622 ; GFX10-NEXT:    v_mov_b32_e32 v0, v4
623 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
624 ; GFX10-NEXT:    v_mov_b32_e32 v1, v5
625 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
627 ; GFX11-LABEL: shuffle_v4f16_4523:
628 ; GFX11:       ; %bb.0:
629 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
630 ; GFX11-NEXT:    global_load_b32 v2, v[2:3], off
631 ; GFX11-NEXT:    global_load_b32 v1, v[0:1], off offset:4
632 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
633 ; GFX11-NEXT:    v_mov_b32_e32 v0, v2
634 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
635 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
636   %val0 = load <4 x half>, ptr addrspace(1) %arg0
637   %val1 = load <4 x half>, ptr addrspace(1) %arg1
638   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 4, i32 5, i32 2, i32 3>
639   ret <4 x half> %shuffle
642 define <4 x half> @shuffle_v4f16_4545(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
643 ; GFX9-LABEL: shuffle_v4f16_4545:
644 ; GFX9:       ; %bb.0:
645 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
646 ; GFX9-NEXT:    global_load_dword v0, v[2:3], off
647 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
648 ; GFX9-NEXT:    v_mov_b32_e32 v1, v0
649 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
651 ; GFX10-LABEL: shuffle_v4f16_4545:
652 ; GFX10:       ; %bb.0:
653 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
654 ; GFX10-NEXT:    global_load_dword v0, v[2:3], off
655 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
656 ; GFX10-NEXT:    v_mov_b32_e32 v1, v0
657 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
659 ; GFX11-LABEL: shuffle_v4f16_4545:
660 ; GFX11:       ; %bb.0:
661 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
662 ; GFX11-NEXT:    global_load_b32 v0, v[2:3], off
663 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
664 ; GFX11-NEXT:    v_mov_b32_e32 v1, v0
665 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
666   %val0 = load <4 x half>, ptr addrspace(1) %arg0
667   %val1 = load <4 x half>, ptr addrspace(1) %arg1
668   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 4, i32 5, i32 4, i32 5>
669   ret <4 x half> %shuffle
672 define <4 x half> @shuffle_v4f16_4567(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
673 ; GFX9-LABEL: shuffle_v4f16_4567:
674 ; GFX9:       ; %bb.0:
675 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
676 ; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[2:3], off
677 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
678 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
680 ; GFX10-LABEL: shuffle_v4f16_4567:
681 ; GFX10:       ; %bb.0:
682 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
683 ; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[2:3], off
684 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
685 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
687 ; GFX11-LABEL: shuffle_v4f16_4567:
688 ; GFX11:       ; %bb.0:
689 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
690 ; GFX11-NEXT:    global_load_b64 v[0:1], v[2:3], off
691 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
692 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
693   %val0 = load <4 x half>, ptr addrspace(1) %arg0
694   %val1 = load <4 x half>, ptr addrspace(1) %arg1
695   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
696   ret <4 x half> %shuffle
699 define <4 x half> @shuffle_v4f16_6701(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
700 ; GFX9-LABEL: shuffle_v4f16_6701:
701 ; GFX9:       ; %bb.0:
702 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
703 ; GFX9-NEXT:    global_load_dword v4, v[2:3], off offset:4
704 ; GFX9-NEXT:    global_load_dword v5, v[0:1], off
705 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
706 ; GFX9-NEXT:    v_mov_b32_e32 v0, v4
707 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
708 ; GFX9-NEXT:    v_mov_b32_e32 v1, v5
709 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
711 ; GFX10-LABEL: shuffle_v4f16_6701:
712 ; GFX10:       ; %bb.0:
713 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
714 ; GFX10-NEXT:    global_load_dword v4, v[2:3], off offset:4
715 ; GFX10-NEXT:    global_load_dword v5, v[0:1], off
716 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
717 ; GFX10-NEXT:    v_mov_b32_e32 v0, v4
718 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
719 ; GFX10-NEXT:    v_mov_b32_e32 v1, v5
720 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
722 ; GFX11-LABEL: shuffle_v4f16_6701:
723 ; GFX11:       ; %bb.0:
724 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
725 ; GFX11-NEXT:    global_load_b32 v2, v[2:3], off offset:4
726 ; GFX11-NEXT:    global_load_b32 v1, v[0:1], off
727 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
728 ; GFX11-NEXT:    v_mov_b32_e32 v0, v2
729 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
730 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
731   %val0 = load <4 x half>, ptr addrspace(1) %arg0
732   %val1 = load <4 x half>, ptr addrspace(1) %arg1
733   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 6, i32 7, i32 0, i32 1>
734   ret <4 x half> %shuffle
737 define <4 x half> @shuffle_v4f16_6723(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
738 ; GFX9-LABEL: shuffle_v4f16_6723:
739 ; GFX9:       ; %bb.0:
740 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
741 ; GFX9-NEXT:    global_load_dword v4, v[2:3], off offset:4
742 ; GFX9-NEXT:    global_load_dword v5, v[0:1], off offset:4
743 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
744 ; GFX9-NEXT:    v_mov_b32_e32 v0, v4
745 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
746 ; GFX9-NEXT:    v_mov_b32_e32 v1, v5
747 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
749 ; GFX10-LABEL: shuffle_v4f16_6723:
750 ; GFX10:       ; %bb.0:
751 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
752 ; GFX10-NEXT:    global_load_dword v4, v[2:3], off offset:4
753 ; GFX10-NEXT:    global_load_dword v5, v[0:1], off offset:4
754 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
755 ; GFX10-NEXT:    v_mov_b32_e32 v0, v4
756 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
757 ; GFX10-NEXT:    v_mov_b32_e32 v1, v5
758 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
760 ; GFX11-LABEL: shuffle_v4f16_6723:
761 ; GFX11:       ; %bb.0:
762 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
763 ; GFX11-NEXT:    global_load_b32 v2, v[2:3], off offset:4
764 ; GFX11-NEXT:    global_load_b32 v1, v[0:1], off offset:4
765 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
766 ; GFX11-NEXT:    v_mov_b32_e32 v0, v2
767 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
768 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
769   %val0 = load <4 x half>, ptr addrspace(1) %arg0
770   %val1 = load <4 x half>, ptr addrspace(1) %arg1
771   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 6, i32 7, i32 2, i32 3>
772   ret <4 x half> %shuffle
775 define <4 x half> @shuffle_v4f16_6745(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
776 ; GFX9-LABEL: shuffle_v4f16_6745:
777 ; GFX9:       ; %bb.0:
778 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
779 ; GFX9-NEXT:    global_load_dwordx2 v[1:2], v[2:3], off
780 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
781 ; GFX9-NEXT:    v_mov_b32_e32 v0, v2
782 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
784 ; GFX10-LABEL: shuffle_v4f16_6745:
785 ; GFX10:       ; %bb.0:
786 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
787 ; GFX10-NEXT:    global_load_dwordx2 v[1:2], v[2:3], off
788 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
789 ; GFX10-NEXT:    v_mov_b32_e32 v0, v2
790 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
792 ; GFX11-LABEL: shuffle_v4f16_6745:
793 ; GFX11:       ; %bb.0:
794 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
795 ; GFX11-NEXT:    global_load_b64 v[1:2], v[2:3], off
796 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
797 ; GFX11-NEXT:    v_mov_b32_e32 v0, v2
798 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
799   %val0 = load <4 x half>, ptr addrspace(1) %arg0
800   %val1 = load <4 x half>, ptr addrspace(1) %arg1
801   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 6, i32 7, i32 4, i32 5>
802   ret <4 x half> %shuffle
805 define <4 x half> @shuffle_v4f16_6767(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
806 ; GFX9-LABEL: shuffle_v4f16_6767:
807 ; GFX9:       ; %bb.0:
808 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
809 ; GFX9-NEXT:    global_load_dword v0, v[2:3], off offset:4
810 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
811 ; GFX9-NEXT:    v_mov_b32_e32 v1, v0
812 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
814 ; GFX10-LABEL: shuffle_v4f16_6767:
815 ; GFX10:       ; %bb.0:
816 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
817 ; GFX10-NEXT:    global_load_dword v0, v[2:3], off offset:4
818 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
819 ; GFX10-NEXT:    v_mov_b32_e32 v1, v0
820 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
822 ; GFX11-LABEL: shuffle_v4f16_6767:
823 ; GFX11:       ; %bb.0:
824 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
825 ; GFX11-NEXT:    global_load_b32 v0, v[2:3], off offset:4
826 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
827 ; GFX11-NEXT:    v_mov_b32_e32 v1, v0
828 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
829   %val0 = load <4 x half>, ptr addrspace(1) %arg0
830   %val1 = load <4 x half>, ptr addrspace(1) %arg1
831   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 6, i32 7, i32 6, i32 7>
832   ret <4 x half> %shuffle
835 define <4 x half> @shuffle_v4f16_2356(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
836 ; GFX9-LABEL: shuffle_v4f16_2356:
837 ; GFX9:       ; %bb.0:
838 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
839 ; GFX9-NEXT:    global_load_dwordx2 v[5:6], v[2:3], off
840 ; GFX9-NEXT:    global_load_dword v4, v[0:1], off offset:4
841 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
842 ; GFX9-NEXT:    v_alignbit_b32 v1, v6, v5, 16
843 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
844 ; GFX9-NEXT:    v_mov_b32_e32 v0, v4
845 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
847 ; GFX10-LABEL: shuffle_v4f16_2356:
848 ; GFX10:       ; %bb.0:
849 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
850 ; GFX10-NEXT:    global_load_dwordx2 v[5:6], v[2:3], off
851 ; GFX10-NEXT:    global_load_dword v4, v[0:1], off offset:4
852 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
853 ; GFX10-NEXT:    v_alignbit_b32 v1, v6, v5, 16
854 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
855 ; GFX10-NEXT:    v_mov_b32_e32 v0, v4
856 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
858 ; GFX11-LABEL: shuffle_v4f16_2356:
859 ; GFX11:       ; %bb.0:
860 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
861 ; GFX11-NEXT:    global_load_b64 v[2:3], v[2:3], off
862 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:4
863 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
864 ; GFX11-NEXT:    v_alignbit_b32 v1, v3, v2, 16
865 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
866 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
867   %val0 = load <4 x half>, ptr addrspace(1) %arg0
868   %val1 = load <4 x half>, ptr addrspace(1) %arg1
869   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 2, i32 3, i32 5, i32 6>
870   ret <4 x half> %shuffle
873 define <4 x half> @shuffle_v4f16_5623(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
874 ; GFX9-LABEL: shuffle_v4f16_5623:
875 ; GFX9:       ; %bb.0:
876 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
877 ; GFX9-NEXT:    global_load_dwordx2 v[5:6], v[2:3], off
878 ; GFX9-NEXT:    global_load_dword v4, v[0:1], off offset:4
879 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
880 ; GFX9-NEXT:    v_alignbit_b32 v0, v6, v5, 16
881 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
882 ; GFX9-NEXT:    v_mov_b32_e32 v1, v4
883 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
885 ; GFX10-LABEL: shuffle_v4f16_5623:
886 ; GFX10:       ; %bb.0:
887 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
888 ; GFX10-NEXT:    global_load_dwordx2 v[5:6], v[2:3], off
889 ; GFX10-NEXT:    global_load_dword v4, v[0:1], off offset:4
890 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
891 ; GFX10-NEXT:    v_alignbit_b32 v0, v6, v5, 16
892 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
893 ; GFX10-NEXT:    v_mov_b32_e32 v1, v4
894 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
896 ; GFX11-LABEL: shuffle_v4f16_5623:
897 ; GFX11:       ; %bb.0:
898 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
899 ; GFX11-NEXT:    global_load_b64 v[2:3], v[2:3], off
900 ; GFX11-NEXT:    global_load_b32 v1, v[0:1], off offset:4
901 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
902 ; GFX11-NEXT:    v_alignbit_b32 v0, v3, v2, 16
903 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
904 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
905   %val0 = load <4 x half>, ptr addrspace(1) %arg0
906   %val1 = load <4 x half>, ptr addrspace(1) %arg1
907   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 5, i32 6, i32 2, i32 3>
908   ret <4 x half> %shuffle
911 define <4 x half> @shuffle_v4f16_3456(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
912 ; GFX9-LABEL: shuffle_v4f16_3456:
913 ; GFX9:       ; %bb.0:
914 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
915 ; GFX9-NEXT:    global_load_dwordx2 v[4:5], v[2:3], off
916 ; GFX9-NEXT:    global_load_dword v6, v[0:1], off offset:4
917 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
918 ; GFX9-NEXT:    v_alignbit_b32 v1, v5, v4, 16
919 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
920 ; GFX9-NEXT:    v_alignbit_b32 v0, v4, v6, 16
921 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
923 ; GFX10-LABEL: shuffle_v4f16_3456:
924 ; GFX10:       ; %bb.0:
925 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
926 ; GFX10-NEXT:    global_load_dwordx2 v[4:5], v[2:3], off
927 ; GFX10-NEXT:    global_load_dword v6, v[0:1], off offset:4
928 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
929 ; GFX10-NEXT:    v_alignbit_b32 v1, v5, v4, 16
930 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
931 ; GFX10-NEXT:    v_alignbit_b32 v0, v4, v6, 16
932 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
934 ; GFX11-LABEL: shuffle_v4f16_3456:
935 ; GFX11:       ; %bb.0:
936 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
937 ; GFX11-NEXT:    global_load_b64 v[2:3], v[2:3], off
938 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:4
939 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
940 ; GFX11-NEXT:    v_alignbit_b32 v1, v3, v2, 16
941 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
942 ; GFX11-NEXT:    v_alignbit_b32 v0, v2, v0, 16
943 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
944   %val0 = load <4 x half>, ptr addrspace(1) %arg0
945   %val1 = load <4 x half>, ptr addrspace(1) %arg1
946   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 3, i32 4, i32 5, i32 6>
947   ret <4 x half> %shuffle
950 define <4 x half> @shuffle_v4f16_5634(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
951 ; GFX9-LABEL: shuffle_v4f16_5634:
952 ; GFX9:       ; %bb.0:
953 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
954 ; GFX9-NEXT:    global_load_dwordx2 v[4:5], v[2:3], off
955 ; GFX9-NEXT:    global_load_dword v6, v[0:1], off offset:4
956 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
957 ; GFX9-NEXT:    v_alignbit_b32 v0, v5, v4, 16
958 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
959 ; GFX9-NEXT:    v_alignbit_b32 v1, v4, v6, 16
960 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
962 ; GFX10-LABEL: shuffle_v4f16_5634:
963 ; GFX10:       ; %bb.0:
964 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
965 ; GFX10-NEXT:    global_load_dwordx2 v[4:5], v[2:3], off
966 ; GFX10-NEXT:    global_load_dword v6, v[0:1], off offset:4
967 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
968 ; GFX10-NEXT:    v_alignbit_b32 v0, v5, v4, 16
969 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
970 ; GFX10-NEXT:    v_alignbit_b32 v1, v4, v6, 16
971 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
973 ; GFX11-LABEL: shuffle_v4f16_5634:
974 ; GFX11:       ; %bb.0:
975 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
976 ; GFX11-NEXT:    global_load_b64 v[2:3], v[2:3], off
977 ; GFX11-NEXT:    global_load_b32 v1, v[0:1], off offset:4
978 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
979 ; GFX11-NEXT:    v_alignbit_b32 v0, v3, v2, 16
980 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
981 ; GFX11-NEXT:    v_alignbit_b32 v1, v2, v1, 16
982 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
983   %val0 = load <4 x half>, ptr addrspace(1) %arg0
984   %val1 = load <4 x half>, ptr addrspace(1) %arg1
985   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 5, i32 6, i32 3, i32 4>
986   ret <4 x half> %shuffle
989 define <4 x half> @shuffle_v4f16_5734(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
990 ; GFX9-LABEL: shuffle_v4f16_5734:
991 ; GFX9:       ; %bb.0:
992 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
993 ; GFX9-NEXT:    global_load_dwordx2 v[4:5], v[2:3], off
994 ; GFX9-NEXT:    global_load_dword v6, v[0:1], off offset:4
995 ; GFX9-NEXT:    s_mov_b32 s4, 0x7060302
996 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
997 ; GFX9-NEXT:    v_perm_b32 v0, v5, v4, s4
998 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
999 ; GFX9-NEXT:    v_alignbit_b32 v1, v4, v6, 16
1000 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1002 ; GFX10-LABEL: shuffle_v4f16_5734:
1003 ; GFX10:       ; %bb.0:
1004 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1005 ; GFX10-NEXT:    global_load_dwordx2 v[4:5], v[2:3], off
1006 ; GFX10-NEXT:    global_load_dword v6, v[0:1], off offset:4
1007 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
1008 ; GFX10-NEXT:    v_perm_b32 v0, v5, v4, 0x7060302
1009 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1010 ; GFX10-NEXT:    v_alignbit_b32 v1, v4, v6, 16
1011 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1013 ; GFX11-LABEL: shuffle_v4f16_5734:
1014 ; GFX11:       ; %bb.0:
1015 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1016 ; GFX11-NEXT:    global_load_b64 v[2:3], v[2:3], off
1017 ; GFX11-NEXT:    global_load_b32 v1, v[0:1], off offset:4
1018 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
1019 ; GFX11-NEXT:    v_perm_b32 v0, v3, v2, 0x7060302
1020 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1021 ; GFX11-NEXT:    v_alignbit_b32 v1, v2, v1, 16
1022 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1023   %val0 = load <4 x half>, ptr addrspace(1) %arg0
1024   %val1 = load <4 x half>, ptr addrspace(1) %arg1
1025   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 5, i32 7, i32 3, i32 4>
1026   ret <4 x half> %shuffle
1029 define <4 x i16> @shuffle_v4i16_2356(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
1030 ; GFX9-LABEL: shuffle_v4i16_2356:
1031 ; GFX9:       ; %bb.0:
1032 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1033 ; GFX9-NEXT:    global_load_dwordx2 v[5:6], v[2:3], off
1034 ; GFX9-NEXT:    global_load_dword v4, v[0:1], off offset:4
1035 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
1036 ; GFX9-NEXT:    v_alignbit_b32 v1, v6, v5, 16
1037 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1038 ; GFX9-NEXT:    v_mov_b32_e32 v0, v4
1039 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1041 ; GFX10-LABEL: shuffle_v4i16_2356:
1042 ; GFX10:       ; %bb.0:
1043 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1044 ; GFX10-NEXT:    global_load_dwordx2 v[5:6], v[2:3], off
1045 ; GFX10-NEXT:    global_load_dword v4, v[0:1], off offset:4
1046 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
1047 ; GFX10-NEXT:    v_alignbit_b32 v1, v6, v5, 16
1048 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1049 ; GFX10-NEXT:    v_mov_b32_e32 v0, v4
1050 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1052 ; GFX11-LABEL: shuffle_v4i16_2356:
1053 ; GFX11:       ; %bb.0:
1054 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1055 ; GFX11-NEXT:    global_load_b64 v[2:3], v[2:3], off
1056 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:4
1057 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
1058 ; GFX11-NEXT:    v_alignbit_b32 v1, v3, v2, 16
1059 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1060 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1061   %val0 = load <4 x i16>, ptr addrspace(1) %arg0
1062   %val1 = load <4 x i16>, ptr addrspace(1) %arg1
1063   %shuffle = shufflevector <4 x i16> %val0, <4 x i16> %val1, <4 x i32> <i32 2, i32 3, i32 5, i32 6>
1064   ret <4 x i16> %shuffle
1067 define <4 x i16> @shuffle_v4i16_0167(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
1068 ; GFX9-LABEL: shuffle_v4i16_0167:
1069 ; GFX9:       ; %bb.0:
1070 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1071 ; GFX9-NEXT:    global_load_dword v4, v[0:1], off
1072 ; GFX9-NEXT:    global_load_dword v5, v[2:3], off offset:4
1073 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
1074 ; GFX9-NEXT:    v_mov_b32_e32 v0, v4
1075 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1076 ; GFX9-NEXT:    v_mov_b32_e32 v1, v5
1077 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1079 ; GFX10-LABEL: shuffle_v4i16_0167:
1080 ; GFX10:       ; %bb.0:
1081 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1082 ; GFX10-NEXT:    global_load_dword v4, v[0:1], off
1083 ; GFX10-NEXT:    global_load_dword v5, v[2:3], off offset:4
1084 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
1085 ; GFX10-NEXT:    v_mov_b32_e32 v0, v4
1086 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1087 ; GFX10-NEXT:    v_mov_b32_e32 v1, v5
1088 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1090 ; GFX11-LABEL: shuffle_v4i16_0167:
1091 ; GFX11:       ; %bb.0:
1092 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1093 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off
1094 ; GFX11-NEXT:    global_load_b32 v1, v[2:3], off offset:4
1095 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1096 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1097   %val0 = load <4 x i16>, ptr addrspace(1) %arg0
1098   %val1 = load <4 x i16>, ptr addrspace(1) %arg1
1099   %shuffle = shufflevector <4 x i16> %val0, <4 x i16> %val1, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1100   ret <4 x i16> %shuffle
1103 define <4 x half> @shuffle_v4f16_0000(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
1104 ; GFX9-LABEL: shuffle_v4f16_0000:
1105 ; GFX9:       ; %bb.0:
1106 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1107 ; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1108 ; GFX9-NEXT:    s_mov_b32 s4, 0x5040100
1109 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1110 ; GFX9-NEXT:    v_perm_b32 v0, v0, v0, s4
1111 ; GFX9-NEXT:    v_mov_b32_e32 v1, v0
1112 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1114 ; GFX10-LABEL: shuffle_v4f16_0000:
1115 ; GFX10:       ; %bb.0:
1116 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1117 ; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1118 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1119 ; GFX10-NEXT:    v_perm_b32 v0, v0, v0, 0x5040100
1120 ; GFX10-NEXT:    v_mov_b32_e32 v1, v0
1121 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1123 ; GFX11-LABEL: shuffle_v4f16_0000:
1124 ; GFX11:       ; %bb.0:
1125 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1126 ; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off
1127 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1128 ; GFX11-NEXT:    v_perm_b32 v0, v0, v0, 0x5040100
1129 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1130 ; GFX11-NEXT:    v_mov_b32_e32 v1, v0
1131 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1132   %val0 = load <4 x half>, ptr addrspace(1) %arg0
1133   %val1 = load <4 x half>, ptr addrspace(1) %arg1
1134   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> zeroinitializer
1135   ret <4 x half> %shuffle
1138 define <4 x half> @shuffle_v4f16_1010(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
1139 ; GFX9-LABEL: shuffle_v4f16_1010:
1140 ; GFX9:       ; %bb.0:
1141 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1142 ; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1143 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1144 ; GFX9-NEXT:    v_alignbit_b32 v0, v0, v0, 16
1145 ; GFX9-NEXT:    v_mov_b32_e32 v1, v0
1146 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1148 ; GFX10-LABEL: shuffle_v4f16_1010:
1149 ; GFX10:       ; %bb.0:
1150 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1151 ; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1152 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1153 ; GFX10-NEXT:    v_alignbit_b32 v0, v0, v0, 16
1154 ; GFX10-NEXT:    v_mov_b32_e32 v1, v0
1155 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1157 ; GFX11-LABEL: shuffle_v4f16_1010:
1158 ; GFX11:       ; %bb.0:
1159 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1160 ; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off
1161 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1162 ; GFX11-NEXT:    v_alignbit_b32 v0, v0, v0, 16
1163 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1164 ; GFX11-NEXT:    v_mov_b32_e32 v1, v0
1165 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1166   %val0 = load <4 x half>, ptr addrspace(1) %arg0
1167   %val1 = load <4 x half>, ptr addrspace(1) %arg1
1168   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 1, i32 0, i32 1, i32 0>
1169   ret <4 x half> %shuffle
1172 define <4 x half> @shuffle_v4f16_1100(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
1173 ; GFX9-LABEL: shuffle_v4f16_1100:
1174 ; GFX9:       ; %bb.0:
1175 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1176 ; GFX9-NEXT:    global_load_dwordx2 v[1:2], v[0:1], off
1177 ; GFX9-NEXT:    s_mov_b32 s4, 0x7060302
1178 ; GFX9-NEXT:    s_mov_b32 s5, 0x5040100
1179 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1180 ; GFX9-NEXT:    v_perm_b32 v0, v1, v1, s4
1181 ; GFX9-NEXT:    v_perm_b32 v1, v1, v1, s5
1182 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1184 ; GFX10-LABEL: shuffle_v4f16_1100:
1185 ; GFX10:       ; %bb.0:
1186 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1187 ; GFX10-NEXT:    global_load_dwordx2 v[1:2], v[0:1], off
1188 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1189 ; GFX10-NEXT:    v_perm_b32 v0, v1, v1, 0x7060302
1190 ; GFX10-NEXT:    v_perm_b32 v1, v1, v1, 0x5040100
1191 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1193 ; GFX11-LABEL: shuffle_v4f16_1100:
1194 ; GFX11:       ; %bb.0:
1195 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1196 ; GFX11-NEXT:    global_load_b64 v[1:2], v[0:1], off
1197 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1198 ; GFX11-NEXT:    v_perm_b32 v0, v1, v1, 0x7060302
1199 ; GFX11-NEXT:    v_perm_b32 v1, v1, v1, 0x5040100
1200 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1201   %val0 = load <4 x half>, ptr addrspace(1) %arg0
1202   %val1 = load <4 x half>, ptr addrspace(1) %arg1
1203   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 1, i32 1, i32 0, i32 0>
1204   ret <4 x half> %shuffle
1207 define <4 x half> @shuffle_v4f16_6161(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
1208 ; GFX9-LABEL: shuffle_v4f16_6161:
1209 ; GFX9:       ; %bb.0:
1210 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1211 ; GFX9-NEXT:    global_load_dword v4, v[0:1], off
1212 ; GFX9-NEXT:    global_load_dword v5, v[2:3], off offset:4
1213 ; GFX9-NEXT:    s_mov_b32 s4, 0xffff
1214 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1215 ; GFX9-NEXT:    v_bfi_b32 v0, s4, v5, v4
1216 ; GFX9-NEXT:    v_mov_b32_e32 v1, v0
1217 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1219 ; GFX10-LABEL: shuffle_v4f16_6161:
1220 ; GFX10:       ; %bb.0:
1221 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1222 ; GFX10-NEXT:    global_load_dword v4, v[0:1], off
1223 ; GFX10-NEXT:    global_load_dword v5, v[2:3], off offset:4
1224 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1225 ; GFX10-NEXT:    v_bfi_b32 v0, 0xffff, v5, v4
1226 ; GFX10-NEXT:    v_mov_b32_e32 v1, v0
1227 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1229 ; GFX11-LABEL: shuffle_v4f16_6161:
1230 ; GFX11:       ; %bb.0:
1231 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1232 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off
1233 ; GFX11-NEXT:    global_load_b32 v1, v[2:3], off offset:4
1234 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1235 ; GFX11-NEXT:    v_bfi_b32 v0, 0xffff, v1, v0
1236 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1237 ; GFX11-NEXT:    v_mov_b32_e32 v1, v0
1238 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1239   %val0 = load <4 x half>, ptr addrspace(1) %arg0
1240   %val1 = load <4 x half>, ptr addrspace(1) %arg1
1241   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 6, i32 1, i32 6, i32 1>
1242   ret <4 x half> %shuffle
1245 define <4 x half> @shuffle_v4f16_2333(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
1246 ; GFX9-LABEL: shuffle_v4f16_2333:
1247 ; GFX9:       ; %bb.0:
1248 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1249 ; GFX9-NEXT:    global_load_dword v0, v[0:1], off offset:4
1250 ; GFX9-NEXT:    s_mov_b32 s4, 0x7060302
1251 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1252 ; GFX9-NEXT:    v_perm_b32 v1, v0, v0, s4
1253 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1255 ; GFX10-LABEL: shuffle_v4f16_2333:
1256 ; GFX10:       ; %bb.0:
1257 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1258 ; GFX10-NEXT:    global_load_dword v0, v[0:1], off offset:4
1259 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1260 ; GFX10-NEXT:    v_perm_b32 v1, v0, v0, 0x7060302
1261 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1263 ; GFX11-LABEL: shuffle_v4f16_2333:
1264 ; GFX11:       ; %bb.0:
1265 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1266 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:4
1267 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1268 ; GFX11-NEXT:    v_perm_b32 v1, v0, v0, 0x7060302
1269 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1270   %val0 = load <4 x half>, ptr addrspace(1) %arg0
1271   %val1 = load <4 x half>, ptr addrspace(1) %arg1
1272   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 2, i32 3, i32 3, i32 3>
1273   ret <4 x half> %shuffle
1276 define <4 x half> @shuffle_v4f16_6667(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
1277 ; GFX9-LABEL: shuffle_v4f16_6667:
1278 ; GFX9:       ; %bb.0:
1279 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1280 ; GFX9-NEXT:    global_load_dword v0, v[0:1], off offset:4
1281 ; GFX9-NEXT:    s_mov_b32 s4, 0x7060302
1282 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1283 ; GFX9-NEXT:    v_perm_b32 v1, v0, v0, s4
1284 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1286 ; GFX10-LABEL: shuffle_v4f16_6667:
1287 ; GFX10:       ; %bb.0:
1288 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1289 ; GFX10-NEXT:    global_load_dword v0, v[0:1], off offset:4
1290 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1291 ; GFX10-NEXT:    v_perm_b32 v1, v0, v0, 0x7060302
1292 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1294 ; GFX11-LABEL: shuffle_v4f16_6667:
1295 ; GFX11:       ; %bb.0:
1296 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1297 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:4
1298 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1299 ; GFX11-NEXT:    v_perm_b32 v1, v0, v0, 0x7060302
1300 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1301   %val0 = load <4 x half>, ptr addrspace(1) %arg0
1302   %val1 = load <4 x half>, ptr addrspace(1) %arg1
1303   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 2, i32 3, i32 3, i32 3>
1304   ret <4 x half> %shuffle
1307 define <4 x half> @shuffle_v8f16_0101(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
1308 ; GFX9-LABEL: shuffle_v8f16_0101:
1309 ; GFX9:       ; %bb.0:
1310 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1311 ; GFX9-NEXT:    global_load_dword v0, v[0:1], off
1312 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1313 ; GFX9-NEXT:    v_mov_b32_e32 v1, v0
1314 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1316 ; GFX10-LABEL: shuffle_v8f16_0101:
1317 ; GFX10:       ; %bb.0:
1318 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1319 ; GFX10-NEXT:    global_load_dword v0, v[0:1], off
1320 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1321 ; GFX10-NEXT:    v_mov_b32_e32 v1, v0
1322 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1324 ; GFX11-LABEL: shuffle_v8f16_0101:
1325 ; GFX11:       ; %bb.0:
1326 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1327 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off
1328 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1329 ; GFX11-NEXT:    v_mov_b32_e32 v1, v0
1330 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1331   %val0 = load <8 x half>, ptr addrspace(1) %arg0
1332   %val1 = load <8 x half>, ptr addrspace(1) %arg1
1333   %shuffle = shufflevector <8 x half> %val0, <8 x half> %val1, <4 x i32> <i32 0, i32 1, i32 0, i32 1>
1334   ret <4 x half> %shuffle
1337 define <4 x half> @shuffle_v8f16_0123(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
1338 ; GFX9-LABEL: shuffle_v8f16_0123:
1339 ; GFX9:       ; %bb.0:
1340 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1341 ; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1342 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1343 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1345 ; GFX10-LABEL: shuffle_v8f16_0123:
1346 ; GFX10:       ; %bb.0:
1347 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1348 ; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1349 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1350 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1352 ; GFX11-LABEL: shuffle_v8f16_0123:
1353 ; GFX11:       ; %bb.0:
1354 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1355 ; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off
1356 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1357 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1358   %val0 = load <8 x half>, ptr addrspace(1) %arg0
1359   %val1 = load <8 x half>, ptr addrspace(1) %arg1
1360   %shuffle = shufflevector <8 x half> %val0, <8 x half> %val1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1361   ret <4 x half> %shuffle
1364 define <4 x half> @shuffle_v8f16_4589(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
1365 ; GFX9-LABEL: shuffle_v8f16_4589:
1366 ; GFX9:       ; %bb.0:
1367 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1368 ; GFX9-NEXT:    global_load_dword v4, v[0:1], off offset:8
1369 ; GFX9-NEXT:    global_load_dword v5, v[2:3], off
1370 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
1371 ; GFX9-NEXT:    v_mov_b32_e32 v0, v4
1372 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1373 ; GFX9-NEXT:    v_mov_b32_e32 v1, v5
1374 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1376 ; GFX10-LABEL: shuffle_v8f16_4589:
1377 ; GFX10:       ; %bb.0:
1378 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1379 ; GFX10-NEXT:    global_load_dword v4, v[0:1], off offset:8
1380 ; GFX10-NEXT:    global_load_dword v5, v[2:3], off
1381 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
1382 ; GFX10-NEXT:    v_mov_b32_e32 v0, v4
1383 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1384 ; GFX10-NEXT:    v_mov_b32_e32 v1, v5
1385 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1387 ; GFX11-LABEL: shuffle_v8f16_4589:
1388 ; GFX11:       ; %bb.0:
1389 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1390 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:8
1391 ; GFX11-NEXT:    global_load_b32 v1, v[2:3], off
1392 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1393 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1394   %val0 = load <8 x half>, ptr addrspace(1) %arg0
1395   %val1 = load <8 x half>, ptr addrspace(1) %arg1
1396   %shuffle = shufflevector <8 x half> %val0, <8 x half> %val1, <4 x i32> <i32 4, i32 5, i32 8, i32 9>
1397   ret <4 x half> %shuffle
1400 define <4 x half> @shuffle_v8f16_10_11_2_3(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
1401 ; GFX9-LABEL: shuffle_v8f16_10_11_2_3:
1402 ; GFX9:       ; %bb.0:
1403 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1404 ; GFX9-NEXT:    global_load_dword v4, v[2:3], off offset:4
1405 ; GFX9-NEXT:    global_load_dword v5, v[0:1], off offset:4
1406 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
1407 ; GFX9-NEXT:    v_mov_b32_e32 v0, v4
1408 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1409 ; GFX9-NEXT:    v_mov_b32_e32 v1, v5
1410 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1412 ; GFX10-LABEL: shuffle_v8f16_10_11_2_3:
1413 ; GFX10:       ; %bb.0:
1414 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1415 ; GFX10-NEXT:    global_load_dword v4, v[2:3], off offset:4
1416 ; GFX10-NEXT:    global_load_dword v5, v[0:1], off offset:4
1417 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
1418 ; GFX10-NEXT:    v_mov_b32_e32 v0, v4
1419 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1420 ; GFX10-NEXT:    v_mov_b32_e32 v1, v5
1421 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1423 ; GFX11-LABEL: shuffle_v8f16_10_11_2_3:
1424 ; GFX11:       ; %bb.0:
1425 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1426 ; GFX11-NEXT:    global_load_b32 v2, v[2:3], off offset:4
1427 ; GFX11-NEXT:    global_load_b32 v1, v[0:1], off offset:4
1428 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
1429 ; GFX11-NEXT:    v_mov_b32_e32 v0, v2
1430 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1431 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1432   %val0 = load <8 x half>, ptr addrspace(1) %arg0
1433   %val1 = load <8 x half>, ptr addrspace(1) %arg1
1434   %shuffle = shufflevector <8 x half> %val0, <8 x half> %val1, <4 x i32> <i32 10, i32 11, i32 2, i32 3>
1435   ret <4 x half> %shuffle
1438 define <4 x half> @shuffle_v8f16_13_14_2_3(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
1439 ; GFX9-LABEL: shuffle_v8f16_13_14_2_3:
1440 ; GFX9:       ; %bb.0:
1441 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1442 ; GFX9-NEXT:    global_load_dwordx2 v[5:6], v[2:3], off offset:8
1443 ; GFX9-NEXT:    global_load_dword v4, v[0:1], off offset:4
1444 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
1445 ; GFX9-NEXT:    v_alignbit_b32 v0, v6, v5, 16
1446 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1447 ; GFX9-NEXT:    v_mov_b32_e32 v1, v4
1448 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1450 ; GFX10-LABEL: shuffle_v8f16_13_14_2_3:
1451 ; GFX10:       ; %bb.0:
1452 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1453 ; GFX10-NEXT:    global_load_dwordx2 v[5:6], v[2:3], off offset:8
1454 ; GFX10-NEXT:    global_load_dword v4, v[0:1], off offset:4
1455 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
1456 ; GFX10-NEXT:    v_alignbit_b32 v0, v6, v5, 16
1457 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1458 ; GFX10-NEXT:    v_mov_b32_e32 v1, v4
1459 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1461 ; GFX11-LABEL: shuffle_v8f16_13_14_2_3:
1462 ; GFX11:       ; %bb.0:
1463 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1464 ; GFX11-NEXT:    global_load_b64 v[2:3], v[2:3], off offset:8
1465 ; GFX11-NEXT:    global_load_b32 v1, v[0:1], off offset:4
1466 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
1467 ; GFX11-NEXT:    v_alignbit_b32 v0, v3, v2, 16
1468 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1469 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1470   %val0 = load <8 x half>, ptr addrspace(1) %arg0
1471   %val1 = load <8 x half>, ptr addrspace(1) %arg1
1472   %shuffle = shufflevector <8 x half> %val0, <8 x half> %val1, <4 x i32> <i32 13, i32 14, i32 2, i32 3>
1473   ret <4 x half> %shuffle
1476 define <4 x half> @shuffle_v3f16_0122(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
1477 ; GFX9-LABEL: shuffle_v3f16_0122:
1478 ; GFX9:       ; %bb.0:
1479 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1480 ; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1481 ; GFX9-NEXT:    s_mov_b32 s4, 0x5040100
1482 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1483 ; GFX9-NEXT:    v_perm_b32 v1, v1, v1, s4
1484 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1486 ; GFX10-LABEL: shuffle_v3f16_0122:
1487 ; GFX10:       ; %bb.0:
1488 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1489 ; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
1490 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1491 ; GFX10-NEXT:    v_perm_b32 v1, v1, v1, 0x5040100
1492 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1494 ; GFX11-LABEL: shuffle_v3f16_0122:
1495 ; GFX11:       ; %bb.0:
1496 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1497 ; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off
1498 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1499 ; GFX11-NEXT:    v_perm_b32 v1, v1, v1, 0x5040100
1500 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1501   %val0 = load <3 x half>, ptr addrspace(1) %arg0
1502   %val1 = load <3 x half>, ptr addrspace(1) %arg1
1503   %shuffle = shufflevector <3 x half> %val0, <3 x half> %val1, <4 x i32> <i32 0, i32 1, i32 2, i32 2>
1504   ret <4 x half> %shuffle
1507 define <4 x half> @shuffle_v2f16_0122(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
1508 ; GFX9-LABEL: shuffle_v2f16_0122:
1509 ; GFX9:       ; %bb.0:
1510 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1511 ; GFX9-NEXT:    global_load_dword v0, v[0:1], off
1512 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1513 ; GFX9-NEXT:    v_alignbit_b32 v1, v0, v0, 16
1514 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1516 ; GFX10-LABEL: shuffle_v2f16_0122:
1517 ; GFX10:       ; %bb.0:
1518 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1519 ; GFX10-NEXT:    global_load_dword v0, v[0:1], off
1520 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1521 ; GFX10-NEXT:    v_alignbit_b32 v1, v0, v0, 16
1522 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1524 ; GFX11-LABEL: shuffle_v2f16_0122:
1525 ; GFX11:       ; %bb.0:
1526 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1527 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off
1528 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1529 ; GFX11-NEXT:    v_alignbit_b32 v1, v0, v0, 16
1530 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1531   %val0 = load <2 x half>, ptr addrspace(1) %arg0
1532   %val1 = load <2 x half>, ptr addrspace(1) %arg1
1533   %shuffle = shufflevector <2 x half> %val0, <2 x half> %val1, <4 x i32> <i32 0, i32 1, i32 1, i32 0>
1534   ret <4 x half> %shuffle
1537 define <6 x half> @shuffle_v6f16_452367(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
1538 ; GFX9-LABEL: shuffle_v6f16_452367:
1539 ; GFX9:       ; %bb.0:
1540 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1541 ; GFX9-NEXT:    v_mov_b32_e32 v6, v1
1542 ; GFX9-NEXT:    v_mov_b32_e32 v5, v0
1543 ; GFX9-NEXT:    v_mov_b32_e32 v4, v3
1544 ; GFX9-NEXT:    v_mov_b32_e32 v3, v2
1545 ; GFX9-NEXT:    global_load_dwordx3 v[0:2], v[5:6], off
1546 ; GFX9-NEXT:    global_load_dword v7, v[3:4], off
1547 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
1548 ; GFX9-NEXT:    v_mov_b32_e32 v0, v2
1549 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1550 ; GFX9-NEXT:    v_mov_b32_e32 v2, v7
1551 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1553 ; GFX10-LABEL: shuffle_v6f16_452367:
1554 ; GFX10:       ; %bb.0:
1555 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1556 ; GFX10-NEXT:    v_mov_b32_e32 v6, v1
1557 ; GFX10-NEXT:    v_mov_b32_e32 v5, v0
1558 ; GFX10-NEXT:    v_mov_b32_e32 v4, v3
1559 ; GFX10-NEXT:    v_mov_b32_e32 v3, v2
1560 ; GFX10-NEXT:    global_load_dwordx3 v[0:2], v[5:6], off
1561 ; GFX10-NEXT:    global_load_dword v7, v[3:4], off
1562 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
1563 ; GFX10-NEXT:    v_mov_b32_e32 v0, v2
1564 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1565 ; GFX10-NEXT:    v_mov_b32_e32 v2, v7
1566 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1568 ; GFX11-LABEL: shuffle_v6f16_452367:
1569 ; GFX11:       ; %bb.0:
1570 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1571 ; GFX11-NEXT:    v_dual_mov_b32 v4, v3 :: v_dual_mov_b32 v3, v2
1572 ; GFX11-NEXT:    global_load_b96 v[0:2], v[0:1], off
1573 ; GFX11-NEXT:    global_load_b32 v3, v[3:4], off
1574 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
1575 ; GFX11-NEXT:    v_mov_b32_e32 v0, v2
1576 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1577 ; GFX11-NEXT:    v_mov_b32_e32 v2, v3
1578 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1579   %val0 = load <6 x half>, ptr addrspace(1) %arg0
1580   %val1 = load <6 x half>, ptr addrspace(1) %arg1
1581   %shuffle = shufflevector <6 x half> %val0, <6 x half> %val1, <6 x i32> <i32 4, i32 5, i32 2, i32 3, i32 6, i32 7>
1582   ret <6 x half> %shuffle
1585 define amdgpu_kernel void @fma_shuffle_v2f16(ptr addrspace(1) nocapture readonly %A, ptr addrspace(1) nocapture readonly %B, ptr addrspace(1) nocapture %C)  {
1586 ; GFX9-LABEL: fma_shuffle_v2f16:
1587 ; GFX9:       ; %bb.0: ; %entry
1588 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[6:7], 0x0
1589 ; GFX9-NEXT:    s_load_dwordx2 s[4:5], s[6:7], 0x10
1590 ; GFX9-NEXT:    v_lshlrev_b32_e32 v6, 3, v0
1591 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1592 ; GFX9-NEXT:    global_load_dwordx2 v[0:1], v6, s[0:1]
1593 ; GFX9-NEXT:    global_load_dwordx2 v[2:3], v6, s[2:3]
1594 ; GFX9-NEXT:    global_load_dwordx2 v[4:5], v6, s[4:5]
1595 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1596 ; GFX9-NEXT:    v_pk_fma_f16 v4, v0, v2, v4 op_sel_hi:[0,1,1]
1597 ; GFX9-NEXT:    v_pk_fma_f16 v2, v1, v2, v5 op_sel_hi:[0,1,1]
1598 ; GFX9-NEXT:    v_pk_fma_f16 v0, v0, v3, v4 op_sel:[1,0,0]
1599 ; GFX9-NEXT:    v_pk_fma_f16 v1, v1, v3, v2 op_sel:[1,0,0]
1600 ; GFX9-NEXT:    global_store_dwordx2 v6, v[0:1], s[4:5]
1601 ; GFX9-NEXT:    s_endpgm
1603 ; GFX10-LABEL: fma_shuffle_v2f16:
1604 ; GFX10:       ; %bb.0: ; %entry
1605 ; GFX10-NEXT:    s_clause 0x1
1606 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[6:7], 0x0
1607 ; GFX10-NEXT:    s_load_dwordx2 s[4:5], s[6:7], 0x10
1608 ; GFX10-NEXT:    v_lshlrev_b32_e32 v6, 3, v0
1609 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1610 ; GFX10-NEXT:    s_clause 0x2
1611 ; GFX10-NEXT:    global_load_dwordx2 v[0:1], v6, s[0:1]
1612 ; GFX10-NEXT:    global_load_dwordx2 v[2:3], v6, s[2:3]
1613 ; GFX10-NEXT:    global_load_dwordx2 v[4:5], v6, s[4:5]
1614 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1615 ; GFX10-NEXT:    v_pk_fma_f16 v4, v0, v2, v4 op_sel_hi:[0,1,1]
1616 ; GFX10-NEXT:    v_pk_fma_f16 v2, v1, v2, v5 op_sel_hi:[0,1,1]
1617 ; GFX10-NEXT:    v_pk_fma_f16 v0, v0, v3, v4 op_sel:[1,0,0]
1618 ; GFX10-NEXT:    v_pk_fma_f16 v1, v1, v3, v2 op_sel:[1,0,0]
1619 ; GFX10-NEXT:    global_store_dwordx2 v6, v[0:1], s[4:5]
1620 ; GFX10-NEXT:    s_endpgm
1622 ; GFX11-LABEL: fma_shuffle_v2f16:
1623 ; GFX11:       ; %bb.0: ; %entry
1624 ; GFX11-NEXT:    s_clause 0x1
1625 ; GFX11-NEXT:    s_load_b128 s[4:7], s[2:3], 0x0
1626 ; GFX11-NEXT:    s_load_b64 s[0:1], s[2:3], 0x10
1627 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
1628 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1629 ; GFX11-NEXT:    v_lshlrev_b32_e32 v6, 3, v0
1630 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1631 ; GFX11-NEXT:    s_clause 0x2
1632 ; GFX11-NEXT:    global_load_b64 v[0:1], v6, s[4:5]
1633 ; GFX11-NEXT:    global_load_b64 v[2:3], v6, s[6:7]
1634 ; GFX11-NEXT:    global_load_b64 v[4:5], v6, s[0:1]
1635 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1636 ; GFX11-NEXT:    v_pk_fma_f16 v4, v0, v2, v4 op_sel_hi:[0,1,1]
1637 ; GFX11-NEXT:    v_pk_fma_f16 v2, v1, v2, v5 op_sel_hi:[0,1,1]
1638 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1639 ; GFX11-NEXT:    v_pk_fma_f16 v0, v0, v3, v4 op_sel:[1,0,0]
1640 ; GFX11-NEXT:    v_pk_fma_f16 v1, v1, v3, v2 op_sel:[1,0,0]
1641 ; GFX11-NEXT:    global_store_b64 v6, v[0:1], s[0:1]
1642 ; GFX11-NEXT:    s_nop 0
1643 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1644 ; GFX11-NEXT:    s_endpgm
1645 entry:
1646   %tmp1 = tail call i32 @llvm.amdgcn.workitem.id.x()
1647   %tmp12 = zext i32 %tmp1 to i64
1648   %arrayidx = getelementptr inbounds <4 x half>, ptr addrspace(1) %A, i64 %tmp12
1649   %tmp14 = load <4 x half>, ptr addrspace(1) %arrayidx, align 8
1650   %arrayidx1 = getelementptr inbounds <4 x half>, ptr addrspace(1) %B, i64 %tmp12
1651   %tmp15 = load <4 x half>, ptr addrspace(1) %arrayidx1, align 8
1652   %arrayidx2 = getelementptr inbounds <4 x half>, ptr addrspace(1) %C, i64 %tmp12
1653   %tmp16 = load <4 x half>, ptr addrspace(1) %arrayidx2, align 8
1654   %tmp17 = shufflevector <4 x half> %tmp14, <4 x half> undef, <2 x i32> zeroinitializer
1655   %tmp18 = shufflevector <4 x half> %tmp15, <4 x half> undef, <2 x i32> <i32 0, i32 1>
1656   %tmp19 = shufflevector <4 x half> %tmp16, <4 x half> undef, <2 x i32> <i32 0, i32 1>
1657   %tmp20 = tail call <2 x half> @llvm.fma.v2f16(<2 x half> %tmp17, <2 x half> %tmp18, <2 x half> %tmp19)
1658   %tmp21 = shufflevector <4 x half> %tmp14, <4 x half> undef, <2 x i32> <i32 1, i32 1>
1659   %tmp22 = shufflevector <4 x half> %tmp15, <4 x half> undef, <2 x i32> <i32 2, i32 3>
1660   %tmp23 = tail call <2 x half> @llvm.fma.v2f16(<2 x half> %tmp21, <2 x half> %tmp22, <2 x half> %tmp20)
1661   %tmp24 = shufflevector <2 x half> %tmp23, <2 x half> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1662   %tmp25 = shufflevector <4 x half> %tmp24, <4 x half> %tmp16, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1663   %tmp26 = shufflevector <4 x half> %tmp14, <4 x half> undef, <2 x i32> <i32 2, i32 2>
1664   %tmp27 = shufflevector <4 x half> %tmp25, <4 x half> undef, <2 x i32> <i32 2, i32 3>
1665   %tmp28 = tail call <2 x half> @llvm.fma.v2f16(<2 x half> %tmp26, <2 x half> %tmp18, <2 x half> %tmp27)
1666   %tmp29 = shufflevector <4 x half> %tmp14, <4 x half> undef, <2 x i32> <i32 3, i32 3>
1667   %tmp30 = tail call <2 x half> @llvm.fma.v2f16(<2 x half> %tmp29, <2 x half> %tmp22, <2 x half> %tmp28)
1668   %tmp31 = shufflevector <2 x half> %tmp30, <2 x half> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1669   %tmp32 = shufflevector <4 x half> %tmp25, <4 x half> %tmp31, <4 x i32> <i32 0, i32 1, i32 4, i32 5>
1670   store <4 x half> %tmp32, ptr addrspace(1) %arrayidx2, align 8
1671   ret void
1674 define <4 x half> @shuffle_v4f16_0456(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
1675 ; GFX9-LABEL: shuffle_v4f16_0456:
1676 ; GFX9:       ; %bb.0:
1677 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1678 ; GFX9-NEXT:    global_load_dwordx2 v[4:5], v[0:1], off
1679 ; GFX9-NEXT:    global_load_dwordx2 v[5:6], v[2:3], off
1680 ; GFX9-NEXT:    s_mov_b32 s4, 0x5040100
1681 ; GFX9-NEXT:    ; kill: killed $vgpr0 killed $vgpr1
1682 ; GFX9-NEXT:    ; kill: killed $vgpr2 killed $vgpr3
1683 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1684 ; GFX9-NEXT:    v_perm_b32 v0, v5, v4, s4
1685 ; GFX9-NEXT:    v_alignbit_b32 v1, v6, v5, 16
1686 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1688 ; GFX10-LABEL: shuffle_v4f16_0456:
1689 ; GFX10:       ; %bb.0:
1690 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1691 ; GFX10-NEXT:    global_load_dwordx2 v[4:5], v[0:1], off
1692 ; GFX10-NEXT:    global_load_dwordx2 v[5:6], v[2:3], off
1693 ; GFX10-NEXT:    ; kill: killed $vgpr0 killed $vgpr1
1694 ; GFX10-NEXT:    ; kill: killed $vgpr2 killed $vgpr3
1695 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1696 ; GFX10-NEXT:    v_perm_b32 v0, v5, v4, 0x5040100
1697 ; GFX10-NEXT:    v_alignbit_b32 v1, v6, v5, 16
1698 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1700 ; GFX11-LABEL: shuffle_v4f16_0456:
1701 ; GFX11:       ; %bb.0:
1702 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1703 ; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off
1704 ; GFX11-NEXT:    global_load_b64 v[1:2], v[2:3], off
1705 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1706 ; GFX11-NEXT:    v_perm_b32 v0, v1, v0, 0x5040100
1707 ; GFX11-NEXT:    v_alignbit_b32 v1, v2, v1, 16
1708 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1709   %val0 = load <4 x half>, ptr addrspace(1) %arg0
1710   %val1 = load <4 x half>, ptr addrspace(1) %arg1
1711   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <4 x i32> <i32 0, i32 4, i32 5, i32 6>
1712   ret <4 x half> %shuffle
1715 define amdgpu_kernel void @shuffle_scalar_load_v8i32_0123(ptr addrspace(4) %in, ptr addrspace(1) %out)  {
1716 ; GFX9-LABEL: shuffle_scalar_load_v8i32_0123:
1717 ; GFX9:       ; %bb.0:
1718 ; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[6:7], 0x0
1719 ; GFX9-NEXT:    v_mov_b32_e32 v4, 0
1720 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1721 ; GFX9-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x0
1722 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
1723 ; GFX9-NEXT:    v_mov_b32_e32 v0, s4
1724 ; GFX9-NEXT:    v_mov_b32_e32 v1, s5
1725 ; GFX9-NEXT:    v_mov_b32_e32 v2, s6
1726 ; GFX9-NEXT:    v_mov_b32_e32 v3, s7
1727 ; GFX9-NEXT:    global_store_dwordx4 v4, v[0:3], s[2:3]
1728 ; GFX9-NEXT:    s_endpgm
1730 ; GFX10-LABEL: shuffle_scalar_load_v8i32_0123:
1731 ; GFX10:       ; %bb.0:
1732 ; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[6:7], 0x0
1733 ; GFX10-NEXT:    v_mov_b32_e32 v4, 0
1734 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1735 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x0
1736 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1737 ; GFX10-NEXT:    v_mov_b32_e32 v0, s4
1738 ; GFX10-NEXT:    v_mov_b32_e32 v1, s5
1739 ; GFX10-NEXT:    v_mov_b32_e32 v2, s6
1740 ; GFX10-NEXT:    v_mov_b32_e32 v3, s7
1741 ; GFX10-NEXT:    global_store_dwordx4 v4, v[0:3], s[2:3]
1742 ; GFX10-NEXT:    s_endpgm
1744 ; GFX11-LABEL: shuffle_scalar_load_v8i32_0123:
1745 ; GFX11:       ; %bb.0:
1746 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x0
1747 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1748 ; GFX11-NEXT:    s_load_b128 s[4:7], s[0:1], 0x0
1749 ; GFX11-NEXT:    v_mov_b32_e32 v4, 0
1750 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1751 ; GFX11-NEXT:    v_dual_mov_b32 v0, s4 :: v_dual_mov_b32 v3, s7
1752 ; GFX11-NEXT:    v_dual_mov_b32 v1, s5 :: v_dual_mov_b32 v2, s6
1753 ; GFX11-NEXT:    global_store_b128 v4, v[0:3], s[2:3]
1754 ; GFX11-NEXT:    s_nop 0
1755 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1756 ; GFX11-NEXT:    s_endpgm
1757   %ld8 = load <8 x i32>, ptr addrspace(4) %in, align 16
1758   %id = shufflevector <8 x i32> %ld8, <8 x i32> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1759   store <4 x i32> %id, ptr addrspace(1) %out, align 8
1760   ret void
1763 define <2 x half> @low16bits_v2f16(ptr addrspace(1) %x0, ptr addrspace(1) %x1) {
1764 ; GFX9-LABEL: low16bits_v2f16:
1765 ; GFX9:       ; %bb.0: ; %entry
1766 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1767 ; GFX9-NEXT:    global_load_dword v4, v[0:1], off
1768 ; GFX9-NEXT:    global_load_dword v5, v[2:3], off
1769 ; GFX9-NEXT:    s_mov_b32 s4, 0x5040100
1770 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1771 ; GFX9-NEXT:    v_perm_b32 v0, v5, v4, s4
1772 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1774 ; GFX10-LABEL: low16bits_v2f16:
1775 ; GFX10:       ; %bb.0: ; %entry
1776 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1777 ; GFX10-NEXT:    global_load_dword v4, v[0:1], off
1778 ; GFX10-NEXT:    global_load_dword v5, v[2:3], off
1779 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1780 ; GFX10-NEXT:    v_perm_b32 v0, v5, v4, 0x5040100
1781 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1783 ; GFX11-LABEL: low16bits_v2f16:
1784 ; GFX11:       ; %bb.0: ; %entry
1785 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1786 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off
1787 ; GFX11-NEXT:    global_load_b32 v1, v[2:3], off
1788 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1789 ; GFX11-NEXT:    v_perm_b32 v0, v1, v0, 0x5040100
1790 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1791 entry:
1792   %0 = load <2 x half>, ptr addrspace(1) %x0, align 4
1793   %1 = load <2 x half>, ptr addrspace(1) %x1, align 4
1794   %vy1.0.vec.insert = shufflevector <2 x half> %0, <2 x half> poison, <2 x i32> <i32 0, i32 undef>
1795   %vy1.2.vec.insert = shufflevector <2 x half> %vy1.0.vec.insert, <2 x half> %1, <2 x i32> <i32 0, i32 2>
1796   ret <2 x half> %vy1.2.vec.insert
1799 define <2 x half> @hi16bits_v2f16(ptr addrspace(1) %x0, ptr addrspace(1) %x1) {
1800 ; GFX9-LABEL: hi16bits_v2f16:
1801 ; GFX9:       ; %bb.0: ; %entry
1802 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1803 ; GFX9-NEXT:    global_load_dword v4, v[0:1], off
1804 ; GFX9-NEXT:    global_load_dword v5, v[2:3], off
1805 ; GFX9-NEXT:    s_mov_b32 s4, 0x7060302
1806 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1807 ; GFX9-NEXT:    v_perm_b32 v0, v5, v4, s4
1808 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1810 ; GFX10-LABEL: hi16bits_v2f16:
1811 ; GFX10:       ; %bb.0: ; %entry
1812 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1813 ; GFX10-NEXT:    global_load_dword v4, v[0:1], off
1814 ; GFX10-NEXT:    global_load_dword v5, v[2:3], off
1815 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1816 ; GFX10-NEXT:    v_perm_b32 v0, v5, v4, 0x7060302
1817 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1819 ; GFX11-LABEL: hi16bits_v2f16:
1820 ; GFX11:       ; %bb.0: ; %entry
1821 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1822 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off
1823 ; GFX11-NEXT:    global_load_b32 v1, v[2:3], off
1824 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1825 ; GFX11-NEXT:    v_perm_b32 v0, v1, v0, 0x7060302
1826 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1827 entry:
1828   %0 = load <2 x half>, ptr addrspace(1) %x0, align 4
1829   %1 = load <2 x half>, ptr addrspace(1) %x1, align 4
1830   %vy1.0.vec.insert = shufflevector <2 x half> %0, <2 x half> poison, <2 x i32> <i32 1, i32 undef>
1831   %vy1.2.vec.insert = shufflevector <2 x half> %vy1.0.vec.insert, <2 x half> %1, <2 x i32> <i32 0, i32 3>
1832   ret <2 x half> %vy1.2.vec.insert
1835 define <2 x half> @low16hi16bits_v2f16(ptr addrspace(1) %x0, ptr addrspace(1) %x1) {
1836 ; GFX9-LABEL: low16hi16bits_v2f16:
1837 ; GFX9:       ; %bb.0: ; %entry
1838 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1839 ; GFX9-NEXT:    global_load_dword v4, v[0:1], off
1840 ; GFX9-NEXT:    global_load_dword v5, v[2:3], off
1841 ; GFX9-NEXT:    s_mov_b32 s4, 0xffff
1842 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1843 ; GFX9-NEXT:    v_bfi_b32 v0, s4, v4, v5
1844 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1846 ; GFX10-LABEL: low16hi16bits_v2f16:
1847 ; GFX10:       ; %bb.0: ; %entry
1848 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1849 ; GFX10-NEXT:    global_load_dword v4, v[0:1], off
1850 ; GFX10-NEXT:    global_load_dword v5, v[2:3], off
1851 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1852 ; GFX10-NEXT:    v_bfi_b32 v0, 0xffff, v4, v5
1853 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1855 ; GFX11-LABEL: low16hi16bits_v2f16:
1856 ; GFX11:       ; %bb.0: ; %entry
1857 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1858 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off
1859 ; GFX11-NEXT:    global_load_b32 v1, v[2:3], off
1860 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1861 ; GFX11-NEXT:    v_bfi_b32 v0, 0xffff, v0, v1
1862 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1863 entry:
1864   %0 = load <2 x half>, ptr addrspace(1) %x0, align 4
1865   %1 = load <2 x half>, ptr addrspace(1) %x1, align 4
1866   %vy1.0.vec.insert = shufflevector <2 x half> %0, <2 x half> poison, <2 x i32> <i32 0, i32 undef>
1867   %vy1.2.vec.insert = shufflevector <2 x half> %vy1.0.vec.insert, <2 x half> %1, <2 x i32> <i32 0, i32 3>
1868   ret <2 x half> %vy1.2.vec.insert
1871 define <2 x half> @hi16low16bits_v2bf16(ptr addrspace(1) %x0, ptr addrspace(1) %x1) {
1872 ; GFX9-LABEL: hi16low16bits_v2bf16:
1873 ; GFX9:       ; %bb.0: ; %entry
1874 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1875 ; GFX9-NEXT:    global_load_dword v4, v[0:1], off
1876 ; GFX9-NEXT:    global_load_dword v5, v[2:3], off
1877 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1878 ; GFX9-NEXT:    v_alignbit_b32 v0, v5, v4, 16
1879 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1881 ; GFX10-LABEL: hi16low16bits_v2bf16:
1882 ; GFX10:       ; %bb.0: ; %entry
1883 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1884 ; GFX10-NEXT:    global_load_dword v4, v[0:1], off
1885 ; GFX10-NEXT:    global_load_dword v5, v[2:3], off
1886 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1887 ; GFX10-NEXT:    v_alignbit_b32 v0, v5, v4, 16
1888 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1890 ; GFX11-LABEL: hi16low16bits_v2bf16:
1891 ; GFX11:       ; %bb.0: ; %entry
1892 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1893 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off
1894 ; GFX11-NEXT:    global_load_b32 v1, v[2:3], off
1895 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1896 ; GFX11-NEXT:    v_alignbit_b32 v0, v1, v0, 16
1897 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1898 entry:
1899   %0 = load <2 x half>, ptr addrspace(1) %x0, align 4
1900   %1 = load <2 x half>, ptr addrspace(1) %x1, align 4
1901   %vy1.0.vec.insert = shufflevector <2 x half> %0, <2 x half> poison, <2 x i32> <i32 1, i32 undef>
1902   %vy1.2.vec.insert = shufflevector <2 x half> %vy1.0.vec.insert, <2 x half> %1, <2 x i32> <i32 0, i32 2>
1903   ret <2 x half> %vy1.2.vec.insert
1906 define <2 x i16> @i16_low16bits(ptr addrspace(1) %x0, ptr addrspace(1) %x1) {
1907 ; GFX9-LABEL: i16_low16bits:
1908 ; GFX9:       ; %bb.0: ; %entry
1909 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1910 ; GFX9-NEXT:    global_load_dword v4, v[0:1], off
1911 ; GFX9-NEXT:    global_load_dword v5, v[2:3], off
1912 ; GFX9-NEXT:    s_mov_b32 s4, 0x5040100
1913 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1914 ; GFX9-NEXT:    v_perm_b32 v0, v5, v4, s4
1915 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1917 ; GFX10-LABEL: i16_low16bits:
1918 ; GFX10:       ; %bb.0: ; %entry
1919 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1920 ; GFX10-NEXT:    global_load_dword v4, v[0:1], off
1921 ; GFX10-NEXT:    global_load_dword v5, v[2:3], off
1922 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1923 ; GFX10-NEXT:    v_perm_b32 v0, v5, v4, 0x5040100
1924 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1926 ; GFX11-LABEL: i16_low16bits:
1927 ; GFX11:       ; %bb.0: ; %entry
1928 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1929 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off
1930 ; GFX11-NEXT:    global_load_b32 v1, v[2:3], off
1931 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1932 ; GFX11-NEXT:    v_perm_b32 v0, v1, v0, 0x5040100
1933 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1934 entry:
1935   %0 = load <2 x i16>, ptr addrspace(1) %x0, align 4
1936   %1 = load <2 x i16>, ptr addrspace(1) %x1, align 4
1937   %vy1.0.vec.insert = shufflevector <2 x i16> %0, <2 x i16> poison, <2 x i32> <i32 0, i32 undef>
1938   %vy1.2.vec.insert = shufflevector <2 x i16> %vy1.0.vec.insert, <2 x i16> %1, <2 x i32> <i32 0, i32 2>
1939   ret <2 x i16> %vy1.2.vec.insert
1942 define <2 x i16> @i16_low16hi16bits(ptr addrspace(1) %x0, ptr addrspace(1) %x1) {
1943 ; GFX9-LABEL: i16_low16hi16bits:
1944 ; GFX9:       ; %bb.0: ; %entry
1945 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1946 ; GFX9-NEXT:    global_load_dword v4, v[0:1], off
1947 ; GFX9-NEXT:    global_load_dword v5, v[2:3], off
1948 ; GFX9-NEXT:    s_mov_b32 s4, 0xffff
1949 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1950 ; GFX9-NEXT:    v_bfi_b32 v0, s4, v4, v5
1951 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1953 ; GFX10-LABEL: i16_low16hi16bits:
1954 ; GFX10:       ; %bb.0: ; %entry
1955 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1956 ; GFX10-NEXT:    global_load_dword v4, v[0:1], off
1957 ; GFX10-NEXT:    global_load_dword v5, v[2:3], off
1958 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1959 ; GFX10-NEXT:    v_bfi_b32 v0, 0xffff, v4, v5
1960 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1962 ; GFX11-LABEL: i16_low16hi16bits:
1963 ; GFX11:       ; %bb.0: ; %entry
1964 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1965 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off
1966 ; GFX11-NEXT:    global_load_b32 v1, v[2:3], off
1967 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
1968 ; GFX11-NEXT:    v_bfi_b32 v0, 0xffff, v0, v1
1969 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1970 entry:
1971   %0 = load <2 x i16>, ptr addrspace(1) %x0, align 4
1972   %1 = load <2 x i16>, ptr addrspace(1) %x1, align 4
1973   %vy1.0.vec.insert = shufflevector <2 x i16> %0, <2 x i16> poison, <2 x i32> <i32 0, i32 undef>
1974   %vy1.2.vec.insert = shufflevector <2 x i16> %vy1.0.vec.insert, <2 x i16> %1, <2 x i32> <i32 0, i32 3>
1975   ret <2 x i16> %vy1.2.vec.insert
1978 define <2 x i16> @i16_hi16low16bits(ptr addrspace(1) %x0, ptr addrspace(1) %x1) {
1979 ; GFX9-LABEL: i16_hi16low16bits:
1980 ; GFX9:       ; %bb.0: ; %entry
1981 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1982 ; GFX9-NEXT:    global_load_dword v4, v[0:1], off
1983 ; GFX9-NEXT:    global_load_dword v5, v[2:3], off
1984 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
1985 ; GFX9-NEXT:    v_alignbit_b32 v0, v5, v4, 16
1986 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1988 ; GFX10-LABEL: i16_hi16low16bits:
1989 ; GFX10:       ; %bb.0: ; %entry
1990 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1991 ; GFX10-NEXT:    global_load_dword v4, v[0:1], off
1992 ; GFX10-NEXT:    global_load_dword v5, v[2:3], off
1993 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
1994 ; GFX10-NEXT:    v_alignbit_b32 v0, v5, v4, 16
1995 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1997 ; GFX11-LABEL: i16_hi16low16bits:
1998 ; GFX11:       ; %bb.0: ; %entry
1999 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2000 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off
2001 ; GFX11-NEXT:    global_load_b32 v1, v[2:3], off
2002 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2003 ; GFX11-NEXT:    v_alignbit_b32 v0, v1, v0, 16
2004 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
2005 entry:
2006   %0 = load <2 x i16>, ptr addrspace(1) %x0, align 4
2007   %1 = load <2 x i16>, ptr addrspace(1) %x1, align 4
2008   %vy1.0.vec.insert = shufflevector <2 x i16> %0, <2 x i16> poison, <2 x i32> <i32 1, i32 undef>
2009   %vy1.2.vec.insert = shufflevector <2 x i16> %vy1.0.vec.insert, <2 x i16> %1, <2 x i32> <i32 0, i32 2>
2010   ret <2 x i16> %vy1.2.vec.insert
2013 define <2 x i16> @i16_hi16bits(ptr addrspace(1) %x0, ptr addrspace(1) %x1) {
2014 ; GFX9-LABEL: i16_hi16bits:
2015 ; GFX9:       ; %bb.0: ; %entry
2016 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2017 ; GFX9-NEXT:    global_load_dword v4, v[0:1], off
2018 ; GFX9-NEXT:    global_load_dword v5, v[2:3], off
2019 ; GFX9-NEXT:    s_mov_b32 s4, 0x7060302
2020 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2021 ; GFX9-NEXT:    v_perm_b32 v0, v5, v4, s4
2022 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
2024 ; GFX10-LABEL: i16_hi16bits:
2025 ; GFX10:       ; %bb.0: ; %entry
2026 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2027 ; GFX10-NEXT:    global_load_dword v4, v[0:1], off
2028 ; GFX10-NEXT:    global_load_dword v5, v[2:3], off
2029 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2030 ; GFX10-NEXT:    v_perm_b32 v0, v5, v4, 0x7060302
2031 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2033 ; GFX11-LABEL: i16_hi16bits:
2034 ; GFX11:       ; %bb.0: ; %entry
2035 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2036 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off
2037 ; GFX11-NEXT:    global_load_b32 v1, v[2:3], off
2038 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2039 ; GFX11-NEXT:    v_perm_b32 v0, v1, v0, 0x7060302
2040 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
2041 entry:
2042   %0 = load <2 x i16>, ptr addrspace(1) %x0, align 4
2043   %1 = load <2 x i16>, ptr addrspace(1) %x1, align 4
2044   %vy1.0.vec.insert = shufflevector <2 x i16> %0, <2 x i16> poison, <2 x i32> <i32 1, i32 undef>
2045   %vy1.2.vec.insert = shufflevector <2 x i16> %vy1.0.vec.insert, <2 x i16> %1, <2 x i32> <i32 0, i32 3>
2046   ret <2 x i16> %vy1.2.vec.insert
2049 define <2 x i16> @v2i16_hi16bits(ptr addrspace(1) %x0) {
2050 ; GFX9-LABEL: v2i16_hi16bits:
2051 ; GFX9:       ; %bb.0: ; %entry
2052 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2053 ; GFX9-NEXT:    global_load_dword v0, v[0:1], off
2054 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2055 ; GFX9-NEXT:    v_and_b32_e32 v0, 0xffff0000, v0
2056 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
2058 ; GFX10-LABEL: v2i16_hi16bits:
2059 ; GFX10:       ; %bb.0: ; %entry
2060 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2061 ; GFX10-NEXT:    global_load_dword v0, v[0:1], off
2062 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2063 ; GFX10-NEXT:    v_and_b32_e32 v0, 0xffff0000, v0
2064 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2066 ; GFX11-LABEL: v2i16_hi16bits:
2067 ; GFX11:       ; %bb.0: ; %entry
2068 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2069 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off
2070 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2071 ; GFX11-NEXT:    v_and_b32_e32 v0, 0xffff0000, v0
2072 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
2073 entry:
2074   %load0 = load <2 x i16>, ptr addrspace(1) %x0, align 4
2075   %insert1 = insertelement <2 x i16> undef, i16 0, i32 0
2076   %insert2 = insertelement <2 x i16> %insert1, i16 0, i32 1
2077   %vec.ret = shufflevector <2 x i16> %insert2, <2 x i16> %load0, <2 x i32> <i32 0, i32 3>
2078   ret <2 x i16> %vec.ret
2081 define <2 x half> @v2half_hi16bits(ptr addrspace(1) %x0) {
2082 ; GFX9-LABEL: v2half_hi16bits:
2083 ; GFX9:       ; %bb.0: ; %entry
2084 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2085 ; GFX9-NEXT:    global_load_dword v0, v[0:1], off
2086 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2087 ; GFX9-NEXT:    v_and_b32_e32 v0, 0xffff0000, v0
2088 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
2090 ; GFX10-LABEL: v2half_hi16bits:
2091 ; GFX10:       ; %bb.0: ; %entry
2092 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2093 ; GFX10-NEXT:    global_load_dword v0, v[0:1], off
2094 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2095 ; GFX10-NEXT:    v_and_b32_e32 v0, 0xffff0000, v0
2096 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2098 ; GFX11-LABEL: v2half_hi16bits:
2099 ; GFX11:       ; %bb.0: ; %entry
2100 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2101 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off
2102 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2103 ; GFX11-NEXT:    v_and_b32_e32 v0, 0xffff0000, v0
2104 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
2105 entry:
2106   %load0 = load <2 x half>, ptr addrspace(1) %x0, align 4
2107   %insert1 = insertelement <2 x half> undef, half 0.0, i32 0
2108   %insert2 = insertelement <2 x half> %insert1, half 0.0, i32 1
2109   %vec.ret = shufflevector <2 x half> %insert2, <2 x half> %load0, <2 x i32> <i32 0, i32 3>
2110   ret <2 x half> %vec.ret
2113 define void @shuffle_v8f16_concat(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1, ptr addrspace(1) %out) {
2114 ; GFX9-LABEL: shuffle_v8f16_concat:
2115 ; GFX9:       ; %bb.0:
2116 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2117 ; GFX9-NEXT:    global_load_dwordx2 v[6:7], v[0:1], off
2118 ; GFX9-NEXT:    global_load_dwordx2 v[8:9], v[2:3], off
2119 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2120 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[6:9], off
2121 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2122 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
2124 ; GFX10-LABEL: shuffle_v8f16_concat:
2125 ; GFX10:       ; %bb.0:
2126 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2127 ; GFX10-NEXT:    global_load_dwordx2 v[6:7], v[0:1], off
2128 ; GFX10-NEXT:    global_load_dwordx2 v[8:9], v[2:3], off
2129 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2130 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[6:9], off
2131 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2133 ; GFX11-LABEL: shuffle_v8f16_concat:
2134 ; GFX11:       ; %bb.0:
2135 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2136 ; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off
2137 ; GFX11-NEXT:    global_load_b64 v[2:3], v[2:3], off
2138 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2139 ; GFX11-NEXT:    global_store_b128 v[4:5], v[0:3], off
2140 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
2141   %val0 = load <4 x half>, ptr addrspace(1) %arg0
2142   %val1 = load <4 x half>, ptr addrspace(1) %arg1
2143   %shuffle = shufflevector <4 x half> %val0, <4 x half> %val1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
2144   store <8 x half> %shuffle, ptr addrspace(1) %out
2145   ret void
2148 define void @shuffle_v16f16_concat(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1, ptr addrspace(1) %out) {
2149 ; GFX9-LABEL: shuffle_v16f16_concat:
2150 ; GFX9:       ; %bb.0:
2151 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2152 ; GFX9-NEXT:    global_load_dwordx4 v[6:9], v[2:3], off
2153 ; GFX9-NEXT:    global_load_dwordx4 v[10:13], v[0:1], off
2154 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
2155 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[6:9], off offset:16
2156 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
2157 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[10:13], off
2158 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2159 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
2161 ; GFX10-LABEL: shuffle_v16f16_concat:
2162 ; GFX10:       ; %bb.0:
2163 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2164 ; GFX10-NEXT:    global_load_dwordx4 v[6:9], v[2:3], off
2165 ; GFX10-NEXT:    global_load_dwordx4 v[10:13], v[0:1], off
2166 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
2167 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[6:9], off offset:16
2168 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2169 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[10:13], off
2170 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2172 ; GFX11-LABEL: shuffle_v16f16_concat:
2173 ; GFX11:       ; %bb.0:
2174 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2175 ; GFX11-NEXT:    global_load_b128 v[6:9], v[2:3], off
2176 ; GFX11-NEXT:    global_load_b128 v[0:3], v[0:1], off
2177 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
2178 ; GFX11-NEXT:    global_store_b128 v[4:5], v[6:9], off offset:16
2179 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2180 ; GFX11-NEXT:    global_store_b128 v[4:5], v[0:3], off
2181 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
2182   %val0 = load <8 x half>, ptr addrspace(1) %arg0
2183   %val1 = load <8 x half>, ptr addrspace(1) %arg1
2184   %shuffle = shufflevector <8 x half> %val0, <8 x half> %val1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
2185   store <16 x half> %shuffle, ptr addrspace(1) %out
2186   ret void
2189 define void @shuffle_v32f16_concat(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1, ptr addrspace(1) %out) {
2190 ; GFX9-LABEL: shuffle_v32f16_concat:
2191 ; GFX9:       ; %bb.0:
2192 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2193 ; GFX9-NEXT:    global_load_dwordx4 v[6:9], v[2:3], off
2194 ; GFX9-NEXT:    global_load_dwordx4 v[10:13], v[2:3], off offset:16
2195 ; GFX9-NEXT:    global_load_dwordx4 v[14:17], v[0:1], off
2196 ; GFX9-NEXT:    global_load_dwordx4 v[18:21], v[0:1], off offset:16
2197 ; GFX9-NEXT:    s_waitcnt vmcnt(3)
2198 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[6:9], off offset:32
2199 ; GFX9-NEXT:    s_waitcnt vmcnt(3)
2200 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[10:13], off offset:48
2201 ; GFX9-NEXT:    s_waitcnt vmcnt(3)
2202 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[14:17], off
2203 ; GFX9-NEXT:    s_waitcnt vmcnt(3)
2204 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[18:21], off offset:16
2205 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2206 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
2208 ; GFX10-LABEL: shuffle_v32f16_concat:
2209 ; GFX10:       ; %bb.0:
2210 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2211 ; GFX10-NEXT:    s_clause 0x1
2212 ; GFX10-NEXT:    global_load_dwordx4 v[6:9], v[2:3], off
2213 ; GFX10-NEXT:    global_load_dwordx4 v[10:13], v[2:3], off offset:16
2214 ; GFX10-NEXT:    s_clause 0x1
2215 ; GFX10-NEXT:    global_load_dwordx4 v[14:17], v[0:1], off
2216 ; GFX10-NEXT:    global_load_dwordx4 v[18:21], v[0:1], off offset:16
2217 ; GFX10-NEXT:    s_waitcnt vmcnt(3)
2218 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[6:9], off offset:32
2219 ; GFX10-NEXT:    s_waitcnt vmcnt(2)
2220 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[10:13], off offset:48
2221 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
2222 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[14:17], off
2223 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2224 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[18:21], off offset:16
2225 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2227 ; GFX11-LABEL: shuffle_v32f16_concat:
2228 ; GFX11:       ; %bb.0:
2229 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2230 ; GFX11-NEXT:    s_clause 0x1
2231 ; GFX11-NEXT:    global_load_b128 v[6:9], v[2:3], off
2232 ; GFX11-NEXT:    global_load_b128 v[10:13], v[2:3], off offset:16
2233 ; GFX11-NEXT:    s_clause 0x1
2234 ; GFX11-NEXT:    global_load_b128 v[14:17], v[0:1], off
2235 ; GFX11-NEXT:    global_load_b128 v[0:3], v[0:1], off offset:16
2236 ; GFX11-NEXT:    s_waitcnt vmcnt(3)
2237 ; GFX11-NEXT:    global_store_b128 v[4:5], v[6:9], off offset:32
2238 ; GFX11-NEXT:    s_waitcnt vmcnt(2)
2239 ; GFX11-NEXT:    global_store_b128 v[4:5], v[10:13], off offset:48
2240 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
2241 ; GFX11-NEXT:    global_store_b128 v[4:5], v[14:17], off
2242 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2243 ; GFX11-NEXT:    global_store_b128 v[4:5], v[0:3], off offset:16
2244 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
2245   %val0 = load <16 x half>, ptr addrspace(1) %arg0
2246   %val1 = load <16 x half>, ptr addrspace(1) %arg1
2247   %shuffle = shufflevector <16 x half> %val0, <16 x half> %val1, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
2248   store <32 x half> %shuffle, ptr addrspace(1) %out
2249   ret void
2252 define void @shuffle_v8i16_concat(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1, ptr addrspace(1) %out) {
2253 ; GFX9-LABEL: shuffle_v8i16_concat:
2254 ; GFX9:       ; %bb.0:
2255 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2256 ; GFX9-NEXT:    global_load_dwordx2 v[6:7], v[0:1], off
2257 ; GFX9-NEXT:    global_load_dwordx2 v[8:9], v[2:3], off
2258 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2259 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[6:9], off
2260 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2261 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
2263 ; GFX10-LABEL: shuffle_v8i16_concat:
2264 ; GFX10:       ; %bb.0:
2265 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2266 ; GFX10-NEXT:    global_load_dwordx2 v[6:7], v[0:1], off
2267 ; GFX10-NEXT:    global_load_dwordx2 v[8:9], v[2:3], off
2268 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2269 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[6:9], off
2270 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2272 ; GFX11-LABEL: shuffle_v8i16_concat:
2273 ; GFX11:       ; %bb.0:
2274 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2275 ; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off
2276 ; GFX11-NEXT:    global_load_b64 v[2:3], v[2:3], off
2277 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2278 ; GFX11-NEXT:    global_store_b128 v[4:5], v[0:3], off
2279 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
2280   %val0 = load <4 x i16>, ptr addrspace(1) %arg0
2281   %val1 = load <4 x i16>, ptr addrspace(1) %arg1
2282   %shuffle = shufflevector <4 x i16> %val0, <4 x i16> %val1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
2283   store <8 x i16> %shuffle, ptr addrspace(1) %out
2284   ret void
2287 define void @shuffle_v16i16_concat(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1, ptr addrspace(1) %out) {
2288 ; GFX9-LABEL: shuffle_v16i16_concat:
2289 ; GFX9:       ; %bb.0:
2290 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2291 ; GFX9-NEXT:    global_load_dwordx4 v[6:9], v[2:3], off
2292 ; GFX9-NEXT:    global_load_dwordx4 v[10:13], v[0:1], off
2293 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
2294 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[6:9], off offset:16
2295 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
2296 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[10:13], off
2297 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2298 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
2300 ; GFX10-LABEL: shuffle_v16i16_concat:
2301 ; GFX10:       ; %bb.0:
2302 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2303 ; GFX10-NEXT:    global_load_dwordx4 v[6:9], v[2:3], off
2304 ; GFX10-NEXT:    global_load_dwordx4 v[10:13], v[0:1], off
2305 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
2306 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[6:9], off offset:16
2307 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2308 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[10:13], off
2309 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2311 ; GFX11-LABEL: shuffle_v16i16_concat:
2312 ; GFX11:       ; %bb.0:
2313 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2314 ; GFX11-NEXT:    global_load_b128 v[6:9], v[2:3], off
2315 ; GFX11-NEXT:    global_load_b128 v[0:3], v[0:1], off
2316 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
2317 ; GFX11-NEXT:    global_store_b128 v[4:5], v[6:9], off offset:16
2318 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2319 ; GFX11-NEXT:    global_store_b128 v[4:5], v[0:3], off
2320 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
2321   %val0 = load <8 x i16>, ptr addrspace(1) %arg0
2322   %val1 = load <8 x i16>, ptr addrspace(1) %arg1
2323   %shuffle = shufflevector <8 x i16> %val0, <8 x i16> %val1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
2324   store <16 x i16> %shuffle, ptr addrspace(1) %out
2325   ret void
2328 define void @shuffle_v32i16_concat(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1, ptr addrspace(1) %out) {
2329 ; GFX9-LABEL: shuffle_v32i16_concat:
2330 ; GFX9:       ; %bb.0:
2331 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2332 ; GFX9-NEXT:    global_load_dwordx4 v[6:9], v[2:3], off
2333 ; GFX9-NEXT:    global_load_dwordx4 v[10:13], v[2:3], off offset:16
2334 ; GFX9-NEXT:    global_load_dwordx4 v[14:17], v[0:1], off
2335 ; GFX9-NEXT:    global_load_dwordx4 v[18:21], v[0:1], off offset:16
2336 ; GFX9-NEXT:    s_waitcnt vmcnt(3)
2337 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[6:9], off offset:32
2338 ; GFX9-NEXT:    s_waitcnt vmcnt(3)
2339 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[10:13], off offset:48
2340 ; GFX9-NEXT:    s_waitcnt vmcnt(3)
2341 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[14:17], off
2342 ; GFX9-NEXT:    s_waitcnt vmcnt(3)
2343 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[18:21], off offset:16
2344 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2345 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
2347 ; GFX10-LABEL: shuffle_v32i16_concat:
2348 ; GFX10:       ; %bb.0:
2349 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2350 ; GFX10-NEXT:    s_clause 0x1
2351 ; GFX10-NEXT:    global_load_dwordx4 v[6:9], v[2:3], off
2352 ; GFX10-NEXT:    global_load_dwordx4 v[10:13], v[2:3], off offset:16
2353 ; GFX10-NEXT:    s_clause 0x1
2354 ; GFX10-NEXT:    global_load_dwordx4 v[14:17], v[0:1], off
2355 ; GFX10-NEXT:    global_load_dwordx4 v[18:21], v[0:1], off offset:16
2356 ; GFX10-NEXT:    s_waitcnt vmcnt(3)
2357 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[6:9], off offset:32
2358 ; GFX10-NEXT:    s_waitcnt vmcnt(2)
2359 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[10:13], off offset:48
2360 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
2361 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[14:17], off
2362 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2363 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[18:21], off offset:16
2364 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2366 ; GFX11-LABEL: shuffle_v32i16_concat:
2367 ; GFX11:       ; %bb.0:
2368 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2369 ; GFX11-NEXT:    s_clause 0x1
2370 ; GFX11-NEXT:    global_load_b128 v[6:9], v[2:3], off
2371 ; GFX11-NEXT:    global_load_b128 v[10:13], v[2:3], off offset:16
2372 ; GFX11-NEXT:    s_clause 0x1
2373 ; GFX11-NEXT:    global_load_b128 v[14:17], v[0:1], off
2374 ; GFX11-NEXT:    global_load_b128 v[0:3], v[0:1], off offset:16
2375 ; GFX11-NEXT:    s_waitcnt vmcnt(3)
2376 ; GFX11-NEXT:    global_store_b128 v[4:5], v[6:9], off offset:32
2377 ; GFX11-NEXT:    s_waitcnt vmcnt(2)
2378 ; GFX11-NEXT:    global_store_b128 v[4:5], v[10:13], off offset:48
2379 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
2380 ; GFX11-NEXT:    global_store_b128 v[4:5], v[14:17], off
2381 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2382 ; GFX11-NEXT:    global_store_b128 v[4:5], v[0:3], off offset:16
2383 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
2384   %val0 = load <16 x i16>, ptr addrspace(1) %arg0
2385   %val1 = load <16 x i16>, ptr addrspace(1) %arg1
2386   %shuffle = shufflevector <16 x i16> %val0, <16 x i16> %val1, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
2387   store <32 x i16> %shuffle, ptr addrspace(1) %out
2388   ret void
2391 define void @shuffle_v4i8_concat(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1, ptr addrspace(1) %out) {
2392 ; GFX9-LABEL: shuffle_v4i8_concat:
2393 ; GFX9:       ; %bb.0:
2394 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2395 ; GFX9-NEXT:    global_load_ushort v0, v[0:1], off
2396 ; GFX9-NEXT:    s_nop 0
2397 ; GFX9-NEXT:    global_load_short_d16_hi v0, v[2:3], off
2398 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2399 ; GFX9-NEXT:    global_store_dword v[4:5], v0, off
2400 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2401 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
2403 ; GFX10-LABEL: shuffle_v4i8_concat:
2404 ; GFX10:       ; %bb.0:
2405 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2406 ; GFX10-NEXT:    global_load_ushort v0, v[0:1], off
2407 ; GFX10-NEXT:    global_load_short_d16_hi v0, v[2:3], off
2408 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2409 ; GFX10-NEXT:    global_store_dword v[4:5], v0, off
2410 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2412 ; GFX11-LABEL: shuffle_v4i8_concat:
2413 ; GFX11:       ; %bb.0:
2414 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2415 ; GFX11-NEXT:    global_load_u16 v0, v[0:1], off
2416 ; GFX11-NEXT:    global_load_d16_hi_b16 v0, v[2:3], off
2417 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2418 ; GFX11-NEXT:    global_store_b32 v[4:5], v0, off
2419 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
2420   %val0 = load <2 x i8>, ptr addrspace(1) %arg0
2421   %val1 = load <2 x i8>, ptr addrspace(1) %arg1
2422   %shuffle = shufflevector <2 x i8> %val0, <2 x i8> %val1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2423   store <4 x i8> %shuffle, ptr addrspace(1) %out
2424   ret void
2427 define void @shuffle_v8i8_concat(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1, ptr addrspace(1) %out) {
2428 ; GFX9-LABEL: shuffle_v8i8_concat:
2429 ; GFX9:       ; %bb.0:
2430 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2431 ; GFX9-NEXT:    global_load_dword v6, v[0:1], off
2432 ; GFX9-NEXT:    global_load_dword v7, v[2:3], off
2433 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2434 ; GFX9-NEXT:    global_store_dwordx2 v[4:5], v[6:7], off
2435 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2436 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
2438 ; GFX10-LABEL: shuffle_v8i8_concat:
2439 ; GFX10:       ; %bb.0:
2440 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2441 ; GFX10-NEXT:    global_load_dword v6, v[0:1], off
2442 ; GFX10-NEXT:    global_load_dword v7, v[2:3], off
2443 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2444 ; GFX10-NEXT:    global_store_dwordx2 v[4:5], v[6:7], off
2445 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2447 ; GFX11-LABEL: shuffle_v8i8_concat:
2448 ; GFX11:       ; %bb.0:
2449 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2450 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off
2451 ; GFX11-NEXT:    global_load_b32 v1, v[2:3], off
2452 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2453 ; GFX11-NEXT:    global_store_b64 v[4:5], v[0:1], off
2454 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
2455   %val0 = load <4 x i8>, ptr addrspace(1) %arg0
2456   %val1 = load <4 x i8>, ptr addrspace(1) %arg1
2457   %shuffle = shufflevector <4 x i8> %val0, <4 x i8> %val1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
2458   store <8 x i8> %shuffle, ptr addrspace(1) %out
2459   ret void
2462 define void @shuffle_v16i8_concat(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1, ptr addrspace(1) %out) {
2463 ; GFX9-LABEL: shuffle_v16i8_concat:
2464 ; GFX9:       ; %bb.0:
2465 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2466 ; GFX9-NEXT:    global_load_dwordx2 v[6:7], v[0:1], off
2467 ; GFX9-NEXT:    global_load_dwordx2 v[8:9], v[2:3], off
2468 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2469 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[6:9], off
2470 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2471 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
2473 ; GFX10-LABEL: shuffle_v16i8_concat:
2474 ; GFX10:       ; %bb.0:
2475 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2476 ; GFX10-NEXT:    global_load_dwordx2 v[6:7], v[0:1], off
2477 ; GFX10-NEXT:    global_load_dwordx2 v[8:9], v[2:3], off
2478 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2479 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[6:9], off
2480 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2482 ; GFX11-LABEL: shuffle_v16i8_concat:
2483 ; GFX11:       ; %bb.0:
2484 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2485 ; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off
2486 ; GFX11-NEXT:    global_load_b64 v[2:3], v[2:3], off
2487 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2488 ; GFX11-NEXT:    global_store_b128 v[4:5], v[0:3], off
2489 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
2490   %val0 = load <8 x i8>, ptr addrspace(1) %arg0
2491   %val1 = load <8 x i8>, ptr addrspace(1) %arg1
2492   %shuffle = shufflevector <8 x i8> %val0, <8 x i8> %val1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
2493   store <16 x i8> %shuffle, ptr addrspace(1) %out
2494   ret void
2497 define void @shuffle_v32i8_concat(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1, ptr addrspace(1) %out) {
2498 ; GFX9-LABEL: shuffle_v32i8_concat:
2499 ; GFX9:       ; %bb.0:
2500 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2501 ; GFX9-NEXT:    global_load_dwordx4 v[6:9], v[2:3], off
2502 ; GFX9-NEXT:    global_load_dwordx4 v[10:13], v[0:1], off
2503 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
2504 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[6:9], off offset:16
2505 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
2506 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[10:13], off
2507 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2508 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
2510 ; GFX10-LABEL: shuffle_v32i8_concat:
2511 ; GFX10:       ; %bb.0:
2512 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2513 ; GFX10-NEXT:    global_load_dwordx4 v[6:9], v[2:3], off
2514 ; GFX10-NEXT:    global_load_dwordx4 v[10:13], v[0:1], off
2515 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
2516 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[6:9], off offset:16
2517 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2518 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[10:13], off
2519 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2521 ; GFX11-LABEL: shuffle_v32i8_concat:
2522 ; GFX11:       ; %bb.0:
2523 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2524 ; GFX11-NEXT:    global_load_b128 v[6:9], v[2:3], off
2525 ; GFX11-NEXT:    global_load_b128 v[0:3], v[0:1], off
2526 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
2527 ; GFX11-NEXT:    global_store_b128 v[4:5], v[6:9], off offset:16
2528 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2529 ; GFX11-NEXT:    global_store_b128 v[4:5], v[0:3], off
2530 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
2531   %val0 = load <16 x i8>, ptr addrspace(1) %arg0
2532   %val1 = load <16 x i8>, ptr addrspace(1) %arg1
2533   %shuffle = shufflevector <16 x i8> %val0, <16 x i8> %val1, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
2534   store <32 x i8> %shuffle, ptr addrspace(1) %out
2535   ret void
2538 define void @shuffle_v4i32_concat(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1, ptr addrspace(1) %out) {
2539 ; GFX9-LABEL: shuffle_v4i32_concat:
2540 ; GFX9:       ; %bb.0:
2541 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2542 ; GFX9-NEXT:    global_load_dwordx2 v[6:7], v[0:1], off
2543 ; GFX9-NEXT:    global_load_dwordx2 v[8:9], v[2:3], off
2544 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2545 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[6:9], off
2546 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2547 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
2549 ; GFX10-LABEL: shuffle_v4i32_concat:
2550 ; GFX10:       ; %bb.0:
2551 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2552 ; GFX10-NEXT:    global_load_dwordx2 v[6:7], v[0:1], off
2553 ; GFX10-NEXT:    global_load_dwordx2 v[8:9], v[2:3], off
2554 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2555 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[6:9], off
2556 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2558 ; GFX11-LABEL: shuffle_v4i32_concat:
2559 ; GFX11:       ; %bb.0:
2560 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2561 ; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off
2562 ; GFX11-NEXT:    global_load_b64 v[2:3], v[2:3], off
2563 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2564 ; GFX11-NEXT:    global_store_b128 v[4:5], v[0:3], off
2565 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
2566   %val0 = load <2 x i32>, ptr addrspace(1) %arg0
2567   %val1 = load <2 x i32>, ptr addrspace(1) %arg1
2568   %shuffle = shufflevector <2 x i32> %val0, <2 x i32> %val1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2569   store <4 x i32> %shuffle, ptr addrspace(1) %out
2570   ret void
2573 define void @shuffle_v8i32_concat(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1, ptr addrspace(1) %out) {
2574 ; GFX9-LABEL: shuffle_v8i32_concat:
2575 ; GFX9:       ; %bb.0:
2576 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2577 ; GFX9-NEXT:    global_load_dwordx4 v[6:9], v[2:3], off
2578 ; GFX9-NEXT:    global_load_dwordx4 v[10:13], v[0:1], off
2579 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
2580 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[6:9], off offset:16
2581 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
2582 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[10:13], off
2583 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2584 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
2586 ; GFX10-LABEL: shuffle_v8i32_concat:
2587 ; GFX10:       ; %bb.0:
2588 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2589 ; GFX10-NEXT:    global_load_dwordx4 v[6:9], v[2:3], off
2590 ; GFX10-NEXT:    global_load_dwordx4 v[10:13], v[0:1], off
2591 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
2592 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[6:9], off offset:16
2593 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2594 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[10:13], off
2595 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2597 ; GFX11-LABEL: shuffle_v8i32_concat:
2598 ; GFX11:       ; %bb.0:
2599 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2600 ; GFX11-NEXT:    global_load_b128 v[6:9], v[2:3], off
2601 ; GFX11-NEXT:    global_load_b128 v[0:3], v[0:1], off
2602 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
2603 ; GFX11-NEXT:    global_store_b128 v[4:5], v[6:9], off offset:16
2604 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2605 ; GFX11-NEXT:    global_store_b128 v[4:5], v[0:3], off
2606 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
2607   %val0 = load <4 x i32>, ptr addrspace(1) %arg0
2608   %val1 = load <4 x i32>, ptr addrspace(1) %arg1
2609   %shuffle = shufflevector <4 x i32> %val0, <4 x i32> %val1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
2610   store <8 x i32> %shuffle, ptr addrspace(1) %out
2611   ret void
2614 define void @shuffle_v16i32_concat(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1, ptr addrspace(1) %out) {
2615 ; GFX9-LABEL: shuffle_v16i32_concat:
2616 ; GFX9:       ; %bb.0:
2617 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2618 ; GFX9-NEXT:    global_load_dwordx4 v[6:9], v[2:3], off
2619 ; GFX9-NEXT:    global_load_dwordx4 v[10:13], v[2:3], off offset:16
2620 ; GFX9-NEXT:    global_load_dwordx4 v[14:17], v[0:1], off
2621 ; GFX9-NEXT:    global_load_dwordx4 v[18:21], v[0:1], off offset:16
2622 ; GFX9-NEXT:    s_waitcnt vmcnt(3)
2623 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[6:9], off offset:32
2624 ; GFX9-NEXT:    s_waitcnt vmcnt(3)
2625 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[10:13], off offset:48
2626 ; GFX9-NEXT:    s_waitcnt vmcnt(3)
2627 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[14:17], off
2628 ; GFX9-NEXT:    s_waitcnt vmcnt(3)
2629 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[18:21], off offset:16
2630 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2631 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
2633 ; GFX10-LABEL: shuffle_v16i32_concat:
2634 ; GFX10:       ; %bb.0:
2635 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2636 ; GFX10-NEXT:    s_clause 0x1
2637 ; GFX10-NEXT:    global_load_dwordx4 v[6:9], v[2:3], off
2638 ; GFX10-NEXT:    global_load_dwordx4 v[10:13], v[2:3], off offset:16
2639 ; GFX10-NEXT:    s_clause 0x1
2640 ; GFX10-NEXT:    global_load_dwordx4 v[14:17], v[0:1], off
2641 ; GFX10-NEXT:    global_load_dwordx4 v[18:21], v[0:1], off offset:16
2642 ; GFX10-NEXT:    s_waitcnt vmcnt(3)
2643 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[6:9], off offset:32
2644 ; GFX10-NEXT:    s_waitcnt vmcnt(2)
2645 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[10:13], off offset:48
2646 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
2647 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[14:17], off
2648 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2649 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[18:21], off offset:16
2650 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2652 ; GFX11-LABEL: shuffle_v16i32_concat:
2653 ; GFX11:       ; %bb.0:
2654 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2655 ; GFX11-NEXT:    s_clause 0x1
2656 ; GFX11-NEXT:    global_load_b128 v[6:9], v[2:3], off
2657 ; GFX11-NEXT:    global_load_b128 v[10:13], v[2:3], off offset:16
2658 ; GFX11-NEXT:    s_clause 0x1
2659 ; GFX11-NEXT:    global_load_b128 v[14:17], v[0:1], off
2660 ; GFX11-NEXT:    global_load_b128 v[0:3], v[0:1], off offset:16
2661 ; GFX11-NEXT:    s_waitcnt vmcnt(3)
2662 ; GFX11-NEXT:    global_store_b128 v[4:5], v[6:9], off offset:32
2663 ; GFX11-NEXT:    s_waitcnt vmcnt(2)
2664 ; GFX11-NEXT:    global_store_b128 v[4:5], v[10:13], off offset:48
2665 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
2666 ; GFX11-NEXT:    global_store_b128 v[4:5], v[14:17], off
2667 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2668 ; GFX11-NEXT:    global_store_b128 v[4:5], v[0:3], off offset:16
2669 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
2670   %val0 = load <8 x i32>, ptr addrspace(1) %arg0
2671   %val1 = load <8 x i32>, ptr addrspace(1) %arg1
2672   %shuffle = shufflevector <8 x i32> %val0, <8 x i32> %val1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
2673   store <16 x i32> %shuffle, ptr addrspace(1) %out
2674   ret void
2677 define <4 x bfloat> @shuffle_v4bf16_23uu(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
2678 ; GFX9-LABEL: shuffle_v4bf16_23uu:
2679 ; GFX9:       ; %bb.0:
2680 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2681 ; GFX9-NEXT:    global_load_dword v0, v[0:1], off offset:4
2682 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2683 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
2685 ; GFX10-LABEL: shuffle_v4bf16_23uu:
2686 ; GFX10:       ; %bb.0:
2687 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2688 ; GFX10-NEXT:    global_load_dword v0, v[0:1], off offset:4
2689 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2690 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2692 ; GFX11-LABEL: shuffle_v4bf16_23uu:
2693 ; GFX11:       ; %bb.0:
2694 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2695 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:4
2696 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2697 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
2698   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
2699   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
2700   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef>
2701   ret <4 x bfloat> %shuffle
2704 define <4 x bfloat> @shuffle_v4bf16_234u(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
2705 ; GFX9-LABEL: shuffle_v4bf16_234u:
2706 ; GFX9:       ; %bb.0:
2707 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2708 ; GFX9-NEXT:    global_load_dword v6, v[0:1], off offset:4
2709 ; GFX9-NEXT:    global_load_dwordx2 v[4:5], v[2:3], off
2710 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
2711 ; GFX9-NEXT:    v_mov_b32_e32 v0, v6
2712 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2713 ; GFX9-NEXT:    v_mov_b32_e32 v1, v4
2714 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
2716 ; GFX10-LABEL: shuffle_v4bf16_234u:
2717 ; GFX10:       ; %bb.0:
2718 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2719 ; GFX10-NEXT:    global_load_dword v6, v[0:1], off offset:4
2720 ; GFX10-NEXT:    global_load_dwordx2 v[4:5], v[2:3], off
2721 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
2722 ; GFX10-NEXT:    v_mov_b32_e32 v0, v6
2723 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2724 ; GFX10-NEXT:    v_mov_b32_e32 v1, v4
2725 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2727 ; GFX11-LABEL: shuffle_v4bf16_234u:
2728 ; GFX11:       ; %bb.0:
2729 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2730 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:4
2731 ; GFX11-NEXT:    global_load_b64 v[1:2], v[2:3], off
2732 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2733 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
2734   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
2735   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
2736   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 2, i32 3, i32 4, i32 undef>
2737   ret <4 x bfloat> %shuffle
2740 define <4 x bfloat> @shuffle_v4bf16_u1u3(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
2741 ; GFX9-LABEL: shuffle_v4bf16_u1u3:
2742 ; GFX9:       ; %bb.0:
2743 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2744 ; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
2745 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2746 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
2748 ; GFX10-LABEL: shuffle_v4bf16_u1u3:
2749 ; GFX10:       ; %bb.0:
2750 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2751 ; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
2752 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2753 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2755 ; GFX11-LABEL: shuffle_v4bf16_u1u3:
2756 ; GFX11:       ; %bb.0:
2757 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2758 ; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off
2759 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2760 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
2761   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
2762   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
2763   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 undef, i32 1, i32 undef, i32 3>
2764   ret <4 x bfloat> %shuffle
2767 define <4 x bfloat> @shuffle_v4bf16_u3u1(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
2768 ; GFX9-LABEL: shuffle_v4bf16_u3u1:
2769 ; GFX9:       ; %bb.0:
2770 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2771 ; GFX9-NEXT:    global_load_dwordx2 v[1:2], v[0:1], off
2772 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2773 ; GFX9-NEXT:    v_mov_b32_e32 v0, v2
2774 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
2776 ; GFX10-LABEL: shuffle_v4bf16_u3u1:
2777 ; GFX10:       ; %bb.0:
2778 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2779 ; GFX10-NEXT:    global_load_dwordx2 v[1:2], v[0:1], off
2780 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2781 ; GFX10-NEXT:    v_mov_b32_e32 v0, v2
2782 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2784 ; GFX11-LABEL: shuffle_v4bf16_u3u1:
2785 ; GFX11:       ; %bb.0:
2786 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2787 ; GFX11-NEXT:    global_load_b64 v[1:2], v[0:1], off
2788 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2789 ; GFX11-NEXT:    v_mov_b32_e32 v0, v2
2790 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
2791   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
2792   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
2793   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 undef, i32 3, i32 undef, i32 1>
2794   ret <4 x bfloat> %shuffle
2797 define <4 x bfloat> @shuffle_v4bf16_u3uu(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
2798 ; GFX9-LABEL: shuffle_v4bf16_u3uu:
2799 ; GFX9:       ; %bb.0:
2800 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2801 ; GFX9-NEXT:    global_load_dword v0, v[0:1], off offset:4
2802 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2803 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
2805 ; GFX10-LABEL: shuffle_v4bf16_u3uu:
2806 ; GFX10:       ; %bb.0:
2807 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2808 ; GFX10-NEXT:    global_load_dword v0, v[0:1], off offset:4
2809 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2810 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2812 ; GFX11-LABEL: shuffle_v4bf16_u3uu:
2813 ; GFX11:       ; %bb.0:
2814 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2815 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:4
2816 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2817 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
2818   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
2819   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
2820   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 undef, i32 3, i32 undef, i32 undef>
2821   ret <4 x bfloat> %shuffle
2824 define <4 x bfloat> @shuffle_v4bf16_3u6u(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
2825 ; GFX9-LABEL: shuffle_v4bf16_3u6u:
2826 ; GFX9:       ; %bb.0:
2827 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2828 ; GFX9-NEXT:    global_load_dword v5, v[0:1], off offset:4
2829 ; GFX9-NEXT:    global_load_dword v4, v[2:3], off offset:4
2830 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
2831 ; GFX9-NEXT:    v_alignbit_b32 v0, s4, v5, 16
2832 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2833 ; GFX9-NEXT:    v_mov_b32_e32 v1, v4
2834 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
2836 ; GFX10-LABEL: shuffle_v4bf16_3u6u:
2837 ; GFX10:       ; %bb.0:
2838 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2839 ; GFX10-NEXT:    global_load_dword v5, v[0:1], off offset:4
2840 ; GFX10-NEXT:    global_load_dword v4, v[2:3], off offset:4
2841 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
2842 ; GFX10-NEXT:    v_alignbit_b32 v0, s4, v5, 16
2843 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2844 ; GFX10-NEXT:    v_mov_b32_e32 v1, v4
2845 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2847 ; GFX11-LABEL: shuffle_v4bf16_3u6u:
2848 ; GFX11:       ; %bb.0:
2849 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2850 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:4
2851 ; GFX11-NEXT:    global_load_b32 v1, v[2:3], off offset:4
2852 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
2853 ; GFX11-NEXT:    v_alignbit_b32 v0, s0, v0, 16
2854 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2855 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
2856   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
2857   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
2858   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 3, i32 undef, i32 6, i32 undef>
2859   ret <4 x bfloat> %shuffle
2862 define <4 x bfloat> @shuffle_v4bf16_3uu7(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
2863 ; GFX9-LABEL: shuffle_v4bf16_3uu7:
2864 ; GFX9:       ; %bb.0:
2865 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2866 ; GFX9-NEXT:    global_load_dword v5, v[0:1], off offset:4
2867 ; GFX9-NEXT:    global_load_dword v4, v[2:3], off offset:4
2868 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
2869 ; GFX9-NEXT:    v_alignbit_b32 v0, s4, v5, 16
2870 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2871 ; GFX9-NEXT:    v_mov_b32_e32 v1, v4
2872 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
2874 ; GFX10-LABEL: shuffle_v4bf16_3uu7:
2875 ; GFX10:       ; %bb.0:
2876 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2877 ; GFX10-NEXT:    global_load_dword v5, v[0:1], off offset:4
2878 ; GFX10-NEXT:    global_load_dword v4, v[2:3], off offset:4
2879 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
2880 ; GFX10-NEXT:    v_alignbit_b32 v0, s4, v5, 16
2881 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2882 ; GFX10-NEXT:    v_mov_b32_e32 v1, v4
2883 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2885 ; GFX11-LABEL: shuffle_v4bf16_3uu7:
2886 ; GFX11:       ; %bb.0:
2887 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2888 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:4
2889 ; GFX11-NEXT:    global_load_b32 v1, v[2:3], off offset:4
2890 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
2891 ; GFX11-NEXT:    v_alignbit_b32 v0, s0, v0, 16
2892 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2893 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
2894   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
2895   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
2896   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 3, i32 undef, i32 undef, i32 7>
2897   ret <4 x bfloat> %shuffle
2900 define <4 x bfloat> @shuffle_v4bf16_35u5(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
2901 ; GFX9-LABEL: shuffle_v4bf16_35u5:
2902 ; GFX9:       ; %bb.0:
2903 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2904 ; GFX9-NEXT:    global_load_dword v5, v[0:1], off offset:4
2905 ; GFX9-NEXT:    global_load_dword v4, v[2:3], off
2906 ; GFX9-NEXT:    s_mov_b32 s4, 0x7060302
2907 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2908 ; GFX9-NEXT:    v_perm_b32 v0, v4, v5, s4
2909 ; GFX9-NEXT:    v_mov_b32_e32 v1, v4
2910 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
2912 ; GFX10-LABEL: shuffle_v4bf16_35u5:
2913 ; GFX10:       ; %bb.0:
2914 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2915 ; GFX10-NEXT:    global_load_dword v5, v[0:1], off offset:4
2916 ; GFX10-NEXT:    global_load_dword v4, v[2:3], off
2917 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2918 ; GFX10-NEXT:    v_perm_b32 v0, v4, v5, 0x7060302
2919 ; GFX10-NEXT:    v_mov_b32_e32 v1, v4
2920 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2922 ; GFX11-LABEL: shuffle_v4bf16_35u5:
2923 ; GFX11:       ; %bb.0:
2924 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2925 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:4
2926 ; GFX11-NEXT:    global_load_b32 v1, v[2:3], off
2927 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2928 ; GFX11-NEXT:    v_perm_b32 v0, v1, v0, 0x7060302
2929 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
2930   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
2931   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
2932   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 3, i32 5, i32 undef, i32 5>
2933   ret <4 x bfloat> %shuffle
2936 define <4 x bfloat> @shuffle_v4bf16_357u(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
2937 ; GFX9-LABEL: shuffle_v4bf16_357u:
2938 ; GFX9:       ; %bb.0:
2939 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2940 ; GFX9-NEXT:    global_load_dwordx2 v[4:5], v[2:3], off
2941 ; GFX9-NEXT:    global_load_dword v6, v[0:1], off offset:4
2942 ; GFX9-NEXT:    s_mov_b32 s4, 0x7060302
2943 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
2944 ; GFX9-NEXT:    v_alignbit_b32 v1, s4, v5, 16
2945 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2946 ; GFX9-NEXT:    v_perm_b32 v0, v4, v6, s4
2947 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
2949 ; GFX10-LABEL: shuffle_v4bf16_357u:
2950 ; GFX10:       ; %bb.0:
2951 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2952 ; GFX10-NEXT:    global_load_dwordx2 v[4:5], v[2:3], off
2953 ; GFX10-NEXT:    global_load_dword v6, v[0:1], off offset:4
2954 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
2955 ; GFX10-NEXT:    v_alignbit_b32 v1, s4, v5, 16
2956 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2957 ; GFX10-NEXT:    v_perm_b32 v0, v4, v6, 0x7060302
2958 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2960 ; GFX11-LABEL: shuffle_v4bf16_357u:
2961 ; GFX11:       ; %bb.0:
2962 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2963 ; GFX11-NEXT:    global_load_b64 v[2:3], v[2:3], off
2964 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:4
2965 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
2966 ; GFX11-NEXT:    v_alignbit_b32 v1, s0, v3, 16
2967 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
2968 ; GFX11-NEXT:    v_perm_b32 v0, v2, v0, 0x7060302
2969 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
2970   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
2971   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
2972   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 3, i32 5, i32 7, i32 undef>
2973   ret <4 x bfloat> %shuffle
2976 define <4 x bfloat> @shuffle_v4bf16_0101(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
2977 ; GFX9-LABEL: shuffle_v4bf16_0101:
2978 ; GFX9:       ; %bb.0:
2979 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2980 ; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
2981 ; GFX9-NEXT:    s_mov_b32 s4, 0xffff
2982 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
2983 ; GFX9-NEXT:    v_bfi_b32 v0, s4, v0, v0
2984 ; GFX9-NEXT:    v_mov_b32_e32 v1, v0
2985 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
2987 ; GFX10-LABEL: shuffle_v4bf16_0101:
2988 ; GFX10:       ; %bb.0:
2989 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2990 ; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
2991 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
2992 ; GFX10-NEXT:    v_bfi_b32 v0, 0xffff, v0, v0
2993 ; GFX10-NEXT:    v_mov_b32_e32 v1, v0
2994 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
2996 ; GFX11-LABEL: shuffle_v4bf16_0101:
2997 ; GFX11:       ; %bb.0:
2998 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2999 ; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off
3000 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3001 ; GFX11-NEXT:    v_bfi_b32 v0, 0xffff, v0, v0
3002 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3003 ; GFX11-NEXT:    v_mov_b32_e32 v1, v0
3004 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3005   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
3006   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
3007   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 0, i32 1, i32 0, i32 1>
3008   ret <4 x bfloat> %shuffle
3011 define <4 x bfloat> @shuffle_v4bf16_0123(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
3012 ; GFX9-LABEL: shuffle_v4bf16_0123:
3013 ; GFX9:       ; %bb.0:
3014 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3015 ; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
3016 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3017 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3019 ; GFX10-LABEL: shuffle_v4bf16_0123:
3020 ; GFX10:       ; %bb.0:
3021 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3022 ; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
3023 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
3024 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3026 ; GFX11-LABEL: shuffle_v4bf16_0123:
3027 ; GFX11:       ; %bb.0:
3028 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3029 ; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off
3030 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3031 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3032   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
3033   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
3034   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
3035   ret <4 x bfloat> %shuffle
3038 define <4 x bfloat> @shuffle_v4bf16_0145(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
3039 ; GFX9-LABEL: shuffle_v4bf16_0145:
3040 ; GFX9:       ; %bb.0:
3041 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3042 ; GFX9-NEXT:    global_load_dwordx2 v[4:5], v[0:1], off
3043 ; GFX9-NEXT:    global_load_dwordx2 v[5:6], v[2:3], off
3044 ; GFX9-NEXT:    s_mov_b32 s4, 0xffff
3045 ; GFX9-NEXT:    ; kill: killed $vgpr0 killed $vgpr1
3046 ; GFX9-NEXT:    ; kill: killed $vgpr2 killed $vgpr3
3047 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
3048 ; GFX9-NEXT:    v_bfi_b32 v0, s4, v4, v4
3049 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3050 ; GFX9-NEXT:    v_bfi_b32 v1, s4, v5, v5
3051 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3053 ; GFX10-LABEL: shuffle_v4bf16_0145:
3054 ; GFX10:       ; %bb.0:
3055 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3056 ; GFX10-NEXT:    global_load_dwordx2 v[4:5], v[0:1], off
3057 ; GFX10-NEXT:    global_load_dwordx2 v[5:6], v[2:3], off
3058 ; GFX10-NEXT:    ; kill: killed $vgpr0 killed $vgpr1
3059 ; GFX10-NEXT:    ; kill: killed $vgpr2 killed $vgpr3
3060 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
3061 ; GFX10-NEXT:    v_bfi_b32 v0, 0xffff, v4, v4
3062 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
3063 ; GFX10-NEXT:    v_bfi_b32 v1, 0xffff, v5, v5
3064 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3066 ; GFX11-LABEL: shuffle_v4bf16_0145:
3067 ; GFX11:       ; %bb.0:
3068 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3069 ; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off
3070 ; GFX11-NEXT:    global_load_b64 v[1:2], v[2:3], off
3071 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
3072 ; GFX11-NEXT:    v_bfi_b32 v0, 0xffff, v0, v0
3073 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3074 ; GFX11-NEXT:    v_bfi_b32 v1, 0xffff, v1, v1
3075 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3076   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
3077   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
3078   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 0, i32 1, i32 4, i32 5>
3079   ret <4 x bfloat> %shuffle
3082 define <4 x bfloat> @shuffle_v4bf16_0167(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
3083 ; GFX9-LABEL: shuffle_v4bf16_0167:
3084 ; GFX9:       ; %bb.0:
3085 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3086 ; GFX9-NEXT:    global_load_dwordx2 v[5:6], v[0:1], off
3087 ; GFX9-NEXT:    global_load_dword v4, v[2:3], off offset:4
3088 ; GFX9-NEXT:    s_mov_b32 s4, 0xffff
3089 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
3090 ; GFX9-NEXT:    v_bfi_b32 v0, s4, v5, v5
3091 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3092 ; GFX9-NEXT:    v_mov_b32_e32 v1, v4
3093 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3095 ; GFX10-LABEL: shuffle_v4bf16_0167:
3096 ; GFX10:       ; %bb.0:
3097 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3098 ; GFX10-NEXT:    global_load_dwordx2 v[5:6], v[0:1], off
3099 ; GFX10-NEXT:    global_load_dword v4, v[2:3], off offset:4
3100 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
3101 ; GFX10-NEXT:    v_bfi_b32 v0, 0xffff, v5, v5
3102 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
3103 ; GFX10-NEXT:    v_mov_b32_e32 v1, v4
3104 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3106 ; GFX11-LABEL: shuffle_v4bf16_0167:
3107 ; GFX11:       ; %bb.0:
3108 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3109 ; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off
3110 ; GFX11-NEXT:    global_load_b32 v1, v[2:3], off offset:4
3111 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
3112 ; GFX11-NEXT:    v_bfi_b32 v0, 0xffff, v0, v0
3113 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3114 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3115   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
3116   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
3117   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
3118   ret <4 x bfloat> %shuffle
3121 define <4 x bfloat> @shuffle_v4bf16_2301(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
3122 ; GFX9-LABEL: shuffle_v4bf16_2301:
3123 ; GFX9:       ; %bb.0:
3124 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3125 ; GFX9-NEXT:    global_load_dwordx2 v[1:2], v[0:1], off
3126 ; GFX9-NEXT:    s_mov_b32 s4, 0xffff
3127 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3128 ; GFX9-NEXT:    v_bfi_b32 v1, s4, v1, v1
3129 ; GFX9-NEXT:    v_mov_b32_e32 v0, v2
3130 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3132 ; GFX10-LABEL: shuffle_v4bf16_2301:
3133 ; GFX10:       ; %bb.0:
3134 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3135 ; GFX10-NEXT:    global_load_dwordx2 v[1:2], v[0:1], off
3136 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
3137 ; GFX10-NEXT:    v_bfi_b32 v1, 0xffff, v1, v1
3138 ; GFX10-NEXT:    v_mov_b32_e32 v0, v2
3139 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3141 ; GFX11-LABEL: shuffle_v4bf16_2301:
3142 ; GFX11:       ; %bb.0:
3143 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3144 ; GFX11-NEXT:    global_load_b64 v[1:2], v[0:1], off
3145 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3146 ; GFX11-NEXT:    v_bfi_b32 v1, 0xffff, v1, v1
3147 ; GFX11-NEXT:    v_mov_b32_e32 v0, v2
3148 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3149   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
3150   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
3151   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 2, i32 3, i32 0, i32 1>
3152   ret <4 x bfloat> %shuffle
3155 define <4 x bfloat> @shuffle_v4bf16_2323(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
3156 ; GFX9-LABEL: shuffle_v4bf16_2323:
3157 ; GFX9:       ; %bb.0:
3158 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3159 ; GFX9-NEXT:    global_load_dword v0, v[0:1], off offset:4
3160 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3161 ; GFX9-NEXT:    v_mov_b32_e32 v1, v0
3162 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3164 ; GFX10-LABEL: shuffle_v4bf16_2323:
3165 ; GFX10:       ; %bb.0:
3166 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3167 ; GFX10-NEXT:    global_load_dword v0, v[0:1], off offset:4
3168 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
3169 ; GFX10-NEXT:    v_mov_b32_e32 v1, v0
3170 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3172 ; GFX11-LABEL: shuffle_v4bf16_2323:
3173 ; GFX11:       ; %bb.0:
3174 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3175 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:4
3176 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3177 ; GFX11-NEXT:    v_mov_b32_e32 v1, v0
3178 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3179   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
3180   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
3181   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 2, i32 3, i32 2, i32 3>
3182   ret <4 x bfloat> %shuffle
3185 define <4 x bfloat> @shuffle_v4bf16_2345(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
3186 ; GFX9-LABEL: shuffle_v4bf16_2345:
3187 ; GFX9:       ; %bb.0:
3188 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3189 ; GFX9-NEXT:    global_load_dwordx2 v[5:6], v[2:3], off
3190 ; GFX9-NEXT:    global_load_dword v4, v[0:1], off offset:4
3191 ; GFX9-NEXT:    s_mov_b32 s4, 0xffff
3192 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
3193 ; GFX9-NEXT:    v_bfi_b32 v1, s4, v5, v5
3194 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3195 ; GFX9-NEXT:    v_mov_b32_e32 v0, v4
3196 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3198 ; GFX10-LABEL: shuffle_v4bf16_2345:
3199 ; GFX10:       ; %bb.0:
3200 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3201 ; GFX10-NEXT:    global_load_dwordx2 v[5:6], v[2:3], off
3202 ; GFX10-NEXT:    global_load_dword v4, v[0:1], off offset:4
3203 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
3204 ; GFX10-NEXT:    v_bfi_b32 v1, 0xffff, v5, v5
3205 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
3206 ; GFX10-NEXT:    v_mov_b32_e32 v0, v4
3207 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3209 ; GFX11-LABEL: shuffle_v4bf16_2345:
3210 ; GFX11:       ; %bb.0:
3211 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3212 ; GFX11-NEXT:    global_load_b64 v[2:3], v[2:3], off
3213 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:4
3214 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
3215 ; GFX11-NEXT:    v_bfi_b32 v1, 0xffff, v2, v2
3216 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3217 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3218   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
3219   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
3220   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 2, i32 3, i32 4, i32 5>
3221   ret <4 x bfloat> %shuffle
3224 define <4 x bfloat> @shuffle_v4bf16_2367(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
3225 ; GFX9-LABEL: shuffle_v4bf16_2367:
3226 ; GFX9:       ; %bb.0:
3227 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3228 ; GFX9-NEXT:    global_load_dword v4, v[0:1], off offset:4
3229 ; GFX9-NEXT:    global_load_dword v5, v[2:3], off offset:4
3230 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
3231 ; GFX9-NEXT:    v_mov_b32_e32 v0, v4
3232 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3233 ; GFX9-NEXT:    v_mov_b32_e32 v1, v5
3234 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3236 ; GFX10-LABEL: shuffle_v4bf16_2367:
3237 ; GFX10:       ; %bb.0:
3238 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3239 ; GFX10-NEXT:    global_load_dword v4, v[0:1], off offset:4
3240 ; GFX10-NEXT:    global_load_dword v5, v[2:3], off offset:4
3241 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
3242 ; GFX10-NEXT:    v_mov_b32_e32 v0, v4
3243 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
3244 ; GFX10-NEXT:    v_mov_b32_e32 v1, v5
3245 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3247 ; GFX11-LABEL: shuffle_v4bf16_2367:
3248 ; GFX11:       ; %bb.0:
3249 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3250 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:4
3251 ; GFX11-NEXT:    global_load_b32 v1, v[2:3], off offset:4
3252 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3253 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3254   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
3255   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
3256   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 2, i32 3, i32 6, i32 7>
3257   ret <4 x bfloat> %shuffle
3260 define <4 x bfloat> @shuffle_v4bf16_4501(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
3261 ; GFX9-LABEL: shuffle_v4bf16_4501:
3262 ; GFX9:       ; %bb.0:
3263 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3264 ; GFX9-NEXT:    global_load_dwordx2 v[4:5], v[2:3], off
3265 ; GFX9-NEXT:    global_load_dwordx2 v[5:6], v[0:1], off
3266 ; GFX9-NEXT:    s_mov_b32 s4, 0xffff
3267 ; GFX9-NEXT:    ; kill: killed $vgpr0 killed $vgpr1
3268 ; GFX9-NEXT:    ; kill: killed $vgpr2 killed $vgpr3
3269 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
3270 ; GFX9-NEXT:    v_bfi_b32 v0, s4, v4, v4
3271 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3272 ; GFX9-NEXT:    v_bfi_b32 v1, s4, v5, v5
3273 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3275 ; GFX10-LABEL: shuffle_v4bf16_4501:
3276 ; GFX10:       ; %bb.0:
3277 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3278 ; GFX10-NEXT:    global_load_dwordx2 v[4:5], v[2:3], off
3279 ; GFX10-NEXT:    global_load_dwordx2 v[5:6], v[0:1], off
3280 ; GFX10-NEXT:    ; kill: killed $vgpr0 killed $vgpr1
3281 ; GFX10-NEXT:    ; kill: killed $vgpr2 killed $vgpr3
3282 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
3283 ; GFX10-NEXT:    v_bfi_b32 v0, 0xffff, v4, v4
3284 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
3285 ; GFX10-NEXT:    v_bfi_b32 v1, 0xffff, v5, v5
3286 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3288 ; GFX11-LABEL: shuffle_v4bf16_4501:
3289 ; GFX11:       ; %bb.0:
3290 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3291 ; GFX11-NEXT:    global_load_b64 v[2:3], v[2:3], off
3292 ; GFX11-NEXT:    global_load_b64 v[3:4], v[0:1], off
3293 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
3294 ; GFX11-NEXT:    v_bfi_b32 v0, 0xffff, v2, v2
3295 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3296 ; GFX11-NEXT:    v_bfi_b32 v1, 0xffff, v3, v3
3297 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3298   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
3299   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
3300   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
3301   ret <4 x bfloat> %shuffle
3304 define <4 x bfloat> @shuffle_v4bf16_4523(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
3305 ; GFX9-LABEL: shuffle_v4bf16_4523:
3306 ; GFX9:       ; %bb.0:
3307 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3308 ; GFX9-NEXT:    global_load_dwordx2 v[5:6], v[2:3], off
3309 ; GFX9-NEXT:    global_load_dword v4, v[0:1], off offset:4
3310 ; GFX9-NEXT:    s_mov_b32 s4, 0xffff
3311 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
3312 ; GFX9-NEXT:    v_bfi_b32 v0, s4, v5, v5
3313 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3314 ; GFX9-NEXT:    v_mov_b32_e32 v1, v4
3315 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3317 ; GFX10-LABEL: shuffle_v4bf16_4523:
3318 ; GFX10:       ; %bb.0:
3319 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3320 ; GFX10-NEXT:    global_load_dwordx2 v[5:6], v[2:3], off
3321 ; GFX10-NEXT:    global_load_dword v4, v[0:1], off offset:4
3322 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
3323 ; GFX10-NEXT:    v_bfi_b32 v0, 0xffff, v5, v5
3324 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
3325 ; GFX10-NEXT:    v_mov_b32_e32 v1, v4
3326 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3328 ; GFX11-LABEL: shuffle_v4bf16_4523:
3329 ; GFX11:       ; %bb.0:
3330 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3331 ; GFX11-NEXT:    global_load_b64 v[2:3], v[2:3], off
3332 ; GFX11-NEXT:    global_load_b32 v1, v[0:1], off offset:4
3333 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
3334 ; GFX11-NEXT:    v_bfi_b32 v0, 0xffff, v2, v2
3335 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3336 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3337   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
3338   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
3339   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 4, i32 5, i32 2, i32 3>
3340   ret <4 x bfloat> %shuffle
3343 define <4 x bfloat> @shuffle_v4bf16_4545(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
3344 ; GFX9-LABEL: shuffle_v4bf16_4545:
3345 ; GFX9:       ; %bb.0:
3346 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3347 ; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[2:3], off
3348 ; GFX9-NEXT:    s_mov_b32 s4, 0xffff
3349 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3350 ; GFX9-NEXT:    v_bfi_b32 v0, s4, v0, v0
3351 ; GFX9-NEXT:    v_mov_b32_e32 v1, v0
3352 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3354 ; GFX10-LABEL: shuffle_v4bf16_4545:
3355 ; GFX10:       ; %bb.0:
3356 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3357 ; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[2:3], off
3358 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
3359 ; GFX10-NEXT:    v_bfi_b32 v0, 0xffff, v0, v0
3360 ; GFX10-NEXT:    v_mov_b32_e32 v1, v0
3361 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3363 ; GFX11-LABEL: shuffle_v4bf16_4545:
3364 ; GFX11:       ; %bb.0:
3365 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3366 ; GFX11-NEXT:    global_load_b64 v[0:1], v[2:3], off
3367 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3368 ; GFX11-NEXT:    v_bfi_b32 v0, 0xffff, v0, v0
3369 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3370 ; GFX11-NEXT:    v_mov_b32_e32 v1, v0
3371 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3372   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
3373   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
3374   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 4, i32 5, i32 4, i32 5>
3375   ret <4 x bfloat> %shuffle
3378 define <4 x bfloat> @shuffle_v4bf16_4567(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
3379 ; GFX9-LABEL: shuffle_v4bf16_4567:
3380 ; GFX9:       ; %bb.0:
3381 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3382 ; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[2:3], off
3383 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3384 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3386 ; GFX10-LABEL: shuffle_v4bf16_4567:
3387 ; GFX10:       ; %bb.0:
3388 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3389 ; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[2:3], off
3390 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
3391 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3393 ; GFX11-LABEL: shuffle_v4bf16_4567:
3394 ; GFX11:       ; %bb.0:
3395 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3396 ; GFX11-NEXT:    global_load_b64 v[0:1], v[2:3], off
3397 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3398 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3399   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
3400   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
3401   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
3402   ret <4 x bfloat> %shuffle
3405 define <4 x bfloat> @shuffle_v4bf16_6701(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
3406 ; GFX9-LABEL: shuffle_v4bf16_6701:
3407 ; GFX9:       ; %bb.0:
3408 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3409 ; GFX9-NEXT:    global_load_dwordx2 v[5:6], v[0:1], off
3410 ; GFX9-NEXT:    global_load_dword v4, v[2:3], off offset:4
3411 ; GFX9-NEXT:    s_mov_b32 s4, 0xffff
3412 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
3413 ; GFX9-NEXT:    v_bfi_b32 v1, s4, v5, v5
3414 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3415 ; GFX9-NEXT:    v_mov_b32_e32 v0, v4
3416 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3418 ; GFX10-LABEL: shuffle_v4bf16_6701:
3419 ; GFX10:       ; %bb.0:
3420 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3421 ; GFX10-NEXT:    global_load_dwordx2 v[5:6], v[0:1], off
3422 ; GFX10-NEXT:    global_load_dword v4, v[2:3], off offset:4
3423 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
3424 ; GFX10-NEXT:    v_bfi_b32 v1, 0xffff, v5, v5
3425 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
3426 ; GFX10-NEXT:    v_mov_b32_e32 v0, v4
3427 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3429 ; GFX11-LABEL: shuffle_v4bf16_6701:
3430 ; GFX11:       ; %bb.0:
3431 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3432 ; GFX11-NEXT:    global_load_b64 v[4:5], v[0:1], off
3433 ; GFX11-NEXT:    global_load_b32 v0, v[2:3], off offset:4
3434 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
3435 ; GFX11-NEXT:    v_bfi_b32 v1, 0xffff, v4, v4
3436 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3437 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3438   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
3439   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
3440   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 6, i32 7, i32 0, i32 1>
3441   ret <4 x bfloat> %shuffle
3444 define <4 x bfloat> @shuffle_v4bf16_6723(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
3445 ; GFX9-LABEL: shuffle_v4bf16_6723:
3446 ; GFX9:       ; %bb.0:
3447 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3448 ; GFX9-NEXT:    global_load_dword v4, v[2:3], off offset:4
3449 ; GFX9-NEXT:    global_load_dword v5, v[0:1], off offset:4
3450 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
3451 ; GFX9-NEXT:    v_mov_b32_e32 v0, v4
3452 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3453 ; GFX9-NEXT:    v_mov_b32_e32 v1, v5
3454 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3456 ; GFX10-LABEL: shuffle_v4bf16_6723:
3457 ; GFX10:       ; %bb.0:
3458 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3459 ; GFX10-NEXT:    global_load_dword v4, v[2:3], off offset:4
3460 ; GFX10-NEXT:    global_load_dword v5, v[0:1], off offset:4
3461 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
3462 ; GFX10-NEXT:    v_mov_b32_e32 v0, v4
3463 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
3464 ; GFX10-NEXT:    v_mov_b32_e32 v1, v5
3465 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3467 ; GFX11-LABEL: shuffle_v4bf16_6723:
3468 ; GFX11:       ; %bb.0:
3469 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3470 ; GFX11-NEXT:    global_load_b32 v2, v[2:3], off offset:4
3471 ; GFX11-NEXT:    global_load_b32 v1, v[0:1], off offset:4
3472 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
3473 ; GFX11-NEXT:    v_mov_b32_e32 v0, v2
3474 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3475 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3476   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
3477   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
3478   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 6, i32 7, i32 2, i32 3>
3479   ret <4 x bfloat> %shuffle
3482 define <4 x bfloat> @shuffle_v4bf16_6745(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
3483 ; GFX9-LABEL: shuffle_v4bf16_6745:
3484 ; GFX9:       ; %bb.0:
3485 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3486 ; GFX9-NEXT:    global_load_dwordx2 v[1:2], v[2:3], off
3487 ; GFX9-NEXT:    s_mov_b32 s4, 0xffff
3488 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3489 ; GFX9-NEXT:    v_bfi_b32 v1, s4, v1, v1
3490 ; GFX9-NEXT:    v_mov_b32_e32 v0, v2
3491 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3493 ; GFX10-LABEL: shuffle_v4bf16_6745:
3494 ; GFX10:       ; %bb.0:
3495 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3496 ; GFX10-NEXT:    global_load_dwordx2 v[1:2], v[2:3], off
3497 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
3498 ; GFX10-NEXT:    v_bfi_b32 v1, 0xffff, v1, v1
3499 ; GFX10-NEXT:    v_mov_b32_e32 v0, v2
3500 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3502 ; GFX11-LABEL: shuffle_v4bf16_6745:
3503 ; GFX11:       ; %bb.0:
3504 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3505 ; GFX11-NEXT:    global_load_b64 v[1:2], v[2:3], off
3506 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3507 ; GFX11-NEXT:    v_bfi_b32 v1, 0xffff, v1, v1
3508 ; GFX11-NEXT:    v_mov_b32_e32 v0, v2
3509 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3510   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
3511   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
3512   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 6, i32 7, i32 4, i32 5>
3513   ret <4 x bfloat> %shuffle
3516 define <4 x bfloat> @shuffle_v4bf16_6767(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
3517 ; GFX9-LABEL: shuffle_v4bf16_6767:
3518 ; GFX9:       ; %bb.0:
3519 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3520 ; GFX9-NEXT:    global_load_dword v0, v[2:3], off offset:4
3521 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3522 ; GFX9-NEXT:    v_mov_b32_e32 v1, v0
3523 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3525 ; GFX10-LABEL: shuffle_v4bf16_6767:
3526 ; GFX10:       ; %bb.0:
3527 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3528 ; GFX10-NEXT:    global_load_dword v0, v[2:3], off offset:4
3529 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
3530 ; GFX10-NEXT:    v_mov_b32_e32 v1, v0
3531 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3533 ; GFX11-LABEL: shuffle_v4bf16_6767:
3534 ; GFX11:       ; %bb.0:
3535 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3536 ; GFX11-NEXT:    global_load_b32 v0, v[2:3], off offset:4
3537 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3538 ; GFX11-NEXT:    v_mov_b32_e32 v1, v0
3539 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3540   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
3541   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
3542   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 6, i32 7, i32 6, i32 7>
3543   ret <4 x bfloat> %shuffle
3546 define <4 x bfloat> @shuffle_v4bf16_2356(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
3547 ; GFX9-LABEL: shuffle_v4bf16_2356:
3548 ; GFX9:       ; %bb.0:
3549 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3550 ; GFX9-NEXT:    global_load_dwordx2 v[5:6], v[2:3], off
3551 ; GFX9-NEXT:    global_load_dword v4, v[0:1], off offset:4
3552 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
3553 ; GFX9-NEXT:    v_alignbit_b32 v1, v6, v5, 16
3554 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3555 ; GFX9-NEXT:    v_mov_b32_e32 v0, v4
3556 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3558 ; GFX10-LABEL: shuffle_v4bf16_2356:
3559 ; GFX10:       ; %bb.0:
3560 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3561 ; GFX10-NEXT:    global_load_dwordx2 v[5:6], v[2:3], off
3562 ; GFX10-NEXT:    global_load_dword v4, v[0:1], off offset:4
3563 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
3564 ; GFX10-NEXT:    v_alignbit_b32 v1, v6, v5, 16
3565 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
3566 ; GFX10-NEXT:    v_mov_b32_e32 v0, v4
3567 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3569 ; GFX11-LABEL: shuffle_v4bf16_2356:
3570 ; GFX11:       ; %bb.0:
3571 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3572 ; GFX11-NEXT:    global_load_b64 v[2:3], v[2:3], off
3573 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:4
3574 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
3575 ; GFX11-NEXT:    v_alignbit_b32 v1, v3, v2, 16
3576 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3577 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3578   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
3579   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
3580   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 2, i32 3, i32 5, i32 6>
3581   ret <4 x bfloat> %shuffle
3584 define <4 x bfloat> @shuffle_v4bf16_5623(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
3585 ; GFX9-LABEL: shuffle_v4bf16_5623:
3586 ; GFX9:       ; %bb.0:
3587 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3588 ; GFX9-NEXT:    global_load_dwordx2 v[5:6], v[2:3], off
3589 ; GFX9-NEXT:    global_load_dword v4, v[0:1], off offset:4
3590 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
3591 ; GFX9-NEXT:    v_alignbit_b32 v0, v6, v5, 16
3592 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3593 ; GFX9-NEXT:    v_mov_b32_e32 v1, v4
3594 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3596 ; GFX10-LABEL: shuffle_v4bf16_5623:
3597 ; GFX10:       ; %bb.0:
3598 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3599 ; GFX10-NEXT:    global_load_dwordx2 v[5:6], v[2:3], off
3600 ; GFX10-NEXT:    global_load_dword v4, v[0:1], off offset:4
3601 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
3602 ; GFX10-NEXT:    v_alignbit_b32 v0, v6, v5, 16
3603 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
3604 ; GFX10-NEXT:    v_mov_b32_e32 v1, v4
3605 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3607 ; GFX11-LABEL: shuffle_v4bf16_5623:
3608 ; GFX11:       ; %bb.0:
3609 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3610 ; GFX11-NEXT:    global_load_b64 v[2:3], v[2:3], off
3611 ; GFX11-NEXT:    global_load_b32 v1, v[0:1], off offset:4
3612 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
3613 ; GFX11-NEXT:    v_alignbit_b32 v0, v3, v2, 16
3614 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3615 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3616   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
3617   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
3618   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 5, i32 6, i32 2, i32 3>
3619   ret <4 x bfloat> %shuffle
3622 define <4 x bfloat> @shuffle_v4bf16_3456(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
3623 ; GFX9-LABEL: shuffle_v4bf16_3456:
3624 ; GFX9:       ; %bb.0:
3625 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3626 ; GFX9-NEXT:    global_load_dwordx2 v[4:5], v[2:3], off
3627 ; GFX9-NEXT:    global_load_dword v6, v[0:1], off offset:4
3628 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
3629 ; GFX9-NEXT:    v_alignbit_b32 v1, v5, v4, 16
3630 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3631 ; GFX9-NEXT:    v_alignbit_b32 v0, v4, v6, 16
3632 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3634 ; GFX10-LABEL: shuffle_v4bf16_3456:
3635 ; GFX10:       ; %bb.0:
3636 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3637 ; GFX10-NEXT:    global_load_dwordx2 v[4:5], v[2:3], off
3638 ; GFX10-NEXT:    global_load_dword v6, v[0:1], off offset:4
3639 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
3640 ; GFX10-NEXT:    v_alignbit_b32 v1, v5, v4, 16
3641 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
3642 ; GFX10-NEXT:    v_alignbit_b32 v0, v4, v6, 16
3643 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3645 ; GFX11-LABEL: shuffle_v4bf16_3456:
3646 ; GFX11:       ; %bb.0:
3647 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3648 ; GFX11-NEXT:    global_load_b64 v[2:3], v[2:3], off
3649 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:4
3650 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
3651 ; GFX11-NEXT:    v_alignbit_b32 v1, v3, v2, 16
3652 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3653 ; GFX11-NEXT:    v_alignbit_b32 v0, v2, v0, 16
3654 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3655   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
3656   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
3657   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 3, i32 4, i32 5, i32 6>
3658   ret <4 x bfloat> %shuffle
3661 define <4 x bfloat> @shuffle_v4bf16_5634(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
3662 ; GFX9-LABEL: shuffle_v4bf16_5634:
3663 ; GFX9:       ; %bb.0:
3664 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3665 ; GFX9-NEXT:    global_load_dwordx2 v[4:5], v[2:3], off
3666 ; GFX9-NEXT:    global_load_dword v6, v[0:1], off offset:4
3667 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
3668 ; GFX9-NEXT:    v_alignbit_b32 v0, v5, v4, 16
3669 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3670 ; GFX9-NEXT:    v_alignbit_b32 v1, v4, v6, 16
3671 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3673 ; GFX10-LABEL: shuffle_v4bf16_5634:
3674 ; GFX10:       ; %bb.0:
3675 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3676 ; GFX10-NEXT:    global_load_dwordx2 v[4:5], v[2:3], off
3677 ; GFX10-NEXT:    global_load_dword v6, v[0:1], off offset:4
3678 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
3679 ; GFX10-NEXT:    v_alignbit_b32 v0, v5, v4, 16
3680 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
3681 ; GFX10-NEXT:    v_alignbit_b32 v1, v4, v6, 16
3682 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3684 ; GFX11-LABEL: shuffle_v4bf16_5634:
3685 ; GFX11:       ; %bb.0:
3686 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3687 ; GFX11-NEXT:    global_load_b64 v[2:3], v[2:3], off
3688 ; GFX11-NEXT:    global_load_b32 v1, v[0:1], off offset:4
3689 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
3690 ; GFX11-NEXT:    v_alignbit_b32 v0, v3, v2, 16
3691 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3692 ; GFX11-NEXT:    v_alignbit_b32 v1, v2, v1, 16
3693 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3694   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
3695   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
3696   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 5, i32 6, i32 3, i32 4>
3697   ret <4 x bfloat> %shuffle
3700 define <4 x bfloat> @shuffle_v4bf16_5734(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
3701 ; GFX9-LABEL: shuffle_v4bf16_5734:
3702 ; GFX9:       ; %bb.0:
3703 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3704 ; GFX9-NEXT:    global_load_dwordx2 v[4:5], v[2:3], off
3705 ; GFX9-NEXT:    global_load_dword v6, v[0:1], off offset:4
3706 ; GFX9-NEXT:    s_mov_b32 s4, 0x7060302
3707 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
3708 ; GFX9-NEXT:    v_perm_b32 v0, v5, v4, s4
3709 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3710 ; GFX9-NEXT:    v_alignbit_b32 v1, v4, v6, 16
3711 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3713 ; GFX10-LABEL: shuffle_v4bf16_5734:
3714 ; GFX10:       ; %bb.0:
3715 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3716 ; GFX10-NEXT:    global_load_dwordx2 v[4:5], v[2:3], off
3717 ; GFX10-NEXT:    global_load_dword v6, v[0:1], off offset:4
3718 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
3719 ; GFX10-NEXT:    v_perm_b32 v0, v5, v4, 0x7060302
3720 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
3721 ; GFX10-NEXT:    v_alignbit_b32 v1, v4, v6, 16
3722 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3724 ; GFX11-LABEL: shuffle_v4bf16_5734:
3725 ; GFX11:       ; %bb.0:
3726 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3727 ; GFX11-NEXT:    global_load_b64 v[2:3], v[2:3], off
3728 ; GFX11-NEXT:    global_load_b32 v1, v[0:1], off offset:4
3729 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
3730 ; GFX11-NEXT:    v_perm_b32 v0, v3, v2, 0x7060302
3731 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3732 ; GFX11-NEXT:    v_alignbit_b32 v1, v2, v1, 16
3733 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3734   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
3735   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
3736   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 5, i32 7, i32 3, i32 4>
3737   ret <4 x bfloat> %shuffle
3740 define <4 x bfloat> @shuffle_v4bf16_0000(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
3741 ; GFX9-LABEL: shuffle_v4bf16_0000:
3742 ; GFX9:       ; %bb.0:
3743 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3744 ; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
3745 ; GFX9-NEXT:    s_mov_b32 s4, 0x5040100
3746 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3747 ; GFX9-NEXT:    v_perm_b32 v0, v0, v0, s4
3748 ; GFX9-NEXT:    v_mov_b32_e32 v1, v0
3749 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3751 ; GFX10-LABEL: shuffle_v4bf16_0000:
3752 ; GFX10:       ; %bb.0:
3753 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3754 ; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
3755 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
3756 ; GFX10-NEXT:    v_perm_b32 v0, v0, v0, 0x5040100
3757 ; GFX10-NEXT:    v_mov_b32_e32 v1, v0
3758 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3760 ; GFX11-LABEL: shuffle_v4bf16_0000:
3761 ; GFX11:       ; %bb.0:
3762 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3763 ; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off
3764 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3765 ; GFX11-NEXT:    v_perm_b32 v0, v0, v0, 0x5040100
3766 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3767 ; GFX11-NEXT:    v_mov_b32_e32 v1, v0
3768 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3769   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
3770   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
3771   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> zeroinitializer
3772   ret <4 x bfloat> %shuffle
3775 define <4 x bfloat> @shuffle_v4bf16_1010(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
3776 ; GFX9-LABEL: shuffle_v4bf16_1010:
3777 ; GFX9:       ; %bb.0:
3778 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3779 ; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
3780 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3781 ; GFX9-NEXT:    v_alignbit_b32 v0, v0, v0, 16
3782 ; GFX9-NEXT:    v_mov_b32_e32 v1, v0
3783 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3785 ; GFX10-LABEL: shuffle_v4bf16_1010:
3786 ; GFX10:       ; %bb.0:
3787 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3788 ; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
3789 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
3790 ; GFX10-NEXT:    v_alignbit_b32 v0, v0, v0, 16
3791 ; GFX10-NEXT:    v_mov_b32_e32 v1, v0
3792 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3794 ; GFX11-LABEL: shuffle_v4bf16_1010:
3795 ; GFX11:       ; %bb.0:
3796 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3797 ; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off
3798 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3799 ; GFX11-NEXT:    v_alignbit_b32 v0, v0, v0, 16
3800 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3801 ; GFX11-NEXT:    v_mov_b32_e32 v1, v0
3802 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3803   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
3804   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
3805   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 1, i32 0, i32 1, i32 0>
3806   ret <4 x bfloat> %shuffle
3809 define <4 x bfloat> @shuffle_v4bf16_1100(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
3810 ; GFX9-LABEL: shuffle_v4bf16_1100:
3811 ; GFX9:       ; %bb.0:
3812 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3813 ; GFX9-NEXT:    global_load_dwordx2 v[1:2], v[0:1], off
3814 ; GFX9-NEXT:    s_mov_b32 s4, 0x7060302
3815 ; GFX9-NEXT:    s_mov_b32 s5, 0x5040100
3816 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3817 ; GFX9-NEXT:    v_perm_b32 v0, v1, v1, s4
3818 ; GFX9-NEXT:    v_perm_b32 v1, v1, v1, s5
3819 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3821 ; GFX10-LABEL: shuffle_v4bf16_1100:
3822 ; GFX10:       ; %bb.0:
3823 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3824 ; GFX10-NEXT:    global_load_dwordx2 v[1:2], v[0:1], off
3825 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
3826 ; GFX10-NEXT:    v_perm_b32 v0, v1, v1, 0x7060302
3827 ; GFX10-NEXT:    v_perm_b32 v1, v1, v1, 0x5040100
3828 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3830 ; GFX11-LABEL: shuffle_v4bf16_1100:
3831 ; GFX11:       ; %bb.0:
3832 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3833 ; GFX11-NEXT:    global_load_b64 v[1:2], v[0:1], off
3834 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3835 ; GFX11-NEXT:    v_perm_b32 v0, v1, v1, 0x7060302
3836 ; GFX11-NEXT:    v_perm_b32 v1, v1, v1, 0x5040100
3837 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3838   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
3839   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
3840   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 1, i32 1, i32 0, i32 0>
3841   ret <4 x bfloat> %shuffle
3844 define <4 x bfloat> @shuffle_v4bf16_6161(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
3845 ; GFX9-LABEL: shuffle_v4bf16_6161:
3846 ; GFX9:       ; %bb.0:
3847 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3848 ; GFX9-NEXT:    global_load_dword v4, v[0:1], off
3849 ; GFX9-NEXT:    global_load_dword v5, v[2:3], off offset:4
3850 ; GFX9-NEXT:    s_mov_b32 s4, 0xffff
3851 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3852 ; GFX9-NEXT:    v_bfi_b32 v0, s4, v5, v4
3853 ; GFX9-NEXT:    v_mov_b32_e32 v1, v0
3854 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3856 ; GFX10-LABEL: shuffle_v4bf16_6161:
3857 ; GFX10:       ; %bb.0:
3858 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3859 ; GFX10-NEXT:    global_load_dword v4, v[0:1], off
3860 ; GFX10-NEXT:    global_load_dword v5, v[2:3], off offset:4
3861 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
3862 ; GFX10-NEXT:    v_bfi_b32 v0, 0xffff, v5, v4
3863 ; GFX10-NEXT:    v_mov_b32_e32 v1, v0
3864 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3866 ; GFX11-LABEL: shuffle_v4bf16_6161:
3867 ; GFX11:       ; %bb.0:
3868 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3869 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off
3870 ; GFX11-NEXT:    global_load_b32 v1, v[2:3], off offset:4
3871 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3872 ; GFX11-NEXT:    v_bfi_b32 v0, 0xffff, v1, v0
3873 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3874 ; GFX11-NEXT:    v_mov_b32_e32 v1, v0
3875 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3876   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
3877   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
3878   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 6, i32 1, i32 6, i32 1>
3879   ret <4 x bfloat> %shuffle
3882 define <4 x bfloat> @shuffle_v4bf16_2333(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
3883 ; GFX9-LABEL: shuffle_v4bf16_2333:
3884 ; GFX9:       ; %bb.0:
3885 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3886 ; GFX9-NEXT:    global_load_dword v0, v[0:1], off offset:4
3887 ; GFX9-NEXT:    s_mov_b32 s4, 0x7060302
3888 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3889 ; GFX9-NEXT:    v_perm_b32 v1, v0, v0, s4
3890 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3892 ; GFX10-LABEL: shuffle_v4bf16_2333:
3893 ; GFX10:       ; %bb.0:
3894 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3895 ; GFX10-NEXT:    global_load_dword v0, v[0:1], off offset:4
3896 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
3897 ; GFX10-NEXT:    v_perm_b32 v1, v0, v0, 0x7060302
3898 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3900 ; GFX11-LABEL: shuffle_v4bf16_2333:
3901 ; GFX11:       ; %bb.0:
3902 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3903 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:4
3904 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3905 ; GFX11-NEXT:    v_perm_b32 v1, v0, v0, 0x7060302
3906 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3907   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
3908   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
3909   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 2, i32 3, i32 3, i32 3>
3910   ret <4 x bfloat> %shuffle
3913 define <4 x bfloat> @shuffle_v4bf16_6667(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
3914 ; GFX9-LABEL: shuffle_v4bf16_6667:
3915 ; GFX9:       ; %bb.0:
3916 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3917 ; GFX9-NEXT:    global_load_dword v0, v[0:1], off offset:4
3918 ; GFX9-NEXT:    s_mov_b32 s4, 0x7060302
3919 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3920 ; GFX9-NEXT:    v_perm_b32 v1, v0, v0, s4
3921 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3923 ; GFX10-LABEL: shuffle_v4bf16_6667:
3924 ; GFX10:       ; %bb.0:
3925 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3926 ; GFX10-NEXT:    global_load_dword v0, v[0:1], off offset:4
3927 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
3928 ; GFX10-NEXT:    v_perm_b32 v1, v0, v0, 0x7060302
3929 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3931 ; GFX11-LABEL: shuffle_v4bf16_6667:
3932 ; GFX11:       ; %bb.0:
3933 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3934 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off offset:4
3935 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3936 ; GFX11-NEXT:    v_perm_b32 v1, v0, v0, 0x7060302
3937 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3938   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
3939   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
3940   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 2, i32 3, i32 3, i32 3>
3941   ret <4 x bfloat> %shuffle
3944 define <4 x bfloat> @shuffle_v8bf16_0101(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
3945 ; GFX9-LABEL: shuffle_v8bf16_0101:
3946 ; GFX9:       ; %bb.0:
3947 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3948 ; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
3949 ; GFX9-NEXT:    s_mov_b32 s4, 0xffff
3950 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3951 ; GFX9-NEXT:    v_bfi_b32 v0, s4, v0, v0
3952 ; GFX9-NEXT:    v_mov_b32_e32 v1, v0
3953 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3955 ; GFX10-LABEL: shuffle_v8bf16_0101:
3956 ; GFX10:       ; %bb.0:
3957 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3958 ; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
3959 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
3960 ; GFX10-NEXT:    v_bfi_b32 v0, 0xffff, v0, v0
3961 ; GFX10-NEXT:    v_mov_b32_e32 v1, v0
3962 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3964 ; GFX11-LABEL: shuffle_v8bf16_0101:
3965 ; GFX11:       ; %bb.0:
3966 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3967 ; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off
3968 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3969 ; GFX11-NEXT:    v_bfi_b32 v0, 0xffff, v0, v0
3970 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
3971 ; GFX11-NEXT:    v_mov_b32_e32 v1, v0
3972 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
3973   %val0 = load <8 x bfloat>, ptr addrspace(1) %arg0
3974   %val1 = load <8 x bfloat>, ptr addrspace(1) %arg1
3975   %shuffle = shufflevector <8 x bfloat> %val0, <8 x bfloat> %val1, <4 x i32> <i32 0, i32 1, i32 0, i32 1>
3976   ret <4 x bfloat> %shuffle
3979 define <4 x bfloat> @shuffle_v8bf16_0123(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
3980 ; GFX9-LABEL: shuffle_v8bf16_0123:
3981 ; GFX9:       ; %bb.0:
3982 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3983 ; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
3984 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
3985 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
3987 ; GFX10-LABEL: shuffle_v8bf16_0123:
3988 ; GFX10:       ; %bb.0:
3989 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3990 ; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
3991 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
3992 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
3994 ; GFX11-LABEL: shuffle_v8bf16_0123:
3995 ; GFX11:       ; %bb.0:
3996 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3997 ; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off
3998 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
3999 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
4000   %val0 = load <8 x bfloat>, ptr addrspace(1) %arg0
4001   %val1 = load <8 x bfloat>, ptr addrspace(1) %arg1
4002   %shuffle = shufflevector <8 x bfloat> %val0, <8 x bfloat> %val1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
4003   ret <4 x bfloat> %shuffle
4006 define <4 x bfloat> @shuffle_v8bf16_4589(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
4007 ; GFX9-LABEL: shuffle_v8bf16_4589:
4008 ; GFX9:       ; %bb.0:
4009 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4010 ; GFX9-NEXT:    global_load_dwordx2 v[4:5], v[0:1], off offset:8
4011 ; GFX9-NEXT:    global_load_dwordx2 v[5:6], v[2:3], off
4012 ; GFX9-NEXT:    s_mov_b32 s4, 0xffff
4013 ; GFX9-NEXT:    ; kill: killed $vgpr0 killed $vgpr1
4014 ; GFX9-NEXT:    ; kill: killed $vgpr2 killed $vgpr3
4015 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
4016 ; GFX9-NEXT:    v_bfi_b32 v0, s4, v4, v4
4017 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4018 ; GFX9-NEXT:    v_bfi_b32 v1, s4, v5, v5
4019 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
4021 ; GFX10-LABEL: shuffle_v8bf16_4589:
4022 ; GFX10:       ; %bb.0:
4023 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4024 ; GFX10-NEXT:    global_load_dwordx2 v[4:5], v[0:1], off offset:8
4025 ; GFX10-NEXT:    global_load_dwordx2 v[5:6], v[2:3], off
4026 ; GFX10-NEXT:    ; kill: killed $vgpr0 killed $vgpr1
4027 ; GFX10-NEXT:    ; kill: killed $vgpr2 killed $vgpr3
4028 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
4029 ; GFX10-NEXT:    v_bfi_b32 v0, 0xffff, v4, v4
4030 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
4031 ; GFX10-NEXT:    v_bfi_b32 v1, 0xffff, v5, v5
4032 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
4034 ; GFX11-LABEL: shuffle_v8bf16_4589:
4035 ; GFX11:       ; %bb.0:
4036 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4037 ; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off offset:8
4038 ; GFX11-NEXT:    global_load_b64 v[1:2], v[2:3], off
4039 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
4040 ; GFX11-NEXT:    v_bfi_b32 v0, 0xffff, v0, v0
4041 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
4042 ; GFX11-NEXT:    v_bfi_b32 v1, 0xffff, v1, v1
4043 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
4044   %val0 = load <8 x bfloat>, ptr addrspace(1) %arg0
4045   %val1 = load <8 x bfloat>, ptr addrspace(1) %arg1
4046   %shuffle = shufflevector <8 x bfloat> %val0, <8 x bfloat> %val1, <4 x i32> <i32 4, i32 5, i32 8, i32 9>
4047   ret <4 x bfloat> %shuffle
4050 define <4 x bfloat> @shuffle_v8bf16_10_11_2_3(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
4051 ; GFX9-LABEL: shuffle_v8bf16_10_11_2_3:
4052 ; GFX9:       ; %bb.0:
4053 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4054 ; GFX9-NEXT:    global_load_dword v4, v[2:3], off offset:4
4055 ; GFX9-NEXT:    global_load_dword v5, v[0:1], off offset:4
4056 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
4057 ; GFX9-NEXT:    v_mov_b32_e32 v0, v4
4058 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4059 ; GFX9-NEXT:    v_mov_b32_e32 v1, v5
4060 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
4062 ; GFX10-LABEL: shuffle_v8bf16_10_11_2_3:
4063 ; GFX10:       ; %bb.0:
4064 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4065 ; GFX10-NEXT:    global_load_dword v4, v[2:3], off offset:4
4066 ; GFX10-NEXT:    global_load_dword v5, v[0:1], off offset:4
4067 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
4068 ; GFX10-NEXT:    v_mov_b32_e32 v0, v4
4069 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
4070 ; GFX10-NEXT:    v_mov_b32_e32 v1, v5
4071 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
4073 ; GFX11-LABEL: shuffle_v8bf16_10_11_2_3:
4074 ; GFX11:       ; %bb.0:
4075 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4076 ; GFX11-NEXT:    global_load_b32 v2, v[2:3], off offset:4
4077 ; GFX11-NEXT:    global_load_b32 v1, v[0:1], off offset:4
4078 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
4079 ; GFX11-NEXT:    v_mov_b32_e32 v0, v2
4080 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
4081 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
4082   %val0 = load <8 x bfloat>, ptr addrspace(1) %arg0
4083   %val1 = load <8 x bfloat>, ptr addrspace(1) %arg1
4084   %shuffle = shufflevector <8 x bfloat> %val0, <8 x bfloat> %val1, <4 x i32> <i32 10, i32 11, i32 2, i32 3>
4085   ret <4 x bfloat> %shuffle
4088 define <4 x bfloat> @shuffle_v8bf16_13_14_2_3(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
4089 ; GFX9-LABEL: shuffle_v8bf16_13_14_2_3:
4090 ; GFX9:       ; %bb.0:
4091 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4092 ; GFX9-NEXT:    global_load_dwordx2 v[5:6], v[2:3], off offset:8
4093 ; GFX9-NEXT:    global_load_dword v4, v[0:1], off offset:4
4094 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
4095 ; GFX9-NEXT:    v_alignbit_b32 v0, v6, v5, 16
4096 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4097 ; GFX9-NEXT:    v_mov_b32_e32 v1, v4
4098 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
4100 ; GFX10-LABEL: shuffle_v8bf16_13_14_2_3:
4101 ; GFX10:       ; %bb.0:
4102 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4103 ; GFX10-NEXT:    global_load_dwordx2 v[5:6], v[2:3], off offset:8
4104 ; GFX10-NEXT:    global_load_dword v4, v[0:1], off offset:4
4105 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
4106 ; GFX10-NEXT:    v_alignbit_b32 v0, v6, v5, 16
4107 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
4108 ; GFX10-NEXT:    v_mov_b32_e32 v1, v4
4109 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
4111 ; GFX11-LABEL: shuffle_v8bf16_13_14_2_3:
4112 ; GFX11:       ; %bb.0:
4113 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4114 ; GFX11-NEXT:    global_load_b64 v[2:3], v[2:3], off offset:8
4115 ; GFX11-NEXT:    global_load_b32 v1, v[0:1], off offset:4
4116 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
4117 ; GFX11-NEXT:    v_alignbit_b32 v0, v3, v2, 16
4118 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
4119 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
4120   %val0 = load <8 x bfloat>, ptr addrspace(1) %arg0
4121   %val1 = load <8 x bfloat>, ptr addrspace(1) %arg1
4122   %shuffle = shufflevector <8 x bfloat> %val0, <8 x bfloat> %val1, <4 x i32> <i32 13, i32 14, i32 2, i32 3>
4123   ret <4 x bfloat> %shuffle
4126 define <4 x bfloat> @shuffle_v3bf16_0122(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
4127 ; GFX9-LABEL: shuffle_v3bf16_0122:
4128 ; GFX9:       ; %bb.0:
4129 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4130 ; GFX9-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
4131 ; GFX9-NEXT:    s_mov_b32 s4, 0xffff
4132 ; GFX9-NEXT:    s_mov_b32 s5, 0x5040100
4133 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4134 ; GFX9-NEXT:    v_bfi_b32 v0, s4, v0, v0
4135 ; GFX9-NEXT:    v_perm_b32 v1, v1, v1, s5
4136 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
4138 ; GFX10-LABEL: shuffle_v3bf16_0122:
4139 ; GFX10:       ; %bb.0:
4140 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4141 ; GFX10-NEXT:    global_load_dwordx2 v[0:1], v[0:1], off
4142 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
4143 ; GFX10-NEXT:    v_bfi_b32 v0, 0xffff, v0, v0
4144 ; GFX10-NEXT:    v_perm_b32 v1, v1, v1, 0x5040100
4145 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
4147 ; GFX11-LABEL: shuffle_v3bf16_0122:
4148 ; GFX11:       ; %bb.0:
4149 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4150 ; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off
4151 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
4152 ; GFX11-NEXT:    v_bfi_b32 v0, 0xffff, v0, v0
4153 ; GFX11-NEXT:    v_perm_b32 v1, v1, v1, 0x5040100
4154 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
4155   %val0 = load <3 x bfloat>, ptr addrspace(1) %arg0
4156   %val1 = load <3 x bfloat>, ptr addrspace(1) %arg1
4157   %shuffle = shufflevector <3 x bfloat> %val0, <3 x bfloat> %val1, <4 x i32> <i32 0, i32 1, i32 2, i32 2>
4158   ret <4 x bfloat> %shuffle
4161 define <4 x bfloat> @shuffle_v2bf16_0122(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
4162 ; GFX9-LABEL: shuffle_v2bf16_0122:
4163 ; GFX9:       ; %bb.0:
4164 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4165 ; GFX9-NEXT:    global_load_dword v0, v[0:1], off
4166 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4167 ; GFX9-NEXT:    v_alignbit_b32 v1, v0, v0, 16
4168 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
4170 ; GFX10-LABEL: shuffle_v2bf16_0122:
4171 ; GFX10:       ; %bb.0:
4172 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4173 ; GFX10-NEXT:    global_load_dword v0, v[0:1], off
4174 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
4175 ; GFX10-NEXT:    v_alignbit_b32 v1, v0, v0, 16
4176 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
4178 ; GFX11-LABEL: shuffle_v2bf16_0122:
4179 ; GFX11:       ; %bb.0:
4180 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4181 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off
4182 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
4183 ; GFX11-NEXT:    v_alignbit_b32 v1, v0, v0, 16
4184 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
4185   %val0 = load <2 x bfloat>, ptr addrspace(1) %arg0
4186   %val1 = load <2 x bfloat>, ptr addrspace(1) %arg1
4187   %shuffle = shufflevector <2 x bfloat> %val0, <2 x bfloat> %val1, <4 x i32> <i32 0, i32 1, i32 1, i32 0>
4188   ret <4 x bfloat> %shuffle
4191 define <6 x bfloat> @shuffle_v6bf16_452367(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
4192 ; GFX9-LABEL: shuffle_v6bf16_452367:
4193 ; GFX9:       ; %bb.0:
4194 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4195 ; GFX9-NEXT:    v_mov_b32_e32 v6, v1
4196 ; GFX9-NEXT:    v_mov_b32_e32 v5, v0
4197 ; GFX9-NEXT:    v_mov_b32_e32 v4, v3
4198 ; GFX9-NEXT:    v_mov_b32_e32 v3, v2
4199 ; GFX9-NEXT:    global_load_dwordx3 v[0:2], v[5:6], off
4200 ; GFX9-NEXT:    global_load_dword v7, v[3:4], off
4201 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
4202 ; GFX9-NEXT:    v_mov_b32_e32 v0, v2
4203 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4204 ; GFX9-NEXT:    v_mov_b32_e32 v2, v7
4205 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
4207 ; GFX10-LABEL: shuffle_v6bf16_452367:
4208 ; GFX10:       ; %bb.0:
4209 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4210 ; GFX10-NEXT:    v_mov_b32_e32 v6, v1
4211 ; GFX10-NEXT:    v_mov_b32_e32 v5, v0
4212 ; GFX10-NEXT:    v_mov_b32_e32 v4, v3
4213 ; GFX10-NEXT:    v_mov_b32_e32 v3, v2
4214 ; GFX10-NEXT:    global_load_dwordx3 v[0:2], v[5:6], off
4215 ; GFX10-NEXT:    global_load_dword v7, v[3:4], off
4216 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
4217 ; GFX10-NEXT:    v_mov_b32_e32 v0, v2
4218 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
4219 ; GFX10-NEXT:    v_mov_b32_e32 v2, v7
4220 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
4222 ; GFX11-LABEL: shuffle_v6bf16_452367:
4223 ; GFX11:       ; %bb.0:
4224 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4225 ; GFX11-NEXT:    v_dual_mov_b32 v4, v3 :: v_dual_mov_b32 v3, v2
4226 ; GFX11-NEXT:    global_load_b96 v[0:2], v[0:1], off
4227 ; GFX11-NEXT:    global_load_b32 v3, v[3:4], off
4228 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
4229 ; GFX11-NEXT:    v_mov_b32_e32 v0, v2
4230 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
4231 ; GFX11-NEXT:    v_mov_b32_e32 v2, v3
4232 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
4233   %val0 = load <6 x bfloat>, ptr addrspace(1) %arg0
4234   %val1 = load <6 x bfloat>, ptr addrspace(1) %arg1
4235   %shuffle = shufflevector <6 x bfloat> %val0, <6 x bfloat> %val1, <6 x i32> <i32 4, i32 5, i32 2, i32 3, i32 6, i32 7>
4236   ret <6 x bfloat> %shuffle
4239 define amdgpu_kernel void @fma_shuffle_v2bf16(ptr addrspace(1) nocapture readonly %A, ptr addrspace(1) nocapture readonly %B, ptr addrspace(1) nocapture %C)  {
4240 ; GFX9-LABEL: fma_shuffle_v2bf16:
4241 ; GFX9:       ; %bb.0: ; %entry
4242 ; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[6:7], 0x10
4243 ; GFX9-NEXT:    s_load_dwordx4 s[8:11], s[6:7], 0x0
4244 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
4245 ; GFX9-NEXT:    s_movk_i32 s2, 0x7fff
4246 ; GFX9-NEXT:    s_mov_b32 s3, 0x7060302
4247 ; GFX9-NEXT:    s_waitcnt lgkmcnt(0)
4248 ; GFX9-NEXT:    global_load_dwordx2 v[1:2], v0, s[0:1]
4249 ; GFX9-NEXT:    global_load_dwordx2 v[3:4], v0, s[8:9]
4250 ; GFX9-NEXT:    global_load_dwordx2 v[5:6], v0, s[10:11]
4251 ; GFX9-NEXT:    s_waitcnt vmcnt(2)
4252 ; GFX9-NEXT:    v_and_b32_e32 v7, 0xffff0000, v1
4253 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
4254 ; GFX9-NEXT:    v_lshlrev_b32_e32 v8, 16, v3
4255 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4256 ; GFX9-NEXT:    v_and_b32_e32 v9, 0xffff0000, v5
4257 ; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
4258 ; GFX9-NEXT:    v_lshlrev_b32_e32 v5, 16, v5
4259 ; GFX9-NEXT:    v_and_b32_e32 v11, 0xffff0000, v2
4260 ; GFX9-NEXT:    v_lshlrev_b32_e32 v12, 16, v4
4261 ; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 16, v2
4262 ; GFX9-NEXT:    v_fma_f32 v7, v8, v9, v7
4263 ; GFX9-NEXT:    v_fma_f32 v1, v8, v5, v1
4264 ; GFX9-NEXT:    v_fma_f32 v2, v12, v5, v2
4265 ; GFX9-NEXT:    v_bfe_u32 v5, v7, 16, 1
4266 ; GFX9-NEXT:    v_fma_f32 v8, v12, v9, v11
4267 ; GFX9-NEXT:    v_or_b32_e32 v9, 0x400000, v7
4268 ; GFX9-NEXT:    v_bfe_u32 v11, v1, 16, 1
4269 ; GFX9-NEXT:    v_add3_u32 v5, v5, v7, s2
4270 ; GFX9-NEXT:    v_cmp_u_f32_e32 vcc, v7, v7
4271 ; GFX9-NEXT:    v_or_b32_e32 v12, 0x400000, v1
4272 ; GFX9-NEXT:    v_bfe_u32 v13, v8, 16, 1
4273 ; GFX9-NEXT:    v_add3_u32 v11, v11, v1, s2
4274 ; GFX9-NEXT:    v_cndmask_b32_e32 v5, v5, v9, vcc
4275 ; GFX9-NEXT:    v_cmp_u_f32_e32 vcc, v1, v1
4276 ; GFX9-NEXT:    v_or_b32_e32 v14, 0x400000, v8
4277 ; GFX9-NEXT:    v_bfe_u32 v15, v2, 16, 1
4278 ; GFX9-NEXT:    v_add3_u32 v13, v13, v8, s2
4279 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v11, v12, vcc
4280 ; GFX9-NEXT:    v_cmp_u_f32_e32 vcc, v8, v8
4281 ; GFX9-NEXT:    v_and_b32_e32 v3, 0xffff0000, v3
4282 ; GFX9-NEXT:    v_lshlrev_b32_e32 v10, 16, v6
4283 ; GFX9-NEXT:    v_or_b32_e32 v16, 0x400000, v2
4284 ; GFX9-NEXT:    v_add3_u32 v15, v15, v2, s2
4285 ; GFX9-NEXT:    v_cndmask_b32_e32 v7, v13, v14, vcc
4286 ; GFX9-NEXT:    v_cmp_u_f32_e32 vcc, v2, v2
4287 ; GFX9-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
4288 ; GFX9-NEXT:    v_and_b32_e32 v6, 0xffff0000, v6
4289 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, v15, v16, vcc
4290 ; GFX9-NEXT:    v_and_b32_e32 v5, 0xffff0000, v5
4291 ; GFX9-NEXT:    v_fma_f32 v1, v3, v10, v1
4292 ; GFX9-NEXT:    v_and_b32_e32 v4, 0xffff0000, v4
4293 ; GFX9-NEXT:    v_and_b32_e32 v2, 0xffff0000, v2
4294 ; GFX9-NEXT:    v_and_b32_e32 v7, 0xffff0000, v7
4295 ; GFX9-NEXT:    v_fma_f32 v3, v3, v6, v5
4296 ; GFX9-NEXT:    v_bfe_u32 v5, v1, 16, 1
4297 ; GFX9-NEXT:    v_fma_f32 v2, v4, v10, v2
4298 ; GFX9-NEXT:    v_fma_f32 v4, v4, v6, v7
4299 ; GFX9-NEXT:    v_or_b32_e32 v6, 0x400000, v1
4300 ; GFX9-NEXT:    v_bfe_u32 v7, v3, 16, 1
4301 ; GFX9-NEXT:    v_add3_u32 v5, v5, v1, s2
4302 ; GFX9-NEXT:    v_cmp_u_f32_e32 vcc, v1, v1
4303 ; GFX9-NEXT:    v_or_b32_e32 v8, 0x400000, v3
4304 ; GFX9-NEXT:    v_bfe_u32 v9, v2, 16, 1
4305 ; GFX9-NEXT:    v_add3_u32 v7, v7, v3, s2
4306 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, v5, v6, vcc
4307 ; GFX9-NEXT:    v_cmp_u_f32_e32 vcc, v3, v3
4308 ; GFX9-NEXT:    v_or_b32_e32 v10, 0x400000, v2
4309 ; GFX9-NEXT:    v_bfe_u32 v11, v4, 16, 1
4310 ; GFX9-NEXT:    v_add3_u32 v9, v9, v2, s2
4311 ; GFX9-NEXT:    v_cndmask_b32_e32 v3, v7, v8, vcc
4312 ; GFX9-NEXT:    v_cmp_u_f32_e32 vcc, v2, v2
4313 ; GFX9-NEXT:    v_or_b32_e32 v12, 0x400000, v4
4314 ; GFX9-NEXT:    v_add3_u32 v11, v11, v4, s2
4315 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, v9, v10, vcc
4316 ; GFX9-NEXT:    v_cmp_u_f32_e32 vcc, v4, v4
4317 ; GFX9-NEXT:    v_cndmask_b32_e32 v4, v11, v12, vcc
4318 ; GFX9-NEXT:    v_perm_b32 v2, v4, v2, s3
4319 ; GFX9-NEXT:    v_perm_b32 v1, v3, v1, s3
4320 ; GFX9-NEXT:    global_store_dwordx2 v0, v[1:2], s[0:1]
4321 ; GFX9-NEXT:    s_endpgm
4323 ; GFX10-LABEL: fma_shuffle_v2bf16:
4324 ; GFX10:       ; %bb.0: ; %entry
4325 ; GFX10-NEXT:    s_clause 0x1
4326 ; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[6:7], 0x10
4327 ; GFX10-NEXT:    s_load_dwordx4 s[8:11], s[6:7], 0x0
4328 ; GFX10-NEXT:    v_lshlrev_b32_e32 v6, 3, v0
4329 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
4330 ; GFX10-NEXT:    s_clause 0x2
4331 ; GFX10-NEXT:    global_load_dwordx2 v[0:1], v6, s[0:1]
4332 ; GFX10-NEXT:    global_load_dwordx2 v[2:3], v6, s[8:9]
4333 ; GFX10-NEXT:    global_load_dwordx2 v[4:5], v6, s[10:11]
4334 ; GFX10-NEXT:    s_waitcnt vmcnt(2)
4335 ; GFX10-NEXT:    v_and_b32_e32 v7, 0xffff0000, v0
4336 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
4337 ; GFX10-NEXT:    v_lshlrev_b32_e32 v8, 16, v2
4338 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
4339 ; GFX10-NEXT:    v_and_b32_e32 v9, 0xffff0000, v4
4340 ; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
4341 ; GFX10-NEXT:    v_lshlrev_b32_e32 v4, 16, v4
4342 ; GFX10-NEXT:    v_and_b32_e32 v11, 0xffff0000, v1
4343 ; GFX10-NEXT:    v_lshlrev_b32_e32 v12, 16, v3
4344 ; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
4345 ; GFX10-NEXT:    v_fmac_f32_e32 v7, v8, v9
4346 ; GFX10-NEXT:    v_fmac_f32_e32 v0, v8, v4
4347 ; GFX10-NEXT:    v_and_b32_e32 v2, 0xffff0000, v2
4348 ; GFX10-NEXT:    v_fmac_f32_e32 v11, v12, v9
4349 ; GFX10-NEXT:    v_fmac_f32_e32 v1, v12, v4
4350 ; GFX10-NEXT:    v_bfe_u32 v4, v7, 16, 1
4351 ; GFX10-NEXT:    v_or_b32_e32 v8, 0x400000, v7
4352 ; GFX10-NEXT:    v_bfe_u32 v9, v0, 16, 1
4353 ; GFX10-NEXT:    v_cmp_u_f32_e32 vcc_lo, v7, v7
4354 ; GFX10-NEXT:    v_or_b32_e32 v12, 0x400000, v0
4355 ; GFX10-NEXT:    v_add3_u32 v4, v4, v7, 0x7fff
4356 ; GFX10-NEXT:    v_bfe_u32 v15, v1, 16, 1
4357 ; GFX10-NEXT:    v_add3_u32 v9, v9, v0, 0x7fff
4358 ; GFX10-NEXT:    v_bfe_u32 v13, v11, 16, 1
4359 ; GFX10-NEXT:    v_or_b32_e32 v16, 0x400000, v1
4360 ; GFX10-NEXT:    v_cndmask_b32_e32 v4, v4, v8, vcc_lo
4361 ; GFX10-NEXT:    v_cmp_u_f32_e32 vcc_lo, v0, v0
4362 ; GFX10-NEXT:    v_add3_u32 v15, v15, v1, 0x7fff
4363 ; GFX10-NEXT:    v_lshlrev_b32_e32 v10, 16, v5
4364 ; GFX10-NEXT:    v_or_b32_e32 v14, 0x400000, v11
4365 ; GFX10-NEXT:    v_add3_u32 v13, v13, v11, 0x7fff
4366 ; GFX10-NEXT:    v_cndmask_b32_e32 v0, v9, v12, vcc_lo
4367 ; GFX10-NEXT:    v_cmp_u_f32_e32 vcc_lo, v1, v1
4368 ; GFX10-NEXT:    v_and_b32_e32 v5, 0xffff0000, v5
4369 ; GFX10-NEXT:    v_and_b32_e32 v3, 0xffff0000, v3
4370 ; GFX10-NEXT:    v_and_b32_e32 v4, 0xffff0000, v4
4371 ; GFX10-NEXT:    v_and_b32_e32 v0, 0xffff0000, v0
4372 ; GFX10-NEXT:    v_cndmask_b32_e32 v1, v15, v16, vcc_lo
4373 ; GFX10-NEXT:    v_cmp_u_f32_e32 vcc_lo, v11, v11
4374 ; GFX10-NEXT:    v_fmac_f32_e32 v4, v2, v5
4375 ; GFX10-NEXT:    v_fmac_f32_e32 v0, v2, v10
4376 ; GFX10-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
4377 ; GFX10-NEXT:    v_cndmask_b32_e32 v7, v13, v14, vcc_lo
4378 ; GFX10-NEXT:    v_or_b32_e32 v8, 0x400000, v4
4379 ; GFX10-NEXT:    v_bfe_u32 v2, v0, 16, 1
4380 ; GFX10-NEXT:    v_fmac_f32_e32 v1, v3, v10
4381 ; GFX10-NEXT:    v_and_b32_e32 v7, 0xffff0000, v7
4382 ; GFX10-NEXT:    v_cmp_u_f32_e32 vcc_lo, v0, v0
4383 ; GFX10-NEXT:    v_add3_u32 v2, v2, v0, 0x7fff
4384 ; GFX10-NEXT:    v_bfe_u32 v9, v1, 16, 1
4385 ; GFX10-NEXT:    v_fmac_f32_e32 v7, v3, v5
4386 ; GFX10-NEXT:    v_or_b32_e32 v3, 0x400000, v0
4387 ; GFX10-NEXT:    v_or_b32_e32 v10, 0x400000, v1
4388 ; GFX10-NEXT:    v_bfe_u32 v5, v4, 16, 1
4389 ; GFX10-NEXT:    v_add3_u32 v9, v9, v1, 0x7fff
4390 ; GFX10-NEXT:    v_bfe_u32 v11, v7, 16, 1
4391 ; GFX10-NEXT:    v_cndmask_b32_e32 v0, v2, v3, vcc_lo
4392 ; GFX10-NEXT:    v_cmp_u_f32_e32 vcc_lo, v1, v1
4393 ; GFX10-NEXT:    v_or_b32_e32 v12, 0x400000, v7
4394 ; GFX10-NEXT:    v_add3_u32 v5, v5, v4, 0x7fff
4395 ; GFX10-NEXT:    v_add3_u32 v11, v11, v7, 0x7fff
4396 ; GFX10-NEXT:    v_cndmask_b32_e32 v1, v9, v10, vcc_lo
4397 ; GFX10-NEXT:    v_cmp_u_f32_e32 vcc_lo, v7, v7
4398 ; GFX10-NEXT:    v_cndmask_b32_e32 v2, v11, v12, vcc_lo
4399 ; GFX10-NEXT:    v_cmp_u_f32_e32 vcc_lo, v4, v4
4400 ; GFX10-NEXT:    v_perm_b32 v1, v2, v1, 0x7060302
4401 ; GFX10-NEXT:    v_cndmask_b32_e32 v3, v5, v8, vcc_lo
4402 ; GFX10-NEXT:    v_perm_b32 v0, v3, v0, 0x7060302
4403 ; GFX10-NEXT:    global_store_dwordx2 v6, v[0:1], s[0:1]
4404 ; GFX10-NEXT:    s_endpgm
4406 ; GFX11-LABEL: fma_shuffle_v2bf16:
4407 ; GFX11:       ; %bb.0: ; %entry
4408 ; GFX11-NEXT:    s_clause 0x1
4409 ; GFX11-NEXT:    s_load_b64 s[0:1], s[2:3], 0x10
4410 ; GFX11-NEXT:    s_load_b128 s[4:7], s[2:3], 0x0
4411 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
4412 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
4413 ; GFX11-NEXT:    v_lshlrev_b32_e32 v6, 3, v0
4414 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
4415 ; GFX11-NEXT:    s_clause 0x2
4416 ; GFX11-NEXT:    global_load_b64 v[0:1], v6, s[0:1]
4417 ; GFX11-NEXT:    global_load_b64 v[2:3], v6, s[4:5]
4418 ; GFX11-NEXT:    global_load_b64 v[4:5], v6, s[6:7]
4419 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
4420 ; GFX11-NEXT:    v_lshlrev_b32_e32 v10, 16, v5
4421 ; GFX11-NEXT:    v_and_b32_e32 v5, 0xffff0000, v5
4422 ; GFX11-NEXT:    v_and_b32_e32 v9, 0xffff0000, v4
4423 ; GFX11-NEXT:    v_lshlrev_b32_e32 v12, 16, v3
4424 ; GFX11-NEXT:    v_and_b32_e32 v3, 0xffff0000, v3
4425 ; GFX11-NEXT:    v_lshlrev_b32_e32 v4, 16, v4
4426 ; GFX11-NEXT:    v_and_b32_e32 v11, 0xffff0000, v1
4427 ; GFX11-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
4428 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
4429 ; GFX11-NEXT:    v_dual_fmac_f32 v1, v12, v4 :: v_dual_lshlrev_b32 v8, 16, v2
4430 ; GFX11-NEXT:    v_bfe_u32 v15, v1, 16, 1
4431 ; GFX11-NEXT:    v_or_b32_e32 v16, 0x400000, v1
4432 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_1)
4433 ; GFX11-NEXT:    v_add3_u32 v15, v15, v1, 0x7fff
4434 ; GFX11-NEXT:    v_and_b32_e32 v2, 0xffff0000, v2
4435 ; GFX11-NEXT:    v_and_b32_e32 v7, 0xffff0000, v0
4436 ; GFX11-NEXT:    v_dual_fmac_f32 v7, v8, v9 :: v_dual_lshlrev_b32 v0, 16, v0
4437 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2)
4438 ; GFX11-NEXT:    v_fmac_f32_e32 v0, v8, v4
4439 ; GFX11-NEXT:    v_bfe_u32 v4, v7, 16, 1
4440 ; GFX11-NEXT:    v_or_b32_e32 v8, 0x400000, v7
4441 ; GFX11-NEXT:    v_cmp_u_f32_e32 vcc_lo, v7, v7
4442 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1)
4443 ; GFX11-NEXT:    v_add3_u32 v4, v4, v7, 0x7fff
4444 ; GFX11-NEXT:    v_cndmask_b32_e32 v4, v4, v8, vcc_lo
4445 ; GFX11-NEXT:    v_cmp_u_f32_e32 vcc_lo, v0, v0
4446 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
4447 ; GFX11-NEXT:    v_and_b32_e32 v4, 0xffff0000, v4
4448 ; GFX11-NEXT:    v_fmac_f32_e32 v4, v2, v5
4449 ; GFX11-NEXT:    v_fmac_f32_e32 v11, v12, v9
4450 ; GFX11-NEXT:    v_bfe_u32 v9, v0, 16, 1
4451 ; GFX11-NEXT:    v_or_b32_e32 v12, 0x400000, v0
4452 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
4453 ; GFX11-NEXT:    v_or_b32_e32 v8, 0x400000, v4
4454 ; GFX11-NEXT:    v_bfe_u32 v13, v11, 16, 1
4455 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_1) | instid1(VALU_DEP_3)
4456 ; GFX11-NEXT:    v_add3_u32 v9, v9, v0, 0x7fff
4457 ; GFX11-NEXT:    v_or_b32_e32 v14, 0x400000, v11
4458 ; GFX11-NEXT:    v_add3_u32 v13, v13, v11, 0x7fff
4459 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_3) | instid1(VALU_DEP_2)
4460 ; GFX11-NEXT:    v_cndmask_b32_e32 v0, v9, v12, vcc_lo
4461 ; GFX11-NEXT:    v_cmp_u_f32_e32 vcc_lo, v1, v1
4462 ; GFX11-NEXT:    v_cndmask_b32_e32 v1, v15, v16, vcc_lo
4463 ; GFX11-NEXT:    v_cmp_u_f32_e32 vcc_lo, v11, v11
4464 ; GFX11-NEXT:    v_and_b32_e32 v1, 0xffff0000, v1
4465 ; GFX11-NEXT:    v_cndmask_b32_e32 v7, v13, v14, vcc_lo
4466 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
4467 ; GFX11-NEXT:    v_fmac_f32_e32 v1, v3, v10
4468 ; GFX11-NEXT:    v_and_b32_e32 v7, 0xffff0000, v7
4469 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
4470 ; GFX11-NEXT:    v_bfe_u32 v9, v1, 16, 1
4471 ; GFX11-NEXT:    v_fmac_f32_e32 v7, v3, v5
4472 ; GFX11-NEXT:    v_bfe_u32 v5, v4, 16, 1
4473 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_1) | instid1(VALU_DEP_4)
4474 ; GFX11-NEXT:    v_add3_u32 v9, v9, v1, 0x7fff
4475 ; GFX11-NEXT:    v_and_b32_e32 v0, 0xffff0000, v0
4476 ; GFX11-NEXT:    v_bfe_u32 v11, v7, 16, 1
4477 ; GFX11-NEXT:    v_or_b32_e32 v12, 0x400000, v7
4478 ; GFX11-NEXT:    v_add3_u32 v5, v5, v4, 0x7fff
4479 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_2) | instid1(VALU_DEP_3)
4480 ; GFX11-NEXT:    v_fmac_f32_e32 v0, v2, v10
4481 ; GFX11-NEXT:    v_or_b32_e32 v10, 0x400000, v1
4482 ; GFX11-NEXT:    v_add3_u32 v11, v11, v7, 0x7fff
4483 ; GFX11-NEXT:    v_bfe_u32 v2, v0, 16, 1
4484 ; GFX11-NEXT:    v_or_b32_e32 v3, 0x400000, v0
4485 ; GFX11-NEXT:    v_cmp_u_f32_e32 vcc_lo, v0, v0
4486 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1)
4487 ; GFX11-NEXT:    v_add3_u32 v2, v2, v0, 0x7fff
4488 ; GFX11-NEXT:    v_cndmask_b32_e32 v0, v2, v3, vcc_lo
4489 ; GFX11-NEXT:    v_cmp_u_f32_e32 vcc_lo, v1, v1
4490 ; GFX11-NEXT:    v_cndmask_b32_e32 v1, v9, v10, vcc_lo
4491 ; GFX11-NEXT:    v_cmp_u_f32_e32 vcc_lo, v7, v7
4492 ; GFX11-NEXT:    v_cndmask_b32_e32 v2, v11, v12, vcc_lo
4493 ; GFX11-NEXT:    v_cmp_u_f32_e32 vcc_lo, v4, v4
4494 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_1)
4495 ; GFX11-NEXT:    v_perm_b32 v1, v2, v1, 0x7060302
4496 ; GFX11-NEXT:    v_cndmask_b32_e32 v3, v5, v8, vcc_lo
4497 ; GFX11-NEXT:    v_perm_b32 v0, v3, v0, 0x7060302
4498 ; GFX11-NEXT:    global_store_b64 v6, v[0:1], s[0:1]
4499 ; GFX11-NEXT:    s_nop 0
4500 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
4501 ; GFX11-NEXT:    s_endpgm
4502 entry:
4503   %tmp1 = tail call i32 @llvm.amdgcn.workitem.id.x()
4504   %tmp12 = zext i32 %tmp1 to i64
4505   %arrayidx = getelementptr inbounds <4 x bfloat>, ptr addrspace(1) %A, i64 %tmp12
4506   %tmp14 = load <4 x bfloat>, ptr addrspace(1) %arrayidx, align 8
4507   %arrayidx1 = getelementptr inbounds <4 x bfloat>, ptr addrspace(1) %B, i64 %tmp12
4508   %tmp15 = load <4 x bfloat>, ptr addrspace(1) %arrayidx1, align 8
4509   %arrayidx2 = getelementptr inbounds <4 x bfloat>, ptr addrspace(1) %C, i64 %tmp12
4510   %tmp16 = load <4 x bfloat>, ptr addrspace(1) %arrayidx2, align 8
4511   %tmp17 = shufflevector <4 x bfloat> %tmp14, <4 x bfloat> undef, <2 x i32> zeroinitializer
4512   %tmp18 = shufflevector <4 x bfloat> %tmp15, <4 x bfloat> undef, <2 x i32> <i32 0, i32 1>
4513   %tmp19 = shufflevector <4 x bfloat> %tmp16, <4 x bfloat> undef, <2 x i32> <i32 0, i32 1>
4514   %tmp20 = tail call <2 x bfloat> @llvm.fma.v2bf16(<2 x bfloat> %tmp17, <2 x bfloat> %tmp18, <2 x bfloat> %tmp19)
4515   %tmp21 = shufflevector <4 x bfloat> %tmp14, <4 x bfloat> undef, <2 x i32> <i32 1, i32 1>
4516   %tmp22 = shufflevector <4 x bfloat> %tmp15, <4 x bfloat> undef, <2 x i32> <i32 2, i32 3>
4517   %tmp23 = tail call <2 x bfloat> @llvm.fma.v2bf16(<2 x bfloat> %tmp21, <2 x bfloat> %tmp22, <2 x bfloat> %tmp20)
4518   %tmp24 = shufflevector <2 x bfloat> %tmp23, <2 x bfloat> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
4519   %tmp25 = shufflevector <4 x bfloat> %tmp24, <4 x bfloat> %tmp16, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
4520   %tmp26 = shufflevector <4 x bfloat> %tmp14, <4 x bfloat> undef, <2 x i32> <i32 2, i32 2>
4521   %tmp27 = shufflevector <4 x bfloat> %tmp25, <4 x bfloat> undef, <2 x i32> <i32 2, i32 3>
4522   %tmp28 = tail call <2 x bfloat> @llvm.fma.v2bf16(<2 x bfloat> %tmp26, <2 x bfloat> %tmp18, <2 x bfloat> %tmp27)
4523   %tmp29 = shufflevector <4 x bfloat> %tmp14, <4 x bfloat> undef, <2 x i32> <i32 3, i32 3>
4524   %tmp30 = tail call <2 x bfloat> @llvm.fma.v2bf16(<2 x bfloat> %tmp29, <2 x bfloat> %tmp22, <2 x bfloat> %tmp28)
4525   %tmp31 = shufflevector <2 x bfloat> %tmp30, <2 x bfloat> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
4526   %tmp32 = shufflevector <4 x bfloat> %tmp25, <4 x bfloat> %tmp31, <4 x i32> <i32 0, i32 1, i32 4, i32 5>
4527   store <4 x bfloat> %tmp32, ptr addrspace(1) %arrayidx2, align 8
4528   ret void
4531 define <4 x bfloat> @shuffle_v4bf16_0456(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1) {
4532 ; GFX9-LABEL: shuffle_v4bf16_0456:
4533 ; GFX9:       ; %bb.0:
4534 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4535 ; GFX9-NEXT:    global_load_dwordx2 v[4:5], v[0:1], off
4536 ; GFX9-NEXT:    global_load_dwordx2 v[5:6], v[2:3], off
4537 ; GFX9-NEXT:    s_mov_b32 s4, 0x5040100
4538 ; GFX9-NEXT:    ; kill: killed $vgpr0 killed $vgpr1
4539 ; GFX9-NEXT:    ; kill: killed $vgpr2 killed $vgpr3
4540 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4541 ; GFX9-NEXT:    v_perm_b32 v0, v5, v4, s4
4542 ; GFX9-NEXT:    v_alignbit_b32 v1, v6, v5, 16
4543 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
4545 ; GFX10-LABEL: shuffle_v4bf16_0456:
4546 ; GFX10:       ; %bb.0:
4547 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4548 ; GFX10-NEXT:    global_load_dwordx2 v[4:5], v[0:1], off
4549 ; GFX10-NEXT:    global_load_dwordx2 v[5:6], v[2:3], off
4550 ; GFX10-NEXT:    ; kill: killed $vgpr0 killed $vgpr1
4551 ; GFX10-NEXT:    ; kill: killed $vgpr2 killed $vgpr3
4552 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
4553 ; GFX10-NEXT:    v_perm_b32 v0, v5, v4, 0x5040100
4554 ; GFX10-NEXT:    v_alignbit_b32 v1, v6, v5, 16
4555 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
4557 ; GFX11-LABEL: shuffle_v4bf16_0456:
4558 ; GFX11:       ; %bb.0:
4559 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4560 ; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off
4561 ; GFX11-NEXT:    global_load_b64 v[1:2], v[2:3], off
4562 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
4563 ; GFX11-NEXT:    v_perm_b32 v0, v1, v0, 0x5040100
4564 ; GFX11-NEXT:    v_alignbit_b32 v1, v2, v1, 16
4565 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
4566   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
4567   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
4568   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <4 x i32> <i32 0, i32 4, i32 5, i32 6>
4569   ret <4 x bfloat> %shuffle
4572 define <2 x bfloat> @low16bits(ptr addrspace(1) %x0, ptr addrspace(1) %x1) {
4573 ; GFX9-LABEL: low16bits:
4574 ; GFX9:       ; %bb.0: ; %entry
4575 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4576 ; GFX9-NEXT:    global_load_dword v4, v[0:1], off
4577 ; GFX9-NEXT:    global_load_dword v5, v[2:3], off
4578 ; GFX9-NEXT:    s_mov_b32 s4, 0x5040100
4579 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4580 ; GFX9-NEXT:    v_perm_b32 v0, v5, v4, s4
4581 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
4583 ; GFX10-LABEL: low16bits:
4584 ; GFX10:       ; %bb.0: ; %entry
4585 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4586 ; GFX10-NEXT:    global_load_dword v4, v[0:1], off
4587 ; GFX10-NEXT:    global_load_dword v5, v[2:3], off
4588 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
4589 ; GFX10-NEXT:    v_perm_b32 v0, v5, v4, 0x5040100
4590 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
4592 ; GFX11-LABEL: low16bits:
4593 ; GFX11:       ; %bb.0: ; %entry
4594 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4595 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off
4596 ; GFX11-NEXT:    global_load_b32 v1, v[2:3], off
4597 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
4598 ; GFX11-NEXT:    v_perm_b32 v0, v1, v0, 0x5040100
4599 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
4600 entry:
4601   %0 = load <2 x bfloat>, ptr addrspace(1) %x0, align 4
4602   %1 = load <2 x bfloat>, ptr addrspace(1) %x1, align 4
4603   %vy1.0.vec.insert = shufflevector <2 x bfloat> %0, <2 x bfloat> poison, <2 x i32> <i32 0, i32 undef>
4604   %vy1.2.vec.insert = shufflevector <2 x bfloat> %vy1.0.vec.insert, <2 x bfloat> %1, <2 x i32> <i32 0, i32 2>
4605   ret <2 x bfloat> %vy1.2.vec.insert
4608 define <2 x bfloat> @hi16bits_v2bf16(ptr addrspace(1) %x0, ptr addrspace(1) %x1) {
4609 ; GFX9-LABEL: hi16bits_v2bf16:
4610 ; GFX9:       ; %bb.0: ; %entry
4611 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4612 ; GFX9-NEXT:    global_load_dword v4, v[0:1], off
4613 ; GFX9-NEXT:    global_load_dword v5, v[2:3], off
4614 ; GFX9-NEXT:    s_mov_b32 s4, 0x7060302
4615 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4616 ; GFX9-NEXT:    v_perm_b32 v0, v5, v4, s4
4617 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
4619 ; GFX10-LABEL: hi16bits_v2bf16:
4620 ; GFX10:       ; %bb.0: ; %entry
4621 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4622 ; GFX10-NEXT:    global_load_dword v4, v[0:1], off
4623 ; GFX10-NEXT:    global_load_dword v5, v[2:3], off
4624 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
4625 ; GFX10-NEXT:    v_perm_b32 v0, v5, v4, 0x7060302
4626 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
4628 ; GFX11-LABEL: hi16bits_v2bf16:
4629 ; GFX11:       ; %bb.0: ; %entry
4630 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4631 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off
4632 ; GFX11-NEXT:    global_load_b32 v1, v[2:3], off
4633 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
4634 ; GFX11-NEXT:    v_perm_b32 v0, v1, v0, 0x7060302
4635 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
4636 entry:
4637   %0 = load <2 x bfloat>, ptr addrspace(1) %x0, align 4
4638   %1 = load <2 x bfloat>, ptr addrspace(1) %x1, align 4
4639   %vy1.0.vec.insert = shufflevector <2 x bfloat> %0, <2 x bfloat> poison, <2 x i32> <i32 1, i32 undef>
4640   %vy1.2.vec.insert = shufflevector <2 x bfloat> %vy1.0.vec.insert, <2 x bfloat> %1, <2 x i32> <i32 0, i32 3>
4641   ret <2 x bfloat> %vy1.2.vec.insert
4644 define <2 x bfloat> @low16hi16bits_v2bf16(ptr addrspace(1) %x0, ptr addrspace(1) %x1) {
4645 ; GFX9-LABEL: low16hi16bits_v2bf16:
4646 ; GFX9:       ; %bb.0: ; %entry
4647 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4648 ; GFX9-NEXT:    global_load_dword v4, v[2:3], off
4649 ; GFX9-NEXT:    global_load_dword v5, v[0:1], off
4650 ; GFX9-NEXT:    s_mov_b32 s4, 0xffff
4651 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4652 ; GFX9-NEXT:    v_bfi_b32 v0, s4, v5, v4
4653 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
4655 ; GFX10-LABEL: low16hi16bits_v2bf16:
4656 ; GFX10:       ; %bb.0: ; %entry
4657 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4658 ; GFX10-NEXT:    global_load_dword v4, v[2:3], off
4659 ; GFX10-NEXT:    global_load_dword v5, v[0:1], off
4660 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
4661 ; GFX10-NEXT:    v_bfi_b32 v0, 0xffff, v5, v4
4662 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
4664 ; GFX11-LABEL: low16hi16bits_v2bf16:
4665 ; GFX11:       ; %bb.0: ; %entry
4666 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4667 ; GFX11-NEXT:    global_load_b32 v2, v[2:3], off
4668 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off
4669 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
4670 ; GFX11-NEXT:    v_bfi_b32 v0, 0xffff, v0, v2
4671 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
4672 entry:
4673   %0 = load <2 x bfloat>, ptr addrspace(1) %x0, align 4
4674   %1 = load <2 x bfloat>, ptr addrspace(1) %x1, align 4
4675   %vy1.0.vec.insert = shufflevector <2 x bfloat> %0, <2 x bfloat> poison, <2 x i32> <i32 0, i32 undef>
4676   %vy1.2.vec.insert = shufflevector <2 x bfloat> %vy1.0.vec.insert, <2 x bfloat> %1, <2 x i32> <i32 0, i32 3>
4677   ret <2 x bfloat> %vy1.2.vec.insert
4680 define <2 x bfloat> @hi16low16bits(ptr addrspace(1) %x0, ptr addrspace(1) %x1) {
4681 ; GFX9-LABEL: hi16low16bits:
4682 ; GFX9:       ; %bb.0: ; %entry
4683 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4684 ; GFX9-NEXT:    global_load_dword v4, v[0:1], off
4685 ; GFX9-NEXT:    global_load_dword v5, v[2:3], off
4686 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4687 ; GFX9-NEXT:    v_alignbit_b32 v0, v5, v4, 16
4688 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
4690 ; GFX10-LABEL: hi16low16bits:
4691 ; GFX10:       ; %bb.0: ; %entry
4692 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4693 ; GFX10-NEXT:    global_load_dword v4, v[0:1], off
4694 ; GFX10-NEXT:    global_load_dword v5, v[2:3], off
4695 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
4696 ; GFX10-NEXT:    v_alignbit_b32 v0, v5, v4, 16
4697 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
4699 ; GFX11-LABEL: hi16low16bits:
4700 ; GFX11:       ; %bb.0: ; %entry
4701 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4702 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off
4703 ; GFX11-NEXT:    global_load_b32 v1, v[2:3], off
4704 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
4705 ; GFX11-NEXT:    v_alignbit_b32 v0, v1, v0, 16
4706 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
4707 entry:
4708   %0 = load <2 x bfloat>, ptr addrspace(1) %x0, align 4
4709   %1 = load <2 x bfloat>, ptr addrspace(1) %x1, align 4
4710   %vy1.0.vec.insert = shufflevector <2 x bfloat> %0, <2 x bfloat> poison, <2 x i32> <i32 1, i32 undef>
4711   %vy1.2.vec.insert = shufflevector <2 x bfloat> %vy1.0.vec.insert, <2 x bfloat> %1, <2 x i32> <i32 0, i32 2>
4712   ret <2 x bfloat> %vy1.2.vec.insert
4715 define <2 x bfloat> @v2bfloat_hi16bits(ptr addrspace(1) %x0) {
4716 ; GFX9-LABEL: v2bfloat_hi16bits:
4717 ; GFX9:       ; %bb.0: ; %entry
4718 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4719 ; GFX9-NEXT:    global_load_dword v0, v[0:1], off
4720 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4721 ; GFX9-NEXT:    v_and_b32_e32 v0, 0xffff0000, v0
4722 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
4724 ; GFX10-LABEL: v2bfloat_hi16bits:
4725 ; GFX10:       ; %bb.0: ; %entry
4726 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4727 ; GFX10-NEXT:    global_load_dword v0, v[0:1], off
4728 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
4729 ; GFX10-NEXT:    v_and_b32_e32 v0, 0xffff0000, v0
4730 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
4732 ; GFX11-LABEL: v2bfloat_hi16bits:
4733 ; GFX11:       ; %bb.0: ; %entry
4734 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4735 ; GFX11-NEXT:    global_load_b32 v0, v[0:1], off
4736 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
4737 ; GFX11-NEXT:    v_and_b32_e32 v0, 0xffff0000, v0
4738 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
4739 entry:
4740   %load0 = load <2 x bfloat>, ptr addrspace(1) %x0, align 4
4741   %insert1 = insertelement <2 x bfloat> undef, bfloat 0.0, i32 0
4742   %insert2 = insertelement <2 x bfloat> %insert1, bfloat 0.0, i32 1
4743   %vec.ret = shufflevector <2 x bfloat> %insert2, <2 x bfloat> %load0, <2 x i32> <i32 0, i32 3>
4744   ret <2 x bfloat> %vec.ret
4747 define void @shuffle_v8bf16_concat(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1, ptr addrspace(1) %out) {
4748 ; GFX9-LABEL: shuffle_v8bf16_concat:
4749 ; GFX9:       ; %bb.0:
4750 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4751 ; GFX9-NEXT:    global_load_dwordx2 v[6:7], v[0:1], off
4752 ; GFX9-NEXT:    global_load_dwordx2 v[8:9], v[2:3], off
4753 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4754 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[6:9], off
4755 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4756 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
4758 ; GFX10-LABEL: shuffle_v8bf16_concat:
4759 ; GFX10:       ; %bb.0:
4760 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4761 ; GFX10-NEXT:    global_load_dwordx2 v[6:7], v[0:1], off
4762 ; GFX10-NEXT:    global_load_dwordx2 v[8:9], v[2:3], off
4763 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
4764 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[6:9], off
4765 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
4767 ; GFX11-LABEL: shuffle_v8bf16_concat:
4768 ; GFX11:       ; %bb.0:
4769 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4770 ; GFX11-NEXT:    global_load_b64 v[0:1], v[0:1], off
4771 ; GFX11-NEXT:    global_load_b64 v[2:3], v[2:3], off
4772 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
4773 ; GFX11-NEXT:    global_store_b128 v[4:5], v[0:3], off
4774 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
4775   %val0 = load <4 x bfloat>, ptr addrspace(1) %arg0
4776   %val1 = load <4 x bfloat>, ptr addrspace(1) %arg1
4777   %shuffle = shufflevector <4 x bfloat> %val0, <4 x bfloat> %val1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
4778   store <8 x bfloat> %shuffle, ptr addrspace(1) %out
4779   ret void
4782 define void @shuffle_v16bf16_concat(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1, ptr addrspace(1) %out) {
4783 ; GFX9-LABEL: shuffle_v16bf16_concat:
4784 ; GFX9:       ; %bb.0:
4785 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4786 ; GFX9-NEXT:    global_load_dwordx4 v[6:9], v[2:3], off
4787 ; GFX9-NEXT:    global_load_dwordx4 v[10:13], v[0:1], off
4788 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
4789 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[6:9], off offset:16
4790 ; GFX9-NEXT:    s_waitcnt vmcnt(1)
4791 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[10:13], off
4792 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4793 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
4795 ; GFX10-LABEL: shuffle_v16bf16_concat:
4796 ; GFX10:       ; %bb.0:
4797 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4798 ; GFX10-NEXT:    global_load_dwordx4 v[6:9], v[2:3], off
4799 ; GFX10-NEXT:    global_load_dwordx4 v[10:13], v[0:1], off
4800 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
4801 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[6:9], off offset:16
4802 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
4803 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[10:13], off
4804 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
4806 ; GFX11-LABEL: shuffle_v16bf16_concat:
4807 ; GFX11:       ; %bb.0:
4808 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4809 ; GFX11-NEXT:    global_load_b128 v[6:9], v[2:3], off
4810 ; GFX11-NEXT:    global_load_b128 v[0:3], v[0:1], off
4811 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
4812 ; GFX11-NEXT:    global_store_b128 v[4:5], v[6:9], off offset:16
4813 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
4814 ; GFX11-NEXT:    global_store_b128 v[4:5], v[0:3], off
4815 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
4816   %val0 = load <8 x bfloat>, ptr addrspace(1) %arg0
4817   %val1 = load <8 x bfloat>, ptr addrspace(1) %arg1
4818   %shuffle = shufflevector <8 x bfloat> %val0, <8 x bfloat> %val1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
4819   store <16 x bfloat> %shuffle, ptr addrspace(1) %out
4820   ret void
4823 define void @shuffle_v32bf16_concat(ptr addrspace(1) %arg0, ptr addrspace(1) %arg1, ptr addrspace(1) %out) {
4824 ; GFX9-LABEL: shuffle_v32bf16_concat:
4825 ; GFX9:       ; %bb.0:
4826 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4827 ; GFX9-NEXT:    global_load_dwordx4 v[6:9], v[2:3], off
4828 ; GFX9-NEXT:    global_load_dwordx4 v[10:13], v[2:3], off offset:16
4829 ; GFX9-NEXT:    global_load_dwordx4 v[14:17], v[0:1], off
4830 ; GFX9-NEXT:    global_load_dwordx4 v[18:21], v[0:1], off offset:16
4831 ; GFX9-NEXT:    s_waitcnt vmcnt(3)
4832 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[6:9], off offset:32
4833 ; GFX9-NEXT:    s_waitcnt vmcnt(3)
4834 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[10:13], off offset:48
4835 ; GFX9-NEXT:    s_waitcnt vmcnt(3)
4836 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[14:17], off
4837 ; GFX9-NEXT:    s_waitcnt vmcnt(3)
4838 ; GFX9-NEXT:    global_store_dwordx4 v[4:5], v[18:21], off offset:16
4839 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
4840 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
4842 ; GFX10-LABEL: shuffle_v32bf16_concat:
4843 ; GFX10:       ; %bb.0:
4844 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4845 ; GFX10-NEXT:    s_clause 0x1
4846 ; GFX10-NEXT:    global_load_dwordx4 v[6:9], v[2:3], off
4847 ; GFX10-NEXT:    global_load_dwordx4 v[10:13], v[2:3], off offset:16
4848 ; GFX10-NEXT:    s_clause 0x1
4849 ; GFX10-NEXT:    global_load_dwordx4 v[14:17], v[0:1], off
4850 ; GFX10-NEXT:    global_load_dwordx4 v[18:21], v[0:1], off offset:16
4851 ; GFX10-NEXT:    s_waitcnt vmcnt(3)
4852 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[6:9], off offset:32
4853 ; GFX10-NEXT:    s_waitcnt vmcnt(2)
4854 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[10:13], off offset:48
4855 ; GFX10-NEXT:    s_waitcnt vmcnt(1)
4856 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[14:17], off
4857 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
4858 ; GFX10-NEXT:    global_store_dwordx4 v[4:5], v[18:21], off offset:16
4859 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
4861 ; GFX11-LABEL: shuffle_v32bf16_concat:
4862 ; GFX11:       ; %bb.0:
4863 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4864 ; GFX11-NEXT:    s_clause 0x1
4865 ; GFX11-NEXT:    global_load_b128 v[6:9], v[2:3], off
4866 ; GFX11-NEXT:    global_load_b128 v[10:13], v[2:3], off offset:16
4867 ; GFX11-NEXT:    s_clause 0x1
4868 ; GFX11-NEXT:    global_load_b128 v[14:17], v[0:1], off
4869 ; GFX11-NEXT:    global_load_b128 v[0:3], v[0:1], off offset:16
4870 ; GFX11-NEXT:    s_waitcnt vmcnt(3)
4871 ; GFX11-NEXT:    global_store_b128 v[4:5], v[6:9], off offset:32
4872 ; GFX11-NEXT:    s_waitcnt vmcnt(2)
4873 ; GFX11-NEXT:    global_store_b128 v[4:5], v[10:13], off offset:48
4874 ; GFX11-NEXT:    s_waitcnt vmcnt(1)
4875 ; GFX11-NEXT:    global_store_b128 v[4:5], v[14:17], off
4876 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
4877 ; GFX11-NEXT:    global_store_b128 v[4:5], v[0:3], off offset:16
4878 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
4879   %val0 = load <16 x bfloat>, ptr addrspace(1) %arg0
4880   %val1 = load <16 x bfloat>, ptr addrspace(1) %arg1
4881   %shuffle = shufflevector <16 x bfloat> %val0, <16 x bfloat> %val1, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
4882   store <32 x bfloat> %shuffle, ptr addrspace(1) %out
4883   ret void
4886 declare <2 x half> @llvm.fma.v2f16(<2 x half>, <2 x half>, <2 x half>) #0
4887 declare <2 x bfloat> @llvm.fma.v2bf16(<2 x bfloat>, <2 x bfloat>, <2 x bfloat>) #0
4888 declare i32 @llvm.amdgcn.workitem.id.x() #0
4890 attributes #0 = { nounwind readnone speculatable }