Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / RISCV / rv64-legal-i32 / div.ll
blob17d9e9cefe117efb99cc638b53482f8bc918d6f9
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
3 ; RUN:   -riscv-experimental-rv64-legal-i32 | FileCheck -check-prefix=RV64I %s
4 ; RUN: llc -mtriple=riscv64 -mattr=+m -verify-machineinstrs < %s \
5 ; RUN:   -riscv-experimental-rv64-legal-i32 | FileCheck -check-prefix=RV64IM %s
7 define i32 @udiv(i32 %a, i32 %b) nounwind {
8 ; RV64I-LABEL: udiv:
9 ; RV64I:       # %bb.0:
10 ; RV64I-NEXT:    addi sp, sp, -16
11 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
12 ; RV64I-NEXT:    slli a0, a0, 32
13 ; RV64I-NEXT:    srli a0, a0, 32
14 ; RV64I-NEXT:    slli a1, a1, 32
15 ; RV64I-NEXT:    srli a1, a1, 32
16 ; RV64I-NEXT:    call __udivdi3
17 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
18 ; RV64I-NEXT:    addi sp, sp, 16
19 ; RV64I-NEXT:    ret
21 ; RV64IM-LABEL: udiv:
22 ; RV64IM:       # %bb.0:
23 ; RV64IM-NEXT:    divuw a0, a0, a1
24 ; RV64IM-NEXT:    ret
25   %1 = udiv i32 %a, %b
26   ret i32 %1
29 define i32 @udiv_constant(i32 %a) nounwind {
30 ; RV64I-LABEL: udiv_constant:
31 ; RV64I:       # %bb.0:
32 ; RV64I-NEXT:    addi sp, sp, -16
33 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
34 ; RV64I-NEXT:    slli a0, a0, 32
35 ; RV64I-NEXT:    srli a0, a0, 32
36 ; RV64I-NEXT:    li a1, 5
37 ; RV64I-NEXT:    call __udivdi3
38 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
39 ; RV64I-NEXT:    addi sp, sp, 16
40 ; RV64I-NEXT:    ret
42 ; RV64IM-LABEL: udiv_constant:
43 ; RV64IM:       # %bb.0:
44 ; RV64IM-NEXT:    slli a0, a0, 32
45 ; RV64IM-NEXT:    lui a1, 838861
46 ; RV64IM-NEXT:    addi a1, a1, -819
47 ; RV64IM-NEXT:    slli a1, a1, 32
48 ; RV64IM-NEXT:    mulhu a0, a0, a1
49 ; RV64IM-NEXT:    srli a0, a0, 34
50 ; RV64IM-NEXT:    ret
51   %1 = udiv i32 %a, 5
52   ret i32 %1
55 define i32 @udiv_pow2(i32 %a) nounwind {
56 ; RV64I-LABEL: udiv_pow2:
57 ; RV64I:       # %bb.0:
58 ; RV64I-NEXT:    srliw a0, a0, 3
59 ; RV64I-NEXT:    ret
61 ; RV64IM-LABEL: udiv_pow2:
62 ; RV64IM:       # %bb.0:
63 ; RV64IM-NEXT:    srliw a0, a0, 3
64 ; RV64IM-NEXT:    ret
65   %1 = udiv i32 %a, 8
66   ret i32 %1
69 define i32 @udiv_constant_lhs(i32 %a) nounwind {
70 ; RV64I-LABEL: udiv_constant_lhs:
71 ; RV64I:       # %bb.0:
72 ; RV64I-NEXT:    addi sp, sp, -16
73 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
74 ; RV64I-NEXT:    slli a0, a0, 32
75 ; RV64I-NEXT:    srli a1, a0, 32
76 ; RV64I-NEXT:    li a0, 10
77 ; RV64I-NEXT:    call __udivdi3
78 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
79 ; RV64I-NEXT:    addi sp, sp, 16
80 ; RV64I-NEXT:    ret
82 ; RV64IM-LABEL: udiv_constant_lhs:
83 ; RV64IM:       # %bb.0:
84 ; RV64IM-NEXT:    li a1, 10
85 ; RV64IM-NEXT:    divuw a0, a1, a0
86 ; RV64IM-NEXT:    ret
87   %1 = udiv i32 10, %a
88   ret i32 %1
91 define i64 @udiv64(i64 %a, i64 %b) nounwind {
92 ; RV64I-LABEL: udiv64:
93 ; RV64I:       # %bb.0:
94 ; RV64I-NEXT:    tail __udivdi3
96 ; RV64IM-LABEL: udiv64:
97 ; RV64IM:       # %bb.0:
98 ; RV64IM-NEXT:    divu a0, a0, a1
99 ; RV64IM-NEXT:    ret
100   %1 = udiv i64 %a, %b
101   ret i64 %1
104 define i64 @udiv64_constant(i64 %a) nounwind {
105 ; RV64I-LABEL: udiv64_constant:
106 ; RV64I:       # %bb.0:
107 ; RV64I-NEXT:    li a1, 5
108 ; RV64I-NEXT:    tail __udivdi3
110 ; RV64IM-LABEL: udiv64_constant:
111 ; RV64IM:       # %bb.0:
112 ; RV64IM-NEXT:    lui a1, 838861
113 ; RV64IM-NEXT:    addiw a1, a1, -819
114 ; RV64IM-NEXT:    slli a2, a1, 32
115 ; RV64IM-NEXT:    add a1, a1, a2
116 ; RV64IM-NEXT:    mulhu a0, a0, a1
117 ; RV64IM-NEXT:    srli a0, a0, 2
118 ; RV64IM-NEXT:    ret
119   %1 = udiv i64 %a, 5
120   ret i64 %1
123 define i64 @udiv64_constant_lhs(i64 %a) nounwind {
124 ; RV64I-LABEL: udiv64_constant_lhs:
125 ; RV64I:       # %bb.0:
126 ; RV64I-NEXT:    mv a1, a0
127 ; RV64I-NEXT:    li a0, 10
128 ; RV64I-NEXT:    tail __udivdi3
130 ; RV64IM-LABEL: udiv64_constant_lhs:
131 ; RV64IM:       # %bb.0:
132 ; RV64IM-NEXT:    li a1, 10
133 ; RV64IM-NEXT:    divu a0, a1, a0
134 ; RV64IM-NEXT:    ret
135   %1 = udiv i64 10, %a
136   ret i64 %1
139 define i8 @udiv8(i8 %a, i8 %b) nounwind {
140 ; RV64I-LABEL: udiv8:
141 ; RV64I:       # %bb.0:
142 ; RV64I-NEXT:    addi sp, sp, -16
143 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
144 ; RV64I-NEXT:    andi a0, a0, 255
145 ; RV64I-NEXT:    andi a1, a1, 255
146 ; RV64I-NEXT:    call __udivdi3
147 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
148 ; RV64I-NEXT:    addi sp, sp, 16
149 ; RV64I-NEXT:    ret
151 ; RV64IM-LABEL: udiv8:
152 ; RV64IM:       # %bb.0:
153 ; RV64IM-NEXT:    andi a1, a1, 255
154 ; RV64IM-NEXT:    andi a0, a0, 255
155 ; RV64IM-NEXT:    divuw a0, a0, a1
156 ; RV64IM-NEXT:    ret
157   %1 = udiv i8 %a, %b
158   ret i8 %1
161 define i8 @udiv8_constant(i8 %a) nounwind {
162 ; RV64I-LABEL: udiv8_constant:
163 ; RV64I:       # %bb.0:
164 ; RV64I-NEXT:    addi sp, sp, -16
165 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
166 ; RV64I-NEXT:    andi a0, a0, 255
167 ; RV64I-NEXT:    li a1, 5
168 ; RV64I-NEXT:    call __udivdi3
169 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
170 ; RV64I-NEXT:    addi sp, sp, 16
171 ; RV64I-NEXT:    ret
173 ; RV64IM-LABEL: udiv8_constant:
174 ; RV64IM:       # %bb.0:
175 ; RV64IM-NEXT:    andi a0, a0, 255
176 ; RV64IM-NEXT:    li a1, 205
177 ; RV64IM-NEXT:    mul a0, a0, a1
178 ; RV64IM-NEXT:    srliw a0, a0, 10
179 ; RV64IM-NEXT:    ret
180   %1 = udiv i8 %a, 5
181   ret i8 %1
184 define i8 @udiv8_pow2(i8 %a) nounwind {
185 ; RV64I-LABEL: udiv8_pow2:
186 ; RV64I:       # %bb.0:
187 ; RV64I-NEXT:    slli a0, a0, 56
188 ; RV64I-NEXT:    srli a0, a0, 59
189 ; RV64I-NEXT:    ret
191 ; RV64IM-LABEL: udiv8_pow2:
192 ; RV64IM:       # %bb.0:
193 ; RV64IM-NEXT:    slli a0, a0, 56
194 ; RV64IM-NEXT:    srli a0, a0, 59
195 ; RV64IM-NEXT:    ret
196   %1 = udiv i8 %a, 8
197   ret i8 %1
200 define i8 @udiv8_constant_lhs(i8 %a) nounwind {
201 ; RV64I-LABEL: udiv8_constant_lhs:
202 ; RV64I:       # %bb.0:
203 ; RV64I-NEXT:    addi sp, sp, -16
204 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
205 ; RV64I-NEXT:    andi a1, a0, 255
206 ; RV64I-NEXT:    li a0, 10
207 ; RV64I-NEXT:    call __udivdi3
208 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
209 ; RV64I-NEXT:    addi sp, sp, 16
210 ; RV64I-NEXT:    ret
212 ; RV64IM-LABEL: udiv8_constant_lhs:
213 ; RV64IM:       # %bb.0:
214 ; RV64IM-NEXT:    andi a0, a0, 255
215 ; RV64IM-NEXT:    li a1, 10
216 ; RV64IM-NEXT:    divuw a0, a1, a0
217 ; RV64IM-NEXT:    ret
218   %1 = udiv i8 10, %a
219   ret i8 %1
222 define i16 @udiv16(i16 %a, i16 %b) nounwind {
223 ; RV64I-LABEL: udiv16:
224 ; RV64I:       # %bb.0:
225 ; RV64I-NEXT:    addi sp, sp, -16
226 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
227 ; RV64I-NEXT:    lui a2, 16
228 ; RV64I-NEXT:    addiw a2, a2, -1
229 ; RV64I-NEXT:    and a0, a0, a2
230 ; RV64I-NEXT:    and a1, a1, a2
231 ; RV64I-NEXT:    call __udivdi3
232 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
233 ; RV64I-NEXT:    addi sp, sp, 16
234 ; RV64I-NEXT:    ret
236 ; RV64IM-LABEL: udiv16:
237 ; RV64IM:       # %bb.0:
238 ; RV64IM-NEXT:    lui a2, 16
239 ; RV64IM-NEXT:    addi a2, a2, -1
240 ; RV64IM-NEXT:    and a1, a1, a2
241 ; RV64IM-NEXT:    and a0, a0, a2
242 ; RV64IM-NEXT:    divuw a0, a0, a1
243 ; RV64IM-NEXT:    ret
244   %1 = udiv i16 %a, %b
245   ret i16 %1
248 define i16 @udiv16_constant(i16 %a) nounwind {
249 ; RV64I-LABEL: udiv16_constant:
250 ; RV64I:       # %bb.0:
251 ; RV64I-NEXT:    addi sp, sp, -16
252 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
253 ; RV64I-NEXT:    slli a0, a0, 48
254 ; RV64I-NEXT:    srli a0, a0, 48
255 ; RV64I-NEXT:    li a1, 5
256 ; RV64I-NEXT:    call __udivdi3
257 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
258 ; RV64I-NEXT:    addi sp, sp, 16
259 ; RV64I-NEXT:    ret
261 ; RV64IM-LABEL: udiv16_constant:
262 ; RV64IM:       # %bb.0:
263 ; RV64IM-NEXT:    lui a1, 52429
264 ; RV64IM-NEXT:    slli a1, a1, 4
265 ; RV64IM-NEXT:    slli a0, a0, 48
266 ; RV64IM-NEXT:    mulhu a0, a0, a1
267 ; RV64IM-NEXT:    srliw a0, a0, 18
268 ; RV64IM-NEXT:    ret
269   %1 = udiv i16 %a, 5
270   ret i16 %1
273 define i16 @udiv16_pow2(i16 %a) nounwind {
274 ; RV64I-LABEL: udiv16_pow2:
275 ; RV64I:       # %bb.0:
276 ; RV64I-NEXT:    slli a0, a0, 48
277 ; RV64I-NEXT:    srli a0, a0, 51
278 ; RV64I-NEXT:    ret
280 ; RV64IM-LABEL: udiv16_pow2:
281 ; RV64IM:       # %bb.0:
282 ; RV64IM-NEXT:    slli a0, a0, 48
283 ; RV64IM-NEXT:    srli a0, a0, 51
284 ; RV64IM-NEXT:    ret
285   %1 = udiv i16 %a, 8
286   ret i16 %1
289 define i16 @udiv16_constant_lhs(i16 %a) nounwind {
290 ; RV64I-LABEL: udiv16_constant_lhs:
291 ; RV64I:       # %bb.0:
292 ; RV64I-NEXT:    addi sp, sp, -16
293 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
294 ; RV64I-NEXT:    slli a0, a0, 48
295 ; RV64I-NEXT:    srli a1, a0, 48
296 ; RV64I-NEXT:    li a0, 10
297 ; RV64I-NEXT:    call __udivdi3
298 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
299 ; RV64I-NEXT:    addi sp, sp, 16
300 ; RV64I-NEXT:    ret
302 ; RV64IM-LABEL: udiv16_constant_lhs:
303 ; RV64IM:       # %bb.0:
304 ; RV64IM-NEXT:    slli a0, a0, 48
305 ; RV64IM-NEXT:    srli a0, a0, 48
306 ; RV64IM-NEXT:    li a1, 10
307 ; RV64IM-NEXT:    divuw a0, a1, a0
308 ; RV64IM-NEXT:    ret
309   %1 = udiv i16 10, %a
310   ret i16 %1
313 define i32 @sdiv(i32 %a, i32 %b) nounwind {
314 ; RV64I-LABEL: sdiv:
315 ; RV64I:       # %bb.0:
316 ; RV64I-NEXT:    addi sp, sp, -16
317 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
318 ; RV64I-NEXT:    sext.w a0, a0
319 ; RV64I-NEXT:    sext.w a1, a1
320 ; RV64I-NEXT:    call __divdi3
321 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
322 ; RV64I-NEXT:    addi sp, sp, 16
323 ; RV64I-NEXT:    ret
325 ; RV64IM-LABEL: sdiv:
326 ; RV64IM:       # %bb.0:
327 ; RV64IM-NEXT:    divw a0, a0, a1
328 ; RV64IM-NEXT:    ret
329   %1 = sdiv i32 %a, %b
330   ret i32 %1
333 define i32 @sdiv_constant(i32 %a) nounwind {
334 ; RV64I-LABEL: sdiv_constant:
335 ; RV64I:       # %bb.0:
336 ; RV64I-NEXT:    addi sp, sp, -16
337 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
338 ; RV64I-NEXT:    sext.w a0, a0
339 ; RV64I-NEXT:    li a1, 5
340 ; RV64I-NEXT:    call __divdi3
341 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
342 ; RV64I-NEXT:    addi sp, sp, 16
343 ; RV64I-NEXT:    ret
345 ; RV64IM-LABEL: sdiv_constant:
346 ; RV64IM:       # %bb.0:
347 ; RV64IM-NEXT:    sext.w a0, a0
348 ; RV64IM-NEXT:    lui a1, 419430
349 ; RV64IM-NEXT:    addiw a1, a1, 1639
350 ; RV64IM-NEXT:    mul a0, a0, a1
351 ; RV64IM-NEXT:    srli a1, a0, 63
352 ; RV64IM-NEXT:    srai a0, a0, 33
353 ; RV64IM-NEXT:    addw a0, a0, a1
354 ; RV64IM-NEXT:    ret
355   %1 = sdiv i32 %a, 5
356   ret i32 %1
359 define i32 @sdiv_pow2(i32 %a) nounwind {
360 ; RV64I-LABEL: sdiv_pow2:
361 ; RV64I:       # %bb.0:
362 ; RV64I-NEXT:    sraiw a1, a0, 31
363 ; RV64I-NEXT:    srliw a1, a1, 29
364 ; RV64I-NEXT:    add a0, a0, a1
365 ; RV64I-NEXT:    sraiw a0, a0, 3
366 ; RV64I-NEXT:    ret
368 ; RV64IM-LABEL: sdiv_pow2:
369 ; RV64IM:       # %bb.0:
370 ; RV64IM-NEXT:    sraiw a1, a0, 31
371 ; RV64IM-NEXT:    srliw a1, a1, 29
372 ; RV64IM-NEXT:    add a0, a0, a1
373 ; RV64IM-NEXT:    sraiw a0, a0, 3
374 ; RV64IM-NEXT:    ret
375   %1 = sdiv i32 %a, 8
376   ret i32 %1
379 define i32 @sdiv_pow2_2(i32 %a) nounwind {
380 ; RV64I-LABEL: sdiv_pow2_2:
381 ; RV64I:       # %bb.0:
382 ; RV64I-NEXT:    sraiw a1, a0, 31
383 ; RV64I-NEXT:    srliw a1, a1, 16
384 ; RV64I-NEXT:    add a0, a0, a1
385 ; RV64I-NEXT:    sraiw a0, a0, 16
386 ; RV64I-NEXT:    ret
388 ; RV64IM-LABEL: sdiv_pow2_2:
389 ; RV64IM:       # %bb.0:
390 ; RV64IM-NEXT:    sraiw a1, a0, 31
391 ; RV64IM-NEXT:    srliw a1, a1, 16
392 ; RV64IM-NEXT:    add a0, a0, a1
393 ; RV64IM-NEXT:    sraiw a0, a0, 16
394 ; RV64IM-NEXT:    ret
395   %1 = sdiv i32 %a, 65536
396   ret i32 %1
399 define i32 @sdiv_constant_lhs(i32 %a) nounwind {
400 ; RV64I-LABEL: sdiv_constant_lhs:
401 ; RV64I:       # %bb.0:
402 ; RV64I-NEXT:    addi sp, sp, -16
403 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
404 ; RV64I-NEXT:    sext.w a1, a0
405 ; RV64I-NEXT:    li a0, -10
406 ; RV64I-NEXT:    call __divdi3
407 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
408 ; RV64I-NEXT:    addi sp, sp, 16
409 ; RV64I-NEXT:    ret
411 ; RV64IM-LABEL: sdiv_constant_lhs:
412 ; RV64IM:       # %bb.0:
413 ; RV64IM-NEXT:    li a1, -10
414 ; RV64IM-NEXT:    divw a0, a1, a0
415 ; RV64IM-NEXT:    ret
416   %1 = sdiv i32 -10, %a
417   ret i32 %1
420 define i64 @sdiv64(i64 %a, i64 %b) nounwind {
421 ; RV64I-LABEL: sdiv64:
422 ; RV64I:       # %bb.0:
423 ; RV64I-NEXT:    tail __divdi3
425 ; RV64IM-LABEL: sdiv64:
426 ; RV64IM:       # %bb.0:
427 ; RV64IM-NEXT:    div a0, a0, a1
428 ; RV64IM-NEXT:    ret
429   %1 = sdiv i64 %a, %b
430   ret i64 %1
433 define i64 @sdiv64_constant(i64 %a) nounwind {
434 ; RV64I-LABEL: sdiv64_constant:
435 ; RV64I:       # %bb.0:
436 ; RV64I-NEXT:    li a1, 5
437 ; RV64I-NEXT:    tail __divdi3
439 ; RV64IM-LABEL: sdiv64_constant:
440 ; RV64IM:       # %bb.0:
441 ; RV64IM-NEXT:    lui a1, %hi(.LCPI21_0)
442 ; RV64IM-NEXT:    ld a1, %lo(.LCPI21_0)(a1)
443 ; RV64IM-NEXT:    mulh a0, a0, a1
444 ; RV64IM-NEXT:    srli a1, a0, 63
445 ; RV64IM-NEXT:    srai a0, a0, 1
446 ; RV64IM-NEXT:    add a0, a0, a1
447 ; RV64IM-NEXT:    ret
448   %1 = sdiv i64 %a, 5
449   ret i64 %1
452 define i64 @sdiv64_constant_lhs(i64 %a) nounwind {
453 ; RV64I-LABEL: sdiv64_constant_lhs:
454 ; RV64I:       # %bb.0:
455 ; RV64I-NEXT:    mv a1, a0
456 ; RV64I-NEXT:    li a0, 10
457 ; RV64I-NEXT:    tail __divdi3
459 ; RV64IM-LABEL: sdiv64_constant_lhs:
460 ; RV64IM:       # %bb.0:
461 ; RV64IM-NEXT:    li a1, 10
462 ; RV64IM-NEXT:    div a0, a1, a0
463 ; RV64IM-NEXT:    ret
464   %1 = sdiv i64 10, %a
465   ret i64 %1
468 ; Although this sdiv has two sexti32 operands, it shouldn't compile to divw on
469 ; RV64M as that wouldn't produce the correct result for e.g. INT_MIN/-1.
471 define i64 @sdiv64_sext_operands(i32 %a, i32 %b) nounwind {
472 ; RV64I-LABEL: sdiv64_sext_operands:
473 ; RV64I:       # %bb.0:
474 ; RV64I-NEXT:    sext.w a0, a0
475 ; RV64I-NEXT:    sext.w a1, a1
476 ; RV64I-NEXT:    tail __divdi3
478 ; RV64IM-LABEL: sdiv64_sext_operands:
479 ; RV64IM:       # %bb.0:
480 ; RV64IM-NEXT:    sext.w a0, a0
481 ; RV64IM-NEXT:    sext.w a1, a1
482 ; RV64IM-NEXT:    div a0, a0, a1
483 ; RV64IM-NEXT:    ret
484   %1 = sext i32 %a to i64
485   %2 = sext i32 %b to i64
486   %3 = sdiv i64 %1, %2
487   ret i64 %3
490 define i8 @sdiv8(i8 %a, i8 %b) nounwind {
491 ; RV64I-LABEL: sdiv8:
492 ; RV64I:       # %bb.0:
493 ; RV64I-NEXT:    addi sp, sp, -16
494 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
495 ; RV64I-NEXT:    slli a1, a1, 24
496 ; RV64I-NEXT:    sraiw a1, a1, 24
497 ; RV64I-NEXT:    slli a0, a0, 24
498 ; RV64I-NEXT:    sraiw a0, a0, 24
499 ; RV64I-NEXT:    call __divdi3
500 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
501 ; RV64I-NEXT:    addi sp, sp, 16
502 ; RV64I-NEXT:    ret
504 ; RV64IM-LABEL: sdiv8:
505 ; RV64IM:       # %bb.0:
506 ; RV64IM-NEXT:    slli a1, a1, 24
507 ; RV64IM-NEXT:    sraiw a1, a1, 24
508 ; RV64IM-NEXT:    slli a0, a0, 24
509 ; RV64IM-NEXT:    sraiw a0, a0, 24
510 ; RV64IM-NEXT:    divw a0, a0, a1
511 ; RV64IM-NEXT:    ret
512   %1 = sdiv i8 %a, %b
513   ret i8 %1
516 define i8 @sdiv8_constant(i8 %a) nounwind {
517 ; RV64I-LABEL: sdiv8_constant:
518 ; RV64I:       # %bb.0:
519 ; RV64I-NEXT:    addi sp, sp, -16
520 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
521 ; RV64I-NEXT:    slli a0, a0, 24
522 ; RV64I-NEXT:    sraiw a0, a0, 24
523 ; RV64I-NEXT:    li a1, 5
524 ; RV64I-NEXT:    call __divdi3
525 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
526 ; RV64I-NEXT:    addi sp, sp, 16
527 ; RV64I-NEXT:    ret
529 ; RV64IM-LABEL: sdiv8_constant:
530 ; RV64IM:       # %bb.0:
531 ; RV64IM-NEXT:    slli a0, a0, 24
532 ; RV64IM-NEXT:    sraiw a0, a0, 24
533 ; RV64IM-NEXT:    li a1, 103
534 ; RV64IM-NEXT:    mul a0, a0, a1
535 ; RV64IM-NEXT:    sraiw a1, a0, 9
536 ; RV64IM-NEXT:    slli a0, a0, 48
537 ; RV64IM-NEXT:    srli a0, a0, 63
538 ; RV64IM-NEXT:    addw a0, a1, a0
539 ; RV64IM-NEXT:    ret
540   %1 = sdiv i8 %a, 5
541   ret i8 %1
544 define i8 @sdiv8_pow2(i8 %a) nounwind {
545 ; RV64I-LABEL: sdiv8_pow2:
546 ; RV64I:       # %bb.0:
547 ; RV64I-NEXT:    slli a1, a0, 24
548 ; RV64I-NEXT:    sraiw a1, a1, 24
549 ; RV64I-NEXT:    slli a1, a1, 49
550 ; RV64I-NEXT:    srli a1, a1, 61
551 ; RV64I-NEXT:    add a0, a0, a1
552 ; RV64I-NEXT:    slli a0, a0, 24
553 ; RV64I-NEXT:    sraiw a0, a0, 27
554 ; RV64I-NEXT:    ret
556 ; RV64IM-LABEL: sdiv8_pow2:
557 ; RV64IM:       # %bb.0:
558 ; RV64IM-NEXT:    slli a1, a0, 24
559 ; RV64IM-NEXT:    sraiw a1, a1, 24
560 ; RV64IM-NEXT:    slli a1, a1, 49
561 ; RV64IM-NEXT:    srli a1, a1, 61
562 ; RV64IM-NEXT:    add a0, a0, a1
563 ; RV64IM-NEXT:    slli a0, a0, 24
564 ; RV64IM-NEXT:    sraiw a0, a0, 27
565 ; RV64IM-NEXT:    ret
566   %1 = sdiv i8 %a, 8
567   ret i8 %1
570 define i8 @sdiv8_constant_lhs(i8 %a) nounwind {
571 ; RV64I-LABEL: sdiv8_constant_lhs:
572 ; RV64I:       # %bb.0:
573 ; RV64I-NEXT:    addi sp, sp, -16
574 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
575 ; RV64I-NEXT:    slli a0, a0, 24
576 ; RV64I-NEXT:    sraiw a1, a0, 24
577 ; RV64I-NEXT:    li a0, -10
578 ; RV64I-NEXT:    call __divdi3
579 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
580 ; RV64I-NEXT:    addi sp, sp, 16
581 ; RV64I-NEXT:    ret
583 ; RV64IM-LABEL: sdiv8_constant_lhs:
584 ; RV64IM:       # %bb.0:
585 ; RV64IM-NEXT:    slli a0, a0, 24
586 ; RV64IM-NEXT:    sraiw a0, a0, 24
587 ; RV64IM-NEXT:    li a1, -10
588 ; RV64IM-NEXT:    divw a0, a1, a0
589 ; RV64IM-NEXT:    ret
590   %1 = sdiv i8 -10, %a
591   ret i8 %1
594 define i16 @sdiv16(i16 %a, i16 %b) nounwind {
595 ; RV64I-LABEL: sdiv16:
596 ; RV64I:       # %bb.0:
597 ; RV64I-NEXT:    addi sp, sp, -16
598 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
599 ; RV64I-NEXT:    slli a1, a1, 16
600 ; RV64I-NEXT:    sraiw a1, a1, 16
601 ; RV64I-NEXT:    slli a0, a0, 16
602 ; RV64I-NEXT:    sraiw a0, a0, 16
603 ; RV64I-NEXT:    call __divdi3
604 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
605 ; RV64I-NEXT:    addi sp, sp, 16
606 ; RV64I-NEXT:    ret
608 ; RV64IM-LABEL: sdiv16:
609 ; RV64IM:       # %bb.0:
610 ; RV64IM-NEXT:    slli a1, a1, 16
611 ; RV64IM-NEXT:    sraiw a1, a1, 16
612 ; RV64IM-NEXT:    slli a0, a0, 16
613 ; RV64IM-NEXT:    sraiw a0, a0, 16
614 ; RV64IM-NEXT:    divw a0, a0, a1
615 ; RV64IM-NEXT:    ret
616   %1 = sdiv i16 %a, %b
617   ret i16 %1
620 define i16 @sdiv16_constant(i16 %a) nounwind {
621 ; RV64I-LABEL: sdiv16_constant:
622 ; RV64I:       # %bb.0:
623 ; RV64I-NEXT:    addi sp, sp, -16
624 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
625 ; RV64I-NEXT:    slli a0, a0, 16
626 ; RV64I-NEXT:    sraiw a0, a0, 16
627 ; RV64I-NEXT:    li a1, 5
628 ; RV64I-NEXT:    call __divdi3
629 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
630 ; RV64I-NEXT:    addi sp, sp, 16
631 ; RV64I-NEXT:    ret
633 ; RV64IM-LABEL: sdiv16_constant:
634 ; RV64IM:       # %bb.0:
635 ; RV64IM-NEXT:    slli a0, a0, 16
636 ; RV64IM-NEXT:    sraiw a0, a0, 16
637 ; RV64IM-NEXT:    lui a1, 6
638 ; RV64IM-NEXT:    addi a1, a1, 1639
639 ; RV64IM-NEXT:    mul a0, a0, a1
640 ; RV64IM-NEXT:    srliw a1, a0, 31
641 ; RV64IM-NEXT:    sraiw a0, a0, 17
642 ; RV64IM-NEXT:    addw a0, a0, a1
643 ; RV64IM-NEXT:    ret
644   %1 = sdiv i16 %a, 5
645   ret i16 %1
648 define i16 @sdiv16_pow2(i16 %a) nounwind {
649 ; RV64I-LABEL: sdiv16_pow2:
650 ; RV64I:       # %bb.0:
651 ; RV64I-NEXT:    slli a1, a0, 16
652 ; RV64I-NEXT:    sraiw a1, a1, 16
653 ; RV64I-NEXT:    slli a1, a1, 33
654 ; RV64I-NEXT:    srli a1, a1, 61
655 ; RV64I-NEXT:    add a0, a0, a1
656 ; RV64I-NEXT:    slli a0, a0, 16
657 ; RV64I-NEXT:    sraiw a0, a0, 19
658 ; RV64I-NEXT:    ret
660 ; RV64IM-LABEL: sdiv16_pow2:
661 ; RV64IM:       # %bb.0:
662 ; RV64IM-NEXT:    slli a1, a0, 16
663 ; RV64IM-NEXT:    sraiw a1, a1, 16
664 ; RV64IM-NEXT:    slli a1, a1, 33
665 ; RV64IM-NEXT:    srli a1, a1, 61
666 ; RV64IM-NEXT:    add a0, a0, a1
667 ; RV64IM-NEXT:    slli a0, a0, 16
668 ; RV64IM-NEXT:    sraiw a0, a0, 19
669 ; RV64IM-NEXT:    ret
670   %1 = sdiv i16 %a, 8
671   ret i16 %1
674 define i16 @sdiv16_constant_lhs(i16 %a) nounwind {
675 ; RV64I-LABEL: sdiv16_constant_lhs:
676 ; RV64I:       # %bb.0:
677 ; RV64I-NEXT:    addi sp, sp, -16
678 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
679 ; RV64I-NEXT:    slli a0, a0, 16
680 ; RV64I-NEXT:    sraiw a1, a0, 16
681 ; RV64I-NEXT:    li a0, -10
682 ; RV64I-NEXT:    call __divdi3
683 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
684 ; RV64I-NEXT:    addi sp, sp, 16
685 ; RV64I-NEXT:    ret
687 ; RV64IM-LABEL: sdiv16_constant_lhs:
688 ; RV64IM:       # %bb.0:
689 ; RV64IM-NEXT:    slli a0, a0, 16
690 ; RV64IM-NEXT:    sraiw a0, a0, 16
691 ; RV64IM-NEXT:    li a1, -10
692 ; RV64IM-NEXT:    divw a0, a1, a0
693 ; RV64IM-NEXT:    ret
694   %1 = sdiv i16 -10, %a
695   ret i16 %1