Revert " [LoongArch][ISel] Check the number of sign bits in `PatGprGpr_32` (#107432)"
[llvm-project.git] / llvm / test / CodeGen / PowerPC / ppc64-P9-mod.ll
blob21a7b214e89cca1442ddf20d529167d3fbda840f
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]
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
20 ; Function Attrs: norecurse nounwind
21 define void @modulo_sw(i32 signext %a, i32 signext %b) local_unnamed_addr {
22 entry:
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
36 ; Function Attrs: norecurse nounwind readnone
37 define zeroext i32 @modulo_uw(i32 zeroext %a, i32 zeroext %b) local_unnamed_addr {
38 entry:
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
51 ; Function Attrs: norecurse nounwind readnone
52 define i64 @modulo_sd(i64 %a, i64 %b) local_unnamed_addr {
53 entry:
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
66 ; Function Attrs: norecurse nounwind
67 define void @modulo_ud(i64 %a, i64 %b) local_unnamed_addr {
68 entry:
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
82 ; Function Attrs: norecurse nounwind
83 define void @modulo_div_sw(i32 signext %a, i32 signext %b) local_unnamed_addr {
84 entry:
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
108 ; Function Attrs: norecurse nounwind
109 define void @modulo_div_abc_sw(i32 signext %a, i32 signext %b, i32 signext %c) local_unnamed_addr {
110 entry:
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
126 ; Function Attrs: norecurse nounwind
127 define void @modulo_div_uw(i32 zeroext %a, i32 zeroext %b) local_unnamed_addr {
128 entry:
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
152 ; Function Attrs: norecurse nounwind
153 define void @modulo_div_swuw(i32 signext %a, i32 signext %b) local_unnamed_addr {
154 entry:
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
170 ; Function Attrs: norecurse nounwind
171 define void @modulo_div_udsd(i64 %a, i64 %b) local_unnamed_addr {
172 entry:
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
188 ; Function Attrs: norecurse nounwind
189 define void @modulo_const32_sw(i32 signext %a) local_unnamed_addr {
190 entry:
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
213 ; Function Attrs: norecurse nounwind readnone
214 define signext i32 @modulo_const3_sw(i32 signext %a) local_unnamed_addr {
215 entry:
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
231 ; Function Attrs: norecurse nounwind readnone
232 define signext i32 @const2_modulo_sw(i32 signext %a) local_unnamed_addr {
233 entry:
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
246 ; Function Attrs: norecurse nounwind
247 define void @blocks_modulo_div_sw(i32 signext %a, i32 signext %b, i32 signext %c) local_unnamed_addr {
248 entry:
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
254 if.then:                                          ; preds = %entry
255   %rem = srem i32 %a, %b
256   store i32 %rem, ptr @mod_resultsw, align 4
257   br label %if.end
259 if.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