95324997868066427726a6472663b3645f1942f6
[oota-llvm.git] / test / CodeGen / X86 / vec_compare.ll
1 ; RUN: llc < %s -march=x86 -mcpu=yonah -mtriple=i386-apple-darwin | FileCheck %s
2
3
4 define <4 x i32> @test1(<4 x i32> %A, <4 x i32> %B) nounwind {
5 ; CHECK: test1:
6 ; CHECK: pcmpgtd
7 ; CHECK: ret
8
9         %C = icmp sgt <4 x i32> %A, %B
10         %D = sext <4 x i1> %C to <4 x i32>
11         ret <4 x i32> %D
12 }
13
14 define <4 x i32> @test2(<4 x i32> %A, <4 x i32> %B) nounwind {
15 ; CHECK: test2:
16 ; CHECK: pcmp
17 ; CHECK: pcmp
18 ; CHECK: pxor
19 ; CHECK: ret
20         %C = icmp sge <4 x i32> %A, %B
21         %D = sext <4 x i1> %C to <4 x i32>
22         ret <4 x i32> %D
23 }
24
25 define <4 x i32> @test3(<4 x i32> %A, <4 x i32> %B) nounwind {
26 ; CHECK: test3:
27 ; CHECK: pcmpgtd
28 ; CHECK: movdqa
29 ; CHECK: ret
30         %C = icmp slt <4 x i32> %A, %B
31         %D = sext <4 x i1> %C to <4 x i32>
32         ret <4 x i32> %D
33 }
34
35 define <4 x i32> @test4(<4 x i32> %A, <4 x i32> %B) nounwind {
36 ; CHECK: test4:
37 ; CHECK: movdqa
38 ; CHECK: pcmpgtd
39 ; CHECK: ret
40         %C = icmp ugt <4 x i32> %A, %B
41         %D = sext <4 x i1> %C to <4 x i32>
42         ret <4 x i32> %D
43 }
44
45 define <2 x i64> @test5(<2 x i64> %A, <2 x i64> %B) nounwind {
46 ; CHECK: test5:
47 ; CHECK: pcmpeqd
48 ; CHECK: pshufd $-79
49 ; CHECK: pand
50 ; CHECK: ret
51         %C = icmp eq <2 x i64> %A, %B
52         %D = sext <2 x i1> %C to <2 x i64>
53         ret <2 x i64> %D
54 }
55
56 define <2 x i64> @test6(<2 x i64> %A, <2 x i64> %B) nounwind {
57 ; CHECK: test6:
58 ; CHECK: pcmpeqd
59 ; CHECK: pshufd $-79
60 ; CHECK: pand
61 ; CHECK: pcmpeqd
62 ; CHECK: pxor
63 ; CHECK: ret
64         %C = icmp ne <2 x i64> %A, %B
65         %D = sext <2 x i1> %C to <2 x i64>
66         ret <2 x i64> %D
67 }
68
69 define <2 x i64> @test7(<2 x i64> %A, <2 x i64> %B) nounwind {
70 ; CHECK: test7:
71 ; CHECK: pcmpgtd %xmm1
72 ; CHECK: pshufd $-96
73 ; CHECK: pcmpeqd
74 ; CHECK: pshufd $-11
75 ; CHECK: pand
76 ; CHECK: pshufd $-11
77 ; CHECK: por
78 ; CHECK: ret
79         %C = icmp sgt <2 x i64> %A, %B
80         %D = sext <2 x i1> %C to <2 x i64>
81         ret <2 x i64> %D
82 }
83
84 define <2 x i64> @test8(<2 x i64> %A, <2 x i64> %B) nounwind {
85 ; CHECK: test8:
86 ; CHECK: pcmpgtd %xmm0
87 ; CHECK: pshufd $-96
88 ; CHECK: pcmpeqd
89 ; CHECK: pshufd $-11
90 ; CHECK: pand
91 ; CHECK: pshufd $-11
92 ; CHECK: por
93 ; CHECK: ret
94         %C = icmp slt <2 x i64> %A, %B
95         %D = sext <2 x i1> %C to <2 x i64>
96         ret <2 x i64> %D
97 }
98
99 define <2 x i64> @test9(<2 x i64> %A, <2 x i64> %B) nounwind {
100 ; CHECK: test9:
101 ; CHECK: pcmpgtd %xmm0
102 ; CHECK: pshufd $-96
103 ; CHECK: pcmpeqd
104 ; CHECK: pshufd $-11
105 ; CHECK: pand
106 ; CHECK: pshufd $-11
107 ; CHECK: por
108 ; CHECK: pcmpeqd
109 ; CHECK: pxor
110 ; CHECK: ret
111         %C = icmp sge <2 x i64> %A, %B
112         %D = sext <2 x i1> %C to <2 x i64>
113         ret <2 x i64> %D
114 }
115
116 define <2 x i64> @test10(<2 x i64> %A, <2 x i64> %B) nounwind {
117 ; CHECK: test10:
118 ; CHECK: pcmpgtd %xmm1
119 ; CHECK: pshufd $-96
120 ; CHECK: pcmpeqd
121 ; CHECK: pshufd $-11
122 ; CHECK: pand
123 ; CHECK: pshufd $-11
124 ; CHECK: por
125 ; CHECK: pcmpeqd
126 ; CHECK: pxor
127 ; CHECK: ret
128         %C = icmp sle <2 x i64> %A, %B
129         %D = sext <2 x i1> %C to <2 x i64>
130         ret <2 x i64> %D
131 }
132
133 define <2 x i64> @test11(<2 x i64> %A, <2 x i64> %B) nounwind {
134 ; CHECK: [[CONSTSEG:[A-Z0-9_]*]]:
135 ; CHECK:      .long     2147483648
136 ; CHECK-NEXT: .long     2147483648
137 ; CHECK-NEXT: .long     2147483648
138 ; CHECK-NEXT: .long     2147483648
139 ; CHECK: test11:
140 ; CHECK: movdqa [[CONSTSEG]], [[CONSTREG:%xmm[0-9]*]]
141 ; CHECK: pxor [[CONSTREG]]
142 ; CHECK: pxor [[CONSTREG]]
143 ; CHECK: pcmpgtd %xmm1
144 ; CHECK: pshufd $-96
145 ; CHECK: pcmpeqd
146 ; CHECK: pshufd $-11
147 ; CHECK: pand
148 ; CHECK: pshufd $-11
149 ; CHECK: por
150 ; CHECK: ret
151         %C = icmp ugt <2 x i64> %A, %B
152         %D = sext <2 x i1> %C to <2 x i64>
153         ret <2 x i64> %D
154 }
155
156 define <2 x i64> @test12(<2 x i64> %A, <2 x i64> %B) nounwind {
157 ; CHECK: test12:
158 ; CHECK: pxor
159 ; CHECK: pxor
160 ; CHECK: pcmpgtd %xmm0
161 ; CHECK: pshufd $-96
162 ; CHECK: pcmpeqd
163 ; CHECK: pshufd $-11
164 ; CHECK: pand
165 ; CHECK: pshufd $-11
166 ; CHECK: por
167 ; CHECK: ret
168         %C = icmp ult <2 x i64> %A, %B
169         %D = sext <2 x i1> %C to <2 x i64>
170         ret <2 x i64> %D
171 }
172
173 define <2 x i64> @test13(<2 x i64> %A, <2 x i64> %B) nounwind {
174 ; CHECK: test13:
175 ; CHECK: pxor
176 ; CHECK: pxor
177 ; CHECK: pcmpgtd %xmm0
178 ; CHECK: pshufd $-96
179 ; CHECK: pcmpeqd
180 ; CHECK: pshufd $-11
181 ; CHECK: pand
182 ; CHECK: pshufd $-11
183 ; CHECK: por
184 ; CHECK: pcmpeqd
185 ; CHECK: pxor
186 ; CHECK: ret
187         %C = icmp uge <2 x i64> %A, %B
188         %D = sext <2 x i1> %C to <2 x i64>
189         ret <2 x i64> %D
190 }
191
192 define <2 x i64> @test14(<2 x i64> %A, <2 x i64> %B) nounwind {
193 ; CHECK: test14:
194 ; CHECK: pxor
195 ; CHECK: pxor
196 ; CHECK: pcmpgtd %xmm1
197 ; CHECK: pshufd $-96
198 ; CHECK: pcmpeqd
199 ; CHECK: pshufd $-11
200 ; CHECK: pand
201 ; CHECK: pshufd $-11
202 ; CHECK: por
203 ; CHECK: pcmpeqd
204 ; CHECK: pxor
205 ; CHECK: ret
206         %C = icmp ule <2 x i64> %A, %B
207         %D = sext <2 x i1> %C to <2 x i64>
208         ret <2 x i64> %D
209 }