1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=powerpc-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=PPC
3; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=PPC64LE
4
5define i1 @test_urem_odd(i13 %X) nounwind {
6; PPC-LABEL: test_urem_odd:
7; PPC:       # %bb.0:
8; PPC-NEXT:    mulli 3, 3, 3277
9; PPC-NEXT:    clrlwi 3, 3, 19
10; PPC-NEXT:    li 4, 0
11; PPC-NEXT:    cmplwi 3, 1639
12; PPC-NEXT:    li 3, 1
13; PPC-NEXT:    bclr 12, 0, 0
14; PPC-NEXT:  # %bb.1:
15; PPC-NEXT:    ori 3, 4, 0
16; PPC-NEXT:    blr
17;
18; PPC64LE-LABEL: test_urem_odd:
19; PPC64LE:       # %bb.0:
20; PPC64LE-NEXT:    mulli 3, 3, 3277
21; PPC64LE-NEXT:    li 4, 0
22; PPC64LE-NEXT:    clrlwi 3, 3, 19
23; PPC64LE-NEXT:    cmplwi 3, 1639
24; PPC64LE-NEXT:    li 3, 1
25; PPC64LE-NEXT:    isellt 3, 3, 4
26; PPC64LE-NEXT:    blr
27  %urem = urem i13 %X, 5
28  %cmp = icmp eq i13 %urem, 0
29  ret i1 %cmp
30}
31
32define i1 @test_urem_even(i27 %X) nounwind {
33; PPC-LABEL: test_urem_even:
34; PPC:       # %bb.0:
35; PPC-NEXT:    lis 4, 1755
36; PPC-NEXT:    ori 4, 4, 28087
37; PPC-NEXT:    mullw 3, 3, 4
38; PPC-NEXT:    rlwinm 4, 3, 31, 6, 31
39; PPC-NEXT:    rlwimi 4, 3, 26, 5, 5
40; PPC-NEXT:    lis 3, 146
41; PPC-NEXT:    ori 3, 3, 18725
42; PPC-NEXT:    cmplw 4, 3
43; PPC-NEXT:    li 3, 0
44; PPC-NEXT:    li 4, 1
45; PPC-NEXT:    bc 12, 0, .LBB1_1
46; PPC-NEXT:    blr
47; PPC-NEXT:  .LBB1_1:
48; PPC-NEXT:    addi 3, 4, 0
49; PPC-NEXT:    blr
50;
51; PPC64LE-LABEL: test_urem_even:
52; PPC64LE:       # %bb.0:
53; PPC64LE-NEXT:    lis 4, 1755
54; PPC64LE-NEXT:    ori 4, 4, 28087
55; PPC64LE-NEXT:    mullw 3, 3, 4
56; PPC64LE-NEXT:    lis 4, 146
57; PPC64LE-NEXT:    rlwinm 5, 3, 31, 6, 31
58; PPC64LE-NEXT:    rlwimi 5, 3, 26, 5, 5
59; PPC64LE-NEXT:    ori 3, 4, 18725
60; PPC64LE-NEXT:    li 4, 1
61; PPC64LE-NEXT:    cmplw 5, 3
62; PPC64LE-NEXT:    li 3, 0
63; PPC64LE-NEXT:    isellt 3, 4, 3
64; PPC64LE-NEXT:    blr
65  %urem = urem i27 %X, 14
66  %cmp = icmp eq i27 %urem, 0
67  ret i1 %cmp
68}
69
70define i1 @test_urem_odd_setne(i4 %X) nounwind {
71; PPC-LABEL: test_urem_odd_setne:
72; PPC:       # %bb.0:
73; PPC-NEXT:    mulli 3, 3, 13
74; PPC-NEXT:    clrlwi 3, 3, 28
75; PPC-NEXT:    li 4, 0
76; PPC-NEXT:    cmplwi 3, 3
77; PPC-NEXT:    li 3, 1
78; PPC-NEXT:    bclr 12, 1, 0
79; PPC-NEXT:  # %bb.1:
80; PPC-NEXT:    ori 3, 4, 0
81; PPC-NEXT:    blr
82;
83; PPC64LE-LABEL: test_urem_odd_setne:
84; PPC64LE:       # %bb.0:
85; PPC64LE-NEXT:    slwi 5, 3, 1
86; PPC64LE-NEXT:    li 4, 0
87; PPC64LE-NEXT:    add 3, 3, 5
88; PPC64LE-NEXT:    neg 3, 3
89; PPC64LE-NEXT:    clrlwi 3, 3, 28
90; PPC64LE-NEXT:    cmplwi 3, 3
91; PPC64LE-NEXT:    li 3, 1
92; PPC64LE-NEXT:    iselgt 3, 3, 4
93; PPC64LE-NEXT:    blr
94  %urem = urem i4 %X, 5
95  %cmp = icmp ne i4 %urem, 0
96  ret i1 %cmp
97}
98
99define i1 @test_urem_negative_odd(i9 %X) nounwind {
100; PPC-LABEL: test_urem_negative_odd:
101; PPC:       # %bb.0:
102; PPC-NEXT:    mulli 3, 3, 307
103; PPC-NEXT:    clrlwi 3, 3, 23
104; PPC-NEXT:    li 4, 0
105; PPC-NEXT:    cmplwi 3, 1
106; PPC-NEXT:    li 3, 1
107; PPC-NEXT:    bclr 12, 1, 0
108; PPC-NEXT:  # %bb.1:
109; PPC-NEXT:    ori 3, 4, 0
110; PPC-NEXT:    blr
111;
112; PPC64LE-LABEL: test_urem_negative_odd:
113; PPC64LE:       # %bb.0:
114; PPC64LE-NEXT:    mulli 3, 3, 307
115; PPC64LE-NEXT:    li 4, 0
116; PPC64LE-NEXT:    clrlwi 3, 3, 23
117; PPC64LE-NEXT:    cmplwi 3, 1
118; PPC64LE-NEXT:    li 3, 1
119; PPC64LE-NEXT:    iselgt 3, 3, 4
120; PPC64LE-NEXT:    blr
121  %urem = urem i9 %X, -5
122  %cmp = icmp ne i9 %urem, 0
123  ret i1 %cmp
124}
125
126define <3 x i1> @test_urem_vec(<3 x i11> %X) nounwind {
127; PPC-LABEL: test_urem_vec:
128; PPC:       # %bb.0:
129; PPC-NEXT:    mulli 3, 3, 683
130; PPC-NEXT:    rlwinm 7, 3, 31, 22, 31
131; PPC-NEXT:    rlwimi 7, 3, 10, 21, 21
132; PPC-NEXT:    mulli 5, 5, 819
133; PPC-NEXT:    li 6, 0
134; PPC-NEXT:    cmplwi 7, 341
135; PPC-NEXT:    mulli 3, 4, 1463
136; PPC-NEXT:    addi 4, 5, -1638
137; PPC-NEXT:    addi 3, 3, -1463
138; PPC-NEXT:    clrlwi 4, 4, 21
139; PPC-NEXT:    clrlwi 3, 3, 21
140; PPC-NEXT:    cmplwi 1, 4, 1
141; PPC-NEXT:    cmplwi 5, 3, 292
142; PPC-NEXT:    li 3, 1
143; PPC-NEXT:    bc 12, 21, .LBB4_2
144; PPC-NEXT:  # %bb.1:
145; PPC-NEXT:    ori 4, 6, 0
146; PPC-NEXT:    b .LBB4_3
147; PPC-NEXT:  .LBB4_2:
148; PPC-NEXT:    addi 4, 3, 0
149; PPC-NEXT:  .LBB4_3:
150; PPC-NEXT:    bc 12, 5, .LBB4_5
151; PPC-NEXT:  # %bb.4:
152; PPC-NEXT:    ori 5, 6, 0
153; PPC-NEXT:    b .LBB4_6
154; PPC-NEXT:  .LBB4_5:
155; PPC-NEXT:    addi 5, 3, 0
156; PPC-NEXT:  .LBB4_6:
157; PPC-NEXT:    bclr 12, 1, 0
158; PPC-NEXT:  # %bb.7:
159; PPC-NEXT:    ori 3, 6, 0
160; PPC-NEXT:    blr
161;
162; PPC64LE-LABEL: test_urem_vec:
163; PPC64LE:       # %bb.0:
164; PPC64LE-NEXT:    mtvsrwz 34, 3
165; PPC64LE-NEXT:    addis 3, 2, .LCPI4_0@toc@ha
166; PPC64LE-NEXT:    mtvsrwz 35, 4
167; PPC64LE-NEXT:    addi 3, 3, .LCPI4_0@toc@l
168; PPC64LE-NEXT:    addis 4, 2, .LCPI4_2@toc@ha
169; PPC64LE-NEXT:    mtvsrwz 36, 5
170; PPC64LE-NEXT:    vmrghw 2, 3, 2
171; PPC64LE-NEXT:    lvx 3, 0, 3
172; PPC64LE-NEXT:    addis 3, 2, .LCPI4_1@toc@ha
173; PPC64LE-NEXT:    addi 3, 3, .LCPI4_1@toc@l
174; PPC64LE-NEXT:    vperm 2, 4, 2, 3
175; PPC64LE-NEXT:    vspltisw 3, -11
176; PPC64LE-NEXT:    lvx 4, 0, 3
177; PPC64LE-NEXT:    addi 3, 4, .LCPI4_2@toc@l
178; PPC64LE-NEXT:    addis 4, 2, .LCPI4_4@toc@ha
179; PPC64LE-NEXT:    lvx 5, 0, 3
180; PPC64LE-NEXT:    addis 3, 2, .LCPI4_3@toc@ha
181; PPC64LE-NEXT:    addi 4, 4, .LCPI4_4@toc@l
182; PPC64LE-NEXT:    addi 3, 3, .LCPI4_3@toc@l
183; PPC64LE-NEXT:    vsrw 3, 3, 3
184; PPC64LE-NEXT:    vsubuwm 2, 2, 4
185; PPC64LE-NEXT:    lvx 4, 0, 3
186; PPC64LE-NEXT:    addis 3, 2, .LCPI4_5@toc@ha
187; PPC64LE-NEXT:    addi 3, 3, .LCPI4_5@toc@l
188; PPC64LE-NEXT:    vmuluwm 2, 2, 5
189; PPC64LE-NEXT:    lvx 5, 0, 4
190; PPC64LE-NEXT:    xxland 32, 34, 35
191; PPC64LE-NEXT:    vslw 2, 2, 4
192; PPC64LE-NEXT:    vsrw 4, 0, 5
193; PPC64LE-NEXT:    xxlor 0, 36, 34
194; PPC64LE-NEXT:    lvx 2, 0, 3
195; PPC64LE-NEXT:    xxland 35, 0, 35
196; PPC64LE-NEXT:    vcmpgtuw 2, 3, 2
197; PPC64LE-NEXT:    xxswapd 0, 34
198; PPC64LE-NEXT:    xxsldwi 1, 34, 34, 1
199; PPC64LE-NEXT:    mfvsrwz 5, 34
200; PPC64LE-NEXT:    mffprwz 3, 0
201; PPC64LE-NEXT:    mffprwz 4, 1
202; PPC64LE-NEXT:    blr
203  %urem = urem <3 x i11> %X, <i11 6, i11 7, i11 -5>
204  %cmp = icmp ne <3 x i11> %urem, <i11 0, i11 1, i11 2>
205  ret <3 x i1> %cmp
206}
207
208define i1 @test_urem_oversized(i66 %X) nounwind {
209; PPC-LABEL: test_urem_oversized:
210; PPC:       # %bb.0:
211; PPC-NEXT:    mflr 0
212; PPC-NEXT:    stw 0, 4(1)
213; PPC-NEXT:    stwu 1, -16(1)
214; PPC-NEXT:    mr 6, 5
215; PPC-NEXT:    mr 5, 4
216; PPC-NEXT:    mr 4, 3
217; PPC-NEXT:    lis 3, 12057
218; PPC-NEXT:    lis 7, -12795
219; PPC-NEXT:    ori 9, 3, 37186
220; PPC-NEXT:    ori 10, 7, 40665
221; PPC-NEXT:    li 3, 0
222; PPC-NEXT:    li 7, 0
223; PPC-NEXT:    li 8, 2
224; PPC-NEXT:    bl __multi3
225; PPC-NEXT:    rotlwi 7, 6, 31
226; PPC-NEXT:    lis 3, -5526
227; PPC-NEXT:    rlwimi 7, 5, 31, 0, 0
228; PPC-NEXT:    rotlwi 5, 5, 31
229; PPC-NEXT:    rlwimi 5, 4, 31, 0, 0
230; PPC-NEXT:    ori 3, 3, 61135
231; PPC-NEXT:    cmplwi 1, 5, 13
232; PPC-NEXT:    cmplw 7, 3
233; PPC-NEXT:    rlwinm 4, 4, 31, 31, 31
234; PPC-NEXT:    crand 20, 6, 0
235; PPC-NEXT:    crandc 21, 4, 6
236; PPC-NEXT:    rlwimi. 4, 6, 1, 30, 30
237; PPC-NEXT:    cror 20, 20, 21
238; PPC-NEXT:    crnand 20, 2, 20
239; PPC-NEXT:    li 3, 1
240; PPC-NEXT:    bc 12, 20, .LBB5_1
241; PPC-NEXT:    b .LBB5_2
242; PPC-NEXT:  .LBB5_1:
243; PPC-NEXT:    li 3, 0
244; PPC-NEXT:  .LBB5_2:
245; PPC-NEXT:    lwz 0, 20(1)
246; PPC-NEXT:    addi 1, 1, 16
247; PPC-NEXT:    mtlr 0
248; PPC-NEXT:    blr
249;
250; PPC64LE-LABEL: test_urem_oversized:
251; PPC64LE:       # %bb.0:
252; PPC64LE-NEXT:    lis 5, 6028
253; PPC64LE-NEXT:    ori 5, 5, 51361
254; PPC64LE-NEXT:    rldic 5, 5, 33, 2
255; PPC64LE-NEXT:    oris 5, 5, 52741
256; PPC64LE-NEXT:    ori 5, 5, 40665
257; PPC64LE-NEXT:    mulhdu 6, 3, 5
258; PPC64LE-NEXT:    mulld 4, 4, 5
259; PPC64LE-NEXT:    mulld 5, 3, 5
260; PPC64LE-NEXT:    sldi 3, 3, 1
261; PPC64LE-NEXT:    add 3, 6, 3
262; PPC64LE-NEXT:    add 3, 3, 4
263; PPC64LE-NEXT:    lis 4, -8538
264; PPC64LE-NEXT:    rotldi 6, 5, 63
265; PPC64LE-NEXT:    ori 4, 4, 44780
266; PPC64LE-NEXT:    rldimi 6, 3, 63, 0
267; PPC64LE-NEXT:    rlwinm 3, 3, 31, 31, 31
268; PPC64LE-NEXT:    rldicl 4, 4, 4, 28
269; PPC64LE-NEXT:    rlwimi. 3, 5, 1, 30, 30
270; PPC64LE-NEXT:    cmpld 1, 6, 4
271; PPC64LE-NEXT:    li 3, 1
272; PPC64LE-NEXT:    crnand 20, 2, 4
273; PPC64LE-NEXT:    isel 3, 0, 3, 20
274; PPC64LE-NEXT:    blr
275  %urem = urem i66 %X, 1234567890
276  %cmp = icmp eq i66 %urem, 0
277  ret i1 %cmp
278}
279