[LoongArch][ISel] Check the number of sign bits in `PatGprGpr_32` (#107432)
[llvm-project.git] / llvm / test / CodeGen / LoongArch / ir-instruction / sdiv-udiv-srem-urem.ll
blobc22acdb49690715f9e29e489c5e18e13b3653e93
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc --mtriple=loongarch32 -mattr=+d < %s | FileCheck %s --check-prefix=LA32
3 ; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefix=LA64
4 ; RUN: llc --mtriple=loongarch32 -mattr=+d -loongarch-check-zero-division < %s \
5 ; RUN:     | FileCheck %s --check-prefix=LA32-TRAP
6 ; RUN: llc --mtriple=loongarch64 -mattr=+d -loongarch-check-zero-division < %s \
7 ; RUN:     | FileCheck %s --check-prefix=LA64-TRAP
9 ;; Test the sdiv/udiv/srem/urem LLVM IR.
11 define i1 @sdiv_i1(i1 %a, i1 %b) {
12 ; LA32-LABEL: sdiv_i1:
13 ; LA32:       # %bb.0: # %entry
14 ; LA32-NEXT:    ret
16 ; LA64-LABEL: sdiv_i1:
17 ; LA64:       # %bb.0: # %entry
18 ; LA64-NEXT:    ret
20 ; LA32-TRAP-LABEL: sdiv_i1:
21 ; LA32-TRAP:       # %bb.0: # %entry
22 ; LA32-TRAP-NEXT:    ret
24 ; LA64-TRAP-LABEL: sdiv_i1:
25 ; LA64-TRAP:       # %bb.0: # %entry
26 ; LA64-TRAP-NEXT:    ret
27 entry:
28   %r = sdiv i1 %a, %b
29   ret i1 %r
32 define i8 @sdiv_i8(i8 %a, i8 %b) {
33 ; LA32-LABEL: sdiv_i8:
34 ; LA32:       # %bb.0: # %entry
35 ; LA32-NEXT:    ext.w.b $a1, $a1
36 ; LA32-NEXT:    ext.w.b $a0, $a0
37 ; LA32-NEXT:    div.w $a0, $a0, $a1
38 ; LA32-NEXT:    ret
40 ; LA64-LABEL: sdiv_i8:
41 ; LA64:       # %bb.0: # %entry
42 ; LA64-NEXT:    ext.w.b $a1, $a1
43 ; LA64-NEXT:    ext.w.b $a0, $a0
44 ; LA64-NEXT:    div.d $a0, $a0, $a1
45 ; LA64-NEXT:    ret
47 ; LA32-TRAP-LABEL: sdiv_i8:
48 ; LA32-TRAP:       # %bb.0: # %entry
49 ; LA32-TRAP-NEXT:    ext.w.b $a1, $a1
50 ; LA32-TRAP-NEXT:    ext.w.b $a0, $a0
51 ; LA32-TRAP-NEXT:    div.w $a0, $a0, $a1
52 ; LA32-TRAP-NEXT:    bnez $a1, .LBB1_2
53 ; LA32-TRAP-NEXT:  # %bb.1: # %entry
54 ; LA32-TRAP-NEXT:    break 7
55 ; LA32-TRAP-NEXT:  .LBB1_2: # %entry
56 ; LA32-TRAP-NEXT:    ret
58 ; LA64-TRAP-LABEL: sdiv_i8:
59 ; LA64-TRAP:       # %bb.0: # %entry
60 ; LA64-TRAP-NEXT:    ext.w.b $a1, $a1
61 ; LA64-TRAP-NEXT:    ext.w.b $a0, $a0
62 ; LA64-TRAP-NEXT:    div.d $a0, $a0, $a1
63 ; LA64-TRAP-NEXT:    bnez $a1, .LBB1_2
64 ; LA64-TRAP-NEXT:  # %bb.1: # %entry
65 ; LA64-TRAP-NEXT:    break 7
66 ; LA64-TRAP-NEXT:  .LBB1_2: # %entry
67 ; LA64-TRAP-NEXT:    ret
68 entry:
69   %r = sdiv i8 %a, %b
70   ret i8 %r
73 define i16 @sdiv_i16(i16 %a, i16 %b) {
74 ; LA32-LABEL: sdiv_i16:
75 ; LA32:       # %bb.0: # %entry
76 ; LA32-NEXT:    ext.w.h $a1, $a1
77 ; LA32-NEXT:    ext.w.h $a0, $a0
78 ; LA32-NEXT:    div.w $a0, $a0, $a1
79 ; LA32-NEXT:    ret
81 ; LA64-LABEL: sdiv_i16:
82 ; LA64:       # %bb.0: # %entry
83 ; LA64-NEXT:    ext.w.h $a1, $a1
84 ; LA64-NEXT:    ext.w.h $a0, $a0
85 ; LA64-NEXT:    div.d $a0, $a0, $a1
86 ; LA64-NEXT:    ret
88 ; LA32-TRAP-LABEL: sdiv_i16:
89 ; LA32-TRAP:       # %bb.0: # %entry
90 ; LA32-TRAP-NEXT:    ext.w.h $a1, $a1
91 ; LA32-TRAP-NEXT:    ext.w.h $a0, $a0
92 ; LA32-TRAP-NEXT:    div.w $a0, $a0, $a1
93 ; LA32-TRAP-NEXT:    bnez $a1, .LBB2_2
94 ; LA32-TRAP-NEXT:  # %bb.1: # %entry
95 ; LA32-TRAP-NEXT:    break 7
96 ; LA32-TRAP-NEXT:  .LBB2_2: # %entry
97 ; LA32-TRAP-NEXT:    ret
99 ; LA64-TRAP-LABEL: sdiv_i16:
100 ; LA64-TRAP:       # %bb.0: # %entry
101 ; LA64-TRAP-NEXT:    ext.w.h $a1, $a1
102 ; LA64-TRAP-NEXT:    ext.w.h $a0, $a0
103 ; LA64-TRAP-NEXT:    div.d $a0, $a0, $a1
104 ; LA64-TRAP-NEXT:    bnez $a1, .LBB2_2
105 ; LA64-TRAP-NEXT:  # %bb.1: # %entry
106 ; LA64-TRAP-NEXT:    break 7
107 ; LA64-TRAP-NEXT:  .LBB2_2: # %entry
108 ; LA64-TRAP-NEXT:    ret
109 entry:
110   %r = sdiv i16 %a, %b
111   ret i16 %r
114 define i32 @sdiv_i32(i32 %a, i32 %b) {
115 ; LA32-LABEL: sdiv_i32:
116 ; LA32:       # %bb.0: # %entry
117 ; LA32-NEXT:    div.w $a0, $a0, $a1
118 ; LA32-NEXT:    ret
120 ; LA64-LABEL: sdiv_i32:
121 ; LA64:       # %bb.0: # %entry
122 ; LA64-NEXT:    addi.w $a1, $a1, 0
123 ; LA64-NEXT:    addi.w $a0, $a0, 0
124 ; LA64-NEXT:    div.d $a0, $a0, $a1
125 ; LA64-NEXT:    ret
127 ; LA32-TRAP-LABEL: sdiv_i32:
128 ; LA32-TRAP:       # %bb.0: # %entry
129 ; LA32-TRAP-NEXT:    div.w $a0, $a0, $a1
130 ; LA32-TRAP-NEXT:    bnez $a1, .LBB3_2
131 ; LA32-TRAP-NEXT:  # %bb.1: # %entry
132 ; LA32-TRAP-NEXT:    break 7
133 ; LA32-TRAP-NEXT:  .LBB3_2: # %entry
134 ; LA32-TRAP-NEXT:    ret
136 ; LA64-TRAP-LABEL: sdiv_i32:
137 ; LA64-TRAP:       # %bb.0: # %entry
138 ; LA64-TRAP-NEXT:    addi.w $a1, $a1, 0
139 ; LA64-TRAP-NEXT:    addi.w $a0, $a0, 0
140 ; LA64-TRAP-NEXT:    div.d $a0, $a0, $a1
141 ; LA64-TRAP-NEXT:    bnez $a1, .LBB3_2
142 ; LA64-TRAP-NEXT:  # %bb.1: # %entry
143 ; LA64-TRAP-NEXT:    break 7
144 ; LA64-TRAP-NEXT:  .LBB3_2: # %entry
145 ; LA64-TRAP-NEXT:    ret
146 entry:
147   %r = sdiv i32 %a, %b
148   ret i32 %r
151 define i32 @sdiv_ui32_si32_si32(i32 signext %a, i32 signext %b) {
152 ; LA32-LABEL: sdiv_ui32_si32_si32:
153 ; LA32:       # %bb.0: # %entry
154 ; LA32-NEXT:    div.w $a0, $a0, $a1
155 ; LA32-NEXT:    ret
157 ; LA64-LABEL: sdiv_ui32_si32_si32:
158 ; LA64:       # %bb.0: # %entry
159 ; LA64-NEXT:    div.d $a0, $a0, $a1
160 ; LA64-NEXT:    ret
162 ; LA32-TRAP-LABEL: sdiv_ui32_si32_si32:
163 ; LA32-TRAP:       # %bb.0: # %entry
164 ; LA32-TRAP-NEXT:    div.w $a0, $a0, $a1
165 ; LA32-TRAP-NEXT:    bnez $a1, .LBB4_2
166 ; LA32-TRAP-NEXT:  # %bb.1: # %entry
167 ; LA32-TRAP-NEXT:    break 7
168 ; LA32-TRAP-NEXT:  .LBB4_2: # %entry
169 ; LA32-TRAP-NEXT:    ret
171 ; LA64-TRAP-LABEL: sdiv_ui32_si32_si32:
172 ; LA64-TRAP:       # %bb.0: # %entry
173 ; LA64-TRAP-NEXT:    div.d $a0, $a0, $a1
174 ; LA64-TRAP-NEXT:    bnez $a1, .LBB4_2
175 ; LA64-TRAP-NEXT:  # %bb.1: # %entry
176 ; LA64-TRAP-NEXT:    break 7
177 ; LA64-TRAP-NEXT:  .LBB4_2: # %entry
178 ; LA64-TRAP-NEXT:    ret
179 entry:
180   %r = sdiv i32 %a, %b
181   ret i32 %r
184 define signext i32 @sdiv_si32_ui32_ui32(i32 %a, i32 %b) {
185 ; LA32-LABEL: sdiv_si32_ui32_ui32:
186 ; LA32:       # %bb.0: # %entry
187 ; LA32-NEXT:    div.w $a0, $a0, $a1
188 ; LA32-NEXT:    ret
190 ; LA64-LABEL: sdiv_si32_ui32_ui32:
191 ; LA64:       # %bb.0: # %entry
192 ; LA64-NEXT:    addi.w $a1, $a1, 0
193 ; LA64-NEXT:    addi.w $a0, $a0, 0
194 ; LA64-NEXT:    div.d $a0, $a0, $a1
195 ; LA64-NEXT:    addi.w $a0, $a0, 0
196 ; LA64-NEXT:    ret
198 ; LA32-TRAP-LABEL: sdiv_si32_ui32_ui32:
199 ; LA32-TRAP:       # %bb.0: # %entry
200 ; LA32-TRAP-NEXT:    div.w $a0, $a0, $a1
201 ; LA32-TRAP-NEXT:    bnez $a1, .LBB5_2
202 ; LA32-TRAP-NEXT:  # %bb.1: # %entry
203 ; LA32-TRAP-NEXT:    break 7
204 ; LA32-TRAP-NEXT:  .LBB5_2: # %entry
205 ; LA32-TRAP-NEXT:    ret
207 ; LA64-TRAP-LABEL: sdiv_si32_ui32_ui32:
208 ; LA64-TRAP:       # %bb.0: # %entry
209 ; LA64-TRAP-NEXT:    addi.w $a1, $a1, 0
210 ; LA64-TRAP-NEXT:    addi.w $a0, $a0, 0
211 ; LA64-TRAP-NEXT:    div.d $a0, $a0, $a1
212 ; LA64-TRAP-NEXT:    bnez $a1, .LBB5_2
213 ; LA64-TRAP-NEXT:  # %bb.1: # %entry
214 ; LA64-TRAP-NEXT:    break 7
215 ; LA64-TRAP-NEXT:  .LBB5_2: # %entry
216 ; LA64-TRAP-NEXT:    addi.w $a0, $a0, 0
217 ; LA64-TRAP-NEXT:    ret
218 entry:
219   %r = sdiv i32 %a, %b
220   ret i32 %r
223 define signext i32 @sdiv_si32_si32_si32(i32 signext %a, i32 signext %b) {
224 ; LA32-LABEL: sdiv_si32_si32_si32:
225 ; LA32:       # %bb.0: # %entry
226 ; LA32-NEXT:    div.w $a0, $a0, $a1
227 ; LA32-NEXT:    ret
229 ; LA64-LABEL: sdiv_si32_si32_si32:
230 ; LA64:       # %bb.0: # %entry
231 ; LA64-NEXT:    div.w $a0, $a0, $a1
232 ; LA64-NEXT:    ret
234 ; LA32-TRAP-LABEL: sdiv_si32_si32_si32:
235 ; LA32-TRAP:       # %bb.0: # %entry
236 ; LA32-TRAP-NEXT:    div.w $a0, $a0, $a1
237 ; LA32-TRAP-NEXT:    bnez $a1, .LBB6_2
238 ; LA32-TRAP-NEXT:  # %bb.1: # %entry
239 ; LA32-TRAP-NEXT:    break 7
240 ; LA32-TRAP-NEXT:  .LBB6_2: # %entry
241 ; LA32-TRAP-NEXT:    ret
243 ; LA64-TRAP-LABEL: sdiv_si32_si32_si32:
244 ; LA64-TRAP:       # %bb.0: # %entry
245 ; LA64-TRAP-NEXT:    div.w $a0, $a0, $a1
246 ; LA64-TRAP-NEXT:    bnez $a1, .LBB6_2
247 ; LA64-TRAP-NEXT:  # %bb.1: # %entry
248 ; LA64-TRAP-NEXT:    break 7
249 ; LA64-TRAP-NEXT:  .LBB6_2: # %entry
250 ; LA64-TRAP-NEXT:    ret
251 entry:
252   %r = sdiv i32 %a, %b
253   ret i32 %r
256 define i64 @sdiv_i64(i64 %a, i64 %b) {
257 ; LA32-LABEL: sdiv_i64:
258 ; LA32:       # %bb.0: # %entry
259 ; LA32-NEXT:    addi.w $sp, $sp, -16
260 ; LA32-NEXT:    .cfi_def_cfa_offset 16
261 ; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
262 ; LA32-NEXT:    .cfi_offset 1, -4
263 ; LA32-NEXT:    bl %plt(__divdi3)
264 ; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
265 ; LA32-NEXT:    addi.w $sp, $sp, 16
266 ; LA32-NEXT:    ret
268 ; LA64-LABEL: sdiv_i64:
269 ; LA64:       # %bb.0: # %entry
270 ; LA64-NEXT:    div.d $a0, $a0, $a1
271 ; LA64-NEXT:    ret
273 ; LA32-TRAP-LABEL: sdiv_i64:
274 ; LA32-TRAP:       # %bb.0: # %entry
275 ; LA32-TRAP-NEXT:    addi.w $sp, $sp, -16
276 ; LA32-TRAP-NEXT:    .cfi_def_cfa_offset 16
277 ; LA32-TRAP-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
278 ; LA32-TRAP-NEXT:    .cfi_offset 1, -4
279 ; LA32-TRAP-NEXT:    bl %plt(__divdi3)
280 ; LA32-TRAP-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
281 ; LA32-TRAP-NEXT:    addi.w $sp, $sp, 16
282 ; LA32-TRAP-NEXT:    ret
284 ; LA64-TRAP-LABEL: sdiv_i64:
285 ; LA64-TRAP:       # %bb.0: # %entry
286 ; LA64-TRAP-NEXT:    div.d $a0, $a0, $a1
287 ; LA64-TRAP-NEXT:    bnez $a1, .LBB7_2
288 ; LA64-TRAP-NEXT:  # %bb.1: # %entry
289 ; LA64-TRAP-NEXT:    break 7
290 ; LA64-TRAP-NEXT:  .LBB7_2: # %entry
291 ; LA64-TRAP-NEXT:    ret
292 entry:
293   %r = sdiv i64 %a, %b
294   ret i64 %r
297 define i1 @udiv_i1(i1 %a, i1 %b) {
298 ; LA32-LABEL: udiv_i1:
299 ; LA32:       # %bb.0: # %entry
300 ; LA32-NEXT:    ret
302 ; LA64-LABEL: udiv_i1:
303 ; LA64:       # %bb.0: # %entry
304 ; LA64-NEXT:    ret
306 ; LA32-TRAP-LABEL: udiv_i1:
307 ; LA32-TRAP:       # %bb.0: # %entry
308 ; LA32-TRAP-NEXT:    ret
310 ; LA64-TRAP-LABEL: udiv_i1:
311 ; LA64-TRAP:       # %bb.0: # %entry
312 ; LA64-TRAP-NEXT:    ret
313 entry:
314   %r = udiv i1 %a, %b
315   ret i1 %r
318 define i8 @udiv_i8(i8 %a, i8 %b) {
319 ; LA32-LABEL: udiv_i8:
320 ; LA32:       # %bb.0: # %entry
321 ; LA32-NEXT:    andi $a1, $a1, 255
322 ; LA32-NEXT:    andi $a0, $a0, 255
323 ; LA32-NEXT:    div.wu $a0, $a0, $a1
324 ; LA32-NEXT:    ret
326 ; LA64-LABEL: udiv_i8:
327 ; LA64:       # %bb.0: # %entry
328 ; LA64-NEXT:    andi $a1, $a1, 255
329 ; LA64-NEXT:    andi $a0, $a0, 255
330 ; LA64-NEXT:    div.du $a0, $a0, $a1
331 ; LA64-NEXT:    ret
333 ; LA32-TRAP-LABEL: udiv_i8:
334 ; LA32-TRAP:       # %bb.0: # %entry
335 ; LA32-TRAP-NEXT:    andi $a1, $a1, 255
336 ; LA32-TRAP-NEXT:    andi $a0, $a0, 255
337 ; LA32-TRAP-NEXT:    div.wu $a0, $a0, $a1
338 ; LA32-TRAP-NEXT:    bnez $a1, .LBB9_2
339 ; LA32-TRAP-NEXT:  # %bb.1: # %entry
340 ; LA32-TRAP-NEXT:    break 7
341 ; LA32-TRAP-NEXT:  .LBB9_2: # %entry
342 ; LA32-TRAP-NEXT:    ret
344 ; LA64-TRAP-LABEL: udiv_i8:
345 ; LA64-TRAP:       # %bb.0: # %entry
346 ; LA64-TRAP-NEXT:    andi $a1, $a1, 255
347 ; LA64-TRAP-NEXT:    andi $a0, $a0, 255
348 ; LA64-TRAP-NEXT:    div.du $a0, $a0, $a1
349 ; LA64-TRAP-NEXT:    bnez $a1, .LBB9_2
350 ; LA64-TRAP-NEXT:  # %bb.1: # %entry
351 ; LA64-TRAP-NEXT:    break 7
352 ; LA64-TRAP-NEXT:  .LBB9_2: # %entry
353 ; LA64-TRAP-NEXT:    ret
354 entry:
355   %r = udiv i8 %a, %b
356   ret i8 %r
359 define i16 @udiv_i16(i16 %a, i16 %b) {
360 ; LA32-LABEL: udiv_i16:
361 ; LA32:       # %bb.0: # %entry
362 ; LA32-NEXT:    bstrpick.w $a1, $a1, 15, 0
363 ; LA32-NEXT:    bstrpick.w $a0, $a0, 15, 0
364 ; LA32-NEXT:    div.wu $a0, $a0, $a1
365 ; LA32-NEXT:    ret
367 ; LA64-LABEL: udiv_i16:
368 ; LA64:       # %bb.0: # %entry
369 ; LA64-NEXT:    bstrpick.d $a1, $a1, 15, 0
370 ; LA64-NEXT:    bstrpick.d $a0, $a0, 15, 0
371 ; LA64-NEXT:    div.du $a0, $a0, $a1
372 ; LA64-NEXT:    ret
374 ; LA32-TRAP-LABEL: udiv_i16:
375 ; LA32-TRAP:       # %bb.0: # %entry
376 ; LA32-TRAP-NEXT:    bstrpick.w $a1, $a1, 15, 0
377 ; LA32-TRAP-NEXT:    bstrpick.w $a0, $a0, 15, 0
378 ; LA32-TRAP-NEXT:    div.wu $a0, $a0, $a1
379 ; LA32-TRAP-NEXT:    bnez $a1, .LBB10_2
380 ; LA32-TRAP-NEXT:  # %bb.1: # %entry
381 ; LA32-TRAP-NEXT:    break 7
382 ; LA32-TRAP-NEXT:  .LBB10_2: # %entry
383 ; LA32-TRAP-NEXT:    ret
385 ; LA64-TRAP-LABEL: udiv_i16:
386 ; LA64-TRAP:       # %bb.0: # %entry
387 ; LA64-TRAP-NEXT:    bstrpick.d $a1, $a1, 15, 0
388 ; LA64-TRAP-NEXT:    bstrpick.d $a0, $a0, 15, 0
389 ; LA64-TRAP-NEXT:    div.du $a0, $a0, $a1
390 ; LA64-TRAP-NEXT:    bnez $a1, .LBB10_2
391 ; LA64-TRAP-NEXT:  # %bb.1: # %entry
392 ; LA64-TRAP-NEXT:    break 7
393 ; LA64-TRAP-NEXT:  .LBB10_2: # %entry
394 ; LA64-TRAP-NEXT:    ret
395 entry:
396   %r = udiv i16 %a, %b
397   ret i16 %r
400 define i32 @udiv_i32(i32 %a, i32 %b) {
401 ; LA32-LABEL: udiv_i32:
402 ; LA32:       # %bb.0: # %entry
403 ; LA32-NEXT:    div.wu $a0, $a0, $a1
404 ; LA32-NEXT:    ret
406 ; LA64-LABEL: udiv_i32:
407 ; LA64:       # %bb.0: # %entry
408 ; LA64-NEXT:    addi.w $a1, $a1, 0
409 ; LA64-NEXT:    addi.w $a0, $a0, 0
410 ; LA64-NEXT:    div.wu $a0, $a0, $a1
411 ; LA64-NEXT:    ret
413 ; LA32-TRAP-LABEL: udiv_i32:
414 ; LA32-TRAP:       # %bb.0: # %entry
415 ; LA32-TRAP-NEXT:    div.wu $a0, $a0, $a1
416 ; LA32-TRAP-NEXT:    bnez $a1, .LBB11_2
417 ; LA32-TRAP-NEXT:  # %bb.1: # %entry
418 ; LA32-TRAP-NEXT:    break 7
419 ; LA32-TRAP-NEXT:  .LBB11_2: # %entry
420 ; LA32-TRAP-NEXT:    ret
422 ; LA64-TRAP-LABEL: udiv_i32:
423 ; LA64-TRAP:       # %bb.0: # %entry
424 ; LA64-TRAP-NEXT:    addi.w $a1, $a1, 0
425 ; LA64-TRAP-NEXT:    addi.w $a0, $a0, 0
426 ; LA64-TRAP-NEXT:    div.wu $a0, $a0, $a1
427 ; LA64-TRAP-NEXT:    bnez $a1, .LBB11_2
428 ; LA64-TRAP-NEXT:  # %bb.1: # %entry
429 ; LA64-TRAP-NEXT:    break 7
430 ; LA64-TRAP-NEXT:  .LBB11_2: # %entry
431 ; LA64-TRAP-NEXT:    ret
432 entry:
433   %r = udiv i32 %a, %b
434   ret i32 %r
437 define i32 @udiv_ui32_si32_si32(i32 signext %a, i32 signext %b) {
438 ; LA32-LABEL: udiv_ui32_si32_si32:
439 ; LA32:       # %bb.0: # %entry
440 ; LA32-NEXT:    div.wu $a0, $a0, $a1
441 ; LA32-NEXT:    ret
443 ; LA64-LABEL: udiv_ui32_si32_si32:
444 ; LA64:       # %bb.0: # %entry
445 ; LA64-NEXT:    div.wu $a0, $a0, $a1
446 ; LA64-NEXT:    ret
448 ; LA32-TRAP-LABEL: udiv_ui32_si32_si32:
449 ; LA32-TRAP:       # %bb.0: # %entry
450 ; LA32-TRAP-NEXT:    div.wu $a0, $a0, $a1
451 ; LA32-TRAP-NEXT:    bnez $a1, .LBB12_2
452 ; LA32-TRAP-NEXT:  # %bb.1: # %entry
453 ; LA32-TRAP-NEXT:    break 7
454 ; LA32-TRAP-NEXT:  .LBB12_2: # %entry
455 ; LA32-TRAP-NEXT:    ret
457 ; LA64-TRAP-LABEL: udiv_ui32_si32_si32:
458 ; LA64-TRAP:       # %bb.0: # %entry
459 ; LA64-TRAP-NEXT:    div.wu $a0, $a0, $a1
460 ; LA64-TRAP-NEXT:    bnez $a1, .LBB12_2
461 ; LA64-TRAP-NEXT:  # %bb.1: # %entry
462 ; LA64-TRAP-NEXT:    break 7
463 ; LA64-TRAP-NEXT:  .LBB12_2: # %entry
464 ; LA64-TRAP-NEXT:    ret
465 entry:
466   %r = udiv i32 %a, %b
467   ret i32 %r
470 define signext i32 @udiv_si32_ui32_ui32(i32 %a, i32 %b) {
471 ; LA32-LABEL: udiv_si32_ui32_ui32:
472 ; LA32:       # %bb.0: # %entry
473 ; LA32-NEXT:    div.wu $a0, $a0, $a1
474 ; LA32-NEXT:    ret
476 ; LA64-LABEL: udiv_si32_ui32_ui32:
477 ; LA64:       # %bb.0: # %entry
478 ; LA64-NEXT:    addi.w $a1, $a1, 0
479 ; LA64-NEXT:    addi.w $a0, $a0, 0
480 ; LA64-NEXT:    div.wu $a0, $a0, $a1
481 ; LA64-NEXT:    ret
483 ; LA32-TRAP-LABEL: udiv_si32_ui32_ui32:
484 ; LA32-TRAP:       # %bb.0: # %entry
485 ; LA32-TRAP-NEXT:    div.wu $a0, $a0, $a1
486 ; LA32-TRAP-NEXT:    bnez $a1, .LBB13_2
487 ; LA32-TRAP-NEXT:  # %bb.1: # %entry
488 ; LA32-TRAP-NEXT:    break 7
489 ; LA32-TRAP-NEXT:  .LBB13_2: # %entry
490 ; LA32-TRAP-NEXT:    ret
492 ; LA64-TRAP-LABEL: udiv_si32_ui32_ui32:
493 ; LA64-TRAP:       # %bb.0: # %entry
494 ; LA64-TRAP-NEXT:    addi.w $a1, $a1, 0
495 ; LA64-TRAP-NEXT:    addi.w $a0, $a0, 0
496 ; LA64-TRAP-NEXT:    div.wu $a0, $a0, $a1
497 ; LA64-TRAP-NEXT:    bnez $a1, .LBB13_2
498 ; LA64-TRAP-NEXT:  # %bb.1: # %entry
499 ; LA64-TRAP-NEXT:    break 7
500 ; LA64-TRAP-NEXT:  .LBB13_2: # %entry
501 ; LA64-TRAP-NEXT:    ret
502 entry:
503   %r = udiv i32 %a, %b
504   ret i32 %r
507 define signext i32 @udiv_si32_si32_si32(i32 signext %a, i32 signext %b) {
508 ; LA32-LABEL: udiv_si32_si32_si32:
509 ; LA32:       # %bb.0: # %entry
510 ; LA32-NEXT:    div.wu $a0, $a0, $a1
511 ; LA32-NEXT:    ret
513 ; LA64-LABEL: udiv_si32_si32_si32:
514 ; LA64:       # %bb.0: # %entry
515 ; LA64-NEXT:    div.wu $a0, $a0, $a1
516 ; LA64-NEXT:    ret
518 ; LA32-TRAP-LABEL: udiv_si32_si32_si32:
519 ; LA32-TRAP:       # %bb.0: # %entry
520 ; LA32-TRAP-NEXT:    div.wu $a0, $a0, $a1
521 ; LA32-TRAP-NEXT:    bnez $a1, .LBB14_2
522 ; LA32-TRAP-NEXT:  # %bb.1: # %entry
523 ; LA32-TRAP-NEXT:    break 7
524 ; LA32-TRAP-NEXT:  .LBB14_2: # %entry
525 ; LA32-TRAP-NEXT:    ret
527 ; LA64-TRAP-LABEL: udiv_si32_si32_si32:
528 ; LA64-TRAP:       # %bb.0: # %entry
529 ; LA64-TRAP-NEXT:    div.wu $a0, $a0, $a1
530 ; LA64-TRAP-NEXT:    bnez $a1, .LBB14_2
531 ; LA64-TRAP-NEXT:  # %bb.1: # %entry
532 ; LA64-TRAP-NEXT:    break 7
533 ; LA64-TRAP-NEXT:  .LBB14_2: # %entry
534 ; LA64-TRAP-NEXT:    ret
535 entry:
536   %r = udiv i32 %a, %b
537   ret i32 %r
540 define i64 @udiv_i64(i64 %a, i64 %b) {
541 ; LA32-LABEL: udiv_i64:
542 ; LA32:       # %bb.0: # %entry
543 ; LA32-NEXT:    addi.w $sp, $sp, -16
544 ; LA32-NEXT:    .cfi_def_cfa_offset 16
545 ; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
546 ; LA32-NEXT:    .cfi_offset 1, -4
547 ; LA32-NEXT:    bl %plt(__udivdi3)
548 ; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
549 ; LA32-NEXT:    addi.w $sp, $sp, 16
550 ; LA32-NEXT:    ret
552 ; LA64-LABEL: udiv_i64:
553 ; LA64:       # %bb.0: # %entry
554 ; LA64-NEXT:    div.du $a0, $a0, $a1
555 ; LA64-NEXT:    ret
557 ; LA32-TRAP-LABEL: udiv_i64:
558 ; LA32-TRAP:       # %bb.0: # %entry
559 ; LA32-TRAP-NEXT:    addi.w $sp, $sp, -16
560 ; LA32-TRAP-NEXT:    .cfi_def_cfa_offset 16
561 ; LA32-TRAP-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
562 ; LA32-TRAP-NEXT:    .cfi_offset 1, -4
563 ; LA32-TRAP-NEXT:    bl %plt(__udivdi3)
564 ; LA32-TRAP-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
565 ; LA32-TRAP-NEXT:    addi.w $sp, $sp, 16
566 ; LA32-TRAP-NEXT:    ret
568 ; LA64-TRAP-LABEL: udiv_i64:
569 ; LA64-TRAP:       # %bb.0: # %entry
570 ; LA64-TRAP-NEXT:    div.du $a0, $a0, $a1
571 ; LA64-TRAP-NEXT:    bnez $a1, .LBB15_2
572 ; LA64-TRAP-NEXT:  # %bb.1: # %entry
573 ; LA64-TRAP-NEXT:    break 7
574 ; LA64-TRAP-NEXT:  .LBB15_2: # %entry
575 ; LA64-TRAP-NEXT:    ret
576 entry:
577   %r = udiv i64 %a, %b
578   ret i64 %r
581 define i1 @srem_i1(i1 %a, i1 %b) {
582 ; LA32-LABEL: srem_i1:
583 ; LA32:       # %bb.0: # %entry
584 ; LA32-NEXT:    move $a0, $zero
585 ; LA32-NEXT:    ret
587 ; LA64-LABEL: srem_i1:
588 ; LA64:       # %bb.0: # %entry
589 ; LA64-NEXT:    move $a0, $zero
590 ; LA64-NEXT:    ret
592 ; LA32-TRAP-LABEL: srem_i1:
593 ; LA32-TRAP:       # %bb.0: # %entry
594 ; LA32-TRAP-NEXT:    move $a0, $zero
595 ; LA32-TRAP-NEXT:    ret
597 ; LA64-TRAP-LABEL: srem_i1:
598 ; LA64-TRAP:       # %bb.0: # %entry
599 ; LA64-TRAP-NEXT:    move $a0, $zero
600 ; LA64-TRAP-NEXT:    ret
601 entry:
602   %r = srem i1 %a, %b
603   ret i1 %r
606 define i8 @srem_i8(i8 %a, i8 %b) {
607 ; LA32-LABEL: srem_i8:
608 ; LA32:       # %bb.0: # %entry
609 ; LA32-NEXT:    ext.w.b $a1, $a1
610 ; LA32-NEXT:    ext.w.b $a0, $a0
611 ; LA32-NEXT:    mod.w $a0, $a0, $a1
612 ; LA32-NEXT:    ret
614 ; LA64-LABEL: srem_i8:
615 ; LA64:       # %bb.0: # %entry
616 ; LA64-NEXT:    ext.w.b $a1, $a1
617 ; LA64-NEXT:    ext.w.b $a0, $a0
618 ; LA64-NEXT:    mod.d $a0, $a0, $a1
619 ; LA64-NEXT:    ret
621 ; LA32-TRAP-LABEL: srem_i8:
622 ; LA32-TRAP:       # %bb.0: # %entry
623 ; LA32-TRAP-NEXT:    ext.w.b $a1, $a1
624 ; LA32-TRAP-NEXT:    ext.w.b $a0, $a0
625 ; LA32-TRAP-NEXT:    mod.w $a0, $a0, $a1
626 ; LA32-TRAP-NEXT:    bnez $a1, .LBB17_2
627 ; LA32-TRAP-NEXT:  # %bb.1: # %entry
628 ; LA32-TRAP-NEXT:    break 7
629 ; LA32-TRAP-NEXT:  .LBB17_2: # %entry
630 ; LA32-TRAP-NEXT:    ret
632 ; LA64-TRAP-LABEL: srem_i8:
633 ; LA64-TRAP:       # %bb.0: # %entry
634 ; LA64-TRAP-NEXT:    ext.w.b $a1, $a1
635 ; LA64-TRAP-NEXT:    ext.w.b $a0, $a0
636 ; LA64-TRAP-NEXT:    mod.d $a0, $a0, $a1
637 ; LA64-TRAP-NEXT:    bnez $a1, .LBB17_2
638 ; LA64-TRAP-NEXT:  # %bb.1: # %entry
639 ; LA64-TRAP-NEXT:    break 7
640 ; LA64-TRAP-NEXT:  .LBB17_2: # %entry
641 ; LA64-TRAP-NEXT:    ret
642 entry:
643   %r = srem i8 %a, %b
644   ret i8 %r
647 define i16 @srem_i16(i16 %a, i16 %b) {
648 ; LA32-LABEL: srem_i16:
649 ; LA32:       # %bb.0: # %entry
650 ; LA32-NEXT:    ext.w.h $a1, $a1
651 ; LA32-NEXT:    ext.w.h $a0, $a0
652 ; LA32-NEXT:    mod.w $a0, $a0, $a1
653 ; LA32-NEXT:    ret
655 ; LA64-LABEL: srem_i16:
656 ; LA64:       # %bb.0: # %entry
657 ; LA64-NEXT:    ext.w.h $a1, $a1
658 ; LA64-NEXT:    ext.w.h $a0, $a0
659 ; LA64-NEXT:    mod.d $a0, $a0, $a1
660 ; LA64-NEXT:    ret
662 ; LA32-TRAP-LABEL: srem_i16:
663 ; LA32-TRAP:       # %bb.0: # %entry
664 ; LA32-TRAP-NEXT:    ext.w.h $a1, $a1
665 ; LA32-TRAP-NEXT:    ext.w.h $a0, $a0
666 ; LA32-TRAP-NEXT:    mod.w $a0, $a0, $a1
667 ; LA32-TRAP-NEXT:    bnez $a1, .LBB18_2
668 ; LA32-TRAP-NEXT:  # %bb.1: # %entry
669 ; LA32-TRAP-NEXT:    break 7
670 ; LA32-TRAP-NEXT:  .LBB18_2: # %entry
671 ; LA32-TRAP-NEXT:    ret
673 ; LA64-TRAP-LABEL: srem_i16:
674 ; LA64-TRAP:       # %bb.0: # %entry
675 ; LA64-TRAP-NEXT:    ext.w.h $a1, $a1
676 ; LA64-TRAP-NEXT:    ext.w.h $a0, $a0
677 ; LA64-TRAP-NEXT:    mod.d $a0, $a0, $a1
678 ; LA64-TRAP-NEXT:    bnez $a1, .LBB18_2
679 ; LA64-TRAP-NEXT:  # %bb.1: # %entry
680 ; LA64-TRAP-NEXT:    break 7
681 ; LA64-TRAP-NEXT:  .LBB18_2: # %entry
682 ; LA64-TRAP-NEXT:    ret
683 entry:
684   %r = srem i16 %a, %b
685   ret i16 %r
688 define i32 @srem_i32(i32 %a, i32 %b) {
689 ; LA32-LABEL: srem_i32:
690 ; LA32:       # %bb.0: # %entry
691 ; LA32-NEXT:    mod.w $a0, $a0, $a1
692 ; LA32-NEXT:    ret
694 ; LA64-LABEL: srem_i32:
695 ; LA64:       # %bb.0: # %entry
696 ; LA64-NEXT:    addi.w $a1, $a1, 0
697 ; LA64-NEXT:    addi.w $a0, $a0, 0
698 ; LA64-NEXT:    mod.d $a0, $a0, $a1
699 ; LA64-NEXT:    ret
701 ; LA32-TRAP-LABEL: srem_i32:
702 ; LA32-TRAP:       # %bb.0: # %entry
703 ; LA32-TRAP-NEXT:    mod.w $a0, $a0, $a1
704 ; LA32-TRAP-NEXT:    bnez $a1, .LBB19_2
705 ; LA32-TRAP-NEXT:  # %bb.1: # %entry
706 ; LA32-TRAP-NEXT:    break 7
707 ; LA32-TRAP-NEXT:  .LBB19_2: # %entry
708 ; LA32-TRAP-NEXT:    ret
710 ; LA64-TRAP-LABEL: srem_i32:
711 ; LA64-TRAP:       # %bb.0: # %entry
712 ; LA64-TRAP-NEXT:    addi.w $a1, $a1, 0
713 ; LA64-TRAP-NEXT:    addi.w $a0, $a0, 0
714 ; LA64-TRAP-NEXT:    mod.d $a0, $a0, $a1
715 ; LA64-TRAP-NEXT:    bnez $a1, .LBB19_2
716 ; LA64-TRAP-NEXT:  # %bb.1: # %entry
717 ; LA64-TRAP-NEXT:    break 7
718 ; LA64-TRAP-NEXT:  .LBB19_2: # %entry
719 ; LA64-TRAP-NEXT:    ret
720 entry:
721   %r = srem i32 %a, %b
722   ret i32 %r
725 define i32 @srem_ui32_si32_si32(i32 signext %a, i32 signext %b) {
726 ; LA32-LABEL: srem_ui32_si32_si32:
727 ; LA32:       # %bb.0: # %entry
728 ; LA32-NEXT:    mod.w $a0, $a0, $a1
729 ; LA32-NEXT:    ret
731 ; LA64-LABEL: srem_ui32_si32_si32:
732 ; LA64:       # %bb.0: # %entry
733 ; LA64-NEXT:    mod.d $a0, $a0, $a1
734 ; LA64-NEXT:    ret
736 ; LA32-TRAP-LABEL: srem_ui32_si32_si32:
737 ; LA32-TRAP:       # %bb.0: # %entry
738 ; LA32-TRAP-NEXT:    mod.w $a0, $a0, $a1
739 ; LA32-TRAP-NEXT:    bnez $a1, .LBB20_2
740 ; LA32-TRAP-NEXT:  # %bb.1: # %entry
741 ; LA32-TRAP-NEXT:    break 7
742 ; LA32-TRAP-NEXT:  .LBB20_2: # %entry
743 ; LA32-TRAP-NEXT:    ret
745 ; LA64-TRAP-LABEL: srem_ui32_si32_si32:
746 ; LA64-TRAP:       # %bb.0: # %entry
747 ; LA64-TRAP-NEXT:    mod.d $a0, $a0, $a1
748 ; LA64-TRAP-NEXT:    bnez $a1, .LBB20_2
749 ; LA64-TRAP-NEXT:  # %bb.1: # %entry
750 ; LA64-TRAP-NEXT:    break 7
751 ; LA64-TRAP-NEXT:  .LBB20_2: # %entry
752 ; LA64-TRAP-NEXT:    ret
753 entry:
754   %r = srem i32 %a, %b
755   ret i32 %r
758 define signext i32 @srem_si32_ui32_ui32(i32 %a, i32 %b) {
759 ; LA32-LABEL: srem_si32_ui32_ui32:
760 ; LA32:       # %bb.0: # %entry
761 ; LA32-NEXT:    mod.w $a0, $a0, $a1
762 ; LA32-NEXT:    ret
764 ; LA64-LABEL: srem_si32_ui32_ui32:
765 ; LA64:       # %bb.0: # %entry
766 ; LA64-NEXT:    addi.w $a1, $a1, 0
767 ; LA64-NEXT:    addi.w $a0, $a0, 0
768 ; LA64-NEXT:    mod.d $a0, $a0, $a1
769 ; LA64-NEXT:    ret
771 ; LA32-TRAP-LABEL: srem_si32_ui32_ui32:
772 ; LA32-TRAP:       # %bb.0: # %entry
773 ; LA32-TRAP-NEXT:    mod.w $a0, $a0, $a1
774 ; LA32-TRAP-NEXT:    bnez $a1, .LBB21_2
775 ; LA32-TRAP-NEXT:  # %bb.1: # %entry
776 ; LA32-TRAP-NEXT:    break 7
777 ; LA32-TRAP-NEXT:  .LBB21_2: # %entry
778 ; LA32-TRAP-NEXT:    ret
780 ; LA64-TRAP-LABEL: srem_si32_ui32_ui32:
781 ; LA64-TRAP:       # %bb.0: # %entry
782 ; LA64-TRAP-NEXT:    addi.w $a1, $a1, 0
783 ; LA64-TRAP-NEXT:    addi.w $a0, $a0, 0
784 ; LA64-TRAP-NEXT:    mod.d $a0, $a0, $a1
785 ; LA64-TRAP-NEXT:    bnez $a1, .LBB21_2
786 ; LA64-TRAP-NEXT:  # %bb.1: # %entry
787 ; LA64-TRAP-NEXT:    break 7
788 ; LA64-TRAP-NEXT:  .LBB21_2: # %entry
789 ; LA64-TRAP-NEXT:    ret
790 entry:
791   %r = srem i32 %a, %b
792   ret i32 %r
795 define signext i32 @srem_si32_si32_si32(i32 signext %a, i32 signext %b) {
796 ; LA32-LABEL: srem_si32_si32_si32:
797 ; LA32:       # %bb.0: # %entry
798 ; LA32-NEXT:    mod.w $a0, $a0, $a1
799 ; LA32-NEXT:    ret
801 ; LA64-LABEL: srem_si32_si32_si32:
802 ; LA64:       # %bb.0: # %entry
803 ; LA64-NEXT:    mod.d $a0, $a0, $a1
804 ; LA64-NEXT:    ret
806 ; LA32-TRAP-LABEL: srem_si32_si32_si32:
807 ; LA32-TRAP:       # %bb.0: # %entry
808 ; LA32-TRAP-NEXT:    mod.w $a0, $a0, $a1
809 ; LA32-TRAP-NEXT:    bnez $a1, .LBB22_2
810 ; LA32-TRAP-NEXT:  # %bb.1: # %entry
811 ; LA32-TRAP-NEXT:    break 7
812 ; LA32-TRAP-NEXT:  .LBB22_2: # %entry
813 ; LA32-TRAP-NEXT:    ret
815 ; LA64-TRAP-LABEL: srem_si32_si32_si32:
816 ; LA64-TRAP:       # %bb.0: # %entry
817 ; LA64-TRAP-NEXT:    mod.d $a0, $a0, $a1
818 ; LA64-TRAP-NEXT:    bnez $a1, .LBB22_2
819 ; LA64-TRAP-NEXT:  # %bb.1: # %entry
820 ; LA64-TRAP-NEXT:    break 7
821 ; LA64-TRAP-NEXT:  .LBB22_2: # %entry
822 ; LA64-TRAP-NEXT:    ret
823 entry:
824   %r = srem i32 %a, %b
825   ret i32 %r
828 define i64 @srem_i64(i64 %a, i64 %b) {
829 ; LA32-LABEL: srem_i64:
830 ; LA32:       # %bb.0: # %entry
831 ; LA32-NEXT:    addi.w $sp, $sp, -16
832 ; LA32-NEXT:    .cfi_def_cfa_offset 16
833 ; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
834 ; LA32-NEXT:    .cfi_offset 1, -4
835 ; LA32-NEXT:    bl %plt(__moddi3)
836 ; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
837 ; LA32-NEXT:    addi.w $sp, $sp, 16
838 ; LA32-NEXT:    ret
840 ; LA64-LABEL: srem_i64:
841 ; LA64:       # %bb.0: # %entry
842 ; LA64-NEXT:    mod.d $a0, $a0, $a1
843 ; LA64-NEXT:    ret
845 ; LA32-TRAP-LABEL: srem_i64:
846 ; LA32-TRAP:       # %bb.0: # %entry
847 ; LA32-TRAP-NEXT:    addi.w $sp, $sp, -16
848 ; LA32-TRAP-NEXT:    .cfi_def_cfa_offset 16
849 ; LA32-TRAP-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
850 ; LA32-TRAP-NEXT:    .cfi_offset 1, -4
851 ; LA32-TRAP-NEXT:    bl %plt(__moddi3)
852 ; LA32-TRAP-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
853 ; LA32-TRAP-NEXT:    addi.w $sp, $sp, 16
854 ; LA32-TRAP-NEXT:    ret
856 ; LA64-TRAP-LABEL: srem_i64:
857 ; LA64-TRAP:       # %bb.0: # %entry
858 ; LA64-TRAP-NEXT:    mod.d $a0, $a0, $a1
859 ; LA64-TRAP-NEXT:    bnez $a1, .LBB23_2
860 ; LA64-TRAP-NEXT:  # %bb.1: # %entry
861 ; LA64-TRAP-NEXT:    break 7
862 ; LA64-TRAP-NEXT:  .LBB23_2: # %entry
863 ; LA64-TRAP-NEXT:    ret
864 entry:
865   %r = srem i64 %a, %b
866   ret i64 %r
869 define i1 @urem_i1(i1 %a, i1 %b) {
870 ; LA32-LABEL: urem_i1:
871 ; LA32:       # %bb.0: # %entry
872 ; LA32-NEXT:    move $a0, $zero
873 ; LA32-NEXT:    ret
875 ; LA64-LABEL: urem_i1:
876 ; LA64:       # %bb.0: # %entry
877 ; LA64-NEXT:    move $a0, $zero
878 ; LA64-NEXT:    ret
880 ; LA32-TRAP-LABEL: urem_i1:
881 ; LA32-TRAP:       # %bb.0: # %entry
882 ; LA32-TRAP-NEXT:    move $a0, $zero
883 ; LA32-TRAP-NEXT:    ret
885 ; LA64-TRAP-LABEL: urem_i1:
886 ; LA64-TRAP:       # %bb.0: # %entry
887 ; LA64-TRAP-NEXT:    move $a0, $zero
888 ; LA64-TRAP-NEXT:    ret
889 entry:
890   %r = urem i1 %a, %b
891   ret i1 %r
894 define i8 @urem_i8(i8 %a, i8 %b) {
895 ; LA32-LABEL: urem_i8:
896 ; LA32:       # %bb.0: # %entry
897 ; LA32-NEXT:    andi $a1, $a1, 255
898 ; LA32-NEXT:    andi $a0, $a0, 255
899 ; LA32-NEXT:    mod.wu $a0, $a0, $a1
900 ; LA32-NEXT:    ret
902 ; LA64-LABEL: urem_i8:
903 ; LA64:       # %bb.0: # %entry
904 ; LA64-NEXT:    andi $a1, $a1, 255
905 ; LA64-NEXT:    andi $a0, $a0, 255
906 ; LA64-NEXT:    mod.du $a0, $a0, $a1
907 ; LA64-NEXT:    ret
909 ; LA32-TRAP-LABEL: urem_i8:
910 ; LA32-TRAP:       # %bb.0: # %entry
911 ; LA32-TRAP-NEXT:    andi $a1, $a1, 255
912 ; LA32-TRAP-NEXT:    andi $a0, $a0, 255
913 ; LA32-TRAP-NEXT:    mod.wu $a0, $a0, $a1
914 ; LA32-TRAP-NEXT:    bnez $a1, .LBB25_2
915 ; LA32-TRAP-NEXT:  # %bb.1: # %entry
916 ; LA32-TRAP-NEXT:    break 7
917 ; LA32-TRAP-NEXT:  .LBB25_2: # %entry
918 ; LA32-TRAP-NEXT:    ret
920 ; LA64-TRAP-LABEL: urem_i8:
921 ; LA64-TRAP:       # %bb.0: # %entry
922 ; LA64-TRAP-NEXT:    andi $a1, $a1, 255
923 ; LA64-TRAP-NEXT:    andi $a0, $a0, 255
924 ; LA64-TRAP-NEXT:    mod.du $a0, $a0, $a1
925 ; LA64-TRAP-NEXT:    bnez $a1, .LBB25_2
926 ; LA64-TRAP-NEXT:  # %bb.1: # %entry
927 ; LA64-TRAP-NEXT:    break 7
928 ; LA64-TRAP-NEXT:  .LBB25_2: # %entry
929 ; LA64-TRAP-NEXT:    ret
930 entry:
931   %r = urem i8 %a, %b
932   ret i8 %r
935 define i16 @urem_i16(i16 %a, i16 %b) {
936 ; LA32-LABEL: urem_i16:
937 ; LA32:       # %bb.0: # %entry
938 ; LA32-NEXT:    bstrpick.w $a1, $a1, 15, 0
939 ; LA32-NEXT:    bstrpick.w $a0, $a0, 15, 0
940 ; LA32-NEXT:    mod.wu $a0, $a0, $a1
941 ; LA32-NEXT:    ret
943 ; LA64-LABEL: urem_i16:
944 ; LA64:       # %bb.0: # %entry
945 ; LA64-NEXT:    bstrpick.d $a1, $a1, 15, 0
946 ; LA64-NEXT:    bstrpick.d $a0, $a0, 15, 0
947 ; LA64-NEXT:    mod.du $a0, $a0, $a1
948 ; LA64-NEXT:    ret
950 ; LA32-TRAP-LABEL: urem_i16:
951 ; LA32-TRAP:       # %bb.0: # %entry
952 ; LA32-TRAP-NEXT:    bstrpick.w $a1, $a1, 15, 0
953 ; LA32-TRAP-NEXT:    bstrpick.w $a0, $a0, 15, 0
954 ; LA32-TRAP-NEXT:    mod.wu $a0, $a0, $a1
955 ; LA32-TRAP-NEXT:    bnez $a1, .LBB26_2
956 ; LA32-TRAP-NEXT:  # %bb.1: # %entry
957 ; LA32-TRAP-NEXT:    break 7
958 ; LA32-TRAP-NEXT:  .LBB26_2: # %entry
959 ; LA32-TRAP-NEXT:    ret
961 ; LA64-TRAP-LABEL: urem_i16:
962 ; LA64-TRAP:       # %bb.0: # %entry
963 ; LA64-TRAP-NEXT:    bstrpick.d $a1, $a1, 15, 0
964 ; LA64-TRAP-NEXT:    bstrpick.d $a0, $a0, 15, 0
965 ; LA64-TRAP-NEXT:    mod.du $a0, $a0, $a1
966 ; LA64-TRAP-NEXT:    bnez $a1, .LBB26_2
967 ; LA64-TRAP-NEXT:  # %bb.1: # %entry
968 ; LA64-TRAP-NEXT:    break 7
969 ; LA64-TRAP-NEXT:  .LBB26_2: # %entry
970 ; LA64-TRAP-NEXT:    ret
971 entry:
972   %r = urem i16 %a, %b
973   ret i16 %r
976 define i32 @urem_i32(i32 %a, i32 %b) {
977 ; LA32-LABEL: urem_i32:
978 ; LA32:       # %bb.0: # %entry
979 ; LA32-NEXT:    mod.wu $a0, $a0, $a1
980 ; LA32-NEXT:    ret
982 ; LA64-LABEL: urem_i32:
983 ; LA64:       # %bb.0: # %entry
984 ; LA64-NEXT:    addi.w $a1, $a1, 0
985 ; LA64-NEXT:    addi.w $a0, $a0, 0
986 ; LA64-NEXT:    mod.wu $a0, $a0, $a1
987 ; LA64-NEXT:    ret
989 ; LA32-TRAP-LABEL: urem_i32:
990 ; LA32-TRAP:       # %bb.0: # %entry
991 ; LA32-TRAP-NEXT:    mod.wu $a0, $a0, $a1
992 ; LA32-TRAP-NEXT:    bnez $a1, .LBB27_2
993 ; LA32-TRAP-NEXT:  # %bb.1: # %entry
994 ; LA32-TRAP-NEXT:    break 7
995 ; LA32-TRAP-NEXT:  .LBB27_2: # %entry
996 ; LA32-TRAP-NEXT:    ret
998 ; LA64-TRAP-LABEL: urem_i32:
999 ; LA64-TRAP:       # %bb.0: # %entry
1000 ; LA64-TRAP-NEXT:    addi.w $a1, $a1, 0
1001 ; LA64-TRAP-NEXT:    addi.w $a0, $a0, 0
1002 ; LA64-TRAP-NEXT:    mod.wu $a0, $a0, $a1
1003 ; LA64-TRAP-NEXT:    bnez $a1, .LBB27_2
1004 ; LA64-TRAP-NEXT:  # %bb.1: # %entry
1005 ; LA64-TRAP-NEXT:    break 7
1006 ; LA64-TRAP-NEXT:  .LBB27_2: # %entry
1007 ; LA64-TRAP-NEXT:    ret
1008 entry:
1009   %r = urem i32 %a, %b
1010   ret i32 %r
1013 define i32 @urem_ui32_si32_si32(i32 signext %a, i32 signext %b) {
1014 ; LA32-LABEL: urem_ui32_si32_si32:
1015 ; LA32:       # %bb.0: # %entry
1016 ; LA32-NEXT:    mod.wu $a0, $a0, $a1
1017 ; LA32-NEXT:    ret
1019 ; LA64-LABEL: urem_ui32_si32_si32:
1020 ; LA64:       # %bb.0: # %entry
1021 ; LA64-NEXT:    mod.wu $a0, $a0, $a1
1022 ; LA64-NEXT:    ret
1024 ; LA32-TRAP-LABEL: urem_ui32_si32_si32:
1025 ; LA32-TRAP:       # %bb.0: # %entry
1026 ; LA32-TRAP-NEXT:    mod.wu $a0, $a0, $a1
1027 ; LA32-TRAP-NEXT:    bnez $a1, .LBB28_2
1028 ; LA32-TRAP-NEXT:  # %bb.1: # %entry
1029 ; LA32-TRAP-NEXT:    break 7
1030 ; LA32-TRAP-NEXT:  .LBB28_2: # %entry
1031 ; LA32-TRAP-NEXT:    ret
1033 ; LA64-TRAP-LABEL: urem_ui32_si32_si32:
1034 ; LA64-TRAP:       # %bb.0: # %entry
1035 ; LA64-TRAP-NEXT:    mod.wu $a0, $a0, $a1
1036 ; LA64-TRAP-NEXT:    bnez $a1, .LBB28_2
1037 ; LA64-TRAP-NEXT:  # %bb.1: # %entry
1038 ; LA64-TRAP-NEXT:    break 7
1039 ; LA64-TRAP-NEXT:  .LBB28_2: # %entry
1040 ; LA64-TRAP-NEXT:    ret
1041 entry:
1042   %r = urem i32 %a, %b
1043   ret i32 %r
1046 define signext i32 @urem_si32_ui32_ui32(i32 %a, i32 %b) {
1047 ; LA32-LABEL: urem_si32_ui32_ui32:
1048 ; LA32:       # %bb.0: # %entry
1049 ; LA32-NEXT:    mod.wu $a0, $a0, $a1
1050 ; LA32-NEXT:    ret
1052 ; LA64-LABEL: urem_si32_ui32_ui32:
1053 ; LA64:       # %bb.0: # %entry
1054 ; LA64-NEXT:    addi.w $a1, $a1, 0
1055 ; LA64-NEXT:    addi.w $a0, $a0, 0
1056 ; LA64-NEXT:    mod.wu $a0, $a0, $a1
1057 ; LA64-NEXT:    ret
1059 ; LA32-TRAP-LABEL: urem_si32_ui32_ui32:
1060 ; LA32-TRAP:       # %bb.0: # %entry
1061 ; LA32-TRAP-NEXT:    mod.wu $a0, $a0, $a1
1062 ; LA32-TRAP-NEXT:    bnez $a1, .LBB29_2
1063 ; LA32-TRAP-NEXT:  # %bb.1: # %entry
1064 ; LA32-TRAP-NEXT:    break 7
1065 ; LA32-TRAP-NEXT:  .LBB29_2: # %entry
1066 ; LA32-TRAP-NEXT:    ret
1068 ; LA64-TRAP-LABEL: urem_si32_ui32_ui32:
1069 ; LA64-TRAP:       # %bb.0: # %entry
1070 ; LA64-TRAP-NEXT:    addi.w $a1, $a1, 0
1071 ; LA64-TRAP-NEXT:    addi.w $a0, $a0, 0
1072 ; LA64-TRAP-NEXT:    mod.wu $a0, $a0, $a1
1073 ; LA64-TRAP-NEXT:    bnez $a1, .LBB29_2
1074 ; LA64-TRAP-NEXT:  # %bb.1: # %entry
1075 ; LA64-TRAP-NEXT:    break 7
1076 ; LA64-TRAP-NEXT:  .LBB29_2: # %entry
1077 ; LA64-TRAP-NEXT:    ret
1078 entry:
1079   %r = urem i32 %a, %b
1080   ret i32 %r
1083 define signext i32 @urem_si32_si32_si32(i32 signext %a, i32 signext %b) {
1084 ; LA32-LABEL: urem_si32_si32_si32:
1085 ; LA32:       # %bb.0: # %entry
1086 ; LA32-NEXT:    mod.wu $a0, $a0, $a1
1087 ; LA32-NEXT:    ret
1089 ; LA64-LABEL: urem_si32_si32_si32:
1090 ; LA64:       # %bb.0: # %entry
1091 ; LA64-NEXT:    mod.wu $a0, $a0, $a1
1092 ; LA64-NEXT:    ret
1094 ; LA32-TRAP-LABEL: urem_si32_si32_si32:
1095 ; LA32-TRAP:       # %bb.0: # %entry
1096 ; LA32-TRAP-NEXT:    mod.wu $a0, $a0, $a1
1097 ; LA32-TRAP-NEXT:    bnez $a1, .LBB30_2
1098 ; LA32-TRAP-NEXT:  # %bb.1: # %entry
1099 ; LA32-TRAP-NEXT:    break 7
1100 ; LA32-TRAP-NEXT:  .LBB30_2: # %entry
1101 ; LA32-TRAP-NEXT:    ret
1103 ; LA64-TRAP-LABEL: urem_si32_si32_si32:
1104 ; LA64-TRAP:       # %bb.0: # %entry
1105 ; LA64-TRAP-NEXT:    mod.wu $a0, $a0, $a1
1106 ; LA64-TRAP-NEXT:    bnez $a1, .LBB30_2
1107 ; LA64-TRAP-NEXT:  # %bb.1: # %entry
1108 ; LA64-TRAP-NEXT:    break 7
1109 ; LA64-TRAP-NEXT:  .LBB30_2: # %entry
1110 ; LA64-TRAP-NEXT:    ret
1111 entry:
1112   %r = urem i32 %a, %b
1113   ret i32 %r
1116 define i64 @urem_i64(i64 %a, i64 %b) {
1117 ; LA32-LABEL: urem_i64:
1118 ; LA32:       # %bb.0: # %entry
1119 ; LA32-NEXT:    addi.w $sp, $sp, -16
1120 ; LA32-NEXT:    .cfi_def_cfa_offset 16
1121 ; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
1122 ; LA32-NEXT:    .cfi_offset 1, -4
1123 ; LA32-NEXT:    bl %plt(__umoddi3)
1124 ; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
1125 ; LA32-NEXT:    addi.w $sp, $sp, 16
1126 ; LA32-NEXT:    ret
1128 ; LA64-LABEL: urem_i64:
1129 ; LA64:       # %bb.0: # %entry
1130 ; LA64-NEXT:    mod.du $a0, $a0, $a1
1131 ; LA64-NEXT:    ret
1133 ; LA32-TRAP-LABEL: urem_i64:
1134 ; LA32-TRAP:       # %bb.0: # %entry
1135 ; LA32-TRAP-NEXT:    addi.w $sp, $sp, -16
1136 ; LA32-TRAP-NEXT:    .cfi_def_cfa_offset 16
1137 ; LA32-TRAP-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
1138 ; LA32-TRAP-NEXT:    .cfi_offset 1, -4
1139 ; LA32-TRAP-NEXT:    bl %plt(__umoddi3)
1140 ; LA32-TRAP-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
1141 ; LA32-TRAP-NEXT:    addi.w $sp, $sp, 16
1142 ; LA32-TRAP-NEXT:    ret
1144 ; LA64-TRAP-LABEL: urem_i64:
1145 ; LA64-TRAP:       # %bb.0: # %entry
1146 ; LA64-TRAP-NEXT:    mod.du $a0, $a0, $a1
1147 ; LA64-TRAP-NEXT:    bnez $a1, .LBB31_2
1148 ; LA64-TRAP-NEXT:  # %bb.1: # %entry
1149 ; LA64-TRAP-NEXT:    break 7
1150 ; LA64-TRAP-NEXT:  .LBB31_2: # %entry
1151 ; LA64-TRAP-NEXT:    ret
1152 entry:
1153   %r = urem i64 %a, %b
1154   ret i64 %r
1157 define signext i32 @pr107414(i32 signext %x) {
1158 ; LA32-LABEL: pr107414:
1159 ; LA32:       # %bb.0: # %entry
1160 ; LA32-NEXT:    addi.w $sp, $sp, -16
1161 ; LA32-NEXT:    .cfi_def_cfa_offset 16
1162 ; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
1163 ; LA32-NEXT:    .cfi_offset 1, -4
1164 ; LA32-NEXT:    move $a2, $a0
1165 ; LA32-NEXT:    srai.w $a3, $a0, 31
1166 ; LA32-NEXT:    lu12i.w $a0, -266831
1167 ; LA32-NEXT:    ori $a0, $a0, 3337
1168 ; LA32-NEXT:    move $a1, $zero
1169 ; LA32-NEXT:    bl %plt(__divdi3)
1170 ; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
1171 ; LA32-NEXT:    addi.w $sp, $sp, 16
1172 ; LA32-NEXT:    ret
1174 ; LA64-LABEL: pr107414:
1175 ; LA64:       # %bb.0: # %entry
1176 ; LA64-NEXT:    lu12i.w $a1, -266831
1177 ; LA64-NEXT:    ori $a1, $a1, 3337
1178 ; LA64-NEXT:    lu32i.d $a1, 0
1179 ; LA64-NEXT:    div.d $a0, $a1, $a0
1180 ; LA64-NEXT:    addi.w $a0, $a0, 0
1181 ; LA64-NEXT:    ret
1183 ; LA32-TRAP-LABEL: pr107414:
1184 ; LA32-TRAP:       # %bb.0: # %entry
1185 ; LA32-TRAP-NEXT:    addi.w $sp, $sp, -16
1186 ; LA32-TRAP-NEXT:    .cfi_def_cfa_offset 16
1187 ; LA32-TRAP-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
1188 ; LA32-TRAP-NEXT:    .cfi_offset 1, -4
1189 ; LA32-TRAP-NEXT:    move $a2, $a0
1190 ; LA32-TRAP-NEXT:    srai.w $a3, $a0, 31
1191 ; LA32-TRAP-NEXT:    lu12i.w $a0, -266831
1192 ; LA32-TRAP-NEXT:    ori $a0, $a0, 3337
1193 ; LA32-TRAP-NEXT:    move $a1, $zero
1194 ; LA32-TRAP-NEXT:    bl %plt(__divdi3)
1195 ; LA32-TRAP-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
1196 ; LA32-TRAP-NEXT:    addi.w $sp, $sp, 16
1197 ; LA32-TRAP-NEXT:    ret
1199 ; LA64-TRAP-LABEL: pr107414:
1200 ; LA64-TRAP:       # %bb.0: # %entry
1201 ; LA64-TRAP-NEXT:    lu12i.w $a1, -266831
1202 ; LA64-TRAP-NEXT:    ori $a1, $a1, 3337
1203 ; LA64-TRAP-NEXT:    lu32i.d $a1, 0
1204 ; LA64-TRAP-NEXT:    div.d $a1, $a1, $a0
1205 ; LA64-TRAP-NEXT:    bnez $a0, .LBB32_2
1206 ; LA64-TRAP-NEXT:  # %bb.1: # %entry
1207 ; LA64-TRAP-NEXT:    break 7
1208 ; LA64-TRAP-NEXT:  .LBB32_2: # %entry
1209 ; LA64-TRAP-NEXT:    addi.w $a0, $a1, 0
1210 ; LA64-TRAP-NEXT:    ret
1211 entry:
1212   %conv = sext i32 %x to i64
1213   %div = sdiv i64 3202030857, %conv
1214   %conv1 = trunc i64 %div to i32
1215   ret i32 %conv1