[PowerPC] Recommit r314244 with refactoring and off by default
[llvm-core.git] / test / CodeGen / AMDGPU / udivrem.ll
blob08b764824cab465261f85912451a7cef7243db09
1 ; RUN: llc -march=amdgcn -mcpu=tahiti -verify-machineinstrs < %s | FileCheck --check-prefix=SI --check-prefix=FUNC %s
2 ; RUN: llc -march=amdgcn -mcpu=tonga -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck --check-prefix=SI --check-prefix=FUNC %s
3 ; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck --check-prefix=EG --check-prefix=FUNC %s
5 ; FUNC-LABEL: {{^}}test_udivrem:
6 ; EG: RECIP_UINT
7 ; EG-DAG: MULHI
8 ; EG-DAG: MULLO_INT
9 ; EG-DAG: SUB_INT
10 ; EG: CNDE_INT
11 ; EG: MULHI
12 ; EG-DAG: ADD_INT
13 ; EG-DAG: SUB_INT
14 ; EG: CNDE_INT
15 ; EG: MULHI
16 ; EG: MULLO_INT
17 ; EG: SUB_INT
18 ; EG-DAG: SETGE_UINT
19 ; EG-DAG: SETGE_UINT
20 ; EG: AND_INT
21 ; EG-DAG: ADD_INT
22 ; EG-DAG: SUB_INT
23 ; EG-DAG: CNDE_INT
24 ; EG-DAG: CNDE_INT
25 ; EG-DAG: ADD_INT
26 ; EG-DAG: SUB_INT
27 ; EG-DAG: CNDE_INT
28 ; EG-DAG: CNDE_INT
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_i32 [[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_cndmask_b32_e64
35 ; SI: v_mul_hi_u32 [[E:v[0-9]+]], {{v[0-9]+}}, [[RCP]]
36 ; SI-DAG: v_add_{{[iu]}}32_e32 [[RCP_A_E:v[0-9]+]], vcc, [[E]], [[RCP]]
37 ; SI-DAG: v_subrev_{{[iu]}}32_e32 [[RCP_S_E:v[0-9]+]], vcc, [[E]], [[RCP]]
38 ; SI: v_cndmask_b32_e64
39 ; SI: v_mul_hi_u32 [[Quotient:v[0-9]+]]
40 ; SI: v_mul_lo_i32 [[Num_S_Remainder:v[0-9]+]]
41 ; SI-DAG: v_add_{{[iu]}}32_e32 [[Quotient_A_One:v[0-9]+]], vcc, 1, [[Quotient]]
42 ; SI-DAG: v_sub_{{[iu]}}32_e32 [[Remainder:v[0-9]+]], vcc, {{[vs][0-9]+}}, [[Num_S_Remainder]]
43 ; SI-DAG: v_cndmask_b32_e64
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: v_and_b32_e32 [[Tmp1:v[0-9]+]]
48 ; SI-DAG: v_cndmask_b32_e64
49 ; SI-DAG: v_cndmask_b32_e64
50 ; SI-DAG: v_add_{{[iu]}}32_e32 [[Remainder_A_Den:v[0-9]+]],
51 ; SI-DAG: v_cndmask_b32_e64
52 ; SI-DAG: v_cndmask_b32_e64
53 ; SI: s_endpgm
54 define amdgpu_kernel void @test_udivrem(i32 addrspace(1)* %out0, i32 addrspace(1)* %out1, i32 %x, 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
59   ret void
62 ; FUNC-LABEL: {{^}}test_udivrem_v2:
63 ; EG-DAG: RECIP_UINT
64 ; EG-DAG: MULHI
65 ; EG-DAG: MULLO_INT
66 ; EG-DAG: SUB_INT
67 ; EG-DAG: CNDE_INT
68 ; EG-DAG: MULHI
69 ; EG-DAG: ADD_INT
70 ; EG-DAG: SUB_INT
71 ; EG-DAG: CNDE_INT
72 ; EG-DAG: MULHI
73 ; EG-DAG: MULLO_INT
74 ; EG-DAG: SUB_INT
75 ; EG-DAG: SETGE_UINT
76 ; EG-DAG: SETGE_UINT
77 ; EG-DAG: AND_INT
78 ; EG-DAG: ADD_INT
79 ; EG-DAG: SUB_INT
80 ; EG-DAG: CNDE_INT
81 ; EG-DAG: CNDE_INT
82 ; EG-DAG: ADD_INT
83 ; EG-DAG: SUB_INT
84 ; EG-DAG: CNDE_INT
85 ; EG-DAG: CNDE_INT
86 ; EG-DAG: RECIP_UINT
87 ; EG-DAG: MULHI
88 ; EG-DAG: MULLO_INT
89 ; EG-DAG: SUB_INT
90 ; EG-DAG: CNDE_INT
91 ; EG-DAG: MULHI
92 ; EG-DAG: ADD_INT
93 ; EG-DAG: SUB_INT
94 ; EG-DAG: CNDE_INT
95 ; EG-DAG: MULHI
96 ; EG-DAG: MULLO_INT
97 ; EG-DAG: SUB_INT
98 ; EG-DAG: SETGE_UINT
99 ; EG-DAG: SETGE_UINT
100 ; EG-DAG: AND_INT
101 ; EG-DAG: ADD_INT
102 ; EG-DAG: SUB_INT
103 ; EG-DAG: CNDE_INT
104 ; EG-DAG: CNDE_INT
105 ; EG-DAG: ADD_INT
106 ; EG-DAG: SUB_INT
107 ; EG-DAG: CNDE_INT
108 ; EG-DAG: CNDE_INT
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_i32
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_i32
125 ; SI-DAG: v_subrev_{{[iu]}}32_e32
126 ; SI-DAG: v_cndmask_b32_e64
127 ; SI-DAG: v_cndmask_b32_e64
128 ; SI-DAG: v_and_b32_e32
129 ; SI-DAG: v_add_{{[iu]}}32_e32
130 ; SI-DAG: v_subrev_{{[iu]}}32_e32
131 ; SI-DAG: v_cndmask_b32_e64
132 ; SI-DAG: v_cndmask_b32_e64
133 ; SI-DAG: v_add_{{[iu]}}32_e32
134 ; SI-DAG: v_subrev_{{[iu]}}32_e32
135 ; SI-DAG: v_cndmask_b32_e64
136 ; SI-DAG: v_cndmask_b32_e64
137 ; SI-DAG: v_rcp_iflag_f32_e32
138 ; SI-DAG: v_mul_hi_u32
139 ; SI-DAG: v_mul_lo_i32
140 ; SI-DAG: v_sub_{{[iu]}}32_e32
141 ; SI-DAG: v_cndmask_b32_e64
142 ; SI-DAG: v_mul_hi_u32
143 ; SI-DAG: v_add_{{[iu]}}32_e32
144 ; SI-DAG: v_subrev_{{[iu]}}32_e32
145 ; SI-DAG: v_cndmask_b32_e64
146 ; SI-DAG: v_mul_hi_u32
147 ; SI-DAG: v_mul_lo_i32
148 ; SI-DAG: v_subrev_{{[iu]}}32_e32
149 ; SI-DAG: v_cndmask_b32_e64
150 ; SI-DAG: v_cndmask_b32_e64
151 ; SI-DAG: v_and_b32_e32
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
156 ; SI-DAG: v_add_{{[iu]}}32_e32
157 ; SI-DAG: v_subrev_{{[iu]}}32_e32
158 ; SI-DAG: v_cndmask_b32_e64
159 ; SI-DAG: v_cndmask_b32_e64
160 ; SI: s_endpgm
161 define amdgpu_kernel void @test_udivrem_v2(<2 x i32> addrspace(1)* %out, <2 x i32> %x, <2 x i32> %y) {
162   %result0 = udiv <2 x i32> %x, %y
163   store <2 x i32> %result0, <2 x i32> addrspace(1)* %out
164   %result1 = urem <2 x i32> %x, %y
165   store <2 x i32> %result1, <2 x i32> addrspace(1)* %out
166   ret void
170 ; FUNC-LABEL: {{^}}test_udivrem_v4:
171 ; EG-DAG: RECIP_UINT
172 ; EG-DAG: MULHI
173 ; EG-DAG: MULLO_INT
174 ; EG-DAG: SUB_INT
175 ; EG-DAG: CNDE_INT
176 ; EG-DAG: MULHI
177 ; EG-DAG: ADD_INT
178 ; EG-DAG: SUB_INT
179 ; EG-DAG: CNDE_INT
180 ; EG-DAG: MULHI
181 ; EG-DAG: MULLO_INT
182 ; EG-DAG: SUB_INT
183 ; EG-DAG: SETGE_UINT
184 ; EG-DAG: SETGE_UINT
185 ; EG-DAG: AND_INT
186 ; EG-DAG: ADD_INT
187 ; EG-DAG: SUB_INT
188 ; EG-DAG: CNDE_INT
189 ; EG-DAG: CNDE_INT
190 ; EG-DAG: ADD_INT
191 ; EG-DAG: SUB_INT
192 ; EG-DAG: CNDE_INT
193 ; EG-DAG: CNDE_INT
194 ; EG-DAG: RECIP_UINT
195 ; EG-DAG: MULHI
196 ; EG-DAG: MULLO_INT
197 ; EG-DAG: SUB_INT
198 ; EG-DAG: CNDE_INT
199 ; EG-DAG: MULHI
200 ; EG-DAG: ADD_INT
201 ; EG-DAG: SUB_INT
202 ; EG-DAG: CNDE_INT
203 ; EG-DAG: MULHI
204 ; EG-DAG: MULLO_INT
205 ; EG-DAG: SUB_INT
206 ; EG-DAG: SETGE_UINT
207 ; EG-DAG: SETGE_UINT
208 ; EG-DAG: AND_INT
209 ; EG-DAG: ADD_INT
210 ; EG-DAG: SUB_INT
211 ; EG-DAG: CNDE_INT
212 ; EG-DAG: CNDE_INT
213 ; EG-DAG: ADD_INT
214 ; EG-DAG: SUB_INT
215 ; EG-DAG: CNDE_INT
216 ; EG-DAG: CNDE_INT
217 ; EG-DAG: RECIP_UINT
218 ; EG-DAG: MULHI
219 ; EG-DAG: MULLO_INT
220 ; EG-DAG: SUB_INT
221 ; EG-DAG: CNDE_INT
222 ; EG-DAG: MULHI
223 ; EG-DAG: ADD_INT
224 ; EG-DAG: SUB_INT
225 ; EG-DAG: CNDE_INT
226 ; EG-DAG: MULHI
227 ; EG-DAG: MULLO_INT
228 ; EG-DAG: SUB_INT
229 ; EG-DAG: SETGE_UINT
230 ; EG-DAG: SETGE_UINT
231 ; EG-DAG: AND_INT
232 ; EG-DAG: ADD_INT
233 ; EG-DAG: SUB_INT
234 ; EG-DAG: CNDE_INT
235 ; EG-DAG: CNDE_INT
236 ; EG-DAG: ADD_INT
237 ; EG-DAG: SUB_INT
238 ; EG-DAG: CNDE_INT
239 ; EG-DAG: CNDE_INT
240 ; EG-DAG: RECIP_UINT
241 ; EG-DAG: MULHI
242 ; EG-DAG: MULLO_INT
243 ; EG-DAG: SUB_INT
244 ; EG-DAG: CNDE_INT
245 ; EG-DAG: MULHI
246 ; EG-DAG: ADD_INT
247 ; EG-DAG: SUB_INT
248 ; EG-DAG: CNDE_INT
249 ; EG-DAG: MULHI
250 ; EG-DAG: MULLO_INT
251 ; EG-DAG: SUB_INT
252 ; EG-DAG: SETGE_UINT
253 ; EG-DAG: SETGE_UINT
254 ; EG-DAG: AND_INT
255 ; EG-DAG: ADD_INT
256 ; EG-DAG: SUB_INT
257 ; EG-DAG: CNDE_INT
258 ; EG-DAG: CNDE_INT
259 ; EG-DAG: ADD_INT
260 ; EG-DAG: SUB_INT
261 ; EG-DAG: CNDE_INT
262 ; EG-DAG: CNDE_INT
264 ; SI-DAG: v_rcp_iflag_f32_e32
265 ; SI-DAG: v_mul_hi_u32
266 ; SI-DAG: v_mul_lo_i32
267 ; SI-DAG: v_sub_{{[iu]}}32_e32
268 ; SI-DAG: v_cndmask_b32_e64
269 ; SI-DAG: v_mul_hi_u32
270 ; SI-DAG: v_add_{{[iu]}}32_e32
271 ; SI-DAG: v_subrev_{{[iu]}}32_e32
272 ; SI-DAG: v_cndmask_b32_e64
273 ; SI-DAG: v_mul_hi_u32
274 ; SI-DAG: v_mul_lo_i32
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_and_b32_e32
279 ; SI-DAG: v_add_{{[iu]}}32_e32
280 ; SI-DAG: v_subrev_{{[iu]}}32_e32
281 ; SI-DAG: v_cndmask_b32_e64
282 ; SI-DAG: v_cndmask_b32_e64
283 ; SI-DAG: v_add_{{[iu]}}32_e32
284 ; SI-DAG: v_subrev_{{[iu]}}32_e32
285 ; SI-DAG: v_cndmask_b32_e64
286 ; SI-DAG: v_cndmask_b32_e64
287 ; SI-DAG: v_rcp_iflag_f32_e32
288 ; SI-DAG: v_mul_hi_u32
289 ; SI-DAG: v_mul_lo_i32
290 ; SI-DAG: v_sub_{{[iu]}}32_e32
291 ; SI-DAG: v_cndmask_b32_e64
292 ; SI-DAG: v_mul_hi_u32
293 ; SI-DAG: v_add_{{[iu]}}32_e32
294 ; SI-DAG: v_subrev_{{[iu]}}32_e32
295 ; SI-DAG: v_cndmask_b32_e64
296 ; SI-DAG: v_mul_hi_u32
297 ; SI-DAG: v_mul_lo_i32
298 ; SI-DAG: v_subrev_{{[iu]}}32_e32
299 ; SI-DAG: v_cndmask_b32_e64
300 ; SI-DAG: v_cndmask_b32_e64
301 ; SI-DAG: v_and_b32_e32
302 ; SI-DAG: v_add_{{[iu]}}32_e32
303 ; SI-DAG: v_subrev_{{[iu]}}32_e32
304 ; SI-DAG: v_cndmask_b32_e64
305 ; SI-DAG: v_cndmask_b32_e64
306 ; SI-DAG: v_add_{{[iu]}}32_e32
307 ; SI-DAG: v_subrev_{{[iu]}}32_e32
308 ; SI-DAG: v_cndmask_b32_e64
309 ; SI-DAG: v_cndmask_b32_e64
310 ; SI-DAG: v_rcp_iflag_f32_e32
311 ; SI-DAG: v_mul_hi_u32
312 ; SI-DAG: v_mul_lo_i32
313 ; SI-DAG: v_sub_{{[iu]}}32_e32
314 ; SI-DAG: v_cndmask_b32_e64
315 ; SI-DAG: v_mul_hi_u32
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_mul_hi_u32
320 ; SI-DAG: v_mul_lo_i32
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_and_b32_e32
325 ; SI-DAG: v_add_{{[iu]}}32_e32
326 ; SI-DAG: v_subrev_{{[iu]}}32_e32
327 ; SI-DAG: v_cndmask_b32_e64
328 ; SI-DAG: v_cndmask_b32_e64
329 ; SI-DAG: v_add_{{[iu]}}32_e32
330 ; SI-DAG: v_subrev_{{[iu]}}32_e32
331 ; SI-DAG: v_cndmask_b32_e64
332 ; SI-DAG: v_cndmask_b32_e64
333 ; SI-DAG: v_rcp_iflag_f32_e32
334 ; SI-DAG: v_mul_hi_u32
335 ; SI-DAG: v_mul_lo_i32
336 ; SI-DAG: v_sub_{{[iu]}}32_e32
337 ; SI-DAG: v_cndmask_b32_e64
338 ; SI-DAG: v_mul_hi_u32
339 ; SI-DAG: v_add_{{[iu]}}32_e32
340 ; SI-DAG: v_subrev_{{[iu]}}32_e32
341 ; SI-DAG: v_cndmask_b32_e64
342 ; SI: s_endpgm
343 define amdgpu_kernel void @test_udivrem_v4(<4 x i32> addrspace(1)* %out, <4 x i32> %x, <4 x i32> %y) {
344   %result0 = udiv <4 x i32> %x, %y
345   store <4 x i32> %result0, <4 x i32> addrspace(1)* %out
346   %result1 = urem <4 x i32> %x, %y
347   store <4 x i32> %result1, <4 x i32> addrspace(1)* %out
348   ret void