xref: /llvm-project/llvm/test/CodeGen/RISCV/div-by-constant.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
1f7b096d7SCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2f7b096d7SCraig Topper; RUN: llc -mtriple=riscv32 -mattr=+m -verify-machineinstrs < %s \
3f7b096d7SCraig Topper; RUN:   | FileCheck -check-prefixes=RV32,RV32IM %s
433d008b1SAlex Bradbury; RUN: llc -mtriple=riscv32 -mattr=+m,+zba,+zbb \
5f7b096d7SCraig Topper; RUN:    -verify-machineinstrs < %s \
6f7b096d7SCraig Topper; RUN:   | FileCheck -check-prefixes=RV32,RV32IMZB %s
7f7b096d7SCraig Topper; RUN: llc -mtriple=riscv64 -mattr=+m -verify-machineinstrs < %s \
8f7b096d7SCraig Topper; RUN:   | FileCheck -check-prefixes=RV64,RV64IM %s
933d008b1SAlex Bradbury; RUN: llc -mtriple=riscv64 -mattr=+m,+zba,+zbb \
10f7b096d7SCraig Topper; RUN:   -verify-machineinstrs < %s \
11f7b096d7SCraig Topper; RUN:   | FileCheck -check-prefixes=RV64,RV64IMZB %s
12f7b096d7SCraig Topper
13f7b096d7SCraig Topper; Test that there is a single shift after the mul and no addition.
14f7b096d7SCraig Topperdefine i32 @udiv_constant_no_add(i32 %a) nounwind {
15f7b096d7SCraig Topper; RV32-LABEL: udiv_constant_no_add:
16f7b096d7SCraig Topper; RV32:       # %bb.0:
17f7b096d7SCraig Topper; RV32-NEXT:    lui a1, 838861
18f7b096d7SCraig Topper; RV32-NEXT:    addi a1, a1, -819
19f7b096d7SCraig Topper; RV32-NEXT:    mulhu a0, a0, a1
20f7b096d7SCraig Topper; RV32-NEXT:    srli a0, a0, 2
21f7b096d7SCraig Topper; RV32-NEXT:    ret
22f7b096d7SCraig Topper;
2379016f6eSCraig Topper; RV64-LABEL: udiv_constant_no_add:
2479016f6eSCraig Topper; RV64:       # %bb.0:
2579016f6eSCraig Topper; RV64-NEXT:    slli a0, a0, 32
2679016f6eSCraig Topper; RV64-NEXT:    lui a1, 838861
2786240751SPhilip Reames; RV64-NEXT:    addi a1, a1, -819
2879016f6eSCraig Topper; RV64-NEXT:    slli a1, a1, 32
2979016f6eSCraig Topper; RV64-NEXT:    mulhu a0, a0, a1
3079016f6eSCraig Topper; RV64-NEXT:    srli a0, a0, 34
3179016f6eSCraig Topper; RV64-NEXT:    ret
32f7b096d7SCraig Topper  %1 = udiv i32 %a, 5
33f7b096d7SCraig Topper  ret i32 %1
34f7b096d7SCraig Topper}
35f7b096d7SCraig Topper
36f7b096d7SCraig Topper; This constant requires a sub, shrli, add sequence after the mul.
37f7b096d7SCraig Topperdefine i32 @udiv_constant_add(i32 %a) nounwind {
38f7b096d7SCraig Topper; RV32-LABEL: udiv_constant_add:
39f7b096d7SCraig Topper; RV32:       # %bb.0:
40f7b096d7SCraig Topper; RV32-NEXT:    lui a1, 149797
41f7b096d7SCraig Topper; RV32-NEXT:    addi a1, a1, -1755
42f7b096d7SCraig Topper; RV32-NEXT:    mulhu a1, a0, a1
43f7b096d7SCraig Topper; RV32-NEXT:    sub a0, a0, a1
44f7b096d7SCraig Topper; RV32-NEXT:    srli a0, a0, 1
45f7b096d7SCraig Topper; RV32-NEXT:    add a0, a0, a1
46f7b096d7SCraig Topper; RV32-NEXT:    srli a0, a0, 2
47f7b096d7SCraig Topper; RV32-NEXT:    ret
48f7b096d7SCraig Topper;
49cbbcb10eSCraig Topper; RV64IM-LABEL: udiv_constant_add:
50cbbcb10eSCraig Topper; RV64IM:       # %bb.0:
51cbbcb10eSCraig Topper; RV64IM-NEXT:    slli a1, a0, 32
52cbbcb10eSCraig Topper; RV64IM-NEXT:    lui a2, 149797
5386240751SPhilip Reames; RV64IM-NEXT:    addi a2, a2, -1755
54cbbcb10eSCraig Topper; RV64IM-NEXT:    slli a2, a2, 32
55cbbcb10eSCraig Topper; RV64IM-NEXT:    mulhu a1, a1, a2
56cbbcb10eSCraig Topper; RV64IM-NEXT:    srli a1, a1, 32
57cbbcb10eSCraig Topper; RV64IM-NEXT:    subw a0, a0, a1
58cbbcb10eSCraig Topper; RV64IM-NEXT:    srliw a0, a0, 1
59cbbcb10eSCraig Topper; RV64IM-NEXT:    add a0, a0, a1
60cbbcb10eSCraig Topper; RV64IM-NEXT:    srli a0, a0, 2
61cbbcb10eSCraig Topper; RV64IM-NEXT:    ret
62cbbcb10eSCraig Topper;
63cbbcb10eSCraig Topper; RV64IMZB-LABEL: udiv_constant_add:
64cbbcb10eSCraig Topper; RV64IMZB:       # %bb.0:
65cbbcb10eSCraig Topper; RV64IMZB-NEXT:    zext.w a1, a0
66cbbcb10eSCraig Topper; RV64IMZB-NEXT:    lui a2, 149797
67cbbcb10eSCraig Topper; RV64IMZB-NEXT:    addiw a2, a2, -1755
68cbbcb10eSCraig Topper; RV64IMZB-NEXT:    mul a1, a1, a2
69cbbcb10eSCraig Topper; RV64IMZB-NEXT:    srli a1, a1, 32
70cbbcb10eSCraig Topper; RV64IMZB-NEXT:    subw a0, a0, a1
71cbbcb10eSCraig Topper; RV64IMZB-NEXT:    srliw a0, a0, 1
72cbbcb10eSCraig Topper; RV64IMZB-NEXT:    add a0, a0, a1
73cbbcb10eSCraig Topper; RV64IMZB-NEXT:    srli a0, a0, 2
74cbbcb10eSCraig Topper; RV64IMZB-NEXT:    ret
75f7b096d7SCraig Topper  %1 = udiv i32 %a, 7
76f7b096d7SCraig Topper  ret i32 %1
77f7b096d7SCraig Topper}
78f7b096d7SCraig Topper
79f7b096d7SCraig Topperdefine i64 @udiv64_constant_no_add(i64 %a) nounwind {
80f7b096d7SCraig Topper; RV32-LABEL: udiv64_constant_no_add:
81f7b096d7SCraig Topper; RV32:       # %bb.0:
8238ffa2bbSCraig Topper; RV32-NEXT:    add a2, a0, a1
8338ffa2bbSCraig Topper; RV32-NEXT:    lui a3, 838861
84*9122c523SPengcheng Wang; RV32-NEXT:    sltu a4, a2, a0
85*9122c523SPengcheng Wang; RV32-NEXT:    addi a5, a3, -819
8638ffa2bbSCraig Topper; RV32-NEXT:    addi a3, a3, -820
87*9122c523SPengcheng Wang; RV32-NEXT:    add a2, a2, a4
88*9122c523SPengcheng Wang; RV32-NEXT:    mulhu a4, a2, a5
89*9122c523SPengcheng Wang; RV32-NEXT:    srli a6, a4, 2
90*9122c523SPengcheng Wang; RV32-NEXT:    andi a4, a4, -4
91*9122c523SPengcheng Wang; RV32-NEXT:    add a4, a4, a6
92*9122c523SPengcheng Wang; RV32-NEXT:    sub a2, a2, a4
93*9122c523SPengcheng Wang; RV32-NEXT:    sub a4, a0, a2
9438ffa2bbSCraig Topper; RV32-NEXT:    sltu a0, a0, a2
95*9122c523SPengcheng Wang; RV32-NEXT:    mul a2, a4, a3
96*9122c523SPengcheng Wang; RV32-NEXT:    mulhu a3, a4, a5
97e00e20a0SCraig Topper; RV32-NEXT:    sub a1, a1, a0
98*9122c523SPengcheng Wang; RV32-NEXT:    add a2, a3, a2
99*9122c523SPengcheng Wang; RV32-NEXT:    mul a1, a1, a5
100*9122c523SPengcheng Wang; RV32-NEXT:    add a1, a2, a1
101*9122c523SPengcheng Wang; RV32-NEXT:    mul a0, a4, a5
102f7b096d7SCraig Topper; RV32-NEXT:    ret
103f7b096d7SCraig Topper;
104f7b096d7SCraig Topper; RV64-LABEL: udiv64_constant_no_add:
105f7b096d7SCraig Topper; RV64:       # %bb.0:
10638f7c7ebSFlorian Mayer; RV64-NEXT:    lui a1, 838861
10738f7c7ebSFlorian Mayer; RV64-NEXT:    addiw a1, a1, -819
10838f7c7ebSFlorian Mayer; RV64-NEXT:    slli a2, a1, 32
10938f7c7ebSFlorian Mayer; RV64-NEXT:    add a1, a1, a2
110f7b096d7SCraig Topper; RV64-NEXT:    mulhu a0, a0, a1
111f7b096d7SCraig Topper; RV64-NEXT:    srli a0, a0, 2
112f7b096d7SCraig Topper; RV64-NEXT:    ret
113f7b096d7SCraig Topper  %1 = udiv i64 %a, 5
114f7b096d7SCraig Topper  ret i64 %1
115f7b096d7SCraig Topper}
116f7b096d7SCraig Topper
117f7b096d7SCraig Topperdefine i64 @udiv64_constant_add(i64 %a) nounwind {
118f7b096d7SCraig Topper; RV32-LABEL: udiv64_constant_add:
119f7b096d7SCraig Topper; RV32:       # %bb.0:
120f7b096d7SCraig Topper; RV32-NEXT:    addi sp, sp, -16
121f7b096d7SCraig Topper; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
122f7b096d7SCraig Topper; RV32-NEXT:    li a2, 7
123f7b096d7SCraig Topper; RV32-NEXT:    li a3, 0
124eabaee0cSFangrui Song; RV32-NEXT:    call __udivdi3
125f7b096d7SCraig Topper; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
126f7b096d7SCraig Topper; RV32-NEXT:    addi sp, sp, 16
127f7b096d7SCraig Topper; RV32-NEXT:    ret
128f7b096d7SCraig Topper;
129f7b096d7SCraig Topper; RV64-LABEL: udiv64_constant_add:
130f7b096d7SCraig Topper; RV64:       # %bb.0:
13141454ab2Swangpc; RV64-NEXT:    lui a1, %hi(.LCPI3_0)
13241454ab2Swangpc; RV64-NEXT:    ld a1, %lo(.LCPI3_0)(a1)
133f7b096d7SCraig Topper; RV64-NEXT:    mulhu a1, a0, a1
134f7b096d7SCraig Topper; RV64-NEXT:    sub a0, a0, a1
135f7b096d7SCraig Topper; RV64-NEXT:    srli a0, a0, 1
136f7b096d7SCraig Topper; RV64-NEXT:    add a0, a0, a1
137f7b096d7SCraig Topper; RV64-NEXT:    srli a0, a0, 2
138f7b096d7SCraig Topper; RV64-NEXT:    ret
139f7b096d7SCraig Topper  %1 = udiv i64 %a, 7
140f7b096d7SCraig Topper  ret i64 %1
141f7b096d7SCraig Topper}
142f7b096d7SCraig Topper
143f7b096d7SCraig Topperdefine i8 @udiv8_constant_no_add(i8 %a) nounwind {
144f7b096d7SCraig Topper; RV32-LABEL: udiv8_constant_no_add:
145f7b096d7SCraig Topper; RV32:       # %bb.0:
146f7b096d7SCraig Topper; RV32-NEXT:    andi a0, a0, 255
147f7b096d7SCraig Topper; RV32-NEXT:    li a1, 205
148f7b096d7SCraig Topper; RV32-NEXT:    mul a0, a0, a1
149f7b096d7SCraig Topper; RV32-NEXT:    srli a0, a0, 10
150f7b096d7SCraig Topper; RV32-NEXT:    ret
151f7b096d7SCraig Topper;
152f7b096d7SCraig Topper; RV64-LABEL: udiv8_constant_no_add:
153f7b096d7SCraig Topper; RV64:       # %bb.0:
154f7b096d7SCraig Topper; RV64-NEXT:    andi a0, a0, 255
155f7b096d7SCraig Topper; RV64-NEXT:    li a1, 205
156f7b096d7SCraig Topper; RV64-NEXT:    mul a0, a0, a1
157f7b096d7SCraig Topper; RV64-NEXT:    srli a0, a0, 10
158f7b096d7SCraig Topper; RV64-NEXT:    ret
159f7b096d7SCraig Topper  %1 = udiv i8 %a, 5
160f7b096d7SCraig Topper  ret i8 %1
161f7b096d7SCraig Topper}
162f7b096d7SCraig Topper
163f7b096d7SCraig Topperdefine i8 @udiv8_constant_add(i8 %a) nounwind {
164f7b096d7SCraig Topper; RV32IM-LABEL: udiv8_constant_add:
165f7b096d7SCraig Topper; RV32IM:       # %bb.0:
166f7b096d7SCraig Topper; RV32IM-NEXT:    andi a1, a0, 255
167f7b096d7SCraig Topper; RV32IM-NEXT:    li a2, 37
168f7b096d7SCraig Topper; RV32IM-NEXT:    mul a1, a1, a2
169f7b096d7SCraig Topper; RV32IM-NEXT:    srli a1, a1, 8
170f7b096d7SCraig Topper; RV32IM-NEXT:    sub a0, a0, a1
171b645bcd9SCraig Topper; RV32IM-NEXT:    slli a0, a0, 24
172b645bcd9SCraig Topper; RV32IM-NEXT:    srli a0, a0, 25
173f7b096d7SCraig Topper; RV32IM-NEXT:    add a0, a0, a1
174f7b096d7SCraig Topper; RV32IM-NEXT:    srli a0, a0, 2
175f7b096d7SCraig Topper; RV32IM-NEXT:    ret
176f7b096d7SCraig Topper;
177f7b096d7SCraig Topper; RV32IMZB-LABEL: udiv8_constant_add:
178f7b096d7SCraig Topper; RV32IMZB:       # %bb.0:
179f7b096d7SCraig Topper; RV32IMZB-NEXT:    andi a1, a0, 255
180f7b096d7SCraig Topper; RV32IMZB-NEXT:    sh3add a2, a1, a1
181f7b096d7SCraig Topper; RV32IMZB-NEXT:    sh2add a1, a2, a1
182f7b096d7SCraig Topper; RV32IMZB-NEXT:    srli a1, a1, 8
183f7b096d7SCraig Topper; RV32IMZB-NEXT:    sub a0, a0, a1
184b645bcd9SCraig Topper; RV32IMZB-NEXT:    slli a0, a0, 24
185b645bcd9SCraig Topper; RV32IMZB-NEXT:    srli a0, a0, 25
186f7b096d7SCraig Topper; RV32IMZB-NEXT:    add a0, a0, a1
187f7b096d7SCraig Topper; RV32IMZB-NEXT:    srli a0, a0, 2
188f7b096d7SCraig Topper; RV32IMZB-NEXT:    ret
189f7b096d7SCraig Topper;
190f7b096d7SCraig Topper; RV64IM-LABEL: udiv8_constant_add:
191f7b096d7SCraig Topper; RV64IM:       # %bb.0:
192f7b096d7SCraig Topper; RV64IM-NEXT:    andi a1, a0, 255
193f7b096d7SCraig Topper; RV64IM-NEXT:    li a2, 37
194f7b096d7SCraig Topper; RV64IM-NEXT:    mul a1, a1, a2
195f7b096d7SCraig Topper; RV64IM-NEXT:    srli a1, a1, 8
196015ff729SCraig Topper; RV64IM-NEXT:    subw a0, a0, a1
197b645bcd9SCraig Topper; RV64IM-NEXT:    slli a0, a0, 56
198b645bcd9SCraig Topper; RV64IM-NEXT:    srli a0, a0, 57
199f7b096d7SCraig Topper; RV64IM-NEXT:    add a0, a0, a1
200f7b096d7SCraig Topper; RV64IM-NEXT:    srli a0, a0, 2
201f7b096d7SCraig Topper; RV64IM-NEXT:    ret
202f7b096d7SCraig Topper;
203f7b096d7SCraig Topper; RV64IMZB-LABEL: udiv8_constant_add:
204f7b096d7SCraig Topper; RV64IMZB:       # %bb.0:
205f7b096d7SCraig Topper; RV64IMZB-NEXT:    andi a1, a0, 255
206f7b096d7SCraig Topper; RV64IMZB-NEXT:    sh3add a2, a1, a1
207f7b096d7SCraig Topper; RV64IMZB-NEXT:    sh2add a1, a2, a1
208f7b096d7SCraig Topper; RV64IMZB-NEXT:    srli a1, a1, 8
209015ff729SCraig Topper; RV64IMZB-NEXT:    subw a0, a0, a1
210b645bcd9SCraig Topper; RV64IMZB-NEXT:    slli a0, a0, 56
211b645bcd9SCraig Topper; RV64IMZB-NEXT:    srli a0, a0, 57
212f7b096d7SCraig Topper; RV64IMZB-NEXT:    add a0, a0, a1
213f7b096d7SCraig Topper; RV64IMZB-NEXT:    srli a0, a0, 2
214f7b096d7SCraig Topper; RV64IMZB-NEXT:    ret
215f7b096d7SCraig Topper  %1 = udiv i8 %a, 7
216f7b096d7SCraig Topper  ret i8 %1
217f7b096d7SCraig Topper}
218f7b096d7SCraig Topper
219f7b096d7SCraig Topperdefine i16 @udiv16_constant_no_add(i16 %a) nounwind {
22079016f6eSCraig Topper; RV32-LABEL: udiv16_constant_no_add:
22179016f6eSCraig Topper; RV32:       # %bb.0:
22279016f6eSCraig Topper; RV32-NEXT:    slli a0, a0, 16
22379016f6eSCraig Topper; RV32-NEXT:    lui a1, 838864
22479016f6eSCraig Topper; RV32-NEXT:    mulhu a0, a0, a1
22579016f6eSCraig Topper; RV32-NEXT:    srli a0, a0, 18
22679016f6eSCraig Topper; RV32-NEXT:    ret
227f7b096d7SCraig Topper;
22879016f6eSCraig Topper; RV64-LABEL: udiv16_constant_no_add:
22979016f6eSCraig Topper; RV64:       # %bb.0:
23079016f6eSCraig Topper; RV64-NEXT:    lui a1, 52429
23179016f6eSCraig Topper; RV64-NEXT:    slli a1, a1, 4
23279016f6eSCraig Topper; RV64-NEXT:    slli a0, a0, 48
23379016f6eSCraig Topper; RV64-NEXT:    mulhu a0, a0, a1
23479016f6eSCraig Topper; RV64-NEXT:    srli a0, a0, 18
23579016f6eSCraig Topper; RV64-NEXT:    ret
236f7b096d7SCraig Topper  %1 = udiv i16 %a, 5
237f7b096d7SCraig Topper  ret i16 %1
238f7b096d7SCraig Topper}
239f7b096d7SCraig Topper
240f7b096d7SCraig Topperdefine i16 @udiv16_constant_add(i16 %a) nounwind {
24179016f6eSCraig Topper; RV32-LABEL: udiv16_constant_add:
24279016f6eSCraig Topper; RV32:       # %bb.0:
24379016f6eSCraig Topper; RV32-NEXT:    slli a1, a0, 16
24479016f6eSCraig Topper; RV32-NEXT:    lui a2, 149808
24579016f6eSCraig Topper; RV32-NEXT:    mulhu a1, a1, a2
24679016f6eSCraig Topper; RV32-NEXT:    srli a1, a1, 16
24779016f6eSCraig Topper; RV32-NEXT:    sub a0, a0, a1
24879016f6eSCraig Topper; RV32-NEXT:    slli a0, a0, 16
24979016f6eSCraig Topper; RV32-NEXT:    srli a0, a0, 17
25079016f6eSCraig Topper; RV32-NEXT:    add a0, a0, a1
25179016f6eSCraig Topper; RV32-NEXT:    srli a0, a0, 2
25279016f6eSCraig Topper; RV32-NEXT:    ret
253f7b096d7SCraig Topper;
25479016f6eSCraig Topper; RV64-LABEL: udiv16_constant_add:
25579016f6eSCraig Topper; RV64:       # %bb.0:
25679016f6eSCraig Topper; RV64-NEXT:    slli a1, a0, 48
25779016f6eSCraig Topper; RV64-NEXT:    lui a2, 149808
25879016f6eSCraig Topper; RV64-NEXT:    mulhu a1, a1, a2
25979016f6eSCraig Topper; RV64-NEXT:    srli a1, a1, 16
26079016f6eSCraig Topper; RV64-NEXT:    subw a0, a0, a1
26179016f6eSCraig Topper; RV64-NEXT:    slli a0, a0, 48
26279016f6eSCraig Topper; RV64-NEXT:    srli a0, a0, 49
26379016f6eSCraig Topper; RV64-NEXT:    add a0, a0, a1
26479016f6eSCraig Topper; RV64-NEXT:    srli a0, a0, 2
26579016f6eSCraig Topper; RV64-NEXT:    ret
266f7b096d7SCraig Topper  %1 = udiv i16 %a, 7
267f7b096d7SCraig Topper  ret i16 %1
268f7b096d7SCraig Topper}
269f7b096d7SCraig Topper
270f7b096d7SCraig Topper; Test the simplest case a srli and an add after the mul. No srai.
271f7b096d7SCraig Topperdefine i32 @sdiv_constant_no_srai(i32 %a) nounwind {
272f7b096d7SCraig Topper; RV32-LABEL: sdiv_constant_no_srai:
273f7b096d7SCraig Topper; RV32:       # %bb.0:
274f7b096d7SCraig Topper; RV32-NEXT:    lui a1, 349525
275f7b096d7SCraig Topper; RV32-NEXT:    addi a1, a1, 1366
276f7b096d7SCraig Topper; RV32-NEXT:    mulh a0, a0, a1
277f7b096d7SCraig Topper; RV32-NEXT:    srli a1, a0, 31
278f7b096d7SCraig Topper; RV32-NEXT:    add a0, a0, a1
279f7b096d7SCraig Topper; RV32-NEXT:    ret
280f7b096d7SCraig Topper;
281f7b096d7SCraig Topper; RV64-LABEL: sdiv_constant_no_srai:
282f7b096d7SCraig Topper; RV64:       # %bb.0:
283f7b096d7SCraig Topper; RV64-NEXT:    sext.w a0, a0
284f7b096d7SCraig Topper; RV64-NEXT:    lui a1, 349525
285f7b096d7SCraig Topper; RV64-NEXT:    addiw a1, a1, 1366
286f7b096d7SCraig Topper; RV64-NEXT:    mul a0, a0, a1
287f7b096d7SCraig Topper; RV64-NEXT:    srli a1, a0, 63
288f7b096d7SCraig Topper; RV64-NEXT:    srli a0, a0, 32
289f7b096d7SCraig Topper; RV64-NEXT:    addw a0, a0, a1
290f7b096d7SCraig Topper; RV64-NEXT:    ret
291f7b096d7SCraig Topper  %1 = sdiv i32 %a, 3
292f7b096d7SCraig Topper  ret i32 %1
293f7b096d7SCraig Topper}
294f7b096d7SCraig Topper
295f7b096d7SCraig Topper; This constant requires an srai between the mul and the add.
296f7b096d7SCraig Topperdefine i32 @sdiv_constant_srai(i32 %a) nounwind {
297f7b096d7SCraig Topper; RV32-LABEL: sdiv_constant_srai:
298f7b096d7SCraig Topper; RV32:       # %bb.0:
299f7b096d7SCraig Topper; RV32-NEXT:    lui a1, 419430
300f7b096d7SCraig Topper; RV32-NEXT:    addi a1, a1, 1639
301f7b096d7SCraig Topper; RV32-NEXT:    mulh a0, a0, a1
302f7b096d7SCraig Topper; RV32-NEXT:    srli a1, a0, 31
303f7b096d7SCraig Topper; RV32-NEXT:    srai a0, a0, 1
304f7b096d7SCraig Topper; RV32-NEXT:    add a0, a0, a1
305f7b096d7SCraig Topper; RV32-NEXT:    ret
306f7b096d7SCraig Topper;
307f7b096d7SCraig Topper; RV64-LABEL: sdiv_constant_srai:
308f7b096d7SCraig Topper; RV64:       # %bb.0:
309f7b096d7SCraig Topper; RV64-NEXT:    sext.w a0, a0
310f7b096d7SCraig Topper; RV64-NEXT:    lui a1, 419430
311f7b096d7SCraig Topper; RV64-NEXT:    addiw a1, a1, 1639
312f7b096d7SCraig Topper; RV64-NEXT:    mul a0, a0, a1
313f7b096d7SCraig Topper; RV64-NEXT:    srli a1, a0, 63
314f7b096d7SCraig Topper; RV64-NEXT:    srai a0, a0, 33
315f7b096d7SCraig Topper; RV64-NEXT:    add a0, a0, a1
316f7b096d7SCraig Topper; RV64-NEXT:    ret
317f7b096d7SCraig Topper  %1 = sdiv i32 %a, 5
318f7b096d7SCraig Topper  ret i32 %1
319f7b096d7SCraig Topper}
320f7b096d7SCraig Topper
321f7b096d7SCraig Topper; This constant requires an add and an srai after the mul.
322f7b096d7SCraig Topperdefine i32 @sdiv_constant_add_srai(i32 %a) nounwind {
323f7b096d7SCraig Topper; RV32-LABEL: sdiv_constant_add_srai:
324f7b096d7SCraig Topper; RV32:       # %bb.0:
325f7b096d7SCraig Topper; RV32-NEXT:    lui a1, 599186
326f7b096d7SCraig Topper; RV32-NEXT:    addi a1, a1, 1171
327f7b096d7SCraig Topper; RV32-NEXT:    mulh a1, a0, a1
328f7b096d7SCraig Topper; RV32-NEXT:    add a0, a1, a0
329f7b096d7SCraig Topper; RV32-NEXT:    srli a1, a0, 31
330f7b096d7SCraig Topper; RV32-NEXT:    srai a0, a0, 2
331f7b096d7SCraig Topper; RV32-NEXT:    add a0, a0, a1
332f7b096d7SCraig Topper; RV32-NEXT:    ret
333f7b096d7SCraig Topper;
334f7b096d7SCraig Topper; RV64-LABEL: sdiv_constant_add_srai:
335f7b096d7SCraig Topper; RV64:       # %bb.0:
336f7b096d7SCraig Topper; RV64-NEXT:    sext.w a1, a0
337f7b096d7SCraig Topper; RV64-NEXT:    lui a2, 599186
338f7b096d7SCraig Topper; RV64-NEXT:    addiw a2, a2, 1171
339f7b096d7SCraig Topper; RV64-NEXT:    mul a1, a1, a2
340f7b096d7SCraig Topper; RV64-NEXT:    srli a1, a1, 32
341d64d3c5aSNitin John Raj; RV64-NEXT:    add a0, a1, a0
342f7b096d7SCraig Topper; RV64-NEXT:    srliw a1, a0, 31
343f7b096d7SCraig Topper; RV64-NEXT:    sraiw a0, a0, 2
344f7b096d7SCraig Topper; RV64-NEXT:    add a0, a0, a1
345f7b096d7SCraig Topper; RV64-NEXT:    ret
346f7b096d7SCraig Topper  %1 = sdiv i32 %a, 7
347f7b096d7SCraig Topper  ret i32 %1
348f7b096d7SCraig Topper}
349f7b096d7SCraig Topper
350f7b096d7SCraig Topper; This constant requires a sub and an srai after the mul.
351f7b096d7SCraig Topperdefine i32 @sdiv_constant_sub_srai(i32 %a) nounwind {
352f7b096d7SCraig Topper; RV32-LABEL: sdiv_constant_sub_srai:
353f7b096d7SCraig Topper; RV32:       # %bb.0:
354f7b096d7SCraig Topper; RV32-NEXT:    lui a1, 449390
355f7b096d7SCraig Topper; RV32-NEXT:    addi a1, a1, -1171
356f7b096d7SCraig Topper; RV32-NEXT:    mulh a1, a0, a1
357e00e20a0SCraig Topper; RV32-NEXT:    sub a1, a1, a0
358e00e20a0SCraig Topper; RV32-NEXT:    srli a0, a1, 31
359e00e20a0SCraig Topper; RV32-NEXT:    srai a1, a1, 2
360e00e20a0SCraig Topper; RV32-NEXT:    add a0, a1, a0
361f7b096d7SCraig Topper; RV32-NEXT:    ret
362f7b096d7SCraig Topper;
363f7b096d7SCraig Topper; RV64-LABEL: sdiv_constant_sub_srai:
364f7b096d7SCraig Topper; RV64:       # %bb.0:
365f7b096d7SCraig Topper; RV64-NEXT:    sext.w a1, a0
366f7b096d7SCraig Topper; RV64-NEXT:    lui a2, 449390
367f7b096d7SCraig Topper; RV64-NEXT:    addiw a2, a2, -1171
368f7b096d7SCraig Topper; RV64-NEXT:    mul a1, a1, a2
369f7b096d7SCraig Topper; RV64-NEXT:    srli a1, a1, 32
370e00e20a0SCraig Topper; RV64-NEXT:    subw a1, a1, a0
371e00e20a0SCraig Topper; RV64-NEXT:    srliw a0, a1, 31
372e00e20a0SCraig Topper; RV64-NEXT:    sraiw a1, a1, 2
373e00e20a0SCraig Topper; RV64-NEXT:    add a0, a1, a0
374f7b096d7SCraig Topper; RV64-NEXT:    ret
375f7b096d7SCraig Topper  %1 = sdiv i32 %a, -7
376f7b096d7SCraig Topper  ret i32 %1
377f7b096d7SCraig Topper}
378f7b096d7SCraig Topper
379f7b096d7SCraig Topperdefine i64 @sdiv64_constant_no_srai(i64 %a) nounwind {
380f7b096d7SCraig Topper; RV32-LABEL: sdiv64_constant_no_srai:
381f7b096d7SCraig Topper; RV32:       # %bb.0:
382f7b096d7SCraig Topper; RV32-NEXT:    addi sp, sp, -16
383f7b096d7SCraig Topper; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
384f7b096d7SCraig Topper; RV32-NEXT:    li a2, 3
385f7b096d7SCraig Topper; RV32-NEXT:    li a3, 0
386eabaee0cSFangrui Song; RV32-NEXT:    call __divdi3
387f7b096d7SCraig Topper; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
388f7b096d7SCraig Topper; RV32-NEXT:    addi sp, sp, 16
389f7b096d7SCraig Topper; RV32-NEXT:    ret
390f7b096d7SCraig Topper;
391f7b096d7SCraig Topper; RV64-LABEL: sdiv64_constant_no_srai:
392f7b096d7SCraig Topper; RV64:       # %bb.0:
39341454ab2Swangpc; RV64-NEXT:    lui a1, %hi(.LCPI12_0)
39441454ab2Swangpc; RV64-NEXT:    ld a1, %lo(.LCPI12_0)(a1)
395f7b096d7SCraig Topper; RV64-NEXT:    mulh a0, a0, a1
396f7b096d7SCraig Topper; RV64-NEXT:    srli a1, a0, 63
397f7b096d7SCraig Topper; RV64-NEXT:    add a0, a0, a1
398f7b096d7SCraig Topper; RV64-NEXT:    ret
399f7b096d7SCraig Topper  %1 = sdiv i64 %a, 3
400f7b096d7SCraig Topper  ret i64 %1
401f7b096d7SCraig Topper}
402f7b096d7SCraig Topper
403f7b096d7SCraig Topperdefine i64 @sdiv64_constant_srai(i64 %a) nounwind {
404f7b096d7SCraig Topper; RV32-LABEL: sdiv64_constant_srai:
405f7b096d7SCraig Topper; RV32:       # %bb.0:
406f7b096d7SCraig Topper; RV32-NEXT:    addi sp, sp, -16
407f7b096d7SCraig Topper; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
408f7b096d7SCraig Topper; RV32-NEXT:    li a2, 5
409f7b096d7SCraig Topper; RV32-NEXT:    li a3, 0
410eabaee0cSFangrui Song; RV32-NEXT:    call __divdi3
411f7b096d7SCraig Topper; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
412f7b096d7SCraig Topper; RV32-NEXT:    addi sp, sp, 16
413f7b096d7SCraig Topper; RV32-NEXT:    ret
414f7b096d7SCraig Topper;
415f7b096d7SCraig Topper; RV64-LABEL: sdiv64_constant_srai:
416f7b096d7SCraig Topper; RV64:       # %bb.0:
41741454ab2Swangpc; RV64-NEXT:    lui a1, %hi(.LCPI13_0)
41841454ab2Swangpc; RV64-NEXT:    ld a1, %lo(.LCPI13_0)(a1)
419f7b096d7SCraig Topper; RV64-NEXT:    mulh a0, a0, a1
420f7b096d7SCraig Topper; RV64-NEXT:    srli a1, a0, 63
421f7b096d7SCraig Topper; RV64-NEXT:    srai a0, a0, 1
422f7b096d7SCraig Topper; RV64-NEXT:    add a0, a0, a1
423f7b096d7SCraig Topper; RV64-NEXT:    ret
424f7b096d7SCraig Topper  %1 = sdiv i64 %a, 5
425f7b096d7SCraig Topper  ret i64 %1
426f7b096d7SCraig Topper}
427f7b096d7SCraig Topper
428f7b096d7SCraig Topperdefine i64 @sdiv64_constant_add_srai(i64 %a) nounwind {
429f7b096d7SCraig Topper; RV32-LABEL: sdiv64_constant_add_srai:
430f7b096d7SCraig Topper; RV32:       # %bb.0:
431f7b096d7SCraig Topper; RV32-NEXT:    addi sp, sp, -16
432f7b096d7SCraig Topper; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
433f7b096d7SCraig Topper; RV32-NEXT:    li a2, 15
434f7b096d7SCraig Topper; RV32-NEXT:    li a3, 0
435eabaee0cSFangrui Song; RV32-NEXT:    call __divdi3
436f7b096d7SCraig Topper; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
437f7b096d7SCraig Topper; RV32-NEXT:    addi sp, sp, 16
438f7b096d7SCraig Topper; RV32-NEXT:    ret
439f7b096d7SCraig Topper;
440f7b096d7SCraig Topper; RV64-LABEL: sdiv64_constant_add_srai:
441f7b096d7SCraig Topper; RV64:       # %bb.0:
44238f7c7ebSFlorian Mayer; RV64-NEXT:    lui a1, 559241
44338f7c7ebSFlorian Mayer; RV64-NEXT:    addiw a1, a1, -1911
44438f7c7ebSFlorian Mayer; RV64-NEXT:    slli a2, a1, 32
44538f7c7ebSFlorian Mayer; RV64-NEXT:    add a1, a1, a2
446f7b096d7SCraig Topper; RV64-NEXT:    mulh a1, a0, a1
447f7b096d7SCraig Topper; RV64-NEXT:    add a0, a1, a0
448f7b096d7SCraig Topper; RV64-NEXT:    srli a1, a0, 63
449f7b096d7SCraig Topper; RV64-NEXT:    srai a0, a0, 3
450f7b096d7SCraig Topper; RV64-NEXT:    add a0, a0, a1
451f7b096d7SCraig Topper; RV64-NEXT:    ret
452f7b096d7SCraig Topper  %1 = sdiv i64 %a, 15
453f7b096d7SCraig Topper  ret i64 %1
454f7b096d7SCraig Topper}
455f7b096d7SCraig Topper
456f7b096d7SCraig Topperdefine i64 @sdiv64_constant_sub_srai(i64 %a) nounwind {
457f7b096d7SCraig Topper; RV32-LABEL: sdiv64_constant_sub_srai:
458f7b096d7SCraig Topper; RV32:       # %bb.0:
459f7b096d7SCraig Topper; RV32-NEXT:    addi sp, sp, -16
460f7b096d7SCraig Topper; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
461f7b096d7SCraig Topper; RV32-NEXT:    li a2, -3
462f7b096d7SCraig Topper; RV32-NEXT:    li a3, -1
463eabaee0cSFangrui Song; RV32-NEXT:    call __divdi3
464f7b096d7SCraig Topper; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
465f7b096d7SCraig Topper; RV32-NEXT:    addi sp, sp, 16
466f7b096d7SCraig Topper; RV32-NEXT:    ret
467f7b096d7SCraig Topper;
468f7b096d7SCraig Topper; RV64-LABEL: sdiv64_constant_sub_srai:
469f7b096d7SCraig Topper; RV64:       # %bb.0:
47038f7c7ebSFlorian Mayer; RV64-NEXT:    lui a1, 349525
47138f7c7ebSFlorian Mayer; RV64-NEXT:    addiw a1, a1, 1365
47238f7c7ebSFlorian Mayer; RV64-NEXT:    slli a2, a1, 32
47338f7c7ebSFlorian Mayer; RV64-NEXT:    add a1, a1, a2
474f7b096d7SCraig Topper; RV64-NEXT:    mulh a1, a0, a1
475e00e20a0SCraig Topper; RV64-NEXT:    sub a1, a1, a0
476e00e20a0SCraig Topper; RV64-NEXT:    srli a0, a1, 63
477e00e20a0SCraig Topper; RV64-NEXT:    srai a1, a1, 1
478e00e20a0SCraig Topper; RV64-NEXT:    add a0, a1, a0
479f7b096d7SCraig Topper; RV64-NEXT:    ret
480f7b096d7SCraig Topper  %1 = sdiv i64 %a, -3
481f7b096d7SCraig Topper  ret i64 %1
482f7b096d7SCraig Topper}
483f7b096d7SCraig Topper
484f7b096d7SCraig Topperdefine i8 @sdiv8_constant_no_srai(i8 %a) nounwind {
485f7b096d7SCraig Topper; RV32IM-LABEL: sdiv8_constant_no_srai:
486f7b096d7SCraig Topper; RV32IM:       # %bb.0:
487f7b096d7SCraig Topper; RV32IM-NEXT:    slli a0, a0, 24
488f7b096d7SCraig Topper; RV32IM-NEXT:    li a1, 86
489*9122c523SPengcheng Wang; RV32IM-NEXT:    srai a0, a0, 24
490f7b096d7SCraig Topper; RV32IM-NEXT:    mul a0, a0, a1
491aef0e77cSSimon Pilgrim; RV32IM-NEXT:    srli a1, a0, 31
492aef0e77cSSimon Pilgrim; RV32IM-NEXT:    srli a0, a0, 8
493aef0e77cSSimon Pilgrim; RV32IM-NEXT:    add a0, a0, a1
494f7b096d7SCraig Topper; RV32IM-NEXT:    ret
495f7b096d7SCraig Topper;
496f7b096d7SCraig Topper; RV32IMZB-LABEL: sdiv8_constant_no_srai:
497f7b096d7SCraig Topper; RV32IMZB:       # %bb.0:
498f7b096d7SCraig Topper; RV32IMZB-NEXT:    sext.b a0, a0
499f7b096d7SCraig Topper; RV32IMZB-NEXT:    li a1, 86
500f7b096d7SCraig Topper; RV32IMZB-NEXT:    mul a0, a0, a1
501aef0e77cSSimon Pilgrim; RV32IMZB-NEXT:    srli a1, a0, 31
502aef0e77cSSimon Pilgrim; RV32IMZB-NEXT:    srli a0, a0, 8
503aef0e77cSSimon Pilgrim; RV32IMZB-NEXT:    add a0, a0, a1
504f7b096d7SCraig Topper; RV32IMZB-NEXT:    ret
505f7b096d7SCraig Topper;
506f7b096d7SCraig Topper; RV64IM-LABEL: sdiv8_constant_no_srai:
507f7b096d7SCraig Topper; RV64IM:       # %bb.0:
508f7b096d7SCraig Topper; RV64IM-NEXT:    slli a0, a0, 56
509f7b096d7SCraig Topper; RV64IM-NEXT:    li a1, 86
510*9122c523SPengcheng Wang; RV64IM-NEXT:    srai a0, a0, 56
511f7b096d7SCraig Topper; RV64IM-NEXT:    mul a0, a0, a1
512aef0e77cSSimon Pilgrim; RV64IM-NEXT:    srli a1, a0, 63
513aef0e77cSSimon Pilgrim; RV64IM-NEXT:    srli a0, a0, 8
514aef0e77cSSimon Pilgrim; RV64IM-NEXT:    add a0, a0, a1
515f7b096d7SCraig Topper; RV64IM-NEXT:    ret
516f7b096d7SCraig Topper;
517f7b096d7SCraig Topper; RV64IMZB-LABEL: sdiv8_constant_no_srai:
518f7b096d7SCraig Topper; RV64IMZB:       # %bb.0:
519f7b096d7SCraig Topper; RV64IMZB-NEXT:    sext.b a0, a0
520f7b096d7SCraig Topper; RV64IMZB-NEXT:    li a1, 86
521f7b096d7SCraig Topper; RV64IMZB-NEXT:    mul a0, a0, a1
522aef0e77cSSimon Pilgrim; RV64IMZB-NEXT:    srli a1, a0, 63
523aef0e77cSSimon Pilgrim; RV64IMZB-NEXT:    srli a0, a0, 8
524aef0e77cSSimon Pilgrim; RV64IMZB-NEXT:    add a0, a0, a1
525f7b096d7SCraig Topper; RV64IMZB-NEXT:    ret
526f7b096d7SCraig Topper  %1 = sdiv i8 %a, 3
527f7b096d7SCraig Topper  ret i8 %1
528f7b096d7SCraig Topper}
529f7b096d7SCraig Topper
530f7b096d7SCraig Topperdefine i8 @sdiv8_constant_srai(i8 %a) nounwind {
531f7b096d7SCraig Topper; RV32IM-LABEL: sdiv8_constant_srai:
532f7b096d7SCraig Topper; RV32IM:       # %bb.0:
533f7b096d7SCraig Topper; RV32IM-NEXT:    slli a0, a0, 24
534f7b096d7SCraig Topper; RV32IM-NEXT:    li a1, 103
535*9122c523SPengcheng Wang; RV32IM-NEXT:    srai a0, a0, 24
536f7b096d7SCraig Topper; RV32IM-NEXT:    mul a0, a0, a1
537aef0e77cSSimon Pilgrim; RV32IM-NEXT:    srli a1, a0, 31
538aef0e77cSSimon Pilgrim; RV32IM-NEXT:    srai a0, a0, 9
539aef0e77cSSimon Pilgrim; RV32IM-NEXT:    add a0, a0, a1
540f7b096d7SCraig Topper; RV32IM-NEXT:    ret
541f7b096d7SCraig Topper;
542f7b096d7SCraig Topper; RV32IMZB-LABEL: sdiv8_constant_srai:
543f7b096d7SCraig Topper; RV32IMZB:       # %bb.0:
544f7b096d7SCraig Topper; RV32IMZB-NEXT:    sext.b a0, a0
545f7b096d7SCraig Topper; RV32IMZB-NEXT:    li a1, 103
546f7b096d7SCraig Topper; RV32IMZB-NEXT:    mul a0, a0, a1
547aef0e77cSSimon Pilgrim; RV32IMZB-NEXT:    srli a1, a0, 31
548aef0e77cSSimon Pilgrim; RV32IMZB-NEXT:    srai a0, a0, 9
549aef0e77cSSimon Pilgrim; RV32IMZB-NEXT:    add a0, a0, a1
550f7b096d7SCraig Topper; RV32IMZB-NEXT:    ret
551f7b096d7SCraig Topper;
552f7b096d7SCraig Topper; RV64IM-LABEL: sdiv8_constant_srai:
553f7b096d7SCraig Topper; RV64IM:       # %bb.0:
554f7b096d7SCraig Topper; RV64IM-NEXT:    slli a0, a0, 56
555f7b096d7SCraig Topper; RV64IM-NEXT:    li a1, 103
556*9122c523SPengcheng Wang; RV64IM-NEXT:    srai a0, a0, 56
557f7b096d7SCraig Topper; RV64IM-NEXT:    mul a0, a0, a1
558aef0e77cSSimon Pilgrim; RV64IM-NEXT:    srli a1, a0, 63
559aef0e77cSSimon Pilgrim; RV64IM-NEXT:    srai a0, a0, 9
560aef0e77cSSimon Pilgrim; RV64IM-NEXT:    add a0, a0, a1
561f7b096d7SCraig Topper; RV64IM-NEXT:    ret
562f7b096d7SCraig Topper;
563f7b096d7SCraig Topper; RV64IMZB-LABEL: sdiv8_constant_srai:
564f7b096d7SCraig Topper; RV64IMZB:       # %bb.0:
565f7b096d7SCraig Topper; RV64IMZB-NEXT:    sext.b a0, a0
566f7b096d7SCraig Topper; RV64IMZB-NEXT:    li a1, 103
567f7b096d7SCraig Topper; RV64IMZB-NEXT:    mul a0, a0, a1
568aef0e77cSSimon Pilgrim; RV64IMZB-NEXT:    srli a1, a0, 63
569aef0e77cSSimon Pilgrim; RV64IMZB-NEXT:    srai a0, a0, 9
570aef0e77cSSimon Pilgrim; RV64IMZB-NEXT:    add a0, a0, a1
571f7b096d7SCraig Topper; RV64IMZB-NEXT:    ret
572f7b096d7SCraig Topper  %1 = sdiv i8 %a, 5
573f7b096d7SCraig Topper  ret i8 %1
574f7b096d7SCraig Topper}
575f7b096d7SCraig Topper
576f7b096d7SCraig Topperdefine i8 @sdiv8_constant_add_srai(i8 %a) nounwind {
577f7b096d7SCraig Topper; RV32IM-LABEL: sdiv8_constant_add_srai:
578f7b096d7SCraig Topper; RV32IM:       # %bb.0:
579f7b096d7SCraig Topper; RV32IM-NEXT:    slli a1, a0, 24
580f7b096d7SCraig Topper; RV32IM-NEXT:    li a2, -109
581*9122c523SPengcheng Wang; RV32IM-NEXT:    srai a1, a1, 24
582f7b096d7SCraig Topper; RV32IM-NEXT:    mul a1, a1, a2
583f7b096d7SCraig Topper; RV32IM-NEXT:    srli a1, a1, 8
584f7b096d7SCraig Topper; RV32IM-NEXT:    add a0, a1, a0
585f7b096d7SCraig Topper; RV32IM-NEXT:    slli a0, a0, 24
586b645bcd9SCraig Topper; RV32IM-NEXT:    srli a1, a0, 31
587f7b096d7SCraig Topper; RV32IM-NEXT:    srai a0, a0, 26
588f7b096d7SCraig Topper; RV32IM-NEXT:    add a0, a0, a1
589f7b096d7SCraig Topper; RV32IM-NEXT:    ret
590f7b096d7SCraig Topper;
591f7b096d7SCraig Topper; RV32IMZB-LABEL: sdiv8_constant_add_srai:
592f7b096d7SCraig Topper; RV32IMZB:       # %bb.0:
593f7b096d7SCraig Topper; RV32IMZB-NEXT:    sext.b a1, a0
594f7b096d7SCraig Topper; RV32IMZB-NEXT:    li a2, -109
595f7b096d7SCraig Topper; RV32IMZB-NEXT:    mul a1, a1, a2
596f7b096d7SCraig Topper; RV32IMZB-NEXT:    srli a1, a1, 8
597f7b096d7SCraig Topper; RV32IMZB-NEXT:    add a0, a1, a0
598296e8caeSCraig Topper; RV32IMZB-NEXT:    slli a0, a0, 24
599b645bcd9SCraig Topper; RV32IMZB-NEXT:    srli a1, a0, 31
600296e8caeSCraig Topper; RV32IMZB-NEXT:    srai a0, a0, 26
601f7b096d7SCraig Topper; RV32IMZB-NEXT:    add a0, a0, a1
602f7b096d7SCraig Topper; RV32IMZB-NEXT:    ret
603f7b096d7SCraig Topper;
604f7b096d7SCraig Topper; RV64IM-LABEL: sdiv8_constant_add_srai:
605f7b096d7SCraig Topper; RV64IM:       # %bb.0:
606f7b096d7SCraig Topper; RV64IM-NEXT:    slli a1, a0, 56
607f7b096d7SCraig Topper; RV64IM-NEXT:    li a2, -109
608*9122c523SPengcheng Wang; RV64IM-NEXT:    srai a1, a1, 56
609f7b096d7SCraig Topper; RV64IM-NEXT:    mul a1, a1, a2
610f7b096d7SCraig Topper; RV64IM-NEXT:    srli a1, a1, 8
611d64d3c5aSNitin John Raj; RV64IM-NEXT:    add a0, a1, a0
612f7b096d7SCraig Topper; RV64IM-NEXT:    slli a0, a0, 56
613b645bcd9SCraig Topper; RV64IM-NEXT:    srli a1, a0, 63
614f7b096d7SCraig Topper; RV64IM-NEXT:    srai a0, a0, 58
615f7b096d7SCraig Topper; RV64IM-NEXT:    add a0, a0, a1
616f7b096d7SCraig Topper; RV64IM-NEXT:    ret
617f7b096d7SCraig Topper;
618f7b096d7SCraig Topper; RV64IMZB-LABEL: sdiv8_constant_add_srai:
619f7b096d7SCraig Topper; RV64IMZB:       # %bb.0:
620f7b096d7SCraig Topper; RV64IMZB-NEXT:    sext.b a1, a0
621f7b096d7SCraig Topper; RV64IMZB-NEXT:    li a2, -109
622f7b096d7SCraig Topper; RV64IMZB-NEXT:    mul a1, a1, a2
623f7b096d7SCraig Topper; RV64IMZB-NEXT:    srli a1, a1, 8
624d64d3c5aSNitin John Raj; RV64IMZB-NEXT:    add a0, a1, a0
625296e8caeSCraig Topper; RV64IMZB-NEXT:    slli a0, a0, 56
626b645bcd9SCraig Topper; RV64IMZB-NEXT:    srli a1, a0, 63
627296e8caeSCraig Topper; RV64IMZB-NEXT:    srai a0, a0, 58
628f7b096d7SCraig Topper; RV64IMZB-NEXT:    add a0, a0, a1
629f7b096d7SCraig Topper; RV64IMZB-NEXT:    ret
630f7b096d7SCraig Topper  %1 = sdiv i8 %a, 7
631f7b096d7SCraig Topper  ret i8 %1
632f7b096d7SCraig Topper}
633f7b096d7SCraig Topper
634f7b096d7SCraig Topperdefine i8 @sdiv8_constant_sub_srai(i8 %a) nounwind {
635f7b096d7SCraig Topper; RV32IM-LABEL: sdiv8_constant_sub_srai:
636f7b096d7SCraig Topper; RV32IM:       # %bb.0:
637f7b096d7SCraig Topper; RV32IM-NEXT:    slli a1, a0, 24
638f7b096d7SCraig Topper; RV32IM-NEXT:    li a2, 109
639*9122c523SPengcheng Wang; RV32IM-NEXT:    srai a1, a1, 24
640f7b096d7SCraig Topper; RV32IM-NEXT:    mul a1, a1, a2
641f7b096d7SCraig Topper; RV32IM-NEXT:    srli a1, a1, 8
642e00e20a0SCraig Topper; RV32IM-NEXT:    sub a1, a1, a0
643e00e20a0SCraig Topper; RV32IM-NEXT:    slli a1, a1, 24
644e00e20a0SCraig Topper; RV32IM-NEXT:    srli a0, a1, 31
645e00e20a0SCraig Topper; RV32IM-NEXT:    srai a1, a1, 26
646e00e20a0SCraig Topper; RV32IM-NEXT:    add a0, a1, a0
647f7b096d7SCraig Topper; RV32IM-NEXT:    ret
648f7b096d7SCraig Topper;
649f7b096d7SCraig Topper; RV32IMZB-LABEL: sdiv8_constant_sub_srai:
650f7b096d7SCraig Topper; RV32IMZB:       # %bb.0:
651f7b096d7SCraig Topper; RV32IMZB-NEXT:    sext.b a1, a0
652f7b096d7SCraig Topper; RV32IMZB-NEXT:    li a2, 109
653f7b096d7SCraig Topper; RV32IMZB-NEXT:    mul a1, a1, a2
654f7b096d7SCraig Topper; RV32IMZB-NEXT:    srli a1, a1, 8
655e00e20a0SCraig Topper; RV32IMZB-NEXT:    sub a1, a1, a0
656e00e20a0SCraig Topper; RV32IMZB-NEXT:    slli a1, a1, 24
657e00e20a0SCraig Topper; RV32IMZB-NEXT:    srli a0, a1, 31
658e00e20a0SCraig Topper; RV32IMZB-NEXT:    srai a1, a1, 26
659e00e20a0SCraig Topper; RV32IMZB-NEXT:    add a0, a1, a0
660f7b096d7SCraig Topper; RV32IMZB-NEXT:    ret
661f7b096d7SCraig Topper;
662f7b096d7SCraig Topper; RV64IM-LABEL: sdiv8_constant_sub_srai:
663f7b096d7SCraig Topper; RV64IM:       # %bb.0:
664f7b096d7SCraig Topper; RV64IM-NEXT:    slli a1, a0, 56
665f7b096d7SCraig Topper; RV64IM-NEXT:    li a2, 109
666*9122c523SPengcheng Wang; RV64IM-NEXT:    srai a1, a1, 56
667f7b096d7SCraig Topper; RV64IM-NEXT:    mul a1, a1, a2
668f7b096d7SCraig Topper; RV64IM-NEXT:    srli a1, a1, 8
669e00e20a0SCraig Topper; RV64IM-NEXT:    subw a1, a1, a0
670e00e20a0SCraig Topper; RV64IM-NEXT:    slli a1, a1, 56
671e00e20a0SCraig Topper; RV64IM-NEXT:    srli a0, a1, 63
672e00e20a0SCraig Topper; RV64IM-NEXT:    srai a1, a1, 58
673e00e20a0SCraig Topper; RV64IM-NEXT:    add a0, a1, a0
674f7b096d7SCraig Topper; RV64IM-NEXT:    ret
675f7b096d7SCraig Topper;
676f7b096d7SCraig Topper; RV64IMZB-LABEL: sdiv8_constant_sub_srai:
677f7b096d7SCraig Topper; RV64IMZB:       # %bb.0:
678f7b096d7SCraig Topper; RV64IMZB-NEXT:    sext.b a1, a0
679f7b096d7SCraig Topper; RV64IMZB-NEXT:    li a2, 109
680f7b096d7SCraig Topper; RV64IMZB-NEXT:    mul a1, a1, a2
681f7b096d7SCraig Topper; RV64IMZB-NEXT:    srli a1, a1, 8
682e00e20a0SCraig Topper; RV64IMZB-NEXT:    subw a1, a1, a0
683e00e20a0SCraig Topper; RV64IMZB-NEXT:    slli a1, a1, 56
684e00e20a0SCraig Topper; RV64IMZB-NEXT:    srli a0, a1, 63
685e00e20a0SCraig Topper; RV64IMZB-NEXT:    srai a1, a1, 58
686e00e20a0SCraig Topper; RV64IMZB-NEXT:    add a0, a1, a0
687f7b096d7SCraig Topper; RV64IMZB-NEXT:    ret
688f7b096d7SCraig Topper  %1 = sdiv i8 %a, -7
689f7b096d7SCraig Topper  ret i8 %1
690f7b096d7SCraig Topper}
691f7b096d7SCraig Topper
692f7b096d7SCraig Topperdefine i16 @sdiv16_constant_no_srai(i16 %a) nounwind {
693f7b096d7SCraig Topper; RV32IM-LABEL: sdiv16_constant_no_srai:
694f7b096d7SCraig Topper; RV32IM:       # %bb.0:
695f7b096d7SCraig Topper; RV32IM-NEXT:    slli a0, a0, 16
696f7b096d7SCraig Topper; RV32IM-NEXT:    lui a1, 5
697*9122c523SPengcheng Wang; RV32IM-NEXT:    srai a0, a0, 16
698f7b096d7SCraig Topper; RV32IM-NEXT:    addi a1, a1, 1366
699f7b096d7SCraig Topper; RV32IM-NEXT:    mul a0, a0, a1
700f7b096d7SCraig Topper; RV32IM-NEXT:    srli a1, a0, 31
701f7b096d7SCraig Topper; RV32IM-NEXT:    srli a0, a0, 16
702f7b096d7SCraig Topper; RV32IM-NEXT:    add a0, a0, a1
703f7b096d7SCraig Topper; RV32IM-NEXT:    ret
704f7b096d7SCraig Topper;
705f7b096d7SCraig Topper; RV32IMZB-LABEL: sdiv16_constant_no_srai:
706f7b096d7SCraig Topper; RV32IMZB:       # %bb.0:
707f7b096d7SCraig Topper; RV32IMZB-NEXT:    sext.h a0, a0
708f7b096d7SCraig Topper; RV32IMZB-NEXT:    lui a1, 5
709f7b096d7SCraig Topper; RV32IMZB-NEXT:    addi a1, a1, 1366
710f7b096d7SCraig Topper; RV32IMZB-NEXT:    mul a0, a0, a1
711f7b096d7SCraig Topper; RV32IMZB-NEXT:    srli a1, a0, 31
712f7b096d7SCraig Topper; RV32IMZB-NEXT:    srli a0, a0, 16
713f7b096d7SCraig Topper; RV32IMZB-NEXT:    add a0, a0, a1
714f7b096d7SCraig Topper; RV32IMZB-NEXT:    ret
715f7b096d7SCraig Topper;
716f7b096d7SCraig Topper; RV64IM-LABEL: sdiv16_constant_no_srai:
717f7b096d7SCraig Topper; RV64IM:       # %bb.0:
718f7b096d7SCraig Topper; RV64IM-NEXT:    slli a0, a0, 48
719f7b096d7SCraig Topper; RV64IM-NEXT:    lui a1, 5
720*9122c523SPengcheng Wang; RV64IM-NEXT:    srai a0, a0, 48
721f7b096d7SCraig Topper; RV64IM-NEXT:    addiw a1, a1, 1366
722f7b096d7SCraig Topper; RV64IM-NEXT:    mul a0, a0, a1
723aef0e77cSSimon Pilgrim; RV64IM-NEXT:    srli a1, a0, 63
724f7b096d7SCraig Topper; RV64IM-NEXT:    srli a0, a0, 16
725f7b096d7SCraig Topper; RV64IM-NEXT:    add a0, a0, a1
726f7b096d7SCraig Topper; RV64IM-NEXT:    ret
727f7b096d7SCraig Topper;
728f7b096d7SCraig Topper; RV64IMZB-LABEL: sdiv16_constant_no_srai:
729f7b096d7SCraig Topper; RV64IMZB:       # %bb.0:
730f7b096d7SCraig Topper; RV64IMZB-NEXT:    sext.h a0, a0
731f7b096d7SCraig Topper; RV64IMZB-NEXT:    lui a1, 5
732f7b096d7SCraig Topper; RV64IMZB-NEXT:    addiw a1, a1, 1366
733f7b096d7SCraig Topper; RV64IMZB-NEXT:    mul a0, a0, a1
734aef0e77cSSimon Pilgrim; RV64IMZB-NEXT:    srli a1, a0, 63
735f7b096d7SCraig Topper; RV64IMZB-NEXT:    srli a0, a0, 16
736f7b096d7SCraig Topper; RV64IMZB-NEXT:    add a0, a0, a1
737f7b096d7SCraig Topper; RV64IMZB-NEXT:    ret
738f7b096d7SCraig Topper  %1 = sdiv i16 %a, 3
739f7b096d7SCraig Topper  ret i16 %1
740f7b096d7SCraig Topper}
741f7b096d7SCraig Topper
742f7b096d7SCraig Topperdefine i16 @sdiv16_constant_srai(i16 %a) nounwind {
743f7b096d7SCraig Topper; RV32IM-LABEL: sdiv16_constant_srai:
744f7b096d7SCraig Topper; RV32IM:       # %bb.0:
745f7b096d7SCraig Topper; RV32IM-NEXT:    slli a0, a0, 16
746f7b096d7SCraig Topper; RV32IM-NEXT:    lui a1, 6
747*9122c523SPengcheng Wang; RV32IM-NEXT:    srai a0, a0, 16
748f7b096d7SCraig Topper; RV32IM-NEXT:    addi a1, a1, 1639
749f7b096d7SCraig Topper; RV32IM-NEXT:    mul a0, a0, a1
750f7b096d7SCraig Topper; RV32IM-NEXT:    srli a1, a0, 31
751f7b096d7SCraig Topper; RV32IM-NEXT:    srai a0, a0, 17
752f7b096d7SCraig Topper; RV32IM-NEXT:    add a0, a0, a1
753f7b096d7SCraig Topper; RV32IM-NEXT:    ret
754f7b096d7SCraig Topper;
755f7b096d7SCraig Topper; RV32IMZB-LABEL: sdiv16_constant_srai:
756f7b096d7SCraig Topper; RV32IMZB:       # %bb.0:
757f7b096d7SCraig Topper; RV32IMZB-NEXT:    sext.h a0, a0
758f7b096d7SCraig Topper; RV32IMZB-NEXT:    lui a1, 6
759f7b096d7SCraig Topper; RV32IMZB-NEXT:    addi a1, a1, 1639
760f7b096d7SCraig Topper; RV32IMZB-NEXT:    mul a0, a0, a1
761f7b096d7SCraig Topper; RV32IMZB-NEXT:    srli a1, a0, 31
762f7b096d7SCraig Topper; RV32IMZB-NEXT:    srai a0, a0, 17
763f7b096d7SCraig Topper; RV32IMZB-NEXT:    add a0, a0, a1
764f7b096d7SCraig Topper; RV32IMZB-NEXT:    ret
765f7b096d7SCraig Topper;
766f7b096d7SCraig Topper; RV64IM-LABEL: sdiv16_constant_srai:
767f7b096d7SCraig Topper; RV64IM:       # %bb.0:
768f7b096d7SCraig Topper; RV64IM-NEXT:    slli a0, a0, 48
769f7b096d7SCraig Topper; RV64IM-NEXT:    lui a1, 6
770*9122c523SPengcheng Wang; RV64IM-NEXT:    srai a0, a0, 48
771f7b096d7SCraig Topper; RV64IM-NEXT:    addiw a1, a1, 1639
772f7b096d7SCraig Topper; RV64IM-NEXT:    mul a0, a0, a1
773aef0e77cSSimon Pilgrim; RV64IM-NEXT:    srli a1, a0, 63
774f7b096d7SCraig Topper; RV64IM-NEXT:    srai a0, a0, 17
775f7b096d7SCraig Topper; RV64IM-NEXT:    add a0, a0, a1
776f7b096d7SCraig Topper; RV64IM-NEXT:    ret
777f7b096d7SCraig Topper;
778f7b096d7SCraig Topper; RV64IMZB-LABEL: sdiv16_constant_srai:
779f7b096d7SCraig Topper; RV64IMZB:       # %bb.0:
780f7b096d7SCraig Topper; RV64IMZB-NEXT:    sext.h a0, a0
781f7b096d7SCraig Topper; RV64IMZB-NEXT:    lui a1, 6
782f7b096d7SCraig Topper; RV64IMZB-NEXT:    addiw a1, a1, 1639
783f7b096d7SCraig Topper; RV64IMZB-NEXT:    mul a0, a0, a1
784aef0e77cSSimon Pilgrim; RV64IMZB-NEXT:    srli a1, a0, 63
785f7b096d7SCraig Topper; RV64IMZB-NEXT:    srai a0, a0, 17
786f7b096d7SCraig Topper; RV64IMZB-NEXT:    add a0, a0, a1
787f7b096d7SCraig Topper; RV64IMZB-NEXT:    ret
788f7b096d7SCraig Topper  %1 = sdiv i16 %a, 5
789f7b096d7SCraig Topper  ret i16 %1
790f7b096d7SCraig Topper}
791f7b096d7SCraig Topper
792f7b096d7SCraig Topperdefine i16 @sdiv16_constant_add_srai(i16 %a) nounwind {
793f7b096d7SCraig Topper; RV32IM-LABEL: sdiv16_constant_add_srai:
794f7b096d7SCraig Topper; RV32IM:       # %bb.0:
795f7b096d7SCraig Topper; RV32IM-NEXT:    slli a1, a0, 16
796f7b096d7SCraig Topper; RV32IM-NEXT:    lui a2, 1048569
797*9122c523SPengcheng Wang; RV32IM-NEXT:    srai a1, a1, 16
798f7b096d7SCraig Topper; RV32IM-NEXT:    addi a2, a2, -1911
799f7b096d7SCraig Topper; RV32IM-NEXT:    mul a1, a1, a2
800f7b096d7SCraig Topper; RV32IM-NEXT:    srli a1, a1, 16
801f7b096d7SCraig Topper; RV32IM-NEXT:    add a0, a1, a0
802f7b096d7SCraig Topper; RV32IM-NEXT:    slli a0, a0, 16
803f7b096d7SCraig Topper; RV32IM-NEXT:    srli a1, a0, 31
804f7b096d7SCraig Topper; RV32IM-NEXT:    srai a0, a0, 19
805f7b096d7SCraig Topper; RV32IM-NEXT:    add a0, a0, a1
806f7b096d7SCraig Topper; RV32IM-NEXT:    ret
807f7b096d7SCraig Topper;
808f7b096d7SCraig Topper; RV32IMZB-LABEL: sdiv16_constant_add_srai:
809f7b096d7SCraig Topper; RV32IMZB:       # %bb.0:
810f7b096d7SCraig Topper; RV32IMZB-NEXT:    sext.h a1, a0
811f7b096d7SCraig Topper; RV32IMZB-NEXT:    lui a2, 1048569
812f7b096d7SCraig Topper; RV32IMZB-NEXT:    addi a2, a2, -1911
813f7b096d7SCraig Topper; RV32IMZB-NEXT:    mul a1, a1, a2
814f7b096d7SCraig Topper; RV32IMZB-NEXT:    srli a1, a1, 16
815f7b096d7SCraig Topper; RV32IMZB-NEXT:    add a0, a1, a0
816296e8caeSCraig Topper; RV32IMZB-NEXT:    slli a0, a0, 16
817296e8caeSCraig Topper; RV32IMZB-NEXT:    srli a1, a0, 31
818296e8caeSCraig Topper; RV32IMZB-NEXT:    srai a0, a0, 19
819f7b096d7SCraig Topper; RV32IMZB-NEXT:    add a0, a0, a1
820f7b096d7SCraig Topper; RV32IMZB-NEXT:    ret
821f7b096d7SCraig Topper;
822f7b096d7SCraig Topper; RV64IM-LABEL: sdiv16_constant_add_srai:
823f7b096d7SCraig Topper; RV64IM:       # %bb.0:
824f7b096d7SCraig Topper; RV64IM-NEXT:    slli a1, a0, 48
825f7b096d7SCraig Topper; RV64IM-NEXT:    lui a2, 1048569
826*9122c523SPengcheng Wang; RV64IM-NEXT:    srai a1, a1, 48
827f7b096d7SCraig Topper; RV64IM-NEXT:    addiw a2, a2, -1911
828f7b096d7SCraig Topper; RV64IM-NEXT:    mul a1, a1, a2
829f7b096d7SCraig Topper; RV64IM-NEXT:    srli a1, a1, 16
830d64d3c5aSNitin John Raj; RV64IM-NEXT:    add a0, a1, a0
831f7b096d7SCraig Topper; RV64IM-NEXT:    slli a0, a0, 48
832f7b096d7SCraig Topper; RV64IM-NEXT:    srli a1, a0, 63
833f7b096d7SCraig Topper; RV64IM-NEXT:    srai a0, a0, 51
834f7b096d7SCraig Topper; RV64IM-NEXT:    add a0, a0, a1
835f7b096d7SCraig Topper; RV64IM-NEXT:    ret
836f7b096d7SCraig Topper;
837f7b096d7SCraig Topper; RV64IMZB-LABEL: sdiv16_constant_add_srai:
838f7b096d7SCraig Topper; RV64IMZB:       # %bb.0:
839f7b096d7SCraig Topper; RV64IMZB-NEXT:    sext.h a1, a0
840f7b096d7SCraig Topper; RV64IMZB-NEXT:    lui a2, 1048569
841f7b096d7SCraig Topper; RV64IMZB-NEXT:    addiw a2, a2, -1911
842f7b096d7SCraig Topper; RV64IMZB-NEXT:    mul a1, a1, a2
843f7b096d7SCraig Topper; RV64IMZB-NEXT:    srli a1, a1, 16
844d64d3c5aSNitin John Raj; RV64IMZB-NEXT:    add a0, a1, a0
845296e8caeSCraig Topper; RV64IMZB-NEXT:    slli a0, a0, 48
846296e8caeSCraig Topper; RV64IMZB-NEXT:    srli a1, a0, 63
847296e8caeSCraig Topper; RV64IMZB-NEXT:    srai a0, a0, 51
848f7b096d7SCraig Topper; RV64IMZB-NEXT:    add a0, a0, a1
849f7b096d7SCraig Topper; RV64IMZB-NEXT:    ret
850f7b096d7SCraig Topper  %1 = sdiv i16 %a, 15
851f7b096d7SCraig Topper  ret i16 %1
852f7b096d7SCraig Topper}
853f7b096d7SCraig Topper
854f7b096d7SCraig Topperdefine i16 @sdiv16_constant_sub_srai(i16 %a) nounwind {
855f7b096d7SCraig Topper; RV32IM-LABEL: sdiv16_constant_sub_srai:
856f7b096d7SCraig Topper; RV32IM:       # %bb.0:
857f7b096d7SCraig Topper; RV32IM-NEXT:    slli a1, a0, 16
858f7b096d7SCraig Topper; RV32IM-NEXT:    lui a2, 7
859*9122c523SPengcheng Wang; RV32IM-NEXT:    srai a1, a1, 16
860f7b096d7SCraig Topper; RV32IM-NEXT:    addi a2, a2, 1911
861f7b096d7SCraig Topper; RV32IM-NEXT:    mul a1, a1, a2
862f7b096d7SCraig Topper; RV32IM-NEXT:    srli a1, a1, 16
863e00e20a0SCraig Topper; RV32IM-NEXT:    sub a1, a1, a0
864e00e20a0SCraig Topper; RV32IM-NEXT:    slli a1, a1, 16
865e00e20a0SCraig Topper; RV32IM-NEXT:    srli a0, a1, 31
866e00e20a0SCraig Topper; RV32IM-NEXT:    srai a1, a1, 19
867e00e20a0SCraig Topper; RV32IM-NEXT:    add a0, a1, a0
868f7b096d7SCraig Topper; RV32IM-NEXT:    ret
869f7b096d7SCraig Topper;
870f7b096d7SCraig Topper; RV32IMZB-LABEL: sdiv16_constant_sub_srai:
871f7b096d7SCraig Topper; RV32IMZB:       # %bb.0:
872f7b096d7SCraig Topper; RV32IMZB-NEXT:    sext.h a1, a0
873f7b096d7SCraig Topper; RV32IMZB-NEXT:    lui a2, 7
874f7b096d7SCraig Topper; RV32IMZB-NEXT:    addi a2, a2, 1911
875f7b096d7SCraig Topper; RV32IMZB-NEXT:    mul a1, a1, a2
876f7b096d7SCraig Topper; RV32IMZB-NEXT:    srli a1, a1, 16
877e00e20a0SCraig Topper; RV32IMZB-NEXT:    sub a1, a1, a0
878e00e20a0SCraig Topper; RV32IMZB-NEXT:    slli a1, a1, 16
879e00e20a0SCraig Topper; RV32IMZB-NEXT:    srli a0, a1, 31
880e00e20a0SCraig Topper; RV32IMZB-NEXT:    srai a1, a1, 19
881e00e20a0SCraig Topper; RV32IMZB-NEXT:    add a0, a1, a0
882f7b096d7SCraig Topper; RV32IMZB-NEXT:    ret
883f7b096d7SCraig Topper;
884f7b096d7SCraig Topper; RV64IM-LABEL: sdiv16_constant_sub_srai:
885f7b096d7SCraig Topper; RV64IM:       # %bb.0:
886f7b096d7SCraig Topper; RV64IM-NEXT:    slli a1, a0, 48
887f7b096d7SCraig Topper; RV64IM-NEXT:    lui a2, 7
888*9122c523SPengcheng Wang; RV64IM-NEXT:    srai a1, a1, 48
889f7b096d7SCraig Topper; RV64IM-NEXT:    addiw a2, a2, 1911
890f7b096d7SCraig Topper; RV64IM-NEXT:    mul a1, a1, a2
891f7b096d7SCraig Topper; RV64IM-NEXT:    srli a1, a1, 16
892e00e20a0SCraig Topper; RV64IM-NEXT:    subw a1, a1, a0
893e00e20a0SCraig Topper; RV64IM-NEXT:    slli a1, a1, 48
894e00e20a0SCraig Topper; RV64IM-NEXT:    srli a0, a1, 63
895e00e20a0SCraig Topper; RV64IM-NEXT:    srai a1, a1, 51
896e00e20a0SCraig Topper; RV64IM-NEXT:    add a0, a1, a0
897f7b096d7SCraig Topper; RV64IM-NEXT:    ret
898f7b096d7SCraig Topper;
899f7b096d7SCraig Topper; RV64IMZB-LABEL: sdiv16_constant_sub_srai:
900f7b096d7SCraig Topper; RV64IMZB:       # %bb.0:
901f7b096d7SCraig Topper; RV64IMZB-NEXT:    sext.h a1, a0
902f7b096d7SCraig Topper; RV64IMZB-NEXT:    lui a2, 7
903f7b096d7SCraig Topper; RV64IMZB-NEXT:    addiw a2, a2, 1911
904f7b096d7SCraig Topper; RV64IMZB-NEXT:    mul a1, a1, a2
905f7b096d7SCraig Topper; RV64IMZB-NEXT:    srli a1, a1, 16
906e00e20a0SCraig Topper; RV64IMZB-NEXT:    subw a1, a1, a0
907e00e20a0SCraig Topper; RV64IMZB-NEXT:    slli a1, a1, 48
908e00e20a0SCraig Topper; RV64IMZB-NEXT:    srli a0, a1, 63
909e00e20a0SCraig Topper; RV64IMZB-NEXT:    srai a1, a1, 51
910e00e20a0SCraig Topper; RV64IMZB-NEXT:    add a0, a1, a0
911f7b096d7SCraig Topper; RV64IMZB-NEXT:    ret
912f7b096d7SCraig Topper  %1 = sdiv i16 %a, -15
913f7b096d7SCraig Topper  ret i16 %1
914f7b096d7SCraig Topper}
915