[PowerPC] Fix CR Bit spill pseudo expansion
[llvm-core.git] / test / CodeGen / RISCV / div.ll
blobda9df17ccd4ffa5e172ed9cfe18068be62561f05
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
7 define i32 @udiv(i32 %a, i32 %b) nounwind {
8 ; RV32I-LABEL: udiv:
9 ; RV32I:       # %bb.0:
10 ; RV32I-NEXT:    addi sp, sp, -16
11 ; RV32I-NEXT:    sw ra, 12(sp)
12 ; RV32I-NEXT:    call __udivsi3
13 ; RV32I-NEXT:    lw ra, 12(sp)
14 ; RV32I-NEXT:    addi sp, sp, 16
15 ; RV32I-NEXT:    ret
17 ; RV32IM-LABEL: udiv:
18 ; RV32IM:       # %bb.0:
19 ; RV32IM-NEXT:    divu a0, a0, a1
20 ; RV32IM-NEXT:    ret
21   %1 = udiv i32 %a, %b
22   ret i32 %1
25 define i32 @udiv_constant(i32 %a) nounwind {
26 ; RV32I-LABEL: udiv_constant:
27 ; RV32I:       # %bb.0:
28 ; RV32I-NEXT:    addi sp, sp, -16
29 ; RV32I-NEXT:    sw ra, 12(sp)
30 ; RV32I-NEXT:    addi a1, zero, 5
31 ; RV32I-NEXT:    call __udivsi3
32 ; RV32I-NEXT:    lw ra, 12(sp)
33 ; RV32I-NEXT:    addi sp, sp, 16
34 ; RV32I-NEXT:    ret
36 ; RV32IM-LABEL: udiv_constant:
37 ; RV32IM:       # %bb.0:
38 ; RV32IM-NEXT:    lui a1, 838861
39 ; RV32IM-NEXT:    addi a1, a1, -819
40 ; RV32IM-NEXT:    mulhu a0, a0, a1
41 ; RV32IM-NEXT:    srli a0, a0, 2
42 ; RV32IM-NEXT:    ret
43   %1 = udiv i32 %a, 5
44   ret i32 %1
47 define i32 @udiv_pow2(i32 %a) nounwind {
48 ; RV32I-LABEL: udiv_pow2:
49 ; RV32I:       # %bb.0:
50 ; RV32I-NEXT:    srli a0, a0, 3
51 ; RV32I-NEXT:    ret
53 ; RV32IM-LABEL: udiv_pow2:
54 ; RV32IM:       # %bb.0:
55 ; RV32IM-NEXT:    srli a0, a0, 3
56 ; RV32IM-NEXT:    ret
57   %1 = udiv i32 %a, 8
58   ret i32 %1
61 define i64 @udiv64(i64 %a, i64 %b) nounwind {
62 ; RV32I-LABEL: udiv64:
63 ; RV32I:       # %bb.0:
64 ; RV32I-NEXT:    addi sp, sp, -16
65 ; RV32I-NEXT:    sw ra, 12(sp)
66 ; RV32I-NEXT:    call __udivdi3
67 ; RV32I-NEXT:    lw ra, 12(sp)
68 ; RV32I-NEXT:    addi sp, sp, 16
69 ; RV32I-NEXT:    ret
71 ; RV32IM-LABEL: udiv64:
72 ; RV32IM:       # %bb.0:
73 ; RV32IM-NEXT:    addi sp, sp, -16
74 ; RV32IM-NEXT:    sw ra, 12(sp)
75 ; RV32IM-NEXT:    call __udivdi3
76 ; RV32IM-NEXT:    lw ra, 12(sp)
77 ; RV32IM-NEXT:    addi sp, sp, 16
78 ; RV32IM-NEXT:    ret
79   %1 = udiv i64 %a, %b
80   ret i64 %1
83 define i64 @udiv64_constant(i64 %a) nounwind {
84 ; RV32I-LABEL: udiv64_constant:
85 ; RV32I:       # %bb.0:
86 ; RV32I-NEXT:    addi sp, sp, -16
87 ; RV32I-NEXT:    sw ra, 12(sp)
88 ; RV32I-NEXT:    addi a2, zero, 5
89 ; RV32I-NEXT:    mv a3, zero
90 ; RV32I-NEXT:    call __udivdi3
91 ; RV32I-NEXT:    lw ra, 12(sp)
92 ; RV32I-NEXT:    addi sp, sp, 16
93 ; RV32I-NEXT:    ret
95 ; RV32IM-LABEL: udiv64_constant:
96 ; RV32IM:       # %bb.0:
97 ; RV32IM-NEXT:    addi sp, sp, -16
98 ; RV32IM-NEXT:    sw ra, 12(sp)
99 ; RV32IM-NEXT:    addi a2, zero, 5
100 ; RV32IM-NEXT:    mv a3, zero
101 ; RV32IM-NEXT:    call __udivdi3
102 ; RV32IM-NEXT:    lw ra, 12(sp)
103 ; RV32IM-NEXT:    addi sp, sp, 16
104 ; RV32IM-NEXT:    ret
105   %1 = udiv i64 %a, 5
106   ret i64 %1
109 define i32 @sdiv(i32 %a, i32 %b) nounwind {
110 ; RV32I-LABEL: sdiv:
111 ; RV32I:       # %bb.0:
112 ; RV32I-NEXT:    addi sp, sp, -16
113 ; RV32I-NEXT:    sw ra, 12(sp)
114 ; RV32I-NEXT:    call __divsi3
115 ; RV32I-NEXT:    lw ra, 12(sp)
116 ; RV32I-NEXT:    addi sp, sp, 16
117 ; RV32I-NEXT:    ret
119 ; RV32IM-LABEL: sdiv:
120 ; RV32IM:       # %bb.0:
121 ; RV32IM-NEXT:    div a0, a0, a1
122 ; RV32IM-NEXT:    ret
123   %1 = sdiv i32 %a, %b
124   ret i32 %1
127 define i32 @sdiv_constant(i32 %a) nounwind {
128 ; RV32I-LABEL: sdiv_constant:
129 ; RV32I:       # %bb.0:
130 ; RV32I-NEXT:    addi sp, sp, -16
131 ; RV32I-NEXT:    sw ra, 12(sp)
132 ; RV32I-NEXT:    addi a1, zero, 5
133 ; RV32I-NEXT:    call __divsi3
134 ; RV32I-NEXT:    lw ra, 12(sp)
135 ; RV32I-NEXT:    addi sp, sp, 16
136 ; RV32I-NEXT:    ret
138 ; RV32IM-LABEL: sdiv_constant:
139 ; RV32IM:       # %bb.0:
140 ; RV32IM-NEXT:    lui a1, 419430
141 ; RV32IM-NEXT:    addi a1, a1, 1639
142 ; RV32IM-NEXT:    mulh a0, a0, a1
143 ; RV32IM-NEXT:    srli a1, a0, 31
144 ; RV32IM-NEXT:    srai a0, a0, 1
145 ; RV32IM-NEXT:    add a0, a0, a1
146 ; RV32IM-NEXT:    ret
147   %1 = sdiv i32 %a, 5
148   ret i32 %1
151 define i32 @sdiv_pow2(i32 %a) nounwind {
152 ; RV32I-LABEL: sdiv_pow2:
153 ; RV32I:       # %bb.0:
154 ; RV32I-NEXT:    srai a1, a0, 31
155 ; RV32I-NEXT:    srli a1, a1, 29
156 ; RV32I-NEXT:    add a0, a0, a1
157 ; RV32I-NEXT:    srai a0, a0, 3
158 ; RV32I-NEXT:    ret
160 ; RV32IM-LABEL: sdiv_pow2:
161 ; RV32IM:       # %bb.0:
162 ; RV32IM-NEXT:    srai a1, a0, 31
163 ; RV32IM-NEXT:    srli a1, a1, 29
164 ; RV32IM-NEXT:    add a0, a0, a1
165 ; RV32IM-NEXT:    srai a0, a0, 3
166 ; RV32IM-NEXT:    ret
167   %1 = sdiv i32 %a, 8
168   ret i32 %1
171 define i64 @sdiv64(i64 %a, i64 %b) nounwind {
172 ; RV32I-LABEL: sdiv64:
173 ; RV32I:       # %bb.0:
174 ; RV32I-NEXT:    addi sp, sp, -16
175 ; RV32I-NEXT:    sw ra, 12(sp)
176 ; RV32I-NEXT:    call __divdi3
177 ; RV32I-NEXT:    lw ra, 12(sp)
178 ; RV32I-NEXT:    addi sp, sp, 16
179 ; RV32I-NEXT:    ret
181 ; RV32IM-LABEL: sdiv64:
182 ; RV32IM:       # %bb.0:
183 ; RV32IM-NEXT:    addi sp, sp, -16
184 ; RV32IM-NEXT:    sw ra, 12(sp)
185 ; RV32IM-NEXT:    call __divdi3
186 ; RV32IM-NEXT:    lw ra, 12(sp)
187 ; RV32IM-NEXT:    addi sp, sp, 16
188 ; RV32IM-NEXT:    ret
189   %1 = sdiv i64 %a, %b
190   ret i64 %1
193 define i64 @sdiv64_constant(i64 %a) nounwind {
194 ; RV32I-LABEL: sdiv64_constant:
195 ; RV32I:       # %bb.0:
196 ; RV32I-NEXT:    addi sp, sp, -16
197 ; RV32I-NEXT:    sw ra, 12(sp)
198 ; RV32I-NEXT:    addi a2, zero, 5
199 ; RV32I-NEXT:    mv a3, zero
200 ; RV32I-NEXT:    call __divdi3
201 ; RV32I-NEXT:    lw ra, 12(sp)
202 ; RV32I-NEXT:    addi sp, sp, 16
203 ; RV32I-NEXT:    ret
205 ; RV32IM-LABEL: sdiv64_constant:
206 ; RV32IM:       # %bb.0:
207 ; RV32IM-NEXT:    addi sp, sp, -16
208 ; RV32IM-NEXT:    sw ra, 12(sp)
209 ; RV32IM-NEXT:    addi a2, zero, 5
210 ; RV32IM-NEXT:    mv a3, zero
211 ; RV32IM-NEXT:    call __divdi3
212 ; RV32IM-NEXT:    lw ra, 12(sp)
213 ; RV32IM-NEXT:    addi sp, sp, 16
214 ; RV32IM-NEXT:    ret
215   %1 = sdiv i64 %a, 5
216   ret i64 %1