xref: /llvm-project/llvm/test/CodeGen/PowerPC/ppc64-P9-mod.ll (revision d70f2717263ded14554f85ef5d04df4f95b40c91)
1; RUN: llc < %s -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr9 -verify-machineinstrs | FileCheck %s
2; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr9 -verify-machineinstrs | FileCheck %s
3; RUN: llc < %s -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 | FileCheck %s -check-prefix=CHECK-PWR8 -implicit-check-not mod[us][wd]
4; RUN: opt < %s -passes=div-rem-pairs -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr9 | \
5; RUN:   llc -verify-machineinstrs | FileCheck %s -check-prefix=CHECK-DRP
6; RUN: opt < %s -passes=div-rem-pairs -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr9 | \
7; RUN:   llc -verify-machineinstrs | FileCheck %s -check-prefix=CHECK-DRP
8; RUN: opt < %s -passes=div-rem-pairs -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 | \
9; RUN:   llc -verify-machineinstrs | FileCheck %s -check-prefix=CHECK-PWR8 -implicit-check-not mod[us][wd]
10
11@mod_resultsw = local_unnamed_addr global i32 0, align 4
12@mod_resultud = local_unnamed_addr global i64 0, align 8
13@div_resultsw = local_unnamed_addr global i32 0, align 4
14@mod_resultuw = local_unnamed_addr global i32 0, align 4
15@div_resultuw = local_unnamed_addr global i32 0, align 4
16@div_resultsd = local_unnamed_addr global i64 0, align 8
17@mod_resultsd = local_unnamed_addr global i64 0, align 8
18@div_resultud = local_unnamed_addr global i64 0, align 8
19
20; Function Attrs: norecurse nounwind
21define void @modulo_sw(i32 signext %a, i32 signext %b) local_unnamed_addr {
22entry:
23  %rem = srem i32 %a, %b
24  store i32 %rem, ptr @mod_resultsw, align 4
25  ret void
26; CHECK-LABEL: modulo_sw
27; CHECK: modsw {{[0-9]+}}, 3, 4
28; CHECK: blr
29; CHECK-PWR8-LABEL: modulo_sw
30; CHECK-PWR8: div
31; CHECK-PWR8: mull
32; CHECK-PWR8: sub
33; CHECK-PWR8: blr
34}
35
36; Function Attrs: norecurse nounwind readnone
37define zeroext i32 @modulo_uw(i32 zeroext %a, i32 zeroext %b) local_unnamed_addr {
38entry:
39  %rem = urem i32 %a, %b
40  ret i32 %rem
41; CHECK-LABEL: modulo_uw
42; CHECK: moduw {{[0-9]+}}, 3, 4
43; CHECK: blr
44; CHECK-PWR8-LABEL: modulo_uw
45; CHECK-PWR8: div
46; CHECK-PWR8: mull
47; CHECK-PWR8: sub
48; CHECK-PWR8: blr
49}
50
51; Function Attrs: norecurse nounwind readnone
52define i64 @modulo_sd(i64 %a, i64 %b) local_unnamed_addr {
53entry:
54  %rem = srem i64 %a, %b
55  ret i64 %rem
56; CHECK-LABEL: modulo_sd
57; CHECK: modsd {{[0-9]+}}, 3, 4
58; CHECK: blr
59; CHECK-PWR8-LABEL: modulo_sd
60; CHECK-PWR8: div
61; CHECK-PWR8: mull
62; CHECK-PWR8: sub
63; CHECK-PWR8: blr
64}
65
66; Function Attrs: norecurse nounwind
67define void @modulo_ud(i64 %a, i64 %b) local_unnamed_addr {
68entry:
69  %rem = urem i64 %a, %b
70  store i64 %rem, ptr @mod_resultud, align 8
71  ret void
72; CHECK-LABEL: modulo_ud
73; CHECK: modud {{[0-9]+}}, 3, 4
74; CHECK: blr
75; CHECK-PWR8-LABEL: modulo_ud
76; CHECK-PWR8: div
77; CHECK-PWR8: mull
78; CHECK-PWR8: sub
79; CHECK-PWR8: blr
80}
81
82; Function Attrs: norecurse nounwind
83define void @modulo_div_sw(i32 signext %a, i32 signext %b) local_unnamed_addr {
84entry:
85  %rem = srem i32 %a, %b
86  store i32 %rem, ptr @mod_resultsw, align 4
87  %div = sdiv i32 %a, %b
88  store i32 %div, ptr @div_resultsw, align 4
89  ret void
90; CHECK-LABEL: modulo_div_sw
91; CHECK: modsw {{[0-9]+}}, 3, 4
92; CHECK: blr
93; CHECK-DRP-LABEL: modulo_div_sw
94; CHECK-DRP-NOT: modsw
95; CHECK-DRP: div
96; CHECK-DRP-NOT: modsw
97; CHECK-DRP: mull
98; CHECK-DRP-NOT: modsw
99; CHECK-DRP: sub
100; CHECK-DRP: blr
101; CHECK-PWR8-LABEL: modulo_div_sw
102; CHECK-PWR8: div
103; CHECK-PWR8: mull
104; CHECK-PWR8: sub
105; CHECK-PWR8: blr
106}
107
108; Function Attrs: norecurse nounwind
109define void @modulo_div_abc_sw(i32 signext %a, i32 signext %b, i32 signext %c) local_unnamed_addr {
110entry:
111  %rem = srem i32 %a, %c
112  store i32 %rem, ptr @mod_resultsw, align 4
113  %div = sdiv i32 %b, %c
114  store i32 %div, ptr @div_resultsw, align 4
115  ret void
116; CHECK-LABEL: modulo_div_abc_sw
117; CHECK: modsw {{[0-9]+}}, 3, 5
118; CHECK: blr
119; CHECK-PWR8-LABEL: modulo_div_abc_sw
120; CHECK-PWR8: div
121; CHECK-PWR8: mull
122; CHECK-PWR8: sub
123; CHECK-PWR8: blr
124}
125
126; Function Attrs: norecurse nounwind
127define void @modulo_div_uw(i32 zeroext %a, i32 zeroext %b) local_unnamed_addr {
128entry:
129  %rem = urem i32 %a, %b
130  store i32 %rem, ptr @mod_resultuw, align 4
131  %div = udiv i32 %a, %b
132  store i32 %div, ptr @div_resultuw, align 4
133  ret void
134; CHECK-LABEL: modulo_div_uw
135; CHECK: moduw {{[0-9]+}}, 3, 4
136; CHECK: blr
137; CHECK-DRP-LABEL: modulo_div_uw
138; CHECK-DRP-NOT: moduw
139; CHECK-DRP: div
140; CHECK-DRP-NOT: moduw
141; CHECK-DRP: mull
142; CHECK-DRP-NOT: moduw
143; CHECK-DRP: sub
144; CHECK-DRP: blr
145; CHECK-PWR8-LABEL: modulo_div_uw
146; CHECK-PWR8: div
147; CHECK-PWR8: mull
148; CHECK-PWR8: sub
149; CHECK-PWR8: blr
150}
151
152; Function Attrs: norecurse nounwind
153define void @modulo_div_swuw(i32 signext %a, i32 signext %b) local_unnamed_addr {
154entry:
155  %rem = srem i32 %a, %b
156  store i32 %rem, ptr @mod_resultsw, align 4
157  %div = udiv i32 %a, %b
158  store i32 %div, ptr @div_resultsw, align 4
159  ret void
160; CHECK-LABEL: modulo_div_swuw
161; CHECK: modsw {{[0-9]+}}, 3, 4
162; CHECK: blr
163; CHECK-PWR8-LABEL: modulo_div_swuw
164; CHECK-PWR8: div
165; CHECK-PWR8: mull
166; CHECK-PWR8: sub
167; CHECK-PWR8: blr
168}
169
170; Function Attrs: norecurse nounwind
171define void @modulo_div_udsd(i64 %a, i64 %b) local_unnamed_addr {
172entry:
173  %rem = urem i64 %a, %b
174  store i64 %rem, ptr @mod_resultud, align 8
175  %div = sdiv i64 %a, %b
176  store i64 %div, ptr @div_resultsd, align 8
177  ret void
178; CHECK-LABEL: modulo_div_udsd
179; CHECK: modud {{[0-9]+}}, 3, 4
180; CHECK: blr
181; CHECK-PWR8-LABEL: modulo_div_udsd
182; CHECK-PWR8: div
183; CHECK-PWR8: mull
184; CHECK-PWR8: sub
185; CHECK-PWR8: blr
186}
187
188; Function Attrs: norecurse nounwind
189define void @modulo_const32_sw(i32 signext %a) local_unnamed_addr {
190entry:
191  %rem = srem i32 %a, 32
192  store i32 %rem, ptr @mod_resultsw, align 4
193  ret void
194; CHECK-LABEL: modulo_const32_sw
195; CHECK-NOT: modsw
196; CHECK: srawi
197; CHECK-NOT: modsw
198; CHECK: addze
199; CHECK-NOT: modsw
200; CHECK: slwi
201; CHECK-NOT: modsw
202; CHECK: sub
203; CHECK-NOT: modsw
204; CHECK: blr
205; CHECK-PWR8-LABEL: modulo_const32_sw
206; CHECK-PWR8: srawi
207; CHECK-PWR8: addze
208; CHECK-PWR8: slwi
209; CHECK-PWR8: sub
210; CHECK-PWR8: blr
211}
212
213; Function Attrs: norecurse nounwind readnone
214define signext i32 @modulo_const3_sw(i32 signext %a) local_unnamed_addr {
215entry:
216  %rem = srem i32 %a, 3
217  ret i32 %rem
218; CHECK-LABEL: modulo_const3_sw
219; CHECK-NOT: modsw
220; CHECK: mulh
221; CHECK-NOT: modsw
222; CHECK: sub
223; CHECK-NOT: modsw
224; CHECK: blr
225; CHECK-PWR8-LABEL: modulo_const3_sw
226; CHECK-PWR8: mulh
227; CHECK-PWR8: sub
228; CHECK-PWR8: blr
229}
230
231; Function Attrs: norecurse nounwind readnone
232define signext i32 @const2_modulo_sw(i32 signext %a) local_unnamed_addr {
233entry:
234  %rem = srem i32 2, %a
235  ret i32 %rem
236; CHECK-LABEL: const2_modulo_sw
237; CHECK: modsw {{[0-9]+}}, {{[0-9]+}}, 3
238; CHECK: blr
239; CHECK-PWR8-LABEL: const2_modulo_sw
240; CHECK-PWR8: div
241; CHECK-PWR8: mull
242; CHECK-PWR8: sub
243; CHECK-PWR8: blr
244}
245
246; Function Attrs: norecurse nounwind
247define void @blocks_modulo_div_sw(i32 signext %a, i32 signext %b, i32 signext %c) local_unnamed_addr {
248entry:
249  %div = sdiv i32 %a, %b
250  store i32 %div, ptr @div_resultsw, align 4
251  %cmp = icmp sgt i32 %c, 0
252  br i1 %cmp, label %if.then, label %if.end
253
254if.then:                                          ; preds = %entry
255  %rem = srem i32 %a, %b
256  store i32 %rem, ptr @mod_resultsw, align 4
257  br label %if.end
258
259if.end:                                           ; preds = %if.then, %entry
260  ret void
261; CHECK-LABEL: blocks_modulo_div_sw
262; CHECK: div
263; CHECK: modsw {{[0-9]+}}, 3, 4
264; CHECK: blr
265; CHECK-DRP-LABEL: blocks_modulo_div_sw
266; CHECK-DRP-NOT: modsw
267; CHECK-DRP: div
268; CHECK-DRP-NOT: modsw
269; CHECK-DRP: mull
270; CHECK-DRP-NOT: modsw
271; CHECK-DRP: sub
272; CHECK-DRP: blr
273; CHECK-PWR8-LABEL: blocks_modulo_div_sw
274; CHECK-PWR8: div
275; CHECK-PWR8: mull
276; CHECK-PWR8: sub
277; CHECK-PWR8: blr
278}
279
280