[MachineScheduler] Fix physreg dependencies of ExitSU (#123541)
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / llvm.amdgcn.readlane.ll
blobedb6ebcee1325589b2b29e571798fcdc0c8465fd
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2 ; RUN: llc -mtriple=amdgcn--amdhsa -mcpu=fiji -verify-machineinstrs < %s | FileCheck --check-prefix=CHECK-SDAG -enable-var-scope %s
3 ; RUN: llc -mtriple=amdgcn--amdhsa -mcpu=fiji -verify-machineinstrs -global-isel -global-isel-abort=2 < %s | FileCheck --check-prefix=CHECK-GISEL -enable-var-scope %s
5 declare i32 @llvm.amdgcn.readlane.i32(i32, i32) #0
6 declare i64 @llvm.amdgcn.readlane.i64(i64, i32) #0
7 declare double @llvm.amdgcn.readlane.f64(double, i32) #0
9 define amdgpu_kernel void @test_readlane_sreg_sreg_i32(i32 %src0, i32 %src1) #1 {
10 ; CHECK-SDAG-LABEL: test_readlane_sreg_sreg_i32:
11 ; CHECK-SDAG:       ; %bb.0:
12 ; CHECK-SDAG-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0
13 ; CHECK-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
14 ; CHECK-SDAG-NEXT:    ;;#ASMSTART
15 ; CHECK-SDAG-NEXT:    ; use s0
16 ; CHECK-SDAG-NEXT:    ;;#ASMEND
17 ; CHECK-SDAG-NEXT:    s_endpgm
19 ; CHECK-GISEL-LABEL: test_readlane_sreg_sreg_i32:
20 ; CHECK-GISEL:       ; %bb.0:
21 ; CHECK-GISEL-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0
22 ; CHECK-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
23 ; CHECK-GISEL-NEXT:    ;;#ASMSTART
24 ; CHECK-GISEL-NEXT:    ; use s0
25 ; CHECK-GISEL-NEXT:    ;;#ASMEND
26 ; CHECK-GISEL-NEXT:    s_endpgm
27   %readlane = call i32 @llvm.amdgcn.readlane.i32(i32 %src0, i32 %src1)
28   call void asm sideeffect "; use $0", "s"(i32 %readlane)
29   ret void
32 define amdgpu_kernel void @test_readlane_sreg_sreg_i64(i64 %src0, i32 %src1) #1 {
33 ; CHECK-SDAG-LABEL: test_readlane_sreg_sreg_i64:
34 ; CHECK-SDAG:       ; %bb.0:
35 ; CHECK-SDAG-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0
36 ; CHECK-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
37 ; CHECK-SDAG-NEXT:    ;;#ASMSTART
38 ; CHECK-SDAG-NEXT:    ; use s[0:1]
39 ; CHECK-SDAG-NEXT:    ;;#ASMEND
40 ; CHECK-SDAG-NEXT:    s_endpgm
42 ; CHECK-GISEL-LABEL: test_readlane_sreg_sreg_i64:
43 ; CHECK-GISEL:       ; %bb.0:
44 ; CHECK-GISEL-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0
45 ; CHECK-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
46 ; CHECK-GISEL-NEXT:    ;;#ASMSTART
47 ; CHECK-GISEL-NEXT:    ; use s[0:1]
48 ; CHECK-GISEL-NEXT:    ;;#ASMEND
49 ; CHECK-GISEL-NEXT:    s_endpgm
50   %readlane = call i64 @llvm.amdgcn.readlane.i64(i64 %src0, i32 %src1)
51   call void asm sideeffect "; use $0", "s"(i64 %readlane)
52   ret void
55 define amdgpu_kernel void @test_readlane_sreg_sreg_f64(double %src0, i32 %src1) #1 {
56 ; CHECK-SDAG-LABEL: test_readlane_sreg_sreg_f64:
57 ; CHECK-SDAG:       ; %bb.0:
58 ; CHECK-SDAG-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0
59 ; CHECK-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
60 ; CHECK-SDAG-NEXT:    ;;#ASMSTART
61 ; CHECK-SDAG-NEXT:    ; use s[0:1]
62 ; CHECK-SDAG-NEXT:    ;;#ASMEND
63 ; CHECK-SDAG-NEXT:    s_endpgm
65 ; CHECK-GISEL-LABEL: test_readlane_sreg_sreg_f64:
66 ; CHECK-GISEL:       ; %bb.0:
67 ; CHECK-GISEL-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0
68 ; CHECK-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
69 ; CHECK-GISEL-NEXT:    ;;#ASMSTART
70 ; CHECK-GISEL-NEXT:    ; use s[0:1]
71 ; CHECK-GISEL-NEXT:    ;;#ASMEND
72 ; CHECK-GISEL-NEXT:    s_endpgm
73   %readlane = call double @llvm.amdgcn.readlane.f64(double %src0, i32 %src1)
74   call void asm sideeffect "; use $0", "s"(double %readlane)
75   ret void
78 define amdgpu_kernel void @test_readlane_vreg_sreg_i32(i32 %src0, i32 %src1) #1 {
79 ; CHECK-SDAG-LABEL: test_readlane_vreg_sreg_i32:
80 ; CHECK-SDAG:       ; %bb.0:
81 ; CHECK-SDAG-NEXT:    s_load_dword s0, s[8:9], 0x4
82 ; CHECK-SDAG-NEXT:    ;;#ASMSTART
83 ; CHECK-SDAG-NEXT:    ; def v0
84 ; CHECK-SDAG-NEXT:    ;;#ASMEND
85 ; CHECK-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
86 ; CHECK-SDAG-NEXT:    v_readlane_b32 s0, v0, s0
87 ; CHECK-SDAG-NEXT:    ;;#ASMSTART
88 ; CHECK-SDAG-NEXT:    ; use s0
89 ; CHECK-SDAG-NEXT:    ;;#ASMEND
90 ; CHECK-SDAG-NEXT:    s_endpgm
92 ; CHECK-GISEL-LABEL: test_readlane_vreg_sreg_i32:
93 ; CHECK-GISEL:       ; %bb.0:
94 ; CHECK-GISEL-NEXT:    s_load_dword s0, s[8:9], 0x4
95 ; CHECK-GISEL-NEXT:    ;;#ASMSTART
96 ; CHECK-GISEL-NEXT:    ; def v0
97 ; CHECK-GISEL-NEXT:    ;;#ASMEND
98 ; CHECK-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
99 ; CHECK-GISEL-NEXT:    v_readlane_b32 s0, v0, s0
100 ; CHECK-GISEL-NEXT:    ;;#ASMSTART
101 ; CHECK-GISEL-NEXT:    ; use s0
102 ; CHECK-GISEL-NEXT:    ;;#ASMEND
103 ; CHECK-GISEL-NEXT:    s_endpgm
104   %vgpr = call i32 asm sideeffect "; def $0", "=v"()
105   %readlane = call i32 @llvm.amdgcn.readlane.i32(i32 %vgpr, i32 %src1)
106   call void asm sideeffect "; use $0", "s"(i32 %readlane)
107   ret void
110 define amdgpu_kernel void @test_readlane_vreg_sreg_i64(i64 %src0, i32 %src1) #1 {
111 ; CHECK-SDAG-LABEL: test_readlane_vreg_sreg_i64:
112 ; CHECK-SDAG:       ; %bb.0:
113 ; CHECK-SDAG-NEXT:    s_load_dword s0, s[8:9], 0x8
114 ; CHECK-SDAG-NEXT:    ;;#ASMSTART
115 ; CHECK-SDAG-NEXT:    ; def v[0:1]
116 ; CHECK-SDAG-NEXT:    ;;#ASMEND
117 ; CHECK-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
118 ; CHECK-SDAG-NEXT:    v_readlane_b32 s1, v1, s0
119 ; CHECK-SDAG-NEXT:    v_readlane_b32 s0, v0, s0
120 ; CHECK-SDAG-NEXT:    ;;#ASMSTART
121 ; CHECK-SDAG-NEXT:    ; use s[0:1]
122 ; CHECK-SDAG-NEXT:    ;;#ASMEND
123 ; CHECK-SDAG-NEXT:    s_endpgm
125 ; CHECK-GISEL-LABEL: test_readlane_vreg_sreg_i64:
126 ; CHECK-GISEL:       ; %bb.0:
127 ; CHECK-GISEL-NEXT:    s_load_dword s1, s[8:9], 0x8
128 ; CHECK-GISEL-NEXT:    ;;#ASMSTART
129 ; CHECK-GISEL-NEXT:    ; def v[0:1]
130 ; CHECK-GISEL-NEXT:    ;;#ASMEND
131 ; CHECK-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
132 ; CHECK-GISEL-NEXT:    v_readlane_b32 s0, v0, s1
133 ; CHECK-GISEL-NEXT:    v_readlane_b32 s1, v1, s1
134 ; CHECK-GISEL-NEXT:    ;;#ASMSTART
135 ; CHECK-GISEL-NEXT:    ; use s[0:1]
136 ; CHECK-GISEL-NEXT:    ;;#ASMEND
137 ; CHECK-GISEL-NEXT:    s_endpgm
138   %vgpr = call i64 asm sideeffect "; def $0", "=v"()
139   %readlane = call i64 @llvm.amdgcn.readlane.i64(i64 %vgpr, i32 %src1)
140   call void asm sideeffect "; use $0", "s"(i64 %readlane)
141   ret void
144 define amdgpu_kernel void @test_readlane_vreg_sreg_f64(double %src0, i32 %src1) #1 {
145 ; CHECK-SDAG-LABEL: test_readlane_vreg_sreg_f64:
146 ; CHECK-SDAG:       ; %bb.0:
147 ; CHECK-SDAG-NEXT:    s_load_dword s0, s[8:9], 0x8
148 ; CHECK-SDAG-NEXT:    ;;#ASMSTART
149 ; CHECK-SDAG-NEXT:    ; def v[0:1]
150 ; CHECK-SDAG-NEXT:    ;;#ASMEND
151 ; CHECK-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
152 ; CHECK-SDAG-NEXT:    v_readlane_b32 s1, v1, s0
153 ; CHECK-SDAG-NEXT:    v_readlane_b32 s0, v0, s0
154 ; CHECK-SDAG-NEXT:    ;;#ASMSTART
155 ; CHECK-SDAG-NEXT:    ; use s[0:1]
156 ; CHECK-SDAG-NEXT:    ;;#ASMEND
157 ; CHECK-SDAG-NEXT:    s_endpgm
159 ; CHECK-GISEL-LABEL: test_readlane_vreg_sreg_f64:
160 ; CHECK-GISEL:       ; %bb.0:
161 ; CHECK-GISEL-NEXT:    s_load_dword s1, s[8:9], 0x8
162 ; CHECK-GISEL-NEXT:    ;;#ASMSTART
163 ; CHECK-GISEL-NEXT:    ; def v[0:1]
164 ; CHECK-GISEL-NEXT:    ;;#ASMEND
165 ; CHECK-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
166 ; CHECK-GISEL-NEXT:    v_readlane_b32 s0, v0, s1
167 ; CHECK-GISEL-NEXT:    v_readlane_b32 s1, v1, s1
168 ; CHECK-GISEL-NEXT:    ;;#ASMSTART
169 ; CHECK-GISEL-NEXT:    ; use s[0:1]
170 ; CHECK-GISEL-NEXT:    ;;#ASMEND
171 ; CHECK-GISEL-NEXT:    s_endpgm
172   %vgpr = call double asm sideeffect "; def $0", "=v"()
173   %readlane = call double @llvm.amdgcn.readlane.f64(double %vgpr, i32 %src1)
174   call void asm sideeffect "; use $0", "s"(double %readlane)
175   ret void
178 define amdgpu_kernel void @test_readlane_imm_sreg_i32(ptr addrspace(1) %out, i32 %src1) #1 {
179 ; CHECK-SDAG-LABEL: test_readlane_imm_sreg_i32:
180 ; CHECK-SDAG:       ; %bb.0:
181 ; CHECK-SDAG-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0
182 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v2, 32
183 ; CHECK-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
184 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v0, s0
185 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v1, s1
186 ; CHECK-SDAG-NEXT:    flat_store_dword v[0:1], v2
187 ; CHECK-SDAG-NEXT:    s_endpgm
189 ; CHECK-GISEL-LABEL: test_readlane_imm_sreg_i32:
190 ; CHECK-GISEL:       ; %bb.0:
191 ; CHECK-GISEL-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0
192 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v2, 32
193 ; CHECK-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
194 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v0, s0
195 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v1, s1
196 ; CHECK-GISEL-NEXT:    flat_store_dword v[0:1], v2
197 ; CHECK-GISEL-NEXT:    s_endpgm
198   %readlane = call i32 @llvm.amdgcn.readlane.i32(i32 32, i32 %src1)
199   store i32 %readlane, ptr addrspace(1) %out, align 4
200   ret void
203 define amdgpu_kernel void @test_readlane_imm_sreg_i64(ptr addrspace(1) %out, i32 %src1) #1 {
204 ; CHECK-SDAG-LABEL: test_readlane_imm_sreg_i64:
205 ; CHECK-SDAG:       ; %bb.0:
206 ; CHECK-SDAG-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0
207 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v0, 32
208 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v1, 0
209 ; CHECK-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
210 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v3, s1
211 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v2, s0
212 ; CHECK-SDAG-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
213 ; CHECK-SDAG-NEXT:    s_endpgm
215 ; CHECK-GISEL-LABEL: test_readlane_imm_sreg_i64:
216 ; CHECK-GISEL:       ; %bb.0:
217 ; CHECK-GISEL-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0
218 ; CHECK-GISEL-NEXT:    s_mov_b64 s[2:3], 32
219 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v0, s2
220 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v1, s3
221 ; CHECK-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
222 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v3, s1
223 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v2, s0
224 ; CHECK-GISEL-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
225 ; CHECK-GISEL-NEXT:    s_endpgm
226   %readlane = call i64 @llvm.amdgcn.readlane.i64(i64 32, i32 %src1)
227   store i64 %readlane, ptr addrspace(1) %out, align 4
228   ret void
231 define amdgpu_kernel void @test_readlane_imm_sreg_f64(ptr addrspace(1) %out, i32 %src1) #1 {
232 ; CHECK-SDAG-LABEL: test_readlane_imm_sreg_f64:
233 ; CHECK-SDAG:       ; %bb.0:
234 ; CHECK-SDAG-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0
235 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v0, 0
236 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v1, 0x40400000
237 ; CHECK-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
238 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v3, s1
239 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v2, s0
240 ; CHECK-SDAG-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
241 ; CHECK-SDAG-NEXT:    s_endpgm
243 ; CHECK-GISEL-LABEL: test_readlane_imm_sreg_f64:
244 ; CHECK-GISEL:       ; %bb.0:
245 ; CHECK-GISEL-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0
246 ; CHECK-GISEL-NEXT:    s_mov_b32 s2, 0
247 ; CHECK-GISEL-NEXT:    s_mov_b32 s3, 0x40400000
248 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v0, s2
249 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v1, s3
250 ; CHECK-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
251 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v3, s1
252 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v2, s0
253 ; CHECK-GISEL-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
254 ; CHECK-GISEL-NEXT:    s_endpgm
255   %readlane = call double @llvm.amdgcn.readlane.f64(double 32.0, i32 %src1)
256   store double %readlane, ptr addrspace(1) %out, align 4
257   ret void
260 define amdgpu_kernel void @test_readlane_vregs_i32(ptr addrspace(1) %out, ptr addrspace(1) %in) #1 {
261 ; CHECK-SDAG-LABEL: test_readlane_vregs_i32:
262 ; CHECK-SDAG:       ; %bb.0:
263 ; CHECK-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[8:9], 0x0
264 ; CHECK-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
265 ; CHECK-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
266 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v1, s3
267 ; CHECK-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v0
268 ; CHECK-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
269 ; CHECK-SDAG-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
270 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v2, s0
271 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v3, s1
272 ; CHECK-SDAG-NEXT:    s_waitcnt vmcnt(0)
273 ; CHECK-SDAG-NEXT:    v_readfirstlane_b32 s0, v1
274 ; CHECK-SDAG-NEXT:    s_nop 3
275 ; CHECK-SDAG-NEXT:    v_readlane_b32 s0, v0, s0
276 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v0, s0
277 ; CHECK-SDAG-NEXT:    flat_store_dword v[2:3], v0
278 ; CHECK-SDAG-NEXT:    s_endpgm
280 ; CHECK-GISEL-LABEL: test_readlane_vregs_i32:
281 ; CHECK-GISEL:       ; %bb.0:
282 ; CHECK-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[8:9], 0x0
283 ; CHECK-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
284 ; CHECK-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
285 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v0, s2
286 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v1, s3
287 ; CHECK-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
288 ; CHECK-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
289 ; CHECK-GISEL-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
290 ; CHECK-GISEL-NEXT:    s_waitcnt vmcnt(0)
291 ; CHECK-GISEL-NEXT:    v_readfirstlane_b32 s2, v1
292 ; CHECK-GISEL-NEXT:    s_nop 3
293 ; CHECK-GISEL-NEXT:    v_readlane_b32 s2, v0, s2
294 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v0, s0
295 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v2, s2
296 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v1, s1
297 ; CHECK-GISEL-NEXT:    flat_store_dword v[0:1], v2
298 ; CHECK-GISEL-NEXT:    s_endpgm
299   %tid = call i32 @llvm.amdgcn.workitem.id.x()
300   %gep.in = getelementptr <2 x i32>, ptr addrspace(1) %in, i32 %tid
301   %args = load <2 x i32>, ptr addrspace(1) %gep.in
302   %value = extractelement <2 x i32> %args, i32 0
303   %lane = extractelement <2 x i32> %args, i32 1
304   %readlane = call i32 @llvm.amdgcn.readlane.i32(i32 %value, i32 %lane)
305   store i32 %readlane, ptr addrspace(1) %out, align 4
306   ret void
309 define amdgpu_kernel void @test_readlane_vregs_i64(ptr addrspace(1) %out, ptr addrspace(1) %in) #1 {
310 ; CHECK-SDAG-LABEL: test_readlane_vregs_i64:
311 ; CHECK-SDAG:       ; %bb.0:
312 ; CHECK-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[8:9], 0x0
313 ; CHECK-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 4, v0
314 ; CHECK-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
315 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v1, s3
316 ; CHECK-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v0
317 ; CHECK-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
318 ; CHECK-SDAG-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
319 ; CHECK-SDAG-NEXT:    s_waitcnt vmcnt(0)
320 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v3, s0
321 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v4, s1
322 ; CHECK-SDAG-NEXT:    v_readfirstlane_b32 s0, v2
323 ; CHECK-SDAG-NEXT:    s_nop 3
324 ; CHECK-SDAG-NEXT:    v_readlane_b32 s1, v1, s0
325 ; CHECK-SDAG-NEXT:    v_readlane_b32 s0, v0, s0
326 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v0, s0
327 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v1, s1
328 ; CHECK-SDAG-NEXT:    flat_store_dwordx2 v[3:4], v[0:1]
329 ; CHECK-SDAG-NEXT:    s_endpgm
331 ; CHECK-GISEL-LABEL: test_readlane_vregs_i64:
332 ; CHECK-GISEL:       ; %bb.0:
333 ; CHECK-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[8:9], 0x0
334 ; CHECK-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 4, v0
335 ; CHECK-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
336 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v0, s2
337 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v1, s3
338 ; CHECK-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
339 ; CHECK-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
340 ; CHECK-GISEL-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
341 ; CHECK-GISEL-NEXT:    s_waitcnt vmcnt(0)
342 ; CHECK-GISEL-NEXT:    v_readfirstlane_b32 s3, v2
343 ; CHECK-GISEL-NEXT:    s_nop 3
344 ; CHECK-GISEL-NEXT:    v_readlane_b32 s2, v0, s3
345 ; CHECK-GISEL-NEXT:    v_readlane_b32 s3, v1, s3
346 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v0, s2
347 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v3, s1
348 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v1, s3
349 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v2, s0
350 ; CHECK-GISEL-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
351 ; CHECK-GISEL-NEXT:    s_endpgm
352   %tid = call i32 @llvm.amdgcn.workitem.id.x()
353   %gep.in = getelementptr <2 x i64>, ptr addrspace(1) %in, i32 %tid
354   %args = load <2 x i64>, ptr addrspace(1) %gep.in
355   %value = extractelement <2 x i64> %args, i32 0
356   %lane = extractelement <2 x i64> %args, i32 1
357   %lane32 = trunc i64 %lane to i32
358   %readlane = call i64 @llvm.amdgcn.readlane.i64(i64 %value, i32 %lane32)
359   store i64 %readlane, ptr addrspace(1) %out, align 4
360   ret void
363 define amdgpu_kernel void @test_readlane_vregs_f64(ptr addrspace(1) %out, ptr addrspace(1) %in) #1 {
364 ; CHECK-SDAG-LABEL: test_readlane_vregs_f64:
365 ; CHECK-SDAG:       ; %bb.0:
366 ; CHECK-SDAG-NEXT:    s_load_dwordx4 s[0:3], s[8:9], 0x0
367 ; CHECK-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 4, v0
368 ; CHECK-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
369 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v1, s3
370 ; CHECK-SDAG-NEXT:    v_add_u32_e32 v0, vcc, s2, v0
371 ; CHECK-SDAG-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
372 ; CHECK-SDAG-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
373 ; CHECK-SDAG-NEXT:    s_waitcnt vmcnt(0)
374 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v3, s0
375 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v4, s1
376 ; CHECK-SDAG-NEXT:    v_readfirstlane_b32 s0, v2
377 ; CHECK-SDAG-NEXT:    s_nop 3
378 ; CHECK-SDAG-NEXT:    v_readlane_b32 s1, v1, s0
379 ; CHECK-SDAG-NEXT:    v_readlane_b32 s0, v0, s0
380 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v0, s0
381 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v1, s1
382 ; CHECK-SDAG-NEXT:    flat_store_dwordx2 v[3:4], v[0:1]
383 ; CHECK-SDAG-NEXT:    s_endpgm
385 ; CHECK-GISEL-LABEL: test_readlane_vregs_f64:
386 ; CHECK-GISEL:       ; %bb.0:
387 ; CHECK-GISEL-NEXT:    s_load_dwordx4 s[0:3], s[8:9], 0x0
388 ; CHECK-GISEL-NEXT:    v_lshlrev_b32_e32 v2, 4, v0
389 ; CHECK-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
390 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v0, s2
391 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v1, s3
392 ; CHECK-GISEL-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
393 ; CHECK-GISEL-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
394 ; CHECK-GISEL-NEXT:    flat_load_dwordx4 v[0:3], v[0:1]
395 ; CHECK-GISEL-NEXT:    s_waitcnt vmcnt(0)
396 ; CHECK-GISEL-NEXT:    v_readfirstlane_b32 s3, v2
397 ; CHECK-GISEL-NEXT:    s_nop 3
398 ; CHECK-GISEL-NEXT:    v_readlane_b32 s2, v0, s3
399 ; CHECK-GISEL-NEXT:    v_readlane_b32 s3, v1, s3
400 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v0, s2
401 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v3, s1
402 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v1, s3
403 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v2, s0
404 ; CHECK-GISEL-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
405 ; CHECK-GISEL-NEXT:    s_endpgm
406   %tid = call i32 @llvm.amdgcn.workitem.id.x()
407   %gep.in = getelementptr <2 x double>, ptr addrspace(1) %in, i32 %tid
408   %args = load <2 x double>, ptr addrspace(1) %gep.in
409   %value = extractelement <2 x double> %args, i32 0
410   %lane = extractelement <2 x double> %args, i32 1
411   %lane_cast = bitcast double %lane to i64
412   %lane32 = trunc i64 %lane_cast to i32
413   %readlane = call double @llvm.amdgcn.readlane.f64(double %value, i32 %lane32)
414   store double %readlane, ptr addrspace(1) %out, align 4
415   ret void
418 define amdgpu_kernel void @test_readlane_m0_sreg(ptr addrspace(1) %out, i32 %src1) #1 {
419 ; CHECK-SDAG-LABEL: test_readlane_m0_sreg:
420 ; CHECK-SDAG:       ; %bb.0:
421 ; CHECK-SDAG-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0
422 ; CHECK-SDAG-NEXT:    ;;#ASMSTART
423 ; CHECK-SDAG-NEXT:    s_mov_b32 m0, -1
424 ; CHECK-SDAG-NEXT:    ;;#ASMEND
425 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v2, m0
426 ; CHECK-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
427 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v0, s0
428 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v1, s1
429 ; CHECK-SDAG-NEXT:    flat_store_dword v[0:1], v2
430 ; CHECK-SDAG-NEXT:    s_endpgm
432 ; CHECK-GISEL-LABEL: test_readlane_m0_sreg:
433 ; CHECK-GISEL:       ; %bb.0:
434 ; CHECK-GISEL-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0
435 ; CHECK-GISEL-NEXT:    ;;#ASMSTART
436 ; CHECK-GISEL-NEXT:    s_mov_b32 m0, -1
437 ; CHECK-GISEL-NEXT:    ;;#ASMEND
438 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v2, m0
439 ; CHECK-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
440 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v0, s0
441 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v1, s1
442 ; CHECK-GISEL-NEXT:    flat_store_dword v[0:1], v2
443 ; CHECK-GISEL-NEXT:    s_endpgm
444   %m0 = call i32 asm "s_mov_b32 m0, -1", "={m0}"()
445   %readlane = call i32 @llvm.amdgcn.readlane(i32 %m0, i32 %src1)
446   store i32 %readlane, ptr addrspace(1) %out, align 4
447   ret void
450 define amdgpu_kernel void @test_readlane_vgpr_imm_i32(ptr addrspace(1) %out) #1 {
451 ; CHECK-SDAG-LABEL: test_readlane_vgpr_imm_i32:
452 ; CHECK-SDAG:       ; %bb.0:
453 ; CHECK-SDAG-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0
454 ; CHECK-SDAG-NEXT:    ;;#ASMSTART
455 ; CHECK-SDAG-NEXT:    ; def v0
456 ; CHECK-SDAG-NEXT:    ;;#ASMEND
457 ; CHECK-SDAG-NEXT:    v_readlane_b32 s2, v0, 32
458 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v2, s2
459 ; CHECK-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
460 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v0, s0
461 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v1, s1
462 ; CHECK-SDAG-NEXT:    flat_store_dword v[0:1], v2
463 ; CHECK-SDAG-NEXT:    s_endpgm
465 ; CHECK-GISEL-LABEL: test_readlane_vgpr_imm_i32:
466 ; CHECK-GISEL:       ; %bb.0:
467 ; CHECK-GISEL-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0
468 ; CHECK-GISEL-NEXT:    ;;#ASMSTART
469 ; CHECK-GISEL-NEXT:    ; def v0
470 ; CHECK-GISEL-NEXT:    ;;#ASMEND
471 ; CHECK-GISEL-NEXT:    v_readlane_b32 s2, v0, 32
472 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v2, s2
473 ; CHECK-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
474 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v0, s0
475 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v1, s1
476 ; CHECK-GISEL-NEXT:    flat_store_dword v[0:1], v2
477 ; CHECK-GISEL-NEXT:    s_endpgm
478   %vgpr = call i32 asm sideeffect "; def $0", "=v"()
479   %readlane = call i32 @llvm.amdgcn.readlane.i32(i32 %vgpr, i32 32) #0
480   store i32 %readlane, ptr addrspace(1) %out, align 4
481   ret void
484 define amdgpu_kernel void @test_readlane_vgpr_imm_i64(ptr addrspace(1) %out) #1 {
485 ; CHECK-SDAG-LABEL: test_readlane_vgpr_imm_i64:
486 ; CHECK-SDAG:       ; %bb.0:
487 ; CHECK-SDAG-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0
488 ; CHECK-SDAG-NEXT:    ;;#ASMSTART
489 ; CHECK-SDAG-NEXT:    ; def v[0:1]
490 ; CHECK-SDAG-NEXT:    ;;#ASMEND
491 ; CHECK-SDAG-NEXT:    v_readlane_b32 s2, v1, 32
492 ; CHECK-SDAG-NEXT:    v_readlane_b32 s3, v0, 32
493 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v0, s3
494 ; CHECK-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
495 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v3, s1
496 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v1, s2
497 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v2, s0
498 ; CHECK-SDAG-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
499 ; CHECK-SDAG-NEXT:    s_endpgm
501 ; CHECK-GISEL-LABEL: test_readlane_vgpr_imm_i64:
502 ; CHECK-GISEL:       ; %bb.0:
503 ; CHECK-GISEL-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0
504 ; CHECK-GISEL-NEXT:    ;;#ASMSTART
505 ; CHECK-GISEL-NEXT:    ; def v[0:1]
506 ; CHECK-GISEL-NEXT:    ;;#ASMEND
507 ; CHECK-GISEL-NEXT:    v_readlane_b32 s2, v0, 32
508 ; CHECK-GISEL-NEXT:    v_readlane_b32 s3, v1, 32
509 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v0, s2
510 ; CHECK-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
511 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v3, s1
512 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v1, s3
513 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v2, s0
514 ; CHECK-GISEL-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
515 ; CHECK-GISEL-NEXT:    s_endpgm
516   %vgpr = call i64 asm sideeffect "; def $0", "=v"()
517   %readlane = call i64 @llvm.amdgcn.readlane.i64(i64 %vgpr, i32 32) #0
518   store i64 %readlane, ptr addrspace(1) %out, align 4
519   ret void
522 define amdgpu_kernel void @test_readlane_vgpr_imm_f64(ptr addrspace(1) %out) #1 {
523 ; CHECK-SDAG-LABEL: test_readlane_vgpr_imm_f64:
524 ; CHECK-SDAG:       ; %bb.0:
525 ; CHECK-SDAG-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0
526 ; CHECK-SDAG-NEXT:    ;;#ASMSTART
527 ; CHECK-SDAG-NEXT:    ; def v[0:1]
528 ; CHECK-SDAG-NEXT:    ;;#ASMEND
529 ; CHECK-SDAG-NEXT:    v_readlane_b32 s2, v1, 32
530 ; CHECK-SDAG-NEXT:    v_readlane_b32 s3, v0, 32
531 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v0, s3
532 ; CHECK-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
533 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v3, s1
534 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v1, s2
535 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v2, s0
536 ; CHECK-SDAG-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
537 ; CHECK-SDAG-NEXT:    s_endpgm
539 ; CHECK-GISEL-LABEL: test_readlane_vgpr_imm_f64:
540 ; CHECK-GISEL:       ; %bb.0:
541 ; CHECK-GISEL-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0
542 ; CHECK-GISEL-NEXT:    ;;#ASMSTART
543 ; CHECK-GISEL-NEXT:    ; def v[0:1]
544 ; CHECK-GISEL-NEXT:    ;;#ASMEND
545 ; CHECK-GISEL-NEXT:    v_readlane_b32 s2, v0, 32
546 ; CHECK-GISEL-NEXT:    v_readlane_b32 s3, v1, 32
547 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v0, s2
548 ; CHECK-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
549 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v3, s1
550 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v1, s3
551 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v2, s0
552 ; CHECK-GISEL-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
553 ; CHECK-GISEL-NEXT:    s_endpgm
554   %vgpr = call double asm sideeffect "; def $0", "=v"()
555   %readlane = call double @llvm.amdgcn.readlane.f64(double %vgpr, i32 32) #0
556   store double %readlane, ptr addrspace(1) %out, align 4
557   ret void
560 define amdgpu_kernel void @test_readlane_copy_from_sgpr_i32(ptr addrspace(1) %out) #1 {
561 ; CHECK-SDAG-LABEL: test_readlane_copy_from_sgpr_i32:
562 ; CHECK-SDAG:       ; %bb.0:
563 ; CHECK-SDAG-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0
564 ; CHECK-SDAG-NEXT:    ;;#ASMSTART
565 ; CHECK-SDAG-NEXT:    s_mov_b32 s2, 0
566 ; CHECK-SDAG-NEXT:    ;;#ASMEND
567 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v2, s2
568 ; CHECK-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
569 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v0, s0
570 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v1, s1
571 ; CHECK-SDAG-NEXT:    flat_store_dword v[0:1], v2
572 ; CHECK-SDAG-NEXT:    s_endpgm
574 ; CHECK-GISEL-LABEL: test_readlane_copy_from_sgpr_i32:
575 ; CHECK-GISEL:       ; %bb.0:
576 ; CHECK-GISEL-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0
577 ; CHECK-GISEL-NEXT:    ;;#ASMSTART
578 ; CHECK-GISEL-NEXT:    s_mov_b32 s2, 0
579 ; CHECK-GISEL-NEXT:    ;;#ASMEND
580 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v2, s2
581 ; CHECK-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
582 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v0, s0
583 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v1, s1
584 ; CHECK-GISEL-NEXT:    flat_store_dword v[0:1], v2
585 ; CHECK-GISEL-NEXT:    s_endpgm
586   %sgpr = call i32 asm "s_mov_b32 $0, 0", "=s"()
587   %readfirstlane = call i32 @llvm.amdgcn.readlane.i32(i32 %sgpr, i32 7)
588   store i32 %readfirstlane, ptr addrspace(1) %out, align 4
589   ret void
592 define amdgpu_kernel void @test_readlane_copy_from_sgpr_i64(ptr addrspace(1) %out) #1 {
593 ; CHECK-SDAG-LABEL: test_readlane_copy_from_sgpr_i64:
594 ; CHECK-SDAG:       ; %bb.0:
595 ; CHECK-SDAG-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0
596 ; CHECK-SDAG-NEXT:    ;;#ASMSTART
597 ; CHECK-SDAG-NEXT:    s_mov_b64 s[2:3], 0
598 ; CHECK-SDAG-NEXT:    ;;#ASMEND
599 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v0, s2
600 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v1, s3
601 ; CHECK-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
602 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v3, s1
603 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v2, s0
604 ; CHECK-SDAG-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
605 ; CHECK-SDAG-NEXT:    s_endpgm
607 ; CHECK-GISEL-LABEL: test_readlane_copy_from_sgpr_i64:
608 ; CHECK-GISEL:       ; %bb.0:
609 ; CHECK-GISEL-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0
610 ; CHECK-GISEL-NEXT:    ;;#ASMSTART
611 ; CHECK-GISEL-NEXT:    s_mov_b64 s[2:3], 0
612 ; CHECK-GISEL-NEXT:    ;;#ASMEND
613 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v0, s2
614 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v1, s3
615 ; CHECK-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
616 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v3, s1
617 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v2, s0
618 ; CHECK-GISEL-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
619 ; CHECK-GISEL-NEXT:    s_endpgm
620   %sgpr = call i64 asm "s_mov_b64 $0, 0", "=s"()
621   %readfirstlane = call i64 @llvm.amdgcn.readlane.i64(i64 %sgpr, i32 7)
622   store i64 %readfirstlane, ptr addrspace(1) %out, align 4
623   ret void
626 define amdgpu_kernel void @test_readlane_copy_from_sgpr_f64(ptr addrspace(1) %out) #1 {
627 ; CHECK-SDAG-LABEL: test_readlane_copy_from_sgpr_f64:
628 ; CHECK-SDAG:       ; %bb.0:
629 ; CHECK-SDAG-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0
630 ; CHECK-SDAG-NEXT:    ;;#ASMSTART
631 ; CHECK-SDAG-NEXT:    s_mov_b64 s[2:3], 0
632 ; CHECK-SDAG-NEXT:    ;;#ASMEND
633 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v0, s2
634 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v1, s3
635 ; CHECK-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
636 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v3, s1
637 ; CHECK-SDAG-NEXT:    v_mov_b32_e32 v2, s0
638 ; CHECK-SDAG-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
639 ; CHECK-SDAG-NEXT:    s_endpgm
641 ; CHECK-GISEL-LABEL: test_readlane_copy_from_sgpr_f64:
642 ; CHECK-GISEL:       ; %bb.0:
643 ; CHECK-GISEL-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0
644 ; CHECK-GISEL-NEXT:    ;;#ASMSTART
645 ; CHECK-GISEL-NEXT:    s_mov_b64 s[2:3], 0
646 ; CHECK-GISEL-NEXT:    ;;#ASMEND
647 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v0, s2
648 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v1, s3
649 ; CHECK-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
650 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v3, s1
651 ; CHECK-GISEL-NEXT:    v_mov_b32_e32 v2, s0
652 ; CHECK-GISEL-NEXT:    flat_store_dwordx2 v[2:3], v[0:1]
653 ; CHECK-GISEL-NEXT:    s_endpgm
654   %sgpr = call double asm "s_mov_b64 $0, 0", "=s"()
655   %readfirstlane = call double @llvm.amdgcn.readlane.f64(double %sgpr, i32 7)
656   store double %readfirstlane, ptr addrspace(1) %out, align 4
657   ret void
660 define void @test_readlane_half(ptr addrspace(1) %out, half %src, i32 %src1) {
661 ; CHECK-SDAG-LABEL: test_readlane_half:
662 ; CHECK-SDAG:       ; %bb.0:
663 ; CHECK-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
664 ; CHECK-SDAG-NEXT:    v_readfirstlane_b32 s4, v3
665 ; CHECK-SDAG-NEXT:    s_nop 3
666 ; CHECK-SDAG-NEXT:    v_readlane_b32 s4, v2, s4
667 ; CHECK-SDAG-NEXT:    ;;#ASMSTART
668 ; CHECK-SDAG-NEXT:    ; use s4
669 ; CHECK-SDAG-NEXT:    ;;#ASMEND
670 ; CHECK-SDAG-NEXT:    s_setpc_b64 s[30:31]
672 ; CHECK-GISEL-LABEL: test_readlane_half:
673 ; CHECK-GISEL:       ; %bb.0:
674 ; CHECK-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
675 ; CHECK-GISEL-NEXT:    v_readfirstlane_b32 s4, v3
676 ; CHECK-GISEL-NEXT:    s_nop 3
677 ; CHECK-GISEL-NEXT:    v_readlane_b32 s4, v2, s4
678 ; CHECK-GISEL-NEXT:    ;;#ASMSTART
679 ; CHECK-GISEL-NEXT:    ; use s4
680 ; CHECK-GISEL-NEXT:    ;;#ASMEND
681 ; CHECK-GISEL-NEXT:    s_setpc_b64 s[30:31]
682   %x = call half @llvm.amdgcn.readlane.f16(half %src, i32 %src1)
683   call void asm sideeffect "; use $0", "s"(half %x)
684   ret void
687 define void @test_readlane_float(ptr addrspace(1) %out, float %src, i32 %src1) {
688 ; CHECK-SDAG-LABEL: test_readlane_float:
689 ; CHECK-SDAG:       ; %bb.0:
690 ; CHECK-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
691 ; CHECK-SDAG-NEXT:    v_readfirstlane_b32 s4, v3
692 ; CHECK-SDAG-NEXT:    s_nop 3
693 ; CHECK-SDAG-NEXT:    v_readlane_b32 s4, v2, s4
694 ; CHECK-SDAG-NEXT:    ;;#ASMSTART
695 ; CHECK-SDAG-NEXT:    ; use s4
696 ; CHECK-SDAG-NEXT:    ;;#ASMEND
697 ; CHECK-SDAG-NEXT:    s_setpc_b64 s[30:31]
699 ; CHECK-GISEL-LABEL: test_readlane_float:
700 ; CHECK-GISEL:       ; %bb.0:
701 ; CHECK-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
702 ; CHECK-GISEL-NEXT:    v_readfirstlane_b32 s4, v3
703 ; CHECK-GISEL-NEXT:    s_nop 3
704 ; CHECK-GISEL-NEXT:    v_readlane_b32 s4, v2, s4
705 ; CHECK-GISEL-NEXT:    ;;#ASMSTART
706 ; CHECK-GISEL-NEXT:    ; use s4
707 ; CHECK-GISEL-NEXT:    ;;#ASMEND
708 ; CHECK-GISEL-NEXT:    s_setpc_b64 s[30:31]
709   %x = call float @llvm.amdgcn.readlane.f32(float %src, i32 %src1)
710   call void asm sideeffect "; use $0", "s"(float %x)
711   ret void
714 define void @test_readlane_bfloat(ptr addrspace(1) %out, bfloat %src, i32 %src1) {
715 ; CHECK-SDAG-LABEL: test_readlane_bfloat:
716 ; CHECK-SDAG:       ; %bb.0:
717 ; CHECK-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
718 ; CHECK-SDAG-NEXT:    v_readfirstlane_b32 s4, v3
719 ; CHECK-SDAG-NEXT:    s_nop 3
720 ; CHECK-SDAG-NEXT:    v_readlane_b32 s4, v2, s4
721 ; CHECK-SDAG-NEXT:    ;;#ASMSTART
722 ; CHECK-SDAG-NEXT:    ; use s4
723 ; CHECK-SDAG-NEXT:    ;;#ASMEND
724 ; CHECK-SDAG-NEXT:    s_setpc_b64 s[30:31]
726 ; CHECK-GISEL-LABEL: test_readlane_bfloat:
727 ; CHECK-GISEL:       ; %bb.0:
728 ; CHECK-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
729 ; CHECK-GISEL-NEXT:    v_readfirstlane_b32 s4, v3
730 ; CHECK-GISEL-NEXT:    s_nop 3
731 ; CHECK-GISEL-NEXT:    v_readlane_b32 s4, v2, s4
732 ; CHECK-GISEL-NEXT:    ;;#ASMSTART
733 ; CHECK-GISEL-NEXT:    ; use s4
734 ; CHECK-GISEL-NEXT:    ;;#ASMEND
735 ; CHECK-GISEL-NEXT:    s_setpc_b64 s[30:31]
736   %x = call bfloat @llvm.amdgcn.readlane.bf16(bfloat %src, i32 %src1)
737   call void asm sideeffect "; use $0", "s"(bfloat %x)
738   ret void
741 define void @test_readlane_i16(ptr addrspace(1) %out, i16 %src, i32 %src1) {
742 ; CHECK-SDAG-LABEL: test_readlane_i16:
743 ; CHECK-SDAG:       ; %bb.0:
744 ; CHECK-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
745 ; CHECK-SDAG-NEXT:    v_readfirstlane_b32 s4, v3
746 ; CHECK-SDAG-NEXT:    s_nop 3
747 ; CHECK-SDAG-NEXT:    v_readlane_b32 s4, v2, s4
748 ; CHECK-SDAG-NEXT:    s_and_b32 s4, s4, 0xffff
749 ; CHECK-SDAG-NEXT:    ;;#ASMSTART
750 ; CHECK-SDAG-NEXT:    ; use s4
751 ; CHECK-SDAG-NEXT:    ;;#ASMEND
752 ; CHECK-SDAG-NEXT:    s_setpc_b64 s[30:31]
754 ; CHECK-GISEL-LABEL: test_readlane_i16:
755 ; CHECK-GISEL:       ; %bb.0:
756 ; CHECK-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
757 ; CHECK-GISEL-NEXT:    v_readfirstlane_b32 s4, v3
758 ; CHECK-GISEL-NEXT:    s_nop 3
759 ; CHECK-GISEL-NEXT:    v_readlane_b32 s4, v2, s4
760 ; CHECK-GISEL-NEXT:    ;;#ASMSTART
761 ; CHECK-GISEL-NEXT:    ; use s4
762 ; CHECK-GISEL-NEXT:    ;;#ASMEND
763 ; CHECK-GISEL-NEXT:    s_setpc_b64 s[30:31]
764   %x = call i16 @llvm.amdgcn.readlane.i16(i16 %src, i32 %src1)
765   call void asm sideeffect "; use $0", "s"(i16 %x)
766   ret void
769 define void @test_readlane_v2f16(ptr addrspace(1) %out, <2 x half> %src, i32 %src1) {
770 ; CHECK-SDAG-LABEL: test_readlane_v2f16:
771 ; CHECK-SDAG:       ; %bb.0:
772 ; CHECK-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
773 ; CHECK-SDAG-NEXT:    v_readfirstlane_b32 s4, v3
774 ; CHECK-SDAG-NEXT:    s_nop 3
775 ; CHECK-SDAG-NEXT:    v_readlane_b32 s4, v2, s4
776 ; CHECK-SDAG-NEXT:    ;;#ASMSTART
777 ; CHECK-SDAG-NEXT:    ; use s4
778 ; CHECK-SDAG-NEXT:    ;;#ASMEND
779 ; CHECK-SDAG-NEXT:    s_setpc_b64 s[30:31]
781 ; CHECK-GISEL-LABEL: test_readlane_v2f16:
782 ; CHECK-GISEL:       ; %bb.0:
783 ; CHECK-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
784 ; CHECK-GISEL-NEXT:    v_readfirstlane_b32 s4, v3
785 ; CHECK-GISEL-NEXT:    s_nop 3
786 ; CHECK-GISEL-NEXT:    v_readlane_b32 s4, v2, s4
787 ; CHECK-GISEL-NEXT:    ;;#ASMSTART
788 ; CHECK-GISEL-NEXT:    ; use s4
789 ; CHECK-GISEL-NEXT:    ;;#ASMEND
790 ; CHECK-GISEL-NEXT:    s_setpc_b64 s[30:31]
791   %x = call <2 x half> @llvm.amdgcn.readlane.v2f16(<2 x half> %src, i32 %src1)
792   call void asm sideeffect "; use $0", "s"(<2 x half> %x)
793   ret void
796 define void @test_readlane_v2f32(ptr addrspace(1) %out, <2 x float> %src, i32 %src1) {
797 ; CHECK-SDAG-LABEL: test_readlane_v2f32:
798 ; CHECK-SDAG:       ; %bb.0:
799 ; CHECK-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
800 ; CHECK-SDAG-NEXT:    v_readfirstlane_b32 s4, v4
801 ; CHECK-SDAG-NEXT:    s_nop 3
802 ; CHECK-SDAG-NEXT:    v_readlane_b32 s5, v3, s4
803 ; CHECK-SDAG-NEXT:    v_readlane_b32 s4, v2, s4
804 ; CHECK-SDAG-NEXT:    ;;#ASMSTART
805 ; CHECK-SDAG-NEXT:    ; use s[4:5]
806 ; CHECK-SDAG-NEXT:    ;;#ASMEND
807 ; CHECK-SDAG-NEXT:    s_setpc_b64 s[30:31]
809 ; CHECK-GISEL-LABEL: test_readlane_v2f32:
810 ; CHECK-GISEL:       ; %bb.0:
811 ; CHECK-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
812 ; CHECK-GISEL-NEXT:    v_readfirstlane_b32 s5, v4
813 ; CHECK-GISEL-NEXT:    s_nop 3
814 ; CHECK-GISEL-NEXT:    v_readlane_b32 s4, v2, s5
815 ; CHECK-GISEL-NEXT:    v_readlane_b32 s5, v3, s5
816 ; CHECK-GISEL-NEXT:    ;;#ASMSTART
817 ; CHECK-GISEL-NEXT:    ; use s[4:5]
818 ; CHECK-GISEL-NEXT:    ;;#ASMEND
819 ; CHECK-GISEL-NEXT:    s_setpc_b64 s[30:31]
820   %x = call <2 x float> @llvm.amdgcn.readlane.v2f32(<2 x float> %src, i32 %src1)
821   call void asm sideeffect "; use $0", "s"(<2 x float> %x)
822   ret void
825 define void @test_readlane_v7i32(ptr addrspace(1) %out, <7 x i32> %src, i32 %src1) {
826 ; CHECK-SDAG-LABEL: test_readlane_v7i32:
827 ; CHECK-SDAG:       ; %bb.0:
828 ; CHECK-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
829 ; CHECK-SDAG-NEXT:    v_readfirstlane_b32 s4, v9
830 ; CHECK-SDAG-NEXT:    s_nop 3
831 ; CHECK-SDAG-NEXT:    v_readlane_b32 s10, v8, s4
832 ; CHECK-SDAG-NEXT:    v_readlane_b32 s9, v7, s4
833 ; CHECK-SDAG-NEXT:    v_readlane_b32 s8, v6, s4
834 ; CHECK-SDAG-NEXT:    v_readlane_b32 s7, v5, s4
835 ; CHECK-SDAG-NEXT:    v_readlane_b32 s6, v4, s4
836 ; CHECK-SDAG-NEXT:    v_readlane_b32 s5, v3, s4
837 ; CHECK-SDAG-NEXT:    v_readlane_b32 s4, v2, s4
838 ; CHECK-SDAG-NEXT:    ;;#ASMSTART
839 ; CHECK-SDAG-NEXT:    ; use s[4:10]
840 ; CHECK-SDAG-NEXT:    ;;#ASMEND
841 ; CHECK-SDAG-NEXT:    s_setpc_b64 s[30:31]
843 ; CHECK-GISEL-LABEL: test_readlane_v7i32:
844 ; CHECK-GISEL:       ; %bb.0:
845 ; CHECK-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
846 ; CHECK-GISEL-NEXT:    v_readfirstlane_b32 s10, v9
847 ; CHECK-GISEL-NEXT:    s_nop 3
848 ; CHECK-GISEL-NEXT:    v_readlane_b32 s4, v2, s10
849 ; CHECK-GISEL-NEXT:    v_readlane_b32 s5, v3, s10
850 ; CHECK-GISEL-NEXT:    v_readlane_b32 s6, v4, s10
851 ; CHECK-GISEL-NEXT:    v_readlane_b32 s7, v5, s10
852 ; CHECK-GISEL-NEXT:    v_readlane_b32 s8, v6, s10
853 ; CHECK-GISEL-NEXT:    v_readlane_b32 s9, v7, s10
854 ; CHECK-GISEL-NEXT:    v_readlane_b32 s10, v8, s10
855 ; CHECK-GISEL-NEXT:    ;;#ASMSTART
856 ; CHECK-GISEL-NEXT:    ; use s[4:10]
857 ; CHECK-GISEL-NEXT:    ;;#ASMEND
858 ; CHECK-GISEL-NEXT:    s_setpc_b64 s[30:31]
859   %x = call <7 x i32> @llvm.amdgcn.readlane.v7i32(<7 x i32> %src, i32 %src1)
860   call void asm sideeffect "; use $0", "s"(<7 x i32> %x)
861   ret void
864 define void @test_readlane_v8i16(ptr addrspace(1) %out, <8 x i16> %src, i32 %src1) {
865 ; CHECK-SDAG-LABEL: test_readlane_v8i16:
866 ; CHECK-SDAG:       ; %bb.0:
867 ; CHECK-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
868 ; CHECK-SDAG-NEXT:    v_readfirstlane_b32 s4, v6
869 ; CHECK-SDAG-NEXT:    s_nop 3
870 ; CHECK-SDAG-NEXT:    v_readlane_b32 s7, v5, s4
871 ; CHECK-SDAG-NEXT:    v_readlane_b32 s6, v4, s4
872 ; CHECK-SDAG-NEXT:    v_readlane_b32 s5, v3, s4
873 ; CHECK-SDAG-NEXT:    v_readlane_b32 s4, v2, s4
874 ; CHECK-SDAG-NEXT:    ;;#ASMSTART
875 ; CHECK-SDAG-NEXT:    ; use s[4:7]
876 ; CHECK-SDAG-NEXT:    ;;#ASMEND
877 ; CHECK-SDAG-NEXT:    s_setpc_b64 s[30:31]
879 ; CHECK-GISEL-LABEL: test_readlane_v8i16:
880 ; CHECK-GISEL:       ; %bb.0:
881 ; CHECK-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
882 ; CHECK-GISEL-NEXT:    v_readfirstlane_b32 s7, v6
883 ; CHECK-GISEL-NEXT:    s_nop 3
884 ; CHECK-GISEL-NEXT:    v_readlane_b32 s4, v2, s7
885 ; CHECK-GISEL-NEXT:    v_readlane_b32 s5, v3, s7
886 ; CHECK-GISEL-NEXT:    v_readlane_b32 s6, v4, s7
887 ; CHECK-GISEL-NEXT:    v_readlane_b32 s7, v5, s7
888 ; CHECK-GISEL-NEXT:    ;;#ASMSTART
889 ; CHECK-GISEL-NEXT:    ; use s[4:7]
890 ; CHECK-GISEL-NEXT:    ;;#ASMEND
891 ; CHECK-GISEL-NEXT:    s_setpc_b64 s[30:31]
892   %x = call <8 x i16> @llvm.amdgcn.readlane.v8i16(<8 x i16> %src, i32 %src1)
893   call void asm sideeffect "; use $0", "s"(<8 x i16> %x)
894   ret void
897 declare i32 @llvm.amdgcn.workitem.id.x() #2
899 attributes #0 = { nounwind readnone convergent }
900 attributes #1 = { nounwind }
901 attributes #2 = { nounwind readnone }