Merging r261039:
[oota-llvm.git] / test / CodeGen / X86 / sse-intrinsics-x86.ll
1 ; RUN: llc < %s -mtriple=i386-apple-darwin -mattr=-avx,+sse | FileCheck %s
2 ; RUN: llc < %s -mtriple=i386-apple-darwin -mcpu=knl | FileCheck %s
3
4 define <4 x float> @test_x86_sse_add_ss(<4 x float> %a0, <4 x float> %a1) {
5   ; CHECK: addss
6   %res = call <4 x float> @llvm.x86.sse.add.ss(<4 x float> %a0, <4 x float> %a1) ; <<4 x float>> [#uses=1]
7   ret <4 x float> %res
8 }
9 declare <4 x float> @llvm.x86.sse.add.ss(<4 x float>, <4 x float>) nounwind readnone
10
11
12 define <4 x float> @test_x86_sse_cmp_ps(<4 x float> %a0, <4 x float> %a1) {
13   ; CHECK: cmpordps
14   %res = call <4 x float> @llvm.x86.sse.cmp.ps(<4 x float> %a0, <4 x float> %a1, i8 7) ; <<4 x float>> [#uses=1]
15   ret <4 x float> %res
16 }
17 declare <4 x float> @llvm.x86.sse.cmp.ps(<4 x float>, <4 x float>, i8) nounwind readnone
18
19
20 define <4 x float> @test_x86_sse_cmp_ss(<4 x float> %a0, <4 x float> %a1) {
21   ; CHECK: cmpordss
22   %res = call <4 x float> @llvm.x86.sse.cmp.ss(<4 x float> %a0, <4 x float> %a1, i8 7) ; <<4 x float>> [#uses=1]
23   ret <4 x float> %res
24 }
25 declare <4 x float> @llvm.x86.sse.cmp.ss(<4 x float>, <4 x float>, i8) nounwind readnone
26
27
28 define i32 @test_x86_sse_comieq_ss(<4 x float> %a0, <4 x float> %a1) {
29   ; CHECK: comiss
30   ; CHECK: sete
31   ; CHECK: movzbl
32   %res = call i32 @llvm.x86.sse.comieq.ss(<4 x float> %a0, <4 x float> %a1) ; <i32> [#uses=1]
33   ret i32 %res
34 }
35 declare i32 @llvm.x86.sse.comieq.ss(<4 x float>, <4 x float>) nounwind readnone
36
37
38 define i32 @test_x86_sse_comige_ss(<4 x float> %a0, <4 x float> %a1) {
39   ; CHECK: comiss
40   ; CHECK: setae
41   ; CHECK: movzbl
42   %res = call i32 @llvm.x86.sse.comige.ss(<4 x float> %a0, <4 x float> %a1) ; <i32> [#uses=1]
43   ret i32 %res
44 }
45 declare i32 @llvm.x86.sse.comige.ss(<4 x float>, <4 x float>) nounwind readnone
46
47
48 define i32 @test_x86_sse_comigt_ss(<4 x float> %a0, <4 x float> %a1) {
49   ; CHECK: comiss
50   ; CHECK: seta
51   ; CHECK: movzbl
52   %res = call i32 @llvm.x86.sse.comigt.ss(<4 x float> %a0, <4 x float> %a1) ; <i32> [#uses=1]
53   ret i32 %res
54 }
55 declare i32 @llvm.x86.sse.comigt.ss(<4 x float>, <4 x float>) nounwind readnone
56
57
58 define i32 @test_x86_sse_comile_ss(<4 x float> %a0, <4 x float> %a1) {
59   ; CHECK: comiss
60   ; CHECK: setbe
61   ; CHECK: movzbl
62   %res = call i32 @llvm.x86.sse.comile.ss(<4 x float> %a0, <4 x float> %a1) ; <i32> [#uses=1]
63   ret i32 %res
64 }
65 declare i32 @llvm.x86.sse.comile.ss(<4 x float>, <4 x float>) nounwind readnone
66
67
68 define i32 @test_x86_sse_comilt_ss(<4 x float> %a0, <4 x float> %a1) {
69   ; CHECK: comiss
70   ; CHECK: sbb
71   %res = call i32 @llvm.x86.sse.comilt.ss(<4 x float> %a0, <4 x float> %a1) ; <i32> [#uses=1]
72   ret i32 %res
73 }
74 declare i32 @llvm.x86.sse.comilt.ss(<4 x float>, <4 x float>) nounwind readnone
75
76
77 define i32 @test_x86_sse_comineq_ss(<4 x float> %a0, <4 x float> %a1) {
78   ; CHECK: comiss
79   ; CHECK: setne
80   ; CHECK: movzbl
81   %res = call i32 @llvm.x86.sse.comineq.ss(<4 x float> %a0, <4 x float> %a1) ; <i32> [#uses=1]
82   ret i32 %res
83 }
84 declare i32 @llvm.x86.sse.comineq.ss(<4 x float>, <4 x float>) nounwind readnone
85
86
87 define <4 x float> @test_x86_sse_cvtsi2ss(<4 x float> %a0) {
88   ; CHECK: movl
89   ; CHECK: cvtsi2ss
90   %res = call <4 x float> @llvm.x86.sse.cvtsi2ss(<4 x float> %a0, i32 7) ; <<4 x float>> [#uses=1]
91   ret <4 x float> %res
92 }
93 declare <4 x float> @llvm.x86.sse.cvtsi2ss(<4 x float>, i32) nounwind readnone
94
95
96 define i32 @test_x86_sse_cvtss2si(<4 x float> %a0) {
97   ; CHECK: cvtss2si
98   %res = call i32 @llvm.x86.sse.cvtss2si(<4 x float> %a0) ; <i32> [#uses=1]
99   ret i32 %res
100 }
101 declare i32 @llvm.x86.sse.cvtss2si(<4 x float>) nounwind readnone
102
103
104 define i32 @test_x86_sse_cvttss2si(<4 x float> %a0) {
105   ; CHECK: cvttss2si
106   %res = call i32 @llvm.x86.sse.cvttss2si(<4 x float> %a0) ; <i32> [#uses=1]
107   ret i32 %res
108 }
109 declare i32 @llvm.x86.sse.cvttss2si(<4 x float>) nounwind readnone
110
111
112 define <4 x float> @test_x86_sse_div_ss(<4 x float> %a0, <4 x float> %a1) {
113   ; CHECK: divss
114   %res = call <4 x float> @llvm.x86.sse.div.ss(<4 x float> %a0, <4 x float> %a1) ; <<4 x float>> [#uses=1]
115   ret <4 x float> %res
116 }
117 declare <4 x float> @llvm.x86.sse.div.ss(<4 x float>, <4 x float>) nounwind readnone
118
119
120 define void @test_x86_sse_ldmxcsr(i8* %a0) {
121   ; CHECK: movl
122   ; CHECK: ldmxcsr
123   call void @llvm.x86.sse.ldmxcsr(i8* %a0)
124   ret void
125 }
126 declare void @llvm.x86.sse.ldmxcsr(i8*) nounwind
127
128
129
130 define <4 x float> @test_x86_sse_max_ps(<4 x float> %a0, <4 x float> %a1) {
131   ; CHECK: maxps
132   %res = call <4 x float> @llvm.x86.sse.max.ps(<4 x float> %a0, <4 x float> %a1) ; <<4 x float>> [#uses=1]
133   ret <4 x float> %res
134 }
135 declare <4 x float> @llvm.x86.sse.max.ps(<4 x float>, <4 x float>) nounwind readnone
136
137
138 define <4 x float> @test_x86_sse_max_ss(<4 x float> %a0, <4 x float> %a1) {
139   ; CHECK: maxss
140   %res = call <4 x float> @llvm.x86.sse.max.ss(<4 x float> %a0, <4 x float> %a1) ; <<4 x float>> [#uses=1]
141   ret <4 x float> %res
142 }
143 declare <4 x float> @llvm.x86.sse.max.ss(<4 x float>, <4 x float>) nounwind readnone
144
145
146 define <4 x float> @test_x86_sse_min_ps(<4 x float> %a0, <4 x float> %a1) {
147   ; CHECK: minps
148   %res = call <4 x float> @llvm.x86.sse.min.ps(<4 x float> %a0, <4 x float> %a1) ; <<4 x float>> [#uses=1]
149   ret <4 x float> %res
150 }
151 declare <4 x float> @llvm.x86.sse.min.ps(<4 x float>, <4 x float>) nounwind readnone
152
153
154 define <4 x float> @test_x86_sse_min_ss(<4 x float> %a0, <4 x float> %a1) {
155   ; CHECK: minss
156   %res = call <4 x float> @llvm.x86.sse.min.ss(<4 x float> %a0, <4 x float> %a1) ; <<4 x float>> [#uses=1]
157   ret <4 x float> %res
158 }
159 declare <4 x float> @llvm.x86.sse.min.ss(<4 x float>, <4 x float>) nounwind readnone
160
161
162 define i32 @test_x86_sse_movmsk_ps(<4 x float> %a0) {
163   ; CHECK: movmskps
164   %res = call i32 @llvm.x86.sse.movmsk.ps(<4 x float> %a0) ; <i32> [#uses=1]
165   ret i32 %res
166 }
167 declare i32 @llvm.x86.sse.movmsk.ps(<4 x float>) nounwind readnone
168
169
170
171 define <4 x float> @test_x86_sse_mul_ss(<4 x float> %a0, <4 x float> %a1) {
172   ; CHECK: mulss
173   %res = call <4 x float> @llvm.x86.sse.mul.ss(<4 x float> %a0, <4 x float> %a1) ; <<4 x float>> [#uses=1]
174   ret <4 x float> %res
175 }
176 declare <4 x float> @llvm.x86.sse.mul.ss(<4 x float>, <4 x float>) nounwind readnone
177
178
179 define <4 x float> @test_x86_sse_rcp_ps(<4 x float> %a0) {
180   ; CHECK: rcpps
181   %res = call <4 x float> @llvm.x86.sse.rcp.ps(<4 x float> %a0) ; <<4 x float>> [#uses=1]
182   ret <4 x float> %res
183 }
184 declare <4 x float> @llvm.x86.sse.rcp.ps(<4 x float>) nounwind readnone
185
186
187 define <4 x float> @test_x86_sse_rcp_ss(<4 x float> %a0) {
188   ; CHECK: rcpss
189   %res = call <4 x float> @llvm.x86.sse.rcp.ss(<4 x float> %a0) ; <<4 x float>> [#uses=1]
190   ret <4 x float> %res
191 }
192 declare <4 x float> @llvm.x86.sse.rcp.ss(<4 x float>) nounwind readnone
193
194
195 define <4 x float> @test_x86_sse_rsqrt_ps(<4 x float> %a0) {
196   ; CHECK: rsqrtps
197   %res = call <4 x float> @llvm.x86.sse.rsqrt.ps(<4 x float> %a0) ; <<4 x float>> [#uses=1]
198   ret <4 x float> %res
199 }
200 declare <4 x float> @llvm.x86.sse.rsqrt.ps(<4 x float>) nounwind readnone
201
202
203 define <4 x float> @test_x86_sse_rsqrt_ss(<4 x float> %a0) {
204   ; CHECK: rsqrtss
205   %res = call <4 x float> @llvm.x86.sse.rsqrt.ss(<4 x float> %a0) ; <<4 x float>> [#uses=1]
206   ret <4 x float> %res
207 }
208 declare <4 x float> @llvm.x86.sse.rsqrt.ss(<4 x float>) nounwind readnone
209
210
211 define <4 x float> @test_x86_sse_sqrt_ps(<4 x float> %a0) {
212   ; CHECK: sqrtps
213   %res = call <4 x float> @llvm.x86.sse.sqrt.ps(<4 x float> %a0) ; <<4 x float>> [#uses=1]
214   ret <4 x float> %res
215 }
216 declare <4 x float> @llvm.x86.sse.sqrt.ps(<4 x float>) nounwind readnone
217
218
219 define <4 x float> @test_x86_sse_sqrt_ss(<4 x float> %a0) {
220   ; CHECK: sqrtss
221   %res = call <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float> %a0) ; <<4 x float>> [#uses=1]
222   ret <4 x float> %res
223 }
224 declare <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float>) nounwind readnone
225
226
227 define void @test_x86_sse_stmxcsr(i8* %a0) {
228   ; CHECK: movl
229   ; CHECK: stmxcsr
230   call void @llvm.x86.sse.stmxcsr(i8* %a0)
231   ret void
232 }
233 declare void @llvm.x86.sse.stmxcsr(i8*) nounwind
234
235
236 define void @test_x86_sse_storeu_ps(i8* %a0, <4 x float> %a1) {
237   ; CHECK: movl
238   ; CHECK: movups
239   call void @llvm.x86.sse.storeu.ps(i8* %a0, <4 x float> %a1)
240   ret void
241 }
242 declare void @llvm.x86.sse.storeu.ps(i8*, <4 x float>) nounwind
243
244
245 define <4 x float> @test_x86_sse_sub_ss(<4 x float> %a0, <4 x float> %a1) {
246   ; CHECK: subss
247   %res = call <4 x float> @llvm.x86.sse.sub.ss(<4 x float> %a0, <4 x float> %a1) ; <<4 x float>> [#uses=1]
248   ret <4 x float> %res
249 }
250 declare <4 x float> @llvm.x86.sse.sub.ss(<4 x float>, <4 x float>) nounwind readnone
251
252
253 define i32 @test_x86_sse_ucomieq_ss(<4 x float> %a0, <4 x float> %a1) {
254   ; CHECK: ucomiss
255   ; CHECK: sete
256   ; CHECK: movzbl
257   %res = call i32 @llvm.x86.sse.ucomieq.ss(<4 x float> %a0, <4 x float> %a1) ; <i32> [#uses=1]
258   ret i32 %res
259 }
260 declare i32 @llvm.x86.sse.ucomieq.ss(<4 x float>, <4 x float>) nounwind readnone
261
262
263 define i32 @test_x86_sse_ucomige_ss(<4 x float> %a0, <4 x float> %a1) {
264   ; CHECK: ucomiss
265   ; CHECK: setae
266   ; CHECK: movzbl
267   %res = call i32 @llvm.x86.sse.ucomige.ss(<4 x float> %a0, <4 x float> %a1) ; <i32> [#uses=1]
268   ret i32 %res
269 }
270 declare i32 @llvm.x86.sse.ucomige.ss(<4 x float>, <4 x float>) nounwind readnone
271
272
273 define i32 @test_x86_sse_ucomigt_ss(<4 x float> %a0, <4 x float> %a1) {
274   ; CHECK: ucomiss
275   ; CHECK: seta
276   ; CHECK: movzbl
277   %res = call i32 @llvm.x86.sse.ucomigt.ss(<4 x float> %a0, <4 x float> %a1) ; <i32> [#uses=1]
278   ret i32 %res
279 }
280 declare i32 @llvm.x86.sse.ucomigt.ss(<4 x float>, <4 x float>) nounwind readnone
281
282
283 define i32 @test_x86_sse_ucomile_ss(<4 x float> %a0, <4 x float> %a1) {
284   ; CHECK: ucomiss
285   ; CHECK: setbe
286   ; CHECK: movzbl
287   %res = call i32 @llvm.x86.sse.ucomile.ss(<4 x float> %a0, <4 x float> %a1) ; <i32> [#uses=1]
288   ret i32 %res
289 }
290 declare i32 @llvm.x86.sse.ucomile.ss(<4 x float>, <4 x float>) nounwind readnone
291
292
293 define i32 @test_x86_sse_ucomilt_ss(<4 x float> %a0, <4 x float> %a1) {
294   ; CHECK: ucomiss
295   ; CHECK: sbbl
296   %res = call i32 @llvm.x86.sse.ucomilt.ss(<4 x float> %a0, <4 x float> %a1) ; <i32> [#uses=1]
297   ret i32 %res
298 }
299 declare i32 @llvm.x86.sse.ucomilt.ss(<4 x float>, <4 x float>) nounwind readnone
300
301
302 define i32 @test_x86_sse_ucomineq_ss(<4 x float> %a0, <4 x float> %a1) {
303   ; CHECK: ucomiss
304   ; CHECK: setne
305   ; CHECK: movzbl
306   %res = call i32 @llvm.x86.sse.ucomineq.ss(<4 x float> %a0, <4 x float> %a1) ; <i32> [#uses=1]
307   ret i32 %res
308 }
309 declare i32 @llvm.x86.sse.ucomineq.ss(<4 x float>, <4 x float>) nounwind readnone