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
9@glob = common local_unnamed_addr global i16 0, align 2
10
11; Function Attrs: norecurse nounwind readnone
12define signext i32 @test_igtus(i16 zeroext %a, i16 zeroext %b) {
13; CHECK-LABEL: test_igtus:
14; CHECK:    sub [[REG:r[0-9]+]], r4, r3
15; CHECK-NEXT:    rldicl r3, [[REG]], 1, 63
16; CHECK-NEXT:    blr
17entry:
18  %cmp = icmp ugt i16 %a, %b
19  %conv2 = zext i1 %cmp to i32
20  ret i32 %conv2
21}
22
23; Function Attrs: norecurse nounwind readnone
24define signext i32 @test_igtus_sext(i16 zeroext %a, i16 zeroext %b) {
25; CHECK-LABEL: test_igtus_sext:
26; CHECK:    sub [[REG:r[0-9]+]], r4, r3
27; CHECK-NEXT:    sradi r3, [[REG]], 63
28; CHECK-NEXT:    blr
29entry:
30  %cmp = icmp ugt i16 %a, %b
31  %sub = sext i1 %cmp to i32
32  ret i32 %sub
33}
34
35; Function Attrs: norecurse nounwind readnone
36define signext i32 @test_igtus_z(i16 zeroext %a) {
37; CHECK-LABEL: test_igtus_z:
38; CHECK:    cntlzw r3, r3
39; CHECK-NEXT:    srwi r3, r3, 5
40; CHECK-NEXT:    xori r3, r3, 1
41; CHECK-NEXT:    blr
42entry:
43  %cmp = icmp ne i16 %a, 0
44  %conv1 = zext i1 %cmp to i32
45  ret i32 %conv1
46}
47
48; Function Attrs: norecurse nounwind readnone
49define signext i32 @test_igtus_sext_z(i16 zeroext %a) {
50; CHECK-LABEL: test_igtus_sext_z:
51; CHECK:    cntlzw r3, r3
52; CHECK-NEXT:    srwi r3, r3, 5
53; CHECK-NEXT:    xori r3, r3, 1
54; CHECK-NEXT:    neg r3, r3
55; CHECK-NEXT:    blr
56entry:
57  %cmp = icmp ne i16 %a, 0
58  %sub = sext i1 %cmp to i32
59  ret i32 %sub
60}
61
62; Function Attrs: norecurse nounwind
63define void @test_igtus_store(i16 zeroext %a, i16 zeroext %b) {
64; CHECK-LABEL: test_igtus_store:
65; CHECK:         sub [[REG:r[0-9]+]], r4, r3
66; CHECK:         rldicl {{r[0-9]+}}, [[REG]], 1, 63
67; CHECK:         blr
68entry:
69  %cmp = icmp ugt i16 %a, %b
70  %conv3 = zext i1 %cmp to i16
71  store i16 %conv3, i16* @glob, align 2
72  ret void
73}
74
75; Function Attrs: norecurse nounwind
76define void @test_igtus_sext_store(i16 zeroext %a, i16 zeroext %b) {
77; CHECK-LABEL: test_igtus_sext_store:
78; CHECK:         sub [[REG:r[0-9]+]], r4, r3
79; CHECK:         sradi {{r[0-9]+}}, [[REG]], 63
80; CHECK:         blr
81entry:
82  %cmp = icmp ugt i16 %a, %b
83  %conv3 = sext i1 %cmp to i16
84  store i16 %conv3, i16* @glob, align 2
85  ret void
86}
87
88; Function Attrs: norecurse nounwind
89define void @test_igtus_z_store(i16 zeroext %a) {
90; CHECK-LABEL: test_igtus_z_store:
91; CHECK:    cntlzw r3, r3
92; CHECK:    srwi r3, r3, 5
93; CHECK:    xori r3, r3, 1
94; CHECK:    sth r3, 0(r4)
95; CHECK-NEXT:    blr
96entry:
97  %cmp = icmp ne i16 %a, 0
98  %conv2 = zext i1 %cmp to i16
99  store i16 %conv2, i16* @glob, align 2
100  ret void
101}
102
103; Function Attrs: norecurse nounwind
104define void @test_igtus_sext_z_store(i16 zeroext %a) {
105; CHECK-LABEL: test_igtus_sext_z_store:
106; CHECK:    cntlzw r3, r3
107; CHECK:    srwi r3, r3, 5
108; CHECK:    xori r3, r3, 1
109; CHECK:    neg r3, r3
110; CHECK:    sth r3, 0(r4)
111; CHECK-NEXT:    blr
112entry:
113  %cmp = icmp ne i16 %a, 0
114  %conv2 = sext i1 %cmp to i16
115  store i16 %conv2, i16* @glob, align 2
116  ret void
117}
118
119