Revert rGe6ccb57bb3f6b761f2310e97fd6ca99eff42f73e "[SLP] Add cost model for `llvm...
[llvm-project.git] / llvm / test / CodeGen / RISCV / urem-vector-lkk.ll
blobb804e53b6a71df0a5c649bca4ade292764b2e4d0
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-prefixes=CHECK,RV32I %s
4 ; RUN: llc -mtriple=riscv32 -mattr=+m -verify-machineinstrs < %s \
5 ; RUN:   | FileCheck -check-prefixes=CHECK,RV32IM %s
6 ; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
7 ; RUN:   | FileCheck -check-prefixes=CHECK,RV64I %s
8 ; RUN: llc -mtriple=riscv64 -mattr=+m -verify-machineinstrs < %s \
9 ; RUN:   | FileCheck -check-prefixes=CHECK,RV64IM %s
12 define <4 x i16> @fold_urem_vec_1(<4 x i16> %x) nounwind {
13 ; RV32I-LABEL: fold_urem_vec_1:
14 ; RV32I:       # %bb.0:
15 ; RV32I-NEXT:    addi sp, sp, -32
16 ; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
17 ; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
18 ; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
19 ; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
20 ; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
21 ; RV32I-NEXT:    sw s4, 8(sp) # 4-byte Folded Spill
22 ; RV32I-NEXT:    lhu s0, 12(a1)
23 ; RV32I-NEXT:    lhu s1, 8(a1)
24 ; RV32I-NEXT:    lhu s2, 4(a1)
25 ; RV32I-NEXT:    lhu a2, 0(a1)
26 ; RV32I-NEXT:    mv s3, a0
27 ; RV32I-NEXT:    li a1, 95
28 ; RV32I-NEXT:    mv a0, a2
29 ; RV32I-NEXT:    call __umodsi3@plt
30 ; RV32I-NEXT:    mv s4, a0
31 ; RV32I-NEXT:    li a1, 124
32 ; RV32I-NEXT:    mv a0, s2
33 ; RV32I-NEXT:    call __umodsi3@plt
34 ; RV32I-NEXT:    mv s2, a0
35 ; RV32I-NEXT:    li a1, 98
36 ; RV32I-NEXT:    mv a0, s1
37 ; RV32I-NEXT:    call __umodsi3@plt
38 ; RV32I-NEXT:    mv s1, a0
39 ; RV32I-NEXT:    li a1, 1003
40 ; RV32I-NEXT:    mv a0, s0
41 ; RV32I-NEXT:    call __umodsi3@plt
42 ; RV32I-NEXT:    sh a0, 6(s3)
43 ; RV32I-NEXT:    sh s1, 4(s3)
44 ; RV32I-NEXT:    sh s2, 2(s3)
45 ; RV32I-NEXT:    sh s4, 0(s3)
46 ; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
47 ; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
48 ; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
49 ; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
50 ; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
51 ; RV32I-NEXT:    lw s4, 8(sp) # 4-byte Folded Reload
52 ; RV32I-NEXT:    addi sp, sp, 32
53 ; RV32I-NEXT:    ret
55 ; RV32IM-LABEL: fold_urem_vec_1:
56 ; RV32IM:       # %bb.0:
57 ; RV32IM-NEXT:    lhu a2, 12(a1)
58 ; RV32IM-NEXT:    lhu a3, 8(a1)
59 ; RV32IM-NEXT:    lhu a4, 0(a1)
60 ; RV32IM-NEXT:    lhu a1, 4(a1)
61 ; RV32IM-NEXT:    lui a5, 364242
62 ; RV32IM-NEXT:    addi a5, a5, 777
63 ; RV32IM-NEXT:    mulhu a5, a4, a5
64 ; RV32IM-NEXT:    sub a6, a4, a5
65 ; RV32IM-NEXT:    srli a6, a6, 1
66 ; RV32IM-NEXT:    add a5, a6, a5
67 ; RV32IM-NEXT:    srli a5, a5, 6
68 ; RV32IM-NEXT:    li a6, 95
69 ; RV32IM-NEXT:    mul a5, a5, a6
70 ; RV32IM-NEXT:    sub a4, a4, a5
71 ; RV32IM-NEXT:    srli a5, a1, 2
72 ; RV32IM-NEXT:    lui a6, 135300
73 ; RV32IM-NEXT:    addi a6, a6, 529
74 ; RV32IM-NEXT:    mulhu a5, a5, a6
75 ; RV32IM-NEXT:    srli a5, a5, 2
76 ; RV32IM-NEXT:    li a6, 124
77 ; RV32IM-NEXT:    mul a5, a5, a6
78 ; RV32IM-NEXT:    sub a1, a1, a5
79 ; RV32IM-NEXT:    lui a5, 342392
80 ; RV32IM-NEXT:    addi a5, a5, 669
81 ; RV32IM-NEXT:    mulhu a5, a3, a5
82 ; RV32IM-NEXT:    srli a5, a5, 5
83 ; RV32IM-NEXT:    li a6, 98
84 ; RV32IM-NEXT:    mul a5, a5, a6
85 ; RV32IM-NEXT:    sub a3, a3, a5
86 ; RV32IM-NEXT:    lui a5, 267633
87 ; RV32IM-NEXT:    addi a5, a5, -1809
88 ; RV32IM-NEXT:    mulhu a5, a2, a5
89 ; RV32IM-NEXT:    srli a5, a5, 8
90 ; RV32IM-NEXT:    li a6, 1003
91 ; RV32IM-NEXT:    mul a5, a5, a6
92 ; RV32IM-NEXT:    sub a2, a2, a5
93 ; RV32IM-NEXT:    sh a2, 6(a0)
94 ; RV32IM-NEXT:    sh a3, 4(a0)
95 ; RV32IM-NEXT:    sh a1, 2(a0)
96 ; RV32IM-NEXT:    sh a4, 0(a0)
97 ; RV32IM-NEXT:    ret
99 ; RV64I-LABEL: fold_urem_vec_1:
100 ; RV64I:       # %bb.0:
101 ; RV64I-NEXT:    addi sp, sp, -48
102 ; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
103 ; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
104 ; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
105 ; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
106 ; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
107 ; RV64I-NEXT:    sd s4, 0(sp) # 8-byte Folded Spill
108 ; RV64I-NEXT:    lhu s0, 24(a1)
109 ; RV64I-NEXT:    lhu s1, 16(a1)
110 ; RV64I-NEXT:    lhu s2, 8(a1)
111 ; RV64I-NEXT:    lhu a2, 0(a1)
112 ; RV64I-NEXT:    mv s3, a0
113 ; RV64I-NEXT:    li a1, 95
114 ; RV64I-NEXT:    mv a0, a2
115 ; RV64I-NEXT:    call __umoddi3@plt
116 ; RV64I-NEXT:    mv s4, a0
117 ; RV64I-NEXT:    li a1, 124
118 ; RV64I-NEXT:    mv a0, s2
119 ; RV64I-NEXT:    call __umoddi3@plt
120 ; RV64I-NEXT:    mv s2, a0
121 ; RV64I-NEXT:    li a1, 98
122 ; RV64I-NEXT:    mv a0, s1
123 ; RV64I-NEXT:    call __umoddi3@plt
124 ; RV64I-NEXT:    mv s1, a0
125 ; RV64I-NEXT:    li a1, 1003
126 ; RV64I-NEXT:    mv a0, s0
127 ; RV64I-NEXT:    call __umoddi3@plt
128 ; RV64I-NEXT:    sh a0, 6(s3)
129 ; RV64I-NEXT:    sh s1, 4(s3)
130 ; RV64I-NEXT:    sh s2, 2(s3)
131 ; RV64I-NEXT:    sh s4, 0(s3)
132 ; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
133 ; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
134 ; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
135 ; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
136 ; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
137 ; RV64I-NEXT:    ld s4, 0(sp) # 8-byte Folded Reload
138 ; RV64I-NEXT:    addi sp, sp, 48
139 ; RV64I-NEXT:    ret
141 ; RV64IM-LABEL: fold_urem_vec_1:
142 ; RV64IM:       # %bb.0:
143 ; RV64IM-NEXT:    lhu a2, 0(a1)
144 ; RV64IM-NEXT:    lui a3, %hi(.LCPI0_0)
145 ; RV64IM-NEXT:    ld a3, %lo(.LCPI0_0)(a3)
146 ; RV64IM-NEXT:    lhu a4, 24(a1)
147 ; RV64IM-NEXT:    lhu a5, 16(a1)
148 ; RV64IM-NEXT:    lhu a1, 8(a1)
149 ; RV64IM-NEXT:    mulhu a3, a2, a3
150 ; RV64IM-NEXT:    sub a6, a2, a3
151 ; RV64IM-NEXT:    srli a6, a6, 1
152 ; RV64IM-NEXT:    add a3, a6, a3
153 ; RV64IM-NEXT:    srli a3, a3, 6
154 ; RV64IM-NEXT:    li a6, 95
155 ; RV64IM-NEXT:    lui a7, %hi(.LCPI0_1)
156 ; RV64IM-NEXT:    ld a7, %lo(.LCPI0_1)(a7)
157 ; RV64IM-NEXT:    mulw a3, a3, a6
158 ; RV64IM-NEXT:    subw a2, a2, a3
159 ; RV64IM-NEXT:    srli a3, a1, 2
160 ; RV64IM-NEXT:    mulhu a3, a3, a7
161 ; RV64IM-NEXT:    srli a3, a3, 3
162 ; RV64IM-NEXT:    li a6, 124
163 ; RV64IM-NEXT:    lui a7, %hi(.LCPI0_2)
164 ; RV64IM-NEXT:    ld a7, %lo(.LCPI0_2)(a7)
165 ; RV64IM-NEXT:    mulw a3, a3, a6
166 ; RV64IM-NEXT:    subw a1, a1, a3
167 ; RV64IM-NEXT:    srli a3, a5, 1
168 ; RV64IM-NEXT:    mulhu a3, a3, a7
169 ; RV64IM-NEXT:    srli a3, a3, 4
170 ; RV64IM-NEXT:    lui a6, %hi(.LCPI0_3)
171 ; RV64IM-NEXT:    ld a6, %lo(.LCPI0_3)(a6)
172 ; RV64IM-NEXT:    li a7, 98
173 ; RV64IM-NEXT:    mulw a3, a3, a7
174 ; RV64IM-NEXT:    subw a3, a5, a3
175 ; RV64IM-NEXT:    mulhu a5, a4, a6
176 ; RV64IM-NEXT:    srli a5, a5, 7
177 ; RV64IM-NEXT:    li a6, 1003
178 ; RV64IM-NEXT:    mulw a5, a5, a6
179 ; RV64IM-NEXT:    subw a4, a4, a5
180 ; RV64IM-NEXT:    sh a4, 6(a0)
181 ; RV64IM-NEXT:    sh a3, 4(a0)
182 ; RV64IM-NEXT:    sh a1, 2(a0)
183 ; RV64IM-NEXT:    sh a2, 0(a0)
184 ; RV64IM-NEXT:    ret
185   %1 = urem <4 x i16> %x, <i16 95, i16 124, i16 98, i16 1003>
186   ret <4 x i16> %1
189 define <4 x i16> @fold_urem_vec_2(<4 x i16> %x) nounwind {
190 ; RV32I-LABEL: fold_urem_vec_2:
191 ; RV32I:       # %bb.0:
192 ; RV32I-NEXT:    addi sp, sp, -32
193 ; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
194 ; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
195 ; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
196 ; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
197 ; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
198 ; RV32I-NEXT:    sw s4, 8(sp) # 4-byte Folded Spill
199 ; RV32I-NEXT:    lhu s0, 12(a1)
200 ; RV32I-NEXT:    lhu s1, 8(a1)
201 ; RV32I-NEXT:    lhu s2, 4(a1)
202 ; RV32I-NEXT:    lhu a2, 0(a1)
203 ; RV32I-NEXT:    mv s3, a0
204 ; RV32I-NEXT:    li a1, 95
205 ; RV32I-NEXT:    mv a0, a2
206 ; RV32I-NEXT:    call __umodsi3@plt
207 ; RV32I-NEXT:    mv s4, a0
208 ; RV32I-NEXT:    li a1, 95
209 ; RV32I-NEXT:    mv a0, s2
210 ; RV32I-NEXT:    call __umodsi3@plt
211 ; RV32I-NEXT:    mv s2, a0
212 ; RV32I-NEXT:    li a1, 95
213 ; RV32I-NEXT:    mv a0, s1
214 ; RV32I-NEXT:    call __umodsi3@plt
215 ; RV32I-NEXT:    mv s1, a0
216 ; RV32I-NEXT:    li a1, 95
217 ; RV32I-NEXT:    mv a0, s0
218 ; RV32I-NEXT:    call __umodsi3@plt
219 ; RV32I-NEXT:    sh a0, 6(s3)
220 ; RV32I-NEXT:    sh s1, 4(s3)
221 ; RV32I-NEXT:    sh s2, 2(s3)
222 ; RV32I-NEXT:    sh s4, 0(s3)
223 ; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
224 ; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
225 ; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
226 ; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
227 ; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
228 ; RV32I-NEXT:    lw s4, 8(sp) # 4-byte Folded Reload
229 ; RV32I-NEXT:    addi sp, sp, 32
230 ; RV32I-NEXT:    ret
232 ; RV32IM-LABEL: fold_urem_vec_2:
233 ; RV32IM:       # %bb.0:
234 ; RV32IM-NEXT:    lhu a2, 12(a1)
235 ; RV32IM-NEXT:    lhu a3, 8(a1)
236 ; RV32IM-NEXT:    lhu a4, 0(a1)
237 ; RV32IM-NEXT:    lhu a1, 4(a1)
238 ; RV32IM-NEXT:    lui a5, 364242
239 ; RV32IM-NEXT:    addi a5, a5, 777
240 ; RV32IM-NEXT:    mulhu a6, a4, a5
241 ; RV32IM-NEXT:    sub a7, a4, a6
242 ; RV32IM-NEXT:    srli a7, a7, 1
243 ; RV32IM-NEXT:    add a6, a7, a6
244 ; RV32IM-NEXT:    srli a6, a6, 6
245 ; RV32IM-NEXT:    li a7, 95
246 ; RV32IM-NEXT:    mul a6, a6, a7
247 ; RV32IM-NEXT:    sub a4, a4, a6
248 ; RV32IM-NEXT:    mulhu a6, a1, a5
249 ; RV32IM-NEXT:    sub t0, a1, a6
250 ; RV32IM-NEXT:    srli t0, t0, 1
251 ; RV32IM-NEXT:    add a6, t0, a6
252 ; RV32IM-NEXT:    srli a6, a6, 6
253 ; RV32IM-NEXT:    mul a6, a6, a7
254 ; RV32IM-NEXT:    sub a1, a1, a6
255 ; RV32IM-NEXT:    mulhu a6, a3, a5
256 ; RV32IM-NEXT:    sub t0, a3, a6
257 ; RV32IM-NEXT:    srli t0, t0, 1
258 ; RV32IM-NEXT:    add a6, t0, a6
259 ; RV32IM-NEXT:    srli a6, a6, 6
260 ; RV32IM-NEXT:    mul a6, a6, a7
261 ; RV32IM-NEXT:    sub a3, a3, a6
262 ; RV32IM-NEXT:    mulhu a5, a2, a5
263 ; RV32IM-NEXT:    sub a6, a2, a5
264 ; RV32IM-NEXT:    srli a6, a6, 1
265 ; RV32IM-NEXT:    add a5, a6, a5
266 ; RV32IM-NEXT:    srli a5, a5, 6
267 ; RV32IM-NEXT:    mul a5, a5, a7
268 ; RV32IM-NEXT:    sub a2, a2, a5
269 ; RV32IM-NEXT:    sh a2, 6(a0)
270 ; RV32IM-NEXT:    sh a3, 4(a0)
271 ; RV32IM-NEXT:    sh a1, 2(a0)
272 ; RV32IM-NEXT:    sh a4, 0(a0)
273 ; RV32IM-NEXT:    ret
275 ; RV64I-LABEL: fold_urem_vec_2:
276 ; RV64I:       # %bb.0:
277 ; RV64I-NEXT:    addi sp, sp, -48
278 ; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
279 ; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
280 ; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
281 ; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
282 ; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
283 ; RV64I-NEXT:    sd s4, 0(sp) # 8-byte Folded Spill
284 ; RV64I-NEXT:    lhu s0, 24(a1)
285 ; RV64I-NEXT:    lhu s1, 16(a1)
286 ; RV64I-NEXT:    lhu s2, 8(a1)
287 ; RV64I-NEXT:    lhu a2, 0(a1)
288 ; RV64I-NEXT:    mv s3, a0
289 ; RV64I-NEXT:    li a1, 95
290 ; RV64I-NEXT:    mv a0, a2
291 ; RV64I-NEXT:    call __umoddi3@plt
292 ; RV64I-NEXT:    mv s4, a0
293 ; RV64I-NEXT:    li a1, 95
294 ; RV64I-NEXT:    mv a0, s2
295 ; RV64I-NEXT:    call __umoddi3@plt
296 ; RV64I-NEXT:    mv s2, a0
297 ; RV64I-NEXT:    li a1, 95
298 ; RV64I-NEXT:    mv a0, s1
299 ; RV64I-NEXT:    call __umoddi3@plt
300 ; RV64I-NEXT:    mv s1, a0
301 ; RV64I-NEXT:    li a1, 95
302 ; RV64I-NEXT:    mv a0, s0
303 ; RV64I-NEXT:    call __umoddi3@plt
304 ; RV64I-NEXT:    sh a0, 6(s3)
305 ; RV64I-NEXT:    sh s1, 4(s3)
306 ; RV64I-NEXT:    sh s2, 2(s3)
307 ; RV64I-NEXT:    sh s4, 0(s3)
308 ; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
309 ; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
310 ; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
311 ; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
312 ; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
313 ; RV64I-NEXT:    ld s4, 0(sp) # 8-byte Folded Reload
314 ; RV64I-NEXT:    addi sp, sp, 48
315 ; RV64I-NEXT:    ret
317 ; RV64IM-LABEL: fold_urem_vec_2:
318 ; RV64IM:       # %bb.0:
319 ; RV64IM-NEXT:    lhu a2, 0(a1)
320 ; RV64IM-NEXT:    lui a3, %hi(.LCPI1_0)
321 ; RV64IM-NEXT:    ld a3, %lo(.LCPI1_0)(a3)
322 ; RV64IM-NEXT:    lhu a4, 24(a1)
323 ; RV64IM-NEXT:    lhu a5, 16(a1)
324 ; RV64IM-NEXT:    lhu a1, 8(a1)
325 ; RV64IM-NEXT:    mulhu a6, a2, a3
326 ; RV64IM-NEXT:    sub a7, a2, a6
327 ; RV64IM-NEXT:    srli a7, a7, 1
328 ; RV64IM-NEXT:    add a6, a7, a6
329 ; RV64IM-NEXT:    srli a6, a6, 6
330 ; RV64IM-NEXT:    li a7, 95
331 ; RV64IM-NEXT:    mulw a6, a6, a7
332 ; RV64IM-NEXT:    subw a2, a2, a6
333 ; RV64IM-NEXT:    mulhu a6, a1, a3
334 ; RV64IM-NEXT:    sub t0, a1, a6
335 ; RV64IM-NEXT:    srli t0, t0, 1
336 ; RV64IM-NEXT:    add a6, t0, a6
337 ; RV64IM-NEXT:    srli a6, a6, 6
338 ; RV64IM-NEXT:    mulw a6, a6, a7
339 ; RV64IM-NEXT:    subw a1, a1, a6
340 ; RV64IM-NEXT:    mulhu a6, a5, a3
341 ; RV64IM-NEXT:    sub t0, a5, a6
342 ; RV64IM-NEXT:    srli t0, t0, 1
343 ; RV64IM-NEXT:    add a6, t0, a6
344 ; RV64IM-NEXT:    srli a6, a6, 6
345 ; RV64IM-NEXT:    mulw a6, a6, a7
346 ; RV64IM-NEXT:    subw a5, a5, a6
347 ; RV64IM-NEXT:    mulhu a3, a4, a3
348 ; RV64IM-NEXT:    sub a6, a4, a3
349 ; RV64IM-NEXT:    srli a6, a6, 1
350 ; RV64IM-NEXT:    add a3, a6, a3
351 ; RV64IM-NEXT:    srli a3, a3, 6
352 ; RV64IM-NEXT:    mulw a3, a3, a7
353 ; RV64IM-NEXT:    subw a3, a4, a3
354 ; RV64IM-NEXT:    sh a3, 6(a0)
355 ; RV64IM-NEXT:    sh a5, 4(a0)
356 ; RV64IM-NEXT:    sh a1, 2(a0)
357 ; RV64IM-NEXT:    sh a2, 0(a0)
358 ; RV64IM-NEXT:    ret
359   %1 = urem <4 x i16> %x, <i16 95, i16 95, i16 95, i16 95>
360   ret <4 x i16> %1
364 ; Don't fold if we can combine urem with udiv.
365 define <4 x i16> @combine_urem_udiv(<4 x i16> %x) nounwind {
366 ; RV32I-LABEL: combine_urem_udiv:
367 ; RV32I:       # %bb.0:
368 ; RV32I-NEXT:    addi sp, sp, -48
369 ; RV32I-NEXT:    sw ra, 44(sp) # 4-byte Folded Spill
370 ; RV32I-NEXT:    sw s0, 40(sp) # 4-byte Folded Spill
371 ; RV32I-NEXT:    sw s1, 36(sp) # 4-byte Folded Spill
372 ; RV32I-NEXT:    sw s2, 32(sp) # 4-byte Folded Spill
373 ; RV32I-NEXT:    sw s3, 28(sp) # 4-byte Folded Spill
374 ; RV32I-NEXT:    sw s4, 24(sp) # 4-byte Folded Spill
375 ; RV32I-NEXT:    sw s5, 20(sp) # 4-byte Folded Spill
376 ; RV32I-NEXT:    sw s6, 16(sp) # 4-byte Folded Spill
377 ; RV32I-NEXT:    sw s7, 12(sp) # 4-byte Folded Spill
378 ; RV32I-NEXT:    sw s8, 8(sp) # 4-byte Folded Spill
379 ; RV32I-NEXT:    lhu s1, 0(a1)
380 ; RV32I-NEXT:    lhu s2, 4(a1)
381 ; RV32I-NEXT:    lhu s3, 8(a1)
382 ; RV32I-NEXT:    lhu s4, 12(a1)
383 ; RV32I-NEXT:    mv s0, a0
384 ; RV32I-NEXT:    li a1, 95
385 ; RV32I-NEXT:    mv a0, s4
386 ; RV32I-NEXT:    call __umodsi3@plt
387 ; RV32I-NEXT:    mv s5, a0
388 ; RV32I-NEXT:    li a1, 95
389 ; RV32I-NEXT:    mv a0, s3
390 ; RV32I-NEXT:    call __umodsi3@plt
391 ; RV32I-NEXT:    mv s6, a0
392 ; RV32I-NEXT:    li a1, 95
393 ; RV32I-NEXT:    mv a0, s2
394 ; RV32I-NEXT:    call __umodsi3@plt
395 ; RV32I-NEXT:    mv s7, a0
396 ; RV32I-NEXT:    li a1, 95
397 ; RV32I-NEXT:    mv a0, s1
398 ; RV32I-NEXT:    call __umodsi3@plt
399 ; RV32I-NEXT:    mv s8, a0
400 ; RV32I-NEXT:    li a1, 95
401 ; RV32I-NEXT:    mv a0, s4
402 ; RV32I-NEXT:    call __udivsi3@plt
403 ; RV32I-NEXT:    mv s4, a0
404 ; RV32I-NEXT:    li a1, 95
405 ; RV32I-NEXT:    mv a0, s3
406 ; RV32I-NEXT:    call __udivsi3@plt
407 ; RV32I-NEXT:    mv s3, a0
408 ; RV32I-NEXT:    li a1, 95
409 ; RV32I-NEXT:    mv a0, s2
410 ; RV32I-NEXT:    call __udivsi3@plt
411 ; RV32I-NEXT:    mv s2, a0
412 ; RV32I-NEXT:    li a1, 95
413 ; RV32I-NEXT:    mv a0, s1
414 ; RV32I-NEXT:    call __udivsi3@plt
415 ; RV32I-NEXT:    add a0, s8, a0
416 ; RV32I-NEXT:    add a1, s7, s2
417 ; RV32I-NEXT:    add a2, s6, s3
418 ; RV32I-NEXT:    add a3, s5, s4
419 ; RV32I-NEXT:    sh a3, 6(s0)
420 ; RV32I-NEXT:    sh a2, 4(s0)
421 ; RV32I-NEXT:    sh a1, 2(s0)
422 ; RV32I-NEXT:    sh a0, 0(s0)
423 ; RV32I-NEXT:    lw ra, 44(sp) # 4-byte Folded Reload
424 ; RV32I-NEXT:    lw s0, 40(sp) # 4-byte Folded Reload
425 ; RV32I-NEXT:    lw s1, 36(sp) # 4-byte Folded Reload
426 ; RV32I-NEXT:    lw s2, 32(sp) # 4-byte Folded Reload
427 ; RV32I-NEXT:    lw s3, 28(sp) # 4-byte Folded Reload
428 ; RV32I-NEXT:    lw s4, 24(sp) # 4-byte Folded Reload
429 ; RV32I-NEXT:    lw s5, 20(sp) # 4-byte Folded Reload
430 ; RV32I-NEXT:    lw s6, 16(sp) # 4-byte Folded Reload
431 ; RV32I-NEXT:    lw s7, 12(sp) # 4-byte Folded Reload
432 ; RV32I-NEXT:    lw s8, 8(sp) # 4-byte Folded Reload
433 ; RV32I-NEXT:    addi sp, sp, 48
434 ; RV32I-NEXT:    ret
436 ; RV32IM-LABEL: combine_urem_udiv:
437 ; RV32IM:       # %bb.0:
438 ; RV32IM-NEXT:    lhu a2, 0(a1)
439 ; RV32IM-NEXT:    lhu a3, 4(a1)
440 ; RV32IM-NEXT:    lhu a4, 12(a1)
441 ; RV32IM-NEXT:    lhu a1, 8(a1)
442 ; RV32IM-NEXT:    lui a5, 364242
443 ; RV32IM-NEXT:    addi a5, a5, 777
444 ; RV32IM-NEXT:    mulhu a6, a4, a5
445 ; RV32IM-NEXT:    sub a7, a4, a6
446 ; RV32IM-NEXT:    srli a7, a7, 1
447 ; RV32IM-NEXT:    add a6, a7, a6
448 ; RV32IM-NEXT:    srli a6, a6, 6
449 ; RV32IM-NEXT:    li a7, 95
450 ; RV32IM-NEXT:    mul t0, a6, a7
451 ; RV32IM-NEXT:    sub a4, a4, t0
452 ; RV32IM-NEXT:    mulhu t0, a1, a5
453 ; RV32IM-NEXT:    sub t1, a1, t0
454 ; RV32IM-NEXT:    srli t1, t1, 1
455 ; RV32IM-NEXT:    add t0, t1, t0
456 ; RV32IM-NEXT:    srli t0, t0, 6
457 ; RV32IM-NEXT:    mul t1, t0, a7
458 ; RV32IM-NEXT:    sub a1, a1, t1
459 ; RV32IM-NEXT:    mulhu t1, a3, a5
460 ; RV32IM-NEXT:    sub t2, a3, t1
461 ; RV32IM-NEXT:    srli t2, t2, 1
462 ; RV32IM-NEXT:    add t1, t2, t1
463 ; RV32IM-NEXT:    srli t1, t1, 6
464 ; RV32IM-NEXT:    mul t2, t1, a7
465 ; RV32IM-NEXT:    sub a3, a3, t2
466 ; RV32IM-NEXT:    mulhu a5, a2, a5
467 ; RV32IM-NEXT:    sub t2, a2, a5
468 ; RV32IM-NEXT:    srli t2, t2, 1
469 ; RV32IM-NEXT:    add a5, t2, a5
470 ; RV32IM-NEXT:    srli a5, a5, 6
471 ; RV32IM-NEXT:    mul a7, a5, a7
472 ; RV32IM-NEXT:    sub a2, a2, a7
473 ; RV32IM-NEXT:    add a2, a2, a5
474 ; RV32IM-NEXT:    add a3, a3, t1
475 ; RV32IM-NEXT:    add a1, a1, t0
476 ; RV32IM-NEXT:    add a4, a4, a6
477 ; RV32IM-NEXT:    sh a4, 6(a0)
478 ; RV32IM-NEXT:    sh a1, 4(a0)
479 ; RV32IM-NEXT:    sh a3, 2(a0)
480 ; RV32IM-NEXT:    sh a2, 0(a0)
481 ; RV32IM-NEXT:    ret
483 ; RV64I-LABEL: combine_urem_udiv:
484 ; RV64I:       # %bb.0:
485 ; RV64I-NEXT:    addi sp, sp, -80
486 ; RV64I-NEXT:    sd ra, 72(sp) # 8-byte Folded Spill
487 ; RV64I-NEXT:    sd s0, 64(sp) # 8-byte Folded Spill
488 ; RV64I-NEXT:    sd s1, 56(sp) # 8-byte Folded Spill
489 ; RV64I-NEXT:    sd s2, 48(sp) # 8-byte Folded Spill
490 ; RV64I-NEXT:    sd s3, 40(sp) # 8-byte Folded Spill
491 ; RV64I-NEXT:    sd s4, 32(sp) # 8-byte Folded Spill
492 ; RV64I-NEXT:    sd s5, 24(sp) # 8-byte Folded Spill
493 ; RV64I-NEXT:    sd s6, 16(sp) # 8-byte Folded Spill
494 ; RV64I-NEXT:    sd s7, 8(sp) # 8-byte Folded Spill
495 ; RV64I-NEXT:    sd s8, 0(sp) # 8-byte Folded Spill
496 ; RV64I-NEXT:    lhu s1, 0(a1)
497 ; RV64I-NEXT:    lhu s2, 8(a1)
498 ; RV64I-NEXT:    lhu s3, 16(a1)
499 ; RV64I-NEXT:    lhu s4, 24(a1)
500 ; RV64I-NEXT:    mv s0, a0
501 ; RV64I-NEXT:    li a1, 95
502 ; RV64I-NEXT:    mv a0, s4
503 ; RV64I-NEXT:    call __umoddi3@plt
504 ; RV64I-NEXT:    mv s5, a0
505 ; RV64I-NEXT:    li a1, 95
506 ; RV64I-NEXT:    mv a0, s3
507 ; RV64I-NEXT:    call __umoddi3@plt
508 ; RV64I-NEXT:    mv s6, a0
509 ; RV64I-NEXT:    li a1, 95
510 ; RV64I-NEXT:    mv a0, s2
511 ; RV64I-NEXT:    call __umoddi3@plt
512 ; RV64I-NEXT:    mv s7, a0
513 ; RV64I-NEXT:    li a1, 95
514 ; RV64I-NEXT:    mv a0, s1
515 ; RV64I-NEXT:    call __umoddi3@plt
516 ; RV64I-NEXT:    mv s8, a0
517 ; RV64I-NEXT:    li a1, 95
518 ; RV64I-NEXT:    mv a0, s4
519 ; RV64I-NEXT:    call __udivdi3@plt
520 ; RV64I-NEXT:    mv s4, a0
521 ; RV64I-NEXT:    li a1, 95
522 ; RV64I-NEXT:    mv a0, s3
523 ; RV64I-NEXT:    call __udivdi3@plt
524 ; RV64I-NEXT:    mv s3, a0
525 ; RV64I-NEXT:    li a1, 95
526 ; RV64I-NEXT:    mv a0, s2
527 ; RV64I-NEXT:    call __udivdi3@plt
528 ; RV64I-NEXT:    mv s2, a0
529 ; RV64I-NEXT:    li a1, 95
530 ; RV64I-NEXT:    mv a0, s1
531 ; RV64I-NEXT:    call __udivdi3@plt
532 ; RV64I-NEXT:    addw a0, s8, a0
533 ; RV64I-NEXT:    addw a1, s7, s2
534 ; RV64I-NEXT:    addw a2, s6, s3
535 ; RV64I-NEXT:    addw a3, s5, s4
536 ; RV64I-NEXT:    sh a3, 6(s0)
537 ; RV64I-NEXT:    sh a2, 4(s0)
538 ; RV64I-NEXT:    sh a1, 2(s0)
539 ; RV64I-NEXT:    sh a0, 0(s0)
540 ; RV64I-NEXT:    ld ra, 72(sp) # 8-byte Folded Reload
541 ; RV64I-NEXT:    ld s0, 64(sp) # 8-byte Folded Reload
542 ; RV64I-NEXT:    ld s1, 56(sp) # 8-byte Folded Reload
543 ; RV64I-NEXT:    ld s2, 48(sp) # 8-byte Folded Reload
544 ; RV64I-NEXT:    ld s3, 40(sp) # 8-byte Folded Reload
545 ; RV64I-NEXT:    ld s4, 32(sp) # 8-byte Folded Reload
546 ; RV64I-NEXT:    ld s5, 24(sp) # 8-byte Folded Reload
547 ; RV64I-NEXT:    ld s6, 16(sp) # 8-byte Folded Reload
548 ; RV64I-NEXT:    ld s7, 8(sp) # 8-byte Folded Reload
549 ; RV64I-NEXT:    ld s8, 0(sp) # 8-byte Folded Reload
550 ; RV64I-NEXT:    addi sp, sp, 80
551 ; RV64I-NEXT:    ret
553 ; RV64IM-LABEL: combine_urem_udiv:
554 ; RV64IM:       # %bb.0:
555 ; RV64IM-NEXT:    lhu a2, 24(a1)
556 ; RV64IM-NEXT:    lui a3, %hi(.LCPI2_0)
557 ; RV64IM-NEXT:    ld a3, %lo(.LCPI2_0)(a3)
558 ; RV64IM-NEXT:    lhu a4, 0(a1)
559 ; RV64IM-NEXT:    lhu a5, 8(a1)
560 ; RV64IM-NEXT:    lhu a1, 16(a1)
561 ; RV64IM-NEXT:    mulhu a6, a2, a3
562 ; RV64IM-NEXT:    sub a7, a2, a6
563 ; RV64IM-NEXT:    srli a7, a7, 1
564 ; RV64IM-NEXT:    add a6, a7, a6
565 ; RV64IM-NEXT:    srli a6, a6, 6
566 ; RV64IM-NEXT:    li a7, 95
567 ; RV64IM-NEXT:    mulw t0, a6, a7
568 ; RV64IM-NEXT:    subw a2, a2, t0
569 ; RV64IM-NEXT:    mulhu t0, a1, a3
570 ; RV64IM-NEXT:    sub t1, a1, t0
571 ; RV64IM-NEXT:    srli t1, t1, 1
572 ; RV64IM-NEXT:    add t0, t1, t0
573 ; RV64IM-NEXT:    srli t0, t0, 6
574 ; RV64IM-NEXT:    mulw t1, t0, a7
575 ; RV64IM-NEXT:    subw a1, a1, t1
576 ; RV64IM-NEXT:    mulhu t1, a5, a3
577 ; RV64IM-NEXT:    sub t2, a5, t1
578 ; RV64IM-NEXT:    srli t2, t2, 1
579 ; RV64IM-NEXT:    add t1, t2, t1
580 ; RV64IM-NEXT:    srli t1, t1, 6
581 ; RV64IM-NEXT:    mulw t2, t1, a7
582 ; RV64IM-NEXT:    subw a5, a5, t2
583 ; RV64IM-NEXT:    mulhu a3, a4, a3
584 ; RV64IM-NEXT:    sub t2, a4, a3
585 ; RV64IM-NEXT:    srli t2, t2, 1
586 ; RV64IM-NEXT:    add a3, t2, a3
587 ; RV64IM-NEXT:    srli a3, a3, 6
588 ; RV64IM-NEXT:    mulw a7, a3, a7
589 ; RV64IM-NEXT:    subw a4, a4, a7
590 ; RV64IM-NEXT:    addw a3, a4, a3
591 ; RV64IM-NEXT:    addw a4, a5, t1
592 ; RV64IM-NEXT:    addw a1, a1, t0
593 ; RV64IM-NEXT:    addw a2, a2, a6
594 ; RV64IM-NEXT:    sh a2, 6(a0)
595 ; RV64IM-NEXT:    sh a1, 4(a0)
596 ; RV64IM-NEXT:    sh a4, 2(a0)
597 ; RV64IM-NEXT:    sh a3, 0(a0)
598 ; RV64IM-NEXT:    ret
599   %1 = urem <4 x i16> %x, <i16 95, i16 95, i16 95, i16 95>
600   %2 = udiv <4 x i16> %x, <i16 95, i16 95, i16 95, i16 95>
601   %3 = add <4 x i16> %1, %2
602   ret <4 x i16> %3
605 ; Don't fold for divisors that are a power of two.
606 define <4 x i16> @dont_fold_urem_power_of_two(<4 x i16> %x) nounwind {
607 ; RV32I-LABEL: dont_fold_urem_power_of_two:
608 ; RV32I:       # %bb.0:
609 ; RV32I-NEXT:    addi sp, sp, -32
610 ; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
611 ; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
612 ; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
613 ; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
614 ; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
615 ; RV32I-NEXT:    lhu s1, 8(a1)
616 ; RV32I-NEXT:    lhu s2, 4(a1)
617 ; RV32I-NEXT:    lhu s3, 0(a1)
618 ; RV32I-NEXT:    lhu a2, 12(a1)
619 ; RV32I-NEXT:    mv s0, a0
620 ; RV32I-NEXT:    li a1, 95
621 ; RV32I-NEXT:    mv a0, a2
622 ; RV32I-NEXT:    call __umodsi3@plt
623 ; RV32I-NEXT:    andi a1, s3, 63
624 ; RV32I-NEXT:    andi a2, s2, 31
625 ; RV32I-NEXT:    andi a3, s1, 7
626 ; RV32I-NEXT:    sh a0, 6(s0)
627 ; RV32I-NEXT:    sh a3, 4(s0)
628 ; RV32I-NEXT:    sh a2, 2(s0)
629 ; RV32I-NEXT:    sh a1, 0(s0)
630 ; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
631 ; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
632 ; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
633 ; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
634 ; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
635 ; RV32I-NEXT:    addi sp, sp, 32
636 ; RV32I-NEXT:    ret
638 ; RV32IM-LABEL: dont_fold_urem_power_of_two:
639 ; RV32IM:       # %bb.0:
640 ; RV32IM-NEXT:    lhu a2, 8(a1)
641 ; RV32IM-NEXT:    lhu a3, 4(a1)
642 ; RV32IM-NEXT:    lhu a4, 12(a1)
643 ; RV32IM-NEXT:    lhu a1, 0(a1)
644 ; RV32IM-NEXT:    lui a5, 364242
645 ; RV32IM-NEXT:    addi a5, a5, 777
646 ; RV32IM-NEXT:    mulhu a5, a4, a5
647 ; RV32IM-NEXT:    sub a6, a4, a5
648 ; RV32IM-NEXT:    srli a6, a6, 1
649 ; RV32IM-NEXT:    add a5, a6, a5
650 ; RV32IM-NEXT:    srli a5, a5, 6
651 ; RV32IM-NEXT:    li a6, 95
652 ; RV32IM-NEXT:    mul a5, a5, a6
653 ; RV32IM-NEXT:    sub a4, a4, a5
654 ; RV32IM-NEXT:    andi a1, a1, 63
655 ; RV32IM-NEXT:    andi a3, a3, 31
656 ; RV32IM-NEXT:    andi a2, a2, 7
657 ; RV32IM-NEXT:    sh a2, 4(a0)
658 ; RV32IM-NEXT:    sh a3, 2(a0)
659 ; RV32IM-NEXT:    sh a1, 0(a0)
660 ; RV32IM-NEXT:    sh a4, 6(a0)
661 ; RV32IM-NEXT:    ret
663 ; RV64I-LABEL: dont_fold_urem_power_of_two:
664 ; RV64I:       # %bb.0:
665 ; RV64I-NEXT:    addi sp, sp, -48
666 ; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
667 ; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
668 ; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
669 ; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
670 ; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
671 ; RV64I-NEXT:    lhu s1, 16(a1)
672 ; RV64I-NEXT:    lhu s2, 8(a1)
673 ; RV64I-NEXT:    lhu s3, 0(a1)
674 ; RV64I-NEXT:    lhu a2, 24(a1)
675 ; RV64I-NEXT:    mv s0, a0
676 ; RV64I-NEXT:    li a1, 95
677 ; RV64I-NEXT:    mv a0, a2
678 ; RV64I-NEXT:    call __umoddi3@plt
679 ; RV64I-NEXT:    andi a1, s3, 63
680 ; RV64I-NEXT:    andi a2, s2, 31
681 ; RV64I-NEXT:    andi a3, s1, 7
682 ; RV64I-NEXT:    sh a0, 6(s0)
683 ; RV64I-NEXT:    sh a3, 4(s0)
684 ; RV64I-NEXT:    sh a2, 2(s0)
685 ; RV64I-NEXT:    sh a1, 0(s0)
686 ; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
687 ; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
688 ; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
689 ; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
690 ; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
691 ; RV64I-NEXT:    addi sp, sp, 48
692 ; RV64I-NEXT:    ret
694 ; RV64IM-LABEL: dont_fold_urem_power_of_two:
695 ; RV64IM:       # %bb.0:
696 ; RV64IM-NEXT:    lhu a2, 24(a1)
697 ; RV64IM-NEXT:    lui a3, %hi(.LCPI3_0)
698 ; RV64IM-NEXT:    ld a3, %lo(.LCPI3_0)(a3)
699 ; RV64IM-NEXT:    lhu a4, 16(a1)
700 ; RV64IM-NEXT:    lhu a5, 8(a1)
701 ; RV64IM-NEXT:    lhu a1, 0(a1)
702 ; RV64IM-NEXT:    mulhu a3, a2, a3
703 ; RV64IM-NEXT:    sub a6, a2, a3
704 ; RV64IM-NEXT:    srli a6, a6, 1
705 ; RV64IM-NEXT:    add a3, a6, a3
706 ; RV64IM-NEXT:    srli a3, a3, 6
707 ; RV64IM-NEXT:    li a6, 95
708 ; RV64IM-NEXT:    mulw a3, a3, a6
709 ; RV64IM-NEXT:    subw a2, a2, a3
710 ; RV64IM-NEXT:    andi a1, a1, 63
711 ; RV64IM-NEXT:    andi a3, a5, 31
712 ; RV64IM-NEXT:    andi a4, a4, 7
713 ; RV64IM-NEXT:    sh a4, 4(a0)
714 ; RV64IM-NEXT:    sh a3, 2(a0)
715 ; RV64IM-NEXT:    sh a1, 0(a0)
716 ; RV64IM-NEXT:    sh a2, 6(a0)
717 ; RV64IM-NEXT:    ret
718   %1 = urem <4 x i16> %x, <i16 64, i16 32, i16 8, i16 95>
719   ret <4 x i16> %1
722 ; Don't fold if the divisor is one.
723 define <4 x i16> @dont_fold_urem_one(<4 x i16> %x) nounwind {
724 ; RV32I-LABEL: dont_fold_urem_one:
725 ; RV32I:       # %bb.0:
726 ; RV32I-NEXT:    addi sp, sp, -32
727 ; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
728 ; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
729 ; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
730 ; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill
731 ; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill
732 ; RV32I-NEXT:    lhu s0, 12(a1)
733 ; RV32I-NEXT:    lhu s1, 8(a1)
734 ; RV32I-NEXT:    lhu a2, 4(a1)
735 ; RV32I-NEXT:    mv s2, a0
736 ; RV32I-NEXT:    li a1, 654
737 ; RV32I-NEXT:    mv a0, a2
738 ; RV32I-NEXT:    call __umodsi3@plt
739 ; RV32I-NEXT:    mv s3, a0
740 ; RV32I-NEXT:    li a1, 23
741 ; RV32I-NEXT:    mv a0, s1
742 ; RV32I-NEXT:    call __umodsi3@plt
743 ; RV32I-NEXT:    mv s1, a0
744 ; RV32I-NEXT:    lui a0, 1
745 ; RV32I-NEXT:    addi a1, a0, 1327
746 ; RV32I-NEXT:    mv a0, s0
747 ; RV32I-NEXT:    call __umodsi3@plt
748 ; RV32I-NEXT:    sh a0, 6(s2)
749 ; RV32I-NEXT:    sh s1, 4(s2)
750 ; RV32I-NEXT:    sh s3, 2(s2)
751 ; RV32I-NEXT:    sh zero, 0(s2)
752 ; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
753 ; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
754 ; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
755 ; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload
756 ; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload
757 ; RV32I-NEXT:    addi sp, sp, 32
758 ; RV32I-NEXT:    ret
760 ; RV32IM-LABEL: dont_fold_urem_one:
761 ; RV32IM:       # %bb.0:
762 ; RV32IM-NEXT:    lhu a2, 4(a1)
763 ; RV32IM-NEXT:    lhu a3, 12(a1)
764 ; RV32IM-NEXT:    lhu a1, 8(a1)
765 ; RV32IM-NEXT:    srli a4, a2, 1
766 ; RV32IM-NEXT:    lui a5, 820904
767 ; RV32IM-NEXT:    addi a5, a5, -1903
768 ; RV32IM-NEXT:    mulhu a4, a4, a5
769 ; RV32IM-NEXT:    srli a4, a4, 8
770 ; RV32IM-NEXT:    li a5, 654
771 ; RV32IM-NEXT:    mul a4, a4, a5
772 ; RV32IM-NEXT:    sub a2, a2, a4
773 ; RV32IM-NEXT:    lui a4, 729444
774 ; RV32IM-NEXT:    addi a4, a4, 713
775 ; RV32IM-NEXT:    mulhu a4, a1, a4
776 ; RV32IM-NEXT:    srli a4, a4, 4
777 ; RV32IM-NEXT:    li a5, 23
778 ; RV32IM-NEXT:    mul a4, a4, a5
779 ; RV32IM-NEXT:    sub a1, a1, a4
780 ; RV32IM-NEXT:    lui a4, 395996
781 ; RV32IM-NEXT:    addi a4, a4, -2009
782 ; RV32IM-NEXT:    mulhu a4, a3, a4
783 ; RV32IM-NEXT:    srli a4, a4, 11
784 ; RV32IM-NEXT:    lui a5, 1
785 ; RV32IM-NEXT:    addi a5, a5, 1327
786 ; RV32IM-NEXT:    mul a4, a4, a5
787 ; RV32IM-NEXT:    sub a3, a3, a4
788 ; RV32IM-NEXT:    sh zero, 0(a0)
789 ; RV32IM-NEXT:    sh a3, 6(a0)
790 ; RV32IM-NEXT:    sh a1, 4(a0)
791 ; RV32IM-NEXT:    sh a2, 2(a0)
792 ; RV32IM-NEXT:    ret
794 ; RV64I-LABEL: dont_fold_urem_one:
795 ; RV64I:       # %bb.0:
796 ; RV64I-NEXT:    addi sp, sp, -48
797 ; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
798 ; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
799 ; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
800 ; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
801 ; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
802 ; RV64I-NEXT:    lhu s0, 24(a1)
803 ; RV64I-NEXT:    lhu s1, 16(a1)
804 ; RV64I-NEXT:    lhu a2, 8(a1)
805 ; RV64I-NEXT:    mv s2, a0
806 ; RV64I-NEXT:    li a1, 654
807 ; RV64I-NEXT:    mv a0, a2
808 ; RV64I-NEXT:    call __umoddi3@plt
809 ; RV64I-NEXT:    mv s3, a0
810 ; RV64I-NEXT:    li a1, 23
811 ; RV64I-NEXT:    mv a0, s1
812 ; RV64I-NEXT:    call __umoddi3@plt
813 ; RV64I-NEXT:    mv s1, a0
814 ; RV64I-NEXT:    lui a0, 1
815 ; RV64I-NEXT:    addiw a1, a0, 1327
816 ; RV64I-NEXT:    mv a0, s0
817 ; RV64I-NEXT:    call __umoddi3@plt
818 ; RV64I-NEXT:    sh a0, 6(s2)
819 ; RV64I-NEXT:    sh s1, 4(s2)
820 ; RV64I-NEXT:    sh s3, 2(s2)
821 ; RV64I-NEXT:    sh zero, 0(s2)
822 ; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
823 ; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
824 ; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
825 ; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
826 ; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
827 ; RV64I-NEXT:    addi sp, sp, 48
828 ; RV64I-NEXT:    ret
830 ; RV64IM-LABEL: dont_fold_urem_one:
831 ; RV64IM:       # %bb.0:
832 ; RV64IM-NEXT:    lhu a2, 16(a1)
833 ; RV64IM-NEXT:    lui a3, %hi(.LCPI4_0)
834 ; RV64IM-NEXT:    ld a3, %lo(.LCPI4_0)(a3)
835 ; RV64IM-NEXT:    lhu a4, 24(a1)
836 ; RV64IM-NEXT:    lhu a1, 8(a1)
837 ; RV64IM-NEXT:    mulhu a3, a2, a3
838 ; RV64IM-NEXT:    sub a5, a2, a3
839 ; RV64IM-NEXT:    srli a5, a5, 1
840 ; RV64IM-NEXT:    add a3, a5, a3
841 ; RV64IM-NEXT:    srli a3, a3, 4
842 ; RV64IM-NEXT:    li a5, 23
843 ; RV64IM-NEXT:    lui a6, %hi(.LCPI4_1)
844 ; RV64IM-NEXT:    ld a6, %lo(.LCPI4_1)(a6)
845 ; RV64IM-NEXT:    mulw a3, a3, a5
846 ; RV64IM-NEXT:    subw a2, a2, a3
847 ; RV64IM-NEXT:    srli a3, a1, 1
848 ; RV64IM-NEXT:    mulhu a3, a3, a6
849 ; RV64IM-NEXT:    srli a3, a3, 7
850 ; RV64IM-NEXT:    lui a5, %hi(.LCPI4_2)
851 ; RV64IM-NEXT:    ld a5, %lo(.LCPI4_2)(a5)
852 ; RV64IM-NEXT:    li a6, 654
853 ; RV64IM-NEXT:    mulw a3, a3, a6
854 ; RV64IM-NEXT:    subw a1, a1, a3
855 ; RV64IM-NEXT:    mulhu a3, a4, a5
856 ; RV64IM-NEXT:    srli a3, a3, 12
857 ; RV64IM-NEXT:    lui a5, 1
858 ; RV64IM-NEXT:    addiw a5, a5, 1327
859 ; RV64IM-NEXT:    mulw a3, a3, a5
860 ; RV64IM-NEXT:    subw a3, a4, a3
861 ; RV64IM-NEXT:    sh zero, 0(a0)
862 ; RV64IM-NEXT:    sh a3, 6(a0)
863 ; RV64IM-NEXT:    sh a1, 2(a0)
864 ; RV64IM-NEXT:    sh a2, 4(a0)
865 ; RV64IM-NEXT:    ret
866   %1 = urem <4 x i16> %x, <i16 1, i16 654, i16 23, i16 5423>
867   ret <4 x i16> %1
870 ; Don't fold if the divisor is 2^16.
871 define <4 x i16> @dont_fold_urem_i16_smax(<4 x i16> %x) nounwind {
872 ; CHECK-LABEL: dont_fold_urem_i16_smax:
873 ; CHECK:       # %bb.0:
874 ; CHECK-NEXT:    ret
875   %1 = urem <4 x i16> %x, <i16 1, i16 65536, i16 23, i16 5423>
876   ret <4 x i16> %1
879 ; Don't fold i64 urem.
880 define <4 x i64> @dont_fold_urem_i64(<4 x i64> %x) nounwind {
881 ; RV32I-LABEL: dont_fold_urem_i64:
882 ; RV32I:       # %bb.0:
883 ; RV32I-NEXT:    addi sp, sp, -48
884 ; RV32I-NEXT:    sw ra, 44(sp) # 4-byte Folded Spill
885 ; RV32I-NEXT:    sw s0, 40(sp) # 4-byte Folded Spill
886 ; RV32I-NEXT:    sw s1, 36(sp) # 4-byte Folded Spill
887 ; RV32I-NEXT:    sw s2, 32(sp) # 4-byte Folded Spill
888 ; RV32I-NEXT:    sw s3, 28(sp) # 4-byte Folded Spill
889 ; RV32I-NEXT:    sw s4, 24(sp) # 4-byte Folded Spill
890 ; RV32I-NEXT:    sw s5, 20(sp) # 4-byte Folded Spill
891 ; RV32I-NEXT:    sw s6, 16(sp) # 4-byte Folded Spill
892 ; RV32I-NEXT:    sw s7, 12(sp) # 4-byte Folded Spill
893 ; RV32I-NEXT:    sw s8, 8(sp) # 4-byte Folded Spill
894 ; RV32I-NEXT:    lw s0, 24(a1)
895 ; RV32I-NEXT:    lw s1, 28(a1)
896 ; RV32I-NEXT:    lw s2, 16(a1)
897 ; RV32I-NEXT:    lw s3, 20(a1)
898 ; RV32I-NEXT:    lw s4, 8(a1)
899 ; RV32I-NEXT:    lw s5, 12(a1)
900 ; RV32I-NEXT:    lw a3, 0(a1)
901 ; RV32I-NEXT:    lw a1, 4(a1)
902 ; RV32I-NEXT:    mv s6, a0
903 ; RV32I-NEXT:    li a2, 1
904 ; RV32I-NEXT:    mv a0, a3
905 ; RV32I-NEXT:    li a3, 0
906 ; RV32I-NEXT:    call __umoddi3@plt
907 ; RV32I-NEXT:    mv s7, a0
908 ; RV32I-NEXT:    mv s8, a1
909 ; RV32I-NEXT:    li a2, 654
910 ; RV32I-NEXT:    mv a0, s4
911 ; RV32I-NEXT:    mv a1, s5
912 ; RV32I-NEXT:    li a3, 0
913 ; RV32I-NEXT:    call __umoddi3@plt
914 ; RV32I-NEXT:    mv s4, a0
915 ; RV32I-NEXT:    mv s5, a1
916 ; RV32I-NEXT:    li a2, 23
917 ; RV32I-NEXT:    mv a0, s2
918 ; RV32I-NEXT:    mv a1, s3
919 ; RV32I-NEXT:    li a3, 0
920 ; RV32I-NEXT:    call __umoddi3@plt
921 ; RV32I-NEXT:    mv s2, a0
922 ; RV32I-NEXT:    mv s3, a1
923 ; RV32I-NEXT:    lui a0, 1
924 ; RV32I-NEXT:    addi a2, a0, 1327
925 ; RV32I-NEXT:    mv a0, s0
926 ; RV32I-NEXT:    mv a1, s1
927 ; RV32I-NEXT:    li a3, 0
928 ; RV32I-NEXT:    call __umoddi3@plt
929 ; RV32I-NEXT:    sw a1, 28(s6)
930 ; RV32I-NEXT:    sw a0, 24(s6)
931 ; RV32I-NEXT:    sw s3, 20(s6)
932 ; RV32I-NEXT:    sw s2, 16(s6)
933 ; RV32I-NEXT:    sw s5, 12(s6)
934 ; RV32I-NEXT:    sw s4, 8(s6)
935 ; RV32I-NEXT:    sw s8, 4(s6)
936 ; RV32I-NEXT:    sw s7, 0(s6)
937 ; RV32I-NEXT:    lw ra, 44(sp) # 4-byte Folded Reload
938 ; RV32I-NEXT:    lw s0, 40(sp) # 4-byte Folded Reload
939 ; RV32I-NEXT:    lw s1, 36(sp) # 4-byte Folded Reload
940 ; RV32I-NEXT:    lw s2, 32(sp) # 4-byte Folded Reload
941 ; RV32I-NEXT:    lw s3, 28(sp) # 4-byte Folded Reload
942 ; RV32I-NEXT:    lw s4, 24(sp) # 4-byte Folded Reload
943 ; RV32I-NEXT:    lw s5, 20(sp) # 4-byte Folded Reload
944 ; RV32I-NEXT:    lw s6, 16(sp) # 4-byte Folded Reload
945 ; RV32I-NEXT:    lw s7, 12(sp) # 4-byte Folded Reload
946 ; RV32I-NEXT:    lw s8, 8(sp) # 4-byte Folded Reload
947 ; RV32I-NEXT:    addi sp, sp, 48
948 ; RV32I-NEXT:    ret
950 ; RV32IM-LABEL: dont_fold_urem_i64:
951 ; RV32IM:       # %bb.0:
952 ; RV32IM-NEXT:    addi sp, sp, -48
953 ; RV32IM-NEXT:    sw ra, 44(sp) # 4-byte Folded Spill
954 ; RV32IM-NEXT:    sw s0, 40(sp) # 4-byte Folded Spill
955 ; RV32IM-NEXT:    sw s1, 36(sp) # 4-byte Folded Spill
956 ; RV32IM-NEXT:    sw s2, 32(sp) # 4-byte Folded Spill
957 ; RV32IM-NEXT:    sw s3, 28(sp) # 4-byte Folded Spill
958 ; RV32IM-NEXT:    sw s4, 24(sp) # 4-byte Folded Spill
959 ; RV32IM-NEXT:    sw s5, 20(sp) # 4-byte Folded Spill
960 ; RV32IM-NEXT:    sw s6, 16(sp) # 4-byte Folded Spill
961 ; RV32IM-NEXT:    sw s7, 12(sp) # 4-byte Folded Spill
962 ; RV32IM-NEXT:    sw s8, 8(sp) # 4-byte Folded Spill
963 ; RV32IM-NEXT:    lw s0, 24(a1)
964 ; RV32IM-NEXT:    lw s1, 28(a1)
965 ; RV32IM-NEXT:    lw s2, 16(a1)
966 ; RV32IM-NEXT:    lw s3, 20(a1)
967 ; RV32IM-NEXT:    lw s4, 8(a1)
968 ; RV32IM-NEXT:    lw s5, 12(a1)
969 ; RV32IM-NEXT:    lw a3, 0(a1)
970 ; RV32IM-NEXT:    lw a1, 4(a1)
971 ; RV32IM-NEXT:    mv s6, a0
972 ; RV32IM-NEXT:    li a2, 1
973 ; RV32IM-NEXT:    mv a0, a3
974 ; RV32IM-NEXT:    li a3, 0
975 ; RV32IM-NEXT:    call __umoddi3@plt
976 ; RV32IM-NEXT:    mv s7, a0
977 ; RV32IM-NEXT:    mv s8, a1
978 ; RV32IM-NEXT:    li a2, 654
979 ; RV32IM-NEXT:    mv a0, s4
980 ; RV32IM-NEXT:    mv a1, s5
981 ; RV32IM-NEXT:    li a3, 0
982 ; RV32IM-NEXT:    call __umoddi3@plt
983 ; RV32IM-NEXT:    mv s4, a0
984 ; RV32IM-NEXT:    mv s5, a1
985 ; RV32IM-NEXT:    li a2, 23
986 ; RV32IM-NEXT:    mv a0, s2
987 ; RV32IM-NEXT:    mv a1, s3
988 ; RV32IM-NEXT:    li a3, 0
989 ; RV32IM-NEXT:    call __umoddi3@plt
990 ; RV32IM-NEXT:    mv s2, a0
991 ; RV32IM-NEXT:    mv s3, a1
992 ; RV32IM-NEXT:    lui a0, 1
993 ; RV32IM-NEXT:    addi a2, a0, 1327
994 ; RV32IM-NEXT:    mv a0, s0
995 ; RV32IM-NEXT:    mv a1, s1
996 ; RV32IM-NEXT:    li a3, 0
997 ; RV32IM-NEXT:    call __umoddi3@plt
998 ; RV32IM-NEXT:    sw a1, 28(s6)
999 ; RV32IM-NEXT:    sw a0, 24(s6)
1000 ; RV32IM-NEXT:    sw s3, 20(s6)
1001 ; RV32IM-NEXT:    sw s2, 16(s6)
1002 ; RV32IM-NEXT:    sw s5, 12(s6)
1003 ; RV32IM-NEXT:    sw s4, 8(s6)
1004 ; RV32IM-NEXT:    sw s8, 4(s6)
1005 ; RV32IM-NEXT:    sw s7, 0(s6)
1006 ; RV32IM-NEXT:    lw ra, 44(sp) # 4-byte Folded Reload
1007 ; RV32IM-NEXT:    lw s0, 40(sp) # 4-byte Folded Reload
1008 ; RV32IM-NEXT:    lw s1, 36(sp) # 4-byte Folded Reload
1009 ; RV32IM-NEXT:    lw s2, 32(sp) # 4-byte Folded Reload
1010 ; RV32IM-NEXT:    lw s3, 28(sp) # 4-byte Folded Reload
1011 ; RV32IM-NEXT:    lw s4, 24(sp) # 4-byte Folded Reload
1012 ; RV32IM-NEXT:    lw s5, 20(sp) # 4-byte Folded Reload
1013 ; RV32IM-NEXT:    lw s6, 16(sp) # 4-byte Folded Reload
1014 ; RV32IM-NEXT:    lw s7, 12(sp) # 4-byte Folded Reload
1015 ; RV32IM-NEXT:    lw s8, 8(sp) # 4-byte Folded Reload
1016 ; RV32IM-NEXT:    addi sp, sp, 48
1017 ; RV32IM-NEXT:    ret
1019 ; RV64I-LABEL: dont_fold_urem_i64:
1020 ; RV64I:       # %bb.0:
1021 ; RV64I-NEXT:    addi sp, sp, -48
1022 ; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
1023 ; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
1024 ; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
1025 ; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill
1026 ; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill
1027 ; RV64I-NEXT:    ld s0, 24(a1)
1028 ; RV64I-NEXT:    ld s1, 16(a1)
1029 ; RV64I-NEXT:    ld a2, 8(a1)
1030 ; RV64I-NEXT:    mv s2, a0
1031 ; RV64I-NEXT:    li a1, 654
1032 ; RV64I-NEXT:    mv a0, a2
1033 ; RV64I-NEXT:    call __umoddi3@plt
1034 ; RV64I-NEXT:    mv s3, a0
1035 ; RV64I-NEXT:    li a1, 23
1036 ; RV64I-NEXT:    mv a0, s1
1037 ; RV64I-NEXT:    call __umoddi3@plt
1038 ; RV64I-NEXT:    mv s1, a0
1039 ; RV64I-NEXT:    lui a0, 1
1040 ; RV64I-NEXT:    addiw a1, a0, 1327
1041 ; RV64I-NEXT:    mv a0, s0
1042 ; RV64I-NEXT:    call __umoddi3@plt
1043 ; RV64I-NEXT:    sd a0, 24(s2)
1044 ; RV64I-NEXT:    sd s1, 16(s2)
1045 ; RV64I-NEXT:    sd s3, 8(s2)
1046 ; RV64I-NEXT:    sd zero, 0(s2)
1047 ; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
1048 ; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
1049 ; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
1050 ; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload
1051 ; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload
1052 ; RV64I-NEXT:    addi sp, sp, 48
1053 ; RV64I-NEXT:    ret
1055 ; RV64IM-LABEL: dont_fold_urem_i64:
1056 ; RV64IM:       # %bb.0:
1057 ; RV64IM-NEXT:    ld a2, 16(a1)
1058 ; RV64IM-NEXT:    lui a3, %hi(.LCPI6_0)
1059 ; RV64IM-NEXT:    ld a3, %lo(.LCPI6_0)(a3)
1060 ; RV64IM-NEXT:    ld a4, 24(a1)
1061 ; RV64IM-NEXT:    ld a1, 8(a1)
1062 ; RV64IM-NEXT:    mulhu a3, a2, a3
1063 ; RV64IM-NEXT:    sub a5, a2, a3
1064 ; RV64IM-NEXT:    srli a5, a5, 1
1065 ; RV64IM-NEXT:    add a3, a5, a3
1066 ; RV64IM-NEXT:    srli a3, a3, 4
1067 ; RV64IM-NEXT:    li a5, 23
1068 ; RV64IM-NEXT:    lui a6, %hi(.LCPI6_1)
1069 ; RV64IM-NEXT:    ld a6, %lo(.LCPI6_1)(a6)
1070 ; RV64IM-NEXT:    mul a3, a3, a5
1071 ; RV64IM-NEXT:    sub a2, a2, a3
1072 ; RV64IM-NEXT:    srli a3, a1, 1
1073 ; RV64IM-NEXT:    mulhu a3, a3, a6
1074 ; RV64IM-NEXT:    srli a3, a3, 7
1075 ; RV64IM-NEXT:    lui a5, %hi(.LCPI6_2)
1076 ; RV64IM-NEXT:    ld a5, %lo(.LCPI6_2)(a5)
1077 ; RV64IM-NEXT:    li a6, 654
1078 ; RV64IM-NEXT:    mul a3, a3, a6
1079 ; RV64IM-NEXT:    sub a1, a1, a3
1080 ; RV64IM-NEXT:    mulhu a3, a4, a5
1081 ; RV64IM-NEXT:    srli a3, a3, 12
1082 ; RV64IM-NEXT:    lui a5, 1
1083 ; RV64IM-NEXT:    addiw a5, a5, 1327
1084 ; RV64IM-NEXT:    mul a3, a3, a5
1085 ; RV64IM-NEXT:    sub a3, a4, a3
1086 ; RV64IM-NEXT:    sd zero, 0(a0)
1087 ; RV64IM-NEXT:    sd a3, 24(a0)
1088 ; RV64IM-NEXT:    sd a1, 8(a0)
1089 ; RV64IM-NEXT:    sd a2, 16(a0)
1090 ; RV64IM-NEXT:    ret
1091   %1 = urem <4 x i64> %x, <i64 1, i64 654, i64 23, i64 5423>
1092   ret <4 x i64> %1