1; XFAIL: *
2; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -O2 \
3; RUN:   -ppc-asm-full-reg-names -mcpu=pwr8 < %s | FileCheck %s \
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-asm-full-reg-names -mcpu=pwr8 < %s | FileCheck %s \
7; RUN:  --implicit-check-not cmpw --implicit-check-not cmpd --implicit-check-not cmpl
8; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
9
10@glob = common local_unnamed_addr global i64 0, align 8
11
12define i64 @test_llnesll(i64 %a, i64 %b) {
13; CHECK-LABEL: test_llnesll:
14; CHECK:       # BB#0: # %entry
15; CHECK-NEXT:    xor r3, r3, r4
16; CHECK-NEXT:    addic r4, r3, -1
17; CHECK-NEXT:    subfe r3, r4, r3
18; CHECK-NEXT:    blr
19entry:
20  %cmp = icmp ne i64 %a, %b
21  %conv1 = zext i1 %cmp to i64
22  ret i64 %conv1
23}
24
25define i64 @test_llnesll_sext(i64 %a, i64 %b) {
26; CHECK-LABEL: test_llnesll_sext:
27; CHECK:       # BB#0: # %entry
28; CHECK-NEXT:    xor r3, r3, r4
29; CHECK-NEXT:    subfic r3, r3, 0
30; CHECK-NEXT:    subfe r3, r3, r3
31; CHECK-NEXT:    blr
32entry:
33  %cmp = icmp ne i64 %a, %b
34  %conv1 = sext i1 %cmp to i64
35  ret i64 %conv1
36}
37
38define i64 @test_llnesll_z(i64 %a) {
39; CHECK-LABEL: test_llnesll_z:
40; CHECK:       # BB#0: # %entry
41; CHECK-NEXT:    addic r4, r3, -1
42; CHECK-NEXT:    subfe r3, r4, r3
43; CHECK-NEXT:    blr
44entry:
45  %cmp = icmp ne i64 %a, 0
46  %conv1 = zext i1 %cmp to i64
47  ret i64 %conv1
48}
49
50define i64 @test_llnesll_sext_z(i64 %a) {
51; CHECK-LABEL: test_llnesll_sext_z:
52; CHECK:       # BB#0: # %entry
53; CHECK-NEXT:    subfic r3, r3, 0
54; CHECK-NEXT:    subfe r3, r3, r3
55; CHECK-NEXT:    blr
56entry:
57  %cmp = icmp ne i64 %a, 0
58  %conv1 = sext i1 %cmp to i64
59  ret i64 %conv1
60}
61
62define void @test_llnesll_store(i64 %a, i64 %b) {
63; CHECK-LABEL: test_llnesll_store:
64; CHECK:       # BB#0: # %entry
65; CHECK-NEXT:    addis r5, r2, .LC0@toc@ha
66; CHECK-NEXT:    xor r3, r3, r4
67; CHECK-NEXT:    ld r12, .LC0@toc@l(r5)
68; CHECK-NEXT:    addic r5, r3, -1
69; CHECK-NEXT:    subfe r3, r5, r3
70; CHECK-NEXT:    std r3, 0(r12)
71; CHECK-NEXT:    blr
72entry:
73  %cmp = icmp ne i64 %a, %b
74  %conv1 = zext i1 %cmp to i64
75  store i64 %conv1, i64* @glob, align 8
76  ret void
77}
78
79define void @test_llnesll_sext_store(i64 %a, i64 %b) {
80; CHECK-LABEL: test_llnesll_sext_store:
81; CHECK:       # BB#0: # %entry
82; CHECK-NEXT:    addis r5, r2, .LC0@toc@ha
83; CHECK-NEXT:    xor r3, r3, r4
84; CHECK-NEXT:    ld r12, .LC0@toc@l(r5)
85; CHECK-NEXT:    subfic r3, r3, 0
86; CHECK-NEXT:    subfe r3, r3, r3
87; CHECK-NEXT:    std r3, 0(r12)
88; CHECK-NEXT:    blr
89entry:
90  %cmp = icmp ne i64 %a, %b
91  %conv1 = sext i1 %cmp to i64
92  store i64 %conv1, i64* @glob, align 8
93  ret void
94}
95
96define void @test_llnesll_z_store(i64 %a) {
97; CHECK-LABEL: test_llnesll_z_store:
98; CHECK:       # BB#0: # %entry
99; CHECK-NEXT:    addis r4, r2, .LC0@toc@ha
100; CHECK-NEXT:    addic r5, r3, -1
101; CHECK-NEXT:    ld r4, .LC0@toc@l(r4)
102; CHECK-NEXT:    subfe r3, r5, r3
103; CHECK-NEXT:    std r3, 0(r4)
104; CHECK-NEXT:    blr
105entry:
106  %cmp = icmp ne i64 %a, 0
107  %conv1 = zext i1 %cmp to i64
108  store i64 %conv1, i64* @glob, align 8
109  ret void
110}
111
112define void @test_llnesll_sext_z_store(i64 %a) {
113; CHECK-LABEL: test_llnesll_sext_z_store:
114; CHECK:       # BB#0: # %entry
115; CHECK-NEXT:    addis r4, r2, .LC0@toc@ha
116; CHECK-NEXT:    subfic r3, r3, 0
117; CHECK-NEXT:    ld r4, .LC0@toc@l(r4)
118; CHECK-NEXT:    subfe r3, r3, r3
119; CHECK-NEXT:    std r3, 0(r4)
120; CHECK-NEXT:    blr
121entry:
122  %cmp = icmp ne i64 %a, 0
123  %conv1 = sext i1 %cmp to i64
124  store i64 %conv1, i64* @glob, align 8
125  ret void
126}
127