Revert " [LoongArch][ISel] Check the number of sign bits in `PatGprGpr_32` (#107432)"
[llvm-project.git] / llvm / test / CodeGen / RISCV / div-by-constant.ll
blob91ac7c5ddae3ffea44b9348babcb8d6284dd8114
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+m -verify-machineinstrs < %s \
3 ; RUN:   | FileCheck -check-prefixes=RV32,RV32IM %s
4 ; RUN: llc -mtriple=riscv32 -mattr=+m,+zba,+zbb \
5 ; RUN:    -verify-machineinstrs < %s \
6 ; RUN:   | FileCheck -check-prefixes=RV32,RV32IMZB %s
7 ; RUN: llc -mtriple=riscv64 -mattr=+m -verify-machineinstrs < %s \
8 ; RUN:   | FileCheck -check-prefixes=RV64,RV64IM %s
9 ; RUN: llc -mtriple=riscv64 -mattr=+m,+zba,+zbb \
10 ; RUN:   -verify-machineinstrs < %s \
11 ; RUN:   | FileCheck -check-prefixes=RV64,RV64IMZB %s
13 ; Test that there is a single shift after the mul and no addition.
14 define i32 @udiv_constant_no_add(i32 %a) nounwind {
15 ; RV32-LABEL: udiv_constant_no_add:
16 ; RV32:       # %bb.0:
17 ; RV32-NEXT:    lui a1, 838861
18 ; RV32-NEXT:    addi a1, a1, -819
19 ; RV32-NEXT:    mulhu a0, a0, a1
20 ; RV32-NEXT:    srli a0, a0, 2
21 ; RV32-NEXT:    ret
23 ; RV64-LABEL: udiv_constant_no_add:
24 ; RV64:       # %bb.0:
25 ; RV64-NEXT:    slli a0, a0, 32
26 ; RV64-NEXT:    lui a1, 838861
27 ; RV64-NEXT:    addi a1, a1, -819
28 ; RV64-NEXT:    slli a1, a1, 32
29 ; RV64-NEXT:    mulhu a0, a0, a1
30 ; RV64-NEXT:    srli a0, a0, 34
31 ; RV64-NEXT:    ret
32   %1 = udiv i32 %a, 5
33   ret i32 %1
36 ; This constant requires a sub, shrli, add sequence after the mul.
37 define i32 @udiv_constant_add(i32 %a) nounwind {
38 ; RV32-LABEL: udiv_constant_add:
39 ; RV32:       # %bb.0:
40 ; RV32-NEXT:    lui a1, 149797
41 ; RV32-NEXT:    addi a1, a1, -1755
42 ; RV32-NEXT:    mulhu a1, a0, a1
43 ; RV32-NEXT:    sub a0, a0, a1
44 ; RV32-NEXT:    srli a0, a0, 1
45 ; RV32-NEXT:    add a0, a0, a1
46 ; RV32-NEXT:    srli a0, a0, 2
47 ; RV32-NEXT:    ret
49 ; RV64IM-LABEL: udiv_constant_add:
50 ; RV64IM:       # %bb.0:
51 ; RV64IM-NEXT:    slli a1, a0, 32
52 ; RV64IM-NEXT:    lui a2, 149797
53 ; RV64IM-NEXT:    addi a2, a2, -1755
54 ; RV64IM-NEXT:    slli a2, a2, 32
55 ; RV64IM-NEXT:    mulhu a1, a1, a2
56 ; RV64IM-NEXT:    srli a1, a1, 32
57 ; RV64IM-NEXT:    subw a0, a0, a1
58 ; RV64IM-NEXT:    srliw a0, a0, 1
59 ; RV64IM-NEXT:    add a0, a0, a1
60 ; RV64IM-NEXT:    srli a0, a0, 2
61 ; RV64IM-NEXT:    ret
63 ; RV64IMZB-LABEL: udiv_constant_add:
64 ; RV64IMZB:       # %bb.0:
65 ; RV64IMZB-NEXT:    zext.w a1, a0
66 ; RV64IMZB-NEXT:    lui a2, 149797
67 ; RV64IMZB-NEXT:    addiw a2, a2, -1755
68 ; RV64IMZB-NEXT:    mul a1, a1, a2
69 ; RV64IMZB-NEXT:    srli a1, a1, 32
70 ; RV64IMZB-NEXT:    subw a0, a0, a1
71 ; RV64IMZB-NEXT:    srliw a0, a0, 1
72 ; RV64IMZB-NEXT:    add a0, a0, a1
73 ; RV64IMZB-NEXT:    srli a0, a0, 2
74 ; RV64IMZB-NEXT:    ret
75   %1 = udiv i32 %a, 7
76   ret i32 %1
79 define i64 @udiv64_constant_no_add(i64 %a) nounwind {
80 ; RV32-LABEL: udiv64_constant_no_add:
81 ; RV32:       # %bb.0:
82 ; RV32-NEXT:    add a2, a0, a1
83 ; RV32-NEXT:    sltu a3, a2, a0
84 ; RV32-NEXT:    add a2, a2, a3
85 ; RV32-NEXT:    lui a3, 838861
86 ; RV32-NEXT:    addi a4, a3, -819
87 ; RV32-NEXT:    mulhu a5, a2, a4
88 ; RV32-NEXT:    srli a6, a5, 2
89 ; RV32-NEXT:    andi a5, a5, -4
90 ; RV32-NEXT:    add a5, a5, a6
91 ; RV32-NEXT:    sub a2, a2, a5
92 ; RV32-NEXT:    sub a5, a0, a2
93 ; RV32-NEXT:    addi a3, a3, -820
94 ; RV32-NEXT:    mul a3, a5, a3
95 ; RV32-NEXT:    mulhu a6, a5, a4
96 ; RV32-NEXT:    add a3, a6, a3
97 ; RV32-NEXT:    sltu a0, a0, a2
98 ; RV32-NEXT:    sub a1, a1, a0
99 ; RV32-NEXT:    mul a1, a1, a4
100 ; RV32-NEXT:    add a1, a3, a1
101 ; RV32-NEXT:    mul a0, a5, a4
102 ; RV32-NEXT:    ret
104 ; RV64-LABEL: udiv64_constant_no_add:
105 ; RV64:       # %bb.0:
106 ; RV64-NEXT:    lui a1, 838861
107 ; RV64-NEXT:    addiw a1, a1, -819
108 ; RV64-NEXT:    slli a2, a1, 32
109 ; RV64-NEXT:    add a1, a1, a2
110 ; RV64-NEXT:    mulhu a0, a0, a1
111 ; RV64-NEXT:    srli a0, a0, 2
112 ; RV64-NEXT:    ret
113   %1 = udiv i64 %a, 5
114   ret i64 %1
117 define i64 @udiv64_constant_add(i64 %a) nounwind {
118 ; RV32-LABEL: udiv64_constant_add:
119 ; RV32:       # %bb.0:
120 ; RV32-NEXT:    addi sp, sp, -16
121 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
122 ; RV32-NEXT:    li a2, 7
123 ; RV32-NEXT:    li a3, 0
124 ; RV32-NEXT:    call __udivdi3
125 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
126 ; RV32-NEXT:    addi sp, sp, 16
127 ; RV32-NEXT:    ret
129 ; RV64-LABEL: udiv64_constant_add:
130 ; RV64:       # %bb.0:
131 ; RV64-NEXT:    lui a1, %hi(.LCPI3_0)
132 ; RV64-NEXT:    ld a1, %lo(.LCPI3_0)(a1)
133 ; RV64-NEXT:    mulhu a1, a0, a1
134 ; RV64-NEXT:    sub a0, a0, a1
135 ; RV64-NEXT:    srli a0, a0, 1
136 ; RV64-NEXT:    add a0, a0, a1
137 ; RV64-NEXT:    srli a0, a0, 2
138 ; RV64-NEXT:    ret
139   %1 = udiv i64 %a, 7
140   ret i64 %1
143 define i8 @udiv8_constant_no_add(i8 %a) nounwind {
144 ; RV32-LABEL: udiv8_constant_no_add:
145 ; RV32:       # %bb.0:
146 ; RV32-NEXT:    andi a0, a0, 255
147 ; RV32-NEXT:    li a1, 205
148 ; RV32-NEXT:    mul a0, a0, a1
149 ; RV32-NEXT:    srli a0, a0, 10
150 ; RV32-NEXT:    ret
152 ; RV64-LABEL: udiv8_constant_no_add:
153 ; RV64:       # %bb.0:
154 ; RV64-NEXT:    andi a0, a0, 255
155 ; RV64-NEXT:    li a1, 205
156 ; RV64-NEXT:    mul a0, a0, a1
157 ; RV64-NEXT:    srli a0, a0, 10
158 ; RV64-NEXT:    ret
159   %1 = udiv i8 %a, 5
160   ret i8 %1
163 define i8 @udiv8_constant_add(i8 %a) nounwind {
164 ; RV32IM-LABEL: udiv8_constant_add:
165 ; RV32IM:       # %bb.0:
166 ; RV32IM-NEXT:    andi a1, a0, 255
167 ; RV32IM-NEXT:    li a2, 37
168 ; RV32IM-NEXT:    mul a1, a1, a2
169 ; RV32IM-NEXT:    srli a1, a1, 8
170 ; RV32IM-NEXT:    sub a0, a0, a1
171 ; RV32IM-NEXT:    slli a0, a0, 24
172 ; RV32IM-NEXT:    srli a0, a0, 25
173 ; RV32IM-NEXT:    add a0, a0, a1
174 ; RV32IM-NEXT:    srli a0, a0, 2
175 ; RV32IM-NEXT:    ret
177 ; RV32IMZB-LABEL: udiv8_constant_add:
178 ; RV32IMZB:       # %bb.0:
179 ; RV32IMZB-NEXT:    andi a1, a0, 255
180 ; RV32IMZB-NEXT:    sh3add a2, a1, a1
181 ; RV32IMZB-NEXT:    sh2add a1, a2, a1
182 ; RV32IMZB-NEXT:    srli a1, a1, 8
183 ; RV32IMZB-NEXT:    sub a0, a0, a1
184 ; RV32IMZB-NEXT:    slli a0, a0, 24
185 ; RV32IMZB-NEXT:    srli a0, a0, 25
186 ; RV32IMZB-NEXT:    add a0, a0, a1
187 ; RV32IMZB-NEXT:    srli a0, a0, 2
188 ; RV32IMZB-NEXT:    ret
190 ; RV64IM-LABEL: udiv8_constant_add:
191 ; RV64IM:       # %bb.0:
192 ; RV64IM-NEXT:    andi a1, a0, 255
193 ; RV64IM-NEXT:    li a2, 37
194 ; RV64IM-NEXT:    mul a1, a1, a2
195 ; RV64IM-NEXT:    srli a1, a1, 8
196 ; RV64IM-NEXT:    subw a0, a0, a1
197 ; RV64IM-NEXT:    slli a0, a0, 56
198 ; RV64IM-NEXT:    srli a0, a0, 57
199 ; RV64IM-NEXT:    add a0, a0, a1
200 ; RV64IM-NEXT:    srli a0, a0, 2
201 ; RV64IM-NEXT:    ret
203 ; RV64IMZB-LABEL: udiv8_constant_add:
204 ; RV64IMZB:       # %bb.0:
205 ; RV64IMZB-NEXT:    andi a1, a0, 255
206 ; RV64IMZB-NEXT:    sh3add a2, a1, a1
207 ; RV64IMZB-NEXT:    sh2add a1, a2, a1
208 ; RV64IMZB-NEXT:    srli a1, a1, 8
209 ; RV64IMZB-NEXT:    subw a0, a0, a1
210 ; RV64IMZB-NEXT:    slli a0, a0, 56
211 ; RV64IMZB-NEXT:    srli a0, a0, 57
212 ; RV64IMZB-NEXT:    add a0, a0, a1
213 ; RV64IMZB-NEXT:    srli a0, a0, 2
214 ; RV64IMZB-NEXT:    ret
215   %1 = udiv i8 %a, 7
216   ret i8 %1
219 define i16 @udiv16_constant_no_add(i16 %a) nounwind {
220 ; RV32-LABEL: udiv16_constant_no_add:
221 ; RV32:       # %bb.0:
222 ; RV32-NEXT:    slli a0, a0, 16
223 ; RV32-NEXT:    lui a1, 838864
224 ; RV32-NEXT:    mulhu a0, a0, a1
225 ; RV32-NEXT:    srli a0, a0, 18
226 ; RV32-NEXT:    ret
228 ; RV64-LABEL: udiv16_constant_no_add:
229 ; RV64:       # %bb.0:
230 ; RV64-NEXT:    lui a1, 52429
231 ; RV64-NEXT:    slli a1, a1, 4
232 ; RV64-NEXT:    slli a0, a0, 48
233 ; RV64-NEXT:    mulhu a0, a0, a1
234 ; RV64-NEXT:    srli a0, a0, 18
235 ; RV64-NEXT:    ret
236   %1 = udiv i16 %a, 5
237   ret i16 %1
240 define i16 @udiv16_constant_add(i16 %a) nounwind {
241 ; RV32-LABEL: udiv16_constant_add:
242 ; RV32:       # %bb.0:
243 ; RV32-NEXT:    slli a1, a0, 16
244 ; RV32-NEXT:    lui a2, 149808
245 ; RV32-NEXT:    mulhu a1, a1, a2
246 ; RV32-NEXT:    srli a1, a1, 16
247 ; RV32-NEXT:    sub a0, a0, a1
248 ; RV32-NEXT:    slli a0, a0, 16
249 ; RV32-NEXT:    srli a0, a0, 17
250 ; RV32-NEXT:    add a0, a0, a1
251 ; RV32-NEXT:    srli a0, a0, 2
252 ; RV32-NEXT:    ret
254 ; RV64-LABEL: udiv16_constant_add:
255 ; RV64:       # %bb.0:
256 ; RV64-NEXT:    slli a1, a0, 48
257 ; RV64-NEXT:    lui a2, 149808
258 ; RV64-NEXT:    mulhu a1, a1, a2
259 ; RV64-NEXT:    srli a1, a1, 16
260 ; RV64-NEXT:    subw a0, a0, a1
261 ; RV64-NEXT:    slli a0, a0, 48
262 ; RV64-NEXT:    srli a0, a0, 49
263 ; RV64-NEXT:    add a0, a0, a1
264 ; RV64-NEXT:    srli a0, a0, 2
265 ; RV64-NEXT:    ret
266   %1 = udiv i16 %a, 7
267   ret i16 %1
270 ; Test the simplest case a srli and an add after the mul. No srai.
271 define i32 @sdiv_constant_no_srai(i32 %a) nounwind {
272 ; RV32-LABEL: sdiv_constant_no_srai:
273 ; RV32:       # %bb.0:
274 ; RV32-NEXT:    lui a1, 349525
275 ; RV32-NEXT:    addi a1, a1, 1366
276 ; RV32-NEXT:    mulh a0, a0, a1
277 ; RV32-NEXT:    srli a1, a0, 31
278 ; RV32-NEXT:    add a0, a0, a1
279 ; RV32-NEXT:    ret
281 ; RV64-LABEL: sdiv_constant_no_srai:
282 ; RV64:       # %bb.0:
283 ; RV64-NEXT:    sext.w a0, a0
284 ; RV64-NEXT:    lui a1, 349525
285 ; RV64-NEXT:    addiw a1, a1, 1366
286 ; RV64-NEXT:    mul a0, a0, a1
287 ; RV64-NEXT:    srli a1, a0, 63
288 ; RV64-NEXT:    srli a0, a0, 32
289 ; RV64-NEXT:    addw a0, a0, a1
290 ; RV64-NEXT:    ret
291   %1 = sdiv i32 %a, 3
292   ret i32 %1
295 ; This constant requires an srai between the mul and the add.
296 define i32 @sdiv_constant_srai(i32 %a) nounwind {
297 ; RV32-LABEL: sdiv_constant_srai:
298 ; RV32:       # %bb.0:
299 ; RV32-NEXT:    lui a1, 419430
300 ; RV32-NEXT:    addi a1, a1, 1639
301 ; RV32-NEXT:    mulh a0, a0, a1
302 ; RV32-NEXT:    srli a1, a0, 31
303 ; RV32-NEXT:    srai a0, a0, 1
304 ; RV32-NEXT:    add a0, a0, a1
305 ; RV32-NEXT:    ret
307 ; RV64-LABEL: sdiv_constant_srai:
308 ; RV64:       # %bb.0:
309 ; RV64-NEXT:    sext.w a0, a0
310 ; RV64-NEXT:    lui a1, 419430
311 ; RV64-NEXT:    addiw a1, a1, 1639
312 ; RV64-NEXT:    mul a0, a0, a1
313 ; RV64-NEXT:    srli a1, a0, 63
314 ; RV64-NEXT:    srai a0, a0, 33
315 ; RV64-NEXT:    add a0, a0, a1
316 ; RV64-NEXT:    ret
317   %1 = sdiv i32 %a, 5
318   ret i32 %1
321 ; This constant requires an add and an srai after the mul.
322 define i32 @sdiv_constant_add_srai(i32 %a) nounwind {
323 ; RV32-LABEL: sdiv_constant_add_srai:
324 ; RV32:       # %bb.0:
325 ; RV32-NEXT:    lui a1, 599186
326 ; RV32-NEXT:    addi a1, a1, 1171
327 ; RV32-NEXT:    mulh a1, a0, a1
328 ; RV32-NEXT:    add a0, a1, a0
329 ; RV32-NEXT:    srli a1, a0, 31
330 ; RV32-NEXT:    srai a0, a0, 2
331 ; RV32-NEXT:    add a0, a0, a1
332 ; RV32-NEXT:    ret
334 ; RV64-LABEL: sdiv_constant_add_srai:
335 ; RV64:       # %bb.0:
336 ; RV64-NEXT:    sext.w a1, a0
337 ; RV64-NEXT:    lui a2, 599186
338 ; RV64-NEXT:    addiw a2, a2, 1171
339 ; RV64-NEXT:    mul a1, a1, a2
340 ; RV64-NEXT:    srli a1, a1, 32
341 ; RV64-NEXT:    add a0, a1, a0
342 ; RV64-NEXT:    srliw a1, a0, 31
343 ; RV64-NEXT:    sraiw a0, a0, 2
344 ; RV64-NEXT:    add a0, a0, a1
345 ; RV64-NEXT:    ret
346   %1 = sdiv i32 %a, 7
347   ret i32 %1
350 ; This constant requires a sub and an srai after the mul.
351 define i32 @sdiv_constant_sub_srai(i32 %a) nounwind {
352 ; RV32-LABEL: sdiv_constant_sub_srai:
353 ; RV32:       # %bb.0:
354 ; RV32-NEXT:    lui a1, 449390
355 ; RV32-NEXT:    addi a1, a1, -1171
356 ; RV32-NEXT:    mulh a1, a0, a1
357 ; RV32-NEXT:    sub a1, a1, a0
358 ; RV32-NEXT:    srli a0, a1, 31
359 ; RV32-NEXT:    srai a1, a1, 2
360 ; RV32-NEXT:    add a0, a1, a0
361 ; RV32-NEXT:    ret
363 ; RV64-LABEL: sdiv_constant_sub_srai:
364 ; RV64:       # %bb.0:
365 ; RV64-NEXT:    sext.w a1, a0
366 ; RV64-NEXT:    lui a2, 449390
367 ; RV64-NEXT:    addiw a2, a2, -1171
368 ; RV64-NEXT:    mul a1, a1, a2
369 ; RV64-NEXT:    srli a1, a1, 32
370 ; RV64-NEXT:    subw a1, a1, a0
371 ; RV64-NEXT:    srliw a0, a1, 31
372 ; RV64-NEXT:    sraiw a1, a1, 2
373 ; RV64-NEXT:    add a0, a1, a0
374 ; RV64-NEXT:    ret
375   %1 = sdiv i32 %a, -7
376   ret i32 %1
379 define i64 @sdiv64_constant_no_srai(i64 %a) nounwind {
380 ; RV32-LABEL: sdiv64_constant_no_srai:
381 ; RV32:       # %bb.0:
382 ; RV32-NEXT:    addi sp, sp, -16
383 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
384 ; RV32-NEXT:    li a2, 3
385 ; RV32-NEXT:    li a3, 0
386 ; RV32-NEXT:    call __divdi3
387 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
388 ; RV32-NEXT:    addi sp, sp, 16
389 ; RV32-NEXT:    ret
391 ; RV64-LABEL: sdiv64_constant_no_srai:
392 ; RV64:       # %bb.0:
393 ; RV64-NEXT:    lui a1, %hi(.LCPI12_0)
394 ; RV64-NEXT:    ld a1, %lo(.LCPI12_0)(a1)
395 ; RV64-NEXT:    mulh a0, a0, a1
396 ; RV64-NEXT:    srli a1, a0, 63
397 ; RV64-NEXT:    add a0, a0, a1
398 ; RV64-NEXT:    ret
399   %1 = sdiv i64 %a, 3
400   ret i64 %1
403 define i64 @sdiv64_constant_srai(i64 %a) nounwind {
404 ; RV32-LABEL: sdiv64_constant_srai:
405 ; RV32:       # %bb.0:
406 ; RV32-NEXT:    addi sp, sp, -16
407 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
408 ; RV32-NEXT:    li a2, 5
409 ; RV32-NEXT:    li a3, 0
410 ; RV32-NEXT:    call __divdi3
411 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
412 ; RV32-NEXT:    addi sp, sp, 16
413 ; RV32-NEXT:    ret
415 ; RV64-LABEL: sdiv64_constant_srai:
416 ; RV64:       # %bb.0:
417 ; RV64-NEXT:    lui a1, %hi(.LCPI13_0)
418 ; RV64-NEXT:    ld a1, %lo(.LCPI13_0)(a1)
419 ; RV64-NEXT:    mulh a0, a0, a1
420 ; RV64-NEXT:    srli a1, a0, 63
421 ; RV64-NEXT:    srai a0, a0, 1
422 ; RV64-NEXT:    add a0, a0, a1
423 ; RV64-NEXT:    ret
424   %1 = sdiv i64 %a, 5
425   ret i64 %1
428 define i64 @sdiv64_constant_add_srai(i64 %a) nounwind {
429 ; RV32-LABEL: sdiv64_constant_add_srai:
430 ; RV32:       # %bb.0:
431 ; RV32-NEXT:    addi sp, sp, -16
432 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
433 ; RV32-NEXT:    li a2, 15
434 ; RV32-NEXT:    li a3, 0
435 ; RV32-NEXT:    call __divdi3
436 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
437 ; RV32-NEXT:    addi sp, sp, 16
438 ; RV32-NEXT:    ret
440 ; RV64-LABEL: sdiv64_constant_add_srai:
441 ; RV64:       # %bb.0:
442 ; RV64-NEXT:    lui a1, 559241
443 ; RV64-NEXT:    addiw a1, a1, -1911
444 ; RV64-NEXT:    slli a2, a1, 32
445 ; RV64-NEXT:    add a1, a1, a2
446 ; RV64-NEXT:    mulh a1, a0, a1
447 ; RV64-NEXT:    add a0, a1, a0
448 ; RV64-NEXT:    srli a1, a0, 63
449 ; RV64-NEXT:    srai a0, a0, 3
450 ; RV64-NEXT:    add a0, a0, a1
451 ; RV64-NEXT:    ret
452   %1 = sdiv i64 %a, 15
453   ret i64 %1
456 define i64 @sdiv64_constant_sub_srai(i64 %a) nounwind {
457 ; RV32-LABEL: sdiv64_constant_sub_srai:
458 ; RV32:       # %bb.0:
459 ; RV32-NEXT:    addi sp, sp, -16
460 ; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
461 ; RV32-NEXT:    li a2, -3
462 ; RV32-NEXT:    li a3, -1
463 ; RV32-NEXT:    call __divdi3
464 ; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
465 ; RV32-NEXT:    addi sp, sp, 16
466 ; RV32-NEXT:    ret
468 ; RV64-LABEL: sdiv64_constant_sub_srai:
469 ; RV64:       # %bb.0:
470 ; RV64-NEXT:    lui a1, 349525
471 ; RV64-NEXT:    addiw a1, a1, 1365
472 ; RV64-NEXT:    slli a2, a1, 32
473 ; RV64-NEXT:    add a1, a1, a2
474 ; RV64-NEXT:    mulh a1, a0, a1
475 ; RV64-NEXT:    sub a1, a1, a0
476 ; RV64-NEXT:    srli a0, a1, 63
477 ; RV64-NEXT:    srai a1, a1, 1
478 ; RV64-NEXT:    add a0, a1, a0
479 ; RV64-NEXT:    ret
480   %1 = sdiv i64 %a, -3
481   ret i64 %1
484 define i8 @sdiv8_constant_no_srai(i8 %a) nounwind {
485 ; RV32IM-LABEL: sdiv8_constant_no_srai:
486 ; RV32IM:       # %bb.0:
487 ; RV32IM-NEXT:    slli a0, a0, 24
488 ; RV32IM-NEXT:    srai a0, a0, 24
489 ; RV32IM-NEXT:    li a1, 86
490 ; RV32IM-NEXT:    mul a0, a0, a1
491 ; RV32IM-NEXT:    srli a1, a0, 8
492 ; RV32IM-NEXT:    slli a0, a0, 16
493 ; RV32IM-NEXT:    srli a0, a0, 31
494 ; RV32IM-NEXT:    add a0, a1, a0
495 ; RV32IM-NEXT:    ret
497 ; RV32IMZB-LABEL: sdiv8_constant_no_srai:
498 ; RV32IMZB:       # %bb.0:
499 ; RV32IMZB-NEXT:    sext.b a0, a0
500 ; RV32IMZB-NEXT:    li a1, 86
501 ; RV32IMZB-NEXT:    mul a0, a0, a1
502 ; RV32IMZB-NEXT:    srli a1, a0, 8
503 ; RV32IMZB-NEXT:    slli a0, a0, 16
504 ; RV32IMZB-NEXT:    srli a0, a0, 31
505 ; RV32IMZB-NEXT:    add a0, a1, a0
506 ; RV32IMZB-NEXT:    ret
508 ; RV64IM-LABEL: sdiv8_constant_no_srai:
509 ; RV64IM:       # %bb.0:
510 ; RV64IM-NEXT:    slli a0, a0, 56
511 ; RV64IM-NEXT:    srai a0, a0, 56
512 ; RV64IM-NEXT:    li a1, 86
513 ; RV64IM-NEXT:    mul a0, a0, a1
514 ; RV64IM-NEXT:    srli a1, a0, 8
515 ; RV64IM-NEXT:    slli a0, a0, 48
516 ; RV64IM-NEXT:    srli a0, a0, 63
517 ; RV64IM-NEXT:    add a0, a1, a0
518 ; RV64IM-NEXT:    ret
520 ; RV64IMZB-LABEL: sdiv8_constant_no_srai:
521 ; RV64IMZB:       # %bb.0:
522 ; RV64IMZB-NEXT:    sext.b a0, a0
523 ; RV64IMZB-NEXT:    li a1, 86
524 ; RV64IMZB-NEXT:    mul a0, a0, a1
525 ; RV64IMZB-NEXT:    srli a1, a0, 8
526 ; RV64IMZB-NEXT:    slli a0, a0, 48
527 ; RV64IMZB-NEXT:    srli a0, a0, 63
528 ; RV64IMZB-NEXT:    add a0, a1, a0
529 ; RV64IMZB-NEXT:    ret
530   %1 = sdiv i8 %a, 3
531   ret i8 %1
534 define i8 @sdiv8_constant_srai(i8 %a) nounwind {
535 ; RV32IM-LABEL: sdiv8_constant_srai:
536 ; RV32IM:       # %bb.0:
537 ; RV32IM-NEXT:    slli a0, a0, 24
538 ; RV32IM-NEXT:    srai a0, a0, 24
539 ; RV32IM-NEXT:    li a1, 103
540 ; RV32IM-NEXT:    mul a0, a0, a1
541 ; RV32IM-NEXT:    srai a1, a0, 9
542 ; RV32IM-NEXT:    slli a0, a0, 16
543 ; RV32IM-NEXT:    srli a0, a0, 31
544 ; RV32IM-NEXT:    add a0, a1, a0
545 ; RV32IM-NEXT:    ret
547 ; RV32IMZB-LABEL: sdiv8_constant_srai:
548 ; RV32IMZB:       # %bb.0:
549 ; RV32IMZB-NEXT:    sext.b a0, a0
550 ; RV32IMZB-NEXT:    li a1, 103
551 ; RV32IMZB-NEXT:    mul a0, a0, a1
552 ; RV32IMZB-NEXT:    srai a1, a0, 9
553 ; RV32IMZB-NEXT:    slli a0, a0, 16
554 ; RV32IMZB-NEXT:    srli a0, a0, 31
555 ; RV32IMZB-NEXT:    add a0, a1, a0
556 ; RV32IMZB-NEXT:    ret
558 ; RV64IM-LABEL: sdiv8_constant_srai:
559 ; RV64IM:       # %bb.0:
560 ; RV64IM-NEXT:    slli a0, a0, 56
561 ; RV64IM-NEXT:    srai a0, a0, 56
562 ; RV64IM-NEXT:    li a1, 103
563 ; RV64IM-NEXT:    mul a0, a0, a1
564 ; RV64IM-NEXT:    srai a1, a0, 9
565 ; RV64IM-NEXT:    slli a0, a0, 48
566 ; RV64IM-NEXT:    srli a0, a0, 63
567 ; RV64IM-NEXT:    add a0, a1, a0
568 ; RV64IM-NEXT:    ret
570 ; RV64IMZB-LABEL: sdiv8_constant_srai:
571 ; RV64IMZB:       # %bb.0:
572 ; RV64IMZB-NEXT:    sext.b a0, a0
573 ; RV64IMZB-NEXT:    li a1, 103
574 ; RV64IMZB-NEXT:    mul a0, a0, a1
575 ; RV64IMZB-NEXT:    srai a1, a0, 9
576 ; RV64IMZB-NEXT:    slli a0, a0, 48
577 ; RV64IMZB-NEXT:    srli a0, a0, 63
578 ; RV64IMZB-NEXT:    add a0, a1, a0
579 ; RV64IMZB-NEXT:    ret
580   %1 = sdiv i8 %a, 5
581   ret i8 %1
584 define i8 @sdiv8_constant_add_srai(i8 %a) nounwind {
585 ; RV32IM-LABEL: sdiv8_constant_add_srai:
586 ; RV32IM:       # %bb.0:
587 ; RV32IM-NEXT:    slli a1, a0, 24
588 ; RV32IM-NEXT:    srai a1, a1, 24
589 ; RV32IM-NEXT:    li a2, -109
590 ; RV32IM-NEXT:    mul a1, a1, a2
591 ; RV32IM-NEXT:    srli a1, a1, 8
592 ; RV32IM-NEXT:    add a0, a1, a0
593 ; RV32IM-NEXT:    slli a0, a0, 24
594 ; RV32IM-NEXT:    srli a1, a0, 31
595 ; RV32IM-NEXT:    srai a0, a0, 26
596 ; RV32IM-NEXT:    add a0, a0, a1
597 ; RV32IM-NEXT:    ret
599 ; RV32IMZB-LABEL: sdiv8_constant_add_srai:
600 ; RV32IMZB:       # %bb.0:
601 ; RV32IMZB-NEXT:    sext.b a1, a0
602 ; RV32IMZB-NEXT:    li a2, -109
603 ; RV32IMZB-NEXT:    mul a1, a1, a2
604 ; RV32IMZB-NEXT:    srli a1, a1, 8
605 ; RV32IMZB-NEXT:    add a0, a1, a0
606 ; RV32IMZB-NEXT:    slli a0, a0, 24
607 ; RV32IMZB-NEXT:    srli a1, a0, 31
608 ; RV32IMZB-NEXT:    srai a0, a0, 26
609 ; RV32IMZB-NEXT:    add a0, a0, a1
610 ; RV32IMZB-NEXT:    ret
612 ; RV64IM-LABEL: sdiv8_constant_add_srai:
613 ; RV64IM:       # %bb.0:
614 ; RV64IM-NEXT:    slli a1, a0, 56
615 ; RV64IM-NEXT:    srai a1, a1, 56
616 ; RV64IM-NEXT:    li a2, -109
617 ; RV64IM-NEXT:    mul a1, a1, a2
618 ; RV64IM-NEXT:    srli a1, a1, 8
619 ; RV64IM-NEXT:    add a0, a1, a0
620 ; RV64IM-NEXT:    slli a0, a0, 56
621 ; RV64IM-NEXT:    srli a1, a0, 63
622 ; RV64IM-NEXT:    srai a0, a0, 58
623 ; RV64IM-NEXT:    add a0, a0, a1
624 ; RV64IM-NEXT:    ret
626 ; RV64IMZB-LABEL: sdiv8_constant_add_srai:
627 ; RV64IMZB:       # %bb.0:
628 ; RV64IMZB-NEXT:    sext.b a1, a0
629 ; RV64IMZB-NEXT:    li a2, -109
630 ; RV64IMZB-NEXT:    mul a1, a1, a2
631 ; RV64IMZB-NEXT:    srli a1, a1, 8
632 ; RV64IMZB-NEXT:    add a0, a1, a0
633 ; RV64IMZB-NEXT:    slli a0, a0, 56
634 ; RV64IMZB-NEXT:    srli a1, a0, 63
635 ; RV64IMZB-NEXT:    srai a0, a0, 58
636 ; RV64IMZB-NEXT:    add a0, a0, a1
637 ; RV64IMZB-NEXT:    ret
638   %1 = sdiv i8 %a, 7
639   ret i8 %1
642 define i8 @sdiv8_constant_sub_srai(i8 %a) nounwind {
643 ; RV32IM-LABEL: sdiv8_constant_sub_srai:
644 ; RV32IM:       # %bb.0:
645 ; RV32IM-NEXT:    slli a1, a0, 24
646 ; RV32IM-NEXT:    srai a1, a1, 24
647 ; RV32IM-NEXT:    li a2, 109
648 ; RV32IM-NEXT:    mul a1, a1, a2
649 ; RV32IM-NEXT:    srli a1, a1, 8
650 ; RV32IM-NEXT:    sub a1, a1, a0
651 ; RV32IM-NEXT:    slli a1, a1, 24
652 ; RV32IM-NEXT:    srli a0, a1, 31
653 ; RV32IM-NEXT:    srai a1, a1, 26
654 ; RV32IM-NEXT:    add a0, a1, a0
655 ; RV32IM-NEXT:    ret
657 ; RV32IMZB-LABEL: sdiv8_constant_sub_srai:
658 ; RV32IMZB:       # %bb.0:
659 ; RV32IMZB-NEXT:    sext.b a1, a0
660 ; RV32IMZB-NEXT:    li a2, 109
661 ; RV32IMZB-NEXT:    mul a1, a1, a2
662 ; RV32IMZB-NEXT:    srli a1, a1, 8
663 ; RV32IMZB-NEXT:    sub a1, a1, a0
664 ; RV32IMZB-NEXT:    slli a1, a1, 24
665 ; RV32IMZB-NEXT:    srli a0, a1, 31
666 ; RV32IMZB-NEXT:    srai a1, a1, 26
667 ; RV32IMZB-NEXT:    add a0, a1, a0
668 ; RV32IMZB-NEXT:    ret
670 ; RV64IM-LABEL: sdiv8_constant_sub_srai:
671 ; RV64IM:       # %bb.0:
672 ; RV64IM-NEXT:    slli a1, a0, 56
673 ; RV64IM-NEXT:    srai a1, a1, 56
674 ; RV64IM-NEXT:    li a2, 109
675 ; RV64IM-NEXT:    mul a1, a1, a2
676 ; RV64IM-NEXT:    srli a1, a1, 8
677 ; RV64IM-NEXT:    subw a1, a1, a0
678 ; RV64IM-NEXT:    slli a1, a1, 56
679 ; RV64IM-NEXT:    srli a0, a1, 63
680 ; RV64IM-NEXT:    srai a1, a1, 58
681 ; RV64IM-NEXT:    add a0, a1, a0
682 ; RV64IM-NEXT:    ret
684 ; RV64IMZB-LABEL: sdiv8_constant_sub_srai:
685 ; RV64IMZB:       # %bb.0:
686 ; RV64IMZB-NEXT:    sext.b a1, a0
687 ; RV64IMZB-NEXT:    li a2, 109
688 ; RV64IMZB-NEXT:    mul a1, a1, a2
689 ; RV64IMZB-NEXT:    srli a1, a1, 8
690 ; RV64IMZB-NEXT:    subw a1, a1, a0
691 ; RV64IMZB-NEXT:    slli a1, a1, 56
692 ; RV64IMZB-NEXT:    srli a0, a1, 63
693 ; RV64IMZB-NEXT:    srai a1, a1, 58
694 ; RV64IMZB-NEXT:    add a0, a1, a0
695 ; RV64IMZB-NEXT:    ret
696   %1 = sdiv i8 %a, -7
697   ret i8 %1
700 define i16 @sdiv16_constant_no_srai(i16 %a) nounwind {
701 ; RV32IM-LABEL: sdiv16_constant_no_srai:
702 ; RV32IM:       # %bb.0:
703 ; RV32IM-NEXT:    slli a0, a0, 16
704 ; RV32IM-NEXT:    srai a0, a0, 16
705 ; RV32IM-NEXT:    lui a1, 5
706 ; RV32IM-NEXT:    addi a1, a1, 1366
707 ; RV32IM-NEXT:    mul a0, a0, a1
708 ; RV32IM-NEXT:    srli a1, a0, 31
709 ; RV32IM-NEXT:    srli a0, a0, 16
710 ; RV32IM-NEXT:    add a0, a0, a1
711 ; RV32IM-NEXT:    ret
713 ; RV32IMZB-LABEL: sdiv16_constant_no_srai:
714 ; RV32IMZB:       # %bb.0:
715 ; RV32IMZB-NEXT:    sext.h a0, a0
716 ; RV32IMZB-NEXT:    lui a1, 5
717 ; RV32IMZB-NEXT:    addi a1, a1, 1366
718 ; RV32IMZB-NEXT:    mul a0, a0, a1
719 ; RV32IMZB-NEXT:    srli a1, a0, 31
720 ; RV32IMZB-NEXT:    srli a0, a0, 16
721 ; RV32IMZB-NEXT:    add a0, a0, a1
722 ; RV32IMZB-NEXT:    ret
724 ; RV64IM-LABEL: sdiv16_constant_no_srai:
725 ; RV64IM:       # %bb.0:
726 ; RV64IM-NEXT:    slli a0, a0, 48
727 ; RV64IM-NEXT:    srai a0, a0, 48
728 ; RV64IM-NEXT:    lui a1, 5
729 ; RV64IM-NEXT:    addiw a1, a1, 1366
730 ; RV64IM-NEXT:    mul a0, a0, a1
731 ; RV64IM-NEXT:    srliw a1, a0, 31
732 ; RV64IM-NEXT:    srli a0, a0, 16
733 ; RV64IM-NEXT:    add a0, a0, a1
734 ; RV64IM-NEXT:    ret
736 ; RV64IMZB-LABEL: sdiv16_constant_no_srai:
737 ; RV64IMZB:       # %bb.0:
738 ; RV64IMZB-NEXT:    sext.h a0, a0
739 ; RV64IMZB-NEXT:    lui a1, 5
740 ; RV64IMZB-NEXT:    addiw a1, a1, 1366
741 ; RV64IMZB-NEXT:    mul a0, a0, a1
742 ; RV64IMZB-NEXT:    srliw a1, a0, 31
743 ; RV64IMZB-NEXT:    srli a0, a0, 16
744 ; RV64IMZB-NEXT:    add a0, a0, a1
745 ; RV64IMZB-NEXT:    ret
746   %1 = sdiv i16 %a, 3
747   ret i16 %1
750 define i16 @sdiv16_constant_srai(i16 %a) nounwind {
751 ; RV32IM-LABEL: sdiv16_constant_srai:
752 ; RV32IM:       # %bb.0:
753 ; RV32IM-NEXT:    slli a0, a0, 16
754 ; RV32IM-NEXT:    srai a0, a0, 16
755 ; RV32IM-NEXT:    lui a1, 6
756 ; RV32IM-NEXT:    addi a1, a1, 1639
757 ; RV32IM-NEXT:    mul a0, a0, a1
758 ; RV32IM-NEXT:    srli a1, a0, 31
759 ; RV32IM-NEXT:    srai a0, a0, 17
760 ; RV32IM-NEXT:    add a0, a0, a1
761 ; RV32IM-NEXT:    ret
763 ; RV32IMZB-LABEL: sdiv16_constant_srai:
764 ; RV32IMZB:       # %bb.0:
765 ; RV32IMZB-NEXT:    sext.h a0, a0
766 ; RV32IMZB-NEXT:    lui a1, 6
767 ; RV32IMZB-NEXT:    addi a1, a1, 1639
768 ; RV32IMZB-NEXT:    mul a0, a0, a1
769 ; RV32IMZB-NEXT:    srli a1, a0, 31
770 ; RV32IMZB-NEXT:    srai a0, a0, 17
771 ; RV32IMZB-NEXT:    add a0, a0, a1
772 ; RV32IMZB-NEXT:    ret
774 ; RV64IM-LABEL: sdiv16_constant_srai:
775 ; RV64IM:       # %bb.0:
776 ; RV64IM-NEXT:    slli a0, a0, 48
777 ; RV64IM-NEXT:    srai a0, a0, 48
778 ; RV64IM-NEXT:    lui a1, 6
779 ; RV64IM-NEXT:    addiw a1, a1, 1639
780 ; RV64IM-NEXT:    mul a0, a0, a1
781 ; RV64IM-NEXT:    srliw a1, a0, 31
782 ; RV64IM-NEXT:    srai a0, a0, 17
783 ; RV64IM-NEXT:    add a0, a0, a1
784 ; RV64IM-NEXT:    ret
786 ; RV64IMZB-LABEL: sdiv16_constant_srai:
787 ; RV64IMZB:       # %bb.0:
788 ; RV64IMZB-NEXT:    sext.h a0, a0
789 ; RV64IMZB-NEXT:    lui a1, 6
790 ; RV64IMZB-NEXT:    addiw a1, a1, 1639
791 ; RV64IMZB-NEXT:    mul a0, a0, a1
792 ; RV64IMZB-NEXT:    srliw a1, a0, 31
793 ; RV64IMZB-NEXT:    srai a0, a0, 17
794 ; RV64IMZB-NEXT:    add a0, a0, a1
795 ; RV64IMZB-NEXT:    ret
796   %1 = sdiv i16 %a, 5
797   ret i16 %1
800 define i16 @sdiv16_constant_add_srai(i16 %a) nounwind {
801 ; RV32IM-LABEL: sdiv16_constant_add_srai:
802 ; RV32IM:       # %bb.0:
803 ; RV32IM-NEXT:    slli a1, a0, 16
804 ; RV32IM-NEXT:    srai a1, a1, 16
805 ; RV32IM-NEXT:    lui a2, 1048569
806 ; RV32IM-NEXT:    addi a2, a2, -1911
807 ; RV32IM-NEXT:    mul a1, a1, a2
808 ; RV32IM-NEXT:    srli a1, a1, 16
809 ; RV32IM-NEXT:    add a0, a1, a0
810 ; RV32IM-NEXT:    slli a0, a0, 16
811 ; RV32IM-NEXT:    srli a1, a0, 31
812 ; RV32IM-NEXT:    srai a0, a0, 19
813 ; RV32IM-NEXT:    add a0, a0, a1
814 ; RV32IM-NEXT:    ret
816 ; RV32IMZB-LABEL: sdiv16_constant_add_srai:
817 ; RV32IMZB:       # %bb.0:
818 ; RV32IMZB-NEXT:    sext.h a1, a0
819 ; RV32IMZB-NEXT:    lui a2, 1048569
820 ; RV32IMZB-NEXT:    addi a2, a2, -1911
821 ; RV32IMZB-NEXT:    mul a1, a1, a2
822 ; RV32IMZB-NEXT:    srli a1, a1, 16
823 ; RV32IMZB-NEXT:    add a0, a1, a0
824 ; RV32IMZB-NEXT:    slli a0, a0, 16
825 ; RV32IMZB-NEXT:    srli a1, a0, 31
826 ; RV32IMZB-NEXT:    srai a0, a0, 19
827 ; RV32IMZB-NEXT:    add a0, a0, a1
828 ; RV32IMZB-NEXT:    ret
830 ; RV64IM-LABEL: sdiv16_constant_add_srai:
831 ; RV64IM:       # %bb.0:
832 ; RV64IM-NEXT:    slli a1, a0, 48
833 ; RV64IM-NEXT:    srai a1, a1, 48
834 ; RV64IM-NEXT:    lui a2, 1048569
835 ; RV64IM-NEXT:    addiw a2, a2, -1911
836 ; RV64IM-NEXT:    mul a1, a1, a2
837 ; RV64IM-NEXT:    srli a1, a1, 16
838 ; RV64IM-NEXT:    add a0, a1, a0
839 ; RV64IM-NEXT:    slli a0, a0, 48
840 ; RV64IM-NEXT:    srli a1, a0, 63
841 ; RV64IM-NEXT:    srai a0, a0, 51
842 ; RV64IM-NEXT:    add a0, a0, a1
843 ; RV64IM-NEXT:    ret
845 ; RV64IMZB-LABEL: sdiv16_constant_add_srai:
846 ; RV64IMZB:       # %bb.0:
847 ; RV64IMZB-NEXT:    sext.h a1, a0
848 ; RV64IMZB-NEXT:    lui a2, 1048569
849 ; RV64IMZB-NEXT:    addiw a2, a2, -1911
850 ; RV64IMZB-NEXT:    mul a1, a1, a2
851 ; RV64IMZB-NEXT:    srli a1, a1, 16
852 ; RV64IMZB-NEXT:    add a0, a1, a0
853 ; RV64IMZB-NEXT:    slli a0, a0, 48
854 ; RV64IMZB-NEXT:    srli a1, a0, 63
855 ; RV64IMZB-NEXT:    srai a0, a0, 51
856 ; RV64IMZB-NEXT:    add a0, a0, a1
857 ; RV64IMZB-NEXT:    ret
858   %1 = sdiv i16 %a, 15
859   ret i16 %1
862 define i16 @sdiv16_constant_sub_srai(i16 %a) nounwind {
863 ; RV32IM-LABEL: sdiv16_constant_sub_srai:
864 ; RV32IM:       # %bb.0:
865 ; RV32IM-NEXT:    slli a1, a0, 16
866 ; RV32IM-NEXT:    srai a1, a1, 16
867 ; RV32IM-NEXT:    lui a2, 7
868 ; RV32IM-NEXT:    addi a2, a2, 1911
869 ; RV32IM-NEXT:    mul a1, a1, a2
870 ; RV32IM-NEXT:    srli a1, a1, 16
871 ; RV32IM-NEXT:    sub a1, a1, a0
872 ; RV32IM-NEXT:    slli a1, a1, 16
873 ; RV32IM-NEXT:    srli a0, a1, 31
874 ; RV32IM-NEXT:    srai a1, a1, 19
875 ; RV32IM-NEXT:    add a0, a1, a0
876 ; RV32IM-NEXT:    ret
878 ; RV32IMZB-LABEL: sdiv16_constant_sub_srai:
879 ; RV32IMZB:       # %bb.0:
880 ; RV32IMZB-NEXT:    sext.h a1, a0
881 ; RV32IMZB-NEXT:    lui a2, 7
882 ; RV32IMZB-NEXT:    addi a2, a2, 1911
883 ; RV32IMZB-NEXT:    mul a1, a1, a2
884 ; RV32IMZB-NEXT:    srli a1, a1, 16
885 ; RV32IMZB-NEXT:    sub a1, a1, a0
886 ; RV32IMZB-NEXT:    slli a1, a1, 16
887 ; RV32IMZB-NEXT:    srli a0, a1, 31
888 ; RV32IMZB-NEXT:    srai a1, a1, 19
889 ; RV32IMZB-NEXT:    add a0, a1, a0
890 ; RV32IMZB-NEXT:    ret
892 ; RV64IM-LABEL: sdiv16_constant_sub_srai:
893 ; RV64IM:       # %bb.0:
894 ; RV64IM-NEXT:    slli a1, a0, 48
895 ; RV64IM-NEXT:    srai a1, a1, 48
896 ; RV64IM-NEXT:    lui a2, 7
897 ; RV64IM-NEXT:    addiw a2, a2, 1911
898 ; RV64IM-NEXT:    mul a1, a1, a2
899 ; RV64IM-NEXT:    srli a1, a1, 16
900 ; RV64IM-NEXT:    subw a1, a1, a0
901 ; RV64IM-NEXT:    slli a1, a1, 48
902 ; RV64IM-NEXT:    srli a0, a1, 63
903 ; RV64IM-NEXT:    srai a1, a1, 51
904 ; RV64IM-NEXT:    add a0, a1, a0
905 ; RV64IM-NEXT:    ret
907 ; RV64IMZB-LABEL: sdiv16_constant_sub_srai:
908 ; RV64IMZB:       # %bb.0:
909 ; RV64IMZB-NEXT:    sext.h a1, a0
910 ; RV64IMZB-NEXT:    lui a2, 7
911 ; RV64IMZB-NEXT:    addiw a2, a2, 1911
912 ; RV64IMZB-NEXT:    mul a1, a1, a2
913 ; RV64IMZB-NEXT:    srli a1, a1, 16
914 ; RV64IMZB-NEXT:    subw a1, a1, a0
915 ; RV64IMZB-NEXT:    slli a1, a1, 48
916 ; RV64IMZB-NEXT:    srli a0, a1, 63
917 ; RV64IMZB-NEXT:    srai a1, a1, 51
918 ; RV64IMZB-NEXT:    add a0, a1, a0
919 ; RV64IMZB-NEXT:    ret
920   %1 = sdiv i16 %a, -15
921   ret i16 %1