xref: /llvm-project/llvm/test/CodeGen/Mips/GlobalISel/llvm-ir/rem_and_div.ll (revision 3fee8b346928a24975ebbd6984b583c01ec82955)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc  -O0 -mtriple=mipsel-linux-gnu -global-isel  -verify-machineinstrs %s -o -| FileCheck %s -check-prefixes=MIPS32
3
4; sdiv
5define signext i8 @sdiv_i8(i8 signext %a, i8 signext %b) {
6; MIPS32-LABEL: sdiv_i8:
7; MIPS32:       # %bb.0: # %entry
8; MIPS32-NEXT:    div $zero, $5, $4
9; MIPS32-NEXT:    teq $4, $zero, 7
10; MIPS32-NEXT:    mflo $1
11; MIPS32-NEXT:    sll $1, $1, 24
12; MIPS32-NEXT:    sra $2, $1, 24
13; MIPS32-NEXT:    jr $ra
14; MIPS32-NEXT:    nop
15entry:
16  %div = sdiv i8 %b, %a
17  ret i8 %div
18}
19
20define signext i16 @sdiv_i16(i16 signext %a, i16 signext %b) {
21; MIPS32-LABEL: sdiv_i16:
22; MIPS32:       # %bb.0: # %entry
23; MIPS32-NEXT:    div $zero, $5, $4
24; MIPS32-NEXT:    teq $4, $zero, 7
25; MIPS32-NEXT:    mflo $1
26; MIPS32-NEXT:    sll $1, $1, 16
27; MIPS32-NEXT:    sra $2, $1, 16
28; MIPS32-NEXT:    jr $ra
29; MIPS32-NEXT:    nop
30entry:
31  %div = sdiv i16 %b, %a
32  ret i16 %div
33}
34
35define signext i32 @sdiv_i32(i32 signext %a, i32 signext %b) {
36; MIPS32-LABEL: sdiv_i32:
37; MIPS32:       # %bb.0: # %entry
38; MIPS32-NEXT:    div $zero, $5, $4
39; MIPS32-NEXT:    teq $4, $zero, 7
40; MIPS32-NEXT:    mflo $2
41; MIPS32-NEXT:    jr $ra
42; MIPS32-NEXT:    nop
43entry:
44  %div = sdiv i32 %b, %a
45  ret i32 %div
46}
47
48define signext i64 @sdiv_i64(i64 signext %a, i64 signext %b) {
49; MIPS32-LABEL: sdiv_i64:
50; MIPS32:       # %bb.0: # %entry
51; MIPS32-NEXT:    addiu $sp, $sp, -32
52; MIPS32-NEXT:    .cfi_def_cfa_offset 32
53; MIPS32-NEXT:    sw $ra, 28($sp) # 4-byte Folded Spill
54; MIPS32-NEXT:    .cfi_offset 31, -4
55; MIPS32-NEXT:    sw $4, 20($sp) # 4-byte Folded Spill
56; MIPS32-NEXT:    sw $5, 24($sp) # 4-byte Folded Spill
57; MIPS32-NEXT:    move $4, $6
58; MIPS32-NEXT:    lw $6, 20($sp) # 4-byte Folded Reload
59; MIPS32-NEXT:    move $5, $7
60; MIPS32-NEXT:    lw $7, 24($sp) # 4-byte Folded Reload
61; MIPS32-NEXT:    jal __divdi3
62; MIPS32-NEXT:    nop
63; MIPS32-NEXT:    lw $ra, 28($sp) # 4-byte Folded Reload
64; MIPS32-NEXT:    addiu $sp, $sp, 32
65; MIPS32-NEXT:    jr $ra
66; MIPS32-NEXT:    nop
67entry:
68  %div = sdiv i64 %b, %a
69  ret i64 %div
70}
71
72; srem
73define signext i8 @srem_i8(i8 signext %a, i8 signext %b) {
74; MIPS32-LABEL: srem_i8:
75; MIPS32:       # %bb.0: # %entry
76; MIPS32-NEXT:    div $zero, $5, $4
77; MIPS32-NEXT:    teq $4, $zero, 7
78; MIPS32-NEXT:    mflo $1
79; MIPS32-NEXT:    sll $1, $1, 24
80; MIPS32-NEXT:    sra $2, $1, 24
81; MIPS32-NEXT:    jr $ra
82; MIPS32-NEXT:    nop
83entry:
84  %div = sdiv i8 %b, %a
85  ret i8 %div
86}
87
88define signext i16 @srem_i16(i16 signext %a, i16 signext %b) {
89; MIPS32-LABEL: srem_i16:
90; MIPS32:       # %bb.0: # %entry
91; MIPS32-NEXT:    div $zero, $5, $4
92; MIPS32-NEXT:    teq $4, $zero, 7
93; MIPS32-NEXT:    mfhi $1
94; MIPS32-NEXT:    sll $1, $1, 16
95; MIPS32-NEXT:    sra $2, $1, 16
96; MIPS32-NEXT:    jr $ra
97; MIPS32-NEXT:    nop
98entry:
99  %rem = srem i16 %b, %a
100  ret i16 %rem
101}
102
103define signext i32 @srem_i32(i32 signext %a, i32 signext %b) {
104; MIPS32-LABEL: srem_i32:
105; MIPS32:       # %bb.0: # %entry
106; MIPS32-NEXT:    div $zero, $5, $4
107; MIPS32-NEXT:    teq $4, $zero, 7
108; MIPS32-NEXT:    mfhi $2
109; MIPS32-NEXT:    jr $ra
110; MIPS32-NEXT:    nop
111entry:
112  %rem = srem i32 %b, %a
113  ret i32 %rem
114}
115
116define signext i64 @srem_i64(i64 signext %a, i64 signext %b) {
117; MIPS32-LABEL: srem_i64:
118; MIPS32:       # %bb.0: # %entry
119; MIPS32-NEXT:    addiu $sp, $sp, -32
120; MIPS32-NEXT:    .cfi_def_cfa_offset 32
121; MIPS32-NEXT:    sw $ra, 28($sp) # 4-byte Folded Spill
122; MIPS32-NEXT:    .cfi_offset 31, -4
123; MIPS32-NEXT:    sw $4, 20($sp) # 4-byte Folded Spill
124; MIPS32-NEXT:    sw $5, 24($sp) # 4-byte Folded Spill
125; MIPS32-NEXT:    move $4, $6
126; MIPS32-NEXT:    lw $6, 20($sp) # 4-byte Folded Reload
127; MIPS32-NEXT:    move $5, $7
128; MIPS32-NEXT:    lw $7, 24($sp) # 4-byte Folded Reload
129; MIPS32-NEXT:    jal __moddi3
130; MIPS32-NEXT:    nop
131; MIPS32-NEXT:    lw $ra, 28($sp) # 4-byte Folded Reload
132; MIPS32-NEXT:    addiu $sp, $sp, 32
133; MIPS32-NEXT:    jr $ra
134; MIPS32-NEXT:    nop
135entry:
136  %rem = srem i64 %b, %a
137  ret i64 %rem
138}
139
140; udiv
141define signext i8 @udiv_i8(i8 signext %a, i8 signext %b) {
142; MIPS32-LABEL: udiv_i8:
143; MIPS32:       # %bb.0: # %entry
144; MIPS32-NEXT:    andi $2, $5, 255
145; MIPS32-NEXT:    andi $1, $4, 255
146; MIPS32-NEXT:    divu $zero, $2, $1
147; MIPS32-NEXT:    teq $1, $zero, 7
148; MIPS32-NEXT:    mflo $1
149; MIPS32-NEXT:    sll $1, $1, 24
150; MIPS32-NEXT:    sra $2, $1, 24
151; MIPS32-NEXT:    jr $ra
152; MIPS32-NEXT:    nop
153entry:
154  %div = udiv i8 %b, %a
155  ret i8 %div
156}
157
158define signext i16 @udiv_i16(i16 signext %a, i16 signext %b) {
159; MIPS32-LABEL: udiv_i16:
160; MIPS32:       # %bb.0: # %entry
161; MIPS32-NEXT:    andi $2, $5, 65535
162; MIPS32-NEXT:    andi $1, $4, 65535
163; MIPS32-NEXT:    divu $zero, $2, $1
164; MIPS32-NEXT:    teq $1, $zero, 7
165; MIPS32-NEXT:    mflo $1
166; MIPS32-NEXT:    sll $1, $1, 16
167; MIPS32-NEXT:    sra $2, $1, 16
168; MIPS32-NEXT:    jr $ra
169; MIPS32-NEXT:    nop
170entry:
171  %div = udiv i16 %b, %a
172  ret i16 %div
173}
174
175define signext i32 @udiv_i32(i32 signext %a, i32 signext %b) {
176; MIPS32-LABEL: udiv_i32:
177; MIPS32:       # %bb.0: # %entry
178; MIPS32-NEXT:    divu $zero, $5, $4
179; MIPS32-NEXT:    teq $4, $zero, 7
180; MIPS32-NEXT:    mflo $2
181; MIPS32-NEXT:    jr $ra
182; MIPS32-NEXT:    nop
183entry:
184  %div = udiv i32 %b, %a
185  ret i32 %div
186}
187
188define signext i64 @udiv_i64(i64 signext %a, i64 signext %b) {
189; MIPS32-LABEL: udiv_i64:
190; MIPS32:       # %bb.0: # %entry
191; MIPS32-NEXT:    addiu $sp, $sp, -32
192; MIPS32-NEXT:    .cfi_def_cfa_offset 32
193; MIPS32-NEXT:    sw $ra, 28($sp) # 4-byte Folded Spill
194; MIPS32-NEXT:    .cfi_offset 31, -4
195; MIPS32-NEXT:    sw $4, 20($sp) # 4-byte Folded Spill
196; MIPS32-NEXT:    sw $5, 24($sp) # 4-byte Folded Spill
197; MIPS32-NEXT:    move $4, $6
198; MIPS32-NEXT:    lw $6, 20($sp) # 4-byte Folded Reload
199; MIPS32-NEXT:    move $5, $7
200; MIPS32-NEXT:    lw $7, 24($sp) # 4-byte Folded Reload
201; MIPS32-NEXT:    jal __udivdi3
202; MIPS32-NEXT:    nop
203; MIPS32-NEXT:    lw $ra, 28($sp) # 4-byte Folded Reload
204; MIPS32-NEXT:    addiu $sp, $sp, 32
205; MIPS32-NEXT:    jr $ra
206; MIPS32-NEXT:    nop
207entry:
208  %div = udiv i64 %b, %a
209  ret i64 %div
210}
211
212; urem
213define signext i8 @urem_i8(i8 signext %a, i8 signext %b) {
214; MIPS32-LABEL: urem_i8:
215; MIPS32:       # %bb.0: # %entry
216; MIPS32-NEXT:    andi $2, $5, 255
217; MIPS32-NEXT:    andi $1, $4, 255
218; MIPS32-NEXT:    divu $zero, $2, $1
219; MIPS32-NEXT:    teq $1, $zero, 7
220; MIPS32-NEXT:    mfhi $1
221; MIPS32-NEXT:    sll $1, $1, 24
222; MIPS32-NEXT:    sra $2, $1, 24
223; MIPS32-NEXT:    jr $ra
224; MIPS32-NEXT:    nop
225entry:
226  %rem = urem i8 %b, %a
227  ret i8 %rem
228}
229
230define signext i16 @urem_i16(i16 signext %a, i16 signext %b) {
231; MIPS32-LABEL: urem_i16:
232; MIPS32:       # %bb.0: # %entry
233; MIPS32-NEXT:    andi $2, $5, 65535
234; MIPS32-NEXT:    andi $1, $4, 65535
235; MIPS32-NEXT:    divu $zero, $2, $1
236; MIPS32-NEXT:    teq $1, $zero, 7
237; MIPS32-NEXT:    mfhi $1
238; MIPS32-NEXT:    sll $1, $1, 16
239; MIPS32-NEXT:    sra $2, $1, 16
240; MIPS32-NEXT:    jr $ra
241; MIPS32-NEXT:    nop
242entry:
243  %rem = urem i16 %b, %a
244  ret i16 %rem
245}
246
247define signext i32 @urem_i32(i32 signext %a, i32 signext %b) {
248; MIPS32-LABEL: urem_i32:
249; MIPS32:       # %bb.0: # %entry
250; MIPS32-NEXT:    divu $zero, $5, $4
251; MIPS32-NEXT:    teq $4, $zero, 7
252; MIPS32-NEXT:    mfhi $2
253; MIPS32-NEXT:    jr $ra
254; MIPS32-NEXT:    nop
255entry:
256  %rem = urem i32 %b, %a
257  ret i32 %rem
258}
259
260define signext i64 @urem_i64(i64 signext %a, i64 signext %b) {
261; MIPS32-LABEL: urem_i64:
262; MIPS32:       # %bb.0: # %entry
263; MIPS32-NEXT:    addiu $sp, $sp, -32
264; MIPS32-NEXT:    .cfi_def_cfa_offset 32
265; MIPS32-NEXT:    sw $ra, 28($sp) # 4-byte Folded Spill
266; MIPS32-NEXT:    .cfi_offset 31, -4
267; MIPS32-NEXT:    sw $4, 20($sp) # 4-byte Folded Spill
268; MIPS32-NEXT:    sw $5, 24($sp) # 4-byte Folded Spill
269; MIPS32-NEXT:    move $4, $6
270; MIPS32-NEXT:    lw $6, 20($sp) # 4-byte Folded Reload
271; MIPS32-NEXT:    move $5, $7
272; MIPS32-NEXT:    lw $7, 24($sp) # 4-byte Folded Reload
273; MIPS32-NEXT:    jal __umoddi3
274; MIPS32-NEXT:    nop
275; MIPS32-NEXT:    lw $ra, 28($sp) # 4-byte Folded Reload
276; MIPS32-NEXT:    addiu $sp, $sp, 32
277; MIPS32-NEXT:    jr $ra
278; MIPS32-NEXT:    nop
279entry:
280  %rem = urem i64 %b, %a
281  ret i64 %rem
282}
283