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 {
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
19 ; RV32IM-NEXT: divu a0, a0, a1
25 define i32 @udiv_constant(i32 %a) nounwind {
26 ; RV32I-LABEL: udiv_constant:
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
36 ; RV32IM-LABEL: udiv_constant:
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
47 define i32 @udiv_pow2(i32 %a) nounwind {
48 ; RV32I-LABEL: udiv_pow2:
50 ; RV32I-NEXT: srli a0, a0, 3
53 ; RV32IM-LABEL: udiv_pow2:
55 ; RV32IM-NEXT: srli a0, a0, 3
61 define i64 @udiv64(i64 %a, i64 %b) nounwind {
62 ; RV32I-LABEL: udiv64:
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
71 ; RV32IM-LABEL: udiv64:
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
83 define i64 @udiv64_constant(i64 %a) nounwind {
84 ; RV32I-LABEL: udiv64_constant:
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
95 ; RV32IM-LABEL: udiv64_constant:
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
109 define i32 @sdiv(i32 %a, i32 %b) nounwind {
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
119 ; RV32IM-LABEL: sdiv:
121 ; RV32IM-NEXT: div a0, a0, a1
127 define i32 @sdiv_constant(i32 %a) nounwind {
128 ; RV32I-LABEL: sdiv_constant:
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
138 ; RV32IM-LABEL: sdiv_constant:
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
151 define i32 @sdiv_pow2(i32 %a) nounwind {
152 ; RV32I-LABEL: sdiv_pow2:
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
160 ; RV32IM-LABEL: sdiv_pow2:
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
171 define i64 @sdiv64(i64 %a, i64 %b) nounwind {
172 ; RV32I-LABEL: sdiv64:
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
181 ; RV32IM-LABEL: sdiv64:
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
193 define i64 @sdiv64_constant(i64 %a) nounwind {
194 ; RV32I-LABEL: sdiv64_constant:
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
205 ; RV32IM-LABEL: sdiv64_constant:
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