Revert " [LoongArch][ISel] Check the number of sign bits in `PatGprGpr_32` (#107432)"
[llvm-project.git] / llvm / test / CodeGen / RISCV / sdiv-pow2-cmov.ll
blobf7dda8288567876dd4c11735e05562e7dc48a879
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv64 -mattr=+c,+m -verify-machineinstrs < %s \
3 ; RUN:   | FileCheck -check-prefixes=CHECK,NOSFB %s
4 ; RUN: llc -mtriple=riscv64 -mcpu=sifive-u74 -verify-machineinstrs < %s \
5 ; RUN:   | FileCheck -check-prefixes=CHECK,SFB %s
7 define signext i32 @sdiv2_32(i32 signext %0) {
8 ; NOSFB-LABEL: sdiv2_32:
9 ; NOSFB:       # %bb.0:
10 ; NOSFB-NEXT:    srliw a1, a0, 31
11 ; NOSFB-NEXT:    add a0, a0, a1
12 ; NOSFB-NEXT:    sraiw a0, a0, 1
13 ; NOSFB-NEXT:    ret
15 ; SFB-LABEL: sdiv2_32:
16 ; SFB:       # %bb.0:
17 ; SFB-NEXT:    bgez a0, .LBB0_2
18 ; SFB-NEXT:  # %bb.1:
19 ; SFB-NEXT:    addi a0, a0, 1
20 ; SFB-NEXT:  .LBB0_2:
21 ; SFB-NEXT:    sraiw a0, a0, 1
22 ; SFB-NEXT:    ret
23   %res = sdiv i32 %0, 2
24   ret i32 %res
27 define signext i32 @sdivneg2_32(i32 signext %0) {
28 ; NOSFB-LABEL: sdivneg2_32:
29 ; NOSFB:       # %bb.0:
30 ; NOSFB-NEXT:    srliw a1, a0, 31
31 ; NOSFB-NEXT:    add a0, a0, a1
32 ; NOSFB-NEXT:    sraiw a0, a0, 1
33 ; NOSFB-NEXT:    neg a0, a0
34 ; NOSFB-NEXT:    ret
36 ; SFB-LABEL: sdivneg2_32:
37 ; SFB:       # %bb.0:
38 ; SFB-NEXT:    bgez a0, .LBB1_2
39 ; SFB-NEXT:  # %bb.1:
40 ; SFB-NEXT:    addi a0, a0, 1
41 ; SFB-NEXT:  .LBB1_2:
42 ; SFB-NEXT:    sraiw a0, a0, 1
43 ; SFB-NEXT:    neg a0, a0
44 ; SFB-NEXT:    ret
45   %res = sdiv i32 %0, -2
46   ret i32 %res
49 define i64 @sdiv2_64(i64 %0) {
50 ; NOSFB-LABEL: sdiv2_64:
51 ; NOSFB:       # %bb.0:
52 ; NOSFB-NEXT:    srli a1, a0, 63
53 ; NOSFB-NEXT:    add a0, a0, a1
54 ; NOSFB-NEXT:    srai a0, a0, 1
55 ; NOSFB-NEXT:    ret
57 ; SFB-LABEL: sdiv2_64:
58 ; SFB:       # %bb.0:
59 ; SFB-NEXT:    bgez a0, .LBB2_2
60 ; SFB-NEXT:  # %bb.1:
61 ; SFB-NEXT:    addi a0, a0, 1
62 ; SFB-NEXT:  .LBB2_2:
63 ; SFB-NEXT:    srai a0, a0, 1
64 ; SFB-NEXT:    ret
65   %res = sdiv i64 %0, 2
66   ret i64 %res
69 define i64 @sdivneg2_64(i64 %0) {
70 ; NOSFB-LABEL: sdivneg2_64:
71 ; NOSFB:       # %bb.0:
72 ; NOSFB-NEXT:    srli a1, a0, 63
73 ; NOSFB-NEXT:    add a0, a0, a1
74 ; NOSFB-NEXT:    srai a0, a0, 1
75 ; NOSFB-NEXT:    neg a0, a0
76 ; NOSFB-NEXT:    ret
78 ; SFB-LABEL: sdivneg2_64:
79 ; SFB:       # %bb.0:
80 ; SFB-NEXT:    bgez a0, .LBB3_2
81 ; SFB-NEXT:  # %bb.1:
82 ; SFB-NEXT:    addi a0, a0, 1
83 ; SFB-NEXT:  .LBB3_2:
84 ; SFB-NEXT:    srai a0, a0, 1
85 ; SFB-NEXT:    neg a0, a0
86 ; SFB-NEXT:    ret
87   %res = sdiv i64 %0, -2
88   ret i64 %res
91 define signext i32 @srem2_32(i32 signext %0) {
92 ; NOSFB-LABEL: srem2_32:
93 ; NOSFB:       # %bb.0:
94 ; NOSFB-NEXT:    srliw a1, a0, 31
95 ; NOSFB-NEXT:    add a1, a1, a0
96 ; NOSFB-NEXT:    andi a1, a1, -2
97 ; NOSFB-NEXT:    subw a0, a0, a1
98 ; NOSFB-NEXT:    ret
100 ; SFB-LABEL: srem2_32:
101 ; SFB:       # %bb.0:
102 ; SFB-NEXT:    mv a1, a0
103 ; SFB-NEXT:    bgez a0, .LBB4_2
104 ; SFB-NEXT:  # %bb.1:
105 ; SFB-NEXT:    addi a1, a0, 1
106 ; SFB-NEXT:  .LBB4_2:
107 ; SFB-NEXT:    andi a1, a1, -2
108 ; SFB-NEXT:    subw a0, a0, a1
109 ; SFB-NEXT:    ret
110   %res = srem i32 %0, 2
111   ret i32 %res
114 define signext i32 @sremneg2_32(i32 signext %0) {
115 ; NOSFB-LABEL: sremneg2_32:
116 ; NOSFB:       # %bb.0:
117 ; NOSFB-NEXT:    srliw a1, a0, 31
118 ; NOSFB-NEXT:    add a1, a1, a0
119 ; NOSFB-NEXT:    andi a1, a1, -2
120 ; NOSFB-NEXT:    subw a0, a0, a1
121 ; NOSFB-NEXT:    ret
123 ; SFB-LABEL: sremneg2_32:
124 ; SFB:       # %bb.0:
125 ; SFB-NEXT:    mv a1, a0
126 ; SFB-NEXT:    bgez a0, .LBB5_2
127 ; SFB-NEXT:  # %bb.1:
128 ; SFB-NEXT:    addi a1, a0, 1
129 ; SFB-NEXT:  .LBB5_2:
130 ; SFB-NEXT:    andi a1, a1, -2
131 ; SFB-NEXT:    subw a0, a0, a1
132 ; SFB-NEXT:    ret
133   %res = srem i32 %0, -2
134   ret i32 %res
137 define i64 @srem2_64(i64 %0) {
138 ; NOSFB-LABEL: srem2_64:
139 ; NOSFB:       # %bb.0:
140 ; NOSFB-NEXT:    srli a1, a0, 63
141 ; NOSFB-NEXT:    add a1, a1, a0
142 ; NOSFB-NEXT:    andi a1, a1, -2
143 ; NOSFB-NEXT:    sub a0, a0, a1
144 ; NOSFB-NEXT:    ret
146 ; SFB-LABEL: srem2_64:
147 ; SFB:       # %bb.0:
148 ; SFB-NEXT:    mv a1, a0
149 ; SFB-NEXT:    bgez a0, .LBB6_2
150 ; SFB-NEXT:  # %bb.1:
151 ; SFB-NEXT:    addi a1, a0, 1
152 ; SFB-NEXT:  .LBB6_2:
153 ; SFB-NEXT:    andi a1, a1, -2
154 ; SFB-NEXT:    sub a0, a0, a1
155 ; SFB-NEXT:    ret
156   %res = srem i64 %0, 2
157   ret i64 %res
160 define i64 @sremneg2_64(i64 %0) {
161 ; NOSFB-LABEL: sremneg2_64:
162 ; NOSFB:       # %bb.0:
163 ; NOSFB-NEXT:    srli a1, a0, 63
164 ; NOSFB-NEXT:    add a1, a1, a0
165 ; NOSFB-NEXT:    andi a1, a1, -2
166 ; NOSFB-NEXT:    sub a0, a0, a1
167 ; NOSFB-NEXT:    ret
169 ; SFB-LABEL: sremneg2_64:
170 ; SFB:       # %bb.0:
171 ; SFB-NEXT:    mv a1, a0
172 ; SFB-NEXT:    bgez a0, .LBB7_2
173 ; SFB-NEXT:  # %bb.1:
174 ; SFB-NEXT:    addi a1, a0, 1
175 ; SFB-NEXT:  .LBB7_2:
176 ; SFB-NEXT:    andi a1, a1, -2
177 ; SFB-NEXT:    sub a0, a0, a1
178 ; SFB-NEXT:    ret
179   %res = srem i64 %0, -2
180   ret i64 %res
183 define signext i32 @sdiv8_32(i32 signext %0) {
184 ; NOSFB-LABEL: sdiv8_32:
185 ; NOSFB:       # %bb.0:
186 ; NOSFB-NEXT:    slli a1, a0, 1
187 ; NOSFB-NEXT:    srli a1, a1, 61
188 ; NOSFB-NEXT:    add a0, a0, a1
189 ; NOSFB-NEXT:    sraiw a0, a0, 3
190 ; NOSFB-NEXT:    ret
192 ; SFB-LABEL: sdiv8_32:
193 ; SFB:       # %bb.0:
194 ; SFB-NEXT:    bgez a0, .LBB8_2
195 ; SFB-NEXT:  # %bb.1:
196 ; SFB-NEXT:    addi a0, a0, 7
197 ; SFB-NEXT:  .LBB8_2:
198 ; SFB-NEXT:    sraiw a0, a0, 3
199 ; SFB-NEXT:    ret
200   %res = sdiv i32 %0, 8
201   ret i32 %res
204 define signext i32 @sdivneg8_32(i32 signext %0) {
205 ; NOSFB-LABEL: sdivneg8_32:
206 ; NOSFB:       # %bb.0:
207 ; NOSFB-NEXT:    slli a1, a0, 1
208 ; NOSFB-NEXT:    srli a1, a1, 61
209 ; NOSFB-NEXT:    add a0, a0, a1
210 ; NOSFB-NEXT:    sraiw a0, a0, 3
211 ; NOSFB-NEXT:    neg a0, a0
212 ; NOSFB-NEXT:    ret
214 ; SFB-LABEL: sdivneg8_32:
215 ; SFB:       # %bb.0:
216 ; SFB-NEXT:    bgez a0, .LBB9_2
217 ; SFB-NEXT:  # %bb.1:
218 ; SFB-NEXT:    addi a0, a0, 7
219 ; SFB-NEXT:  .LBB9_2:
220 ; SFB-NEXT:    sraiw a0, a0, 3
221 ; SFB-NEXT:    neg a0, a0
222 ; SFB-NEXT:    ret
223   %res = sdiv i32 %0, -8
224   ret i32 %res
227 define i64 @sdiv8_64(i64 %0) {
228 ; NOSFB-LABEL: sdiv8_64:
229 ; NOSFB:       # %bb.0:
230 ; NOSFB-NEXT:    srai a1, a0, 63
231 ; NOSFB-NEXT:    srli a1, a1, 61
232 ; NOSFB-NEXT:    add a0, a0, a1
233 ; NOSFB-NEXT:    srai a0, a0, 3
234 ; NOSFB-NEXT:    ret
236 ; SFB-LABEL: sdiv8_64:
237 ; SFB:       # %bb.0:
238 ; SFB-NEXT:    bgez a0, .LBB10_2
239 ; SFB-NEXT:  # %bb.1:
240 ; SFB-NEXT:    addi a0, a0, 7
241 ; SFB-NEXT:  .LBB10_2:
242 ; SFB-NEXT:    srai a0, a0, 3
243 ; SFB-NEXT:    ret
244   %res = sdiv i64 %0, 8
245   ret i64 %res
248 define i64 @sdivneg8_64(i64 %0) {
249 ; NOSFB-LABEL: sdivneg8_64:
250 ; NOSFB:       # %bb.0:
251 ; NOSFB-NEXT:    srai a1, a0, 63
252 ; NOSFB-NEXT:    srli a1, a1, 61
253 ; NOSFB-NEXT:    add a0, a0, a1
254 ; NOSFB-NEXT:    srai a0, a0, 3
255 ; NOSFB-NEXT:    neg a0, a0
256 ; NOSFB-NEXT:    ret
258 ; SFB-LABEL: sdivneg8_64:
259 ; SFB:       # %bb.0:
260 ; SFB-NEXT:    bgez a0, .LBB11_2
261 ; SFB-NEXT:  # %bb.1:
262 ; SFB-NEXT:    addi a0, a0, 7
263 ; SFB-NEXT:  .LBB11_2:
264 ; SFB-NEXT:    srai a0, a0, 3
265 ; SFB-NEXT:    neg a0, a0
266 ; SFB-NEXT:    ret
267   %res = sdiv i64 %0, -8
268   ret i64 %res
271 define signext i32 @srem8_32(i32 signext %0) {
272 ; NOSFB-LABEL: srem8_32:
273 ; NOSFB:       # %bb.0:
274 ; NOSFB-NEXT:    slli a1, a0, 1
275 ; NOSFB-NEXT:    srli a1, a1, 61
276 ; NOSFB-NEXT:    add a1, a1, a0
277 ; NOSFB-NEXT:    andi a1, a1, -8
278 ; NOSFB-NEXT:    subw a0, a0, a1
279 ; NOSFB-NEXT:    ret
281 ; SFB-LABEL: srem8_32:
282 ; SFB:       # %bb.0:
283 ; SFB-NEXT:    mv a1, a0
284 ; SFB-NEXT:    bgez a0, .LBB12_2
285 ; SFB-NEXT:  # %bb.1:
286 ; SFB-NEXT:    addi a1, a0, 7
287 ; SFB-NEXT:  .LBB12_2:
288 ; SFB-NEXT:    andi a1, a1, -8
289 ; SFB-NEXT:    subw a0, a0, a1
290 ; SFB-NEXT:    ret
291   %res = srem i32 %0, 8
292   ret i32 %res
295 define signext i32 @sremneg8_32(i32 signext %0) {
296 ; NOSFB-LABEL: sremneg8_32:
297 ; NOSFB:       # %bb.0:
298 ; NOSFB-NEXT:    slli a1, a0, 1
299 ; NOSFB-NEXT:    srli a1, a1, 61
300 ; NOSFB-NEXT:    add a1, a1, a0
301 ; NOSFB-NEXT:    andi a1, a1, -8
302 ; NOSFB-NEXT:    subw a0, a0, a1
303 ; NOSFB-NEXT:    ret
305 ; SFB-LABEL: sremneg8_32:
306 ; SFB:       # %bb.0:
307 ; SFB-NEXT:    mv a1, a0
308 ; SFB-NEXT:    bgez a0, .LBB13_2
309 ; SFB-NEXT:  # %bb.1:
310 ; SFB-NEXT:    addi a1, a0, 7
311 ; SFB-NEXT:  .LBB13_2:
312 ; SFB-NEXT:    andi a1, a1, -8
313 ; SFB-NEXT:    subw a0, a0, a1
314 ; SFB-NEXT:    ret
315   %res = srem i32 %0, -8
316   ret i32 %res
319 define i64 @srem8_64(i64 %0) {
320 ; NOSFB-LABEL: srem8_64:
321 ; NOSFB:       # %bb.0:
322 ; NOSFB-NEXT:    srai a1, a0, 63
323 ; NOSFB-NEXT:    srli a1, a1, 61
324 ; NOSFB-NEXT:    add a1, a1, a0
325 ; NOSFB-NEXT:    andi a1, a1, -8
326 ; NOSFB-NEXT:    sub a0, a0, a1
327 ; NOSFB-NEXT:    ret
329 ; SFB-LABEL: srem8_64:
330 ; SFB:       # %bb.0:
331 ; SFB-NEXT:    mv a1, a0
332 ; SFB-NEXT:    bgez a0, .LBB14_2
333 ; SFB-NEXT:  # %bb.1:
334 ; SFB-NEXT:    addi a1, a0, 7
335 ; SFB-NEXT:  .LBB14_2:
336 ; SFB-NEXT:    andi a1, a1, -8
337 ; SFB-NEXT:    sub a0, a0, a1
338 ; SFB-NEXT:    ret
339   %res = srem i64 %0, 8
340   ret i64 %res
343 define i64 @sremneg8_64(i64 %0) {
344 ; NOSFB-LABEL: sremneg8_64:
345 ; NOSFB:       # %bb.0:
346 ; NOSFB-NEXT:    srai a1, a0, 63
347 ; NOSFB-NEXT:    srli a1, a1, 61
348 ; NOSFB-NEXT:    add a1, a1, a0
349 ; NOSFB-NEXT:    andi a1, a1, -8
350 ; NOSFB-NEXT:    sub a0, a0, a1
351 ; NOSFB-NEXT:    ret
353 ; SFB-LABEL: sremneg8_64:
354 ; SFB:       # %bb.0:
355 ; SFB-NEXT:    mv a1, a0
356 ; SFB-NEXT:    bgez a0, .LBB15_2
357 ; SFB-NEXT:  # %bb.1:
358 ; SFB-NEXT:    addi a1, a0, 7
359 ; SFB-NEXT:  .LBB15_2:
360 ; SFB-NEXT:    andi a1, a1, -8
361 ; SFB-NEXT:    sub a0, a0, a1
362 ; SFB-NEXT:    ret
363   %res = srem i64 %0, -8
364   ret i64 %res
367 ; Negative tests
368 define i64 @sdiv4096(i64 %0) {
369 ; CHECK-LABEL: sdiv4096:
370 ; CHECK:       # %bb.0:
371 ; CHECK-NEXT:    srai a1, a0, 63
372 ; CHECK-NEXT:    srli a1, a1, 52
373 ; CHECK-NEXT:    add a0, a0, a1
374 ; CHECK-NEXT:    srai a0, a0, 12
375 ; CHECK-NEXT:    ret
376   %res = sdiv i64 %0, 4096
377   ret i64 %res