[TTI] getTypeBasedIntrinsicInstrCost - add basic handling for strided load/store...
[llvm-project.git] / llvm / test / CodeGen / RISCV / split-udiv-by-constant.ll
blob83ae03452db5b3334cb580b6480f37ef4320fc07
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:    lui a3, 699051
12 ; RV32-NEXT:    sltu a4, a2, a0
13 ; RV32-NEXT:    addi a5, a3, -1365
14 ; RV32-NEXT:    addi a3, a3, -1366
15 ; RV32-NEXT:    add a2, a2, a4
16 ; RV32-NEXT:    mulhu a4, a2, a5
17 ; RV32-NEXT:    srli a6, a4, 1
18 ; RV32-NEXT:    andi a4, a4, -2
19 ; RV32-NEXT:    add a4, a4, a6
20 ; RV32-NEXT:    sub a2, a2, a4
21 ; RV32-NEXT:    sub a4, a0, a2
22 ; RV32-NEXT:    sltu a0, a0, a2
23 ; RV32-NEXT:    mul a2, a4, a3
24 ; RV32-NEXT:    mulhu a3, a4, a5
25 ; RV32-NEXT:    sub a1, a1, a0
26 ; RV32-NEXT:    add a2, a3, a2
27 ; RV32-NEXT:    mul a1, a1, a5
28 ; RV32-NEXT:    add a1, a2, a1
29 ; RV32-NEXT:    mul a0, a4, a5
30 ; RV32-NEXT:    ret
32 ; RV64-LABEL: test_udiv_3:
33 ; RV64:       # %bb.0:
34 ; RV64-NEXT:    add a2, a0, a1
35 ; RV64-NEXT:    lui a3, 699051
36 ; RV64-NEXT:    lui a4, %hi(.LCPI0_0)
37 ; RV64-NEXT:    sltu a5, a2, a0
38 ; RV64-NEXT:    addiw a3, a3, -1365
39 ; RV64-NEXT:    ld a4, %lo(.LCPI0_0)(a4)
40 ; RV64-NEXT:    add a2, a2, a5
41 ; RV64-NEXT:    slli a5, a3, 32
42 ; RV64-NEXT:    add a3, a3, a5
43 ; RV64-NEXT:    mulhu a5, a2, a3
44 ; RV64-NEXT:    srli a6, a5, 1
45 ; RV64-NEXT:    andi a5, a5, -2
46 ; RV64-NEXT:    add a5, a5, a6
47 ; RV64-NEXT:    sub a2, a2, a5
48 ; RV64-NEXT:    sub a5, a0, a2
49 ; RV64-NEXT:    sltu a0, a0, a2
50 ; RV64-NEXT:    mul a2, a5, a4
51 ; RV64-NEXT:    mulhu a4, a5, a3
52 ; RV64-NEXT:    sub a1, a1, a0
53 ; RV64-NEXT:    add a2, a4, a2
54 ; RV64-NEXT:    mul a1, a1, a3
55 ; RV64-NEXT:    add a1, a2, a1
56 ; RV64-NEXT:    mul a0, a5, 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:    lui a3, 838861
67 ; RV32-NEXT:    sltu a4, a2, a0
68 ; RV32-NEXT:    addi a5, a3, -819
69 ; RV32-NEXT:    addi a3, a3, -820
70 ; RV32-NEXT:    add a2, a2, a4
71 ; RV32-NEXT:    mulhu a4, a2, a5
72 ; RV32-NEXT:    srli a6, a4, 2
73 ; RV32-NEXT:    andi a4, a4, -4
74 ; RV32-NEXT:    add a4, a4, a6
75 ; RV32-NEXT:    sub a2, a2, a4
76 ; RV32-NEXT:    sub a4, a0, a2
77 ; RV32-NEXT:    sltu a0, a0, a2
78 ; RV32-NEXT:    mul a2, a4, a3
79 ; RV32-NEXT:    mulhu a3, a4, a5
80 ; RV32-NEXT:    sub a1, a1, a0
81 ; RV32-NEXT:    add a2, a3, a2
82 ; RV32-NEXT:    mul a1, a1, a5
83 ; RV32-NEXT:    add a1, a2, a1
84 ; RV32-NEXT:    mul a0, a4, a5
85 ; RV32-NEXT:    ret
87 ; RV64-LABEL: test_udiv_5:
88 ; RV64:       # %bb.0:
89 ; RV64-NEXT:    add a2, a0, a1
90 ; RV64-NEXT:    lui a3, 838861
91 ; RV64-NEXT:    lui a4, %hi(.LCPI1_0)
92 ; RV64-NEXT:    sltu a5, a2, a0
93 ; RV64-NEXT:    addiw a3, a3, -819
94 ; RV64-NEXT:    ld a4, %lo(.LCPI1_0)(a4)
95 ; RV64-NEXT:    add a2, a2, a5
96 ; RV64-NEXT:    slli a5, a3, 32
97 ; RV64-NEXT:    add a3, a3, a5
98 ; RV64-NEXT:    mulhu a5, a2, a3
99 ; RV64-NEXT:    srli a6, a5, 2
100 ; RV64-NEXT:    andi a5, a5, -4
101 ; RV64-NEXT:    add a5, a5, a6
102 ; RV64-NEXT:    sub a2, a2, a5
103 ; RV64-NEXT:    sub a5, a0, a2
104 ; RV64-NEXT:    sltu a0, a0, a2
105 ; RV64-NEXT:    mul a2, a5, a4
106 ; RV64-NEXT:    mulhu a4, a5, a3
107 ; RV64-NEXT:    sub a1, a1, a0
108 ; RV64-NEXT:    add a2, a4, a2
109 ; RV64-NEXT:    mul a1, a1, a3
110 ; RV64-NEXT:    add a1, a2, a1
111 ; RV64-NEXT:    mul a0, a5, 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:    lui a3, 559241
174 ; RV32-NEXT:    lui a4, 978671
175 ; RV32-NEXT:    sltu a5, a2, a0
176 ; RV32-NEXT:    addi a3, a3, -1911
177 ; RV32-NEXT:    addi a6, a4, -274
178 ; RV32-NEXT:    addi a4, a4, -273
179 ; RV32-NEXT:    add a2, a2, a5
180 ; RV32-NEXT:    mulhu a3, a2, a3
181 ; RV32-NEXT:    srli a3, a3, 3
182 ; RV32-NEXT:    slli a5, a3, 4
183 ; RV32-NEXT:    sub a3, a3, a5
184 ; RV32-NEXT:    add a2, a2, a3
185 ; RV32-NEXT:    sub a3, a0, a2
186 ; RV32-NEXT:    sltu a0, a0, a2
187 ; RV32-NEXT:    mul a2, a3, a6
188 ; RV32-NEXT:    mulhu a5, a3, a4
189 ; RV32-NEXT:    sub a1, a1, a0
190 ; RV32-NEXT:    add a2, a5, a2
191 ; RV32-NEXT:    mul a1, a1, a4
192 ; RV32-NEXT:    add a1, a2, 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:    lui a3, 559241
200 ; RV64-NEXT:    lui a4, %hi(.LCPI4_0)
201 ; RV64-NEXT:    lui a5, 978671
202 ; RV64-NEXT:    sltu a6, a2, a0
203 ; RV64-NEXT:    addiw a3, a3, -1911
204 ; RV64-NEXT:    ld a4, %lo(.LCPI4_0)(a4)
205 ; RV64-NEXT:    addiw a5, a5, -273
206 ; RV64-NEXT:    add a2, a2, a6
207 ; RV64-NEXT:    slli a6, a3, 32
208 ; RV64-NEXT:    add a3, a3, a6
209 ; RV64-NEXT:    slli a6, a5, 32
210 ; RV64-NEXT:    add a5, a5, a6
211 ; RV64-NEXT:    mulhu a3, a2, a3
212 ; RV64-NEXT:    srli a3, a3, 3
213 ; RV64-NEXT:    slli a6, a3, 4
214 ; RV64-NEXT:    sub a3, a3, a6
215 ; RV64-NEXT:    add a2, a2, a3
216 ; RV64-NEXT:    sub a3, a0, a2
217 ; RV64-NEXT:    sltu a0, a0, a2
218 ; RV64-NEXT:    mul a2, a3, a4
219 ; RV64-NEXT:    mulhu a4, a3, a5
220 ; RV64-NEXT:    sub a1, a1, a0
221 ; RV64-NEXT:    add a2, a4, a2
222 ; RV64-NEXT:    mul a1, a1, a5
223 ; RV64-NEXT:    add a1, a2, 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:    lui a3, 986895
235 ; RV32-NEXT:    sltu a4, a2, a0
236 ; RV32-NEXT:    addi a5, a3, 241
237 ; RV32-NEXT:    addi a3, a3, 240
238 ; RV32-NEXT:    add a2, a2, a4
239 ; RV32-NEXT:    mulhu a4, a2, a5
240 ; RV32-NEXT:    srli a6, a4, 4
241 ; RV32-NEXT:    andi a4, a4, -16
242 ; RV32-NEXT:    add a4, a4, a6
243 ; RV32-NEXT:    sub a2, a2, a4
244 ; RV32-NEXT:    sub a4, a0, a2
245 ; RV32-NEXT:    sltu a0, a0, a2
246 ; RV32-NEXT:    mul a2, a4, a3
247 ; RV32-NEXT:    mulhu a3, a4, a5
248 ; RV32-NEXT:    sub a1, a1, a0
249 ; RV32-NEXT:    add a2, a3, a2
250 ; RV32-NEXT:    mul a1, a1, a5
251 ; RV32-NEXT:    add a1, a2, a1
252 ; RV32-NEXT:    mul a0, a4, a5
253 ; RV32-NEXT:    ret
255 ; RV64-LABEL: test_udiv_17:
256 ; RV64:       # %bb.0:
257 ; RV64-NEXT:    add a2, a0, a1
258 ; RV64-NEXT:    lui a3, 986895
259 ; RV64-NEXT:    lui a4, %hi(.LCPI5_0)
260 ; RV64-NEXT:    sltu a5, a2, a0
261 ; RV64-NEXT:    addiw a3, a3, 241
262 ; RV64-NEXT:    ld a4, %lo(.LCPI5_0)(a4)
263 ; RV64-NEXT:    add a2, a2, a5
264 ; RV64-NEXT:    slli a5, a3, 32
265 ; RV64-NEXT:    add a3, a3, a5
266 ; RV64-NEXT:    mulhu a5, a2, a3
267 ; RV64-NEXT:    srli a6, a5, 4
268 ; RV64-NEXT:    andi a5, a5, -16
269 ; RV64-NEXT:    add a5, a5, a6
270 ; RV64-NEXT:    sub a2, a2, a5
271 ; RV64-NEXT:    sub a5, a0, a2
272 ; RV64-NEXT:    sltu a0, a0, a2
273 ; RV64-NEXT:    mul a2, a5, a4
274 ; RV64-NEXT:    mulhu a4, a5, a3
275 ; RV64-NEXT:    sub a1, a1, a0
276 ; RV64-NEXT:    add a2, a4, a2
277 ; RV64-NEXT:    mul a1, a1, a3
278 ; RV64-NEXT:    add a1, a2, a1
279 ; RV64-NEXT:    mul a0, a5, 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:    lui a3, 526344
290 ; RV32-NEXT:    lui a4, 1044464
291 ; RV32-NEXT:    sltu a5, a2, a0
292 ; RV32-NEXT:    addi a3, a3, 129
293 ; RV32-NEXT:    addi a6, a4, -258
294 ; RV32-NEXT:    addi a4, a4, -257
295 ; RV32-NEXT:    add a2, a2, a5
296 ; RV32-NEXT:    mulhu a3, a2, a3
297 ; RV32-NEXT:    srli a3, a3, 7
298 ; RV32-NEXT:    slli a5, a3, 8
299 ; RV32-NEXT:    sub a3, a3, a5
300 ; RV32-NEXT:    add a2, a2, a3
301 ; RV32-NEXT:    sub a3, a0, a2
302 ; RV32-NEXT:    sltu a0, a0, a2
303 ; RV32-NEXT:    mul a2, a3, a6
304 ; RV32-NEXT:    mulhu a5, a3, a4
305 ; RV32-NEXT:    sub a1, a1, a0
306 ; RV32-NEXT:    add a2, a5, a2
307 ; RV32-NEXT:    mul a1, a1, a4
308 ; RV32-NEXT:    add a1, a2, 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:    lui a3, 526344
316 ; RV64-NEXT:    lui a4, %hi(.LCPI6_0)
317 ; RV64-NEXT:    lui a5, 1044464
318 ; RV64-NEXT:    sltu a6, a2, a0
319 ; RV64-NEXT:    addiw a3, a3, 129
320 ; RV64-NEXT:    ld a4, %lo(.LCPI6_0)(a4)
321 ; RV64-NEXT:    addiw a5, a5, -257
322 ; RV64-NEXT:    add a2, a2, a6
323 ; RV64-NEXT:    slli a6, a3, 32
324 ; RV64-NEXT:    add a3, a3, a6
325 ; RV64-NEXT:    slli a6, a5, 32
326 ; RV64-NEXT:    add a5, a5, a6
327 ; RV64-NEXT:    mulhu a3, a2, a3
328 ; RV64-NEXT:    srli a3, a3, 7
329 ; RV64-NEXT:    slli a6, a3, 8
330 ; RV64-NEXT:    sub a3, a3, a6
331 ; RV64-NEXT:    add a2, a2, a3
332 ; RV64-NEXT:    sub a3, a0, a2
333 ; RV64-NEXT:    sltu a0, a0, a2
334 ; RV64-NEXT:    mul a2, a3, a4
335 ; RV64-NEXT:    mulhu a4, a3, a5
336 ; RV64-NEXT:    sub a1, a1, a0
337 ; RV64-NEXT:    add a2, a4, a2
338 ; RV64-NEXT:    mul a1, a1, a5
339 ; RV64-NEXT:    add a1, a2, 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:    lui a3, 1044496
351 ; RV32-NEXT:    sltu a4, a2, a0
352 ; RV32-NEXT:    addi a5, a3, -255
353 ; RV32-NEXT:    addi a3, a3, -256
354 ; RV32-NEXT:    add a2, a2, a4
355 ; RV32-NEXT:    mulhu a4, a2, a5
356 ; RV32-NEXT:    srli a6, a4, 8
357 ; RV32-NEXT:    andi a4, a4, -256
358 ; RV32-NEXT:    add a4, a4, a6
359 ; RV32-NEXT:    sub a2, a2, a4
360 ; RV32-NEXT:    sub a4, a0, a2
361 ; RV32-NEXT:    sltu a0, a0, a2
362 ; RV32-NEXT:    mul a2, a4, a3
363 ; RV32-NEXT:    mulhu a3, a4, a5
364 ; RV32-NEXT:    sub a1, a1, a0
365 ; RV32-NEXT:    add a2, a3, a2
366 ; RV32-NEXT:    mul a1, a1, a5
367 ; RV32-NEXT:    add a1, a2, a1
368 ; RV32-NEXT:    mul a0, a4, a5
369 ; RV32-NEXT:    ret
371 ; RV64-LABEL: test_udiv_257:
372 ; RV64:       # %bb.0:
373 ; RV64-NEXT:    add a2, a0, a1
374 ; RV64-NEXT:    lui a3, 1044496
375 ; RV64-NEXT:    lui a4, %hi(.LCPI7_0)
376 ; RV64-NEXT:    sltu a5, a2, a0
377 ; RV64-NEXT:    addiw a3, a3, -255
378 ; RV64-NEXT:    ld a4, %lo(.LCPI7_0)(a4)
379 ; RV64-NEXT:    add a2, a2, a5
380 ; RV64-NEXT:    slli a5, a3, 32
381 ; RV64-NEXT:    add a3, a3, a5
382 ; RV64-NEXT:    mulhu a5, a2, a3
383 ; RV64-NEXT:    srli a6, a5, 8
384 ; RV64-NEXT:    andi a5, a5, -256
385 ; RV64-NEXT:    add a5, a5, a6
386 ; RV64-NEXT:    sub a2, a2, a5
387 ; RV64-NEXT:    sub a5, a0, a2
388 ; RV64-NEXT:    sltu a0, a0, a2
389 ; RV64-NEXT:    mul a2, a5, a4
390 ; RV64-NEXT:    mulhu a4, a5, a3
391 ; RV64-NEXT:    sub a1, a1, a0
392 ; RV64-NEXT:    add a2, a4, a2
393 ; RV64-NEXT:    mul a1, a1, a3
394 ; RV64-NEXT:    add a1, a2, a1
395 ; RV64-NEXT:    mul a0, a5, 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:    lui a3, 524296
406 ; RV32-NEXT:    lui a4, 1048560
407 ; RV32-NEXT:    sltu a5, a2, a0
408 ; RV32-NEXT:    addi a3, a3, 1
409 ; RV32-NEXT:    add a2, a2, a5
410 ; RV32-NEXT:    mulhu a3, a2, a3
411 ; RV32-NEXT:    srli a3, a3, 15
412 ; RV32-NEXT:    slli a5, a3, 16
413 ; RV32-NEXT:    sub a3, a3, a5
414 ; RV32-NEXT:    addi a5, a4, -2
415 ; RV32-NEXT:    addi a4, a4, -1
416 ; RV32-NEXT:    add a2, a2, a3
417 ; RV32-NEXT:    sub a3, a0, a2
418 ; RV32-NEXT:    sltu a0, a0, a2
419 ; RV32-NEXT:    mul a2, a3, a5
420 ; RV32-NEXT:    mulhu a4, a3, a4
421 ; RV32-NEXT:    sub a1, a1, a0
422 ; RV32-NEXT:    slli a0, a3, 16
423 ; RV32-NEXT:    neg a3, a3
424 ; RV32-NEXT:    add a2, a4, a2
425 ; RV32-NEXT:    slli a4, a1, 16
426 ; RV32-NEXT:    add a1, a4, a1
427 ; RV32-NEXT:    sub a1, a2, a1
428 ; RV32-NEXT:    sub a0, a3, 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:    lui a3, 524296
435 ; RV64-NEXT:    lui a4, 983039
436 ; RV64-NEXT:    lui a5, 1048560
437 ; RV64-NEXT:    sltu a6, a2, a0
438 ; RV64-NEXT:    addiw a3, a3, 1
439 ; RV64-NEXT:    slli a4, a4, 4
440 ; RV64-NEXT:    addiw a5, a5, -1
441 ; RV64-NEXT:    add a2, a2, a6
442 ; RV64-NEXT:    slli a6, a3, 32
443 ; RV64-NEXT:    addi a4, a4, -1
444 ; RV64-NEXT:    add a3, a3, a6
445 ; RV64-NEXT:    slli a6, a5, 32
446 ; RV64-NEXT:    slli a4, a4, 16
447 ; RV64-NEXT:    add a5, a5, a6
448 ; RV64-NEXT:    mulhu a3, a2, a3
449 ; RV64-NEXT:    addi a4, a4, -2
450 ; RV64-NEXT:    srli a3, a3, 15
451 ; RV64-NEXT:    slli a6, a3, 16
452 ; RV64-NEXT:    sub a3, a3, a6
453 ; RV64-NEXT:    add a2, a2, a3
454 ; RV64-NEXT:    sub a3, a0, a2
455 ; RV64-NEXT:    sltu a0, a0, a2
456 ; RV64-NEXT:    mul a2, a3, a4
457 ; RV64-NEXT:    mulhu a4, a3, a5
458 ; RV64-NEXT:    sub a1, a1, a0
459 ; RV64-NEXT:    add a2, a4, a2
460 ; RV64-NEXT:    mul a1, a1, a5
461 ; RV64-NEXT:    add a1, a2, 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:    lui a3, 1048560
473 ; RV32-NEXT:    sltu a4, a2, a0
474 ; RV32-NEXT:    addi a5, a3, 1
475 ; RV32-NEXT:    add a2, a2, a4
476 ; RV32-NEXT:    mulhu a4, a2, a5
477 ; RV32-NEXT:    and a3, a4, a3
478 ; RV32-NEXT:    srli a4, a4, 16
479 ; RV32-NEXT:    or a3, a3, a4
480 ; RV32-NEXT:    sub a2, a2, a3
481 ; RV32-NEXT:    sub a3, a0, a2
482 ; RV32-NEXT:    sltu a0, a0, a2
483 ; RV32-NEXT:    mulhu a2, a3, a5
484 ; RV32-NEXT:    slli a4, a3, 16
485 ; RV32-NEXT:    sub a1, a1, a0
486 ; RV32-NEXT:    sub a2, a2, a4
487 ; RV32-NEXT:    slli a0, a1, 16
488 ; RV32-NEXT:    sub a1, a1, a0
489 ; RV32-NEXT:    add a1, a2, a1
490 ; RV32-NEXT:    sub a0, a3, a4
491 ; RV32-NEXT:    ret
493 ; RV64-LABEL: test_udiv_65537:
494 ; RV64:       # %bb.0:
495 ; RV64-NEXT:    add a2, a0, a1
496 ; RV64-NEXT:    lui a3, 1048560
497 ; RV64-NEXT:    lui a4, 983041
498 ; RV64-NEXT:    sltu a5, a2, a0
499 ; RV64-NEXT:    addiw a6, a3, 1
500 ; RV64-NEXT:    slli a4, a4, 4
501 ; RV64-NEXT:    add a2, a2, a5
502 ; RV64-NEXT:    slli a5, a6, 32
503 ; RV64-NEXT:    addi a4, a4, -1
504 ; RV64-NEXT:    add a5, a6, a5
505 ; RV64-NEXT:    slli a4, a4, 16
506 ; RV64-NEXT:    mulhu a6, a2, a5
507 ; RV64-NEXT:    and a3, a6, a3
508 ; RV64-NEXT:    srli a6, a6, 16
509 ; RV64-NEXT:    add a3, a3, a6
510 ; RV64-NEXT:    sub a2, a2, a3
511 ; RV64-NEXT:    sub a3, a0, a2
512 ; RV64-NEXT:    sltu a0, a0, a2
513 ; RV64-NEXT:    mul a2, a3, a4
514 ; RV64-NEXT:    mulhu a4, a3, a5
515 ; RV64-NEXT:    sub a1, a1, a0
516 ; RV64-NEXT:    add a2, a4, a2
517 ; RV64-NEXT:    mul a1, a1, a5
518 ; RV64-NEXT:    add a1, a2, a1
519 ; RV64-NEXT:    mul a0, a3, a5
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:    srli a1, a1, 2
531 ; RV32-NEXT:    lui a3, 699051
532 ; RV32-NEXT:    or a0, a0, a2
533 ; RV32-NEXT:    addi a2, a3, -1365
534 ; RV32-NEXT:    addi a3, a3, -1366
535 ; RV32-NEXT:    add a4, a0, a1
536 ; RV32-NEXT:    sltu a5, a4, a0
537 ; RV32-NEXT:    add a4, a4, a5
538 ; RV32-NEXT:    mulhu a5, a4, a2
539 ; RV32-NEXT:    srli a6, a5, 1
540 ; RV32-NEXT:    andi a5, a5, -2
541 ; RV32-NEXT:    add a5, a5, a6
542 ; RV32-NEXT:    sub a4, a4, a5
543 ; RV32-NEXT:    sub a5, a0, a4
544 ; RV32-NEXT:    sltu a0, a0, a4
545 ; RV32-NEXT:    mul a3, a5, a3
546 ; RV32-NEXT:    mulhu a4, a5, a2
547 ; RV32-NEXT:    sub a1, a1, a0
548 ; RV32-NEXT:    add a3, a4, a3
549 ; RV32-NEXT:    mul a1, a1, a2
550 ; RV32-NEXT:    add a1, a3, a1
551 ; RV32-NEXT:    mul a0, a5, a2
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:    srli a1, a1, 2
559 ; RV64-NEXT:    lui a3, 699051
560 ; RV64-NEXT:    lui a4, %hi(.LCPI10_0)
561 ; RV64-NEXT:    or a0, a0, a2
562 ; RV64-NEXT:    addiw a2, a3, -1365
563 ; RV64-NEXT:    ld a3, %lo(.LCPI10_0)(a4)
564 ; RV64-NEXT:    add a4, a0, a1
565 ; RV64-NEXT:    slli a5, a2, 32
566 ; RV64-NEXT:    sltu a6, a4, a0
567 ; RV64-NEXT:    add a2, a2, a5
568 ; RV64-NEXT:    add a4, a4, a6
569 ; RV64-NEXT:    mulhu a5, a4, a2
570 ; RV64-NEXT:    srli a6, a5, 1
571 ; RV64-NEXT:    andi a5, a5, -2
572 ; RV64-NEXT:    add a5, a5, a6
573 ; RV64-NEXT:    sub a4, a4, a5
574 ; RV64-NEXT:    sub a5, a0, a4
575 ; RV64-NEXT:    sltu a0, a0, a4
576 ; RV64-NEXT:    mul a3, a5, a3
577 ; RV64-NEXT:    mulhu a4, a5, a2
578 ; RV64-NEXT:    sub a1, a1, a0
579 ; RV64-NEXT:    add a3, a4, a3
580 ; RV64-NEXT:    mul a1, a1, a2
581 ; RV64-NEXT:    add a1, a3, a1
582 ; RV64-NEXT:    mul a0, a5, a2
583 ; RV64-NEXT:    ret
584   %a = udiv iXLen2 %x, 12
585   ret iXLen2 %a