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