1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -O2 \
3; RUN:   -ppc-gpr-icmps=all -ppc-asm-full-reg-names -mcpu=pwr8 < %s | FileCheck %s --check-prefix=CHECK-BE \
4; RUN:  --implicit-check-not cmpw --implicit-check-not cmpd --implicit-check-not cmpl
5; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -O2 \
6; RUN:   -ppc-gpr-icmps=all -ppc-asm-full-reg-names -mcpu=pwr8 < %s | FileCheck %s --check-prefix=CHECK-LE \
7; RUN:  --implicit-check-not cmpw --implicit-check-not cmpd --implicit-check-not cmpl
8
9@glob = dso_local local_unnamed_addr global i32 0, align 4
10
11; Function Attrs: norecurse nounwind readnone
12define i64 @test_lleqsi(i32 signext %a, i32 signext %b) {
13; CHECK-LABEL: test_lleqsi:
14; CHECK:       # %bb.0: # %entry
15; CHECK-NEXT:    xor r3, r3, r4
16; CHECK-NEXT:    cntlzw r3, r3
17; CHECK-NEXT:    srwi r3, r3, 5
18; CHECK-NEXT:    blr
19; CHECK-BE-LABEL: test_lleqsi:
20; CHECK-BE:       # %bb.0: # %entry
21; CHECK-BE-NEXT:    xor r3, r3, r4
22; CHECK-BE-NEXT:    cntlzw r3, r3
23; CHECK-BE-NEXT:    srwi r3, r3, 5
24; CHECK-BE-NEXT:    blr
25;
26; CHECK-LE-LABEL: test_lleqsi:
27; CHECK-LE:       # %bb.0: # %entry
28; CHECK-LE-NEXT:    xor r3, r3, r4
29; CHECK-LE-NEXT:    cntlzw r3, r3
30; CHECK-LE-NEXT:    srwi r3, r3, 5
31; CHECK-LE-NEXT:    blr
32entry:
33  %cmp = icmp eq i32 %a, %b
34  %conv1 = zext i1 %cmp to i64
35  ret i64 %conv1
36}
37
38; Function Attrs: norecurse nounwind readnone
39define i64 @test_lleqsi_sext(i32 signext %a, i32 signext %b) {
40; CHECK-LABEL: test_lleqsi_sext:
41; CHECK:       # %bb.0: # %entry
42; CHECK-NEXT:    xor r3, r3, r4
43; CHECK-NEXT:    cntlzw r3, r3
44; CHECK-NEXT:    srwi r3, r3, 5
45; CHECK-NEXT:    neg r3, r3
46; CHECK-NEXT:    blr
47; CHECK-BE-LABEL: test_lleqsi_sext:
48; CHECK-BE:       # %bb.0: # %entry
49; CHECK-BE-NEXT:    xor r3, r3, r4
50; CHECK-BE-NEXT:    cntlzw r3, r3
51; CHECK-BE-NEXT:    srwi r3, r3, 5
52; CHECK-BE-NEXT:    neg r3, r3
53; CHECK-BE-NEXT:    blr
54;
55; CHECK-LE-LABEL: test_lleqsi_sext:
56; CHECK-LE:       # %bb.0: # %entry
57; CHECK-LE-NEXT:    xor r3, r3, r4
58; CHECK-LE-NEXT:    cntlzw r3, r3
59; CHECK-LE-NEXT:    srwi r3, r3, 5
60; CHECK-LE-NEXT:    neg r3, r3
61; CHECK-LE-NEXT:    blr
62entry:
63  %cmp = icmp eq i32 %a, %b
64  %conv1 = sext i1 %cmp to i64
65  ret i64 %conv1
66}
67
68; Function Attrs: norecurse nounwind readnone
69define i64 @test_lleqsi_z(i32 signext %a) {
70; CHECK-LABEL: test_lleqsi_z:
71; CHECK:       # %bb.0: # %entry
72; CHECK-NEXT:    cntlzw r3, r3
73; CHECK-NEXT:    srwi r3, r3, 5
74; CHECK-NEXT:    blr
75; CHECK-BE-LABEL: test_lleqsi_z:
76; CHECK-BE:       # %bb.0: # %entry
77; CHECK-BE-NEXT:    cntlzw r3, r3
78; CHECK-BE-NEXT:    srwi r3, r3, 5
79; CHECK-BE-NEXT:    blr
80;
81; CHECK-LE-LABEL: test_lleqsi_z:
82; CHECK-LE:       # %bb.0: # %entry
83; CHECK-LE-NEXT:    cntlzw r3, r3
84; CHECK-LE-NEXT:    srwi r3, r3, 5
85; CHECK-LE-NEXT:    blr
86entry:
87  %cmp = icmp eq i32 %a, 0
88  %conv1 = zext i1 %cmp to i64
89  ret i64 %conv1
90}
91
92; Function Attrs: norecurse nounwind readnone
93define i64 @test_lleqsi_sext_z(i32 signext %a) {
94; CHECK-LABEL: test_lleqsi_sext_z:
95; CHECK:       # %bb.0: # %entry
96; CHECK-NEXT:    cntlzw r3, r3
97; CHECK-NEXT:    srwi r3, r3, 5
98; CHECK-NEXT:    neg r3, r3
99; CHECK-NEXT:    blr
100; CHECK-BE-LABEL: test_lleqsi_sext_z:
101; CHECK-BE:       # %bb.0: # %entry
102; CHECK-BE-NEXT:    cntlzw r3, r3
103; CHECK-BE-NEXT:    srwi r3, r3, 5
104; CHECK-BE-NEXT:    neg r3, r3
105; CHECK-BE-NEXT:    blr
106;
107; CHECK-LE-LABEL: test_lleqsi_sext_z:
108; CHECK-LE:       # %bb.0: # %entry
109; CHECK-LE-NEXT:    cntlzw r3, r3
110; CHECK-LE-NEXT:    srwi r3, r3, 5
111; CHECK-LE-NEXT:    neg r3, r3
112; CHECK-LE-NEXT:    blr
113entry:
114  %cmp = icmp eq i32 %a, 0
115  %conv1 = sext i1 %cmp to i64
116  ret i64 %conv1
117}
118
119; Function Attrs: norecurse nounwind
120define dso_local void @test_lleqsi_store(i32 signext %a, i32 signext %b) {
121; CHECK-LABEL: test_lleqsi_store:
122; CHECK:       # %bb.0: # %entry
123; CHECK-NEXT:    xor r3, r3, r4
124; CHECK-NEXT:    addis r5, r2, glob@toc@ha
125; CHECK-NEXT:    cntlzw r3, r3
126; CHECK-NEXT:    srwi r3, r3, 5
127; CHECK-NEXT:    stw r3, glob@toc@l(r5)
128; CHECK-NEXT:    blr
129; CHECK-BE-LABEL: test_lleqsi_store:
130; CHECK-BE:       # %bb.0: # %entry
131; CHECK-BE-NEXT:    xor r3, r3, r4
132; CHECK-BE-NEXT:    addis r5, r2, glob@toc@ha
133; CHECK-BE-NEXT:    cntlzw r3, r3
134; CHECK-BE-NEXT:    srwi r3, r3, 5
135; CHECK-BE-NEXT:    stw r3, glob@toc@l(r5)
136; CHECK-BE-NEXT:    blr
137;
138; CHECK-LE-LABEL: test_lleqsi_store:
139; CHECK-LE:       # %bb.0: # %entry
140; CHECK-LE-NEXT:    xor r3, r3, r4
141; CHECK-LE-NEXT:    addis r5, r2, glob@toc@ha
142; CHECK-LE-NEXT:    cntlzw r3, r3
143; CHECK-LE-NEXT:    srwi r3, r3, 5
144; CHECK-LE-NEXT:    stw r3, glob@toc@l(r5)
145; CHECK-LE-NEXT:    blr
146entry:
147  %cmp = icmp eq i32 %a, %b
148  %conv = zext i1 %cmp to i32
149  store i32 %conv, i32* @glob, align 4
150  ret void
151}
152
153; Function Attrs: norecurse nounwind
154define dso_local void @test_lleqsi_sext_store(i32 signext %a, i32 signext %b) {
155; CHECK-LABEL: test_lleqsi_sext_store:
156; CHECK:       # %bb.0: # %entry
157; CHECK-NEXT:    xor r3, r3, r4
158; CHECK-NEXT:    addis r5, r2, glob@toc@ha
159; CHECK-NEXT:    cntlzw r3, r3
160; CHECK-NEXT:    srwi r3, r3, 5
161; CHECK-NEXT:    neg r3, r3
162; CHECK-NEXT:    stw r3, glob@toc@l(r5)
163; CHECK-NEXT:    blr
164; CHECK-BE-LABEL: test_lleqsi_sext_store:
165; CHECK-BE:       # %bb.0: # %entry
166; CHECK-BE-NEXT:    xor r3, r3, r4
167; CHECK-BE-NEXT:    addis r5, r2, glob@toc@ha
168; CHECK-BE-NEXT:    cntlzw r3, r3
169; CHECK-BE-NEXT:    srwi r3, r3, 5
170; CHECK-BE-NEXT:    neg r3, r3
171; CHECK-BE-NEXT:    stw r3, glob@toc@l(r5)
172; CHECK-BE-NEXT:    blr
173;
174; CHECK-LE-LABEL: test_lleqsi_sext_store:
175; CHECK-LE:       # %bb.0: # %entry
176; CHECK-LE-NEXT:    xor r3, r3, r4
177; CHECK-LE-NEXT:    addis r5, r2, glob@toc@ha
178; CHECK-LE-NEXT:    cntlzw r3, r3
179; CHECK-LE-NEXT:    srwi r3, r3, 5
180; CHECK-LE-NEXT:    neg r3, r3
181; CHECK-LE-NEXT:    stw r3, glob@toc@l(r5)
182; CHECK-LE-NEXT:    blr
183entry:
184  %cmp = icmp eq i32 %a, %b
185  %sub = sext i1 %cmp to i32
186  store i32 %sub, i32* @glob, align 4
187  ret void
188}
189
190; Function Attrs: norecurse nounwind
191define dso_local void @test_lleqsi_z_store(i32 signext %a) {
192; CHECK-LABEL: test_lleqsi_z_store:
193; CHECK:       # %bb.0: # %entry
194; CHECK-NEXT:    cntlzw r3, r3
195; CHECK-NEXT:    addis r4, r2, glob@toc@ha
196; CHECK-NEXT:    srwi r3, r3, 5
197; CHECK-NEXT:    stw r3, glob@toc@l(r4)
198; CHECK-NEXT:    blr
199; CHECK-BE-LABEL: test_lleqsi_z_store:
200; CHECK-BE:       # %bb.0: # %entry
201; CHECK-BE-NEXT:    cntlzw r3, r3
202; CHECK-BE-NEXT:    addis r4, r2, glob@toc@ha
203; CHECK-BE-NEXT:    srwi r3, r3, 5
204; CHECK-BE-NEXT:    stw r3, glob@toc@l(r4)
205; CHECK-BE-NEXT:    blr
206;
207; CHECK-LE-LABEL: test_lleqsi_z_store:
208; CHECK-LE:       # %bb.0: # %entry
209; CHECK-LE-NEXT:    cntlzw r3, r3
210; CHECK-LE-NEXT:    addis r4, r2, glob@toc@ha
211; CHECK-LE-NEXT:    srwi r3, r3, 5
212; CHECK-LE-NEXT:    stw r3, glob@toc@l(r4)
213; CHECK-LE-NEXT:    blr
214entry:
215  %cmp = icmp eq i32 %a, 0
216  %conv = zext i1 %cmp to i32
217  store i32 %conv, i32* @glob, align 4
218  ret void
219}
220
221; Function Attrs: norecurse nounwind
222define dso_local void @test_lleqsi_sext_z_store(i32 signext %a) {
223; CHECK-LABEL: test_lleqsi_sext_z_store:
224; CHECK:       # %bb.0: # %entry
225; CHECK-NEXT:    cntlzw r3, r3
226; CHECK-NEXT:    addis r4, r2, glob@toc@ha
227; CHECK-NEXT:    srwi r3, r3, 5
228; CHECK-NEXT:    neg r3, r3
229; CHECK-NEXT:    stw r3, glob@toc@l(r4)
230; CHECK-NEXT:    blr
231; CHECK-BE-LABEL: test_lleqsi_sext_z_store:
232; CHECK-BE:       # %bb.0: # %entry
233; CHECK-BE-NEXT:    cntlzw r3, r3
234; CHECK-BE-NEXT:    addis r4, r2, glob@toc@ha
235; CHECK-BE-NEXT:    srwi r3, r3, 5
236; CHECK-BE-NEXT:    neg r3, r3
237; CHECK-BE-NEXT:    stw r3, glob@toc@l(r4)
238; CHECK-BE-NEXT:    blr
239;
240; CHECK-LE-LABEL: test_lleqsi_sext_z_store:
241; CHECK-LE:       # %bb.0: # %entry
242; CHECK-LE-NEXT:    cntlzw r3, r3
243; CHECK-LE-NEXT:    addis r4, r2, glob@toc@ha
244; CHECK-LE-NEXT:    srwi r3, r3, 5
245; CHECK-LE-NEXT:    neg r3, r3
246; CHECK-LE-NEXT:    stw r3, glob@toc@l(r4)
247; CHECK-LE-NEXT:    blr
248entry:
249  %cmp = icmp eq i32 %a, 0
250  %sub = sext i1 %cmp to i32
251  store i32 %sub, i32* @glob, align 4
252  ret void
253}
254