blob: 63d8e805433598f4a707e03917a2718b401d9d39 [file] [log] [blame]
Simon Pilgrimff88a0d2015-09-06 16:38:17 +00001// REQUIRES: x86-registered-target
Eric Christophercd875ef2015-10-14 05:40:21 +00002// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin -target-feature +sse4.1 -emit-llvm -o - -Werror | FileCheck %s
3// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin -target-feature +sse4.1 -fno-signed-char -emit-llvm -o - -Werror | FileCheck %s
4// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin -target-feature +sse4.1 -S -o - -Werror | FileCheck %s --check-prefix=CHECK-ASM
5// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin -target-feature +sse4.1 -fno-signed-char -S -o - -Werror | FileCheck %s --check-prefix=CHECK-ASM
Simon Pilgrimff88a0d2015-09-06 16:38:17 +00006
7// Don't include mm_malloc.h, it's system specific.
8#define __MM_MALLOC_H
9
10#include <x86intrin.h>
11
12__m128i test_blend_epi16(__m128i V1, __m128i V2) {
13 // CHECK-LABEL: test_blend_epi16
14 // CHECK: shufflevector <8 x i16> %{{.*}}, <8 x i16> %{{.*}}, <8 x i32> <i32 0, i32 9, i32 2, i32 11, i32 4, i32 13, i32 6, i32 7>
15 // CHECK-ASM: pblendw $42, %xmm{{.*}}, %xmm{{.*}}
16 return _mm_blend_epi16(V1, V2, 42);
17}
18
19__m128d test_blend_pd(__m128d V1, __m128d V2) {
20 // CHECK-LABEL: test_blend_pd
21 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> <i32 0, i32 3>
22 // CHECK-ASM: blendpd $2, %xmm{{.*}}, %xmm{{.*}}
23 return _mm_blend_pd(V1, V2, 2);
24}
25
26__m128 test_blend_ps(__m128 V1, __m128 V2) {
27 // CHECK-LABEL: test_blend_ps
28 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x i32> <i32 0, i32 5, i32 6, i32 3>
29 // CHECK-ASM: blendps $6, %xmm{{.*}}, %xmm{{.*}}
30 return _mm_blend_ps(V1, V2, 6);
31}
32
33__m128i test_blendv_epi8(__m128i V1, __m128i V2, __m128i V3) {
34 // CHECK-LABEL: test_blendv_epi8
35 // CHECK: call <16 x i8> @llvm.x86.sse41.pblendvb
36 // CHECK-ASM: pblendvb %xmm{{.*}}, %xmm{{.*}}
37 return _mm_blendv_epi8(V1, V2, V3);
38}
39
40__m128d test_blendv_pd(__m128d V1, __m128d V2, __m128d V3) {
41 // CHECK-LABEL: test_blendv_pd
42 // CHECK: call <2 x double> @llvm.x86.sse41.blendvpd
43 // CHECK-ASM: blendvpd %xmm{{.*}}, %xmm{{.*}}
44 return _mm_blendv_pd(V1, V2, V3);
45}
46
47__m128 test_blendv_ps(__m128 V1, __m128 V2, __m128 V3) {
48 // CHECK-LABEL: test_blendv_ps
49 // CHECK: call <4 x float> @llvm.x86.sse41.blendvps
50 // CHECK-ASM: blendvps %xmm{{.*}}, %xmm{{.*}}
51 return _mm_blendv_ps(V1, V2, V3);
52}
53
54__m128d test_mm_ceil_pd(__m128d x) {
55 // CHECK-LABEL: test_mm_ceil_pd
56 // CHECK: call <2 x double> @llvm.x86.sse41.round.pd
57 // CHECK-ASM: roundpd $2, %xmm{{.*}}, %xmm{{.*}}
58 return _mm_ceil_pd(x);
59}
60
61__m128 test_mm_ceil_ps(__m128 x) {
62 // CHECK-LABEL: test_mm_ceil_ps
63 // CHECK: call <4 x float> @llvm.x86.sse41.round.ps
64 // CHECK-ASM: roundps $2, %xmm{{.*}}, %xmm{{.*}}
65 return _mm_ceil_ps(x);
66}
67
68__m128d test_mm_ceil_sd(__m128d x, __m128d y) {
69 // CHECK-LABEL: test_mm_ceil_sd
70 // CHECK: call <2 x double> @llvm.x86.sse41.round.sd
71 // CHECK-ASM: roundsd $2, %xmm{{.*}}, %xmm{{.*}}
72 return _mm_ceil_sd(x, y);
73}
74
75__m128 test_mm_ceil_ss(__m128 x, __m128 y) {
76 // CHECK-LABEL: test_mm_ceil_ss
77 // CHECK: call <4 x float> @llvm.x86.sse41.round.ss
78 // CHECK-ASM: roundss $2, %xmm{{.*}}, %xmm{{.*}}
79 return _mm_ceil_ss(x, y);
80}
81
82__m128i test_mm_cmpeq_epi64(__m128i A, __m128i B) {
83 // CHECK-LABEL: test_mm_cmpeq_epi64
84 // CHECK: icmp eq <2 x i64>
85 // CHECK-ASM: pcmpeqq %xmm{{.*}}, %xmm{{.*}}
86 return _mm_cmpeq_epi64(A, B);
87}
88
89__m128i test_mm_cvtepi8_epi16(__m128i a) {
90 // CHECK-LABEL: test_mm_cvtepi8_epi16
Simon Pilgrim12919f72015-09-19 15:12:38 +000091 // CHECK: sext <8 x i8> {{.*}} to <8 x i16>
Simon Pilgrimff88a0d2015-09-06 16:38:17 +000092 // CHECK-ASM: pmovsxbw %xmm{{.*}}, %xmm{{.*}}
93 return _mm_cvtepi8_epi16(a);
94}
95
96__m128i test_mm_cvtepi8_epi32(__m128i a) {
97 // CHECK-LABEL: test_mm_cvtepi8_epi32
Simon Pilgrim12919f72015-09-19 15:12:38 +000098 // CHECK: sext <4 x i8> {{.*}} to <4 x i32>
Simon Pilgrimff88a0d2015-09-06 16:38:17 +000099 // CHECK-ASM: pmovsxbd %xmm{{.*}}, %xmm{{.*}}
100 return _mm_cvtepi8_epi32(a);
101}
102
103__m128i test_mm_cvtepi8_epi64(__m128i a) {
104 // CHECK-LABEL: test_mm_cvtepi8_epi64
Simon Pilgrim12919f72015-09-19 15:12:38 +0000105 // CHECK: sext <2 x i8> {{.*}} to <2 x i64>
Simon Pilgrimff88a0d2015-09-06 16:38:17 +0000106 // CHECK-ASM: pmovsxbq %xmm{{.*}}, %xmm{{.*}}
107 return _mm_cvtepi8_epi64(a);
108}
109
110__m128i test_mm_cvtepi16_epi32(__m128i a) {
111 // CHECK-LABEL: test_mm_cvtepi16_epi32
Simon Pilgrim12919f72015-09-19 15:12:38 +0000112 // CHECK: sext <4 x i16> {{.*}} to <4 x i32>
Simon Pilgrimff88a0d2015-09-06 16:38:17 +0000113 // CHECK-ASM: pmovsxwd %xmm{{.*}}, %xmm{{.*}}
114 return _mm_cvtepi16_epi32(a);
115}
116
117__m128i test_mm_cvtepi16_epi64(__m128i a) {
118 // CHECK-LABEL: test_mm_cvtepi16_epi64
Simon Pilgrim12919f72015-09-19 15:12:38 +0000119 // CHECK: sext <2 x i16> {{.*}} to <2 x i64>
Simon Pilgrimff88a0d2015-09-06 16:38:17 +0000120 // CHECK-ASM: pmovsxwq %xmm{{.*}}, %xmm{{.*}}
121 return _mm_cvtepi16_epi64(a);
122}
123
124__m128i test_mm_cvtepi32_epi64(__m128i a) {
125 // CHECK-LABEL: test_mm_cvtepi32_epi64
Simon Pilgrim12919f72015-09-19 15:12:38 +0000126 // CHECK: sext <2 x i32> {{.*}} to <2 x i64>
Simon Pilgrimff88a0d2015-09-06 16:38:17 +0000127 // CHECK-ASM: pmovsxdq %xmm{{.*}}, %xmm{{.*}}
128 return _mm_cvtepi32_epi64(a);
129}
130
131__m128i test_mm_cvtepu8_epi16(__m128i a) {
132 // CHECK-LABEL: test_mm_cvtepu8_epi16
133 // CHECK: call <8 x i16> @llvm.x86.sse41.pmovzxbw(<16 x i8> {{.*}})
134 // CHECK-ASM: pmovzxbw %xmm{{.*}}, %xmm{{.*}}
135 return _mm_cvtepu8_epi16(a);
136}
137
138__m128i test_mm_cvtepu8_epi32(__m128i a) {
139 // CHECK-LABEL: test_mm_cvtepu8_epi32
140 // CHECK: call <4 x i32> @llvm.x86.sse41.pmovzxbd(<16 x i8> {{.*}})
141 // CHECK-ASM: pmovzxbd %xmm{{.*}}, %xmm{{.*}}
142 return _mm_cvtepu8_epi32(a);
143}
144
145__m128i test_mm_cvtepu8_epi64(__m128i a) {
146 // CHECK-LABEL: test_mm_cvtepu8_epi64
147 // CHECK: call <2 x i64> @llvm.x86.sse41.pmovzxbq(<16 x i8> {{.*}})
148 // CHECK-ASM: pmovzxbq %xmm{{.*}}, %xmm{{.*}}
149 return _mm_cvtepu8_epi64(a);
150}
151
152__m128i test_mm_cvtepu16_epi32(__m128i a) {
153 // CHECK-LABEL: test_mm_cvtepu16_epi32
154 // CHECK: call <4 x i32> @llvm.x86.sse41.pmovzxwd(<8 x i16> {{.*}})
155 // CHECK-ASM: pmovzxwd %xmm{{.*}}, %xmm{{.*}}
156 return _mm_cvtepu16_epi32(a);
157}
158
159__m128i test_mm_cvtepu16_epi64(__m128i a) {
160 // CHECK-LABEL: test_mm_cvtepu16_epi64
161 // CHECK: call <2 x i64> @llvm.x86.sse41.pmovzxwq(<8 x i16> {{.*}})
162 // CHECK-ASM: pmovzxwq %xmm{{.*}}, %xmm{{.*}}
163 return _mm_cvtepu16_epi64(a);
164}
165
166__m128i test_mm_cvtepu32_epi64(__m128i a) {
167 // CHECK-LABEL: test_mm_cvtepu32_epi64
168 // CHECK: call <2 x i64> @llvm.x86.sse41.pmovzxdq(<4 x i32> {{.*}})
169 // CHECK-ASM: pmovzxdq %xmm{{.*}}, %xmm{{.*}}
170 return _mm_cvtepu32_epi64(a);
171}
172
173__m128d test_mm_dp_pd(__m128d x, __m128d y) {
174 // CHECK-LABEL: test_mm_dp_pd
175 // CHECK: call <2 x double> @llvm.x86.sse41.dppd
176 // CHECK-ASM: dppd $2, %xmm{{.*}}, %xmm{{.*}}
177 return _mm_dp_pd(x, y, 2);
178}
179
180__m128 test_mm_dp_ps(__m128 x, __m128 y) {
181 // CHECK-LABEL: test_mm_dp_ps
182 // CHECK: call <4 x float> @llvm.x86.sse41.dpps
183 // CHECK-ASM: dpps $2, %xmm{{.*}}, %xmm{{.*}}
184 return _mm_dp_ps(x, y, 2);
185}
186
187int test_extract_epi8(__m128i x) {
188 // CHECK-LABEL: test_extract_epi8
189 // CHECK: extractelement <16 x i8> %{{.*}}, i32 0
190 // CHECK-ASM: pextrb
191 return _mm_extract_epi8(x, 16);
192}
193
194int test_extract_epi32(__m128i x) {
195 // CHECK-LABEL: test_extract_epi32
196 // CHECK: extractelement <4 x i32> %{{.*}}, i32 1
197 // CHECK-ASM: pextrd
198 return _mm_extract_epi32(x, 1);
199}
200
201long long test_extract_epi64(__m128i x) {
202 // CHECK-LABEL: test_extract_epi64
203 // CHECK: extractelement <2 x i64> %{{.*}}, i32 1
204 // CHECK-ASM: pextrq
205 return _mm_extract_epi64(x, 1);
206}
207
208//TODO
209//int test_extract_ps(__m128i x) {
210// return _mm_extract_ps(_mm_add_ps(x,x), 1);
211//}
212
213__m128d test_mm_floor_pd(__m128d x) {
214 // CHECK-LABEL: test_mm_floor_pd
215 // CHECK: call <2 x double> @llvm.x86.sse41.round.pd
216 // CHECK-ASM: roundpd $1, %xmm{{.*}}, %xmm{{.*}}
217 return _mm_floor_pd(x);
218}
219
220__m128 test_mm_floor_ps(__m128 x) {
221 // CHECK-LABEL: test_mm_floor_ps
222 // CHECK: call <4 x float> @llvm.x86.sse41.round.ps
223 // CHECK-ASM: roundps $1, %xmm{{.*}}, %xmm{{.*}}
224 return _mm_floor_ps(x);
225}
226
227__m128d test_mm_floor_sd(__m128d x, __m128d y) {
228 // CHECK-LABEL: test_mm_floor_sd
229 // CHECK: call <2 x double> @llvm.x86.sse41.round.sd
230 // CHECK-ASM: roundsd $1, %xmm{{.*}}, %xmm{{.*}}
231 return _mm_floor_sd(x, y);
232}
233
234__m128 test_mm_floor_ss(__m128 x, __m128 y) {
235 // CHECK-LABEL: test_mm_floor_ss
236 // CHECK: call <4 x float> @llvm.x86.sse41.round.ss
237 // CHECK-ASM: roundss $1, %xmm{{.*}}, %xmm{{.*}}
238 return _mm_floor_ss(x, y);
239}
240
241__m128i test_insert_epi8(__m128i x, char b) {
242 // CHECK-LABEL: test_insert_epi8
243 // CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, i32 0
244 // CHECK-ASM: pinsrb
245 return _mm_insert_epi8(x, b, 16);
246}
247
248__m128i test_insert_epi32(__m128i x, int b) {
249 // CHECK-LABEL: test_insert_epi32
250 // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 0
251 // CHECK-ASM: pinsrd
252 return _mm_insert_epi32(x, b, 4);
253}
254
255__m128i test_insert_epi64(__m128i x, long long b) {
256 // CHECK-LABEL: test_insert_epi64
257 // CHECK: insertelement <2 x i64> %{{.*}}, i64 %{{.*}}, i32 0
258 // CHECK-ASM: pinsrq
259 return _mm_insert_epi64(x, b, 2);
260}
261
262__m128 test_insert_ps(__m128 x, __m128 y) {
263 // CHECK-LABEL: test_insert_ps
264 // CHECK: call <4 x float> @llvm.x86.sse41.insertps
265 // CHECK-ASM: insertps $5, %xmm{{.*}}, %xmm{{.*}}
266 return _mm_insert_ps(x, y, 5);
267}
268
269__m128i test_mm_max_epi8(__m128i x, __m128i y) {
270 // CHECK-LABEL: test_mm_max_epi8
271 // CHECK: call <16 x i8> @llvm.x86.sse41.pmaxsb
272 // CHECK-ASM: pmaxsb %xmm{{.*}}, %xmm{{.*}}
273 return _mm_max_epi8(x, y);
274}
275
276__m128i test_mm_max_epu16(__m128i x, __m128i y) {
277 // CHECK-LABEL: test_mm_max_epu16
278 // CHECK: call <8 x i16> @llvm.x86.sse41.pmaxuw
279 // CHECK-ASM: pmaxuw %xmm{{.*}}, %xmm{{.*}}
280 return _mm_max_epu16(x, y);
281}
282
283__m128i test_mm_max_epi32(__m128i x, __m128i y) {
284 // CHECK-LABEL: test_mm_max_epi32
285 // CHECK: call <4 x i32> @llvm.x86.sse41.pmaxsd
286 // CHECK-ASM: pmaxsd %xmm{{.*}}, %xmm{{.*}}
287 return _mm_max_epi32(x, y);
288}
289
290__m128i test_mm_max_epu32(__m128i x, __m128i y) {
291 // CHECK-LABEL: test_mm_max_epu32
292 // CHECK: call <4 x i32> @llvm.x86.sse41.pmaxud
293 // CHECK-ASM: pmaxud %xmm{{.*}}, %xmm{{.*}}
294 return _mm_max_epu32(x, y);
295}
296
297__m128i test_mm_min_epi8(__m128i x, __m128i y) {
298 // CHECK-LABEL: test_mm_min_epi8
299 // CHECK: call <16 x i8> @llvm.x86.sse41.pminsb
300 // CHECK-ASM: pminsb %xmm{{.*}}, %xmm{{.*}}
301 return _mm_min_epi8(x, y);
302}
303
304__m128i test_mm_min_epu16(__m128i x, __m128i y) {
305 // CHECK-LABEL: test_mm_min_epu16
306 // CHECK: call <8 x i16> @llvm.x86.sse41.pminuw
307 // CHECK-ASM: pminuw %xmm{{.*}}, %xmm{{.*}}
308 return _mm_min_epu16(x, y);
309}
310
311__m128i test_mm_min_epi32(__m128i x, __m128i y) {
312 // CHECK-LABEL: test_mm_min_epi32
313 // CHECK: call <4 x i32> @llvm.x86.sse41.pminsd
314 // CHECK-ASM: pminsd %xmm{{.*}}, %xmm{{.*}}
315 return _mm_min_epi32(x, y);
316}
317
318__m128i test_mm_min_epu32(__m128i x, __m128i y) {
319 // CHECK-LABEL: test_mm_min_epu32
320 // CHECK: call <4 x i32> @llvm.x86.sse41.pminud
321 // CHECK-ASM: pminud %xmm{{.*}}, %xmm{{.*}}
322 return _mm_min_epu32(x, y);
323}
324
325__m128i test_mm_minpos_epu16(__m128i x) {
326 // CHECK-LABEL: test_mm_minpos_epu16
327 // CHECK: call <8 x i16> @llvm.x86.sse41.phminposuw
328 // CHECK-ASM: phminposuw %xmm{{.*}}, %xmm{{.*}}
329 return _mm_minpos_epu16(x);
330}
331
332__m128i test_mm_mpsadbw_epu8(__m128i x, __m128i y) {
333 // CHECK-LABEL: test_mm_mpsadbw_epu8
334 // CHECK: call <8 x i16> @llvm.x86.sse41.mpsadbw
335 // CHECK-ASM: mpsadbw $1, %xmm{{.*}}, %xmm{{.*}}
336 return _mm_mpsadbw_epu8(x, y, 1);
337}
338
339__m128i test_mm_mul_epi32(__m128i x, __m128i y) {
340 // CHECK-LABEL: test_mm_mul_epi32
341 // CHECK: call <2 x i64> @llvm.x86.sse41.pmuldq
342 // CHECK-ASM: pmuldq %xmm{{.*}}, %xmm{{.*}}
343 return _mm_mul_epi32(x, y);
344}
345
346__m128i test_mm_mullo_epi32(__m128i x, __m128i y) {
347 // CHECK-LABEL: test_mm_mullo_epi32
348 // CHECK: mul <4 x i32>
349 // CHECK-ASM: pmulld %xmm{{.*}}, %xmm{{.*}}
350 return _mm_mullo_epi32(x, y);
351}
352
353__m128i test_mm_packus_epi32(__m128i x, __m128i y) {
354 // CHECK-LABEL: test_mm_packus_epi32
355 // CHECK: call <8 x i16> @llvm.x86.sse41.packusdw
356 // CHECK-ASM: packusdw %xmm{{.*}}, %xmm{{.*}}
357 return _mm_packus_epi32(x, y);
358}
359
360__m128d test_mm_round_pd(__m128d x) {
361 // CHECK-LABEL: test_mm_round_pd
362 // CHECK: call <2 x double> @llvm.x86.sse41.round.pd
363 // CHECK-ASM: roundpd $2, %xmm{{.*}}, %xmm{{.*}}
364 return _mm_round_pd(x, 2);
365}
366
367__m128 test_mm_round_ps(__m128 x) {
368 // CHECK-LABEL: test_mm_round_ps
369 // CHECK: call <4 x float> @llvm.x86.sse41.round.ps
370 // CHECK-ASM: roundps $2, %xmm{{.*}}, %xmm{{.*}}
371 return _mm_round_ps(x, 2);
372}
373
374__m128d test_mm_round_sd(__m128d x, __m128d y) {
375 // CHECK-LABEL: test_mm_round_sd
376 // CHECK: call <2 x double> @llvm.x86.sse41.round.sd
377 // CHECK-ASM: roundsd $2, %xmm{{.*}}, %xmm{{.*}}
378 return _mm_round_sd(x, y, 2);
379}
380
381__m128 test_mm_round_ss(__m128 x, __m128 y) {
382 // CHECK-LABEL: test_mm_round_ss
383 // CHECK: call <4 x float> @llvm.x86.sse41.round.ss
384 // CHECK-ASM: roundss $2, %xmm{{.*}}, %xmm{{.*}}
385 return _mm_round_ss(x, y, 2);
386}
387
Ahmed Bougacha7dfaaf32015-10-02 23:29:26 +0000388__m128i test_mm_stream_load_si128(__m128i const *a) {
Simon Pilgrimff88a0d2015-09-06 16:38:17 +0000389 // CHECK-LABEL: test_mm_stream_load_si128
390 // CHECK: call <2 x i64> @llvm.x86.sse41.movntdqa
391 // CHECK-ASM: movntdqa
392 return _mm_stream_load_si128(a);
393}
394
395int test_mm_test_all_ones(__m128i x) {
396 // CHECK-LABEL: test_mm_test_all_ones
397 // CHECK: call i32 @llvm.x86.sse41.ptestc
398 // CHECK-ASM: ptest %xmm{{.*}}, %xmm{{.*}}
399 return _mm_test_all_ones(x);
400}
401
402int test_mm_test_all_zeros(__m128i x, __m128i y) {
403 // CHECK-LABEL: test_mm_test_all_zeros
404 // CHECK: call i32 @llvm.x86.sse41.ptestz
405 // CHECK-ASM: ptest %xmm{{.*}}, %xmm{{.*}}
406 return _mm_test_all_zeros(x, y);
407}
408
409int test_mm_test_mix_ones_zeros(__m128i x, __m128i y) {
410 // CHECK-LABEL: test_mm_test_mix_ones_zeros
411 // CHECK: call i32 @llvm.x86.sse41.ptestnzc
412 // CHECK-ASM: ptest %xmm{{.*}}, %xmm{{.*}}
413 return _mm_test_mix_ones_zeros(x, y);
414}
415
416int test_mm_testc_si128(__m128i x, __m128i y) {
417 // CHECK-LABEL: test_mm_testc_si128
418 // CHECK: call i32 @llvm.x86.sse41.ptestc
419 // CHECK-ASM: ptest %xmm{{.*}}, %xmm{{.*}}
420 return _mm_testc_si128(x, y);
421}
422
423int test_mm_testnzc_si128(__m128i x, __m128i y) {
424 // CHECK-LABEL: test_mm_testnzc_si128
425 // CHECK: call i32 @llvm.x86.sse41.ptestnzc
426 // CHECK-ASM: ptest %xmm{{.*}}, %xmm{{.*}}
427 return _mm_testnzc_si128(x, y);
428}
429
430int test_mm_testz_si128(__m128i x, __m128i y) {
431 // CHECK-LABEL: test_mm_testz_si128
432 // CHECK: call i32 @llvm.x86.sse41.ptestz
433 // CHECK-ASM: ptest %xmm{{.*}}, %xmm{{.*}}
434 return _mm_testz_si128(x, y);
435}