Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / RISCV / split-udiv-by-constant.ll
blob5fa802b7f27cad82319e21fa4884f130fd99d7a9
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: sed 's/iXLen2/i64/g' %s | llc -mtriple=riscv32 -mattr=+m | \
3 ; RUN:   FileCheck %s --check-prefix=RV32
4 ; RUN: sed 's/iXLen2/i128/g' %s | llc -mtriple=riscv64 -mattr=+m | \
5 ; RUN:   FileCheck %s --check-prefix=RV64
7 define iXLen2 @test_udiv_3(iXLen2 %x) nounwind {
8 ; RV32-LABEL: test_udiv_3:
9 ; RV32:       # %bb.0:
10 ; RV32-NEXT:    add a2, a0, a1
11 ; RV32-NEXT:    sltu a3, a2, a0
12 ; RV32-NEXT:    add a2, a2, a3
13 ; RV32-NEXT:    lui a3, 699051
14 ; RV32-NEXT:    addi a4, a3, -1365
15 ; RV32-NEXT:    mulhu a5, a2, a4
16 ; RV32-NEXT:    srli a6, a5, 1
17 ; RV32-NEXT:    andi a5, a5, -2
18 ; RV32-NEXT:    add a5, a5, a6
19 ; RV32-NEXT:    sub a2, a2, a5
20 ; RV32-NEXT:    sub a5, a0, a2
21 ; RV32-NEXT:    addi a3, a3, -1366
22 ; RV32-NEXT:    mul a3, a5, a3
23 ; RV32-NEXT:    mulhu a6, a5, a4
24 ; RV32-NEXT:    add a3, a6, a3
25 ; RV32-NEXT:    sltu a0, a0, a2
26 ; RV32-NEXT:    sub a1, a1, a0
27 ; RV32-NEXT:    mul a1, a1, a4
28 ; RV32-NEXT:    add a1, a3, a1
29 ; RV32-NEXT:    mul a0, a5, a4
30 ; RV32-NEXT:    ret
32 ; RV64-LABEL: test_udiv_3:
33 ; RV64:       # %bb.0:
34 ; RV64-NEXT:    add a2, a0, a1
35 ; RV64-NEXT:    sltu a3, a2, a0
36 ; RV64-NEXT:    add a2, a2, a3
37 ; RV64-NEXT:    lui a3, 699051
38 ; RV64-NEXT:    addiw a3, a3, -1365
39 ; RV64-NEXT:    slli a4, a3, 32
40 ; RV64-NEXT:    add a3, a3, a4
41 ; RV64-NEXT:    mulhu a4, a2, a3
42 ; RV64-NEXT:    srli a5, a4, 1
43 ; RV64-NEXT:    andi a4, a4, -2
44 ; RV64-NEXT:    lui a6, %hi(.LCPI0_0)
45 ; RV64-NEXT:    ld a6, %lo(.LCPI0_0)(a6)
46 ; RV64-NEXT:    add a4, a4, a5
47 ; RV64-NEXT:    sub a2, a2, a4
48 ; RV64-NEXT:    sub a4, a0, a2
49 ; RV64-NEXT:    mul a5, a4, a6
50 ; RV64-NEXT:    mulhu a6, a4, a3
51 ; RV64-NEXT:    add a5, a6, a5
52 ; RV64-NEXT:    sltu a0, a0, a2
53 ; RV64-NEXT:    sub a1, a1, a0
54 ; RV64-NEXT:    mul a1, a1, a3
55 ; RV64-NEXT:    add a1, a5, a1
56 ; RV64-NEXT:    mul a0, a4, a3
57 ; RV64-NEXT:    ret
58   %a = udiv iXLen2 %x, 3
59   ret iXLen2 %a
62 define iXLen2 @test_udiv_5(iXLen2 %x) nounwind {
63 ; RV32-LABEL: test_udiv_5:
64 ; RV32:       # %bb.0:
65 ; RV32-NEXT:    add a2, a0, a1
66 ; RV32-NEXT:    sltu a3, a2, a0
67 ; RV32-NEXT:    add a2, a2, a3
68 ; RV32-NEXT:    lui a3, 838861
69 ; RV32-NEXT:    addi a4, a3, -819
70 ; RV32-NEXT:    mulhu a5, a2, a4
71 ; RV32-NEXT:    srli a6, a5, 2
72 ; RV32-NEXT:    andi a5, a5, -4
73 ; RV32-NEXT:    add a5, a5, a6
74 ; RV32-NEXT:    sub a2, a2, a5
75 ; RV32-NEXT:    sub a5, a0, a2
76 ; RV32-NEXT:    addi a3, a3, -820
77 ; RV32-NEXT:    mul a3, a5, a3
78 ; RV32-NEXT:    mulhu a6, a5, a4
79 ; RV32-NEXT:    add a3, a6, a3
80 ; RV32-NEXT:    sltu a0, a0, a2
81 ; RV32-NEXT:    sub a1, a1, a0
82 ; RV32-NEXT:    mul a1, a1, a4
83 ; RV32-NEXT:    add a1, a3, a1
84 ; RV32-NEXT:    mul a0, a5, a4
85 ; RV32-NEXT:    ret
87 ; RV64-LABEL: test_udiv_5:
88 ; RV64:       # %bb.0:
89 ; RV64-NEXT:    add a2, a0, a1
90 ; RV64-NEXT:    sltu a3, a2, a0
91 ; RV64-NEXT:    add a2, a2, a3
92 ; RV64-NEXT:    lui a3, 838861
93 ; RV64-NEXT:    addiw a3, a3, -819
94 ; RV64-NEXT:    slli a4, a3, 32
95 ; RV64-NEXT:    add a3, a3, a4
96 ; RV64-NEXT:    mulhu a4, a2, a3
97 ; RV64-NEXT:    srli a5, a4, 2
98 ; RV64-NEXT:    andi a4, a4, -4
99 ; RV64-NEXT:    lui a6, %hi(.LCPI1_0)
100 ; RV64-NEXT:    ld a6, %lo(.LCPI1_0)(a6)
101 ; RV64-NEXT:    add a4, a4, a5
102 ; RV64-NEXT:    sub a2, a2, a4
103 ; RV64-NEXT:    sub a4, a0, a2
104 ; RV64-NEXT:    mul a5, a4, a6
105 ; RV64-NEXT:    mulhu a6, a4, a3
106 ; RV64-NEXT:    add a5, a6, a5
107 ; RV64-NEXT:    sltu a0, a0, a2
108 ; RV64-NEXT:    sub a1, a1, a0
109 ; RV64-NEXT:    mul a1, a1, a3
110 ; RV64-NEXT:    add a1, a5, a1
111 ; RV64-NEXT:    mul a0, a4, a3
112 ; RV64-NEXT:    ret
113   %a = udiv iXLen2 %x, 5
114   ret iXLen2 %a
117 define iXLen2 @test_udiv_7(iXLen2 %x) nounwind {
118 ; RV32-LABEL: test_udiv_7:
119 ; RV32:       # %bb.0:
120 ; RV32-NEXT:    addi sp, sp, -16
121 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
122 ; RV32-NEXT:    li a2, 7
123 ; RV32-NEXT:    li a3, 0
124 ; RV32-NEXT:    call __udivdi3
125 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
126 ; RV32-NEXT:    addi sp, sp, 16
127 ; RV32-NEXT:    ret
129 ; RV64-LABEL: test_udiv_7:
130 ; RV64:       # %bb.0:
131 ; RV64-NEXT:    addi sp, sp, -16
132 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
133 ; RV64-NEXT:    li a2, 7
134 ; RV64-NEXT:    li a3, 0
135 ; RV64-NEXT:    call __udivti3
136 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
137 ; RV64-NEXT:    addi sp, sp, 16
138 ; RV64-NEXT:    ret
139   %a = udiv iXLen2 %x, 7
140   ret iXLen2 %a
143 define iXLen2 @test_udiv_9(iXLen2 %x) nounwind {
144 ; RV32-LABEL: test_udiv_9:
145 ; RV32:       # %bb.0:
146 ; RV32-NEXT:    addi sp, sp, -16
147 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
148 ; RV32-NEXT:    li a2, 9
149 ; RV32-NEXT:    li a3, 0
150 ; RV32-NEXT:    call __udivdi3
151 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
152 ; RV32-NEXT:    addi sp, sp, 16
153 ; RV32-NEXT:    ret
155 ; RV64-LABEL: test_udiv_9:
156 ; RV64:       # %bb.0:
157 ; RV64-NEXT:    addi sp, sp, -16
158 ; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
159 ; RV64-NEXT:    li a2, 9
160 ; RV64-NEXT:    li a3, 0
161 ; RV64-NEXT:    call __udivti3
162 ; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
163 ; RV64-NEXT:    addi sp, sp, 16
164 ; RV64-NEXT:    ret
165   %a = udiv iXLen2 %x, 9
166   ret iXLen2 %a
169 define iXLen2 @test_udiv_15(iXLen2 %x) nounwind {
170 ; RV32-LABEL: test_udiv_15:
171 ; RV32:       # %bb.0:
172 ; RV32-NEXT:    add a2, a0, a1
173 ; RV32-NEXT:    sltu a3, a2, a0
174 ; RV32-NEXT:    add a2, a2, a3
175 ; RV32-NEXT:    lui a3, 559241
176 ; RV32-NEXT:    addi a3, a3, -1911
177 ; RV32-NEXT:    mulhu a3, a2, a3
178 ; RV32-NEXT:    srli a3, a3, 3
179 ; RV32-NEXT:    slli a4, a3, 4
180 ; RV32-NEXT:    sub a3, a3, a4
181 ; RV32-NEXT:    add a2, a2, a3
182 ; RV32-NEXT:    sub a3, a0, a2
183 ; RV32-NEXT:    lui a4, 978671
184 ; RV32-NEXT:    addi a5, a4, -274
185 ; RV32-NEXT:    mul a5, a3, a5
186 ; RV32-NEXT:    addi a4, a4, -273
187 ; RV32-NEXT:    mulhu a6, a3, a4
188 ; RV32-NEXT:    add a5, a6, a5
189 ; RV32-NEXT:    sltu a0, a0, a2
190 ; RV32-NEXT:    sub a1, a1, a0
191 ; RV32-NEXT:    mul a1, a1, a4
192 ; RV32-NEXT:    add a1, a5, a1
193 ; RV32-NEXT:    mul a0, a3, a4
194 ; RV32-NEXT:    ret
196 ; RV64-LABEL: test_udiv_15:
197 ; RV64:       # %bb.0:
198 ; RV64-NEXT:    add a2, a0, a1
199 ; RV64-NEXT:    sltu a3, a2, a0
200 ; RV64-NEXT:    add a2, a2, a3
201 ; RV64-NEXT:    lui a3, 559241
202 ; RV64-NEXT:    addiw a3, a3, -1911
203 ; RV64-NEXT:    slli a4, a3, 32
204 ; RV64-NEXT:    add a3, a3, a4
205 ; RV64-NEXT:    mulhu a3, a2, a3
206 ; RV64-NEXT:    srli a3, a3, 3
207 ; RV64-NEXT:    slli a4, a3, 4
208 ; RV64-NEXT:    lui a5, %hi(.LCPI4_0)
209 ; RV64-NEXT:    ld a5, %lo(.LCPI4_0)(a5)
210 ; RV64-NEXT:    sub a3, a3, a4
211 ; RV64-NEXT:    add a2, a2, a3
212 ; RV64-NEXT:    sub a3, a0, a2
213 ; RV64-NEXT:    mul a4, a3, a5
214 ; RV64-NEXT:    lui a5, 978671
215 ; RV64-NEXT:    addiw a5, a5, -273
216 ; RV64-NEXT:    slli a6, a5, 32
217 ; RV64-NEXT:    add a5, a5, a6
218 ; RV64-NEXT:    mulhu a6, a3, a5
219 ; RV64-NEXT:    add a4, a6, a4
220 ; RV64-NEXT:    sltu a0, a0, a2
221 ; RV64-NEXT:    sub a1, a1, a0
222 ; RV64-NEXT:    mul a1, a1, a5
223 ; RV64-NEXT:    add a1, a4, a1
224 ; RV64-NEXT:    mul a0, a3, a5
225 ; RV64-NEXT:    ret
226   %a = udiv iXLen2 %x, 15
227   ret iXLen2 %a
230 define iXLen2 @test_udiv_17(iXLen2 %x) nounwind {
231 ; RV32-LABEL: test_udiv_17:
232 ; RV32:       # %bb.0:
233 ; RV32-NEXT:    add a2, a0, a1
234 ; RV32-NEXT:    sltu a3, a2, a0
235 ; RV32-NEXT:    add a2, a2, a3
236 ; RV32-NEXT:    lui a3, 986895
237 ; RV32-NEXT:    addi a4, a3, 241
238 ; RV32-NEXT:    mulhu a5, a2, a4
239 ; RV32-NEXT:    srli a6, a5, 4
240 ; RV32-NEXT:    andi a5, a5, -16
241 ; RV32-NEXT:    add a5, a5, a6
242 ; RV32-NEXT:    sub a2, a2, a5
243 ; RV32-NEXT:    sub a5, a0, a2
244 ; RV32-NEXT:    addi a3, a3, 240
245 ; RV32-NEXT:    mul a3, a5, a3
246 ; RV32-NEXT:    mulhu a6, a5, a4
247 ; RV32-NEXT:    add a3, a6, a3
248 ; RV32-NEXT:    sltu a0, a0, a2
249 ; RV32-NEXT:    sub a1, a1, a0
250 ; RV32-NEXT:    mul a1, a1, a4
251 ; RV32-NEXT:    add a1, a3, a1
252 ; RV32-NEXT:    mul a0, a5, a4
253 ; RV32-NEXT:    ret
255 ; RV64-LABEL: test_udiv_17:
256 ; RV64:       # %bb.0:
257 ; RV64-NEXT:    add a2, a0, a1
258 ; RV64-NEXT:    sltu a3, a2, a0
259 ; RV64-NEXT:    add a2, a2, a3
260 ; RV64-NEXT:    lui a3, 986895
261 ; RV64-NEXT:    addiw a3, a3, 241
262 ; RV64-NEXT:    slli a4, a3, 32
263 ; RV64-NEXT:    add a3, a3, a4
264 ; RV64-NEXT:    mulhu a4, a2, a3
265 ; RV64-NEXT:    srli a5, a4, 4
266 ; RV64-NEXT:    andi a4, a4, -16
267 ; RV64-NEXT:    lui a6, %hi(.LCPI5_0)
268 ; RV64-NEXT:    ld a6, %lo(.LCPI5_0)(a6)
269 ; RV64-NEXT:    add a4, a4, a5
270 ; RV64-NEXT:    sub a2, a2, a4
271 ; RV64-NEXT:    sub a4, a0, a2
272 ; RV64-NEXT:    mul a5, a4, a6
273 ; RV64-NEXT:    mulhu a6, a4, a3
274 ; RV64-NEXT:    add a5, a6, a5
275 ; RV64-NEXT:    sltu a0, a0, a2
276 ; RV64-NEXT:    sub a1, a1, a0
277 ; RV64-NEXT:    mul a1, a1, a3
278 ; RV64-NEXT:    add a1, a5, a1
279 ; RV64-NEXT:    mul a0, a4, a3
280 ; RV64-NEXT:    ret
281   %a = udiv iXLen2 %x, 17
282   ret iXLen2 %a
285 define iXLen2 @test_udiv_255(iXLen2 %x) nounwind {
286 ; RV32-LABEL: test_udiv_255:
287 ; RV32:       # %bb.0:
288 ; RV32-NEXT:    add a2, a0, a1
289 ; RV32-NEXT:    sltu a3, a2, a0
290 ; RV32-NEXT:    add a2, a2, a3
291 ; RV32-NEXT:    lui a3, 526344
292 ; RV32-NEXT:    addi a3, a3, 129
293 ; RV32-NEXT:    mulhu a3, a2, a3
294 ; RV32-NEXT:    srli a3, a3, 7
295 ; RV32-NEXT:    slli a4, a3, 8
296 ; RV32-NEXT:    sub a3, a3, a4
297 ; RV32-NEXT:    add a2, a2, a3
298 ; RV32-NEXT:    sub a3, a0, a2
299 ; RV32-NEXT:    lui a4, 1044464
300 ; RV32-NEXT:    addi a5, a4, -258
301 ; RV32-NEXT:    mul a5, a3, a5
302 ; RV32-NEXT:    addi a4, a4, -257
303 ; RV32-NEXT:    mulhu a6, a3, a4
304 ; RV32-NEXT:    add a5, a6, a5
305 ; RV32-NEXT:    sltu a0, a0, a2
306 ; RV32-NEXT:    sub a1, a1, a0
307 ; RV32-NEXT:    mul a1, a1, a4
308 ; RV32-NEXT:    add a1, a5, a1
309 ; RV32-NEXT:    mul a0, a3, a4
310 ; RV32-NEXT:    ret
312 ; RV64-LABEL: test_udiv_255:
313 ; RV64:       # %bb.0:
314 ; RV64-NEXT:    add a2, a0, a1
315 ; RV64-NEXT:    sltu a3, a2, a0
316 ; RV64-NEXT:    add a2, a2, a3
317 ; RV64-NEXT:    lui a3, 526344
318 ; RV64-NEXT:    addiw a3, a3, 129
319 ; RV64-NEXT:    slli a4, a3, 32
320 ; RV64-NEXT:    add a3, a3, a4
321 ; RV64-NEXT:    mulhu a3, a2, a3
322 ; RV64-NEXT:    srli a3, a3, 7
323 ; RV64-NEXT:    slli a4, a3, 8
324 ; RV64-NEXT:    lui a5, %hi(.LCPI6_0)
325 ; RV64-NEXT:    ld a5, %lo(.LCPI6_0)(a5)
326 ; RV64-NEXT:    sub a3, a3, a4
327 ; RV64-NEXT:    add a2, a2, a3
328 ; RV64-NEXT:    sub a3, a0, a2
329 ; RV64-NEXT:    mul a4, a3, a5
330 ; RV64-NEXT:    lui a5, 1044464
331 ; RV64-NEXT:    addiw a5, a5, -257
332 ; RV64-NEXT:    slli a6, a5, 32
333 ; RV64-NEXT:    add a5, a5, a6
334 ; RV64-NEXT:    mulhu a6, a3, a5
335 ; RV64-NEXT:    add a4, a6, a4
336 ; RV64-NEXT:    sltu a0, a0, a2
337 ; RV64-NEXT:    sub a1, a1, a0
338 ; RV64-NEXT:    mul a1, a1, a5
339 ; RV64-NEXT:    add a1, a4, a1
340 ; RV64-NEXT:    mul a0, a3, a5
341 ; RV64-NEXT:    ret
342   %a = udiv iXLen2 %x, 255
343   ret iXLen2 %a
346 define iXLen2 @test_udiv_257(iXLen2 %x) nounwind {
347 ; RV32-LABEL: test_udiv_257:
348 ; RV32:       # %bb.0:
349 ; RV32-NEXT:    add a2, a0, a1
350 ; RV32-NEXT:    sltu a3, a2, a0
351 ; RV32-NEXT:    add a2, a2, a3
352 ; RV32-NEXT:    lui a3, 1044496
353 ; RV32-NEXT:    addi a4, a3, -255
354 ; RV32-NEXT:    mulhu a5, a2, a4
355 ; RV32-NEXT:    srli a6, a5, 8
356 ; RV32-NEXT:    andi a5, a5, -256
357 ; RV32-NEXT:    add a5, a5, a6
358 ; RV32-NEXT:    sub a2, a2, a5
359 ; RV32-NEXT:    sub a5, a0, a2
360 ; RV32-NEXT:    addi a3, a3, -256
361 ; RV32-NEXT:    mul a3, a5, a3
362 ; RV32-NEXT:    mulhu a6, a5, a4
363 ; RV32-NEXT:    add a3, a6, a3
364 ; RV32-NEXT:    sltu a0, a0, a2
365 ; RV32-NEXT:    sub a1, a1, a0
366 ; RV32-NEXT:    mul a1, a1, a4
367 ; RV32-NEXT:    add a1, a3, a1
368 ; RV32-NEXT:    mul a0, a5, a4
369 ; RV32-NEXT:    ret
371 ; RV64-LABEL: test_udiv_257:
372 ; RV64:       # %bb.0:
373 ; RV64-NEXT:    add a2, a0, a1
374 ; RV64-NEXT:    sltu a3, a2, a0
375 ; RV64-NEXT:    add a2, a2, a3
376 ; RV64-NEXT:    lui a3, 1044496
377 ; RV64-NEXT:    addiw a3, a3, -255
378 ; RV64-NEXT:    slli a4, a3, 32
379 ; RV64-NEXT:    add a3, a3, a4
380 ; RV64-NEXT:    mulhu a4, a2, a3
381 ; RV64-NEXT:    srli a5, a4, 8
382 ; RV64-NEXT:    andi a4, a4, -256
383 ; RV64-NEXT:    lui a6, %hi(.LCPI7_0)
384 ; RV64-NEXT:    ld a6, %lo(.LCPI7_0)(a6)
385 ; RV64-NEXT:    add a4, a4, a5
386 ; RV64-NEXT:    sub a2, a2, a4
387 ; RV64-NEXT:    sub a4, a0, a2
388 ; RV64-NEXT:    mul a5, a4, a6
389 ; RV64-NEXT:    mulhu a6, a4, a3
390 ; RV64-NEXT:    add a5, a6, a5
391 ; RV64-NEXT:    sltu a0, a0, a2
392 ; RV64-NEXT:    sub a1, a1, a0
393 ; RV64-NEXT:    mul a1, a1, a3
394 ; RV64-NEXT:    add a1, a5, a1
395 ; RV64-NEXT:    mul a0, a4, a3
396 ; RV64-NEXT:    ret
397   %a = udiv iXLen2 %x, 257
398   ret iXLen2 %a
401 define iXLen2 @test_udiv_65535(iXLen2 %x) nounwind {
402 ; RV32-LABEL: test_udiv_65535:
403 ; RV32:       # %bb.0:
404 ; RV32-NEXT:    add a2, a0, a1
405 ; RV32-NEXT:    sltu a3, a2, a0
406 ; RV32-NEXT:    add a2, a2, a3
407 ; RV32-NEXT:    lui a3, 524296
408 ; RV32-NEXT:    addi a3, a3, 1
409 ; RV32-NEXT:    mulhu a3, a2, a3
410 ; RV32-NEXT:    srli a3, a3, 15
411 ; RV32-NEXT:    slli a4, a3, 16
412 ; RV32-NEXT:    sub a3, a3, a4
413 ; RV32-NEXT:    add a2, a2, a3
414 ; RV32-NEXT:    sub a3, a0, a2
415 ; RV32-NEXT:    lui a4, 1048560
416 ; RV32-NEXT:    addi a5, a4, -2
417 ; RV32-NEXT:    mul a5, a3, a5
418 ; RV32-NEXT:    addi a4, a4, -1
419 ; RV32-NEXT:    mulhu a4, a3, a4
420 ; RV32-NEXT:    add a4, a4, a5
421 ; RV32-NEXT:    sltu a0, a0, a2
422 ; RV32-NEXT:    sub a1, a1, a0
423 ; RV32-NEXT:    slli a0, a1, 16
424 ; RV32-NEXT:    add a0, a0, a1
425 ; RV32-NEXT:    sub a1, a4, a0
426 ; RV32-NEXT:    slli a0, a3, 16
427 ; RV32-NEXT:    neg a2, a3
428 ; RV32-NEXT:    sub a0, a2, a0
429 ; RV32-NEXT:    ret
431 ; RV64-LABEL: test_udiv_65535:
432 ; RV64:       # %bb.0:
433 ; RV64-NEXT:    add a2, a0, a1
434 ; RV64-NEXT:    sltu a3, a2, a0
435 ; RV64-NEXT:    add a2, a2, a3
436 ; RV64-NEXT:    lui a3, 524296
437 ; RV64-NEXT:    addiw a3, a3, 1
438 ; RV64-NEXT:    slli a4, a3, 32
439 ; RV64-NEXT:    add a3, a3, a4
440 ; RV64-NEXT:    mulhu a3, a2, a3
441 ; RV64-NEXT:    srli a3, a3, 15
442 ; RV64-NEXT:    slli a4, a3, 16
443 ; RV64-NEXT:    sub a3, a3, a4
444 ; RV64-NEXT:    add a2, a2, a3
445 ; RV64-NEXT:    sub a3, a0, a2
446 ; RV64-NEXT:    lui a4, 983039
447 ; RV64-NEXT:    slli a4, a4, 4
448 ; RV64-NEXT:    addi a4, a4, -1
449 ; RV64-NEXT:    slli a4, a4, 16
450 ; RV64-NEXT:    addi a4, a4, -2
451 ; RV64-NEXT:    mul a4, a3, a4
452 ; RV64-NEXT:    lui a5, 1048560
453 ; RV64-NEXT:    addiw a5, a5, -1
454 ; RV64-NEXT:    slli a6, a5, 32
455 ; RV64-NEXT:    add a5, a5, a6
456 ; RV64-NEXT:    mulhu a6, a3, a5
457 ; RV64-NEXT:    add a4, a6, a4
458 ; RV64-NEXT:    sltu a0, a0, a2
459 ; RV64-NEXT:    sub a1, a1, a0
460 ; RV64-NEXT:    mul a1, a1, a5
461 ; RV64-NEXT:    add a1, a4, a1
462 ; RV64-NEXT:    mul a0, a3, a5
463 ; RV64-NEXT:    ret
464   %a = udiv iXLen2 %x, 65535
465   ret iXLen2 %a
468 define iXLen2 @test_udiv_65537(iXLen2 %x) nounwind {
469 ; RV32-LABEL: test_udiv_65537:
470 ; RV32:       # %bb.0:
471 ; RV32-NEXT:    add a2, a0, a1
472 ; RV32-NEXT:    sltu a3, a2, a0
473 ; RV32-NEXT:    add a2, a2, a3
474 ; RV32-NEXT:    lui a3, 1048560
475 ; RV32-NEXT:    addi a4, a3, 1
476 ; RV32-NEXT:    mulhu a5, a2, a4
477 ; RV32-NEXT:    and a3, a5, a3
478 ; RV32-NEXT:    srli a5, a5, 16
479 ; RV32-NEXT:    or a3, a3, a5
480 ; RV32-NEXT:    sub a2, a2, a3
481 ; RV32-NEXT:    sub a3, a0, a2
482 ; RV32-NEXT:    mulhu a4, a3, a4
483 ; RV32-NEXT:    slli a5, a3, 16
484 ; RV32-NEXT:    sub a4, a4, a5
485 ; RV32-NEXT:    sltu a0, a0, a2
486 ; RV32-NEXT:    sub a1, a1, a0
487 ; RV32-NEXT:    slli a0, a1, 16
488 ; RV32-NEXT:    sub a1, a1, a0
489 ; RV32-NEXT:    add a1, a4, a1
490 ; RV32-NEXT:    sub a0, a3, a5
491 ; RV32-NEXT:    ret
493 ; RV64-LABEL: test_udiv_65537:
494 ; RV64:       # %bb.0:
495 ; RV64-NEXT:    add a2, a0, a1
496 ; RV64-NEXT:    sltu a3, a2, a0
497 ; RV64-NEXT:    add a2, a2, a3
498 ; RV64-NEXT:    lui a3, 1048560
499 ; RV64-NEXT:    addiw a4, a3, 1
500 ; RV64-NEXT:    slli a5, a4, 32
501 ; RV64-NEXT:    add a4, a4, a5
502 ; RV64-NEXT:    mulhu a5, a2, a4
503 ; RV64-NEXT:    and a3, a5, a3
504 ; RV64-NEXT:    srli a5, a5, 16
505 ; RV64-NEXT:    add a3, a3, a5
506 ; RV64-NEXT:    sub a2, a2, a3
507 ; RV64-NEXT:    sub a3, a0, a2
508 ; RV64-NEXT:    lui a5, 983041
509 ; RV64-NEXT:    slli a5, a5, 4
510 ; RV64-NEXT:    addi a5, a5, -1
511 ; RV64-NEXT:    slli a5, a5, 16
512 ; RV64-NEXT:    mul a5, a3, a5
513 ; RV64-NEXT:    mulhu a6, a3, a4
514 ; RV64-NEXT:    add a5, a6, a5
515 ; RV64-NEXT:    sltu a0, a0, a2
516 ; RV64-NEXT:    sub a1, a1, a0
517 ; RV64-NEXT:    mul a1, a1, a4
518 ; RV64-NEXT:    add a1, a5, a1
519 ; RV64-NEXT:    mul a0, a3, a4
520 ; RV64-NEXT:    ret
521   %a = udiv iXLen2 %x, 65537
522   ret iXLen2 %a
525 define iXLen2 @test_udiv_12(iXLen2 %x) nounwind {
526 ; RV32-LABEL: test_udiv_12:
527 ; RV32:       # %bb.0:
528 ; RV32-NEXT:    slli a2, a1, 30
529 ; RV32-NEXT:    srli a0, a0, 2
530 ; RV32-NEXT:    or a0, a0, a2
531 ; RV32-NEXT:    srli a1, a1, 2
532 ; RV32-NEXT:    add a2, a0, a1
533 ; RV32-NEXT:    sltu a3, a2, a0
534 ; RV32-NEXT:    add a2, a2, a3
535 ; RV32-NEXT:    lui a3, 699051
536 ; RV32-NEXT:    addi a4, a3, -1365
537 ; RV32-NEXT:    mulhu a5, a2, a4
538 ; RV32-NEXT:    srli a6, a5, 1
539 ; RV32-NEXT:    andi a5, a5, -2
540 ; RV32-NEXT:    add a5, a5, a6
541 ; RV32-NEXT:    sub a2, a2, a5
542 ; RV32-NEXT:    sub a5, a0, a2
543 ; RV32-NEXT:    addi a3, a3, -1366
544 ; RV32-NEXT:    mul a3, a5, a3
545 ; RV32-NEXT:    mulhu a6, a5, a4
546 ; RV32-NEXT:    add a3, a6, a3
547 ; RV32-NEXT:    sltu a0, a0, a2
548 ; RV32-NEXT:    sub a1, a1, a0
549 ; RV32-NEXT:    mul a1, a1, a4
550 ; RV32-NEXT:    add a1, a3, a1
551 ; RV32-NEXT:    mul a0, a5, a4
552 ; RV32-NEXT:    ret
554 ; RV64-LABEL: test_udiv_12:
555 ; RV64:       # %bb.0:
556 ; RV64-NEXT:    slli a2, a1, 62
557 ; RV64-NEXT:    srli a0, a0, 2
558 ; RV64-NEXT:    or a0, a0, a2
559 ; RV64-NEXT:    srli a1, a1, 2
560 ; RV64-NEXT:    add a2, a0, a1
561 ; RV64-NEXT:    sltu a3, a2, a0
562 ; RV64-NEXT:    add a2, a2, a3
563 ; RV64-NEXT:    lui a3, 699051
564 ; RV64-NEXT:    addiw a3, a3, -1365
565 ; RV64-NEXT:    slli a4, a3, 32
566 ; RV64-NEXT:    add a3, a3, a4
567 ; RV64-NEXT:    mulhu a4, a2, a3
568 ; RV64-NEXT:    srli a5, a4, 1
569 ; RV64-NEXT:    andi a4, a4, -2
570 ; RV64-NEXT:    lui a6, %hi(.LCPI10_0)
571 ; RV64-NEXT:    ld a6, %lo(.LCPI10_0)(a6)
572 ; RV64-NEXT:    add a4, a4, a5
573 ; RV64-NEXT:    sub a2, a2, a4
574 ; RV64-NEXT:    sub a4, a0, a2
575 ; RV64-NEXT:    mul a5, a4, a6
576 ; RV64-NEXT:    mulhu a6, a4, a3
577 ; RV64-NEXT:    add a5, a6, a5
578 ; RV64-NEXT:    sltu a0, a0, a2
579 ; RV64-NEXT:    sub a1, a1, a0
580 ; RV64-NEXT:    mul a1, a1, a3
581 ; RV64-NEXT:    add a1, a5, a1
582 ; RV64-NEXT:    mul a0, a4, a3
583 ; RV64-NEXT:    ret
584   %a = udiv iXLen2 %x, 12
585   ret iXLen2 %a