[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / llvm.amdgcn.permlane.ll
bloba31a5c9a30f359c09b23d87cdd1826dc5d9fdd16
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -global-isel=0 -amdgpu-load-store-vectorizer=0 -march=amdgcn -mcpu=gfx1010 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX10,GFX10-SDAG %s
3 ; RUN: llc -global-isel=1 -amdgpu-load-store-vectorizer=0 -march=amdgcn -mcpu=gfx1010 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX10,GFX10-GISEL %s
4 ; RUN: llc -global-isel=0 -amdgpu-load-store-vectorizer=0 -march=amdgcn -mcpu=gfx1100 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX11,GFX11-SDAG %s
5 ; RUN: llc -global-isel=1 -amdgpu-load-store-vectorizer=0 -march=amdgcn -mcpu=gfx1100 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX11,GFX11-GISEL %s
7 declare i32 @llvm.amdgcn.permlane16(i32, i32, i32, i32, i1, i1)
8 declare i32 @llvm.amdgcn.permlanex16(i32, i32, i32, i32, i1, i1)
9 declare i32 @llvm.amdgcn.workitem.id.x()
10 declare i32 @llvm.amdgcn.workitem.id.y()
12 define amdgpu_kernel void @v_permlane16_b32_vss(ptr addrspace(1) %out, i32 %src0, i32 %src1, i32 %src2) {
13 ; GFX10-LABEL: v_permlane16_b32_vss:
14 ; GFX10:       ; %bb.0:
15 ; GFX10-NEXT:    s_clause 0x1
16 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
17 ; GFX10-NEXT:    s_load_dword s2, s[0:1], 0x34
18 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
19 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
20 ; GFX10-NEXT:    v_mov_b32_e32 v0, s6
21 ; GFX10-NEXT:    v_permlane16_b32 v0, v0, s7, s2
22 ; GFX10-NEXT:    global_store_dword v1, v0, s[4:5]
23 ; GFX10-NEXT:    s_endpgm
25 ; GFX11-LABEL: v_permlane16_b32_vss:
26 ; GFX11:       ; %bb.0:
27 ; GFX11-NEXT:    s_clause 0x1
28 ; GFX11-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
29 ; GFX11-NEXT:    s_load_b32 s0, s[0:1], 0x34
30 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
31 ; GFX11-NEXT:    v_dual_mov_b32 v1, 0 :: v_dual_mov_b32 v0, s6
32 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
33 ; GFX11-NEXT:    v_permlane16_b32 v0, v0, s7, s0
34 ; GFX11-NEXT:    global_store_b32 v1, v0, s[4:5]
35 ; GFX11-NEXT:    s_nop 0
36 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
37 ; GFX11-NEXT:    s_endpgm
38   %v = call i32 @llvm.amdgcn.permlane16(i32 %src0, i32 %src0, i32 %src1, i32 %src2, i1 false, i1 false)
39   store i32 %v, ptr addrspace(1) %out
40   ret void
43 define amdgpu_kernel void @v_permlane16_b32_vii(ptr addrspace(1) %out, i32 %src0) {
44 ; GFX10-LABEL: v_permlane16_b32_vii:
45 ; GFX10:       ; %bb.0:
46 ; GFX10-NEXT:    s_clause 0x1
47 ; GFX10-NEXT:    s_load_dword s4, s[0:1], 0x2c
48 ; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
49 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
50 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
51 ; GFX10-NEXT:    v_mov_b32_e32 v0, s4
52 ; GFX10-NEXT:    v_permlane16_b32 v0, v0, 1, 2
53 ; GFX10-NEXT:    global_store_dword v1, v0, s[2:3]
54 ; GFX10-NEXT:    s_endpgm
56 ; GFX11-LABEL: v_permlane16_b32_vii:
57 ; GFX11:       ; %bb.0:
58 ; GFX11-NEXT:    s_clause 0x1
59 ; GFX11-NEXT:    s_load_b32 s2, s[0:1], 0x2c
60 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
61 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
62 ; GFX11-NEXT:    v_dual_mov_b32 v1, 0 :: v_dual_mov_b32 v0, s2
63 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
64 ; GFX11-NEXT:    v_permlane16_b32 v0, v0, 1, 2
65 ; GFX11-NEXT:    global_store_b32 v1, v0, s[0:1]
66 ; GFX11-NEXT:    s_nop 0
67 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
68 ; GFX11-NEXT:    s_endpgm
69   %v = call i32 @llvm.amdgcn.permlane16(i32 %src0, i32 %src0, i32 1, i32 2, i1 false, i1 false)
70   store i32 %v, ptr addrspace(1) %out
71   ret void
74 ; FIXME-GFX10PLUS: It is allowed to have both immediates as literals
75 define amdgpu_kernel void @v_permlane16_b32_vll(ptr addrspace(1) %out, i32 %src0) {
76 ; GFX10-LABEL: v_permlane16_b32_vll:
77 ; GFX10:       ; %bb.0:
78 ; GFX10-NEXT:    s_clause 0x1
79 ; GFX10-NEXT:    s_load_dword s4, s[0:1], 0x2c
80 ; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
81 ; GFX10-NEXT:    s_movk_i32 s0, 0x1234
82 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
83 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
84 ; GFX10-NEXT:    v_mov_b32_e32 v0, s4
85 ; GFX10-NEXT:    v_permlane16_b32 v0, v0, s0, 0xc1d1
86 ; GFX10-NEXT:    global_store_dword v1, v0, s[2:3]
87 ; GFX10-NEXT:    s_endpgm
89 ; GFX11-LABEL: v_permlane16_b32_vll:
90 ; GFX11:       ; %bb.0:
91 ; GFX11-NEXT:    s_clause 0x1
92 ; GFX11-NEXT:    s_load_b32 s2, s[0:1], 0x2c
93 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
94 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
95 ; GFX11-NEXT:    v_dual_mov_b32 v1, 0 :: v_dual_mov_b32 v0, s2
96 ; GFX11-NEXT:    s_movk_i32 s2, 0x1234
97 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instid1(SALU_CYCLE_1)
98 ; GFX11-NEXT:    v_permlane16_b32 v0, v0, s2, 0xc1d1
99 ; GFX11-NEXT:    global_store_b32 v1, v0, s[0:1]
100 ; GFX11-NEXT:    s_nop 0
101 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
102 ; GFX11-NEXT:    s_endpgm
103   %v = call i32 @llvm.amdgcn.permlane16(i32 %src0, i32 %src0, i32 4660, i32 49617, i1 false, i1 false)
104   store i32 %v, ptr addrspace(1) %out
105   ret void
108 define amdgpu_kernel void @v_permlane16_b32_vvv(ptr addrspace(1) %out, i32 %src0) {
109 ; GFX10-LABEL: v_permlane16_b32_vvv:
110 ; GFX10:       ; %bb.0:
111 ; GFX10-NEXT:    s_clause 0x1
112 ; GFX10-NEXT:    s_load_dword s4, s[0:1], 0x2c
113 ; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
114 ; GFX10-NEXT:    s_mov_b32 null, 0
115 ; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
116 ; GFX10-NEXT:    v_readfirstlane_b32 s1, v1
117 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
118 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
119 ; GFX10-NEXT:    v_mov_b32_e32 v0, s4
120 ; GFX10-NEXT:    v_permlane16_b32 v0, v0, s0, s1
121 ; GFX10-NEXT:    global_store_dword v1, v0, s[2:3]
122 ; GFX10-NEXT:    s_endpgm
124 ; GFX11-SDAG-LABEL: v_permlane16_b32_vvv:
125 ; GFX11-SDAG:       ; %bb.0:
126 ; GFX11-SDAG-NEXT:    s_clause 0x1
127 ; GFX11-SDAG-NEXT:    s_load_b32 s2, s[0:1], 0x2c
128 ; GFX11-SDAG-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
129 ; GFX11-SDAG-NEXT:    v_and_b32_e32 v1, 0x3ff, v0
130 ; GFX11-SDAG-NEXT:    v_bfe_u32 v0, v0, 10, 10
131 ; GFX11-SDAG-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_3)
132 ; GFX11-SDAG-NEXT:    v_readfirstlane_b32 s3, v1
133 ; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
134 ; GFX11-SDAG-NEXT:    v_mov_b32_e32 v1, s2
135 ; GFX11-SDAG-NEXT:    v_readfirstlane_b32 s2, v0
136 ; GFX11-SDAG-NEXT:    v_mov_b32_e32 v0, 0
137 ; GFX11-SDAG-NEXT:    s_delay_alu instid0(VALU_DEP_2)
138 ; GFX11-SDAG-NEXT:    v_permlane16_b32 v1, v1, s3, s2
139 ; GFX11-SDAG-NEXT:    global_store_b32 v0, v1, s[0:1]
140 ; GFX11-SDAG-NEXT:    s_nop 0
141 ; GFX11-SDAG-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
142 ; GFX11-SDAG-NEXT:    s_endpgm
144 ; GFX11-GISEL-LABEL: v_permlane16_b32_vvv:
145 ; GFX11-GISEL:       ; %bb.0:
146 ; GFX11-GISEL-NEXT:    s_clause 0x1
147 ; GFX11-GISEL-NEXT:    s_load_b32 s2, s[0:1], 0x2c
148 ; GFX11-GISEL-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
149 ; GFX11-GISEL-NEXT:    v_and_b32_e32 v1, 0x3ff, v0
150 ; GFX11-GISEL-NEXT:    v_bfe_u32 v0, v0, 10, 10
151 ; GFX11-GISEL-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_2)
152 ; GFX11-GISEL-NEXT:    v_readfirstlane_b32 s4, v0
153 ; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
154 ; GFX11-GISEL-NEXT:    v_mov_b32_e32 v0, s2
155 ; GFX11-GISEL-NEXT:    v_readfirstlane_b32 s3, v1
156 ; GFX11-GISEL-NEXT:    v_mov_b32_e32 v1, 0
157 ; GFX11-GISEL-NEXT:    v_permlane16_b32 v0, v0, s3, s4
158 ; GFX11-GISEL-NEXT:    global_store_b32 v1, v0, s[0:1]
159 ; GFX11-GISEL-NEXT:    s_nop 0
160 ; GFX11-GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
161 ; GFX11-GISEL-NEXT:    s_endpgm
162   %tidx = call i32 @llvm.amdgcn.workitem.id.x()
163   %tidy = call i32 @llvm.amdgcn.workitem.id.y()
164   %v = call i32 @llvm.amdgcn.permlane16(i32 %src0, i32 %src0, i32 %tidx, i32 %tidy, i1 false, i1 false)
165   store i32 %v, ptr addrspace(1) %out
166   ret void
169 define amdgpu_kernel void @v_permlane16_b32_vvs(ptr addrspace(1) %out, i32 %src0, i32 %src2) {
170 ; GFX10-SDAG-LABEL: v_permlane16_b32_vvs:
171 ; GFX10-SDAG:       ; %bb.0:
172 ; GFX10-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
173 ; GFX10-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
174 ; GFX10-SDAG-NEXT:    v_mov_b32_e32 v1, s2
175 ; GFX10-SDAG-NEXT:    v_readfirstlane_b32 s2, v0
176 ; GFX10-SDAG-NEXT:    v_mov_b32_e32 v0, 0
177 ; GFX10-SDAG-NEXT:    v_permlane16_b32 v1, v1, s2, s3
178 ; GFX10-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
179 ; GFX10-SDAG-NEXT:    s_endpgm
181 ; GFX10-GISEL-LABEL: v_permlane16_b32_vvs:
182 ; GFX10-GISEL:       ; %bb.0:
183 ; GFX10-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
184 ; GFX10-GISEL-NEXT:    v_readfirstlane_b32 s4, v0
185 ; GFX10-GISEL-NEXT:    v_mov_b32_e32 v1, 0
186 ; GFX10-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
187 ; GFX10-GISEL-NEXT:    v_mov_b32_e32 v0, s2
188 ; GFX10-GISEL-NEXT:    v_permlane16_b32 v0, v0, s4, s3
189 ; GFX10-GISEL-NEXT:    global_store_dword v1, v0, s[0:1]
190 ; GFX10-GISEL-NEXT:    s_endpgm
192 ; GFX11-SDAG-LABEL: v_permlane16_b32_vvs:
193 ; GFX11-SDAG:       ; %bb.0:
194 ; GFX11-SDAG-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
195 ; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
196 ; GFX11-SDAG-NEXT:    v_mov_b32_e32 v1, s2
197 ; GFX11-SDAG-NEXT:    v_readfirstlane_b32 s2, v0
198 ; GFX11-SDAG-NEXT:    v_mov_b32_e32 v0, 0
199 ; GFX11-SDAG-NEXT:    s_delay_alu instid0(VALU_DEP_2)
200 ; GFX11-SDAG-NEXT:    v_permlane16_b32 v1, v1, s2, s3
201 ; GFX11-SDAG-NEXT:    global_store_b32 v0, v1, s[0:1]
202 ; GFX11-SDAG-NEXT:    s_nop 0
203 ; GFX11-SDAG-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
204 ; GFX11-SDAG-NEXT:    s_endpgm
206 ; GFX11-GISEL-LABEL: v_permlane16_b32_vvs:
207 ; GFX11-GISEL:       ; %bb.0:
208 ; GFX11-GISEL-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
209 ; GFX11-GISEL-NEXT:    v_readfirstlane_b32 s4, v0
210 ; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
211 ; GFX11-GISEL-NEXT:    v_dual_mov_b32 v1, 0 :: v_dual_mov_b32 v0, s2
212 ; GFX11-GISEL-NEXT:    s_delay_alu instid0(VALU_DEP_1)
213 ; GFX11-GISEL-NEXT:    v_permlane16_b32 v0, v0, s4, s3
214 ; GFX11-GISEL-NEXT:    global_store_b32 v1, v0, s[0:1]
215 ; GFX11-GISEL-NEXT:    s_nop 0
216 ; GFX11-GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
217 ; GFX11-GISEL-NEXT:    s_endpgm
218   %tidx = call i32 @llvm.amdgcn.workitem.id.x()
219   %v = call i32 @llvm.amdgcn.permlane16(i32 %src0, i32 %src0, i32 %tidx, i32 %src2, i1 false, i1 false)
220   store i32 %v, ptr addrspace(1) %out
221   ret void
224 define amdgpu_kernel void @v_permlane16_b32_vsv(ptr addrspace(1) %out, i32 %src0, i32 %src1) {
225 ; GFX10-SDAG-LABEL: v_permlane16_b32_vsv:
226 ; GFX10-SDAG:       ; %bb.0:
227 ; GFX10-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
228 ; GFX10-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
229 ; GFX10-SDAG-NEXT:    v_mov_b32_e32 v0, s2
230 ; GFX10-SDAG-NEXT:    v_readfirstlane_b32 s2, v1
231 ; GFX10-SDAG-NEXT:    v_mov_b32_e32 v1, 0
232 ; GFX10-SDAG-NEXT:    v_permlane16_b32 v0, v0, s3, s2
233 ; GFX10-SDAG-NEXT:    global_store_dword v1, v0, s[0:1]
234 ; GFX10-SDAG-NEXT:    s_endpgm
236 ; GFX10-GISEL-LABEL: v_permlane16_b32_vsv:
237 ; GFX10-GISEL:       ; %bb.0:
238 ; GFX10-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
239 ; GFX10-GISEL-NEXT:    v_readfirstlane_b32 s4, v1
240 ; GFX10-GISEL-NEXT:    v_mov_b32_e32 v1, 0
241 ; GFX10-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
242 ; GFX10-GISEL-NEXT:    v_mov_b32_e32 v0, s2
243 ; GFX10-GISEL-NEXT:    v_permlane16_b32 v0, v0, s3, s4
244 ; GFX10-GISEL-NEXT:    global_store_dword v1, v0, s[0:1]
245 ; GFX10-GISEL-NEXT:    s_endpgm
247 ; GFX11-SDAG-LABEL: v_permlane16_b32_vsv:
248 ; GFX11-SDAG:       ; %bb.0:
249 ; GFX11-SDAG-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
250 ; GFX11-SDAG-NEXT:    v_bfe_u32 v0, v0, 10, 10
251 ; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
252 ; GFX11-SDAG-NEXT:    v_mov_b32_e32 v1, s2
253 ; GFX11-SDAG-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
254 ; GFX11-SDAG-NEXT:    v_readfirstlane_b32 s2, v0
255 ; GFX11-SDAG-NEXT:    v_mov_b32_e32 v0, 0
256 ; GFX11-SDAG-NEXT:    v_permlane16_b32 v1, v1, s3, s2
257 ; GFX11-SDAG-NEXT:    global_store_b32 v0, v1, s[0:1]
258 ; GFX11-SDAG-NEXT:    s_nop 0
259 ; GFX11-SDAG-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
260 ; GFX11-SDAG-NEXT:    s_endpgm
262 ; GFX11-GISEL-LABEL: v_permlane16_b32_vsv:
263 ; GFX11-GISEL:       ; %bb.0:
264 ; GFX11-GISEL-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
265 ; GFX11-GISEL-NEXT:    v_bfe_u32 v0, v0, 10, 10
266 ; GFX11-GISEL-NEXT:    v_mov_b32_e32 v1, 0
267 ; GFX11-GISEL-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_1)
268 ; GFX11-GISEL-NEXT:    v_readfirstlane_b32 s4, v0
269 ; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
270 ; GFX11-GISEL-NEXT:    v_mov_b32_e32 v0, s2
271 ; GFX11-GISEL-NEXT:    v_permlane16_b32 v0, v0, s3, s4
272 ; GFX11-GISEL-NEXT:    global_store_b32 v1, v0, s[0:1]
273 ; GFX11-GISEL-NEXT:    s_nop 0
274 ; GFX11-GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
275 ; GFX11-GISEL-NEXT:    s_endpgm
276   %tidy = call i32 @llvm.amdgcn.workitem.id.y()
277   %v = call i32 @llvm.amdgcn.permlane16(i32 %src0, i32 %src0, i32 %src1, i32 %tidy, i1 false, i1 false)
278   store i32 %v, ptr addrspace(1) %out
279   ret void
282 define amdgpu_kernel void @v_permlane16_b32_vss_fi(ptr addrspace(1) %out, i32 %src0, i32 %src1, i32 %src2) {
283 ; GFX10-LABEL: v_permlane16_b32_vss_fi:
284 ; GFX10:       ; %bb.0:
285 ; GFX10-NEXT:    s_clause 0x1
286 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
287 ; GFX10-NEXT:    s_load_dword s2, s[0:1], 0x34
288 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
289 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
290 ; GFX10-NEXT:    v_mov_b32_e32 v0, s6
291 ; GFX10-NEXT:    v_permlane16_b32 v0, v0, s7, s2 op_sel:[1,0]
292 ; GFX10-NEXT:    global_store_dword v1, v0, s[4:5]
293 ; GFX10-NEXT:    s_endpgm
295 ; GFX11-LABEL: v_permlane16_b32_vss_fi:
296 ; GFX11:       ; %bb.0:
297 ; GFX11-NEXT:    s_clause 0x1
298 ; GFX11-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
299 ; GFX11-NEXT:    s_load_b32 s0, s[0:1], 0x34
300 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
301 ; GFX11-NEXT:    v_dual_mov_b32 v1, 0 :: v_dual_mov_b32 v0, s6
302 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
303 ; GFX11-NEXT:    v_permlane16_b32 v0, v0, s7, s0 op_sel:[1,0]
304 ; GFX11-NEXT:    global_store_b32 v1, v0, s[4:5]
305 ; GFX11-NEXT:    s_nop 0
306 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
307 ; GFX11-NEXT:    s_endpgm
308   %v = call i32 @llvm.amdgcn.permlane16(i32 %src0, i32 %src0, i32 %src1, i32 %src2, i1 true, i1 false)
309   store i32 %v, ptr addrspace(1) %out
310   ret void
313 define amdgpu_kernel void @v_permlane16_b32_vss_bc(ptr addrspace(1) %out, i32 %src0, i32 %src1, i32 %src2) {
314 ; GFX10-LABEL: v_permlane16_b32_vss_bc:
315 ; GFX10:       ; %bb.0:
316 ; GFX10-NEXT:    s_clause 0x1
317 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
318 ; GFX10-NEXT:    s_load_dword s2, s[0:1], 0x34
319 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
320 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
321 ; GFX10-NEXT:    v_mov_b32_e32 v0, s6
322 ; GFX10-NEXT:    v_permlane16_b32 v0, v0, s7, s2 op_sel:[0,1]
323 ; GFX10-NEXT:    global_store_dword v1, v0, s[4:5]
324 ; GFX10-NEXT:    s_endpgm
326 ; GFX11-LABEL: v_permlane16_b32_vss_bc:
327 ; GFX11:       ; %bb.0:
328 ; GFX11-NEXT:    s_clause 0x1
329 ; GFX11-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
330 ; GFX11-NEXT:    s_load_b32 s0, s[0:1], 0x34
331 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
332 ; GFX11-NEXT:    v_dual_mov_b32 v1, 0 :: v_dual_mov_b32 v0, s6
333 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
334 ; GFX11-NEXT:    v_permlane16_b32 v0, v0, s7, s0 op_sel:[0,1]
335 ; GFX11-NEXT:    global_store_b32 v1, v0, s[4:5]
336 ; GFX11-NEXT:    s_nop 0
337 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
338 ; GFX11-NEXT:    s_endpgm
339   %v = call i32 @llvm.amdgcn.permlane16(i32 %src0, i32 %src0, i32 %src1, i32 %src2, i1 false, i1 true)
340   store i32 %v, ptr addrspace(1) %out
341   ret void
344 define amdgpu_kernel void @v_permlane16_b32_vss_fi_bc(ptr addrspace(1) %out, i32 %src0, i32 %src1, i32 %src2) {
345 ; GFX10-LABEL: v_permlane16_b32_vss_fi_bc:
346 ; GFX10:       ; %bb.0:
347 ; GFX10-NEXT:    s_clause 0x1
348 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
349 ; GFX10-NEXT:    s_load_dword s2, s[0:1], 0x34
350 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
351 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
352 ; GFX10-NEXT:    v_mov_b32_e32 v0, s6
353 ; GFX10-NEXT:    v_permlane16_b32 v0, v0, s7, s2 op_sel:[1,1]
354 ; GFX10-NEXT:    global_store_dword v1, v0, s[4:5]
355 ; GFX10-NEXT:    s_endpgm
357 ; GFX11-LABEL: v_permlane16_b32_vss_fi_bc:
358 ; GFX11:       ; %bb.0:
359 ; GFX11-NEXT:    s_clause 0x1
360 ; GFX11-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
361 ; GFX11-NEXT:    s_load_b32 s0, s[0:1], 0x34
362 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
363 ; GFX11-NEXT:    v_dual_mov_b32 v1, 0 :: v_dual_mov_b32 v0, s6
364 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
365 ; GFX11-NEXT:    v_permlane16_b32 v0, v0, s7, s0 op_sel:[1,1]
366 ; GFX11-NEXT:    global_store_b32 v1, v0, s[4:5]
367 ; GFX11-NEXT:    s_nop 0
368 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
369 ; GFX11-NEXT:    s_endpgm
370   %v = call i32 @llvm.amdgcn.permlane16(i32 %src0, i32 %src0, i32 %src1, i32 %src2, i1 true, i1 true)
371   store i32 %v, ptr addrspace(1) %out
372   ret void
375 define amdgpu_kernel void @v_permlanex16_b32_vss(ptr addrspace(1) %out, i32 %src0, i32 %src1, i32 %src2) {
376 ; GFX10-LABEL: v_permlanex16_b32_vss:
377 ; GFX10:       ; %bb.0:
378 ; GFX10-NEXT:    s_clause 0x1
379 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
380 ; GFX10-NEXT:    s_load_dword s2, s[0:1], 0x34
381 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
382 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
383 ; GFX10-NEXT:    v_mov_b32_e32 v0, s6
384 ; GFX10-NEXT:    v_permlanex16_b32 v0, v0, s7, s2
385 ; GFX10-NEXT:    global_store_dword v1, v0, s[4:5]
386 ; GFX10-NEXT:    s_endpgm
388 ; GFX11-LABEL: v_permlanex16_b32_vss:
389 ; GFX11:       ; %bb.0:
390 ; GFX11-NEXT:    s_clause 0x1
391 ; GFX11-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
392 ; GFX11-NEXT:    s_load_b32 s0, s[0:1], 0x34
393 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
394 ; GFX11-NEXT:    v_dual_mov_b32 v1, 0 :: v_dual_mov_b32 v0, s6
395 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
396 ; GFX11-NEXT:    v_permlanex16_b32 v0, v0, s7, s0
397 ; GFX11-NEXT:    global_store_b32 v1, v0, s[4:5]
398 ; GFX11-NEXT:    s_nop 0
399 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
400 ; GFX11-NEXT:    s_endpgm
401   %v = call i32 @llvm.amdgcn.permlanex16(i32 %src0, i32 %src0, i32 %src1, i32 %src2, i1 false, i1 false)
402   store i32 %v, ptr addrspace(1) %out
403   ret void
406 define amdgpu_kernel void @v_permlanex16_b32_vii(ptr addrspace(1) %out, i32 %src0) {
407 ; GFX10-LABEL: v_permlanex16_b32_vii:
408 ; GFX10:       ; %bb.0:
409 ; GFX10-NEXT:    s_clause 0x1
410 ; GFX10-NEXT:    s_load_dword s4, s[0:1], 0x2c
411 ; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
412 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
413 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
414 ; GFX10-NEXT:    v_mov_b32_e32 v0, s4
415 ; GFX10-NEXT:    v_permlanex16_b32 v0, v0, 1, 2
416 ; GFX10-NEXT:    global_store_dword v1, v0, s[2:3]
417 ; GFX10-NEXT:    s_endpgm
419 ; GFX11-LABEL: v_permlanex16_b32_vii:
420 ; GFX11:       ; %bb.0:
421 ; GFX11-NEXT:    s_clause 0x1
422 ; GFX11-NEXT:    s_load_b32 s2, s[0:1], 0x2c
423 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
424 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
425 ; GFX11-NEXT:    v_dual_mov_b32 v1, 0 :: v_dual_mov_b32 v0, s2
426 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
427 ; GFX11-NEXT:    v_permlanex16_b32 v0, v0, 1, 2
428 ; GFX11-NEXT:    global_store_b32 v1, v0, s[0:1]
429 ; GFX11-NEXT:    s_nop 0
430 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
431 ; GFX11-NEXT:    s_endpgm
432   %v = call i32 @llvm.amdgcn.permlanex16(i32 %src0, i32 %src0, i32 1, i32 2, i1 false, i1 false)
433   store i32 %v, ptr addrspace(1) %out
434   ret void
437 ; FIXME-GFX10PLUS: It is allowed to have both immediates as literals
438 define amdgpu_kernel void @v_permlanex16_b32_vll(ptr addrspace(1) %out, i32 %src0) {
439 ; GFX10-LABEL: v_permlanex16_b32_vll:
440 ; GFX10:       ; %bb.0:
441 ; GFX10-NEXT:    s_clause 0x1
442 ; GFX10-NEXT:    s_load_dword s4, s[0:1], 0x2c
443 ; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
444 ; GFX10-NEXT:    s_movk_i32 s0, 0x1234
445 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
446 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
447 ; GFX10-NEXT:    v_mov_b32_e32 v0, s4
448 ; GFX10-NEXT:    v_permlanex16_b32 v0, v0, s0, 0xc1d1
449 ; GFX10-NEXT:    global_store_dword v1, v0, s[2:3]
450 ; GFX10-NEXT:    s_endpgm
452 ; GFX11-LABEL: v_permlanex16_b32_vll:
453 ; GFX11:       ; %bb.0:
454 ; GFX11-NEXT:    s_clause 0x1
455 ; GFX11-NEXT:    s_load_b32 s2, s[0:1], 0x2c
456 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
457 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
458 ; GFX11-NEXT:    v_dual_mov_b32 v1, 0 :: v_dual_mov_b32 v0, s2
459 ; GFX11-NEXT:    s_movk_i32 s2, 0x1234
460 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instid1(SALU_CYCLE_1)
461 ; GFX11-NEXT:    v_permlanex16_b32 v0, v0, s2, 0xc1d1
462 ; GFX11-NEXT:    global_store_b32 v1, v0, s[0:1]
463 ; GFX11-NEXT:    s_nop 0
464 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
465 ; GFX11-NEXT:    s_endpgm
466   %v = call i32 @llvm.amdgcn.permlanex16(i32 %src0, i32 %src0, i32 4660, i32 49617, i1 false, i1 false)
467   store i32 %v, ptr addrspace(1) %out
468   ret void
471 define amdgpu_kernel void @v_permlanex16_b32_vvv(ptr addrspace(1) %out, i32 %src0) {
472 ; GFX10-LABEL: v_permlanex16_b32_vvv:
473 ; GFX10:       ; %bb.0:
474 ; GFX10-NEXT:    s_clause 0x1
475 ; GFX10-NEXT:    s_load_dword s4, s[0:1], 0x2c
476 ; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
477 ; GFX10-NEXT:    s_mov_b32 null, 0
478 ; GFX10-NEXT:    v_readfirstlane_b32 s0, v0
479 ; GFX10-NEXT:    v_readfirstlane_b32 s1, v1
480 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
481 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
482 ; GFX10-NEXT:    v_mov_b32_e32 v0, s4
483 ; GFX10-NEXT:    v_permlanex16_b32 v0, v0, s0, s1
484 ; GFX10-NEXT:    global_store_dword v1, v0, s[2:3]
485 ; GFX10-NEXT:    s_endpgm
487 ; GFX11-SDAG-LABEL: v_permlanex16_b32_vvv:
488 ; GFX11-SDAG:       ; %bb.0:
489 ; GFX11-SDAG-NEXT:    s_clause 0x1
490 ; GFX11-SDAG-NEXT:    s_load_b32 s2, s[0:1], 0x2c
491 ; GFX11-SDAG-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
492 ; GFX11-SDAG-NEXT:    v_and_b32_e32 v1, 0x3ff, v0
493 ; GFX11-SDAG-NEXT:    v_bfe_u32 v0, v0, 10, 10
494 ; GFX11-SDAG-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_3)
495 ; GFX11-SDAG-NEXT:    v_readfirstlane_b32 s3, v1
496 ; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
497 ; GFX11-SDAG-NEXT:    v_mov_b32_e32 v1, s2
498 ; GFX11-SDAG-NEXT:    v_readfirstlane_b32 s2, v0
499 ; GFX11-SDAG-NEXT:    v_mov_b32_e32 v0, 0
500 ; GFX11-SDAG-NEXT:    s_delay_alu instid0(VALU_DEP_2)
501 ; GFX11-SDAG-NEXT:    v_permlanex16_b32 v1, v1, s3, s2
502 ; GFX11-SDAG-NEXT:    global_store_b32 v0, v1, s[0:1]
503 ; GFX11-SDAG-NEXT:    s_nop 0
504 ; GFX11-SDAG-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
505 ; GFX11-SDAG-NEXT:    s_endpgm
507 ; GFX11-GISEL-LABEL: v_permlanex16_b32_vvv:
508 ; GFX11-GISEL:       ; %bb.0:
509 ; GFX11-GISEL-NEXT:    s_clause 0x1
510 ; GFX11-GISEL-NEXT:    s_load_b32 s2, s[0:1], 0x2c
511 ; GFX11-GISEL-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
512 ; GFX11-GISEL-NEXT:    v_and_b32_e32 v1, 0x3ff, v0
513 ; GFX11-GISEL-NEXT:    v_bfe_u32 v0, v0, 10, 10
514 ; GFX11-GISEL-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_2)
515 ; GFX11-GISEL-NEXT:    v_readfirstlane_b32 s4, v0
516 ; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
517 ; GFX11-GISEL-NEXT:    v_mov_b32_e32 v0, s2
518 ; GFX11-GISEL-NEXT:    v_readfirstlane_b32 s3, v1
519 ; GFX11-GISEL-NEXT:    v_mov_b32_e32 v1, 0
520 ; GFX11-GISEL-NEXT:    v_permlanex16_b32 v0, v0, s3, s4
521 ; GFX11-GISEL-NEXT:    global_store_b32 v1, v0, s[0:1]
522 ; GFX11-GISEL-NEXT:    s_nop 0
523 ; GFX11-GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
524 ; GFX11-GISEL-NEXT:    s_endpgm
525   %tidx = call i32 @llvm.amdgcn.workitem.id.x()
526   %tidy = call i32 @llvm.amdgcn.workitem.id.y()
527   %v = call i32 @llvm.amdgcn.permlanex16(i32 %src0, i32 %src0, i32 %tidx, i32 %tidy, i1 false, i1 false)
528   store i32 %v, ptr addrspace(1) %out
529   ret void
532 define amdgpu_kernel void @v_permlanex16_b32_vvs(ptr addrspace(1) %out, i32 %src0, i32 %src2) {
533 ; GFX10-SDAG-LABEL: v_permlanex16_b32_vvs:
534 ; GFX10-SDAG:       ; %bb.0:
535 ; GFX10-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
536 ; GFX10-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
537 ; GFX10-SDAG-NEXT:    v_mov_b32_e32 v1, s2
538 ; GFX10-SDAG-NEXT:    v_readfirstlane_b32 s2, v0
539 ; GFX10-SDAG-NEXT:    v_mov_b32_e32 v0, 0
540 ; GFX10-SDAG-NEXT:    v_permlanex16_b32 v1, v1, s2, s3
541 ; GFX10-SDAG-NEXT:    global_store_dword v0, v1, s[0:1]
542 ; GFX10-SDAG-NEXT:    s_endpgm
544 ; GFX10-GISEL-LABEL: v_permlanex16_b32_vvs:
545 ; GFX10-GISEL:       ; %bb.0:
546 ; GFX10-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
547 ; GFX10-GISEL-NEXT:    v_readfirstlane_b32 s4, v0
548 ; GFX10-GISEL-NEXT:    v_mov_b32_e32 v1, 0
549 ; GFX10-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
550 ; GFX10-GISEL-NEXT:    v_mov_b32_e32 v0, s2
551 ; GFX10-GISEL-NEXT:    v_permlanex16_b32 v0, v0, s4, s3
552 ; GFX10-GISEL-NEXT:    global_store_dword v1, v0, s[0:1]
553 ; GFX10-GISEL-NEXT:    s_endpgm
555 ; GFX11-SDAG-LABEL: v_permlanex16_b32_vvs:
556 ; GFX11-SDAG:       ; %bb.0:
557 ; GFX11-SDAG-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
558 ; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
559 ; GFX11-SDAG-NEXT:    v_mov_b32_e32 v1, s2
560 ; GFX11-SDAG-NEXT:    v_readfirstlane_b32 s2, v0
561 ; GFX11-SDAG-NEXT:    v_mov_b32_e32 v0, 0
562 ; GFX11-SDAG-NEXT:    s_delay_alu instid0(VALU_DEP_2)
563 ; GFX11-SDAG-NEXT:    v_permlanex16_b32 v1, v1, s2, s3
564 ; GFX11-SDAG-NEXT:    global_store_b32 v0, v1, s[0:1]
565 ; GFX11-SDAG-NEXT:    s_nop 0
566 ; GFX11-SDAG-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
567 ; GFX11-SDAG-NEXT:    s_endpgm
569 ; GFX11-GISEL-LABEL: v_permlanex16_b32_vvs:
570 ; GFX11-GISEL:       ; %bb.0:
571 ; GFX11-GISEL-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
572 ; GFX11-GISEL-NEXT:    v_readfirstlane_b32 s4, v0
573 ; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
574 ; GFX11-GISEL-NEXT:    v_dual_mov_b32 v1, 0 :: v_dual_mov_b32 v0, s2
575 ; GFX11-GISEL-NEXT:    s_delay_alu instid0(VALU_DEP_1)
576 ; GFX11-GISEL-NEXT:    v_permlanex16_b32 v0, v0, s4, s3
577 ; GFX11-GISEL-NEXT:    global_store_b32 v1, v0, s[0:1]
578 ; GFX11-GISEL-NEXT:    s_nop 0
579 ; GFX11-GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
580 ; GFX11-GISEL-NEXT:    s_endpgm
581   %tidx = call i32 @llvm.amdgcn.workitem.id.x()
582   %v = call i32 @llvm.amdgcn.permlanex16(i32 %src0, i32 %src0, i32 %tidx, i32 %src2, i1 false, i1 false)
583   store i32 %v, ptr addrspace(1) %out
584   ret void
587 define amdgpu_kernel void @v_permlanex16_b32_vsv(ptr addrspace(1) %out, i32 %src0, i32 %src1) {
588 ; GFX10-SDAG-LABEL: v_permlanex16_b32_vsv:
589 ; GFX10-SDAG:       ; %bb.0:
590 ; GFX10-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
591 ; GFX10-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
592 ; GFX10-SDAG-NEXT:    v_mov_b32_e32 v0, s2
593 ; GFX10-SDAG-NEXT:    v_readfirstlane_b32 s2, v1
594 ; GFX10-SDAG-NEXT:    v_mov_b32_e32 v1, 0
595 ; GFX10-SDAG-NEXT:    v_permlanex16_b32 v0, v0, s3, s2
596 ; GFX10-SDAG-NEXT:    global_store_dword v1, v0, s[0:1]
597 ; GFX10-SDAG-NEXT:    s_endpgm
599 ; GFX10-GISEL-LABEL: v_permlanex16_b32_vsv:
600 ; GFX10-GISEL:       ; %bb.0:
601 ; GFX10-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
602 ; GFX10-GISEL-NEXT:    v_readfirstlane_b32 s4, v1
603 ; GFX10-GISEL-NEXT:    v_mov_b32_e32 v1, 0
604 ; GFX10-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
605 ; GFX10-GISEL-NEXT:    v_mov_b32_e32 v0, s2
606 ; GFX10-GISEL-NEXT:    v_permlanex16_b32 v0, v0, s3, s4
607 ; GFX10-GISEL-NEXT:    global_store_dword v1, v0, s[0:1]
608 ; GFX10-GISEL-NEXT:    s_endpgm
610 ; GFX11-SDAG-LABEL: v_permlanex16_b32_vsv:
611 ; GFX11-SDAG:       ; %bb.0:
612 ; GFX11-SDAG-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
613 ; GFX11-SDAG-NEXT:    v_bfe_u32 v0, v0, 10, 10
614 ; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
615 ; GFX11-SDAG-NEXT:    v_mov_b32_e32 v1, s2
616 ; GFX11-SDAG-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
617 ; GFX11-SDAG-NEXT:    v_readfirstlane_b32 s2, v0
618 ; GFX11-SDAG-NEXT:    v_mov_b32_e32 v0, 0
619 ; GFX11-SDAG-NEXT:    v_permlanex16_b32 v1, v1, s3, s2
620 ; GFX11-SDAG-NEXT:    global_store_b32 v0, v1, s[0:1]
621 ; GFX11-SDAG-NEXT:    s_nop 0
622 ; GFX11-SDAG-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
623 ; GFX11-SDAG-NEXT:    s_endpgm
625 ; GFX11-GISEL-LABEL: v_permlanex16_b32_vsv:
626 ; GFX11-GISEL:       ; %bb.0:
627 ; GFX11-GISEL-NEXT:    s_load_b128 s[0:3], s[0:1], 0x24
628 ; GFX11-GISEL-NEXT:    v_bfe_u32 v0, v0, 10, 10
629 ; GFX11-GISEL-NEXT:    v_mov_b32_e32 v1, 0
630 ; GFX11-GISEL-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_1)
631 ; GFX11-GISEL-NEXT:    v_readfirstlane_b32 s4, v0
632 ; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
633 ; GFX11-GISEL-NEXT:    v_mov_b32_e32 v0, s2
634 ; GFX11-GISEL-NEXT:    v_permlanex16_b32 v0, v0, s3, s4
635 ; GFX11-GISEL-NEXT:    global_store_b32 v1, v0, s[0:1]
636 ; GFX11-GISEL-NEXT:    s_nop 0
637 ; GFX11-GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
638 ; GFX11-GISEL-NEXT:    s_endpgm
639   %tidy = call i32 @llvm.amdgcn.workitem.id.y()
640   %v = call i32 @llvm.amdgcn.permlanex16(i32 %src0, i32 %src0, i32 %src1, i32 %tidy, i1 false, i1 false)
641   store i32 %v, ptr addrspace(1) %out
642   ret void
645 define amdgpu_kernel void @v_permlanex16_b32_vss_fi(ptr addrspace(1) %out, i32 %src0, i32 %src1, i32 %src2) {
646 ; GFX10-LABEL: v_permlanex16_b32_vss_fi:
647 ; GFX10:       ; %bb.0:
648 ; GFX10-NEXT:    s_clause 0x1
649 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
650 ; GFX10-NEXT:    s_load_dword s2, s[0:1], 0x34
651 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
652 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
653 ; GFX10-NEXT:    v_mov_b32_e32 v0, s6
654 ; GFX10-NEXT:    v_permlanex16_b32 v0, v0, s7, s2 op_sel:[1,0]
655 ; GFX10-NEXT:    global_store_dword v1, v0, s[4:5]
656 ; GFX10-NEXT:    s_endpgm
658 ; GFX11-LABEL: v_permlanex16_b32_vss_fi:
659 ; GFX11:       ; %bb.0:
660 ; GFX11-NEXT:    s_clause 0x1
661 ; GFX11-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
662 ; GFX11-NEXT:    s_load_b32 s0, s[0:1], 0x34
663 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
664 ; GFX11-NEXT:    v_dual_mov_b32 v1, 0 :: v_dual_mov_b32 v0, s6
665 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
666 ; GFX11-NEXT:    v_permlanex16_b32 v0, v0, s7, s0 op_sel:[1,0]
667 ; GFX11-NEXT:    global_store_b32 v1, v0, s[4:5]
668 ; GFX11-NEXT:    s_nop 0
669 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
670 ; GFX11-NEXT:    s_endpgm
671   %v = call i32 @llvm.amdgcn.permlanex16(i32 %src0, i32 %src0, i32 %src1, i32 %src2, i1 true, i1 false)
672   store i32 %v, ptr addrspace(1) %out
673   ret void
676 define amdgpu_kernel void @v_permlanex16_b32_vss_bc(ptr addrspace(1) %out, i32 %src0, i32 %src1, i32 %src2) {
677 ; GFX10-LABEL: v_permlanex16_b32_vss_bc:
678 ; GFX10:       ; %bb.0:
679 ; GFX10-NEXT:    s_clause 0x1
680 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
681 ; GFX10-NEXT:    s_load_dword s2, s[0:1], 0x34
682 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
683 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
684 ; GFX10-NEXT:    v_mov_b32_e32 v0, s6
685 ; GFX10-NEXT:    v_permlanex16_b32 v0, v0, s7, s2 op_sel:[0,1]
686 ; GFX10-NEXT:    global_store_dword v1, v0, s[4:5]
687 ; GFX10-NEXT:    s_endpgm
689 ; GFX11-LABEL: v_permlanex16_b32_vss_bc:
690 ; GFX11:       ; %bb.0:
691 ; GFX11-NEXT:    s_clause 0x1
692 ; GFX11-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
693 ; GFX11-NEXT:    s_load_b32 s0, s[0:1], 0x34
694 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
695 ; GFX11-NEXT:    v_dual_mov_b32 v1, 0 :: v_dual_mov_b32 v0, s6
696 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
697 ; GFX11-NEXT:    v_permlanex16_b32 v0, v0, s7, s0 op_sel:[0,1]
698 ; GFX11-NEXT:    global_store_b32 v1, v0, s[4:5]
699 ; GFX11-NEXT:    s_nop 0
700 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
701 ; GFX11-NEXT:    s_endpgm
702   %v = call i32 @llvm.amdgcn.permlanex16(i32 %src0, i32 %src0, i32 %src1, i32 %src2, i1 false, i1 true)
703   store i32 %v, ptr addrspace(1) %out
704   ret void
707 define amdgpu_kernel void @v_permlanex16_b32_vss_fi_bc(ptr addrspace(1) %out, i32 %src0, i32 %src1, i32 %src2) {
708 ; GFX10-LABEL: v_permlanex16_b32_vss_fi_bc:
709 ; GFX10:       ; %bb.0:
710 ; GFX10-NEXT:    s_clause 0x1
711 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
712 ; GFX10-NEXT:    s_load_dword s2, s[0:1], 0x34
713 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
714 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
715 ; GFX10-NEXT:    v_mov_b32_e32 v0, s6
716 ; GFX10-NEXT:    v_permlanex16_b32 v0, v0, s7, s2 op_sel:[1,1]
717 ; GFX10-NEXT:    global_store_dword v1, v0, s[4:5]
718 ; GFX10-NEXT:    s_endpgm
720 ; GFX11-LABEL: v_permlanex16_b32_vss_fi_bc:
721 ; GFX11:       ; %bb.0:
722 ; GFX11-NEXT:    s_clause 0x1
723 ; GFX11-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
724 ; GFX11-NEXT:    s_load_b32 s0, s[0:1], 0x34
725 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
726 ; GFX11-NEXT:    v_dual_mov_b32 v1, 0 :: v_dual_mov_b32 v0, s6
727 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
728 ; GFX11-NEXT:    v_permlanex16_b32 v0, v0, s7, s0 op_sel:[1,1]
729 ; GFX11-NEXT:    global_store_b32 v1, v0, s[4:5]
730 ; GFX11-NEXT:    s_nop 0
731 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
732 ; GFX11-NEXT:    s_endpgm
733   %v = call i32 @llvm.amdgcn.permlanex16(i32 %src0, i32 %src0, i32 %src1, i32 %src2, i1 true, i1 true)
734   store i32 %v, ptr addrspace(1) %out
735   ret void
738 define amdgpu_kernel void @v_permlane16_b32_tid_tid(ptr addrspace(1) %out, i32 %src0, i32 %src1, i32 %src2) {
739 ; GFX10-LABEL: v_permlane16_b32_tid_tid:
740 ; GFX10:       ; %bb.0:
741 ; GFX10-NEXT:    s_clause 0x1
742 ; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x30
743 ; GFX10-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
744 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
745 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
746 ; GFX10-NEXT:    v_permlane16_b32 v0, v0, s2, s3
747 ; GFX10-NEXT:    global_store_dword v1, v0, s[4:5]
748 ; GFX10-NEXT:    s_endpgm
750 ; GFX11-LABEL: v_permlane16_b32_tid_tid:
751 ; GFX11:       ; %bb.0:
752 ; GFX11-NEXT:    s_clause 0x1
753 ; GFX11-NEXT:    s_load_b64 s[2:3], s[0:1], 0x30
754 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
755 ; GFX11-NEXT:    v_mov_b32_e32 v1, 0
756 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
757 ; GFX11-NEXT:    v_permlane16_b32 v0, v0, s2, s3
758 ; GFX11-NEXT:    global_store_b32 v1, v0, s[0:1]
759 ; GFX11-NEXT:    s_nop 0
760 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
761 ; GFX11-NEXT:    s_endpgm
762   %tidx = call i32 @llvm.amdgcn.workitem.id.x()
763   %v = call i32 @llvm.amdgcn.permlane16(i32 %tidx, i32 %tidx, i32 %src1, i32 %src2, i1 false, i1 false)
764   store i32 %v, ptr addrspace(1) %out
765   ret void
768 define amdgpu_kernel void @v_permlane16_b32_undef_tid(ptr addrspace(1) %out, i32 %src0, i32 %src1, i32 %src2) {
769 ; GFX10-LABEL: v_permlane16_b32_undef_tid:
770 ; GFX10:       ; %bb.0:
771 ; GFX10-NEXT:    s_clause 0x1
772 ; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x30
773 ; GFX10-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
774 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
775 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
776 ; GFX10-NEXT:    v_permlane16_b32 v0, v0, s2, s3
777 ; GFX10-NEXT:    global_store_dword v1, v0, s[4:5]
778 ; GFX10-NEXT:    s_endpgm
780 ; GFX11-LABEL: v_permlane16_b32_undef_tid:
781 ; GFX11:       ; %bb.0:
782 ; GFX11-NEXT:    s_clause 0x1
783 ; GFX11-NEXT:    s_load_b64 s[2:3], s[0:1], 0x30
784 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
785 ; GFX11-NEXT:    v_mov_b32_e32 v1, 0
786 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
787 ; GFX11-NEXT:    v_permlane16_b32 v0, v0, s2, s3
788 ; GFX11-NEXT:    global_store_b32 v1, v0, s[0:1]
789 ; GFX11-NEXT:    s_nop 0
790 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
791 ; GFX11-NEXT:    s_endpgm
792   %tidx = call i32 @llvm.amdgcn.workitem.id.x()
793   %undef = freeze i32 poison
794   %v = call i32 @llvm.amdgcn.permlane16(i32 %undef, i32 %tidx, i32 %src1, i32 %src2, i1 false, i1 false)
795   store i32 %v, ptr addrspace(1) %out
796   ret void
799 define amdgpu_kernel void @v_permlane16_b32_i_tid(ptr addrspace(1) %out, i32 %src0, i32 %src1, i32 %src2) {
800 ; GFX10-SDAG-LABEL: v_permlane16_b32_i_tid:
801 ; GFX10-SDAG:       ; %bb.0:
802 ; GFX10-SDAG-NEXT:    s_clause 0x1
803 ; GFX10-SDAG-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x30
804 ; GFX10-SDAG-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
805 ; GFX10-SDAG-NEXT:    v_mov_b32_e32 v1, 0x3039
806 ; GFX10-SDAG-NEXT:    v_mov_b32_e32 v2, 0
807 ; GFX10-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
808 ; GFX10-SDAG-NEXT:    v_permlane16_b32 v1, v0, s2, s3
809 ; GFX10-SDAG-NEXT:    global_store_dword v2, v1, s[4:5]
810 ; GFX10-SDAG-NEXT:    s_endpgm
812 ; GFX10-GISEL-LABEL: v_permlane16_b32_i_tid:
813 ; GFX10-GISEL:       ; %bb.0:
814 ; GFX10-GISEL-NEXT:    s_clause 0x1
815 ; GFX10-GISEL-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x30
816 ; GFX10-GISEL-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
817 ; GFX10-GISEL-NEXT:    v_mov_b32_e32 v1, 0x3039
818 ; GFX10-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
819 ; GFX10-GISEL-NEXT:    v_permlane16_b32 v1, v0, s2, s3
820 ; GFX10-GISEL-NEXT:    v_mov_b32_e32 v0, 0
821 ; GFX10-GISEL-NEXT:    global_store_dword v0, v1, s[4:5]
822 ; GFX10-GISEL-NEXT:    s_endpgm
824 ; GFX11-SDAG-LABEL: v_permlane16_b32_i_tid:
825 ; GFX11-SDAG:       ; %bb.0:
826 ; GFX11-SDAG-NEXT:    s_clause 0x1
827 ; GFX11-SDAG-NEXT:    s_load_b64 s[2:3], s[0:1], 0x30
828 ; GFX11-SDAG-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
829 ; GFX11-SDAG-NEXT:    v_dual_mov_b32 v1, 0x3039 :: v_dual_mov_b32 v2, 0
830 ; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
831 ; GFX11-SDAG-NEXT:    s_delay_alu instid0(VALU_DEP_1)
832 ; GFX11-SDAG-NEXT:    v_permlane16_b32 v1, v0, s2, s3
833 ; GFX11-SDAG-NEXT:    global_store_b32 v2, v1, s[0:1]
834 ; GFX11-SDAG-NEXT:    s_nop 0
835 ; GFX11-SDAG-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
836 ; GFX11-SDAG-NEXT:    s_endpgm
838 ; GFX11-GISEL-LABEL: v_permlane16_b32_i_tid:
839 ; GFX11-GISEL:       ; %bb.0:
840 ; GFX11-GISEL-NEXT:    s_clause 0x1
841 ; GFX11-GISEL-NEXT:    s_load_b64 s[2:3], s[0:1], 0x30
842 ; GFX11-GISEL-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
843 ; GFX11-GISEL-NEXT:    v_mov_b32_e32 v1, 0x3039
844 ; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
845 ; GFX11-GISEL-NEXT:    s_delay_alu instid0(VALU_DEP_1)
846 ; GFX11-GISEL-NEXT:    v_permlane16_b32 v1, v0, s2, s3
847 ; GFX11-GISEL-NEXT:    v_mov_b32_e32 v0, 0
848 ; GFX11-GISEL-NEXT:    global_store_b32 v0, v1, s[0:1]
849 ; GFX11-GISEL-NEXT:    s_nop 0
850 ; GFX11-GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
851 ; GFX11-GISEL-NEXT:    s_endpgm
852   %tidx = call i32 @llvm.amdgcn.workitem.id.x()
853   %v = call i32 @llvm.amdgcn.permlane16(i32 12345, i32 %tidx, i32 %src1, i32 %src2, i1 false, i1 false)
854   store i32 %v, ptr addrspace(1) %out
855   ret void
858 define amdgpu_kernel void @v_permlane16_b32_i_tid_fi(ptr addrspace(1) %out, i32 %src0, i32 %src1, i32 %src2) {
859 ; GFX10-LABEL: v_permlane16_b32_i_tid_fi:
860 ; GFX10:       ; %bb.0:
861 ; GFX10-NEXT:    s_clause 0x1
862 ; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x30
863 ; GFX10-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
864 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
865 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
866 ; GFX10-NEXT:    v_permlane16_b32 v0, v0, s2, s3 op_sel:[1,0]
867 ; GFX10-NEXT:    global_store_dword v1, v0, s[4:5]
868 ; GFX10-NEXT:    s_endpgm
870 ; GFX11-LABEL: v_permlane16_b32_i_tid_fi:
871 ; GFX11:       ; %bb.0:
872 ; GFX11-NEXT:    s_clause 0x1
873 ; GFX11-NEXT:    s_load_b64 s[2:3], s[0:1], 0x30
874 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
875 ; GFX11-NEXT:    v_mov_b32_e32 v1, 0
876 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
877 ; GFX11-NEXT:    v_permlane16_b32 v0, v0, s2, s3 op_sel:[1,0]
878 ; GFX11-NEXT:    global_store_b32 v1, v0, s[0:1]
879 ; GFX11-NEXT:    s_nop 0
880 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
881 ; GFX11-NEXT:    s_endpgm
882   %tidx = call i32 @llvm.amdgcn.workitem.id.x()
883   %undef = freeze i32 poison
884   %v = call i32 @llvm.amdgcn.permlane16(i32 %undef, i32 %tidx, i32 %src1, i32 %src2, i1 true, i1 false)
885   store i32 %v, ptr addrspace(1) %out
886   ret void
889 define amdgpu_kernel void @v_permlane16_b32_i_tid_bc(ptr addrspace(1) %out, i32 %src0, i32 %src1, i32 %src2) {
890 ; GFX10-LABEL: v_permlane16_b32_i_tid_bc:
891 ; GFX10:       ; %bb.0:
892 ; GFX10-NEXT:    s_clause 0x1
893 ; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x30
894 ; GFX10-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
895 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
896 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
897 ; GFX10-NEXT:    v_permlane16_b32 v0, v0, s2, s3 op_sel:[0,1]
898 ; GFX10-NEXT:    global_store_dword v1, v0, s[4:5]
899 ; GFX10-NEXT:    s_endpgm
901 ; GFX11-LABEL: v_permlane16_b32_i_tid_bc:
902 ; GFX11:       ; %bb.0:
903 ; GFX11-NEXT:    s_clause 0x1
904 ; GFX11-NEXT:    s_load_b64 s[2:3], s[0:1], 0x30
905 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
906 ; GFX11-NEXT:    v_mov_b32_e32 v1, 0
907 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
908 ; GFX11-NEXT:    v_permlane16_b32 v0, v0, s2, s3 op_sel:[0,1]
909 ; GFX11-NEXT:    global_store_b32 v1, v0, s[0:1]
910 ; GFX11-NEXT:    s_nop 0
911 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
912 ; GFX11-NEXT:    s_endpgm
913   %tidx = call i32 @llvm.amdgcn.workitem.id.x()
914   %undef = freeze i32 poison
915   %v = call i32 @llvm.amdgcn.permlane16(i32 %undef, i32 %tidx, i32 %src1, i32 %src2, i1 false, i1 true)
916   store i32 %v, ptr addrspace(1) %out
917   ret void
920 define amdgpu_kernel void @v_permlane16_b32_i_tid_fi_bc(ptr addrspace(1) %out, i32 %src0, i32 %src1, i32 %src2) {
921 ; GFX10-LABEL: v_permlane16_b32_i_tid_fi_bc:
922 ; GFX10:       ; %bb.0:
923 ; GFX10-NEXT:    s_clause 0x1
924 ; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x30
925 ; GFX10-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
926 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
927 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
928 ; GFX10-NEXT:    v_permlane16_b32 v0, v0, s2, s3 op_sel:[1,1]
929 ; GFX10-NEXT:    global_store_dword v1, v0, s[4:5]
930 ; GFX10-NEXT:    s_endpgm
932 ; GFX11-LABEL: v_permlane16_b32_i_tid_fi_bc:
933 ; GFX11:       ; %bb.0:
934 ; GFX11-NEXT:    s_clause 0x1
935 ; GFX11-NEXT:    s_load_b64 s[2:3], s[0:1], 0x30
936 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
937 ; GFX11-NEXT:    v_mov_b32_e32 v1, 0
938 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
939 ; GFX11-NEXT:    v_permlane16_b32 v0, v0, s2, s3 op_sel:[1,1]
940 ; GFX11-NEXT:    global_store_b32 v1, v0, s[0:1]
941 ; GFX11-NEXT:    s_nop 0
942 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
943 ; GFX11-NEXT:    s_endpgm
944   %tidx = call i32 @llvm.amdgcn.workitem.id.x()
945   %undef = freeze i32 poison
946   %v = call i32 @llvm.amdgcn.permlane16(i32 %undef, i32 %tidx, i32 %src1, i32 %src2, i1 true, i1 true)
947   store i32 %v, ptr addrspace(1) %out
948   ret void
951 define amdgpu_kernel void @v_permlanex16_b32_tid_tid(ptr addrspace(1) %out, i32 %src0, i32 %src1, i32 %src2) {
952 ; GFX10-LABEL: v_permlanex16_b32_tid_tid:
953 ; GFX10:       ; %bb.0:
954 ; GFX10-NEXT:    s_clause 0x1
955 ; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x30
956 ; GFX10-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
957 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
958 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
959 ; GFX10-NEXT:    v_permlanex16_b32 v0, v0, s2, s3
960 ; GFX10-NEXT:    global_store_dword v1, v0, s[4:5]
961 ; GFX10-NEXT:    s_endpgm
963 ; GFX11-LABEL: v_permlanex16_b32_tid_tid:
964 ; GFX11:       ; %bb.0:
965 ; GFX11-NEXT:    s_clause 0x1
966 ; GFX11-NEXT:    s_load_b64 s[2:3], s[0:1], 0x30
967 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
968 ; GFX11-NEXT:    v_mov_b32_e32 v1, 0
969 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
970 ; GFX11-NEXT:    v_permlanex16_b32 v0, v0, s2, s3
971 ; GFX11-NEXT:    global_store_b32 v1, v0, s[0:1]
972 ; GFX11-NEXT:    s_nop 0
973 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
974 ; GFX11-NEXT:    s_endpgm
975   %tidx = call i32 @llvm.amdgcn.workitem.id.x()
976   %v = call i32 @llvm.amdgcn.permlanex16(i32 %tidx, i32 %tidx, i32 %src1, i32 %src2, i1 false, i1 false)
977   store i32 %v, ptr addrspace(1) %out
978   ret void
981 define amdgpu_kernel void @v_permlanex16_b32_undef_tid(ptr addrspace(1) %out, i32 %src0, i32 %src1, i32 %src2) {
982 ; GFX10-LABEL: v_permlanex16_b32_undef_tid:
983 ; GFX10:       ; %bb.0:
984 ; GFX10-NEXT:    s_clause 0x1
985 ; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x30
986 ; GFX10-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
987 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
988 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
989 ; GFX10-NEXT:    v_permlanex16_b32 v0, v0, s2, s3
990 ; GFX10-NEXT:    global_store_dword v1, v0, s[4:5]
991 ; GFX10-NEXT:    s_endpgm
993 ; GFX11-LABEL: v_permlanex16_b32_undef_tid:
994 ; GFX11:       ; %bb.0:
995 ; GFX11-NEXT:    s_clause 0x1
996 ; GFX11-NEXT:    s_load_b64 s[2:3], s[0:1], 0x30
997 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
998 ; GFX11-NEXT:    v_mov_b32_e32 v1, 0
999 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1000 ; GFX11-NEXT:    v_permlanex16_b32 v0, v0, s2, s3
1001 ; GFX11-NEXT:    global_store_b32 v1, v0, s[0:1]
1002 ; GFX11-NEXT:    s_nop 0
1003 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1004 ; GFX11-NEXT:    s_endpgm
1005   %tidx = call i32 @llvm.amdgcn.workitem.id.x()
1006   %undef = freeze i32 poison
1007   %v = call i32 @llvm.amdgcn.permlanex16(i32 %undef, i32 %tidx, i32 %src1, i32 %src2, i1 false, i1 false)
1008   store i32 %v, ptr addrspace(1) %out
1009   ret void
1012 define amdgpu_kernel void @v_permlanex16_b32_i_tid(ptr addrspace(1) %out, i32 %src0, i32 %src1, i32 %src2) {
1013 ; GFX10-SDAG-LABEL: v_permlanex16_b32_i_tid:
1014 ; GFX10-SDAG:       ; %bb.0:
1015 ; GFX10-SDAG-NEXT:    s_clause 0x1
1016 ; GFX10-SDAG-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x30
1017 ; GFX10-SDAG-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
1018 ; GFX10-SDAG-NEXT:    v_mov_b32_e32 v1, 0x3039
1019 ; GFX10-SDAG-NEXT:    v_mov_b32_e32 v2, 0
1020 ; GFX10-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
1021 ; GFX10-SDAG-NEXT:    v_permlanex16_b32 v1, v0, s2, s3
1022 ; GFX10-SDAG-NEXT:    global_store_dword v2, v1, s[4:5]
1023 ; GFX10-SDAG-NEXT:    s_endpgm
1025 ; GFX10-GISEL-LABEL: v_permlanex16_b32_i_tid:
1026 ; GFX10-GISEL:       ; %bb.0:
1027 ; GFX10-GISEL-NEXT:    s_clause 0x1
1028 ; GFX10-GISEL-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x30
1029 ; GFX10-GISEL-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
1030 ; GFX10-GISEL-NEXT:    v_mov_b32_e32 v1, 0x3039
1031 ; GFX10-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
1032 ; GFX10-GISEL-NEXT:    v_permlanex16_b32 v1, v0, s2, s3
1033 ; GFX10-GISEL-NEXT:    v_mov_b32_e32 v0, 0
1034 ; GFX10-GISEL-NEXT:    global_store_dword v0, v1, s[4:5]
1035 ; GFX10-GISEL-NEXT:    s_endpgm
1037 ; GFX11-SDAG-LABEL: v_permlanex16_b32_i_tid:
1038 ; GFX11-SDAG:       ; %bb.0:
1039 ; GFX11-SDAG-NEXT:    s_clause 0x1
1040 ; GFX11-SDAG-NEXT:    s_load_b64 s[2:3], s[0:1], 0x30
1041 ; GFX11-SDAG-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
1042 ; GFX11-SDAG-NEXT:    v_dual_mov_b32 v1, 0x3039 :: v_dual_mov_b32 v2, 0
1043 ; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
1044 ; GFX11-SDAG-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1045 ; GFX11-SDAG-NEXT:    v_permlanex16_b32 v1, v0, s2, s3
1046 ; GFX11-SDAG-NEXT:    global_store_b32 v2, v1, s[0:1]
1047 ; GFX11-SDAG-NEXT:    s_nop 0
1048 ; GFX11-SDAG-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1049 ; GFX11-SDAG-NEXT:    s_endpgm
1051 ; GFX11-GISEL-LABEL: v_permlanex16_b32_i_tid:
1052 ; GFX11-GISEL:       ; %bb.0:
1053 ; GFX11-GISEL-NEXT:    s_clause 0x1
1054 ; GFX11-GISEL-NEXT:    s_load_b64 s[2:3], s[0:1], 0x30
1055 ; GFX11-GISEL-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
1056 ; GFX11-GISEL-NEXT:    v_mov_b32_e32 v1, 0x3039
1057 ; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
1058 ; GFX11-GISEL-NEXT:    s_delay_alu instid0(VALU_DEP_1)
1059 ; GFX11-GISEL-NEXT:    v_permlanex16_b32 v1, v0, s2, s3
1060 ; GFX11-GISEL-NEXT:    v_mov_b32_e32 v0, 0
1061 ; GFX11-GISEL-NEXT:    global_store_b32 v0, v1, s[0:1]
1062 ; GFX11-GISEL-NEXT:    s_nop 0
1063 ; GFX11-GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1064 ; GFX11-GISEL-NEXT:    s_endpgm
1065   %tidx = call i32 @llvm.amdgcn.workitem.id.x()
1066   %v = call i32 @llvm.amdgcn.permlanex16(i32 12345, i32 %tidx, i32 %src1, i32 %src2, i1 false, i1 false)
1067   store i32 %v, ptr addrspace(1) %out
1068   ret void
1071 define amdgpu_kernel void @v_permlanex16_b32_i_tid_fi(ptr addrspace(1) %out, i32 %src0, i32 %src1, i32 %src2) {
1072 ; GFX10-LABEL: v_permlanex16_b32_i_tid_fi:
1073 ; GFX10:       ; %bb.0:
1074 ; GFX10-NEXT:    s_clause 0x1
1075 ; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x30
1076 ; GFX10-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
1077 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
1078 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1079 ; GFX10-NEXT:    v_permlanex16_b32 v0, v0, s2, s3 op_sel:[1,0]
1080 ; GFX10-NEXT:    global_store_dword v1, v0, s[4:5]
1081 ; GFX10-NEXT:    s_endpgm
1083 ; GFX11-LABEL: v_permlanex16_b32_i_tid_fi:
1084 ; GFX11:       ; %bb.0:
1085 ; GFX11-NEXT:    s_clause 0x1
1086 ; GFX11-NEXT:    s_load_b64 s[2:3], s[0:1], 0x30
1087 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
1088 ; GFX11-NEXT:    v_mov_b32_e32 v1, 0
1089 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1090 ; GFX11-NEXT:    v_permlanex16_b32 v0, v0, s2, s3 op_sel:[1,0]
1091 ; GFX11-NEXT:    global_store_b32 v1, v0, s[0:1]
1092 ; GFX11-NEXT:    s_nop 0
1093 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1094 ; GFX11-NEXT:    s_endpgm
1095   %tidx = call i32 @llvm.amdgcn.workitem.id.x()
1096   %undef = freeze i32 poison
1097   %v = call i32 @llvm.amdgcn.permlanex16(i32 %undef, i32 %tidx, i32 %src1, i32 %src2, i1 true, i1 false)
1098   store i32 %v, ptr addrspace(1) %out
1099   ret void
1102 define amdgpu_kernel void @v_permlanex16_b32_i_tid_bc(ptr addrspace(1) %out, i32 %src0, i32 %src1, i32 %src2) {
1103 ; GFX10-LABEL: v_permlanex16_b32_i_tid_bc:
1104 ; GFX10:       ; %bb.0:
1105 ; GFX10-NEXT:    s_clause 0x1
1106 ; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x30
1107 ; GFX10-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
1108 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
1109 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1110 ; GFX10-NEXT:    v_permlanex16_b32 v0, v0, s2, s3 op_sel:[0,1]
1111 ; GFX10-NEXT:    global_store_dword v1, v0, s[4:5]
1112 ; GFX10-NEXT:    s_endpgm
1114 ; GFX11-LABEL: v_permlanex16_b32_i_tid_bc:
1115 ; GFX11:       ; %bb.0:
1116 ; GFX11-NEXT:    s_clause 0x1
1117 ; GFX11-NEXT:    s_load_b64 s[2:3], s[0:1], 0x30
1118 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
1119 ; GFX11-NEXT:    v_mov_b32_e32 v1, 0
1120 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1121 ; GFX11-NEXT:    v_permlanex16_b32 v0, v0, s2, s3 op_sel:[0,1]
1122 ; GFX11-NEXT:    global_store_b32 v1, v0, s[0:1]
1123 ; GFX11-NEXT:    s_nop 0
1124 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1125 ; GFX11-NEXT:    s_endpgm
1126   %tidx = call i32 @llvm.amdgcn.workitem.id.x()
1127   %undef = freeze i32 poison
1128   %v = call i32 @llvm.amdgcn.permlanex16(i32 %undef, i32 %tidx, i32 %src1, i32 %src2, i1 false, i1 true)
1129   store i32 %v, ptr addrspace(1) %out
1130   ret void
1133 define amdgpu_kernel void @v_permlanex16_b32_i_tid_fi_bc(ptr addrspace(1) %out, i32 %src0, i32 %src1, i32 %src2) {
1134 ; GFX10-LABEL: v_permlanex16_b32_i_tid_fi_bc:
1135 ; GFX10:       ; %bb.0:
1136 ; GFX10-NEXT:    s_clause 0x1
1137 ; GFX10-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x30
1138 ; GFX10-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
1139 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
1140 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
1141 ; GFX10-NEXT:    v_permlanex16_b32 v0, v0, s2, s3 op_sel:[1,1]
1142 ; GFX10-NEXT:    global_store_dword v1, v0, s[4:5]
1143 ; GFX10-NEXT:    s_endpgm
1145 ; GFX11-LABEL: v_permlanex16_b32_i_tid_fi_bc:
1146 ; GFX11:       ; %bb.0:
1147 ; GFX11-NEXT:    s_clause 0x1
1148 ; GFX11-NEXT:    s_load_b64 s[2:3], s[0:1], 0x30
1149 ; GFX11-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
1150 ; GFX11-NEXT:    v_mov_b32_e32 v1, 0
1151 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1152 ; GFX11-NEXT:    v_permlanex16_b32 v0, v0, s2, s3 op_sel:[1,1]
1153 ; GFX11-NEXT:    global_store_b32 v1, v0, s[0:1]
1154 ; GFX11-NEXT:    s_nop 0
1155 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1156 ; GFX11-NEXT:    s_endpgm
1157   %tidx = call i32 @llvm.amdgcn.workitem.id.x()
1158   %undef = freeze i32 poison
1159   %v = call i32 @llvm.amdgcn.permlanex16(i32 %undef, i32 %tidx, i32 %src1, i32 %src2, i1 true, i1 true)
1160   store i32 %v, ptr addrspace(1) %out
1161   ret void