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 i16 0, align 2
11
12define signext i32 @test_ineus(i16 zeroext %a, i16 zeroext %b) {
13; CHECK-LABEL: test_ineus:
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:    xori r3, r3, 1
19; CHECK-NEXT:    blr
20entry:
21  %cmp = icmp ne i16 %a, %b
22  %conv2 = zext i1 %cmp to i32
23  ret i32 %conv2
24}
25
26define signext i32 @test_ineus_sext(i16 zeroext %a, i16 zeroext %b) {
27; CHECK-LABEL: test_ineus_sext:
28; CHECK:       # BB#0: # %entry
29; CHECK-NEXT:    xor r3, r3, r4
30; CHECK-NEXT:    cntlzw r3, r3
31; CHECK-NEXT:    srwi r3, r3, 5
32; CHECK-NEXT:    xori r3, r3, 1
33; CHECK-NEXT:    neg r3, r3
34; CHECK-NEXT:    blr
35entry:
36  %cmp = icmp ne i16 %a, %b
37  %sub = sext i1 %cmp to i32
38  ret i32 %sub
39}
40
41define signext i32 @test_ineus_z(i16 zeroext %a) {
42; CHECK-LABEL: test_ineus_z:
43; CHECK:       # BB#0: # %entry
44; CHECK-NEXT:    cntlzw r3, r3
45; CHECK-NEXT:    srwi r3, r3, 5
46; CHECK-NEXT:    xori r3, r3, 1
47; CHECK-NEXT:    blr
48entry:
49  %cmp = icmp ne i16 %a, 0
50  %conv1 = zext i1 %cmp to i32
51  ret i32 %conv1
52}
53
54define signext i32 @test_ineus_sext_z(i16 zeroext %a) {
55; CHECK-LABEL: test_ineus_sext_z:
56; CHECK:       # BB#0: # %entry
57; CHECK-NEXT:    cntlzw r3, r3
58; CHECK-NEXT:    srwi r3, r3, 5
59; CHECK-NEXT:    xori r3, r3, 1
60; CHECK-NEXT:    neg r3, r3
61; CHECK-NEXT:    blr
62entry:
63  %cmp = icmp ne i16 %a, 0
64  %sub = sext i1 %cmp to i32
65  ret i32 %sub
66}
67
68define void @test_ineus_store(i16 zeroext %a, i16 zeroext %b) {
69; CHECK-LABEL: test_ineus_store:
70; CHECK:       # BB#0: # %entry
71; CHECK-NEXT:    xor r3, r3, r4
72; CHECK-NEXT:    addis r5, r2, .LC0@toc@ha
73; CHECK-NEXT:    cntlzw r3, r3
74; CHECK-NEXT:    ld r4, .LC0@toc@l(r5)
75; CHECK-NEXT:    srwi r3, r3, 5
76; CHECK-NEXT:    xori r3, r3, 1
77; CHECK-NEXT:    sth r3, 0(r4)
78; CHECK-NEXT:    blr
79entry:
80  %cmp = icmp ne i16 %a, %b
81  %conv3 = zext i1 %cmp to i16
82  store i16 %conv3, i16* @glob, align 2
83  ret void
84}
85
86define void @test_ineus_sext_store(i16 zeroext %a, i16 zeroext %b) {
87; CHECK-LABEL: test_ineus_sext_store:
88; CHECK:       # BB#0: # %entry
89; CHECK-NEXT:    xor r3, r3, r4
90; CHECK-NEXT:    addis r5, r2, .LC0@toc@ha
91; CHECK-NEXT:    cntlzw r3, r3
92; CHECK-NEXT:    ld r4, .LC0@toc@l(r5)
93; CHECK-NEXT:    srwi r3, r3, 5
94; CHECK-NEXT:    xori r3, r3, 1
95; CHECK-NEXT:    neg r3, r3
96; CHECK-NEXT:    sth r3, 0(r4)
97; CHECK-NEXT:    blr
98entry:
99  %cmp = icmp ne i16 %a, %b
100  %conv3 = sext i1 %cmp to i16
101  store i16 %conv3, i16* @glob, align 2
102  ret void
103}
104
105define void @test_ineus_z_store(i16 zeroext %a) {
106; CHECK-LABEL: test_ineus_z_store:
107; CHECK:       # BB#0: # %entry
108; CHECK-NEXT:    addis r4, r2, .LC0@toc@ha
109; CHECK-NEXT:    cntlzw r3, r3
110; CHECK-NEXT:    ld r4, .LC0@toc@l(r4)
111; CHECK-NEXT:    srwi r3, r3, 5
112; CHECK-NEXT:    xori r3, r3, 1
113; CHECK-NEXT:    sth r3, 0(r4)
114; CHECK-NEXT:    blr
115entry:
116  %cmp = icmp ne i16 %a, 0
117  %conv2 = zext i1 %cmp to i16
118  store i16 %conv2, i16* @glob, align 2
119  ret void
120}
121
122define void @test_ineus_sext_z_store(i16 zeroext %a) {
123; CHECK-LABEL: test_ineus_sext_z_store:
124; CHECK:       # BB#0: # %entry
125; CHECK-NEXT:    addis r4, r2, .LC0@toc@ha
126; CHECK-NEXT:    cntlzw r3, r3
127; CHECK-NEXT:    srwi r3, r3, 5
128; CHECK-NEXT:    ld r4, .LC0@toc@l(r4)
129; CHECK-NEXT:    xori r3, r3, 1
130; CHECK-NEXT:    neg r3, r3
131; CHECK-NEXT:    sth r3, 0(r4)
132; CHECK-NEXT:    blr
133entry:
134  %cmp = icmp ne i16 %a, 0
135  %conv2 = sext i1 %cmp to i16
136  store i16 %conv2, i16* @glob, align 2
137  ret void
138}
139