Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / GlobalISel / llvm.amdgcn.update.dpp.ll
blob1e8209bd3fc6b902656627668a092a36f9300abf
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -global-isel -mtriple=amdgcn -mcpu=tonga -amdgpu-dpp-combine=false -verify-machineinstrs < %s | FileCheck -check-prefix=GFX8 %s
3 ; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx1010 -amdgpu-dpp-combine=false -verify-machineinstrs < %s | FileCheck -check-prefix=GFX10 %s
4 ; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx1100 -amdgpu-enable-delay-alu=0 -amdgpu-dpp-combine=false -verify-machineinstrs < %s | FileCheck -check-prefix=GFX11 %s
6 define amdgpu_kernel void @dpp_test(ptr addrspace(1) %out, i32 %in1, i32 %in2) {
7 ; GFX8-LABEL: dpp_test:
8 ; GFX8:       ; %bb.0:
9 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
10 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
11 ; GFX8-NEXT:    v_mov_b32_e32 v2, s2
12 ; GFX8-NEXT:    v_mov_b32_e32 v0, s3
13 ; GFX8-NEXT:    s_nop 1
14 ; GFX8-NEXT:    v_mov_b32_dpp v2, v0 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
15 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
16 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
17 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
18 ; GFX8-NEXT:    s_endpgm
20 ; GFX10-LABEL: dpp_test:
21 ; GFX10:       ; %bb.0:
22 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
23 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
24 ; GFX10-NEXT:    v_mov_b32_e32 v0, s6
25 ; GFX10-NEXT:    v_mov_b32_e32 v1, s7
26 ; GFX10-NEXT:    v_mov_b32_dpp v0, v1 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
27 ; GFX10-NEXT:    v_mov_b32_e32 v1, 0
28 ; GFX10-NEXT:    global_store_dword v1, v0, s[4:5]
29 ; GFX10-NEXT:    s_endpgm
31 ; GFX11-LABEL: dpp_test:
32 ; GFX11:       ; %bb.0:
33 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
34 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
35 ; GFX11-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
36 ; GFX11-NEXT:    v_mov_b32_dpp v0, v1 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
37 ; GFX11-NEXT:    v_mov_b32_e32 v1, 0
38 ; GFX11-NEXT:    global_store_b32 v1, v0, s[0:1]
39 ; GFX11-NEXT:    s_nop 0
40 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
41 ; GFX11-NEXT:    s_endpgm
42   %tmp0 = call i32 @llvm.amdgcn.update.dpp.i32(i32 %in1, i32 %in2, i32 1, i32 1, i32 1, i1 false)
43   store i32 %tmp0, ptr addrspace(1) %out
44   ret void
46 define amdgpu_kernel void @update_dppi64_test(ptr addrspace(1) %arg, i64 %in1, i64 %in2) {
47 ; GFX8-LABEL: update_dppi64_test:
48 ; GFX8:       ; %bb.0:
49 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
50 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
51 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
52 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
53 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
54 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
55 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
56 ; GFX8-NEXT:    flat_load_dwordx2 v[2:3], v[0:1]
57 ; GFX8-NEXT:    v_mov_b32_e32 v5, s3
58 ; GFX8-NEXT:    v_mov_b32_e32 v4, s2
59 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
60 ; GFX8-NEXT:    v_mov_b32_dpp v5, v3 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
61 ; GFX8-NEXT:    v_mov_b32_dpp v4, v2 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
62 ; GFX8-NEXT:    flat_store_dwordx2 v[0:1], v[4:5]
63 ; GFX8-NEXT:    s_endpgm
65 ; GFX10-LABEL: update_dppi64_test:
66 ; GFX10:       ; %bb.0:
67 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
68 ; GFX10-NEXT:    v_lshlrev_b32_e32 v4, 3, v0
69 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
70 ; GFX10-NEXT:    global_load_dwordx2 v[0:1], v4, s[4:5]
71 ; GFX10-NEXT:    v_mov_b32_e32 v2, s6
72 ; GFX10-NEXT:    v_mov_b32_e32 v3, s7
73 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
74 ; GFX10-NEXT:    v_mov_b32_dpp v2, v0 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
75 ; GFX10-NEXT:    v_mov_b32_dpp v3, v1 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
76 ; GFX10-NEXT:    global_store_dwordx2 v4, v[2:3], s[4:5]
77 ; GFX10-NEXT:    s_endpgm
79 ; GFX11-LABEL: update_dppi64_test:
80 ; GFX11:       ; %bb.0:
81 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
82 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
83 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
84 ; GFX11-NEXT:    v_dual_mov_b32 v2, s2 :: v_dual_mov_b32 v3, s3
85 ; GFX11-NEXT:    v_lshlrev_b32_e32 v4, 3, v0
86 ; GFX11-NEXT:    global_load_b64 v[0:1], v4, s[0:1]
87 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
88 ; GFX11-NEXT:    v_mov_b32_dpp v2, v0 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
89 ; GFX11-NEXT:    v_mov_b32_dpp v3, v1 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
90 ; GFX11-NEXT:    global_store_b64 v4, v[2:3], s[0:1]
91 ; GFX11-NEXT:    s_nop 0
92 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
93 ; GFX11-NEXT:    s_endpgm
94   %id = tail call i32 @llvm.amdgcn.workitem.id.x()
95   %gep = getelementptr inbounds i64, ptr addrspace(1) %arg, i32 %id
96   %load = load i64, ptr addrspace(1) %gep
97   %tmp0 = call i64 @llvm.amdgcn.update.dpp.i64(i64 %in1, i64 %load, i32 1, i32 1, i32 1, i1 false) #1
98   store i64 %tmp0, ptr addrspace(1) %gep
99   ret void
102 define amdgpu_kernel void @update_dppf64_test(ptr addrspace(1) %arg, double %in1, double %in2) {
103 ; GFX8-LABEL: update_dppf64_test:
104 ; GFX8:       ; %bb.0:
105 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
106 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
107 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
108 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
109 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
110 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
111 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
112 ; GFX8-NEXT:    flat_load_dwordx2 v[2:3], v[0:1]
113 ; GFX8-NEXT:    v_mov_b32_e32 v5, s3
114 ; GFX8-NEXT:    v_mov_b32_e32 v4, s2
115 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
116 ; GFX8-NEXT:    v_mov_b32_dpp v5, v3 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
117 ; GFX8-NEXT:    v_mov_b32_dpp v4, v2 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
118 ; GFX8-NEXT:    flat_store_dwordx2 v[0:1], v[4:5]
119 ; GFX8-NEXT:    s_endpgm
121 ; GFX10-LABEL: update_dppf64_test:
122 ; GFX10:       ; %bb.0:
123 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
124 ; GFX10-NEXT:    v_lshlrev_b32_e32 v4, 3, v0
125 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
126 ; GFX10-NEXT:    global_load_dwordx2 v[0:1], v4, s[4:5]
127 ; GFX10-NEXT:    v_mov_b32_e32 v2, s6
128 ; GFX10-NEXT:    v_mov_b32_e32 v3, s7
129 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
130 ; GFX10-NEXT:    v_mov_b32_dpp v2, v0 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
131 ; GFX10-NEXT:    v_mov_b32_dpp v3, v1 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
132 ; GFX10-NEXT:    global_store_dwordx2 v4, v[2:3], s[4:5]
133 ; GFX10-NEXT:    s_endpgm
135 ; GFX11-LABEL: update_dppf64_test:
136 ; GFX11:       ; %bb.0:
137 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
138 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
139 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
140 ; GFX11-NEXT:    v_dual_mov_b32 v2, s2 :: v_dual_mov_b32 v3, s3
141 ; GFX11-NEXT:    v_lshlrev_b32_e32 v4, 3, v0
142 ; GFX11-NEXT:    global_load_b64 v[0:1], v4, s[0:1]
143 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
144 ; GFX11-NEXT:    v_mov_b32_dpp v2, v0 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
145 ; GFX11-NEXT:    v_mov_b32_dpp v3, v1 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
146 ; GFX11-NEXT:    global_store_b64 v4, v[2:3], s[0:1]
147 ; GFX11-NEXT:    s_nop 0
148 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
149 ; GFX11-NEXT:    s_endpgm
150   %id = tail call i32 @llvm.amdgcn.workitem.id.x()
151   %gep = getelementptr inbounds double, ptr addrspace(1) %arg, i32 %id
152   %load = load double, ptr addrspace(1) %gep
153   %tmp0 = call double @llvm.amdgcn.update.dpp.f64(double %in1, double %load, i32 1, i32 1, i32 1, i1 false) #1
154   store double %tmp0, ptr addrspace(1) %gep
155   ret void
158 define amdgpu_kernel void @update_dppv2i32_test(ptr addrspace(1) %arg, <2 x i32> %in1, <2 x i32> %in2) {
159 ; GFX8-LABEL: update_dppv2i32_test:
160 ; GFX8:       ; %bb.0:
161 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
162 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
163 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
164 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
165 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
166 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
167 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
168 ; GFX8-NEXT:    flat_load_dwordx2 v[2:3], v[0:1]
169 ; GFX8-NEXT:    v_mov_b32_e32 v5, s3
170 ; GFX8-NEXT:    v_mov_b32_e32 v4, s2
171 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
172 ; GFX8-NEXT:    v_mov_b32_dpp v5, v3 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
173 ; GFX8-NEXT:    v_mov_b32_dpp v4, v2 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
174 ; GFX8-NEXT:    flat_store_dwordx2 v[0:1], v[4:5]
175 ; GFX8-NEXT:    s_endpgm
177 ; GFX10-LABEL: update_dppv2i32_test:
178 ; GFX10:       ; %bb.0:
179 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
180 ; GFX10-NEXT:    v_lshlrev_b32_e32 v4, 3, v0
181 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
182 ; GFX10-NEXT:    global_load_dwordx2 v[0:1], v4, s[4:5]
183 ; GFX10-NEXT:    v_mov_b32_e32 v2, s6
184 ; GFX10-NEXT:    v_mov_b32_e32 v3, s7
185 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
186 ; GFX10-NEXT:    v_mov_b32_dpp v2, v0 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
187 ; GFX10-NEXT:    v_mov_b32_dpp v3, v1 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
188 ; GFX10-NEXT:    global_store_dwordx2 v4, v[2:3], s[4:5]
189 ; GFX10-NEXT:    s_endpgm
191 ; GFX11-LABEL: update_dppv2i32_test:
192 ; GFX11:       ; %bb.0:
193 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
194 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
195 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
196 ; GFX11-NEXT:    v_dual_mov_b32 v2, s2 :: v_dual_mov_b32 v3, s3
197 ; GFX11-NEXT:    v_lshlrev_b32_e32 v4, 3, v0
198 ; GFX11-NEXT:    global_load_b64 v[0:1], v4, s[0:1]
199 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
200 ; GFX11-NEXT:    v_mov_b32_dpp v2, v0 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
201 ; GFX11-NEXT:    v_mov_b32_dpp v3, v1 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
202 ; GFX11-NEXT:    global_store_b64 v4, v[2:3], s[0:1]
203 ; GFX11-NEXT:    s_nop 0
204 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
205 ; GFX11-NEXT:    s_endpgm
206   %id = tail call i32 @llvm.amdgcn.workitem.id.x()
207   %gep = getelementptr inbounds <2 x i32>, ptr addrspace(1) %arg, i32 %id
208   %load = load <2 x i32>, ptr addrspace(1) %gep
209   %tmp0 = call <2 x i32> @llvm.amdgcn.update.dpp.v2i32(<2 x i32> %in1, <2 x i32> %load, i32 1, i32 1, i32 1, i1 false) #1
210   store <2 x i32> %tmp0, ptr addrspace(1) %gep
211   ret void
214 define amdgpu_kernel void @update_dppv2f32_test(ptr addrspace(1) %arg, <2 x float> %in1, <2 x float> %in2) {
215 ; GFX8-LABEL: update_dppv2f32_test:
216 ; GFX8:       ; %bb.0:
217 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
218 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
219 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
220 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
221 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
222 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
223 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
224 ; GFX8-NEXT:    flat_load_dwordx2 v[2:3], v[0:1]
225 ; GFX8-NEXT:    v_mov_b32_e32 v5, s3
226 ; GFX8-NEXT:    v_mov_b32_e32 v4, s2
227 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
228 ; GFX8-NEXT:    v_mov_b32_dpp v5, v3 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
229 ; GFX8-NEXT:    v_mov_b32_dpp v4, v2 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
230 ; GFX8-NEXT:    flat_store_dwordx2 v[0:1], v[4:5]
231 ; GFX8-NEXT:    s_endpgm
233 ; GFX10-LABEL: update_dppv2f32_test:
234 ; GFX10:       ; %bb.0:
235 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
236 ; GFX10-NEXT:    v_lshlrev_b32_e32 v4, 3, v0
237 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
238 ; GFX10-NEXT:    global_load_dwordx2 v[0:1], v4, s[4:5]
239 ; GFX10-NEXT:    v_mov_b32_e32 v2, s6
240 ; GFX10-NEXT:    v_mov_b32_e32 v3, s7
241 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
242 ; GFX10-NEXT:    v_mov_b32_dpp v2, v0 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
243 ; GFX10-NEXT:    v_mov_b32_dpp v3, v1 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
244 ; GFX10-NEXT:    global_store_dwordx2 v4, v[2:3], s[4:5]
245 ; GFX10-NEXT:    s_endpgm
247 ; GFX11-LABEL: update_dppv2f32_test:
248 ; GFX11:       ; %bb.0:
249 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
250 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
251 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
252 ; GFX11-NEXT:    v_dual_mov_b32 v2, s2 :: v_dual_mov_b32 v3, s3
253 ; GFX11-NEXT:    v_lshlrev_b32_e32 v4, 3, v0
254 ; GFX11-NEXT:    global_load_b64 v[0:1], v4, s[0:1]
255 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
256 ; GFX11-NEXT:    v_mov_b32_dpp v2, v0 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
257 ; GFX11-NEXT:    v_mov_b32_dpp v3, v1 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
258 ; GFX11-NEXT:    global_store_b64 v4, v[2:3], s[0:1]
259 ; GFX11-NEXT:    s_nop 0
260 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
261 ; GFX11-NEXT:    s_endpgm
262   %id = tail call i32 @llvm.amdgcn.workitem.id.x()
263   %gep = getelementptr inbounds <2 x float>, ptr addrspace(1) %arg, i32 %id
264   %load = load <2 x float>, ptr addrspace(1) %gep
265   %tmp0 = call <2 x float> @llvm.amdgcn.update.dpp.v2f32(<2 x float> %in1, <2 x float> %load, i32 1, i32 1, i32 1, i1 false) #1
266   store <2 x float> %tmp0, ptr addrspace(1) %gep
267   ret void
270 define amdgpu_kernel void @update_dpp_p0_test(ptr addrspace(1) %arg, ptr %in1, ptr %in2) {
271 ; GFX8-LABEL: update_dpp_p0_test:
272 ; GFX8:       ; %bb.0:
273 ; GFX8-NEXT:    s_load_dwordx4 s[0:3], s[2:3], 0x24
274 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
275 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
276 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
277 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
278 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, v0, v2
279 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
280 ; GFX8-NEXT:    flat_load_dwordx2 v[2:3], v[0:1]
281 ; GFX8-NEXT:    v_mov_b32_e32 v5, s3
282 ; GFX8-NEXT:    v_mov_b32_e32 v4, s2
283 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
284 ; GFX8-NEXT:    v_mov_b32_dpp v5, v3 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
285 ; GFX8-NEXT:    v_mov_b32_dpp v4, v2 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
286 ; GFX8-NEXT:    flat_store_dwordx2 v[0:1], v[4:5]
287 ; GFX8-NEXT:    s_endpgm
289 ; GFX10-LABEL: update_dpp_p0_test:
290 ; GFX10:       ; %bb.0:
291 ; GFX10-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
292 ; GFX10-NEXT:    v_lshlrev_b32_e32 v4, 3, v0
293 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
294 ; GFX10-NEXT:    global_load_dwordx2 v[0:1], v4, s[4:5]
295 ; GFX10-NEXT:    v_mov_b32_e32 v2, s6
296 ; GFX10-NEXT:    v_mov_b32_e32 v3, s7
297 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
298 ; GFX10-NEXT:    v_mov_b32_dpp v2, v0 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
299 ; GFX10-NEXT:    v_mov_b32_dpp v3, v1 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
300 ; GFX10-NEXT:    global_store_dwordx2 v4, v[2:3], s[4:5]
301 ; GFX10-NEXT:    s_endpgm
303 ; GFX11-LABEL: update_dpp_p0_test:
304 ; GFX11:       ; %bb.0:
305 ; GFX11-NEXT:    s_load_b128 s[0:3], s[2:3], 0x24
306 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
307 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
308 ; GFX11-NEXT:    v_dual_mov_b32 v2, s2 :: v_dual_mov_b32 v3, s3
309 ; GFX11-NEXT:    v_lshlrev_b32_e32 v4, 3, v0
310 ; GFX11-NEXT:    global_load_b64 v[0:1], v4, s[0:1]
311 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
312 ; GFX11-NEXT:    v_mov_b32_dpp v2, v0 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
313 ; GFX11-NEXT:    v_mov_b32_dpp v3, v1 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
314 ; GFX11-NEXT:    global_store_b64 v4, v[2:3], s[0:1]
315 ; GFX11-NEXT:    s_nop 0
316 ; GFX11-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
317 ; GFX11-NEXT:    s_endpgm
318   %id = tail call i32 @llvm.amdgcn.workitem.id.x()
319   %gep = getelementptr inbounds ptr, ptr addrspace(1) %arg, i32 %id
320   %load = load ptr, ptr addrspace(1) %gep
321   %tmp0 = call ptr @llvm.amdgcn.update.dpp.v2f32(ptr %in1, ptr %load, i32 1, i32 1, i32 1, i1 false) #1
322   store ptr %tmp0, ptr addrspace(1) %gep
323   ret void
326 define amdgpu_kernel void @update_dpp_p3_test(ptr addrspace(3) %arg, ptr addrspace(3) %in1, ptr %in2) {
327 ; GFX8-LABEL: update_dpp_p3_test:
328 ; GFX8:       ; %bb.0:
329 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x24
330 ; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
331 ; GFX8-NEXT:    s_mov_b32 m0, -1
332 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
333 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v0
334 ; GFX8-NEXT:    ds_read_b32 v1, v0
335 ; GFX8-NEXT:    v_mov_b32_e32 v2, s1
336 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
337 ; GFX8-NEXT:    s_nop 0
338 ; GFX8-NEXT:    v_mov_b32_dpp v2, v1 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
339 ; GFX8-NEXT:    ds_write_b32 v0, v2
340 ; GFX8-NEXT:    s_endpgm
342 ; GFX10-LABEL: update_dpp_p3_test:
343 ; GFX10:       ; %bb.0:
344 ; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x24
345 ; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
346 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
347 ; GFX10-NEXT:    v_add_nc_u32_e32 v0, s0, v0
348 ; GFX10-NEXT:    v_mov_b32_e32 v2, s1
349 ; GFX10-NEXT:    ds_read_b32 v1, v0
350 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
351 ; GFX10-NEXT:    v_mov_b32_dpp v2, v1 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
352 ; GFX10-NEXT:    ds_write_b32 v0, v2
353 ; GFX10-NEXT:    s_endpgm
355 ; GFX11-LABEL: update_dpp_p3_test:
356 ; GFX11:       ; %bb.0:
357 ; GFX11-NEXT:    s_load_b64 s[0:1], s[2:3], 0x24
358 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
359 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
360 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
361 ; GFX11-NEXT:    v_add_nc_u32_e32 v0, s0, v0
362 ; GFX11-NEXT:    v_mov_b32_e32 v2, s1
363 ; GFX11-NEXT:    ds_load_b32 v1, v0
364 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
365 ; GFX11-NEXT:    v_mov_b32_dpp v2, v1 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
366 ; GFX11-NEXT:    ds_store_b32 v0, v2
367 ; GFX11-NEXT:    s_endpgm
368   %id = tail call i32 @llvm.amdgcn.workitem.id.x()
369   %gep = getelementptr inbounds ptr addrspace(3), ptr addrspace(3) %arg, i32 %id
370   %load = load ptr addrspace(3), ptr addrspace(3) %gep
371   %tmp0 = call ptr addrspace(3) @llvm.amdgcn.update.dpp.p3(ptr addrspace(3) %in1, ptr addrspace(3) %load, i32 1, i32 1, i32 1, i1 false) #1
372   store ptr addrspace(3) %tmp0, ptr addrspace(3) %gep
373   ret void
376 define amdgpu_kernel void @update_dpp_p5_test(ptr addrspace(5) %arg, ptr addrspace(5) %in1, ptr %in2) {
377 ; GFX8-LABEL: update_dpp_p5_test:
378 ; GFX8:       ; %bb.0:
379 ; GFX8-NEXT:    s_mov_b32 s88, SCRATCH_RSRC_DWORD0
380 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x24
381 ; GFX8-NEXT:    s_mov_b32 s89, SCRATCH_RSRC_DWORD1
382 ; GFX8-NEXT:    s_mov_b32 s90, -1
383 ; GFX8-NEXT:    s_mov_b32 s91, 0xe80000
384 ; GFX8-NEXT:    s_add_u32 s88, s88, s9
385 ; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
386 ; GFX8-NEXT:    s_addc_u32 s89, s89, 0
387 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
388 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s0, v0
389 ; GFX8-NEXT:    buffer_load_dword v1, v0, s[88:91], 0 offen
390 ; GFX8-NEXT:    v_mov_b32_e32 v2, s1
391 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
392 ; GFX8-NEXT:    s_nop 0
393 ; GFX8-NEXT:    v_mov_b32_dpp v2, v1 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
394 ; GFX8-NEXT:    buffer_store_dword v2, v0, s[88:91], 0 offen
395 ; GFX8-NEXT:    s_endpgm
397 ; GFX10-LABEL: update_dpp_p5_test:
398 ; GFX10:       ; %bb.0:
399 ; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x24
400 ; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
401 ; GFX10-NEXT:    s_mov_b32 s12, SCRATCH_RSRC_DWORD0
402 ; GFX10-NEXT:    s_mov_b32 s13, SCRATCH_RSRC_DWORD1
403 ; GFX10-NEXT:    s_mov_b32 s14, -1
404 ; GFX10-NEXT:    s_mov_b32 s15, 0x31c16000
405 ; GFX10-NEXT:    s_add_u32 s12, s12, s9
406 ; GFX10-NEXT:    s_addc_u32 s13, s13, 0
407 ; GFX10-NEXT:    s_waitcnt lgkmcnt(0)
408 ; GFX10-NEXT:    v_add_nc_u32_e32 v0, s0, v0
409 ; GFX10-NEXT:    v_mov_b32_e32 v2, s1
410 ; GFX10-NEXT:    buffer_load_dword v1, v0, s[12:15], 0 offen
411 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
412 ; GFX10-NEXT:    v_mov_b32_dpp v2, v1 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
413 ; GFX10-NEXT:    buffer_store_dword v2, v0, s[12:15], 0 offen
414 ; GFX10-NEXT:    s_endpgm
416 ; GFX11-LABEL: update_dpp_p5_test:
417 ; GFX11:       ; %bb.0:
418 ; GFX11-NEXT:    s_load_b64 s[0:1], s[2:3], 0x24
419 ; GFX11-NEXT:    v_and_b32_e32 v0, 0x3ff, v0
420 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
421 ; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
422 ; GFX11-NEXT:    v_add_nc_u32_e32 v0, s0, v0
423 ; GFX11-NEXT:    v_mov_b32_e32 v2, s1
424 ; GFX11-NEXT:    scratch_load_b32 v1, v0, off
425 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
426 ; GFX11-NEXT:    v_mov_b32_dpp v2, v1 quad_perm:[1,0,0,0] row_mask:0x1 bank_mask:0x1
427 ; GFX11-NEXT:    scratch_store_b32 v0, v2, off
428 ; GFX11-NEXT:    s_endpgm
429   %id = tail call i32 @llvm.amdgcn.workitem.id.x()
430   %gep = getelementptr inbounds ptr addrspace(5), ptr addrspace(5) %arg, i32 %id
431   %load = load ptr addrspace(5), ptr addrspace(5) %gep
432   %tmp0 = call ptr addrspace(5) @llvm.amdgcn.update.dpp.p5(ptr addrspace(5) %in1, ptr addrspace(5) %load, i32 1, i32 1, i32 1, i1 false) #1
433   store ptr addrspace(5) %tmp0, ptr addrspace(5) %gep
434   ret void
437 declare i32 @llvm.amdgcn.workitem.id.x() #0
438 declare i32 @llvm.amdgcn.update.dpp.i32(i32, i32, i32 immarg, i32 immarg, i32 immarg, i1 immarg) #1
439 declare i64 @llvm.amdgcn.update.dpp.i64(i64, i64, i32 immarg, i32 immarg, i32 immarg, i1 immarg) #1
441 attributes #0 = { nounwind readnone speculatable }
442 attributes #1 = { convergent nounwind readnone }