Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / RISCV / rem.ll
blob5b27c4129df6ad7b244186de1609c8a990c94d24
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
3 ; RUN:   | FileCheck -check-prefix=RV32I %s
4 ; RUN: llc -mtriple=riscv32 -mattr=+m -verify-machineinstrs < %s \
5 ; RUN:   | FileCheck -check-prefix=RV32IM %s
6 ; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
7 ; RUN:   | FileCheck -check-prefix=RV64I %s
8 ; RUN: llc -mtriple=riscv64 -mattr=+m -verify-machineinstrs < %s \
9 ; RUN:   | FileCheck -check-prefix=RV64IM %s
11 define i32 @urem(i32 %a, i32 %b) nounwind {
12 ; RV32I-LABEL: urem:
13 ; RV32I:       # %bb.0:
14 ; RV32I-NEXT:    tail __umodsi3
16 ; RV32IM-LABEL: urem:
17 ; RV32IM:       # %bb.0:
18 ; RV32IM-NEXT:    remu a0, a0, a1
19 ; RV32IM-NEXT:    ret
21 ; RV64I-LABEL: urem:
22 ; RV64I:       # %bb.0:
23 ; RV64I-NEXT:    addi sp, sp, -16
24 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
25 ; RV64I-NEXT:    slli a0, a0, 32
26 ; RV64I-NEXT:    srli a0, a0, 32
27 ; RV64I-NEXT:    slli a1, a1, 32
28 ; RV64I-NEXT:    srli a1, a1, 32
29 ; RV64I-NEXT:    call __umoddi3
30 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
31 ; RV64I-NEXT:    addi sp, sp, 16
32 ; RV64I-NEXT:    ret
34 ; RV64IM-LABEL: urem:
35 ; RV64IM:       # %bb.0:
36 ; RV64IM-NEXT:    remuw a0, a0, a1
37 ; RV64IM-NEXT:    ret
38   %1 = urem i32 %a, %b
39   ret i32 %1
42 define i32 @urem_constant_lhs(i32 %a) nounwind {
43 ; RV32I-LABEL: urem_constant_lhs:
44 ; RV32I:       # %bb.0:
45 ; RV32I-NEXT:    mv a1, a0
46 ; RV32I-NEXT:    li a0, 10
47 ; RV32I-NEXT:    tail __umodsi3
49 ; RV32IM-LABEL: urem_constant_lhs:
50 ; RV32IM:       # %bb.0:
51 ; RV32IM-NEXT:    li a1, 10
52 ; RV32IM-NEXT:    remu a0, a1, a0
53 ; RV32IM-NEXT:    ret
55 ; RV64I-LABEL: urem_constant_lhs:
56 ; RV64I:       # %bb.0:
57 ; RV64I-NEXT:    addi sp, sp, -16
58 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
59 ; RV64I-NEXT:    slli a0, a0, 32
60 ; RV64I-NEXT:    srli a1, a0, 32
61 ; RV64I-NEXT:    li a0, 10
62 ; RV64I-NEXT:    call __umoddi3
63 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
64 ; RV64I-NEXT:    addi sp, sp, 16
65 ; RV64I-NEXT:    ret
67 ; RV64IM-LABEL: urem_constant_lhs:
68 ; RV64IM:       # %bb.0:
69 ; RV64IM-NEXT:    li a1, 10
70 ; RV64IM-NEXT:    remuw a0, a1, a0
71 ; RV64IM-NEXT:    ret
72   %1 = urem i32 10, %a
73   ret i32 %1
76 define i32 @srem(i32 %a, i32 %b) nounwind {
77 ; RV32I-LABEL: srem:
78 ; RV32I:       # %bb.0:
79 ; RV32I-NEXT:    tail __modsi3
81 ; RV32IM-LABEL: srem:
82 ; RV32IM:       # %bb.0:
83 ; RV32IM-NEXT:    rem a0, a0, a1
84 ; RV32IM-NEXT:    ret
86 ; RV64I-LABEL: srem:
87 ; RV64I:       # %bb.0:
88 ; RV64I-NEXT:    addi sp, sp, -16
89 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
90 ; RV64I-NEXT:    sext.w a0, a0
91 ; RV64I-NEXT:    sext.w a1, a1
92 ; RV64I-NEXT:    call __moddi3
93 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
94 ; RV64I-NEXT:    addi sp, sp, 16
95 ; RV64I-NEXT:    ret
97 ; RV64IM-LABEL: srem:
98 ; RV64IM:       # %bb.0:
99 ; RV64IM-NEXT:    remw a0, a0, a1
100 ; RV64IM-NEXT:    ret
101   %1 = srem i32 %a, %b
102   ret i32 %1
105 define i32 @srem_pow2(i32 %a) nounwind {
106 ; RV32I-LABEL: srem_pow2:
107 ; RV32I:       # %bb.0:
108 ; RV32I-NEXT:    srai a1, a0, 31
109 ; RV32I-NEXT:    srli a1, a1, 29
110 ; RV32I-NEXT:    add a1, a0, a1
111 ; RV32I-NEXT:    andi a1, a1, -8
112 ; RV32I-NEXT:    sub a0, a0, a1
113 ; RV32I-NEXT:    ret
115 ; RV32IM-LABEL: srem_pow2:
116 ; RV32IM:       # %bb.0:
117 ; RV32IM-NEXT:    srai a1, a0, 31
118 ; RV32IM-NEXT:    srli a1, a1, 29
119 ; RV32IM-NEXT:    add a1, a0, a1
120 ; RV32IM-NEXT:    andi a1, a1, -8
121 ; RV32IM-NEXT:    sub a0, a0, a1
122 ; RV32IM-NEXT:    ret
124 ; RV64I-LABEL: srem_pow2:
125 ; RV64I:       # %bb.0:
126 ; RV64I-NEXT:    sraiw a1, a0, 31
127 ; RV64I-NEXT:    srliw a1, a1, 29
128 ; RV64I-NEXT:    add a1, a0, a1
129 ; RV64I-NEXT:    andi a1, a1, -8
130 ; RV64I-NEXT:    subw a0, a0, a1
131 ; RV64I-NEXT:    ret
133 ; RV64IM-LABEL: srem_pow2:
134 ; RV64IM:       # %bb.0:
135 ; RV64IM-NEXT:    sraiw a1, a0, 31
136 ; RV64IM-NEXT:    srliw a1, a1, 29
137 ; RV64IM-NEXT:    add a1, a0, a1
138 ; RV64IM-NEXT:    andi a1, a1, -8
139 ; RV64IM-NEXT:    subw a0, a0, a1
140 ; RV64IM-NEXT:    ret
141   %1 = srem i32 %a, 8
142   ret i32 %1
145 define i32 @srem_pow2_2(i32 %a) nounwind {
146 ; RV32I-LABEL: srem_pow2_2:
147 ; RV32I:       # %bb.0:
148 ; RV32I-NEXT:    srai a1, a0, 31
149 ; RV32I-NEXT:    srli a1, a1, 16
150 ; RV32I-NEXT:    add a1, a0, a1
151 ; RV32I-NEXT:    lui a2, 1048560
152 ; RV32I-NEXT:    and a1, a1, a2
153 ; RV32I-NEXT:    sub a0, a0, a1
154 ; RV32I-NEXT:    ret
156 ; RV32IM-LABEL: srem_pow2_2:
157 ; RV32IM:       # %bb.0:
158 ; RV32IM-NEXT:    srai a1, a0, 31
159 ; RV32IM-NEXT:    srli a1, a1, 16
160 ; RV32IM-NEXT:    add a1, a0, a1
161 ; RV32IM-NEXT:    lui a2, 1048560
162 ; RV32IM-NEXT:    and a1, a1, a2
163 ; RV32IM-NEXT:    sub a0, a0, a1
164 ; RV32IM-NEXT:    ret
166 ; RV64I-LABEL: srem_pow2_2:
167 ; RV64I:       # %bb.0:
168 ; RV64I-NEXT:    sraiw a1, a0, 31
169 ; RV64I-NEXT:    srliw a1, a1, 16
170 ; RV64I-NEXT:    add a1, a0, a1
171 ; RV64I-NEXT:    lui a2, 1048560
172 ; RV64I-NEXT:    and a1, a1, a2
173 ; RV64I-NEXT:    subw a0, a0, a1
174 ; RV64I-NEXT:    ret
176 ; RV64IM-LABEL: srem_pow2_2:
177 ; RV64IM:       # %bb.0:
178 ; RV64IM-NEXT:    sraiw a1, a0, 31
179 ; RV64IM-NEXT:    srliw a1, a1, 16
180 ; RV64IM-NEXT:    add a1, a0, a1
181 ; RV64IM-NEXT:    lui a2, 1048560
182 ; RV64IM-NEXT:    and a1, a1, a2
183 ; RV64IM-NEXT:    subw a0, a0, a1
184 ; RV64IM-NEXT:    ret
185   %1 = srem i32 %a, 65536
186   ret i32 %1
189 define i32 @srem_constant_lhs(i32 %a) nounwind {
190 ; RV32I-LABEL: srem_constant_lhs:
191 ; RV32I:       # %bb.0:
192 ; RV32I-NEXT:    mv a1, a0
193 ; RV32I-NEXT:    li a0, -10
194 ; RV32I-NEXT:    tail __modsi3
196 ; RV32IM-LABEL: srem_constant_lhs:
197 ; RV32IM:       # %bb.0:
198 ; RV32IM-NEXT:    li a1, -10
199 ; RV32IM-NEXT:    rem a0, a1, a0
200 ; RV32IM-NEXT:    ret
202 ; RV64I-LABEL: srem_constant_lhs:
203 ; RV64I:       # %bb.0:
204 ; RV64I-NEXT:    addi sp, sp, -16
205 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
206 ; RV64I-NEXT:    sext.w a1, a0
207 ; RV64I-NEXT:    li a0, -10
208 ; RV64I-NEXT:    call __moddi3
209 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
210 ; RV64I-NEXT:    addi sp, sp, 16
211 ; RV64I-NEXT:    ret
213 ; RV64IM-LABEL: srem_constant_lhs:
214 ; RV64IM:       # %bb.0:
215 ; RV64IM-NEXT:    li a1, -10
216 ; RV64IM-NEXT:    remw a0, a1, a0
217 ; RV64IM-NEXT:    ret
218   %1 = srem i32 -10, %a
219   ret i32 %1
222 define i64 @urem64(i64 %a, i64 %b) nounwind {
223 ; RV32I-LABEL: urem64:
224 ; RV32I:       # %bb.0:
225 ; RV32I-NEXT:    addi sp, sp, -16
226 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
227 ; RV32I-NEXT:    call __umoddi3
228 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
229 ; RV32I-NEXT:    addi sp, sp, 16
230 ; RV32I-NEXT:    ret
232 ; RV32IM-LABEL: urem64:
233 ; RV32IM:       # %bb.0:
234 ; RV32IM-NEXT:    addi sp, sp, -16
235 ; RV32IM-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
236 ; RV32IM-NEXT:    call __umoddi3
237 ; RV32IM-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
238 ; RV32IM-NEXT:    addi sp, sp, 16
239 ; RV32IM-NEXT:    ret
241 ; RV64I-LABEL: urem64:
242 ; RV64I:       # %bb.0:
243 ; RV64I-NEXT:    tail __umoddi3
245 ; RV64IM-LABEL: urem64:
246 ; RV64IM:       # %bb.0:
247 ; RV64IM-NEXT:    remu a0, a0, a1
248 ; RV64IM-NEXT:    ret
249   %1 = urem i64 %a, %b
250   ret i64 %1
253 define i64 @urem64_constant_lhs(i64 %a) nounwind {
254 ; RV32I-LABEL: urem64_constant_lhs:
255 ; RV32I:       # %bb.0:
256 ; RV32I-NEXT:    addi sp, sp, -16
257 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
258 ; RV32I-NEXT:    mv a3, a1
259 ; RV32I-NEXT:    mv a2, a0
260 ; RV32I-NEXT:    li a0, 10
261 ; RV32I-NEXT:    li a1, 0
262 ; RV32I-NEXT:    call __umoddi3
263 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
264 ; RV32I-NEXT:    addi sp, sp, 16
265 ; RV32I-NEXT:    ret
267 ; RV32IM-LABEL: urem64_constant_lhs:
268 ; RV32IM:       # %bb.0:
269 ; RV32IM-NEXT:    addi sp, sp, -16
270 ; RV32IM-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
271 ; RV32IM-NEXT:    mv a3, a1
272 ; RV32IM-NEXT:    mv a2, a0
273 ; RV32IM-NEXT:    li a0, 10
274 ; RV32IM-NEXT:    li a1, 0
275 ; RV32IM-NEXT:    call __umoddi3
276 ; RV32IM-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
277 ; RV32IM-NEXT:    addi sp, sp, 16
278 ; RV32IM-NEXT:    ret
280 ; RV64I-LABEL: urem64_constant_lhs:
281 ; RV64I:       # %bb.0:
282 ; RV64I-NEXT:    mv a1, a0
283 ; RV64I-NEXT:    li a0, 10
284 ; RV64I-NEXT:    tail __umoddi3
286 ; RV64IM-LABEL: urem64_constant_lhs:
287 ; RV64IM:       # %bb.0:
288 ; RV64IM-NEXT:    li a1, 10
289 ; RV64IM-NEXT:    remu a0, a1, a0
290 ; RV64IM-NEXT:    ret
291   %1 = urem i64 10, %a
292   ret i64 %1
295 define i64 @srem64(i64 %a, i64 %b) nounwind {
296 ; RV32I-LABEL: srem64:
297 ; RV32I:       # %bb.0:
298 ; RV32I-NEXT:    addi sp, sp, -16
299 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
300 ; RV32I-NEXT:    call __moddi3
301 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
302 ; RV32I-NEXT:    addi sp, sp, 16
303 ; RV32I-NEXT:    ret
305 ; RV32IM-LABEL: srem64:
306 ; RV32IM:       # %bb.0:
307 ; RV32IM-NEXT:    addi sp, sp, -16
308 ; RV32IM-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
309 ; RV32IM-NEXT:    call __moddi3
310 ; RV32IM-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
311 ; RV32IM-NEXT:    addi sp, sp, 16
312 ; RV32IM-NEXT:    ret
314 ; RV64I-LABEL: srem64:
315 ; RV64I:       # %bb.0:
316 ; RV64I-NEXT:    tail __moddi3
318 ; RV64IM-LABEL: srem64:
319 ; RV64IM:       # %bb.0:
320 ; RV64IM-NEXT:    rem a0, a0, a1
321 ; RV64IM-NEXT:    ret
322   %1 = srem i64 %a, %b
323   ret i64 %1
326 define i64 @srem64_constant_lhs(i64 %a) nounwind {
327 ; RV32I-LABEL: srem64_constant_lhs:
328 ; RV32I:       # %bb.0:
329 ; RV32I-NEXT:    addi sp, sp, -16
330 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
331 ; RV32I-NEXT:    mv a3, a1
332 ; RV32I-NEXT:    mv a2, a0
333 ; RV32I-NEXT:    li a0, -10
334 ; RV32I-NEXT:    li a1, -1
335 ; RV32I-NEXT:    call __moddi3
336 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
337 ; RV32I-NEXT:    addi sp, sp, 16
338 ; RV32I-NEXT:    ret
340 ; RV32IM-LABEL: srem64_constant_lhs:
341 ; RV32IM:       # %bb.0:
342 ; RV32IM-NEXT:    addi sp, sp, -16
343 ; RV32IM-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
344 ; RV32IM-NEXT:    mv a3, a1
345 ; RV32IM-NEXT:    mv a2, a0
346 ; RV32IM-NEXT:    li a0, -10
347 ; RV32IM-NEXT:    li a1, -1
348 ; RV32IM-NEXT:    call __moddi3
349 ; RV32IM-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
350 ; RV32IM-NEXT:    addi sp, sp, 16
351 ; RV32IM-NEXT:    ret
353 ; RV64I-LABEL: srem64_constant_lhs:
354 ; RV64I:       # %bb.0:
355 ; RV64I-NEXT:    mv a1, a0
356 ; RV64I-NEXT:    li a0, -10
357 ; RV64I-NEXT:    tail __moddi3
359 ; RV64IM-LABEL: srem64_constant_lhs:
360 ; RV64IM:       # %bb.0:
361 ; RV64IM-NEXT:    li a1, -10
362 ; RV64IM-NEXT:    rem a0, a1, a0
363 ; RV64IM-NEXT:    ret
364   %1 = srem i64 -10, %a
365   ret i64 %1
368 define i8 @urem8(i8 %a, i8 %b) nounwind {
369 ; RV32I-LABEL: urem8:
370 ; RV32I:       # %bb.0:
371 ; RV32I-NEXT:    addi sp, sp, -16
372 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
373 ; RV32I-NEXT:    andi a0, a0, 255
374 ; RV32I-NEXT:    andi a1, a1, 255
375 ; RV32I-NEXT:    call __umodsi3
376 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
377 ; RV32I-NEXT:    addi sp, sp, 16
378 ; RV32I-NEXT:    ret
380 ; RV32IM-LABEL: urem8:
381 ; RV32IM:       # %bb.0:
382 ; RV32IM-NEXT:    andi a1, a1, 255
383 ; RV32IM-NEXT:    andi a0, a0, 255
384 ; RV32IM-NEXT:    remu a0, a0, a1
385 ; RV32IM-NEXT:    ret
387 ; RV64I-LABEL: urem8:
388 ; RV64I:       # %bb.0:
389 ; RV64I-NEXT:    addi sp, sp, -16
390 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
391 ; RV64I-NEXT:    andi a0, a0, 255
392 ; RV64I-NEXT:    andi a1, a1, 255
393 ; RV64I-NEXT:    call __umoddi3
394 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
395 ; RV64I-NEXT:    addi sp, sp, 16
396 ; RV64I-NEXT:    ret
398 ; RV64IM-LABEL: urem8:
399 ; RV64IM:       # %bb.0:
400 ; RV64IM-NEXT:    andi a1, a1, 255
401 ; RV64IM-NEXT:    andi a0, a0, 255
402 ; RV64IM-NEXT:    remuw a0, a0, a1
403 ; RV64IM-NEXT:    ret
404   %1 = urem i8 %a, %b
405   ret i8 %1
408 define i8 @urem8_constant_lhs(i8 %a) nounwind {
409 ; RV32I-LABEL: urem8_constant_lhs:
410 ; RV32I:       # %bb.0:
411 ; RV32I-NEXT:    addi sp, sp, -16
412 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
413 ; RV32I-NEXT:    andi a1, a0, 255
414 ; RV32I-NEXT:    li a0, 10
415 ; RV32I-NEXT:    call __umodsi3
416 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
417 ; RV32I-NEXT:    addi sp, sp, 16
418 ; RV32I-NEXT:    ret
420 ; RV32IM-LABEL: urem8_constant_lhs:
421 ; RV32IM:       # %bb.0:
422 ; RV32IM-NEXT:    andi a0, a0, 255
423 ; RV32IM-NEXT:    li a1, 10
424 ; RV32IM-NEXT:    remu a0, a1, a0
425 ; RV32IM-NEXT:    ret
427 ; RV64I-LABEL: urem8_constant_lhs:
428 ; RV64I:       # %bb.0:
429 ; RV64I-NEXT:    addi sp, sp, -16
430 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
431 ; RV64I-NEXT:    andi a1, a0, 255
432 ; RV64I-NEXT:    li a0, 10
433 ; RV64I-NEXT:    call __umoddi3
434 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
435 ; RV64I-NEXT:    addi sp, sp, 16
436 ; RV64I-NEXT:    ret
438 ; RV64IM-LABEL: urem8_constant_lhs:
439 ; RV64IM:       # %bb.0:
440 ; RV64IM-NEXT:    andi a0, a0, 255
441 ; RV64IM-NEXT:    li a1, 10
442 ; RV64IM-NEXT:    remuw a0, a1, a0
443 ; RV64IM-NEXT:    ret
444   %1 = urem i8 10, %a
445   ret i8 %1
449 define i8 @srem8(i8 %a, i8 %b) nounwind {
450 ; RV32I-LABEL: srem8:
451 ; RV32I:       # %bb.0:
452 ; RV32I-NEXT:    addi sp, sp, -16
453 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
454 ; RV32I-NEXT:    slli a0, a0, 24
455 ; RV32I-NEXT:    srai a0, a0, 24
456 ; RV32I-NEXT:    slli a1, a1, 24
457 ; RV32I-NEXT:    srai a1, a1, 24
458 ; RV32I-NEXT:    call __modsi3
459 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
460 ; RV32I-NEXT:    addi sp, sp, 16
461 ; RV32I-NEXT:    ret
463 ; RV32IM-LABEL: srem8:
464 ; RV32IM:       # %bb.0:
465 ; RV32IM-NEXT:    slli a1, a1, 24
466 ; RV32IM-NEXT:    srai a1, a1, 24
467 ; RV32IM-NEXT:    slli a0, a0, 24
468 ; RV32IM-NEXT:    srai a0, a0, 24
469 ; RV32IM-NEXT:    rem a0, a0, a1
470 ; RV32IM-NEXT:    ret
472 ; RV64I-LABEL: srem8:
473 ; RV64I:       # %bb.0:
474 ; RV64I-NEXT:    addi sp, sp, -16
475 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
476 ; RV64I-NEXT:    slli a0, a0, 56
477 ; RV64I-NEXT:    srai a0, a0, 56
478 ; RV64I-NEXT:    slli a1, a1, 56
479 ; RV64I-NEXT:    srai a1, a1, 56
480 ; RV64I-NEXT:    call __moddi3
481 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
482 ; RV64I-NEXT:    addi sp, sp, 16
483 ; RV64I-NEXT:    ret
485 ; RV64IM-LABEL: srem8:
486 ; RV64IM:       # %bb.0:
487 ; RV64IM-NEXT:    slli a1, a1, 56
488 ; RV64IM-NEXT:    srai a1, a1, 56
489 ; RV64IM-NEXT:    slli a0, a0, 56
490 ; RV64IM-NEXT:    srai a0, a0, 56
491 ; RV64IM-NEXT:    remw a0, a0, a1
492 ; RV64IM-NEXT:    ret
493   %1 = srem i8 %a, %b
494   ret i8 %1
497 define i8 @srem8_constant_lhs(i8 %a) nounwind {
498 ; RV32I-LABEL: srem8_constant_lhs:
499 ; RV32I:       # %bb.0:
500 ; RV32I-NEXT:    addi sp, sp, -16
501 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
502 ; RV32I-NEXT:    slli a0, a0, 24
503 ; RV32I-NEXT:    srai a1, a0, 24
504 ; RV32I-NEXT:    li a0, -10
505 ; RV32I-NEXT:    call __modsi3
506 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
507 ; RV32I-NEXT:    addi sp, sp, 16
508 ; RV32I-NEXT:    ret
510 ; RV32IM-LABEL: srem8_constant_lhs:
511 ; RV32IM:       # %bb.0:
512 ; RV32IM-NEXT:    slli a0, a0, 24
513 ; RV32IM-NEXT:    srai a0, a0, 24
514 ; RV32IM-NEXT:    li a1, -10
515 ; RV32IM-NEXT:    rem a0, a1, a0
516 ; RV32IM-NEXT:    ret
518 ; RV64I-LABEL: srem8_constant_lhs:
519 ; RV64I:       # %bb.0:
520 ; RV64I-NEXT:    addi sp, sp, -16
521 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
522 ; RV64I-NEXT:    slli a0, a0, 56
523 ; RV64I-NEXT:    srai a1, a0, 56
524 ; RV64I-NEXT:    li a0, -10
525 ; RV64I-NEXT:    call __moddi3
526 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
527 ; RV64I-NEXT:    addi sp, sp, 16
528 ; RV64I-NEXT:    ret
530 ; RV64IM-LABEL: srem8_constant_lhs:
531 ; RV64IM:       # %bb.0:
532 ; RV64IM-NEXT:    slli a0, a0, 56
533 ; RV64IM-NEXT:    srai a0, a0, 56
534 ; RV64IM-NEXT:    li a1, -10
535 ; RV64IM-NEXT:    remw a0, a1, a0
536 ; RV64IM-NEXT:    ret
537   %1 = srem i8 -10, %a
538   ret i8 %1
542 define i16 @urem16(i16 %a, i16 %b) nounwind {
543 ; RV32I-LABEL: urem16:
544 ; RV32I:       # %bb.0:
545 ; RV32I-NEXT:    addi sp, sp, -16
546 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
547 ; RV32I-NEXT:    lui a2, 16
548 ; RV32I-NEXT:    addi a2, a2, -1
549 ; RV32I-NEXT:    and a0, a0, a2
550 ; RV32I-NEXT:    and a1, a1, a2
551 ; RV32I-NEXT:    call __umodsi3
552 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
553 ; RV32I-NEXT:    addi sp, sp, 16
554 ; RV32I-NEXT:    ret
556 ; RV32IM-LABEL: urem16:
557 ; RV32IM:       # %bb.0:
558 ; RV32IM-NEXT:    lui a2, 16
559 ; RV32IM-NEXT:    addi a2, a2, -1
560 ; RV32IM-NEXT:    and a1, a1, a2
561 ; RV32IM-NEXT:    and a0, a0, a2
562 ; RV32IM-NEXT:    remu a0, a0, a1
563 ; RV32IM-NEXT:    ret
565 ; RV64I-LABEL: urem16:
566 ; RV64I:       # %bb.0:
567 ; RV64I-NEXT:    addi sp, sp, -16
568 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
569 ; RV64I-NEXT:    lui a2, 16
570 ; RV64I-NEXT:    addiw a2, a2, -1
571 ; RV64I-NEXT:    and a0, a0, a2
572 ; RV64I-NEXT:    and a1, a1, a2
573 ; RV64I-NEXT:    call __umoddi3
574 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
575 ; RV64I-NEXT:    addi sp, sp, 16
576 ; RV64I-NEXT:    ret
578 ; RV64IM-LABEL: urem16:
579 ; RV64IM:       # %bb.0:
580 ; RV64IM-NEXT:    lui a2, 16
581 ; RV64IM-NEXT:    addi a2, a2, -1
582 ; RV64IM-NEXT:    and a1, a1, a2
583 ; RV64IM-NEXT:    and a0, a0, a2
584 ; RV64IM-NEXT:    remuw a0, a0, a1
585 ; RV64IM-NEXT:    ret
586   %1 = urem i16 %a, %b
587   ret i16 %1
590 define i16 @urem16_constant_lhs(i16 %a) nounwind {
591 ; RV32I-LABEL: urem16_constant_lhs:
592 ; RV32I:       # %bb.0:
593 ; RV32I-NEXT:    addi sp, sp, -16
594 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
595 ; RV32I-NEXT:    slli a0, a0, 16
596 ; RV32I-NEXT:    srli a1, a0, 16
597 ; RV32I-NEXT:    li a0, 10
598 ; RV32I-NEXT:    call __umodsi3
599 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
600 ; RV32I-NEXT:    addi sp, sp, 16
601 ; RV32I-NEXT:    ret
603 ; RV32IM-LABEL: urem16_constant_lhs:
604 ; RV32IM:       # %bb.0:
605 ; RV32IM-NEXT:    slli a0, a0, 16
606 ; RV32IM-NEXT:    srli a0, a0, 16
607 ; RV32IM-NEXT:    li a1, 10
608 ; RV32IM-NEXT:    remu a0, a1, a0
609 ; RV32IM-NEXT:    ret
611 ; RV64I-LABEL: urem16_constant_lhs:
612 ; RV64I:       # %bb.0:
613 ; RV64I-NEXT:    addi sp, sp, -16
614 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
615 ; RV64I-NEXT:    slli a0, a0, 48
616 ; RV64I-NEXT:    srli a1, a0, 48
617 ; RV64I-NEXT:    li a0, 10
618 ; RV64I-NEXT:    call __umoddi3
619 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
620 ; RV64I-NEXT:    addi sp, sp, 16
621 ; RV64I-NEXT:    ret
623 ; RV64IM-LABEL: urem16_constant_lhs:
624 ; RV64IM:       # %bb.0:
625 ; RV64IM-NEXT:    slli a0, a0, 48
626 ; RV64IM-NEXT:    srli a0, a0, 48
627 ; RV64IM-NEXT:    li a1, 10
628 ; RV64IM-NEXT:    remuw a0, a1, a0
629 ; RV64IM-NEXT:    ret
630   %1 = urem i16 10, %a
631   ret i16 %1
634 define i16 @srem16(i16 %a, i16 %b) nounwind {
635 ; RV32I-LABEL: srem16:
636 ; RV32I:       # %bb.0:
637 ; RV32I-NEXT:    addi sp, sp, -16
638 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
639 ; RV32I-NEXT:    slli a0, a0, 16
640 ; RV32I-NEXT:    srai a0, a0, 16
641 ; RV32I-NEXT:    slli a1, a1, 16
642 ; RV32I-NEXT:    srai a1, a1, 16
643 ; RV32I-NEXT:    call __modsi3
644 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
645 ; RV32I-NEXT:    addi sp, sp, 16
646 ; RV32I-NEXT:    ret
648 ; RV32IM-LABEL: srem16:
649 ; RV32IM:       # %bb.0:
650 ; RV32IM-NEXT:    slli a1, a1, 16
651 ; RV32IM-NEXT:    srai a1, a1, 16
652 ; RV32IM-NEXT:    slli a0, a0, 16
653 ; RV32IM-NEXT:    srai a0, a0, 16
654 ; RV32IM-NEXT:    rem a0, a0, a1
655 ; RV32IM-NEXT:    ret
657 ; RV64I-LABEL: srem16:
658 ; RV64I:       # %bb.0:
659 ; RV64I-NEXT:    addi sp, sp, -16
660 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
661 ; RV64I-NEXT:    slli a0, a0, 48
662 ; RV64I-NEXT:    srai a0, a0, 48
663 ; RV64I-NEXT:    slli a1, a1, 48
664 ; RV64I-NEXT:    srai a1, a1, 48
665 ; RV64I-NEXT:    call __moddi3
666 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
667 ; RV64I-NEXT:    addi sp, sp, 16
668 ; RV64I-NEXT:    ret
670 ; RV64IM-LABEL: srem16:
671 ; RV64IM:       # %bb.0:
672 ; RV64IM-NEXT:    slli a1, a1, 48
673 ; RV64IM-NEXT:    srai a1, a1, 48
674 ; RV64IM-NEXT:    slli a0, a0, 48
675 ; RV64IM-NEXT:    srai a0, a0, 48
676 ; RV64IM-NEXT:    remw a0, a0, a1
677 ; RV64IM-NEXT:    ret
678   %1 = srem i16 %a, %b
679   ret i16 %1
682 define i16 @srem16_constant_lhs(i16 %a) nounwind {
683 ; RV32I-LABEL: srem16_constant_lhs:
684 ; RV32I:       # %bb.0:
685 ; RV32I-NEXT:    addi sp, sp, -16
686 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
687 ; RV32I-NEXT:    slli a0, a0, 16
688 ; RV32I-NEXT:    srai a1, a0, 16
689 ; RV32I-NEXT:    li a0, -10
690 ; RV32I-NEXT:    call __modsi3
691 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
692 ; RV32I-NEXT:    addi sp, sp, 16
693 ; RV32I-NEXT:    ret
695 ; RV32IM-LABEL: srem16_constant_lhs:
696 ; RV32IM:       # %bb.0:
697 ; RV32IM-NEXT:    slli a0, a0, 16
698 ; RV32IM-NEXT:    srai a0, a0, 16
699 ; RV32IM-NEXT:    li a1, -10
700 ; RV32IM-NEXT:    rem a0, a1, a0
701 ; RV32IM-NEXT:    ret
703 ; RV64I-LABEL: srem16_constant_lhs:
704 ; RV64I:       # %bb.0:
705 ; RV64I-NEXT:    addi sp, sp, -16
706 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
707 ; RV64I-NEXT:    slli a0, a0, 48
708 ; RV64I-NEXT:    srai a1, a0, 48
709 ; RV64I-NEXT:    li a0, -10
710 ; RV64I-NEXT:    call __moddi3
711 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
712 ; RV64I-NEXT:    addi sp, sp, 16
713 ; RV64I-NEXT:    ret
715 ; RV64IM-LABEL: srem16_constant_lhs:
716 ; RV64IM:       # %bb.0:
717 ; RV64IM-NEXT:    slli a0, a0, 48
718 ; RV64IM-NEXT:    srai a0, a0, 48
719 ; RV64IM-NEXT:    li a1, -10
720 ; RV64IM-NEXT:    remw a0, a1, a0
721 ; RV64IM-NEXT:    ret
722   %1 = srem i16 -10, %a
723   ret i16 %1