Revert r251593.
[oota-llvm.git] / test / Transforms / InstCombine / x86-xop.ll
1 ; RUN: opt < %s -instcombine -S | FileCheck %s
2
3 define <2 x i64> @cmp_slt_v2i64(<2 x i64> %a, <2 x i64> %b) {
4 ; CHECK-LABEL: @cmp_slt_v2i64
5 ; CHECK-NEXT: %1 = icmp slt <2 x i64> %a, %b
6 ; CHECK-NEXT: %2 = sext <2 x i1> %1 to <2 x i64>
7 ; CHECK-NEXT: ret <2 x i64> %2
8   %1 = tail call <2 x i64> @llvm.x86.xop.vpcomltq(<2 x i64> %a, <2 x i64> %b)
9   ret <2 x i64> %1
10 }
11
12 define <2 x i64> @cmp_ult_v2i64(<2 x i64> %a, <2 x i64> %b) {
13 ; CHECK-LABEL: @cmp_ult_v2i64
14 ; CHECK-NEXT: %1 = icmp ult <2 x i64> %a, %b
15 ; CHECK-NEXT: %2 = sext <2 x i1> %1 to <2 x i64>
16 ; CHECK-NEXT: ret <2 x i64> %2
17   %1 = tail call <2 x i64> @llvm.x86.xop.vpcomltuq(<2 x i64> %a, <2 x i64> %b)
18   ret <2 x i64> %1
19 }
20
21 define <2 x i64> @cmp_sle_v2i64(<2 x i64> %a, <2 x i64> %b) {
22 ; CHECK-LABEL: @cmp_sle_v2i64
23 ; CHECK-NEXT: %1 = icmp sle <2 x i64> %a, %b
24 ; CHECK-NEXT: %2 = sext <2 x i1> %1 to <2 x i64>
25 ; CHECK-NEXT: ret <2 x i64> %2
26   %1 = tail call <2 x i64> @llvm.x86.xop.vpcomleq(<2 x i64> %a, <2 x i64> %b)
27   ret <2 x i64> %1
28 }
29
30 define <2 x i64> @cmp_ule_v2i64(<2 x i64> %a, <2 x i64> %b) {
31 ; CHECK-LABEL: @cmp_ule_v2i64
32 ; CHECK-NEXT: %1 = icmp ule <2 x i64> %a, %b
33 ; CHECK-NEXT: %2 = sext <2 x i1> %1 to <2 x i64>
34 ; CHECK-NEXT: ret <2 x i64> %2
35   %1 = tail call <2 x i64> @llvm.x86.xop.vpcomleuq(<2 x i64> %a, <2 x i64> %b)
36   ret <2 x i64> %1
37 }
38
39 define <4 x i32> @cmp_sgt_v4i32(<4 x i32> %a, <4 x i32> %b) {
40 ; CHECK-LABEL: @cmp_sgt_v4i32
41 ; CHECK-NEXT: %1 = icmp sgt <4 x i32> %a, %b
42 ; CHECK-NEXT: %2 = sext <4 x i1> %1 to <4 x i32>
43 ; CHECK-NEXT: ret <4 x i32> %2
44   %1 = tail call <4 x i32> @llvm.x86.xop.vpcomgtd(<4 x i32> %a, <4 x i32> %b)
45   ret <4 x i32> %1
46 }
47
48 define <4 x i32> @cmp_ugt_v4i32(<4 x i32> %a, <4 x i32> %b) {
49 ; CHECK-LABEL: @cmp_ugt_v4i32
50 ; CHECK-NEXT: %1 = icmp ugt <4 x i32> %a, %b
51 ; CHECK-NEXT: %2 = sext <4 x i1> %1 to <4 x i32>
52 ; CHECK-NEXT: ret <4 x i32> %2
53   %1 = tail call <4 x i32> @llvm.x86.xop.vpcomgtud(<4 x i32> %a, <4 x i32> %b)
54   ret <4 x i32> %1
55 }
56
57 define <4 x i32> @cmp_sge_v4i32(<4 x i32> %a, <4 x i32> %b) {
58 ; CHECK-LABEL: @cmp_sge_v4i32
59 ; CHECK-NEXT: %1 = icmp sge <4 x i32> %a, %b
60 ; CHECK-NEXT: %2 = sext <4 x i1> %1 to <4 x i32>
61 ; CHECK-NEXT: ret <4 x i32> %2
62   %1 = tail call <4 x i32> @llvm.x86.xop.vpcomged(<4 x i32> %a, <4 x i32> %b)
63   ret <4 x i32> %1
64 }
65
66 define <4 x i32> @cmp_uge_v4i32(<4 x i32> %a, <4 x i32> %b) {
67 ; CHECK-LABEL: @cmp_uge_v4i32
68 ; CHECK-NEXT: %1 = icmp uge <4 x i32> %a, %b
69 ; CHECK-NEXT: %2 = sext <4 x i1> %1 to <4 x i32>
70 ; CHECK-NEXT: ret <4 x i32> %2
71   %1 = tail call <4 x i32> @llvm.x86.xop.vpcomgeud(<4 x i32> %a, <4 x i32> %b)
72   ret <4 x i32> %1
73 }
74
75 define <8 x i16> @cmp_seq_v8i16(<8 x i16> %a, <8 x i16> %b) {
76 ; CHECK-LABEL: @cmp_seq_v8i16
77 ; CHECK-NEXT: %1 = icmp eq <8 x i16> %a, %b
78 ; CHECK-NEXT: %2 = sext <8 x i1> %1 to <8 x i16>
79 ; CHECK-NEXT: ret <8 x i16> %2
80   %1 = tail call <8 x i16> @llvm.x86.xop.vpcomeqw(<8 x i16> %a, <8 x i16> %b)
81   ret <8 x i16> %1
82 }
83
84 define <8 x i16> @cmp_ueq_v8i16(<8 x i16> %a, <8 x i16> %b) {
85 ; CHECK-LABEL: @cmp_ueq_v8i16
86 ; CHECK-NEXT: %1 = icmp eq <8 x i16> %a, %b
87 ; CHECK-NEXT: %2 = sext <8 x i1> %1 to <8 x i16>
88 ; CHECK-NEXT: ret <8 x i16> %2
89   %1 = tail call <8 x i16> @llvm.x86.xop.vpcomequw(<8 x i16> %a, <8 x i16> %b)
90   ret <8 x i16> %1
91 }
92
93 define <8 x i16> @cmp_sne_v8i16(<8 x i16> %a, <8 x i16> %b) {
94 ; CHECK-LABEL: @cmp_sne_v8i16
95 ; CHECK-NEXT: %1 = icmp ne <8 x i16> %a, %b
96 ; CHECK-NEXT: %2 = sext <8 x i1> %1 to <8 x i16>
97 ; CHECK-NEXT: ret <8 x i16> %2
98   %1 = tail call <8 x i16> @llvm.x86.xop.vpcomnew(<8 x i16> %a, <8 x i16> %b)
99   ret <8 x i16> %1
100 }
101
102 define <8 x i16> @cmp_une_v8i16(<8 x i16> %a, <8 x i16> %b) {
103 ; CHECK-LABEL: @cmp_une_v8i16
104 ; CHECK-NEXT: %1 = icmp ne <8 x i16> %a, %b
105 ; CHECK-NEXT: %2 = sext <8 x i1> %1 to <8 x i16>
106 ; CHECK-NEXT: ret <8 x i16> %2
107   %1 = tail call <8 x i16> @llvm.x86.xop.vpcomneuw(<8 x i16> %a, <8 x i16> %b)
108   ret <8 x i16> %1
109 }
110
111 define <16 x i8> @cmp_strue_v16i8(<16 x i8> %a, <16 x i8> %b) {
112 ; CHECK-LABEL: @cmp_strue_v16i8
113 ; CHECK-NEXT: ret <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
114   %1 = tail call <16 x i8> @llvm.x86.xop.vpcomtrueb(<16 x i8> %a, <16 x i8> %b)
115   ret <16 x i8> %1
116 }
117
118 define <16 x i8> @cmp_utrue_v16i8(<16 x i8> %a, <16 x i8> %b) {
119 ; CHECK-LABEL: @cmp_utrue_v16i8
120 ; CHECK-NEXT: ret <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
121   %1 = tail call <16 x i8> @llvm.x86.xop.vpcomtrueub(<16 x i8> %a, <16 x i8> %b)
122   ret <16 x i8> %1
123 }
124
125 define <16 x i8> @cmp_sfalse_v16i8(<16 x i8> %a, <16 x i8> %b) {
126 ; CHECK-LABEL: @cmp_sfalse_v16i8
127 ; CHECK-NEXT: ret <16 x i8> zeroinitializer
128   %1 = tail call <16 x i8> @llvm.x86.xop.vpcomfalseb(<16 x i8> %a, <16 x i8> %b)
129   ret <16 x i8> %1
130 }
131
132 define <16 x i8> @cmp_ufalse_v16i8(<16 x i8> %a, <16 x i8> %b) {
133 ; CHECK-LABEL: @cmp_ufalse_v16i8
134 ; CHECK-NEXT: ret <16 x i8> zeroinitializer
135   %1 = tail call <16 x i8> @llvm.x86.xop.vpcomfalseub(<16 x i8> %a, <16 x i8> %b)
136   ret <16 x i8> %1
137 }
138
139 declare <16 x i8> @llvm.x86.xop.vpcomltb(<16 x i8>, <16 x i8>) nounwind readnone
140 declare <8 x i16> @llvm.x86.xop.vpcomltw(<8 x i16>, <8 x i16>) nounwind readnone
141 declare <4 x i32> @llvm.x86.xop.vpcomltd(<4 x i32>, <4 x i32>) nounwind readnone
142 declare <2 x i64> @llvm.x86.xop.vpcomltq(<2 x i64>, <2 x i64>) nounwind readnone
143 declare <16 x i8> @llvm.x86.xop.vpcomltub(<16 x i8>, <16 x i8>) nounwind readnone
144 declare <8 x i16> @llvm.x86.xop.vpcomltuw(<8 x i16>, <8 x i16>) nounwind readnone
145 declare <4 x i32> @llvm.x86.xop.vpcomltud(<4 x i32>, <4 x i32>) nounwind readnone
146 declare <2 x i64> @llvm.x86.xop.vpcomltuq(<2 x i64>, <2 x i64>) nounwind readnone
147
148 declare <16 x i8> @llvm.x86.xop.vpcomleb(<16 x i8>, <16 x i8>) nounwind readnone
149 declare <8 x i16> @llvm.x86.xop.vpcomlew(<8 x i16>, <8 x i16>) nounwind readnone
150 declare <4 x i32> @llvm.x86.xop.vpcomled(<4 x i32>, <4 x i32>) nounwind readnone
151 declare <2 x i64> @llvm.x86.xop.vpcomleq(<2 x i64>, <2 x i64>) nounwind readnone
152 declare <16 x i8> @llvm.x86.xop.vpcomleub(<16 x i8>, <16 x i8>) nounwind readnone
153 declare <8 x i16> @llvm.x86.xop.vpcomleuw(<8 x i16>, <8 x i16>) nounwind readnone
154 declare <4 x i32> @llvm.x86.xop.vpcomleud(<4 x i32>, <4 x i32>) nounwind readnone
155 declare <2 x i64> @llvm.x86.xop.vpcomleuq(<2 x i64>, <2 x i64>) nounwind readnone
156
157 declare <16 x i8> @llvm.x86.xop.vpcomgtb(<16 x i8>, <16 x i8>) nounwind readnone
158 declare <8 x i16> @llvm.x86.xop.vpcomgtw(<8 x i16>, <8 x i16>) nounwind readnone
159 declare <4 x i32> @llvm.x86.xop.vpcomgtd(<4 x i32>, <4 x i32>) nounwind readnone
160 declare <2 x i64> @llvm.x86.xop.vpcomgtq(<2 x i64>, <2 x i64>) nounwind readnone
161 declare <16 x i8> @llvm.x86.xop.vpcomgtub(<16 x i8>, <16 x i8>) nounwind readnone
162 declare <8 x i16> @llvm.x86.xop.vpcomgtuw(<8 x i16>, <8 x i16>) nounwind readnone
163 declare <4 x i32> @llvm.x86.xop.vpcomgtud(<4 x i32>, <4 x i32>) nounwind readnone
164 declare <2 x i64> @llvm.x86.xop.vpcomgtuq(<2 x i64>, <2 x i64>) nounwind readnone
165
166 declare <16 x i8> @llvm.x86.xop.vpcomgeb(<16 x i8>, <16 x i8>) nounwind readnone
167 declare <8 x i16> @llvm.x86.xop.vpcomgew(<8 x i16>, <8 x i16>) nounwind readnone
168 declare <4 x i32> @llvm.x86.xop.vpcomged(<4 x i32>, <4 x i32>) nounwind readnone
169 declare <2 x i64> @llvm.x86.xop.vpcomgeq(<2 x i64>, <2 x i64>) nounwind readnone
170 declare <16 x i8> @llvm.x86.xop.vpcomgeub(<16 x i8>, <16 x i8>) nounwind readnone
171 declare <8 x i16> @llvm.x86.xop.vpcomgeuw(<8 x i16>, <8 x i16>) nounwind readnone
172 declare <4 x i32> @llvm.x86.xop.vpcomgeud(<4 x i32>, <4 x i32>) nounwind readnone
173 declare <2 x i64> @llvm.x86.xop.vpcomgeuq(<2 x i64>, <2 x i64>) nounwind readnone
174
175 declare <16 x i8> @llvm.x86.xop.vpcomeqb(<16 x i8>, <16 x i8>) nounwind readnone
176 declare <8 x i16> @llvm.x86.xop.vpcomeqw(<8 x i16>, <8 x i16>) nounwind readnone
177 declare <4 x i32> @llvm.x86.xop.vpcomeqd(<4 x i32>, <4 x i32>) nounwind readnone
178 declare <2 x i64> @llvm.x86.xop.vpcomeqq(<2 x i64>, <2 x i64>) nounwind readnone
179 declare <16 x i8> @llvm.x86.xop.vpcomequb(<16 x i8>, <16 x i8>) nounwind readnone
180 declare <8 x i16> @llvm.x86.xop.vpcomequw(<8 x i16>, <8 x i16>) nounwind readnone
181 declare <4 x i32> @llvm.x86.xop.vpcomequd(<4 x i32>, <4 x i32>) nounwind readnone
182 declare <2 x i64> @llvm.x86.xop.vpcomequq(<2 x i64>, <2 x i64>) nounwind readnone
183
184 declare <16 x i8> @llvm.x86.xop.vpcomneb(<16 x i8>, <16 x i8>) nounwind readnone
185 declare <8 x i16> @llvm.x86.xop.vpcomnew(<8 x i16>, <8 x i16>) nounwind readnone
186 declare <4 x i32> @llvm.x86.xop.vpcomned(<4 x i32>, <4 x i32>) nounwind readnone
187 declare <2 x i64> @llvm.x86.xop.vpcomneq(<2 x i64>, <2 x i64>) nounwind readnone
188 declare <16 x i8> @llvm.x86.xop.vpcomneub(<16 x i8>, <16 x i8>) nounwind readnone
189 declare <8 x i16> @llvm.x86.xop.vpcomneuw(<8 x i16>, <8 x i16>) nounwind readnone
190 declare <4 x i32> @llvm.x86.xop.vpcomneud(<4 x i32>, <4 x i32>) nounwind readnone
191 declare <2 x i64> @llvm.x86.xop.vpcomneuq(<2 x i64>, <2 x i64>) nounwind readnone
192
193 declare <16 x i8> @llvm.x86.xop.vpcomfalseb(<16 x i8>, <16 x i8>) nounwind readnone
194 declare <8 x i16> @llvm.x86.xop.vpcomfalsew(<8 x i16>, <8 x i16>) nounwind readnone
195 declare <4 x i32> @llvm.x86.xop.vpcomfalsed(<4 x i32>, <4 x i32>) nounwind readnone
196 declare <2 x i64> @llvm.x86.xop.vpcomfalseq(<2 x i64>, <2 x i64>) nounwind readnone
197 declare <16 x i8> @llvm.x86.xop.vpcomfalseub(<16 x i8>, <16 x i8>) nounwind readnone
198 declare <8 x i16> @llvm.x86.xop.vpcomfalseuw(<8 x i16>, <8 x i16>) nounwind readnone
199 declare <4 x i32> @llvm.x86.xop.vpcomfalseud(<4 x i32>, <4 x i32>) nounwind readnone
200 declare <2 x i64> @llvm.x86.xop.vpcomfalseuq(<2 x i64>, <2 x i64>) nounwind readnone
201
202 declare <16 x i8> @llvm.x86.xop.vpcomtrueb(<16 x i8>, <16 x i8>) nounwind readnone
203 declare <4 x i32> @llvm.x86.xop.vpcomtrued(<4 x i32>, <4 x i32>) nounwind readnone
204 declare <2 x i64> @llvm.x86.xop.vpcomtrueq(<2 x i64>, <2 x i64>) nounwind readnone
205 declare <8 x i16> @llvm.x86.xop.vpcomtruew(<8 x i16>, <8 x i16>) nounwind readnone
206 declare <16 x i8> @llvm.x86.xop.vpcomtrueub(<16 x i8>, <16 x i8>) nounwind readnone
207 declare <8 x i16> @llvm.x86.xop.vpcomtrueuw(<8 x i16>, <8 x i16>) nounwind readnone
208 declare <4 x i32> @llvm.x86.xop.vpcomtrueud(<4 x i32>, <4 x i32>) nounwind readnone
209 declare <2 x i64> @llvm.x86.xop.vpcomtrueuq(<2 x i64>, <2 x i64>) nounwind readnone