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 = local_unnamed_addr global i32 0, align 4
10
11define signext i32 @test_ineui(i32 zeroext %a, i32 zeroext %b) {
12; CHECK-LABEL: test_ineui:
13; CHECK:       # %bb.0: # %entry
14; CHECK-NEXT:    xor r3, r3, r4
15; CHECK-NEXT:    cntlzw r3, r3
16; CHECK-NEXT:    srwi r3, r3, 5
17; CHECK-NEXT:    xori r3, r3, 1
18; CHECK-NEXT:    blr
19; CHECK-BE-LABEL: test_ineui:
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:    xori r3, r3, 1
25; CHECK-BE-NEXT:    blr
26;
27; CHECK-LE-LABEL: test_ineui:
28; CHECK-LE:       # %bb.0: # %entry
29; CHECK-LE-NEXT:    xor r3, r3, r4
30; CHECK-LE-NEXT:    cntlzw r3, r3
31; CHECK-LE-NEXT:    srwi r3, r3, 5
32; CHECK-LE-NEXT:    xori r3, r3, 1
33; CHECK-LE-NEXT:    blr
34entry:
35  %cmp = icmp ne i32 %a, %b
36  %conv = zext i1 %cmp to i32
37  ret i32 %conv
38}
39
40define signext i32 @test_ineui_sext(i32 zeroext %a, i32 zeroext %b) {
41; CHECK-LABEL: test_ineui_sext:
42; CHECK:       # %bb.0: # %entry
43; CHECK-NEXT:    xor r3, r3, r4
44; CHECK-NEXT:    cntlzw r3, r3
45; CHECK-NEXT:    srwi r3, r3, 5
46; CHECK-NEXT:    xori r3, r3, 1
47; CHECK-NEXT:    neg r3, r3
48; CHECK-NEXT:    blr
49; CHECK-BE-LABEL: test_ineui_sext:
50; CHECK-BE:       # %bb.0: # %entry
51; CHECK-BE-NEXT:    xor r3, r3, r4
52; CHECK-BE-NEXT:    cntlzw r3, r3
53; CHECK-BE-NEXT:    srwi r3, r3, 5
54; CHECK-BE-NEXT:    xori r3, r3, 1
55; CHECK-BE-NEXT:    neg r3, r3
56; CHECK-BE-NEXT:    blr
57;
58; CHECK-LE-LABEL: test_ineui_sext:
59; CHECK-LE:       # %bb.0: # %entry
60; CHECK-LE-NEXT:    xor r3, r3, r4
61; CHECK-LE-NEXT:    cntlzw r3, r3
62; CHECK-LE-NEXT:    srwi r3, r3, 5
63; CHECK-LE-NEXT:    xori r3, r3, 1
64; CHECK-LE-NEXT:    neg r3, r3
65; CHECK-LE-NEXT:    blr
66entry:
67  %cmp = icmp ne i32 %a, %b
68  %sub = sext i1 %cmp to i32
69  ret i32 %sub
70}
71
72define signext i32 @test_ineui_z(i32 zeroext %a) {
73; CHECK-LABEL: test_ineui_z:
74; CHECK:       # %bb.0: # %entry
75; CHECK-NEXT:    cntlzw r3, r3
76; CHECK-NEXT:    srwi r3, r3, 5
77; CHECK-NEXT:    xori r3, r3, 1
78; CHECK-NEXT:    blr
79; CHECK-BE-LABEL: test_ineui_z:
80; CHECK-BE:       # %bb.0: # %entry
81; CHECK-BE-NEXT:    cntlzw r3, r3
82; CHECK-BE-NEXT:    srwi r3, r3, 5
83; CHECK-BE-NEXT:    xori r3, r3, 1
84; CHECK-BE-NEXT:    blr
85;
86; CHECK-LE-LABEL: test_ineui_z:
87; CHECK-LE:       # %bb.0: # %entry
88; CHECK-LE-NEXT:    cntlzw r3, r3
89; CHECK-LE-NEXT:    srwi r3, r3, 5
90; CHECK-LE-NEXT:    xori r3, r3, 1
91; CHECK-LE-NEXT:    blr
92entry:
93  %cmp = icmp ne i32 %a, 0
94  %conv = zext i1 %cmp to i32
95  ret i32 %conv
96}
97
98define signext i32 @test_ineui_sext_z(i32 zeroext %a) {
99; CHECK-LABEL: test_ineui_sext_z:
100; CHECK:       # %bb.0: # %entry
101; CHECK-NEXT:    cntlzw r3, r3
102; CHECK-NEXT:    srwi r3, r3, 5
103; CHECK-NEXT:    xori r3, r3, 1
104; CHECK-NEXT:    neg r3, r3
105; CHECK-NEXT:    blr
106; CHECK-BE-LABEL: test_ineui_sext_z:
107; CHECK-BE:       # %bb.0: # %entry
108; CHECK-BE-NEXT:    cntlzw r3, r3
109; CHECK-BE-NEXT:    srwi r3, r3, 5
110; CHECK-BE-NEXT:    xori r3, r3, 1
111; CHECK-BE-NEXT:    neg r3, r3
112; CHECK-BE-NEXT:    blr
113;
114; CHECK-LE-LABEL: test_ineui_sext_z:
115; CHECK-LE:       # %bb.0: # %entry
116; CHECK-LE-NEXT:    cntlzw r3, r3
117; CHECK-LE-NEXT:    srwi r3, r3, 5
118; CHECK-LE-NEXT:    xori r3, r3, 1
119; CHECK-LE-NEXT:    neg r3, r3
120; CHECK-LE-NEXT:    blr
121entry:
122  %cmp = icmp ne i32 %a, 0
123  %sub = sext i1 %cmp to i32
124  ret i32 %sub
125}
126
127define void @test_ineui_store(i32 zeroext %a, i32 zeroext %b) {
128; CHECK-LABEL: test_ineui_store:
129; CHECK:       # %bb.0: # %entry
130; CHECK-NEXT:    xor r3, r3, r4
131; CHECK-NEXT:    addis r5, r2, glob@toc@ha
132; CHECK-NEXT:    cntlzw r3, r3
133; CHECK-NEXT:    srwi r3, r3, 5
134; CHECK-NEXT:    xori r3, r3, 1
135; CHECK-NEXT:    stw r3, glob@toc@l(r5)
136; CHECK-NEXT:    blr
137; CHECK-BE-LABEL: test_ineui_store:
138; CHECK-BE:       # %bb.0: # %entry
139; CHECK-BE-NEXT:    addis r5, r2, .LC0@toc@ha
140; CHECK-BE-NEXT:    xor r3, r3, r4
141; CHECK-BE-NEXT:    cntlzw r3, r3
142; CHECK-BE-NEXT:    ld r4, .LC0@toc@l(r5)
143; CHECK-BE-NEXT:    srwi r3, r3, 5
144; CHECK-BE-NEXT:    xori r3, r3, 1
145; CHECK-BE-NEXT:    stw r3, 0(r4)
146; CHECK-BE-NEXT:    blr
147;
148; CHECK-LE-LABEL: test_ineui_store:
149; CHECK-LE:       # %bb.0: # %entry
150; CHECK-LE-NEXT:    xor r3, r3, r4
151; CHECK-LE-NEXT:    addis r5, r2, glob@toc@ha
152; CHECK-LE-NEXT:    cntlzw r3, r3
153; CHECK-LE-NEXT:    srwi r3, r3, 5
154; CHECK-LE-NEXT:    xori r3, r3, 1
155; CHECK-LE-NEXT:    stw r3, glob@toc@l(r5)
156; CHECK-LE-NEXT:    blr
157entry:
158  %cmp = icmp ne i32 %a, %b
159  %conv = zext i1 %cmp to i32
160  store i32 %conv, i32* @glob, align 4
161  ret void
162}
163
164define void @test_ineui_sext_store(i32 zeroext %a, i32 zeroext %b) {
165; CHECK-LABEL: test_ineui_sext_store:
166; CHECK:       # %bb.0: # %entry
167; CHECK-NEXT:    xor r3, r3, r4
168; CHECK-NEXT:    addis r5, r2, glob@toc@ha
169; CHECK-NEXT:    cntlzw r3, r3
170; CHECK-NEXT:    srwi r3, r3, 5
171; CHECK-NEXT:    xori r3, r3, 1
172; CHECK-NEXT:    neg r3, r3
173; CHECK-NEXT:    stw r3, glob@toc@l(r5)
174; CHECK-NEXT:    blr
175; CHECK-BE-LABEL: test_ineui_sext_store:
176; CHECK-BE:       # %bb.0: # %entry
177; CHECK-BE-NEXT:    xor r3, r3, r4
178; CHECK-BE-NEXT:    addis r5, r2, .LC0@toc@ha
179; CHECK-BE-NEXT:    cntlzw r3, r3
180; CHECK-BE-NEXT:    ld r4, .LC0@toc@l(r5)
181; CHECK-BE-NEXT:    srwi r3, r3, 5
182; CHECK-BE-NEXT:    xori r3, r3, 1
183; CHECK-BE-NEXT:    neg r3, r3
184; CHECK-BE-NEXT:    stw r3, 0(r4)
185; CHECK-BE-NEXT:    blr
186;
187; CHECK-LE-LABEL: test_ineui_sext_store:
188; CHECK-LE:       # %bb.0: # %entry
189; CHECK-LE-NEXT:    xor r3, r3, r4
190; CHECK-LE-NEXT:    addis r5, r2, glob@toc@ha
191; CHECK-LE-NEXT:    cntlzw r3, r3
192; CHECK-LE-NEXT:    srwi r3, r3, 5
193; CHECK-LE-NEXT:    xori r3, r3, 1
194; CHECK-LE-NEXT:    neg r3, r3
195; CHECK-LE-NEXT:    stw r3, glob@toc@l(r5)
196; CHECK-LE-NEXT:    blr
197entry:
198  %cmp = icmp ne i32 %a, %b
199  %sub = sext i1 %cmp to i32
200  store i32 %sub, i32* @glob, align 4
201  ret void
202}
203
204define void @test_ineui_z_store(i32 zeroext %a) {
205; CHECK-LABEL: test_ineui_z_store:
206; CHECK:       # %bb.0: # %entry
207; CHECK-NEXT:    cntlzw r3, r3
208; CHECK-NEXT:    addis r4, r2, glob@toc@ha
209; CHECK-NEXT:    srwi r3, r3, 5
210; CHECK-NEXT:    xori r3, r3, 1
211; CHECK-NEXT:    stw r3, glob@toc@l(r4)
212; CHECK-NEXT:    blr
213; CHECK-BE-LABEL: test_ineui_z_store:
214; CHECK-BE:       # %bb.0: # %entry
215; CHECK-BE-NEXT:    addis r4, r2, .LC0@toc@ha
216; CHECK-BE-NEXT:    cntlzw r3, r3
217; CHECK-BE-NEXT:    ld r4, .LC0@toc@l(r4)
218; CHECK-BE-NEXT:    srwi r3, r3, 5
219; CHECK-BE-NEXT:    xori r3, r3, 1
220; CHECK-BE-NEXT:    stw r3, 0(r4)
221; CHECK-BE-NEXT:    blr
222;
223; CHECK-LE-LABEL: test_ineui_z_store:
224; CHECK-LE:       # %bb.0: # %entry
225; CHECK-LE-NEXT:    cntlzw r3, r3
226; CHECK-LE-NEXT:    addis r4, r2, glob@toc@ha
227; CHECK-LE-NEXT:    srwi r3, r3, 5
228; CHECK-LE-NEXT:    xori r3, r3, 1
229; CHECK-LE-NEXT:    stw r3, glob@toc@l(r4)
230; CHECK-LE-NEXT:    blr
231entry:
232  %cmp = icmp ne i32 %a, 0
233  %conv = zext i1 %cmp to i32
234  store i32 %conv, i32* @glob, align 4
235  ret void
236}
237
238define void @test_ineui_sext_z_store(i32 zeroext %a) {
239; CHECK-LABEL: test_ineui_sext_z_store:
240; CHECK:       # %bb.0: # %entry
241; CHECK-NEXT:    cntlzw r3, r3
242; CHECK-NEXT:    addis r4, r2, glob@toc@ha
243; CHECK-NEXT:    srwi r3, r3, 5
244; CHECK-NEXT:    xori r3, r3, 1
245; CHECK-NEXT:    neg r3, r3
246; CHECK-NEXT:    stw r3, glob@toc@l(r4)
247; CHECK-NEXT:    blr
248; CHECK-BE-LABEL: test_ineui_sext_z_store:
249; CHECK-BE:       # %bb.0: # %entry
250; CHECK-BE-NEXT:    addis r4, r2, .LC0@toc@ha
251; CHECK-BE-NEXT:    cntlzw r3, r3
252; CHECK-BE-NEXT:    srwi r3, r3, 5
253; CHECK-BE-NEXT:    ld r4, .LC0@toc@l(r4)
254; CHECK-BE-NEXT:    xori r3, r3, 1
255; CHECK-BE-NEXT:    neg r3, r3
256; CHECK-BE-NEXT:    stw r3, 0(r4)
257; CHECK-BE-NEXT:    blr
258;
259; CHECK-LE-LABEL: test_ineui_sext_z_store:
260; CHECK-LE:       # %bb.0: # %entry
261; CHECK-LE-NEXT:    cntlzw r3, r3
262; CHECK-LE-NEXT:    addis r4, r2, glob@toc@ha
263; CHECK-LE-NEXT:    srwi r3, r3, 5
264; CHECK-LE-NEXT:    xori r3, r3, 1
265; CHECK-LE-NEXT:    neg r3, r3
266; CHECK-LE-NEXT:    stw r3, glob@toc@l(r4)
267; CHECK-LE-NEXT:    blr
268entry:
269  %cmp = icmp ne i32 %a, 0
270  %sub = sext i1 %cmp to i32
271  store i32 %sub, i32* @glob, align 4
272  ret void
273}
274