1 ; RUN: llc -march=amdgcn -mcpu=tahiti -verify-machineinstrs < %s | FileCheck -allow-deprecated-dag-overlap --check-prefix=SI --check-prefix=FUNC %s
2 ; RUN: llc -march=amdgcn -mcpu=tonga -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -allow-deprecated-dag-overlap --check-prefix=SI --check-prefix=FUNC %s
3 ; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck -allow-deprecated-dag-overlap --check-prefix=EG --check-prefix=FUNC %s
5 ; FUNC-LABEL: {{^}}test_udivrem:
30 ; SI: v_rcp_iflag_f32_e32 [[RCP:v[0-9]+]]
31 ; SI-DAG: v_mul_hi_u32 [[RCP_HI:v[0-9]+]], [[RCP]]
32 ; SI-DAG: v_mul_lo_u32 [[RCP_LO:v[0-9]+]], [[RCP]]
33 ; SI-DAG: v_sub_{{[iu]}}32_e32 [[NEG_RCP_LO:v[0-9]+]], vcc, 0, [[RCP_LO]]
34 ; SI: v_cmp_eq_u32_e64 [[CC1:s\[[0-9:]+\]]], 0, [[RCP_HI]]
35 ; SI: v_cndmask_b32_e64 [[CND1:v[0-9]+]], [[RCP_LO]], [[NEG_RCP_LO]], [[CC1]]
36 ; SI: v_mul_hi_u32 [[E:v[0-9]+]], [[CND1]], [[RCP]]
37 ; SI-DAG: v_add_{{[iu]}}32_e32 [[RCP_A_E:v[0-9]+]], vcc, [[E]], [[RCP]]
38 ; SI-DAG: v_subrev_{{[iu]}}32_e32 [[RCP_S_E:v[0-9]+]], vcc, [[E]], [[RCP]]
39 ; SI: v_cndmask_b32_e64 [[CND2:v[0-9]+]], [[RCP_S_E]], [[RCP_A_E]], [[CC1]]
40 ; SI: v_mul_hi_u32 [[Quotient:v[0-9]+]], [[CND2]],
41 ; SI: v_mul_lo_u32 [[Num_S_Remainder:v[0-9]+]], [[CND2]]
42 ; SI-DAG: v_add_{{[iu]}}32_e32 [[Quotient_A_One:v[0-9]+]], vcc, 1, [[Quotient]]
43 ; SI-DAG: v_sub_{{[iu]}}32_e32 [[Remainder:v[0-9]+]], vcc, {{[vs][0-9]+}}, [[Num_S_Remainder]]
44 ; SI-DAG: v_cndmask_b32_e64
45 ; SI-DAG: v_subrev_{{[iu]}}32_e32 [[Quotient_S_One:v[0-9]+]],
46 ; SI-DAG: v_subrev_{{[iu]}}32_e32 [[Remainder_S_Den:v[0-9]+]],
47 ; SI-DAG: v_cndmask_b32_e64
48 ; SI-DAG: v_cndmask_b32_e64
49 ; SI-DAG: v_add_{{[iu]}}32_e32 [[Remainder_A_Den:v[0-9]+]],
50 ; SI-DAG: v_cndmask_b32_e64
51 ; SI-DAG: v_cndmask_b32_e64
54 define amdgpu_kernel void @test_udivrem(i32 addrspace(1)* %out0, [8 x i32], i32 addrspace(1)* %out1, [8 x i32], i32 %x, [8 x i32], i32 %y) {
55 %result0 = udiv i32 %x, %y
56 store i32 %result0, i32 addrspace(1)* %out0
57 %result1 = urem i32 %x, %y
58 store i32 %result1, i32 addrspace(1)* %out1
62 ; FUNC-LABEL: {{^}}test_udivrem_v2:
110 ; For SI, we used to have checks for the input and output registers
111 ; of the instructions, but these are way too fragile. The division for
112 ; the two vector elements can be intermixed which makes it impossible to
113 ; accurately check all the operands.
114 ; SI-DAG: v_rcp_iflag_f32_e32
115 ; SI-DAG: v_mul_hi_u32
116 ; SI-DAG: v_mul_lo_u32
117 ; SI-DAG: v_sub_{{[iu]}}32_e32
118 ; SI-DAG: v_cndmask_b32_e64
119 ; SI-DAG: v_mul_hi_u32
120 ; SI-DAG: v_add_{{[iu]}}32_e32
121 ; SI-DAG: v_subrev_{{[iu]}}32_e32
122 ; SI-DAG: v_cndmask_b32_e64
123 ; SI-DAG: v_mul_hi_u32
124 ; SI-DAG: v_mul_lo_u32
125 ; SI-DAG: v_subrev_{{[iu]}}32_e32
126 ; SI-DAG: v_cndmask_b32_e64
127 ; SI-DAG: v_add_{{[iu]}}32_e32
128 ; SI-DAG: v_subrev_{{[iu]}}32_e32
129 ; SI-DAG: v_cndmask_b32_e64
130 ; SI-DAG: v_cndmask_b32_e64
131 ; SI-DAG: v_add_{{[iu]}}32_e32
132 ; SI-DAG: v_subrev_{{[iu]}}32_e32
133 ; SI-DAG: v_cndmask_b32_e64
134 ; SI-DAG: v_cndmask_b32_e64
135 ; SI-DAG: v_rcp_iflag_f32_e32
136 ; SI-DAG: v_mul_hi_u32
137 ; SI-DAG: v_mul_lo_u32
138 ; SI-DAG: v_sub_{{[iu]}}32_e32
139 ; SI-DAG: v_cndmask_b32_e64
140 ; SI-DAG: v_mul_hi_u32
141 ; SI-DAG: v_add_{{[iu]}}32_e32
142 ; SI-DAG: v_subrev_{{[iu]}}32_e32
143 ; SI-DAG: v_cndmask_b32_e64
144 ; SI-DAG: v_mul_hi_u32
145 ; SI-DAG: v_mul_lo_u32
146 ; SI-DAG: v_subrev_{{[iu]}}32_e32
147 ; SI-DAG: v_cndmask_b32_e64
148 ; SI-DAG: v_add_{{[iu]}}32_e32
149 ; SI-DAG: v_subrev_{{[iu]}}32_e32
150 ; SI-DAG: v_cndmask_b32_e64
151 ; SI-DAG: v_cndmask_b32_e64
152 ; SI-DAG: v_add_{{[iu]}}32_e32
153 ; SI-DAG: v_subrev_{{[iu]}}32_e32
154 ; SI-DAG: v_cndmask_b32_e64
155 ; SI-DAG: v_cndmask_b32_e64
158 define amdgpu_kernel void @test_udivrem_v2(<2 x i32> addrspace(1)* %out, <2 x i32> %x, <2 x i32> %y) {
159 %result0 = udiv <2 x i32> %x, %y
160 store <2 x i32> %result0, <2 x i32> addrspace(1)* %out
161 %result1 = urem <2 x i32> %x, %y
162 store <2 x i32> %result1, <2 x i32> addrspace(1)* %out
167 ; FUNC-LABEL: {{^}}test_udivrem_v4:
261 ; SI-DAG: v_rcp_iflag_f32_e32
262 ; SI-DAG: v_mul_hi_u32
263 ; SI-DAG: v_mul_lo_u32
264 ; SI-DAG: v_sub_{{[iu]}}32_e32
265 ; SI-DAG: v_cndmask_b32_e64
266 ; SI-DAG: v_mul_hi_u32
267 ; SI-DAG: v_add_{{[iu]}}32_e32
268 ; SI-DAG: v_subrev_{{[iu]}}32_e32
269 ; SI-DAG: v_cndmask_b32_e64
270 ; SI-DAG: v_mul_hi_u32
271 ; SI-DAG: v_mul_lo_u32
272 ; SI-DAG: v_subrev_{{[iu]}}32_e32
273 ; SI-DAG: v_cndmask_b32_e64
274 ; SI-DAG: v_add_{{[iu]}}32_e32
275 ; SI-DAG: v_subrev_{{[iu]}}32_e32
276 ; SI-DAG: v_cndmask_b32_e64
277 ; SI-DAG: v_cndmask_b32_e64
278 ; SI-DAG: v_add_{{[iu]}}32_e32
279 ; SI-DAG: v_subrev_{{[iu]}}32_e32
280 ; SI-DAG: v_cndmask_b32_e64
281 ; SI-DAG: v_cndmask_b32_e64
282 ; SI-DAG: v_rcp_iflag_f32_e32
283 ; SI-DAG: v_mul_hi_u32
284 ; SI-DAG: v_mul_lo_u32
285 ; SI-DAG: v_sub_{{[iu]}}32_e32
286 ; SI-DAG: v_cndmask_b32_e64
287 ; SI-DAG: v_mul_hi_u32
288 ; SI-DAG: v_add_{{[iu]}}32_e32
289 ; SI-DAG: v_subrev_{{[iu]}}32_e32
290 ; SI-DAG: v_cndmask_b32_e64
291 ; SI-DAG: v_mul_hi_u32
292 ; SI-DAG: v_mul_lo_u32
293 ; SI-DAG: v_subrev_{{[iu]}}32_e32
294 ; SI-DAG: v_cndmask_b32_e64
295 ; SI-DAG: v_add_{{[iu]}}32_e32
296 ; SI-DAG: v_subrev_{{[iu]}}32_e32
297 ; SI-DAG: v_cndmask_b32_e64
298 ; SI-DAG: v_cndmask_b32_e64
299 ; SI-DAG: v_add_{{[iu]}}32_e32
300 ; SI-DAG: v_subrev_{{[iu]}}32_e32
301 ; SI-DAG: v_cndmask_b32_e64
302 ; SI-DAG: v_cndmask_b32_e64
303 ; SI-DAG: v_rcp_iflag_f32_e32
304 ; SI-DAG: v_mul_hi_u32
305 ; SI-DAG: v_mul_lo_u32
306 ; SI-DAG: v_sub_{{[iu]}}32_e32
307 ; SI-DAG: v_cndmask_b32_e64
308 ; SI-DAG: v_mul_hi_u32
309 ; SI-DAG: v_add_{{[iu]}}32_e32
310 ; SI-DAG: v_subrev_{{[iu]}}32_e32
311 ; SI-DAG: v_cndmask_b32_e64
312 ; SI-DAG: v_mul_hi_u32
313 ; SI-DAG: v_mul_lo_u32
314 ; SI-DAG: v_subrev_{{[iu]}}32_e32
315 ; SI-DAG: v_cndmask_b32_e64
316 ; SI-DAG: v_add_{{[iu]}}32_e32
317 ; SI-DAG: v_subrev_{{[iu]}}32_e32
318 ; SI-DAG: v_cndmask_b32_e64
319 ; SI-DAG: v_cndmask_b32_e64
320 ; SI-DAG: v_add_{{[iu]}}32_e32
321 ; SI-DAG: v_subrev_{{[iu]}}32_e32
322 ; SI-DAG: v_cndmask_b32_e64
323 ; SI-DAG: v_cndmask_b32_e64
324 ; SI-DAG: v_rcp_iflag_f32_e32
325 ; SI-DAG: v_mul_hi_u32
326 ; SI-DAG: v_mul_lo_u32
327 ; SI-DAG: v_sub_{{[iu]}}32_e32
328 ; SI-DAG: v_cndmask_b32_e64
329 ; SI-DAG: v_mul_hi_u32
330 ; SI-DAG: v_add_{{[iu]}}32_e32
331 ; SI-DAG: v_subrev_{{[iu]}}32_e32
332 ; SI-DAG: v_cndmask_b32_e64
335 define amdgpu_kernel void @test_udivrem_v4(<4 x i32> addrspace(1)* %out, <4 x i32> %x, <4 x i32> %y) {
336 %result0 = udiv <4 x i32> %x, %y
337 store <4 x i32> %result0, <4 x i32> addrspace(1)* %out
338 %result1 = urem <4 x i32> %x, %y
339 store <4 x i32> %result1, <4 x i32> addrspace(1)* %out