Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / bswap.ll
blobe4c7df385d86197a73edf9cd15a668d0af801ea1
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=amdgcn-- -verify-machineinstrs | FileCheck %s --check-prefix=SI
3 ; RUN: llc < %s -mtriple=amdgcn-- -mcpu=tonga -mattr=-flat-for-global -verify-machineinstrs | FileCheck %s --check-prefix=VI
4 ; RUN: llc < %s -mtriple=amdgcn-- -mcpu=gfx1100 -mattr=-flat-for-global -verify-machineinstrs | FileCheck %s --check-prefix=GFX11
6 declare i16 @llvm.bswap.i16(i16) nounwind readnone
7 declare <2 x i16> @llvm.bswap.v2i16(<2 x i16>) nounwind readnone
8 declare <3 x i16> @llvm.bswap.v3i16(<3 x i16>) nounwind readnone
9 declare <4 x i16> @llvm.bswap.v4i16(<4 x i16>) nounwind readnone
10 declare i32 @llvm.bswap.i32(i32) nounwind readnone
11 declare <2 x i32> @llvm.bswap.v2i32(<2 x i32>) nounwind readnone
12 declare <4 x i32> @llvm.bswap.v4i32(<4 x i32>) nounwind readnone
13 declare <8 x i32> @llvm.bswap.v8i32(<8 x i32>) nounwind readnone
14 declare i64 @llvm.bswap.i64(i64) nounwind readnone
15 declare <2 x i64> @llvm.bswap.v2i64(<2 x i64>) nounwind readnone
16 declare <4 x i64> @llvm.bswap.v4i64(<4 x i64>) nounwind readnone
17 declare i48 @llvm.bswap.i48(i48) #1
19 define amdgpu_kernel void @test_bswap_i32(ptr addrspace(1) %out, ptr addrspace(1) %in) nounwind {
20 ; SI-LABEL: test_bswap_i32:
21 ; SI:       ; %bb.0:
22 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
23 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
24 ; SI-NEXT:    s_load_dword s4, s[2:3], 0x0
25 ; SI-NEXT:    s_mov_b32 s3, 0xf000
26 ; SI-NEXT:    s_mov_b32 s2, -1
27 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
28 ; SI-NEXT:    v_alignbit_b32 v0, s4, s4, 8
29 ; SI-NEXT:    v_alignbit_b32 v1, s4, s4, 24
30 ; SI-NEXT:    s_mov_b32 s4, 0xff00ff
31 ; SI-NEXT:    v_bfi_b32 v0, s4, v1, v0
32 ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0
33 ; SI-NEXT:    s_endpgm
35 ; VI-LABEL: test_bswap_i32:
36 ; VI:       ; %bb.0:
37 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
38 ; VI-NEXT:    v_mov_b32_e32 v0, 0x10203
39 ; VI-NEXT:    s_mov_b32 s7, 0xf000
40 ; VI-NEXT:    s_mov_b32 s6, -1
41 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
42 ; VI-NEXT:    s_load_dword s2, s[2:3], 0x0
43 ; VI-NEXT:    s_mov_b32 s4, s0
44 ; VI-NEXT:    s_mov_b32 s5, s1
45 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
46 ; VI-NEXT:    v_perm_b32 v0, 0, s2, v0
47 ; VI-NEXT:    buffer_store_dword v0, off, s[4:7], 0
48 ; VI-NEXT:    s_endpgm
50 ; GFX11-LABEL: test_bswap_i32:
51 ; GFX11:       ; %bb.0:
52 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
53 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
54 ; GFX11-NEXT:    s_load_b32 s2, s[2:3], 0x0
55 ; GFX11-NEXT:    s_mov_b32 s3, 0x31016000
56 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
57 ; GFX11-NEXT:    v_perm_b32 v0, 0, s2, 0x10203
58 ; GFX11-NEXT:    s_mov_b32 s2, -1
59 ; GFX11-NEXT:    buffer_store_b32 v0, off, s[0:3], 0
60 ; GFX11-NEXT:    s_nop 0
61 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
62 ; GFX11-NEXT:    s_endpgm
63   %val = load i32, ptr addrspace(1) %in, align 4
64   %bswap = call i32 @llvm.bswap.i32(i32 %val) nounwind readnone
65   store i32 %bswap, ptr addrspace(1) %out, align 4
66   ret void
69 define amdgpu_kernel void @test_bswap_v2i32(ptr addrspace(1) %out, ptr addrspace(1) %in) nounwind {
70 ; SI-LABEL: test_bswap_v2i32:
71 ; SI:       ; %bb.0:
72 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
73 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
74 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[2:3], 0x0
75 ; SI-NEXT:    s_mov_b32 s3, 0xf000
76 ; SI-NEXT:    s_mov_b32 s2, -1
77 ; SI-NEXT:    s_mov_b32 s6, 0xff00ff
78 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
79 ; SI-NEXT:    v_alignbit_b32 v0, s5, s5, 8
80 ; SI-NEXT:    v_alignbit_b32 v1, s5, s5, 24
81 ; SI-NEXT:    v_alignbit_b32 v2, s4, s4, 8
82 ; SI-NEXT:    v_alignbit_b32 v3, s4, s4, 24
83 ; SI-NEXT:    v_bfi_b32 v1, s6, v1, v0
84 ; SI-NEXT:    v_bfi_b32 v0, s6, v3, v2
85 ; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
86 ; SI-NEXT:    s_endpgm
88 ; VI-LABEL: test_bswap_v2i32:
89 ; VI:       ; %bb.0:
90 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
91 ; VI-NEXT:    v_mov_b32_e32 v0, 0x10203
92 ; VI-NEXT:    s_mov_b32 s7, 0xf000
93 ; VI-NEXT:    s_mov_b32 s6, -1
94 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
95 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[2:3], 0x0
96 ; VI-NEXT:    s_mov_b32 s4, s0
97 ; VI-NEXT:    s_mov_b32 s5, s1
98 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
99 ; VI-NEXT:    v_perm_b32 v1, 0, s3, v0
100 ; VI-NEXT:    v_perm_b32 v0, 0, s2, v0
101 ; VI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
102 ; VI-NEXT:    s_endpgm
104 ; GFX11-LABEL: test_bswap_v2i32:
105 ; GFX11:       ; %bb.0:
106 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
107 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
108 ; GFX11-NEXT:    s_load_b64 s[4:5], s[2:3], 0x0
109 ; GFX11-NEXT:    s_mov_b32 s3, 0x31016000
110 ; GFX11-NEXT:    s_mov_b32 s2, -1
111 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
112 ; GFX11-NEXT:    v_perm_b32 v1, 0, s5, 0x10203
113 ; GFX11-NEXT:    v_perm_b32 v0, 0, s4, 0x10203
114 ; GFX11-NEXT:    buffer_store_b64 v[0:1], off, s[0:3], 0
115 ; GFX11-NEXT:    s_nop 0
116 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
117 ; GFX11-NEXT:    s_endpgm
118   %val = load <2 x i32>, ptr addrspace(1) %in, align 8
119   %bswap = call <2 x i32> @llvm.bswap.v2i32(<2 x i32> %val) nounwind readnone
120   store <2 x i32> %bswap, ptr addrspace(1) %out, align 8
121   ret void
124 define amdgpu_kernel void @test_bswap_v4i32(ptr addrspace(1) %out, ptr addrspace(1) %in) nounwind {
125 ; SI-LABEL: test_bswap_v4i32:
126 ; SI:       ; %bb.0:
127 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
128 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
129 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x0
130 ; SI-NEXT:    s_mov_b32 s3, 0xf000
131 ; SI-NEXT:    s_mov_b32 s2, -1
132 ; SI-NEXT:    s_mov_b32 s8, 0xff00ff
133 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
134 ; SI-NEXT:    v_alignbit_b32 v0, s7, s7, 8
135 ; SI-NEXT:    v_alignbit_b32 v1, s7, s7, 24
136 ; SI-NEXT:    v_alignbit_b32 v2, s6, s6, 8
137 ; SI-NEXT:    v_alignbit_b32 v4, s6, s6, 24
138 ; SI-NEXT:    v_alignbit_b32 v5, s5, s5, 8
139 ; SI-NEXT:    v_alignbit_b32 v6, s5, s5, 24
140 ; SI-NEXT:    v_alignbit_b32 v7, s4, s4, 8
141 ; SI-NEXT:    v_alignbit_b32 v8, s4, s4, 24
142 ; SI-NEXT:    v_bfi_b32 v3, s8, v1, v0
143 ; SI-NEXT:    v_bfi_b32 v2, s8, v4, v2
144 ; SI-NEXT:    v_bfi_b32 v1, s8, v6, v5
145 ; SI-NEXT:    v_bfi_b32 v0, s8, v8, v7
146 ; SI-NEXT:    buffer_store_dwordx4 v[0:3], off, s[0:3], 0
147 ; SI-NEXT:    s_endpgm
149 ; VI-LABEL: test_bswap_v4i32:
150 ; VI:       ; %bb.0:
151 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
152 ; VI-NEXT:    v_mov_b32_e32 v0, 0x10203
153 ; VI-NEXT:    s_mov_b32 s7, 0xf000
154 ; VI-NEXT:    s_mov_b32 s6, -1
155 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
156 ; VI-NEXT:    s_load_dwordx4 s[8:11], s[2:3], 0x0
157 ; VI-NEXT:    s_mov_b32 s4, s0
158 ; VI-NEXT:    s_mov_b32 s5, s1
159 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
160 ; VI-NEXT:    v_perm_b32 v3, 0, s11, v0
161 ; VI-NEXT:    v_perm_b32 v2, 0, s10, v0
162 ; VI-NEXT:    v_perm_b32 v1, 0, s9, v0
163 ; VI-NEXT:    v_perm_b32 v0, 0, s8, v0
164 ; VI-NEXT:    buffer_store_dwordx4 v[0:3], off, s[4:7], 0
165 ; VI-NEXT:    s_endpgm
167 ; GFX11-LABEL: test_bswap_v4i32:
168 ; GFX11:       ; %bb.0:
169 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
170 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
171 ; GFX11-NEXT:    s_load_b128 s[4:7], s[2:3], 0x0
172 ; GFX11-NEXT:    s_mov_b32 s3, 0x31016000
173 ; GFX11-NEXT:    s_mov_b32 s2, -1
174 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
175 ; GFX11-NEXT:    v_perm_b32 v3, 0, s7, 0x10203
176 ; GFX11-NEXT:    v_perm_b32 v2, 0, s6, 0x10203
177 ; GFX11-NEXT:    v_perm_b32 v1, 0, s5, 0x10203
178 ; GFX11-NEXT:    v_perm_b32 v0, 0, s4, 0x10203
179 ; GFX11-NEXT:    buffer_store_b128 v[0:3], off, s[0:3], 0
180 ; GFX11-NEXT:    s_nop 0
181 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
182 ; GFX11-NEXT:    s_endpgm
183   %val = load <4 x i32>, ptr addrspace(1) %in, align 16
184   %bswap = call <4 x i32> @llvm.bswap.v4i32(<4 x i32> %val) nounwind readnone
185   store <4 x i32> %bswap, ptr addrspace(1) %out, align 16
186   ret void
189 define amdgpu_kernel void @test_bswap_v8i32(ptr addrspace(1) %out, ptr addrspace(1) %in) nounwind {
190 ; SI-LABEL: test_bswap_v8i32:
191 ; SI:       ; %bb.0:
192 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
193 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
194 ; SI-NEXT:    s_load_dwordx8 s[4:11], s[2:3], 0x0
195 ; SI-NEXT:    s_mov_b32 s3, 0xf000
196 ; SI-NEXT:    s_mov_b32 s2, -1
197 ; SI-NEXT:    s_mov_b32 s12, 0xff00ff
198 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
199 ; SI-NEXT:    v_alignbit_b32 v0, s7, s7, 8
200 ; SI-NEXT:    v_alignbit_b32 v1, s7, s7, 24
201 ; SI-NEXT:    v_alignbit_b32 v2, s6, s6, 8
202 ; SI-NEXT:    v_alignbit_b32 v4, s6, s6, 24
203 ; SI-NEXT:    v_alignbit_b32 v5, s5, s5, 8
204 ; SI-NEXT:    v_alignbit_b32 v6, s5, s5, 24
205 ; SI-NEXT:    v_alignbit_b32 v7, s4, s4, 8
206 ; SI-NEXT:    v_alignbit_b32 v8, s4, s4, 24
207 ; SI-NEXT:    v_alignbit_b32 v9, s11, s11, 8
208 ; SI-NEXT:    v_alignbit_b32 v10, s11, s11, 24
209 ; SI-NEXT:    v_alignbit_b32 v11, s10, s10, 8
210 ; SI-NEXT:    v_alignbit_b32 v12, s10, s10, 24
211 ; SI-NEXT:    v_alignbit_b32 v13, s9, s9, 8
212 ; SI-NEXT:    v_alignbit_b32 v14, s9, s9, 24
213 ; SI-NEXT:    v_alignbit_b32 v15, s8, s8, 8
214 ; SI-NEXT:    v_alignbit_b32 v16, s8, s8, 24
215 ; SI-NEXT:    v_bfi_b32 v3, s12, v1, v0
216 ; SI-NEXT:    v_bfi_b32 v2, s12, v4, v2
217 ; SI-NEXT:    v_bfi_b32 v1, s12, v6, v5
218 ; SI-NEXT:    v_bfi_b32 v0, s12, v8, v7
219 ; SI-NEXT:    v_bfi_b32 v7, s12, v10, v9
220 ; SI-NEXT:    v_bfi_b32 v6, s12, v12, v11
221 ; SI-NEXT:    v_bfi_b32 v5, s12, v14, v13
222 ; SI-NEXT:    v_bfi_b32 v4, s12, v16, v15
223 ; SI-NEXT:    buffer_store_dwordx4 v[4:7], off, s[0:3], 0 offset:16
224 ; SI-NEXT:    buffer_store_dwordx4 v[0:3], off, s[0:3], 0
225 ; SI-NEXT:    s_endpgm
227 ; VI-LABEL: test_bswap_v8i32:
228 ; VI:       ; %bb.0:
229 ; VI-NEXT:    s_load_dwordx4 s[8:11], s[0:1], 0x24
230 ; VI-NEXT:    v_mov_b32_e32 v4, 0x10203
231 ; VI-NEXT:    s_mov_b32 s15, 0xf000
232 ; VI-NEXT:    s_mov_b32 s14, -1
233 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
234 ; VI-NEXT:    s_load_dwordx8 s[0:7], s[10:11], 0x0
235 ; VI-NEXT:    s_mov_b32 s12, s8
236 ; VI-NEXT:    s_mov_b32 s13, s9
237 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
238 ; VI-NEXT:    v_perm_b32 v3, 0, s3, v4
239 ; VI-NEXT:    v_perm_b32 v2, 0, s2, v4
240 ; VI-NEXT:    v_perm_b32 v1, 0, s1, v4
241 ; VI-NEXT:    v_perm_b32 v0, 0, s0, v4
242 ; VI-NEXT:    v_perm_b32 v7, 0, s7, v4
243 ; VI-NEXT:    v_perm_b32 v6, 0, s6, v4
244 ; VI-NEXT:    v_perm_b32 v5, 0, s5, v4
245 ; VI-NEXT:    v_perm_b32 v4, 0, s4, v4
246 ; VI-NEXT:    buffer_store_dwordx4 v[4:7], off, s[12:15], 0 offset:16
247 ; VI-NEXT:    buffer_store_dwordx4 v[0:3], off, s[12:15], 0
248 ; VI-NEXT:    s_endpgm
250 ; GFX11-LABEL: test_bswap_v8i32:
251 ; GFX11:       ; %bb.0:
252 ; GFX11-NEXT:    s_load_b128 s[8:11], s[0:1], 0x24
253 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
254 ; GFX11-NEXT:    s_load_b256 s[0:7], s[10:11], 0x0
255 ; GFX11-NEXT:    s_mov_b32 s11, 0x31016000
256 ; GFX11-NEXT:    s_mov_b32 s10, -1
257 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
258 ; GFX11-NEXT:    v_perm_b32 v7, 0, s7, 0x10203
259 ; GFX11-NEXT:    v_perm_b32 v6, 0, s6, 0x10203
260 ; GFX11-NEXT:    v_perm_b32 v5, 0, s5, 0x10203
261 ; GFX11-NEXT:    v_perm_b32 v4, 0, s4, 0x10203
262 ; GFX11-NEXT:    v_perm_b32 v3, 0, s3, 0x10203
263 ; GFX11-NEXT:    v_perm_b32 v2, 0, s2, 0x10203
264 ; GFX11-NEXT:    v_perm_b32 v1, 0, s1, 0x10203
265 ; GFX11-NEXT:    v_perm_b32 v0, 0, s0, 0x10203
266 ; GFX11-NEXT:    s_clause 0x1
267 ; GFX11-NEXT:    buffer_store_b128 v[4:7], off, s[8:11], 0 offset:16
268 ; GFX11-NEXT:    buffer_store_b128 v[0:3], off, s[8:11], 0
269 ; GFX11-NEXT:    s_nop 0
270 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
271 ; GFX11-NEXT:    s_endpgm
272   %val = load <8 x i32>, ptr addrspace(1) %in, align 32
273   %bswap = call <8 x i32> @llvm.bswap.v8i32(<8 x i32> %val) nounwind readnone
274   store <8 x i32> %bswap, ptr addrspace(1) %out, align 32
275   ret void
278 define amdgpu_kernel void @test_bswap_i64(ptr addrspace(1) %out, ptr addrspace(1) %in) nounwind {
279 ; SI-LABEL: test_bswap_i64:
280 ; SI:       ; %bb.0:
281 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
282 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
283 ; SI-NEXT:    s_load_dwordx2 s[4:5], s[2:3], 0x0
284 ; SI-NEXT:    s_mov_b32 s3, 0xf000
285 ; SI-NEXT:    s_mov_b32 s2, -1
286 ; SI-NEXT:    s_mov_b32 s6, 0xff00ff
287 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
288 ; SI-NEXT:    v_alignbit_b32 v0, s4, s4, 8
289 ; SI-NEXT:    v_alignbit_b32 v1, s4, s4, 24
290 ; SI-NEXT:    v_alignbit_b32 v2, s5, s5, 8
291 ; SI-NEXT:    v_alignbit_b32 v3, s5, s5, 24
292 ; SI-NEXT:    v_bfi_b32 v1, s6, v1, v0
293 ; SI-NEXT:    v_bfi_b32 v0, s6, v3, v2
294 ; SI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
295 ; SI-NEXT:    s_endpgm
297 ; VI-LABEL: test_bswap_i64:
298 ; VI:       ; %bb.0:
299 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
300 ; VI-NEXT:    v_mov_b32_e32 v0, 0x10203
301 ; VI-NEXT:    s_mov_b32 s7, 0xf000
302 ; VI-NEXT:    s_mov_b32 s6, -1
303 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
304 ; VI-NEXT:    s_load_dwordx2 s[2:3], s[2:3], 0x0
305 ; VI-NEXT:    s_mov_b32 s4, s0
306 ; VI-NEXT:    s_mov_b32 s5, s1
307 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
308 ; VI-NEXT:    v_perm_b32 v1, 0, s2, v0
309 ; VI-NEXT:    v_perm_b32 v0, 0, s3, v0
310 ; VI-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
311 ; VI-NEXT:    s_endpgm
313 ; GFX11-LABEL: test_bswap_i64:
314 ; GFX11:       ; %bb.0:
315 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
316 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
317 ; GFX11-NEXT:    s_load_b64 s[4:5], s[2:3], 0x0
318 ; GFX11-NEXT:    s_mov_b32 s3, 0x31016000
319 ; GFX11-NEXT:    s_mov_b32 s2, -1
320 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
321 ; GFX11-NEXT:    v_perm_b32 v1, 0, s4, 0x10203
322 ; GFX11-NEXT:    v_perm_b32 v0, 0, s5, 0x10203
323 ; GFX11-NEXT:    buffer_store_b64 v[0:1], off, s[0:3], 0
324 ; GFX11-NEXT:    s_nop 0
325 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
326 ; GFX11-NEXT:    s_endpgm
327   %val = load i64, ptr addrspace(1) %in, align 8
328   %bswap = call i64 @llvm.bswap.i64(i64 %val) nounwind readnone
329   store i64 %bswap, ptr addrspace(1) %out, align 8
330   ret void
333 define amdgpu_kernel void @test_bswap_v2i64(ptr addrspace(1) %out, ptr addrspace(1) %in) nounwind {
334 ; SI-LABEL: test_bswap_v2i64:
335 ; SI:       ; %bb.0:
336 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
337 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
338 ; SI-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x0
339 ; SI-NEXT:    s_mov_b32 s3, 0xf000
340 ; SI-NEXT:    s_mov_b32 s2, -1
341 ; SI-NEXT:    s_mov_b32 s8, 0xff00ff
342 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
343 ; SI-NEXT:    v_alignbit_b32 v0, s6, s6, 8
344 ; SI-NEXT:    v_alignbit_b32 v1, s6, s6, 24
345 ; SI-NEXT:    v_alignbit_b32 v2, s7, s7, 8
346 ; SI-NEXT:    v_alignbit_b32 v4, s7, s7, 24
347 ; SI-NEXT:    v_alignbit_b32 v5, s4, s4, 8
348 ; SI-NEXT:    v_alignbit_b32 v6, s4, s4, 24
349 ; SI-NEXT:    v_alignbit_b32 v7, s5, s5, 8
350 ; SI-NEXT:    v_alignbit_b32 v8, s5, s5, 24
351 ; SI-NEXT:    v_bfi_b32 v3, s8, v1, v0
352 ; SI-NEXT:    v_bfi_b32 v2, s8, v4, v2
353 ; SI-NEXT:    v_bfi_b32 v1, s8, v6, v5
354 ; SI-NEXT:    v_bfi_b32 v0, s8, v8, v7
355 ; SI-NEXT:    buffer_store_dwordx4 v[0:3], off, s[0:3], 0
356 ; SI-NEXT:    s_endpgm
358 ; VI-LABEL: test_bswap_v2i64:
359 ; VI:       ; %bb.0:
360 ; VI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
361 ; VI-NEXT:    v_mov_b32_e32 v0, 0x10203
362 ; VI-NEXT:    s_mov_b32 s7, 0xf000
363 ; VI-NEXT:    s_mov_b32 s6, -1
364 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
365 ; VI-NEXT:    s_load_dwordx4 s[8:11], s[2:3], 0x0
366 ; VI-NEXT:    s_mov_b32 s4, s0
367 ; VI-NEXT:    s_mov_b32 s5, s1
368 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
369 ; VI-NEXT:    v_perm_b32 v3, 0, s10, v0
370 ; VI-NEXT:    v_perm_b32 v2, 0, s11, v0
371 ; VI-NEXT:    v_perm_b32 v1, 0, s8, v0
372 ; VI-NEXT:    v_perm_b32 v0, 0, s9, v0
373 ; VI-NEXT:    buffer_store_dwordx4 v[0:3], off, s[4:7], 0
374 ; VI-NEXT:    s_endpgm
376 ; GFX11-LABEL: test_bswap_v2i64:
377 ; GFX11:       ; %bb.0:
378 ; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
379 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
380 ; GFX11-NEXT:    s_load_b128 s[4:7], s[2:3], 0x0
381 ; GFX11-NEXT:    s_mov_b32 s3, 0x31016000
382 ; GFX11-NEXT:    s_mov_b32 s2, -1
383 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
384 ; GFX11-NEXT:    v_perm_b32 v3, 0, s6, 0x10203
385 ; GFX11-NEXT:    v_perm_b32 v2, 0, s7, 0x10203
386 ; GFX11-NEXT:    v_perm_b32 v1, 0, s4, 0x10203
387 ; GFX11-NEXT:    v_perm_b32 v0, 0, s5, 0x10203
388 ; GFX11-NEXT:    buffer_store_b128 v[0:3], off, s[0:3], 0
389 ; GFX11-NEXT:    s_nop 0
390 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
391 ; GFX11-NEXT:    s_endpgm
392   %val = load <2 x i64>, ptr addrspace(1) %in, align 16
393   %bswap = call <2 x i64> @llvm.bswap.v2i64(<2 x i64> %val) nounwind readnone
394   store <2 x i64> %bswap, ptr addrspace(1) %out, align 16
395   ret void
398 define amdgpu_kernel void @test_bswap_v4i64(ptr addrspace(1) %out, ptr addrspace(1) %in) nounwind {
399 ; SI-LABEL: test_bswap_v4i64:
400 ; SI:       ; %bb.0:
401 ; SI-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
402 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
403 ; SI-NEXT:    s_load_dwordx8 s[4:11], s[2:3], 0x0
404 ; SI-NEXT:    s_mov_b32 s3, 0xf000
405 ; SI-NEXT:    s_mov_b32 s2, -1
406 ; SI-NEXT:    s_mov_b32 s12, 0xff00ff
407 ; SI-NEXT:    s_waitcnt lgkmcnt(0)
408 ; SI-NEXT:    v_alignbit_b32 v0, s6, s6, 8
409 ; SI-NEXT:    v_alignbit_b32 v1, s6, s6, 24
410 ; SI-NEXT:    v_alignbit_b32 v2, s7, s7, 8
411 ; SI-NEXT:    v_alignbit_b32 v4, s7, s7, 24
412 ; SI-NEXT:    v_alignbit_b32 v5, s4, s4, 8
413 ; SI-NEXT:    v_alignbit_b32 v6, s4, s4, 24
414 ; SI-NEXT:    v_alignbit_b32 v7, s5, s5, 8
415 ; SI-NEXT:    v_alignbit_b32 v8, s5, s5, 24
416 ; SI-NEXT:    v_alignbit_b32 v9, s10, s10, 8
417 ; SI-NEXT:    v_alignbit_b32 v10, s10, s10, 24
418 ; SI-NEXT:    v_alignbit_b32 v11, s11, s11, 8
419 ; SI-NEXT:    v_alignbit_b32 v12, s11, s11, 24
420 ; SI-NEXT:    v_alignbit_b32 v13, s8, s8, 8
421 ; SI-NEXT:    v_alignbit_b32 v14, s8, s8, 24
422 ; SI-NEXT:    v_alignbit_b32 v15, s9, s9, 8
423 ; SI-NEXT:    v_alignbit_b32 v16, s9, s9, 24
424 ; SI-NEXT:    v_bfi_b32 v3, s12, v1, v0
425 ; SI-NEXT:    v_bfi_b32 v2, s12, v4, v2
426 ; SI-NEXT:    v_bfi_b32 v1, s12, v6, v5
427 ; SI-NEXT:    v_bfi_b32 v0, s12, v8, v7
428 ; SI-NEXT:    v_bfi_b32 v7, s12, v10, v9
429 ; SI-NEXT:    v_bfi_b32 v6, s12, v12, v11
430 ; SI-NEXT:    v_bfi_b32 v5, s12, v14, v13
431 ; SI-NEXT:    v_bfi_b32 v4, s12, v16, v15
432 ; SI-NEXT:    buffer_store_dwordx4 v[4:7], off, s[0:3], 0 offset:16
433 ; SI-NEXT:    buffer_store_dwordx4 v[0:3], off, s[0:3], 0
434 ; SI-NEXT:    s_endpgm
436 ; VI-LABEL: test_bswap_v4i64:
437 ; VI:       ; %bb.0:
438 ; VI-NEXT:    s_load_dwordx4 s[8:11], s[0:1], 0x24
439 ; VI-NEXT:    v_mov_b32_e32 v4, 0x10203
440 ; VI-NEXT:    s_mov_b32 s15, 0xf000
441 ; VI-NEXT:    s_mov_b32 s14, -1
442 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
443 ; VI-NEXT:    s_load_dwordx8 s[0:7], s[10:11], 0x0
444 ; VI-NEXT:    s_mov_b32 s12, s8
445 ; VI-NEXT:    s_mov_b32 s13, s9
446 ; VI-NEXT:    s_waitcnt lgkmcnt(0)
447 ; VI-NEXT:    v_perm_b32 v3, 0, s2, v4
448 ; VI-NEXT:    v_perm_b32 v2, 0, s3, v4
449 ; VI-NEXT:    v_perm_b32 v1, 0, s0, v4
450 ; VI-NEXT:    v_perm_b32 v0, 0, s1, v4
451 ; VI-NEXT:    v_perm_b32 v7, 0, s6, v4
452 ; VI-NEXT:    v_perm_b32 v6, 0, s7, v4
453 ; VI-NEXT:    v_perm_b32 v5, 0, s4, v4
454 ; VI-NEXT:    v_perm_b32 v4, 0, s5, v4
455 ; VI-NEXT:    buffer_store_dwordx4 v[4:7], off, s[12:15], 0 offset:16
456 ; VI-NEXT:    buffer_store_dwordx4 v[0:3], off, s[12:15], 0
457 ; VI-NEXT:    s_endpgm
459 ; GFX11-LABEL: test_bswap_v4i64:
460 ; GFX11:       ; %bb.0:
461 ; GFX11-NEXT:    s_load_b128 s[8:11], s[0:1], 0x24
462 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
463 ; GFX11-NEXT:    s_load_b256 s[0:7], s[10:11], 0x0
464 ; GFX11-NEXT:    s_mov_b32 s11, 0x31016000
465 ; GFX11-NEXT:    s_mov_b32 s10, -1
466 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
467 ; GFX11-NEXT:    v_perm_b32 v7, 0, s6, 0x10203
468 ; GFX11-NEXT:    v_perm_b32 v6, 0, s7, 0x10203
469 ; GFX11-NEXT:    v_perm_b32 v5, 0, s4, 0x10203
470 ; GFX11-NEXT:    v_perm_b32 v4, 0, s5, 0x10203
471 ; GFX11-NEXT:    v_perm_b32 v3, 0, s2, 0x10203
472 ; GFX11-NEXT:    v_perm_b32 v2, 0, s3, 0x10203
473 ; GFX11-NEXT:    v_perm_b32 v1, 0, s0, 0x10203
474 ; GFX11-NEXT:    v_perm_b32 v0, 0, s1, 0x10203
475 ; GFX11-NEXT:    s_clause 0x1
476 ; GFX11-NEXT:    buffer_store_b128 v[4:7], off, s[8:11], 0 offset:16
477 ; GFX11-NEXT:    buffer_store_b128 v[0:3], off, s[8:11], 0
478 ; GFX11-NEXT:    s_nop 0
479 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
480 ; GFX11-NEXT:    s_endpgm
481   %val = load <4 x i64>, ptr addrspace(1) %in, align 32
482   %bswap = call <4 x i64> @llvm.bswap.v4i64(<4 x i64> %val) nounwind readnone
483   store <4 x i64> %bswap, ptr addrspace(1) %out, align 32
484   ret void
487 define float @missing_truncate_promote_bswap(i32 %arg) {
488 ; SI-LABEL: missing_truncate_promote_bswap:
489 ; SI:       ; %bb.0: ; %bb
490 ; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
491 ; SI-NEXT:    v_alignbit_b32 v1, v0, v0, 8
492 ; SI-NEXT:    v_alignbit_b32 v0, v0, v0, 24
493 ; SI-NEXT:    s_mov_b32 s4, 0xff00ff
494 ; SI-NEXT:    v_bfi_b32 v0, s4, v0, v1
495 ; SI-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
496 ; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0
497 ; SI-NEXT:    s_setpc_b64 s[30:31]
499 ; VI-LABEL: missing_truncate_promote_bswap:
500 ; VI:       ; %bb.0: ; %bb
501 ; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
502 ; VI-NEXT:    s_mov_b32 s4, 0xc0c0001
503 ; VI-NEXT:    v_perm_b32 v0, 0, v0, s4
504 ; VI-NEXT:    v_cvt_f32_f16_e32 v0, v0
505 ; VI-NEXT:    s_setpc_b64 s[30:31]
507 ; GFX11-LABEL: missing_truncate_promote_bswap:
508 ; GFX11:       ; %bb.0: ; %bb
509 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
510 ; GFX11-NEXT:    v_perm_b32 v0, 0, v0, 0xc0c0001
511 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
512 ; GFX11-NEXT:    v_cvt_f32_f16_e32 v0, v0
513 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
515   %tmp = trunc i32 %arg to i16
516   %tmp1 = call i16 @llvm.bswap.i16(i16 %tmp)
517   %tmp2 = bitcast i16 %tmp1 to half
518   %tmp3 = fpext half %tmp2 to float
519   ret float %tmp3
522 define i16 @v_bswap_i16(i16 %src) {
523 ; SI-LABEL: v_bswap_i16:
524 ; SI:       ; %bb.0:
525 ; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
526 ; SI-NEXT:    v_alignbit_b32 v1, v0, v0, 8
527 ; SI-NEXT:    v_alignbit_b32 v0, v0, v0, 24
528 ; SI-NEXT:    s_mov_b32 s4, 0xff00ff
529 ; SI-NEXT:    v_bfi_b32 v0, s4, v0, v1
530 ; SI-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
531 ; SI-NEXT:    s_setpc_b64 s[30:31]
533 ; VI-LABEL: v_bswap_i16:
534 ; VI:       ; %bb.0:
535 ; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
536 ; VI-NEXT:    s_mov_b32 s4, 0xc0c0001
537 ; VI-NEXT:    v_perm_b32 v0, 0, v0, s4
538 ; VI-NEXT:    s_setpc_b64 s[30:31]
540 ; GFX11-LABEL: v_bswap_i16:
541 ; GFX11:       ; %bb.0:
542 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
543 ; GFX11-NEXT:    v_perm_b32 v0, 0, v0, 0xc0c0001
544 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
545   %bswap = call i16 @llvm.bswap.i16(i16 %src)
546   ret i16 %bswap
549 define i32 @v_bswap_i16_zext_to_i32(i16 %src) {
550 ; SI-LABEL: v_bswap_i16_zext_to_i32:
551 ; SI:       ; %bb.0:
552 ; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
553 ; SI-NEXT:    v_alignbit_b32 v1, v0, v0, 8
554 ; SI-NEXT:    v_alignbit_b32 v0, v0, v0, 24
555 ; SI-NEXT:    s_mov_b32 s4, 0xff00ff
556 ; SI-NEXT:    v_bfi_b32 v0, s4, v0, v1
557 ; SI-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
558 ; SI-NEXT:    s_setpc_b64 s[30:31]
560 ; VI-LABEL: v_bswap_i16_zext_to_i32:
561 ; VI:       ; %bb.0:
562 ; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
563 ; VI-NEXT:    s_mov_b32 s4, 0xc0c0001
564 ; VI-NEXT:    v_perm_b32 v0, 0, v0, s4
565 ; VI-NEXT:    s_setpc_b64 s[30:31]
567 ; GFX11-LABEL: v_bswap_i16_zext_to_i32:
568 ; GFX11:       ; %bb.0:
569 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
570 ; GFX11-NEXT:    v_perm_b32 v0, 0, v0, 0xc0c0001
571 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
572   %bswap = call i16 @llvm.bswap.i16(i16 %src)
573   %zext = zext i16 %bswap to i32
574   ret i32 %zext
577 define i32 @v_bswap_i16_sext_to_i32(i16 %src) {
578 ; SI-LABEL: v_bswap_i16_sext_to_i32:
579 ; SI:       ; %bb.0:
580 ; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
581 ; SI-NEXT:    v_alignbit_b32 v1, v0, v0, 8
582 ; SI-NEXT:    v_alignbit_b32 v0, v0, v0, 24
583 ; SI-NEXT:    s_mov_b32 s4, 0xff00ff
584 ; SI-NEXT:    v_bfi_b32 v0, s4, v0, v1
585 ; SI-NEXT:    v_ashrrev_i32_e32 v0, 16, v0
586 ; SI-NEXT:    s_setpc_b64 s[30:31]
588 ; VI-LABEL: v_bswap_i16_sext_to_i32:
589 ; VI:       ; %bb.0:
590 ; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
591 ; VI-NEXT:    s_mov_b32 s4, 0xc0c0001
592 ; VI-NEXT:    v_perm_b32 v0, 0, v0, s4
593 ; VI-NEXT:    v_bfe_i32 v0, v0, 0, 16
594 ; VI-NEXT:    s_setpc_b64 s[30:31]
596 ; GFX11-LABEL: v_bswap_i16_sext_to_i32:
597 ; GFX11:       ; %bb.0:
598 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
599 ; GFX11-NEXT:    v_perm_b32 v0, 0, v0, 0xc0c0001
600 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
601 ; GFX11-NEXT:    v_bfe_i32 v0, v0, 0, 16
602 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
603   %bswap = call i16 @llvm.bswap.i16(i16 %src)
604   %zext = sext i16 %bswap to i32
605   ret i32 %zext
608 define <2 x i16> @v_bswap_v2i16(<2 x i16> %src) {
609 ; SI-LABEL: v_bswap_v2i16:
610 ; SI:       ; %bb.0:
611 ; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
612 ; SI-NEXT:    v_alignbit_b32 v2, v0, v0, 8
613 ; SI-NEXT:    v_alignbit_b32 v0, v0, v0, 24
614 ; SI-NEXT:    s_mov_b32 s4, 0xff00ff
615 ; SI-NEXT:    v_alignbit_b32 v3, v1, v1, 8
616 ; SI-NEXT:    v_alignbit_b32 v1, v1, v1, 24
617 ; SI-NEXT:    v_bfi_b32 v0, s4, v0, v2
618 ; SI-NEXT:    v_bfi_b32 v1, s4, v1, v3
619 ; SI-NEXT:    v_lshrrev_b32_e32 v1, 16, v1
620 ; SI-NEXT:    v_alignbit_b32 v0, v1, v0, 16
621 ; SI-NEXT:    s_setpc_b64 s[30:31]
623 ; VI-LABEL: v_bswap_v2i16:
624 ; VI:       ; %bb.0:
625 ; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
626 ; VI-NEXT:    s_mov_b32 s4, 0x2030001
627 ; VI-NEXT:    v_perm_b32 v0, 0, v0, s4
628 ; VI-NEXT:    s_setpc_b64 s[30:31]
630 ; GFX11-LABEL: v_bswap_v2i16:
631 ; GFX11:       ; %bb.0:
632 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
633 ; GFX11-NEXT:    v_perm_b32 v0, 0, v0, 0x2030001
634 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
635   %bswap = call <2 x i16> @llvm.bswap.v2i16(<2 x i16> %src)
636   ret <2 x i16> %bswap
639 define <3 x i16> @v_bswap_v3i16(<3 x i16> %src) {
640 ; SI-LABEL: v_bswap_v3i16:
641 ; SI:       ; %bb.0:
642 ; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
643 ; SI-NEXT:    v_alignbit_b32 v3, v0, v0, 8
644 ; SI-NEXT:    v_alignbit_b32 v0, v0, v0, 24
645 ; SI-NEXT:    s_mov_b32 s4, 0xff00ff
646 ; SI-NEXT:    v_alignbit_b32 v4, v1, v1, 8
647 ; SI-NEXT:    v_alignbit_b32 v1, v1, v1, 24
648 ; SI-NEXT:    v_alignbit_b32 v5, v2, v2, 8
649 ; SI-NEXT:    v_alignbit_b32 v2, v2, v2, 24
650 ; SI-NEXT:    v_bfi_b32 v0, s4, v0, v3
651 ; SI-NEXT:    v_bfi_b32 v1, s4, v1, v4
652 ; SI-NEXT:    v_bfi_b32 v2, s4, v2, v5
653 ; SI-NEXT:    v_lshrrev_b32_e32 v1, 16, v1
654 ; SI-NEXT:    v_alignbit_b32 v0, v1, v0, 16
655 ; SI-NEXT:    v_lshrrev_b32_e32 v2, 16, v2
656 ; SI-NEXT:    v_alignbit_b32 v1, v2, v0, 16
657 ; SI-NEXT:    s_setpc_b64 s[30:31]
659 ; VI-LABEL: v_bswap_v3i16:
660 ; VI:       ; %bb.0:
661 ; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
662 ; VI-NEXT:    s_mov_b32 s4, 0x2030001
663 ; VI-NEXT:    v_perm_b32 v0, 0, v0, s4
664 ; VI-NEXT:    v_perm_b32 v1, 0, v1, s4
665 ; VI-NEXT:    s_setpc_b64 s[30:31]
667 ; GFX11-LABEL: v_bswap_v3i16:
668 ; GFX11:       ; %bb.0:
669 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
670 ; GFX11-NEXT:    v_perm_b32 v0, 0, v0, 0x2030001
671 ; GFX11-NEXT:    v_perm_b32 v1, 0, v1, 0x2030001
672 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
673   %bswap = call <3 x i16> @llvm.bswap.v3i16(<3 x i16> %src)
674   ret <3 x i16> %bswap
677 define <4 x i16> @v_bswap_v4i16(<4 x i16> %src) {
678 ; SI-LABEL: v_bswap_v4i16:
679 ; SI:       ; %bb.0:
680 ; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
681 ; SI-NEXT:    v_alignbit_b32 v4, v2, v2, 8
682 ; SI-NEXT:    v_alignbit_b32 v2, v2, v2, 24
683 ; SI-NEXT:    s_mov_b32 s4, 0xff00ff
684 ; SI-NEXT:    v_alignbit_b32 v5, v3, v3, 8
685 ; SI-NEXT:    v_alignbit_b32 v3, v3, v3, 24
686 ; SI-NEXT:    v_alignbit_b32 v6, v0, v0, 8
687 ; SI-NEXT:    v_alignbit_b32 v0, v0, v0, 24
688 ; SI-NEXT:    v_alignbit_b32 v7, v1, v1, 8
689 ; SI-NEXT:    v_alignbit_b32 v1, v1, v1, 24
690 ; SI-NEXT:    v_bfi_b32 v2, s4, v2, v4
691 ; SI-NEXT:    v_bfi_b32 v3, s4, v3, v5
692 ; SI-NEXT:    v_bfi_b32 v0, s4, v0, v6
693 ; SI-NEXT:    v_bfi_b32 v1, s4, v1, v7
694 ; SI-NEXT:    v_lshrrev_b32_e32 v3, 16, v3
695 ; SI-NEXT:    v_lshrrev_b32_e32 v1, 16, v1
696 ; SI-NEXT:    v_alignbit_b32 v2, v3, v2, 16
697 ; SI-NEXT:    v_alignbit_b32 v0, v1, v0, 16
698 ; SI-NEXT:    v_alignbit_b32 v1, v2, v0, 16
699 ; SI-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
700 ; SI-NEXT:    s_setpc_b64 s[30:31]
702 ; VI-LABEL: v_bswap_v4i16:
703 ; VI:       ; %bb.0:
704 ; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
705 ; VI-NEXT:    s_mov_b32 s4, 0x2030001
706 ; VI-NEXT:    v_perm_b32 v0, 0, v0, s4
707 ; VI-NEXT:    v_perm_b32 v1, 0, v1, s4
708 ; VI-NEXT:    s_setpc_b64 s[30:31]
710 ; GFX11-LABEL: v_bswap_v4i16:
711 ; GFX11:       ; %bb.0:
712 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
713 ; GFX11-NEXT:    v_perm_b32 v0, 0, v0, 0x2030001
714 ; GFX11-NEXT:    v_perm_b32 v1, 0, v1, 0x2030001
715 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
716   %bswap = call <4 x i16> @llvm.bswap.v4i16(<4 x i16> %src)
717   ret <4 x i16> %bswap
720 define i64 @v_bswap_i48(i64 %src) {
721 ; SI-LABEL: v_bswap_i48:
722 ; SI:       ; %bb.0:
723 ; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
724 ; SI-NEXT:    v_alignbit_b32 v2, v0, v0, 8
725 ; SI-NEXT:    v_alignbit_b32 v0, v0, v0, 24
726 ; SI-NEXT:    s_mov_b32 s4, 0xff00ff
727 ; SI-NEXT:    v_alignbit_b32 v3, v1, v1, 8
728 ; SI-NEXT:    v_alignbit_b32 v1, v1, v1, 24
729 ; SI-NEXT:    v_bfi_b32 v2, s4, v0, v2
730 ; SI-NEXT:    v_bfi_b32 v0, s4, v1, v3
731 ; SI-NEXT:    v_alignbit_b32 v0, v2, v0, 16
732 ; SI-NEXT:    v_lshrrev_b32_e32 v1, 16, v2
733 ; SI-NEXT:    s_setpc_b64 s[30:31]
735 ; VI-LABEL: v_bswap_i48:
736 ; VI:       ; %bb.0:
737 ; VI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
738 ; VI-NEXT:    s_mov_b32 s4, 0x10203
739 ; VI-NEXT:    v_perm_b32 v2, 0, v0, s4
740 ; VI-NEXT:    v_perm_b32 v0, 0, v1, s4
741 ; VI-NEXT:    v_alignbit_b32 v0, v2, v0, 16
742 ; VI-NEXT:    v_lshrrev_b32_e32 v1, 16, v2
743 ; VI-NEXT:    s_setpc_b64 s[30:31]
745 ; GFX11-LABEL: v_bswap_i48:
746 ; GFX11:       ; %bb.0:
747 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
748 ; GFX11-NEXT:    v_perm_b32 v2, 0, v0, 0x10203
749 ; GFX11-NEXT:    v_perm_b32 v0, 0, v1, 0x10203
750 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
751 ; GFX11-NEXT:    v_lshrrev_b32_e32 v1, 16, v2
752 ; GFX11-NEXT:    v_alignbit_b32 v0, v2, v0, 16
753 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
754   %trunc = trunc i64 %src to i48
755   %bswap = call i48 @llvm.bswap.i48(i48 %trunc)
756   %zext = zext i48 %bswap to i64
757   ret i64 %zext