xref: /llvm-project/llvm/test/CodeGen/RISCV/split-udiv-by-constant.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: sed 's/iXLen2/i64/g' %s | llc -mtriple=riscv32 -mattr=+m | \
3; RUN:   FileCheck %s --check-prefix=RV32
4; RUN: sed 's/iXLen2/i128/g' %s | llc -mtriple=riscv64 -mattr=+m | \
5; RUN:   FileCheck %s --check-prefix=RV64
6
7define iXLen2 @test_udiv_3(iXLen2 %x) nounwind {
8; RV32-LABEL: test_udiv_3:
9; RV32:       # %bb.0:
10; RV32-NEXT:    add a2, a0, a1
11; RV32-NEXT:    lui a3, 699051
12; RV32-NEXT:    sltu a4, a2, a0
13; RV32-NEXT:    addi a5, a3, -1365
14; RV32-NEXT:    addi a3, a3, -1366
15; RV32-NEXT:    add a2, a2, a4
16; RV32-NEXT:    mulhu a4, a2, a5
17; RV32-NEXT:    srli a6, a4, 1
18; RV32-NEXT:    andi a4, a4, -2
19; RV32-NEXT:    add a4, a4, a6
20; RV32-NEXT:    sub a2, a2, a4
21; RV32-NEXT:    sub a4, a0, a2
22; RV32-NEXT:    sltu a0, a0, a2
23; RV32-NEXT:    mul a2, a4, a3
24; RV32-NEXT:    mulhu a3, a4, a5
25; RV32-NEXT:    sub a1, a1, a0
26; RV32-NEXT:    add a2, a3, a2
27; RV32-NEXT:    mul a1, a1, a5
28; RV32-NEXT:    add a1, a2, a1
29; RV32-NEXT:    mul a0, a4, a5
30; RV32-NEXT:    ret
31;
32; RV64-LABEL: test_udiv_3:
33; RV64:       # %bb.0:
34; RV64-NEXT:    add a2, a0, a1
35; RV64-NEXT:    lui a3, 699051
36; RV64-NEXT:    lui a4, %hi(.LCPI0_0)
37; RV64-NEXT:    sltu a5, a2, a0
38; RV64-NEXT:    addiw a3, a3, -1365
39; RV64-NEXT:    ld a4, %lo(.LCPI0_0)(a4)
40; RV64-NEXT:    add a2, a2, a5
41; RV64-NEXT:    slli a5, a3, 32
42; RV64-NEXT:    add a3, a3, a5
43; RV64-NEXT:    mulhu a5, a2, a3
44; RV64-NEXT:    srli a6, a5, 1
45; RV64-NEXT:    andi a5, a5, -2
46; RV64-NEXT:    add a5, a5, a6
47; RV64-NEXT:    sub a2, a2, a5
48; RV64-NEXT:    sub a5, a0, a2
49; RV64-NEXT:    sltu a0, a0, a2
50; RV64-NEXT:    mul a2, a5, a4
51; RV64-NEXT:    mulhu a4, a5, a3
52; RV64-NEXT:    sub a1, a1, a0
53; RV64-NEXT:    add a2, a4, a2
54; RV64-NEXT:    mul a1, a1, a3
55; RV64-NEXT:    add a1, a2, a1
56; RV64-NEXT:    mul a0, a5, a3
57; RV64-NEXT:    ret
58  %a = udiv iXLen2 %x, 3
59  ret iXLen2 %a
60}
61
62define iXLen2 @test_udiv_5(iXLen2 %x) nounwind {
63; RV32-LABEL: test_udiv_5:
64; RV32:       # %bb.0:
65; RV32-NEXT:    add a2, a0, a1
66; RV32-NEXT:    lui a3, 838861
67; RV32-NEXT:    sltu a4, a2, a0
68; RV32-NEXT:    addi a5, a3, -819
69; RV32-NEXT:    addi a3, a3, -820
70; RV32-NEXT:    add a2, a2, a4
71; RV32-NEXT:    mulhu a4, a2, a5
72; RV32-NEXT:    srli a6, a4, 2
73; RV32-NEXT:    andi a4, a4, -4
74; RV32-NEXT:    add a4, a4, a6
75; RV32-NEXT:    sub a2, a2, a4
76; RV32-NEXT:    sub a4, a0, a2
77; RV32-NEXT:    sltu a0, a0, a2
78; RV32-NEXT:    mul a2, a4, a3
79; RV32-NEXT:    mulhu a3, a4, a5
80; RV32-NEXT:    sub a1, a1, a0
81; RV32-NEXT:    add a2, a3, a2
82; RV32-NEXT:    mul a1, a1, a5
83; RV32-NEXT:    add a1, a2, a1
84; RV32-NEXT:    mul a0, a4, a5
85; RV32-NEXT:    ret
86;
87; RV64-LABEL: test_udiv_5:
88; RV64:       # %bb.0:
89; RV64-NEXT:    add a2, a0, a1
90; RV64-NEXT:    lui a3, 838861
91; RV64-NEXT:    lui a4, %hi(.LCPI1_0)
92; RV64-NEXT:    sltu a5, a2, a0
93; RV64-NEXT:    addiw a3, a3, -819
94; RV64-NEXT:    ld a4, %lo(.LCPI1_0)(a4)
95; RV64-NEXT:    add a2, a2, a5
96; RV64-NEXT:    slli a5, a3, 32
97; RV64-NEXT:    add a3, a3, a5
98; RV64-NEXT:    mulhu a5, a2, a3
99; RV64-NEXT:    srli a6, a5, 2
100; RV64-NEXT:    andi a5, a5, -4
101; RV64-NEXT:    add a5, a5, a6
102; RV64-NEXT:    sub a2, a2, a5
103; RV64-NEXT:    sub a5, a0, a2
104; RV64-NEXT:    sltu a0, a0, a2
105; RV64-NEXT:    mul a2, a5, a4
106; RV64-NEXT:    mulhu a4, a5, a3
107; RV64-NEXT:    sub a1, a1, a0
108; RV64-NEXT:    add a2, a4, a2
109; RV64-NEXT:    mul a1, a1, a3
110; RV64-NEXT:    add a1, a2, a1
111; RV64-NEXT:    mul a0, a5, a3
112; RV64-NEXT:    ret
113  %a = udiv iXLen2 %x, 5
114  ret iXLen2 %a
115}
116
117define iXLen2 @test_udiv_7(iXLen2 %x) nounwind {
118; RV32-LABEL: test_udiv_7:
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
128;
129; RV64-LABEL: test_udiv_7:
130; RV64:       # %bb.0:
131; RV64-NEXT:    addi sp, sp, -16
132; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
133; RV64-NEXT:    li a2, 7
134; RV64-NEXT:    li a3, 0
135; RV64-NEXT:    call __udivti3
136; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
137; RV64-NEXT:    addi sp, sp, 16
138; RV64-NEXT:    ret
139  %a = udiv iXLen2 %x, 7
140  ret iXLen2 %a
141}
142
143define iXLen2 @test_udiv_9(iXLen2 %x) nounwind {
144; RV32-LABEL: test_udiv_9:
145; RV32:       # %bb.0:
146; RV32-NEXT:    addi sp, sp, -16
147; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
148; RV32-NEXT:    li a2, 9
149; RV32-NEXT:    li a3, 0
150; RV32-NEXT:    call __udivdi3
151; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
152; RV32-NEXT:    addi sp, sp, 16
153; RV32-NEXT:    ret
154;
155; RV64-LABEL: test_udiv_9:
156; RV64:       # %bb.0:
157; RV64-NEXT:    addi sp, sp, -16
158; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
159; RV64-NEXT:    li a2, 9
160; RV64-NEXT:    li a3, 0
161; RV64-NEXT:    call __udivti3
162; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
163; RV64-NEXT:    addi sp, sp, 16
164; RV64-NEXT:    ret
165  %a = udiv iXLen2 %x, 9
166  ret iXLen2 %a
167}
168
169define iXLen2 @test_udiv_15(iXLen2 %x) nounwind {
170; RV32-LABEL: test_udiv_15:
171; RV32:       # %bb.0:
172; RV32-NEXT:    add a2, a0, a1
173; RV32-NEXT:    lui a3, 559241
174; RV32-NEXT:    lui a4, 978671
175; RV32-NEXT:    sltu a5, a2, a0
176; RV32-NEXT:    addi a3, a3, -1911
177; RV32-NEXT:    addi a6, a4, -274
178; RV32-NEXT:    addi a4, a4, -273
179; RV32-NEXT:    add a2, a2, a5
180; RV32-NEXT:    mulhu a3, a2, a3
181; RV32-NEXT:    srli a3, a3, 3
182; RV32-NEXT:    slli a5, a3, 4
183; RV32-NEXT:    sub a3, a3, a5
184; RV32-NEXT:    add a2, a2, a3
185; RV32-NEXT:    sub a3, a0, a2
186; RV32-NEXT:    sltu a0, a0, a2
187; RV32-NEXT:    mul a2, a3, a6
188; RV32-NEXT:    mulhu a5, a3, a4
189; RV32-NEXT:    sub a1, a1, a0
190; RV32-NEXT:    add a2, a5, a2
191; RV32-NEXT:    mul a1, a1, a4
192; RV32-NEXT:    add a1, a2, a1
193; RV32-NEXT:    mul a0, a3, a4
194; RV32-NEXT:    ret
195;
196; RV64-LABEL: test_udiv_15:
197; RV64:       # %bb.0:
198; RV64-NEXT:    add a2, a0, a1
199; RV64-NEXT:    lui a3, 559241
200; RV64-NEXT:    lui a4, %hi(.LCPI4_0)
201; RV64-NEXT:    lui a5, 978671
202; RV64-NEXT:    sltu a6, a2, a0
203; RV64-NEXT:    addiw a3, a3, -1911
204; RV64-NEXT:    ld a4, %lo(.LCPI4_0)(a4)
205; RV64-NEXT:    addiw a5, a5, -273
206; RV64-NEXT:    add a2, a2, a6
207; RV64-NEXT:    slli a6, a3, 32
208; RV64-NEXT:    add a3, a3, a6
209; RV64-NEXT:    slli a6, a5, 32
210; RV64-NEXT:    add a5, a5, a6
211; RV64-NEXT:    mulhu a3, a2, a3
212; RV64-NEXT:    srli a3, a3, 3
213; RV64-NEXT:    slli a6, a3, 4
214; RV64-NEXT:    sub a3, a3, a6
215; RV64-NEXT:    add a2, a2, a3
216; RV64-NEXT:    sub a3, a0, a2
217; RV64-NEXT:    sltu a0, a0, a2
218; RV64-NEXT:    mul a2, a3, a4
219; RV64-NEXT:    mulhu a4, a3, a5
220; RV64-NEXT:    sub a1, a1, a0
221; RV64-NEXT:    add a2, a4, a2
222; RV64-NEXT:    mul a1, a1, a5
223; RV64-NEXT:    add a1, a2, a1
224; RV64-NEXT:    mul a0, a3, a5
225; RV64-NEXT:    ret
226  %a = udiv iXLen2 %x, 15
227  ret iXLen2 %a
228}
229
230define iXLen2 @test_udiv_17(iXLen2 %x) nounwind {
231; RV32-LABEL: test_udiv_17:
232; RV32:       # %bb.0:
233; RV32-NEXT:    add a2, a0, a1
234; RV32-NEXT:    lui a3, 986895
235; RV32-NEXT:    sltu a4, a2, a0
236; RV32-NEXT:    addi a5, a3, 241
237; RV32-NEXT:    addi a3, a3, 240
238; RV32-NEXT:    add a2, a2, a4
239; RV32-NEXT:    mulhu a4, a2, a5
240; RV32-NEXT:    srli a6, a4, 4
241; RV32-NEXT:    andi a4, a4, -16
242; RV32-NEXT:    add a4, a4, a6
243; RV32-NEXT:    sub a2, a2, a4
244; RV32-NEXT:    sub a4, a0, a2
245; RV32-NEXT:    sltu a0, a0, a2
246; RV32-NEXT:    mul a2, a4, a3
247; RV32-NEXT:    mulhu a3, a4, a5
248; RV32-NEXT:    sub a1, a1, a0
249; RV32-NEXT:    add a2, a3, a2
250; RV32-NEXT:    mul a1, a1, a5
251; RV32-NEXT:    add a1, a2, a1
252; RV32-NEXT:    mul a0, a4, a5
253; RV32-NEXT:    ret
254;
255; RV64-LABEL: test_udiv_17:
256; RV64:       # %bb.0:
257; RV64-NEXT:    add a2, a0, a1
258; RV64-NEXT:    lui a3, 986895
259; RV64-NEXT:    lui a4, %hi(.LCPI5_0)
260; RV64-NEXT:    sltu a5, a2, a0
261; RV64-NEXT:    addiw a3, a3, 241
262; RV64-NEXT:    ld a4, %lo(.LCPI5_0)(a4)
263; RV64-NEXT:    add a2, a2, a5
264; RV64-NEXT:    slli a5, a3, 32
265; RV64-NEXT:    add a3, a3, a5
266; RV64-NEXT:    mulhu a5, a2, a3
267; RV64-NEXT:    srli a6, a5, 4
268; RV64-NEXT:    andi a5, a5, -16
269; RV64-NEXT:    add a5, a5, a6
270; RV64-NEXT:    sub a2, a2, a5
271; RV64-NEXT:    sub a5, a0, a2
272; RV64-NEXT:    sltu a0, a0, a2
273; RV64-NEXT:    mul a2, a5, a4
274; RV64-NEXT:    mulhu a4, a5, a3
275; RV64-NEXT:    sub a1, a1, a0
276; RV64-NEXT:    add a2, a4, a2
277; RV64-NEXT:    mul a1, a1, a3
278; RV64-NEXT:    add a1, a2, a1
279; RV64-NEXT:    mul a0, a5, a3
280; RV64-NEXT:    ret
281  %a = udiv iXLen2 %x, 17
282  ret iXLen2 %a
283}
284
285define iXLen2 @test_udiv_255(iXLen2 %x) nounwind {
286; RV32-LABEL: test_udiv_255:
287; RV32:       # %bb.0:
288; RV32-NEXT:    add a2, a0, a1
289; RV32-NEXT:    lui a3, 526344
290; RV32-NEXT:    lui a4, 1044464
291; RV32-NEXT:    sltu a5, a2, a0
292; RV32-NEXT:    addi a3, a3, 129
293; RV32-NEXT:    addi a6, a4, -258
294; RV32-NEXT:    addi a4, a4, -257
295; RV32-NEXT:    add a2, a2, a5
296; RV32-NEXT:    mulhu a3, a2, a3
297; RV32-NEXT:    srli a3, a3, 7
298; RV32-NEXT:    slli a5, a3, 8
299; RV32-NEXT:    sub a3, a3, a5
300; RV32-NEXT:    add a2, a2, a3
301; RV32-NEXT:    sub a3, a0, a2
302; RV32-NEXT:    sltu a0, a0, a2
303; RV32-NEXT:    mul a2, a3, a6
304; RV32-NEXT:    mulhu a5, a3, a4
305; RV32-NEXT:    sub a1, a1, a0
306; RV32-NEXT:    add a2, a5, a2
307; RV32-NEXT:    mul a1, a1, a4
308; RV32-NEXT:    add a1, a2, a1
309; RV32-NEXT:    mul a0, a3, a4
310; RV32-NEXT:    ret
311;
312; RV64-LABEL: test_udiv_255:
313; RV64:       # %bb.0:
314; RV64-NEXT:    add a2, a0, a1
315; RV64-NEXT:    lui a3, 526344
316; RV64-NEXT:    lui a4, %hi(.LCPI6_0)
317; RV64-NEXT:    lui a5, 1044464
318; RV64-NEXT:    sltu a6, a2, a0
319; RV64-NEXT:    addiw a3, a3, 129
320; RV64-NEXT:    ld a4, %lo(.LCPI6_0)(a4)
321; RV64-NEXT:    addiw a5, a5, -257
322; RV64-NEXT:    add a2, a2, a6
323; RV64-NEXT:    slli a6, a3, 32
324; RV64-NEXT:    add a3, a3, a6
325; RV64-NEXT:    slli a6, a5, 32
326; RV64-NEXT:    add a5, a5, a6
327; RV64-NEXT:    mulhu a3, a2, a3
328; RV64-NEXT:    srli a3, a3, 7
329; RV64-NEXT:    slli a6, a3, 8
330; RV64-NEXT:    sub a3, a3, a6
331; RV64-NEXT:    add a2, a2, a3
332; RV64-NEXT:    sub a3, a0, a2
333; RV64-NEXT:    sltu a0, a0, a2
334; RV64-NEXT:    mul a2, a3, a4
335; RV64-NEXT:    mulhu a4, a3, a5
336; RV64-NEXT:    sub a1, a1, a0
337; RV64-NEXT:    add a2, a4, a2
338; RV64-NEXT:    mul a1, a1, a5
339; RV64-NEXT:    add a1, a2, a1
340; RV64-NEXT:    mul a0, a3, a5
341; RV64-NEXT:    ret
342  %a = udiv iXLen2 %x, 255
343  ret iXLen2 %a
344}
345
346define iXLen2 @test_udiv_257(iXLen2 %x) nounwind {
347; RV32-LABEL: test_udiv_257:
348; RV32:       # %bb.0:
349; RV32-NEXT:    add a2, a0, a1
350; RV32-NEXT:    lui a3, 1044496
351; RV32-NEXT:    sltu a4, a2, a0
352; RV32-NEXT:    addi a5, a3, -255
353; RV32-NEXT:    addi a3, a3, -256
354; RV32-NEXT:    add a2, a2, a4
355; RV32-NEXT:    mulhu a4, a2, a5
356; RV32-NEXT:    srli a6, a4, 8
357; RV32-NEXT:    andi a4, a4, -256
358; RV32-NEXT:    add a4, a4, a6
359; RV32-NEXT:    sub a2, a2, a4
360; RV32-NEXT:    sub a4, a0, a2
361; RV32-NEXT:    sltu a0, a0, a2
362; RV32-NEXT:    mul a2, a4, a3
363; RV32-NEXT:    mulhu a3, a4, a5
364; RV32-NEXT:    sub a1, a1, a0
365; RV32-NEXT:    add a2, a3, a2
366; RV32-NEXT:    mul a1, a1, a5
367; RV32-NEXT:    add a1, a2, a1
368; RV32-NEXT:    mul a0, a4, a5
369; RV32-NEXT:    ret
370;
371; RV64-LABEL: test_udiv_257:
372; RV64:       # %bb.0:
373; RV64-NEXT:    add a2, a0, a1
374; RV64-NEXT:    lui a3, 1044496
375; RV64-NEXT:    lui a4, %hi(.LCPI7_0)
376; RV64-NEXT:    sltu a5, a2, a0
377; RV64-NEXT:    addiw a3, a3, -255
378; RV64-NEXT:    ld a4, %lo(.LCPI7_0)(a4)
379; RV64-NEXT:    add a2, a2, a5
380; RV64-NEXT:    slli a5, a3, 32
381; RV64-NEXT:    add a3, a3, a5
382; RV64-NEXT:    mulhu a5, a2, a3
383; RV64-NEXT:    srli a6, a5, 8
384; RV64-NEXT:    andi a5, a5, -256
385; RV64-NEXT:    add a5, a5, a6
386; RV64-NEXT:    sub a2, a2, a5
387; RV64-NEXT:    sub a5, a0, a2
388; RV64-NEXT:    sltu a0, a0, a2
389; RV64-NEXT:    mul a2, a5, a4
390; RV64-NEXT:    mulhu a4, a5, a3
391; RV64-NEXT:    sub a1, a1, a0
392; RV64-NEXT:    add a2, a4, a2
393; RV64-NEXT:    mul a1, a1, a3
394; RV64-NEXT:    add a1, a2, a1
395; RV64-NEXT:    mul a0, a5, a3
396; RV64-NEXT:    ret
397  %a = udiv iXLen2 %x, 257
398  ret iXLen2 %a
399}
400
401define iXLen2 @test_udiv_65535(iXLen2 %x) nounwind {
402; RV32-LABEL: test_udiv_65535:
403; RV32:       # %bb.0:
404; RV32-NEXT:    add a2, a0, a1
405; RV32-NEXT:    lui a3, 524296
406; RV32-NEXT:    lui a4, 1048560
407; RV32-NEXT:    sltu a5, a2, a0
408; RV32-NEXT:    addi a3, a3, 1
409; RV32-NEXT:    add a2, a2, a5
410; RV32-NEXT:    mulhu a3, a2, a3
411; RV32-NEXT:    srli a3, a3, 15
412; RV32-NEXT:    slli a5, a3, 16
413; RV32-NEXT:    sub a3, a3, a5
414; RV32-NEXT:    addi a5, a4, -2
415; RV32-NEXT:    addi a4, a4, -1
416; RV32-NEXT:    add a2, a2, a3
417; RV32-NEXT:    sub a3, a0, a2
418; RV32-NEXT:    sltu a0, a0, a2
419; RV32-NEXT:    mul a2, a3, a5
420; RV32-NEXT:    mulhu a4, a3, a4
421; RV32-NEXT:    sub a1, a1, a0
422; RV32-NEXT:    slli a0, a3, 16
423; RV32-NEXT:    neg a3, a3
424; RV32-NEXT:    add a2, a4, a2
425; RV32-NEXT:    slli a4, a1, 16
426; RV32-NEXT:    add a1, a4, a1
427; RV32-NEXT:    sub a1, a2, a1
428; RV32-NEXT:    sub a0, a3, a0
429; RV32-NEXT:    ret
430;
431; RV64-LABEL: test_udiv_65535:
432; RV64:       # %bb.0:
433; RV64-NEXT:    add a2, a0, a1
434; RV64-NEXT:    lui a3, 524296
435; RV64-NEXT:    lui a4, 983039
436; RV64-NEXT:    lui a5, 1048560
437; RV64-NEXT:    sltu a6, a2, a0
438; RV64-NEXT:    addiw a3, a3, 1
439; RV64-NEXT:    slli a4, a4, 4
440; RV64-NEXT:    addiw a5, a5, -1
441; RV64-NEXT:    add a2, a2, a6
442; RV64-NEXT:    slli a6, a3, 32
443; RV64-NEXT:    addi a4, a4, -1
444; RV64-NEXT:    add a3, a3, a6
445; RV64-NEXT:    slli a6, a5, 32
446; RV64-NEXT:    slli a4, a4, 16
447; RV64-NEXT:    add a5, a5, a6
448; RV64-NEXT:    mulhu a3, a2, a3
449; RV64-NEXT:    addi a4, a4, -2
450; RV64-NEXT:    srli a3, a3, 15
451; RV64-NEXT:    slli a6, a3, 16
452; RV64-NEXT:    sub a3, a3, a6
453; RV64-NEXT:    add a2, a2, a3
454; RV64-NEXT:    sub a3, a0, a2
455; RV64-NEXT:    sltu a0, a0, a2
456; RV64-NEXT:    mul a2, a3, a4
457; RV64-NEXT:    mulhu a4, a3, a5
458; RV64-NEXT:    sub a1, a1, a0
459; RV64-NEXT:    add a2, a4, a2
460; RV64-NEXT:    mul a1, a1, a5
461; RV64-NEXT:    add a1, a2, a1
462; RV64-NEXT:    mul a0, a3, a5
463; RV64-NEXT:    ret
464  %a = udiv iXLen2 %x, 65535
465  ret iXLen2 %a
466}
467
468define iXLen2 @test_udiv_65537(iXLen2 %x) nounwind {
469; RV32-LABEL: test_udiv_65537:
470; RV32:       # %bb.0:
471; RV32-NEXT:    add a2, a0, a1
472; RV32-NEXT:    lui a3, 1048560
473; RV32-NEXT:    sltu a4, a2, a0
474; RV32-NEXT:    addi a5, a3, 1
475; RV32-NEXT:    add a2, a2, a4
476; RV32-NEXT:    mulhu a4, a2, a5
477; RV32-NEXT:    and a3, a4, a3
478; RV32-NEXT:    srli a4, a4, 16
479; RV32-NEXT:    or a3, a3, a4
480; RV32-NEXT:    sub a2, a2, a3
481; RV32-NEXT:    sub a3, a0, a2
482; RV32-NEXT:    sltu a0, a0, a2
483; RV32-NEXT:    mulhu a2, a3, a5
484; RV32-NEXT:    slli a4, a3, 16
485; RV32-NEXT:    sub a1, a1, a0
486; RV32-NEXT:    sub a2, a2, a4
487; RV32-NEXT:    slli a0, a1, 16
488; RV32-NEXT:    sub a1, a1, a0
489; RV32-NEXT:    add a1, a2, a1
490; RV32-NEXT:    sub a0, a3, a4
491; RV32-NEXT:    ret
492;
493; RV64-LABEL: test_udiv_65537:
494; RV64:       # %bb.0:
495; RV64-NEXT:    add a2, a0, a1
496; RV64-NEXT:    lui a3, 1048560
497; RV64-NEXT:    lui a4, 983041
498; RV64-NEXT:    sltu a5, a2, a0
499; RV64-NEXT:    addiw a6, a3, 1
500; RV64-NEXT:    slli a4, a4, 4
501; RV64-NEXT:    add a2, a2, a5
502; RV64-NEXT:    slli a5, a6, 32
503; RV64-NEXT:    addi a4, a4, -1
504; RV64-NEXT:    add a5, a6, a5
505; RV64-NEXT:    slli a4, a4, 16
506; RV64-NEXT:    mulhu a6, a2, a5
507; RV64-NEXT:    and a3, a6, a3
508; RV64-NEXT:    srli a6, a6, 16
509; RV64-NEXT:    add a3, a3, a6
510; RV64-NEXT:    sub a2, a2, a3
511; RV64-NEXT:    sub a3, a0, a2
512; RV64-NEXT:    sltu a0, a0, a2
513; RV64-NEXT:    mul a2, a3, a4
514; RV64-NEXT:    mulhu a4, a3, a5
515; RV64-NEXT:    sub a1, a1, a0
516; RV64-NEXT:    add a2, a4, a2
517; RV64-NEXT:    mul a1, a1, a5
518; RV64-NEXT:    add a1, a2, a1
519; RV64-NEXT:    mul a0, a3, a5
520; RV64-NEXT:    ret
521  %a = udiv iXLen2 %x, 65537
522  ret iXLen2 %a
523}
524
525define iXLen2 @test_udiv_12(iXLen2 %x) nounwind {
526; RV32-LABEL: test_udiv_12:
527; RV32:       # %bb.0:
528; RV32-NEXT:    slli a2, a1, 30
529; RV32-NEXT:    srli a0, a0, 2
530; RV32-NEXT:    srli a1, a1, 2
531; RV32-NEXT:    lui a3, 699051
532; RV32-NEXT:    or a0, a0, a2
533; RV32-NEXT:    addi a2, a3, -1365
534; RV32-NEXT:    addi a3, a3, -1366
535; RV32-NEXT:    add a4, a0, a1
536; RV32-NEXT:    sltu a5, a4, a0
537; RV32-NEXT:    add a4, a4, a5
538; RV32-NEXT:    mulhu a5, a4, a2
539; RV32-NEXT:    srli a6, a5, 1
540; RV32-NEXT:    andi a5, a5, -2
541; RV32-NEXT:    add a5, a5, a6
542; RV32-NEXT:    sub a4, a4, a5
543; RV32-NEXT:    sub a5, a0, a4
544; RV32-NEXT:    sltu a0, a0, a4
545; RV32-NEXT:    mul a3, a5, a3
546; RV32-NEXT:    mulhu a4, a5, a2
547; RV32-NEXT:    sub a1, a1, a0
548; RV32-NEXT:    add a3, a4, a3
549; RV32-NEXT:    mul a1, a1, a2
550; RV32-NEXT:    add a1, a3, a1
551; RV32-NEXT:    mul a0, a5, a2
552; RV32-NEXT:    ret
553;
554; RV64-LABEL: test_udiv_12:
555; RV64:       # %bb.0:
556; RV64-NEXT:    slli a2, a1, 62
557; RV64-NEXT:    srli a0, a0, 2
558; RV64-NEXT:    srli a1, a1, 2
559; RV64-NEXT:    lui a3, 699051
560; RV64-NEXT:    lui a4, %hi(.LCPI10_0)
561; RV64-NEXT:    or a0, a0, a2
562; RV64-NEXT:    addiw a2, a3, -1365
563; RV64-NEXT:    ld a3, %lo(.LCPI10_0)(a4)
564; RV64-NEXT:    add a4, a0, a1
565; RV64-NEXT:    slli a5, a2, 32
566; RV64-NEXT:    sltu a6, a4, a0
567; RV64-NEXT:    add a2, a2, a5
568; RV64-NEXT:    add a4, a4, a6
569; RV64-NEXT:    mulhu a5, a4, a2
570; RV64-NEXT:    srli a6, a5, 1
571; RV64-NEXT:    andi a5, a5, -2
572; RV64-NEXT:    add a5, a5, a6
573; RV64-NEXT:    sub a4, a4, a5
574; RV64-NEXT:    sub a5, a0, a4
575; RV64-NEXT:    sltu a0, a0, a4
576; RV64-NEXT:    mul a3, a5, a3
577; RV64-NEXT:    mulhu a4, a5, a2
578; RV64-NEXT:    sub a1, a1, a0
579; RV64-NEXT:    add a3, a4, a3
580; RV64-NEXT:    mul a1, a1, a2
581; RV64-NEXT:    add a1, a3, a1
582; RV64-NEXT:    mul a0, a5, a2
583; RV64-NEXT:    ret
584  %a = udiv iXLen2 %x, 12
585  ret iXLen2 %a
586}
587