xref: /llvm-project/llvm/test/CodeGen/LoongArch/ir-instruction/sdiv-udiv-srem-urem.ll (revision 53c0a25db7a0469f6d47e130d5a0e8f7a88b9585)
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
8
9;; Test the sdiv/udiv/srem/urem LLVM IR.
10
11define i1 @sdiv_i1(i1 %a, i1 %b) {
12; LA32-LABEL: sdiv_i1:
13; LA32:       # %bb.0: # %entry
14; LA32-NEXT:    ret
15;
16; LA64-LABEL: sdiv_i1:
17; LA64:       # %bb.0: # %entry
18; LA64-NEXT:    ret
19;
20; LA32-TRAP-LABEL: sdiv_i1:
21; LA32-TRAP:       # %bb.0: # %entry
22; LA32-TRAP-NEXT:    ret
23;
24; LA64-TRAP-LABEL: sdiv_i1:
25; LA64-TRAP:       # %bb.0: # %entry
26; LA64-TRAP-NEXT:    ret
27entry:
28  %r = sdiv i1 %a, %b
29  ret i1 %r
30}
31
32define 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
39;
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
46;
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
57;
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
68entry:
69  %r = sdiv i8 %a, %b
70  ret i8 %r
71}
72
73define 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
80;
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
87;
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
98;
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
109entry:
110  %r = sdiv i16 %a, %b
111  ret i16 %r
112}
113
114define 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
119;
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.w $a0, $a0, $a1
125; LA64-NEXT:    ret
126;
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
135;
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.w $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
146entry:
147  %r = sdiv i32 %a, %b
148  ret i32 %r
149}
150
151define 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
156;
157; LA64-LABEL: sdiv_ui32_si32_si32:
158; LA64:       # %bb.0: # %entry
159; LA64-NEXT:    div.w $a0, $a0, $a1
160; LA64-NEXT:    ret
161;
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
170;
171; LA64-TRAP-LABEL: sdiv_ui32_si32_si32:
172; LA64-TRAP:       # %bb.0: # %entry
173; LA64-TRAP-NEXT:    div.w $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
179entry:
180  %r = sdiv i32 %a, %b
181  ret i32 %r
182}
183
184define 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
189;
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.w $a0, $a0, $a1
195; LA64-NEXT:    ret
196;
197; LA32-TRAP-LABEL: sdiv_si32_ui32_ui32:
198; LA32-TRAP:       # %bb.0: # %entry
199; LA32-TRAP-NEXT:    div.w $a0, $a0, $a1
200; LA32-TRAP-NEXT:    bnez $a1, .LBB5_2
201; LA32-TRAP-NEXT:  # %bb.1: # %entry
202; LA32-TRAP-NEXT:    break 7
203; LA32-TRAP-NEXT:  .LBB5_2: # %entry
204; LA32-TRAP-NEXT:    ret
205;
206; LA64-TRAP-LABEL: sdiv_si32_ui32_ui32:
207; LA64-TRAP:       # %bb.0: # %entry
208; LA64-TRAP-NEXT:    addi.w $a1, $a1, 0
209; LA64-TRAP-NEXT:    addi.w $a0, $a0, 0
210; LA64-TRAP-NEXT:    div.w $a0, $a0, $a1
211; LA64-TRAP-NEXT:    bnez $a1, .LBB5_2
212; LA64-TRAP-NEXT:  # %bb.1: # %entry
213; LA64-TRAP-NEXT:    break 7
214; LA64-TRAP-NEXT:  .LBB5_2: # %entry
215; LA64-TRAP-NEXT:    ret
216entry:
217  %r = sdiv i32 %a, %b
218  ret i32 %r
219}
220
221define signext i32 @sdiv_si32_si32_si32(i32 signext %a, i32 signext %b) {
222; LA32-LABEL: sdiv_si32_si32_si32:
223; LA32:       # %bb.0: # %entry
224; LA32-NEXT:    div.w $a0, $a0, $a1
225; LA32-NEXT:    ret
226;
227; LA64-LABEL: sdiv_si32_si32_si32:
228; LA64:       # %bb.0: # %entry
229; LA64-NEXT:    div.w $a0, $a0, $a1
230; LA64-NEXT:    ret
231;
232; LA32-TRAP-LABEL: sdiv_si32_si32_si32:
233; LA32-TRAP:       # %bb.0: # %entry
234; LA32-TRAP-NEXT:    div.w $a0, $a0, $a1
235; LA32-TRAP-NEXT:    bnez $a1, .LBB6_2
236; LA32-TRAP-NEXT:  # %bb.1: # %entry
237; LA32-TRAP-NEXT:    break 7
238; LA32-TRAP-NEXT:  .LBB6_2: # %entry
239; LA32-TRAP-NEXT:    ret
240;
241; LA64-TRAP-LABEL: sdiv_si32_si32_si32:
242; LA64-TRAP:       # %bb.0: # %entry
243; LA64-TRAP-NEXT:    div.w $a0, $a0, $a1
244; LA64-TRAP-NEXT:    bnez $a1, .LBB6_2
245; LA64-TRAP-NEXT:  # %bb.1: # %entry
246; LA64-TRAP-NEXT:    break 7
247; LA64-TRAP-NEXT:  .LBB6_2: # %entry
248; LA64-TRAP-NEXT:    ret
249entry:
250  %r = sdiv i32 %a, %b
251  ret i32 %r
252}
253
254define i64 @sdiv_i64(i64 %a, i64 %b) {
255; LA32-LABEL: sdiv_i64:
256; LA32:       # %bb.0: # %entry
257; LA32-NEXT:    addi.w $sp, $sp, -16
258; LA32-NEXT:    .cfi_def_cfa_offset 16
259; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
260; LA32-NEXT:    .cfi_offset 1, -4
261; LA32-NEXT:    bl %plt(__divdi3)
262; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
263; LA32-NEXT:    addi.w $sp, $sp, 16
264; LA32-NEXT:    ret
265;
266; LA64-LABEL: sdiv_i64:
267; LA64:       # %bb.0: # %entry
268; LA64-NEXT:    div.d $a0, $a0, $a1
269; LA64-NEXT:    ret
270;
271; LA32-TRAP-LABEL: sdiv_i64:
272; LA32-TRAP:       # %bb.0: # %entry
273; LA32-TRAP-NEXT:    addi.w $sp, $sp, -16
274; LA32-TRAP-NEXT:    .cfi_def_cfa_offset 16
275; LA32-TRAP-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
276; LA32-TRAP-NEXT:    .cfi_offset 1, -4
277; LA32-TRAP-NEXT:    bl %plt(__divdi3)
278; LA32-TRAP-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
279; LA32-TRAP-NEXT:    addi.w $sp, $sp, 16
280; LA32-TRAP-NEXT:    ret
281;
282; LA64-TRAP-LABEL: sdiv_i64:
283; LA64-TRAP:       # %bb.0: # %entry
284; LA64-TRAP-NEXT:    div.d $a0, $a0, $a1
285; LA64-TRAP-NEXT:    bnez $a1, .LBB7_2
286; LA64-TRAP-NEXT:  # %bb.1: # %entry
287; LA64-TRAP-NEXT:    break 7
288; LA64-TRAP-NEXT:  .LBB7_2: # %entry
289; LA64-TRAP-NEXT:    ret
290entry:
291  %r = sdiv i64 %a, %b
292  ret i64 %r
293}
294
295define i1 @udiv_i1(i1 %a, i1 %b) {
296; LA32-LABEL: udiv_i1:
297; LA32:       # %bb.0: # %entry
298; LA32-NEXT:    ret
299;
300; LA64-LABEL: udiv_i1:
301; LA64:       # %bb.0: # %entry
302; LA64-NEXT:    ret
303;
304; LA32-TRAP-LABEL: udiv_i1:
305; LA32-TRAP:       # %bb.0: # %entry
306; LA32-TRAP-NEXT:    ret
307;
308; LA64-TRAP-LABEL: udiv_i1:
309; LA64-TRAP:       # %bb.0: # %entry
310; LA64-TRAP-NEXT:    ret
311entry:
312  %r = udiv i1 %a, %b
313  ret i1 %r
314}
315
316define i8 @udiv_i8(i8 %a, i8 %b) {
317; LA32-LABEL: udiv_i8:
318; LA32:       # %bb.0: # %entry
319; LA32-NEXT:    andi $a1, $a1, 255
320; LA32-NEXT:    andi $a0, $a0, 255
321; LA32-NEXT:    div.wu $a0, $a0, $a1
322; LA32-NEXT:    ret
323;
324; LA64-LABEL: udiv_i8:
325; LA64:       # %bb.0: # %entry
326; LA64-NEXT:    andi $a1, $a1, 255
327; LA64-NEXT:    andi $a0, $a0, 255
328; LA64-NEXT:    div.du $a0, $a0, $a1
329; LA64-NEXT:    ret
330;
331; LA32-TRAP-LABEL: udiv_i8:
332; LA32-TRAP:       # %bb.0: # %entry
333; LA32-TRAP-NEXT:    andi $a1, $a1, 255
334; LA32-TRAP-NEXT:    andi $a0, $a0, 255
335; LA32-TRAP-NEXT:    div.wu $a0, $a0, $a1
336; LA32-TRAP-NEXT:    bnez $a1, .LBB9_2
337; LA32-TRAP-NEXT:  # %bb.1: # %entry
338; LA32-TRAP-NEXT:    break 7
339; LA32-TRAP-NEXT:  .LBB9_2: # %entry
340; LA32-TRAP-NEXT:    ret
341;
342; LA64-TRAP-LABEL: udiv_i8:
343; LA64-TRAP:       # %bb.0: # %entry
344; LA64-TRAP-NEXT:    andi $a1, $a1, 255
345; LA64-TRAP-NEXT:    andi $a0, $a0, 255
346; LA64-TRAP-NEXT:    div.du $a0, $a0, $a1
347; LA64-TRAP-NEXT:    bnez $a1, .LBB9_2
348; LA64-TRAP-NEXT:  # %bb.1: # %entry
349; LA64-TRAP-NEXT:    break 7
350; LA64-TRAP-NEXT:  .LBB9_2: # %entry
351; LA64-TRAP-NEXT:    ret
352entry:
353  %r = udiv i8 %a, %b
354  ret i8 %r
355}
356
357define i16 @udiv_i16(i16 %a, i16 %b) {
358; LA32-LABEL: udiv_i16:
359; LA32:       # %bb.0: # %entry
360; LA32-NEXT:    bstrpick.w $a1, $a1, 15, 0
361; LA32-NEXT:    bstrpick.w $a0, $a0, 15, 0
362; LA32-NEXT:    div.wu $a0, $a0, $a1
363; LA32-NEXT:    ret
364;
365; LA64-LABEL: udiv_i16:
366; LA64:       # %bb.0: # %entry
367; LA64-NEXT:    bstrpick.d $a1, $a1, 15, 0
368; LA64-NEXT:    bstrpick.d $a0, $a0, 15, 0
369; LA64-NEXT:    div.du $a0, $a0, $a1
370; LA64-NEXT:    ret
371;
372; LA32-TRAP-LABEL: udiv_i16:
373; LA32-TRAP:       # %bb.0: # %entry
374; LA32-TRAP-NEXT:    bstrpick.w $a1, $a1, 15, 0
375; LA32-TRAP-NEXT:    bstrpick.w $a0, $a0, 15, 0
376; LA32-TRAP-NEXT:    div.wu $a0, $a0, $a1
377; LA32-TRAP-NEXT:    bnez $a1, .LBB10_2
378; LA32-TRAP-NEXT:  # %bb.1: # %entry
379; LA32-TRAP-NEXT:    break 7
380; LA32-TRAP-NEXT:  .LBB10_2: # %entry
381; LA32-TRAP-NEXT:    ret
382;
383; LA64-TRAP-LABEL: udiv_i16:
384; LA64-TRAP:       # %bb.0: # %entry
385; LA64-TRAP-NEXT:    bstrpick.d $a1, $a1, 15, 0
386; LA64-TRAP-NEXT:    bstrpick.d $a0, $a0, 15, 0
387; LA64-TRAP-NEXT:    div.du $a0, $a0, $a1
388; LA64-TRAP-NEXT:    bnez $a1, .LBB10_2
389; LA64-TRAP-NEXT:  # %bb.1: # %entry
390; LA64-TRAP-NEXT:    break 7
391; LA64-TRAP-NEXT:  .LBB10_2: # %entry
392; LA64-TRAP-NEXT:    ret
393entry:
394  %r = udiv i16 %a, %b
395  ret i16 %r
396}
397
398define i32 @udiv_i32(i32 %a, i32 %b) {
399; LA32-LABEL: udiv_i32:
400; LA32:       # %bb.0: # %entry
401; LA32-NEXT:    div.wu $a0, $a0, $a1
402; LA32-NEXT:    ret
403;
404; LA64-LABEL: udiv_i32:
405; LA64:       # %bb.0: # %entry
406; LA64-NEXT:    addi.w $a1, $a1, 0
407; LA64-NEXT:    addi.w $a0, $a0, 0
408; LA64-NEXT:    div.wu $a0, $a0, $a1
409; LA64-NEXT:    ret
410;
411; LA32-TRAP-LABEL: udiv_i32:
412; LA32-TRAP:       # %bb.0: # %entry
413; LA32-TRAP-NEXT:    div.wu $a0, $a0, $a1
414; LA32-TRAP-NEXT:    bnez $a1, .LBB11_2
415; LA32-TRAP-NEXT:  # %bb.1: # %entry
416; LA32-TRAP-NEXT:    break 7
417; LA32-TRAP-NEXT:  .LBB11_2: # %entry
418; LA32-TRAP-NEXT:    ret
419;
420; LA64-TRAP-LABEL: udiv_i32:
421; LA64-TRAP:       # %bb.0: # %entry
422; LA64-TRAP-NEXT:    addi.w $a1, $a1, 0
423; LA64-TRAP-NEXT:    addi.w $a0, $a0, 0
424; LA64-TRAP-NEXT:    div.wu $a0, $a0, $a1
425; LA64-TRAP-NEXT:    bnez $a1, .LBB11_2
426; LA64-TRAP-NEXT:  # %bb.1: # %entry
427; LA64-TRAP-NEXT:    break 7
428; LA64-TRAP-NEXT:  .LBB11_2: # %entry
429; LA64-TRAP-NEXT:    ret
430entry:
431  %r = udiv i32 %a, %b
432  ret i32 %r
433}
434
435define i32 @udiv_ui32_si32_si32(i32 signext %a, i32 signext %b) {
436; LA32-LABEL: udiv_ui32_si32_si32:
437; LA32:       # %bb.0: # %entry
438; LA32-NEXT:    div.wu $a0, $a0, $a1
439; LA32-NEXT:    ret
440;
441; LA64-LABEL: udiv_ui32_si32_si32:
442; LA64:       # %bb.0: # %entry
443; LA64-NEXT:    div.wu $a0, $a0, $a1
444; LA64-NEXT:    ret
445;
446; LA32-TRAP-LABEL: udiv_ui32_si32_si32:
447; LA32-TRAP:       # %bb.0: # %entry
448; LA32-TRAP-NEXT:    div.wu $a0, $a0, $a1
449; LA32-TRAP-NEXT:    bnez $a1, .LBB12_2
450; LA32-TRAP-NEXT:  # %bb.1: # %entry
451; LA32-TRAP-NEXT:    break 7
452; LA32-TRAP-NEXT:  .LBB12_2: # %entry
453; LA32-TRAP-NEXT:    ret
454;
455; LA64-TRAP-LABEL: udiv_ui32_si32_si32:
456; LA64-TRAP:       # %bb.0: # %entry
457; LA64-TRAP-NEXT:    div.wu $a0, $a0, $a1
458; LA64-TRAP-NEXT:    bnez $a1, .LBB12_2
459; LA64-TRAP-NEXT:  # %bb.1: # %entry
460; LA64-TRAP-NEXT:    break 7
461; LA64-TRAP-NEXT:  .LBB12_2: # %entry
462; LA64-TRAP-NEXT:    ret
463entry:
464  %r = udiv i32 %a, %b
465  ret i32 %r
466}
467
468define signext i32 @udiv_si32_ui32_ui32(i32 %a, i32 %b) {
469; LA32-LABEL: udiv_si32_ui32_ui32:
470; LA32:       # %bb.0: # %entry
471; LA32-NEXT:    div.wu $a0, $a0, $a1
472; LA32-NEXT:    ret
473;
474; LA64-LABEL: udiv_si32_ui32_ui32:
475; LA64:       # %bb.0: # %entry
476; LA64-NEXT:    addi.w $a1, $a1, 0
477; LA64-NEXT:    addi.w $a0, $a0, 0
478; LA64-NEXT:    div.wu $a0, $a0, $a1
479; LA64-NEXT:    ret
480;
481; LA32-TRAP-LABEL: udiv_si32_ui32_ui32:
482; LA32-TRAP:       # %bb.0: # %entry
483; LA32-TRAP-NEXT:    div.wu $a0, $a0, $a1
484; LA32-TRAP-NEXT:    bnez $a1, .LBB13_2
485; LA32-TRAP-NEXT:  # %bb.1: # %entry
486; LA32-TRAP-NEXT:    break 7
487; LA32-TRAP-NEXT:  .LBB13_2: # %entry
488; LA32-TRAP-NEXT:    ret
489;
490; LA64-TRAP-LABEL: udiv_si32_ui32_ui32:
491; LA64-TRAP:       # %bb.0: # %entry
492; LA64-TRAP-NEXT:    addi.w $a1, $a1, 0
493; LA64-TRAP-NEXT:    addi.w $a0, $a0, 0
494; LA64-TRAP-NEXT:    div.wu $a0, $a0, $a1
495; LA64-TRAP-NEXT:    bnez $a1, .LBB13_2
496; LA64-TRAP-NEXT:  # %bb.1: # %entry
497; LA64-TRAP-NEXT:    break 7
498; LA64-TRAP-NEXT:  .LBB13_2: # %entry
499; LA64-TRAP-NEXT:    ret
500entry:
501  %r = udiv i32 %a, %b
502  ret i32 %r
503}
504
505define signext i32 @udiv_si32_si32_si32(i32 signext %a, i32 signext %b) {
506; LA32-LABEL: udiv_si32_si32_si32:
507; LA32:       # %bb.0: # %entry
508; LA32-NEXT:    div.wu $a0, $a0, $a1
509; LA32-NEXT:    ret
510;
511; LA64-LABEL: udiv_si32_si32_si32:
512; LA64:       # %bb.0: # %entry
513; LA64-NEXT:    div.wu $a0, $a0, $a1
514; LA64-NEXT:    ret
515;
516; LA32-TRAP-LABEL: udiv_si32_si32_si32:
517; LA32-TRAP:       # %bb.0: # %entry
518; LA32-TRAP-NEXT:    div.wu $a0, $a0, $a1
519; LA32-TRAP-NEXT:    bnez $a1, .LBB14_2
520; LA32-TRAP-NEXT:  # %bb.1: # %entry
521; LA32-TRAP-NEXT:    break 7
522; LA32-TRAP-NEXT:  .LBB14_2: # %entry
523; LA32-TRAP-NEXT:    ret
524;
525; LA64-TRAP-LABEL: udiv_si32_si32_si32:
526; LA64-TRAP:       # %bb.0: # %entry
527; LA64-TRAP-NEXT:    div.wu $a0, $a0, $a1
528; LA64-TRAP-NEXT:    bnez $a1, .LBB14_2
529; LA64-TRAP-NEXT:  # %bb.1: # %entry
530; LA64-TRAP-NEXT:    break 7
531; LA64-TRAP-NEXT:  .LBB14_2: # %entry
532; LA64-TRAP-NEXT:    ret
533entry:
534  %r = udiv i32 %a, %b
535  ret i32 %r
536}
537
538define i64 @udiv_i64(i64 %a, i64 %b) {
539; LA32-LABEL: udiv_i64:
540; LA32:       # %bb.0: # %entry
541; LA32-NEXT:    addi.w $sp, $sp, -16
542; LA32-NEXT:    .cfi_def_cfa_offset 16
543; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
544; LA32-NEXT:    .cfi_offset 1, -4
545; LA32-NEXT:    bl %plt(__udivdi3)
546; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
547; LA32-NEXT:    addi.w $sp, $sp, 16
548; LA32-NEXT:    ret
549;
550; LA64-LABEL: udiv_i64:
551; LA64:       # %bb.0: # %entry
552; LA64-NEXT:    div.du $a0, $a0, $a1
553; LA64-NEXT:    ret
554;
555; LA32-TRAP-LABEL: udiv_i64:
556; LA32-TRAP:       # %bb.0: # %entry
557; LA32-TRAP-NEXT:    addi.w $sp, $sp, -16
558; LA32-TRAP-NEXT:    .cfi_def_cfa_offset 16
559; LA32-TRAP-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
560; LA32-TRAP-NEXT:    .cfi_offset 1, -4
561; LA32-TRAP-NEXT:    bl %plt(__udivdi3)
562; LA32-TRAP-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
563; LA32-TRAP-NEXT:    addi.w $sp, $sp, 16
564; LA32-TRAP-NEXT:    ret
565;
566; LA64-TRAP-LABEL: udiv_i64:
567; LA64-TRAP:       # %bb.0: # %entry
568; LA64-TRAP-NEXT:    div.du $a0, $a0, $a1
569; LA64-TRAP-NEXT:    bnez $a1, .LBB15_2
570; LA64-TRAP-NEXT:  # %bb.1: # %entry
571; LA64-TRAP-NEXT:    break 7
572; LA64-TRAP-NEXT:  .LBB15_2: # %entry
573; LA64-TRAP-NEXT:    ret
574entry:
575  %r = udiv i64 %a, %b
576  ret i64 %r
577}
578
579define i1 @srem_i1(i1 %a, i1 %b) {
580; LA32-LABEL: srem_i1:
581; LA32:       # %bb.0: # %entry
582; LA32-NEXT:    move $a0, $zero
583; LA32-NEXT:    ret
584;
585; LA64-LABEL: srem_i1:
586; LA64:       # %bb.0: # %entry
587; LA64-NEXT:    move $a0, $zero
588; LA64-NEXT:    ret
589;
590; LA32-TRAP-LABEL: srem_i1:
591; LA32-TRAP:       # %bb.0: # %entry
592; LA32-TRAP-NEXT:    move $a0, $zero
593; LA32-TRAP-NEXT:    ret
594;
595; LA64-TRAP-LABEL: srem_i1:
596; LA64-TRAP:       # %bb.0: # %entry
597; LA64-TRAP-NEXT:    move $a0, $zero
598; LA64-TRAP-NEXT:    ret
599entry:
600  %r = srem i1 %a, %b
601  ret i1 %r
602}
603
604define i8 @srem_i8(i8 %a, i8 %b) {
605; LA32-LABEL: srem_i8:
606; LA32:       # %bb.0: # %entry
607; LA32-NEXT:    ext.w.b $a1, $a1
608; LA32-NEXT:    ext.w.b $a0, $a0
609; LA32-NEXT:    mod.w $a0, $a0, $a1
610; LA32-NEXT:    ret
611;
612; LA64-LABEL: srem_i8:
613; LA64:       # %bb.0: # %entry
614; LA64-NEXT:    ext.w.b $a1, $a1
615; LA64-NEXT:    ext.w.b $a0, $a0
616; LA64-NEXT:    mod.d $a0, $a0, $a1
617; LA64-NEXT:    ret
618;
619; LA32-TRAP-LABEL: srem_i8:
620; LA32-TRAP:       # %bb.0: # %entry
621; LA32-TRAP-NEXT:    ext.w.b $a1, $a1
622; LA32-TRAP-NEXT:    ext.w.b $a0, $a0
623; LA32-TRAP-NEXT:    mod.w $a0, $a0, $a1
624; LA32-TRAP-NEXT:    bnez $a1, .LBB17_2
625; LA32-TRAP-NEXT:  # %bb.1: # %entry
626; LA32-TRAP-NEXT:    break 7
627; LA32-TRAP-NEXT:  .LBB17_2: # %entry
628; LA32-TRAP-NEXT:    ret
629;
630; LA64-TRAP-LABEL: srem_i8:
631; LA64-TRAP:       # %bb.0: # %entry
632; LA64-TRAP-NEXT:    ext.w.b $a1, $a1
633; LA64-TRAP-NEXT:    ext.w.b $a0, $a0
634; LA64-TRAP-NEXT:    mod.d $a0, $a0, $a1
635; LA64-TRAP-NEXT:    bnez $a1, .LBB17_2
636; LA64-TRAP-NEXT:  # %bb.1: # %entry
637; LA64-TRAP-NEXT:    break 7
638; LA64-TRAP-NEXT:  .LBB17_2: # %entry
639; LA64-TRAP-NEXT:    ret
640entry:
641  %r = srem i8 %a, %b
642  ret i8 %r
643}
644
645define i16 @srem_i16(i16 %a, i16 %b) {
646; LA32-LABEL: srem_i16:
647; LA32:       # %bb.0: # %entry
648; LA32-NEXT:    ext.w.h $a1, $a1
649; LA32-NEXT:    ext.w.h $a0, $a0
650; LA32-NEXT:    mod.w $a0, $a0, $a1
651; LA32-NEXT:    ret
652;
653; LA64-LABEL: srem_i16:
654; LA64:       # %bb.0: # %entry
655; LA64-NEXT:    ext.w.h $a1, $a1
656; LA64-NEXT:    ext.w.h $a0, $a0
657; LA64-NEXT:    mod.d $a0, $a0, $a1
658; LA64-NEXT:    ret
659;
660; LA32-TRAP-LABEL: srem_i16:
661; LA32-TRAP:       # %bb.0: # %entry
662; LA32-TRAP-NEXT:    ext.w.h $a1, $a1
663; LA32-TRAP-NEXT:    ext.w.h $a0, $a0
664; LA32-TRAP-NEXT:    mod.w $a0, $a0, $a1
665; LA32-TRAP-NEXT:    bnez $a1, .LBB18_2
666; LA32-TRAP-NEXT:  # %bb.1: # %entry
667; LA32-TRAP-NEXT:    break 7
668; LA32-TRAP-NEXT:  .LBB18_2: # %entry
669; LA32-TRAP-NEXT:    ret
670;
671; LA64-TRAP-LABEL: srem_i16:
672; LA64-TRAP:       # %bb.0: # %entry
673; LA64-TRAP-NEXT:    ext.w.h $a1, $a1
674; LA64-TRAP-NEXT:    ext.w.h $a0, $a0
675; LA64-TRAP-NEXT:    mod.d $a0, $a0, $a1
676; LA64-TRAP-NEXT:    bnez $a1, .LBB18_2
677; LA64-TRAP-NEXT:  # %bb.1: # %entry
678; LA64-TRAP-NEXT:    break 7
679; LA64-TRAP-NEXT:  .LBB18_2: # %entry
680; LA64-TRAP-NEXT:    ret
681entry:
682  %r = srem i16 %a, %b
683  ret i16 %r
684}
685
686define i32 @srem_i32(i32 %a, i32 %b) {
687; LA32-LABEL: srem_i32:
688; LA32:       # %bb.0: # %entry
689; LA32-NEXT:    mod.w $a0, $a0, $a1
690; LA32-NEXT:    ret
691;
692; LA64-LABEL: srem_i32:
693; LA64:       # %bb.0: # %entry
694; LA64-NEXT:    addi.w $a1, $a1, 0
695; LA64-NEXT:    addi.w $a0, $a0, 0
696; LA64-NEXT:    mod.w $a0, $a0, $a1
697; LA64-NEXT:    ret
698;
699; LA32-TRAP-LABEL: srem_i32:
700; LA32-TRAP:       # %bb.0: # %entry
701; LA32-TRAP-NEXT:    mod.w $a0, $a0, $a1
702; LA32-TRAP-NEXT:    bnez $a1, .LBB19_2
703; LA32-TRAP-NEXT:  # %bb.1: # %entry
704; LA32-TRAP-NEXT:    break 7
705; LA32-TRAP-NEXT:  .LBB19_2: # %entry
706; LA32-TRAP-NEXT:    ret
707;
708; LA64-TRAP-LABEL: srem_i32:
709; LA64-TRAP:       # %bb.0: # %entry
710; LA64-TRAP-NEXT:    addi.w $a1, $a1, 0
711; LA64-TRAP-NEXT:    addi.w $a0, $a0, 0
712; LA64-TRAP-NEXT:    mod.w $a0, $a0, $a1
713; LA64-TRAP-NEXT:    bnez $a1, .LBB19_2
714; LA64-TRAP-NEXT:  # %bb.1: # %entry
715; LA64-TRAP-NEXT:    break 7
716; LA64-TRAP-NEXT:  .LBB19_2: # %entry
717; LA64-TRAP-NEXT:    ret
718entry:
719  %r = srem i32 %a, %b
720  ret i32 %r
721}
722
723define i32 @srem_ui32_si32_si32(i32 signext %a, i32 signext %b) {
724; LA32-LABEL: srem_ui32_si32_si32:
725; LA32:       # %bb.0: # %entry
726; LA32-NEXT:    mod.w $a0, $a0, $a1
727; LA32-NEXT:    ret
728;
729; LA64-LABEL: srem_ui32_si32_si32:
730; LA64:       # %bb.0: # %entry
731; LA64-NEXT:    mod.w $a0, $a0, $a1
732; LA64-NEXT:    ret
733;
734; LA32-TRAP-LABEL: srem_ui32_si32_si32:
735; LA32-TRAP:       # %bb.0: # %entry
736; LA32-TRAP-NEXT:    mod.w $a0, $a0, $a1
737; LA32-TRAP-NEXT:    bnez $a1, .LBB20_2
738; LA32-TRAP-NEXT:  # %bb.1: # %entry
739; LA32-TRAP-NEXT:    break 7
740; LA32-TRAP-NEXT:  .LBB20_2: # %entry
741; LA32-TRAP-NEXT:    ret
742;
743; LA64-TRAP-LABEL: srem_ui32_si32_si32:
744; LA64-TRAP:       # %bb.0: # %entry
745; LA64-TRAP-NEXT:    mod.w $a0, $a0, $a1
746; LA64-TRAP-NEXT:    bnez $a1, .LBB20_2
747; LA64-TRAP-NEXT:  # %bb.1: # %entry
748; LA64-TRAP-NEXT:    break 7
749; LA64-TRAP-NEXT:  .LBB20_2: # %entry
750; LA64-TRAP-NEXT:    ret
751entry:
752  %r = srem i32 %a, %b
753  ret i32 %r
754}
755
756define signext i32 @srem_si32_ui32_ui32(i32 %a, i32 %b) {
757; LA32-LABEL: srem_si32_ui32_ui32:
758; LA32:       # %bb.0: # %entry
759; LA32-NEXT:    mod.w $a0, $a0, $a1
760; LA32-NEXT:    ret
761;
762; LA64-LABEL: srem_si32_ui32_ui32:
763; LA64:       # %bb.0: # %entry
764; LA64-NEXT:    addi.w $a1, $a1, 0
765; LA64-NEXT:    addi.w $a0, $a0, 0
766; LA64-NEXT:    mod.w $a0, $a0, $a1
767; LA64-NEXT:    ret
768;
769; LA32-TRAP-LABEL: srem_si32_ui32_ui32:
770; LA32-TRAP:       # %bb.0: # %entry
771; LA32-TRAP-NEXT:    mod.w $a0, $a0, $a1
772; LA32-TRAP-NEXT:    bnez $a1, .LBB21_2
773; LA32-TRAP-NEXT:  # %bb.1: # %entry
774; LA32-TRAP-NEXT:    break 7
775; LA32-TRAP-NEXT:  .LBB21_2: # %entry
776; LA32-TRAP-NEXT:    ret
777;
778; LA64-TRAP-LABEL: srem_si32_ui32_ui32:
779; LA64-TRAP:       # %bb.0: # %entry
780; LA64-TRAP-NEXT:    addi.w $a1, $a1, 0
781; LA64-TRAP-NEXT:    addi.w $a0, $a0, 0
782; LA64-TRAP-NEXT:    mod.w $a0, $a0, $a1
783; LA64-TRAP-NEXT:    bnez $a1, .LBB21_2
784; LA64-TRAP-NEXT:  # %bb.1: # %entry
785; LA64-TRAP-NEXT:    break 7
786; LA64-TRAP-NEXT:  .LBB21_2: # %entry
787; LA64-TRAP-NEXT:    ret
788entry:
789  %r = srem i32 %a, %b
790  ret i32 %r
791}
792
793define signext i32 @srem_si32_si32_si32(i32 signext %a, i32 signext %b) {
794; LA32-LABEL: srem_si32_si32_si32:
795; LA32:       # %bb.0: # %entry
796; LA32-NEXT:    mod.w $a0, $a0, $a1
797; LA32-NEXT:    ret
798;
799; LA64-LABEL: srem_si32_si32_si32:
800; LA64:       # %bb.0: # %entry
801; LA64-NEXT:    mod.w $a0, $a0, $a1
802; LA64-NEXT:    ret
803;
804; LA32-TRAP-LABEL: srem_si32_si32_si32:
805; LA32-TRAP:       # %bb.0: # %entry
806; LA32-TRAP-NEXT:    mod.w $a0, $a0, $a1
807; LA32-TRAP-NEXT:    bnez $a1, .LBB22_2
808; LA32-TRAP-NEXT:  # %bb.1: # %entry
809; LA32-TRAP-NEXT:    break 7
810; LA32-TRAP-NEXT:  .LBB22_2: # %entry
811; LA32-TRAP-NEXT:    ret
812;
813; LA64-TRAP-LABEL: srem_si32_si32_si32:
814; LA64-TRAP:       # %bb.0: # %entry
815; LA64-TRAP-NEXT:    mod.w $a0, $a0, $a1
816; LA64-TRAP-NEXT:    bnez $a1, .LBB22_2
817; LA64-TRAP-NEXT:  # %bb.1: # %entry
818; LA64-TRAP-NEXT:    break 7
819; LA64-TRAP-NEXT:  .LBB22_2: # %entry
820; LA64-TRAP-NEXT:    ret
821entry:
822  %r = srem i32 %a, %b
823  ret i32 %r
824}
825
826define i64 @srem_i64(i64 %a, i64 %b) {
827; LA32-LABEL: srem_i64:
828; LA32:       # %bb.0: # %entry
829; LA32-NEXT:    addi.w $sp, $sp, -16
830; LA32-NEXT:    .cfi_def_cfa_offset 16
831; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
832; LA32-NEXT:    .cfi_offset 1, -4
833; LA32-NEXT:    bl %plt(__moddi3)
834; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
835; LA32-NEXT:    addi.w $sp, $sp, 16
836; LA32-NEXT:    ret
837;
838; LA64-LABEL: srem_i64:
839; LA64:       # %bb.0: # %entry
840; LA64-NEXT:    mod.d $a0, $a0, $a1
841; LA64-NEXT:    ret
842;
843; LA32-TRAP-LABEL: srem_i64:
844; LA32-TRAP:       # %bb.0: # %entry
845; LA32-TRAP-NEXT:    addi.w $sp, $sp, -16
846; LA32-TRAP-NEXT:    .cfi_def_cfa_offset 16
847; LA32-TRAP-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
848; LA32-TRAP-NEXT:    .cfi_offset 1, -4
849; LA32-TRAP-NEXT:    bl %plt(__moddi3)
850; LA32-TRAP-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
851; LA32-TRAP-NEXT:    addi.w $sp, $sp, 16
852; LA32-TRAP-NEXT:    ret
853;
854; LA64-TRAP-LABEL: srem_i64:
855; LA64-TRAP:       # %bb.0: # %entry
856; LA64-TRAP-NEXT:    mod.d $a0, $a0, $a1
857; LA64-TRAP-NEXT:    bnez $a1, .LBB23_2
858; LA64-TRAP-NEXT:  # %bb.1: # %entry
859; LA64-TRAP-NEXT:    break 7
860; LA64-TRAP-NEXT:  .LBB23_2: # %entry
861; LA64-TRAP-NEXT:    ret
862entry:
863  %r = srem i64 %a, %b
864  ret i64 %r
865}
866
867define i1 @urem_i1(i1 %a, i1 %b) {
868; LA32-LABEL: urem_i1:
869; LA32:       # %bb.0: # %entry
870; LA32-NEXT:    move $a0, $zero
871; LA32-NEXT:    ret
872;
873; LA64-LABEL: urem_i1:
874; LA64:       # %bb.0: # %entry
875; LA64-NEXT:    move $a0, $zero
876; LA64-NEXT:    ret
877;
878; LA32-TRAP-LABEL: urem_i1:
879; LA32-TRAP:       # %bb.0: # %entry
880; LA32-TRAP-NEXT:    move $a0, $zero
881; LA32-TRAP-NEXT:    ret
882;
883; LA64-TRAP-LABEL: urem_i1:
884; LA64-TRAP:       # %bb.0: # %entry
885; LA64-TRAP-NEXT:    move $a0, $zero
886; LA64-TRAP-NEXT:    ret
887entry:
888  %r = urem i1 %a, %b
889  ret i1 %r
890}
891
892define i8 @urem_i8(i8 %a, i8 %b) {
893; LA32-LABEL: urem_i8:
894; LA32:       # %bb.0: # %entry
895; LA32-NEXT:    andi $a1, $a1, 255
896; LA32-NEXT:    andi $a0, $a0, 255
897; LA32-NEXT:    mod.wu $a0, $a0, $a1
898; LA32-NEXT:    ret
899;
900; LA64-LABEL: urem_i8:
901; LA64:       # %bb.0: # %entry
902; LA64-NEXT:    andi $a1, $a1, 255
903; LA64-NEXT:    andi $a0, $a0, 255
904; LA64-NEXT:    mod.du $a0, $a0, $a1
905; LA64-NEXT:    ret
906;
907; LA32-TRAP-LABEL: urem_i8:
908; LA32-TRAP:       # %bb.0: # %entry
909; LA32-TRAP-NEXT:    andi $a1, $a1, 255
910; LA32-TRAP-NEXT:    andi $a0, $a0, 255
911; LA32-TRAP-NEXT:    mod.wu $a0, $a0, $a1
912; LA32-TRAP-NEXT:    bnez $a1, .LBB25_2
913; LA32-TRAP-NEXT:  # %bb.1: # %entry
914; LA32-TRAP-NEXT:    break 7
915; LA32-TRAP-NEXT:  .LBB25_2: # %entry
916; LA32-TRAP-NEXT:    ret
917;
918; LA64-TRAP-LABEL: urem_i8:
919; LA64-TRAP:       # %bb.0: # %entry
920; LA64-TRAP-NEXT:    andi $a1, $a1, 255
921; LA64-TRAP-NEXT:    andi $a0, $a0, 255
922; LA64-TRAP-NEXT:    mod.du $a0, $a0, $a1
923; LA64-TRAP-NEXT:    bnez $a1, .LBB25_2
924; LA64-TRAP-NEXT:  # %bb.1: # %entry
925; LA64-TRAP-NEXT:    break 7
926; LA64-TRAP-NEXT:  .LBB25_2: # %entry
927; LA64-TRAP-NEXT:    ret
928entry:
929  %r = urem i8 %a, %b
930  ret i8 %r
931}
932
933define i16 @urem_i16(i16 %a, i16 %b) {
934; LA32-LABEL: urem_i16:
935; LA32:       # %bb.0: # %entry
936; LA32-NEXT:    bstrpick.w $a1, $a1, 15, 0
937; LA32-NEXT:    bstrpick.w $a0, $a0, 15, 0
938; LA32-NEXT:    mod.wu $a0, $a0, $a1
939; LA32-NEXT:    ret
940;
941; LA64-LABEL: urem_i16:
942; LA64:       # %bb.0: # %entry
943; LA64-NEXT:    bstrpick.d $a1, $a1, 15, 0
944; LA64-NEXT:    bstrpick.d $a0, $a0, 15, 0
945; LA64-NEXT:    mod.du $a0, $a0, $a1
946; LA64-NEXT:    ret
947;
948; LA32-TRAP-LABEL: urem_i16:
949; LA32-TRAP:       # %bb.0: # %entry
950; LA32-TRAP-NEXT:    bstrpick.w $a1, $a1, 15, 0
951; LA32-TRAP-NEXT:    bstrpick.w $a0, $a0, 15, 0
952; LA32-TRAP-NEXT:    mod.wu $a0, $a0, $a1
953; LA32-TRAP-NEXT:    bnez $a1, .LBB26_2
954; LA32-TRAP-NEXT:  # %bb.1: # %entry
955; LA32-TRAP-NEXT:    break 7
956; LA32-TRAP-NEXT:  .LBB26_2: # %entry
957; LA32-TRAP-NEXT:    ret
958;
959; LA64-TRAP-LABEL: urem_i16:
960; LA64-TRAP:       # %bb.0: # %entry
961; LA64-TRAP-NEXT:    bstrpick.d $a1, $a1, 15, 0
962; LA64-TRAP-NEXT:    bstrpick.d $a0, $a0, 15, 0
963; LA64-TRAP-NEXT:    mod.du $a0, $a0, $a1
964; LA64-TRAP-NEXT:    bnez $a1, .LBB26_2
965; LA64-TRAP-NEXT:  # %bb.1: # %entry
966; LA64-TRAP-NEXT:    break 7
967; LA64-TRAP-NEXT:  .LBB26_2: # %entry
968; LA64-TRAP-NEXT:    ret
969entry:
970  %r = urem i16 %a, %b
971  ret i16 %r
972}
973
974define i32 @urem_i32(i32 %a, i32 %b) {
975; LA32-LABEL: urem_i32:
976; LA32:       # %bb.0: # %entry
977; LA32-NEXT:    mod.wu $a0, $a0, $a1
978; LA32-NEXT:    ret
979;
980; LA64-LABEL: urem_i32:
981; LA64:       # %bb.0: # %entry
982; LA64-NEXT:    addi.w $a1, $a1, 0
983; LA64-NEXT:    addi.w $a0, $a0, 0
984; LA64-NEXT:    mod.wu $a0, $a0, $a1
985; LA64-NEXT:    ret
986;
987; LA32-TRAP-LABEL: urem_i32:
988; LA32-TRAP:       # %bb.0: # %entry
989; LA32-TRAP-NEXT:    mod.wu $a0, $a0, $a1
990; LA32-TRAP-NEXT:    bnez $a1, .LBB27_2
991; LA32-TRAP-NEXT:  # %bb.1: # %entry
992; LA32-TRAP-NEXT:    break 7
993; LA32-TRAP-NEXT:  .LBB27_2: # %entry
994; LA32-TRAP-NEXT:    ret
995;
996; LA64-TRAP-LABEL: urem_i32:
997; LA64-TRAP:       # %bb.0: # %entry
998; LA64-TRAP-NEXT:    addi.w $a1, $a1, 0
999; LA64-TRAP-NEXT:    addi.w $a0, $a0, 0
1000; LA64-TRAP-NEXT:    mod.wu $a0, $a0, $a1
1001; LA64-TRAP-NEXT:    bnez $a1, .LBB27_2
1002; LA64-TRAP-NEXT:  # %bb.1: # %entry
1003; LA64-TRAP-NEXT:    break 7
1004; LA64-TRAP-NEXT:  .LBB27_2: # %entry
1005; LA64-TRAP-NEXT:    ret
1006entry:
1007  %r = urem i32 %a, %b
1008  ret i32 %r
1009}
1010
1011define i32 @urem_ui32_si32_si32(i32 signext %a, i32 signext %b) {
1012; LA32-LABEL: urem_ui32_si32_si32:
1013; LA32:       # %bb.0: # %entry
1014; LA32-NEXT:    mod.wu $a0, $a0, $a1
1015; LA32-NEXT:    ret
1016;
1017; LA64-LABEL: urem_ui32_si32_si32:
1018; LA64:       # %bb.0: # %entry
1019; LA64-NEXT:    mod.wu $a0, $a0, $a1
1020; LA64-NEXT:    ret
1021;
1022; LA32-TRAP-LABEL: urem_ui32_si32_si32:
1023; LA32-TRAP:       # %bb.0: # %entry
1024; LA32-TRAP-NEXT:    mod.wu $a0, $a0, $a1
1025; LA32-TRAP-NEXT:    bnez $a1, .LBB28_2
1026; LA32-TRAP-NEXT:  # %bb.1: # %entry
1027; LA32-TRAP-NEXT:    break 7
1028; LA32-TRAP-NEXT:  .LBB28_2: # %entry
1029; LA32-TRAP-NEXT:    ret
1030;
1031; LA64-TRAP-LABEL: urem_ui32_si32_si32:
1032; LA64-TRAP:       # %bb.0: # %entry
1033; LA64-TRAP-NEXT:    mod.wu $a0, $a0, $a1
1034; LA64-TRAP-NEXT:    bnez $a1, .LBB28_2
1035; LA64-TRAP-NEXT:  # %bb.1: # %entry
1036; LA64-TRAP-NEXT:    break 7
1037; LA64-TRAP-NEXT:  .LBB28_2: # %entry
1038; LA64-TRAP-NEXT:    ret
1039entry:
1040  %r = urem i32 %a, %b
1041  ret i32 %r
1042}
1043
1044define signext i32 @urem_si32_ui32_ui32(i32 %a, i32 %b) {
1045; LA32-LABEL: urem_si32_ui32_ui32:
1046; LA32:       # %bb.0: # %entry
1047; LA32-NEXT:    mod.wu $a0, $a0, $a1
1048; LA32-NEXT:    ret
1049;
1050; LA64-LABEL: urem_si32_ui32_ui32:
1051; LA64:       # %bb.0: # %entry
1052; LA64-NEXT:    addi.w $a1, $a1, 0
1053; LA64-NEXT:    addi.w $a0, $a0, 0
1054; LA64-NEXT:    mod.wu $a0, $a0, $a1
1055; LA64-NEXT:    ret
1056;
1057; LA32-TRAP-LABEL: urem_si32_ui32_ui32:
1058; LA32-TRAP:       # %bb.0: # %entry
1059; LA32-TRAP-NEXT:    mod.wu $a0, $a0, $a1
1060; LA32-TRAP-NEXT:    bnez $a1, .LBB29_2
1061; LA32-TRAP-NEXT:  # %bb.1: # %entry
1062; LA32-TRAP-NEXT:    break 7
1063; LA32-TRAP-NEXT:  .LBB29_2: # %entry
1064; LA32-TRAP-NEXT:    ret
1065;
1066; LA64-TRAP-LABEL: urem_si32_ui32_ui32:
1067; LA64-TRAP:       # %bb.0: # %entry
1068; LA64-TRAP-NEXT:    addi.w $a1, $a1, 0
1069; LA64-TRAP-NEXT:    addi.w $a0, $a0, 0
1070; LA64-TRAP-NEXT:    mod.wu $a0, $a0, $a1
1071; LA64-TRAP-NEXT:    bnez $a1, .LBB29_2
1072; LA64-TRAP-NEXT:  # %bb.1: # %entry
1073; LA64-TRAP-NEXT:    break 7
1074; LA64-TRAP-NEXT:  .LBB29_2: # %entry
1075; LA64-TRAP-NEXT:    ret
1076entry:
1077  %r = urem i32 %a, %b
1078  ret i32 %r
1079}
1080
1081define signext i32 @urem_si32_si32_si32(i32 signext %a, i32 signext %b) {
1082; LA32-LABEL: urem_si32_si32_si32:
1083; LA32:       # %bb.0: # %entry
1084; LA32-NEXT:    mod.wu $a0, $a0, $a1
1085; LA32-NEXT:    ret
1086;
1087; LA64-LABEL: urem_si32_si32_si32:
1088; LA64:       # %bb.0: # %entry
1089; LA64-NEXT:    mod.wu $a0, $a0, $a1
1090; LA64-NEXT:    ret
1091;
1092; LA32-TRAP-LABEL: urem_si32_si32_si32:
1093; LA32-TRAP:       # %bb.0: # %entry
1094; LA32-TRAP-NEXT:    mod.wu $a0, $a0, $a1
1095; LA32-TRAP-NEXT:    bnez $a1, .LBB30_2
1096; LA32-TRAP-NEXT:  # %bb.1: # %entry
1097; LA32-TRAP-NEXT:    break 7
1098; LA32-TRAP-NEXT:  .LBB30_2: # %entry
1099; LA32-TRAP-NEXT:    ret
1100;
1101; LA64-TRAP-LABEL: urem_si32_si32_si32:
1102; LA64-TRAP:       # %bb.0: # %entry
1103; LA64-TRAP-NEXT:    mod.wu $a0, $a0, $a1
1104; LA64-TRAP-NEXT:    bnez $a1, .LBB30_2
1105; LA64-TRAP-NEXT:  # %bb.1: # %entry
1106; LA64-TRAP-NEXT:    break 7
1107; LA64-TRAP-NEXT:  .LBB30_2: # %entry
1108; LA64-TRAP-NEXT:    ret
1109entry:
1110  %r = urem i32 %a, %b
1111  ret i32 %r
1112}
1113
1114define i64 @urem_i64(i64 %a, i64 %b) {
1115; LA32-LABEL: urem_i64:
1116; LA32:       # %bb.0: # %entry
1117; LA32-NEXT:    addi.w $sp, $sp, -16
1118; LA32-NEXT:    .cfi_def_cfa_offset 16
1119; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
1120; LA32-NEXT:    .cfi_offset 1, -4
1121; LA32-NEXT:    bl %plt(__umoddi3)
1122; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
1123; LA32-NEXT:    addi.w $sp, $sp, 16
1124; LA32-NEXT:    ret
1125;
1126; LA64-LABEL: urem_i64:
1127; LA64:       # %bb.0: # %entry
1128; LA64-NEXT:    mod.du $a0, $a0, $a1
1129; LA64-NEXT:    ret
1130;
1131; LA32-TRAP-LABEL: urem_i64:
1132; LA32-TRAP:       # %bb.0: # %entry
1133; LA32-TRAP-NEXT:    addi.w $sp, $sp, -16
1134; LA32-TRAP-NEXT:    .cfi_def_cfa_offset 16
1135; LA32-TRAP-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
1136; LA32-TRAP-NEXT:    .cfi_offset 1, -4
1137; LA32-TRAP-NEXT:    bl %plt(__umoddi3)
1138; LA32-TRAP-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
1139; LA32-TRAP-NEXT:    addi.w $sp, $sp, 16
1140; LA32-TRAP-NEXT:    ret
1141;
1142; LA64-TRAP-LABEL: urem_i64:
1143; LA64-TRAP:       # %bb.0: # %entry
1144; LA64-TRAP-NEXT:    mod.du $a0, $a0, $a1
1145; LA64-TRAP-NEXT:    bnez $a1, .LBB31_2
1146; LA64-TRAP-NEXT:  # %bb.1: # %entry
1147; LA64-TRAP-NEXT:    break 7
1148; LA64-TRAP-NEXT:  .LBB31_2: # %entry
1149; LA64-TRAP-NEXT:    ret
1150entry:
1151  %r = urem i64 %a, %b
1152  ret i64 %r
1153}
1154
1155define signext i32 @pr107414(i32 signext %x) {
1156; LA32-LABEL: pr107414:
1157; LA32:       # %bb.0: # %entry
1158; LA32-NEXT:    addi.w $sp, $sp, -16
1159; LA32-NEXT:    .cfi_def_cfa_offset 16
1160; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
1161; LA32-NEXT:    .cfi_offset 1, -4
1162; LA32-NEXT:    move $a2, $a0
1163; LA32-NEXT:    srai.w $a3, $a0, 31
1164; LA32-NEXT:    lu12i.w $a0, -266831
1165; LA32-NEXT:    ori $a0, $a0, 3337
1166; LA32-NEXT:    move $a1, $zero
1167; LA32-NEXT:    bl %plt(__divdi3)
1168; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
1169; LA32-NEXT:    addi.w $sp, $sp, 16
1170; LA32-NEXT:    ret
1171;
1172; LA64-LABEL: pr107414:
1173; LA64:       # %bb.0: # %entry
1174; LA64-NEXT:    lu12i.w $a1, -266831
1175; LA64-NEXT:    ori $a1, $a1, 3337
1176; LA64-NEXT:    lu32i.d $a1, 0
1177; LA64-NEXT:    div.d $a0, $a1, $a0
1178; LA64-NEXT:    addi.w $a0, $a0, 0
1179; LA64-NEXT:    ret
1180;
1181; LA32-TRAP-LABEL: pr107414:
1182; LA32-TRAP:       # %bb.0: # %entry
1183; LA32-TRAP-NEXT:    addi.w $sp, $sp, -16
1184; LA32-TRAP-NEXT:    .cfi_def_cfa_offset 16
1185; LA32-TRAP-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
1186; LA32-TRAP-NEXT:    .cfi_offset 1, -4
1187; LA32-TRAP-NEXT:    move $a2, $a0
1188; LA32-TRAP-NEXT:    srai.w $a3, $a0, 31
1189; LA32-TRAP-NEXT:    lu12i.w $a0, -266831
1190; LA32-TRAP-NEXT:    ori $a0, $a0, 3337
1191; LA32-TRAP-NEXT:    move $a1, $zero
1192; LA32-TRAP-NEXT:    bl %plt(__divdi3)
1193; LA32-TRAP-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
1194; LA32-TRAP-NEXT:    addi.w $sp, $sp, 16
1195; LA32-TRAP-NEXT:    ret
1196;
1197; LA64-TRAP-LABEL: pr107414:
1198; LA64-TRAP:       # %bb.0: # %entry
1199; LA64-TRAP-NEXT:    lu12i.w $a1, -266831
1200; LA64-TRAP-NEXT:    ori $a1, $a1, 3337
1201; LA64-TRAP-NEXT:    lu32i.d $a1, 0
1202; LA64-TRAP-NEXT:    div.d $a1, $a1, $a0
1203; LA64-TRAP-NEXT:    bnez $a0, .LBB32_2
1204; LA64-TRAP-NEXT:  # %bb.1: # %entry
1205; LA64-TRAP-NEXT:    break 7
1206; LA64-TRAP-NEXT:  .LBB32_2: # %entry
1207; LA64-TRAP-NEXT:    addi.w $a0, $a1, 0
1208; LA64-TRAP-NEXT:    ret
1209entry:
1210  %conv = sext i32 %x to i64
1211  %div = sdiv i64 3202030857, %conv
1212  %conv1 = trunc i64 %div to i32
1213  ret i32 %conv1
1214}
1215