1*67e74705SXin Li // REQUIRES: x86-registered-target
2*67e74705SXin Li // RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -S -o -
3*67e74705SXin Li #define __MM_MALLOC_H
4*67e74705SXin Li
5*67e74705SXin Li #include <x86intrin.h>
6*67e74705SXin Li
7*67e74705SXin Li // No warnings.
8*67e74705SXin Li extern __m256i a;
bar(__m256i a)9*67e74705SXin Li int __attribute__((target("avx"))) bar(__m256i a) {
10*67e74705SXin Li return _mm256_extract_epi32(a, 3);
11*67e74705SXin Li }
12*67e74705SXin Li
baz()13*67e74705SXin Li int baz() {
14*67e74705SXin Li return bar(a);
15*67e74705SXin Li }
16*67e74705SXin Li
qq_avx(__m256i a)17*67e74705SXin Li int __attribute__((target("avx"))) qq_avx(__m256i a) {
18*67e74705SXin Li return _mm256_extract_epi32(a, 3);
19*67e74705SXin Li }
20*67e74705SXin Li
qq_noavx()21*67e74705SXin Li int qq_noavx() {
22*67e74705SXin Li return 0;
23*67e74705SXin Li }
24*67e74705SXin Li
25*67e74705SXin Li extern __m256i a;
qq()26*67e74705SXin Li int qq() {
27*67e74705SXin Li if (__builtin_cpu_supports("avx"))
28*67e74705SXin Li return qq_avx(a);
29*67e74705SXin Li else
30*67e74705SXin Li return qq_noavx();
31*67e74705SXin Li }
32*67e74705SXin Li
33*67e74705SXin Li // Test that fma and fma4 are both separately and combined valid for an fma intrinsic.
fma_1(__m128 a,__m128 b,__m128 c)34*67e74705SXin Li __m128 __attribute__((target("fma"))) fma_1(__m128 a, __m128 b, __m128 c) {
35*67e74705SXin Li return __builtin_ia32_vfmaddps(a, b, c);
36*67e74705SXin Li }
37*67e74705SXin Li
fma_2(__m128 a,__m128 b,__m128 c)38*67e74705SXin Li __m128 __attribute__((target("fma4"))) fma_2(__m128 a, __m128 b, __m128 c) {
39*67e74705SXin Li return __builtin_ia32_vfmaddps(a, b, c);
40*67e74705SXin Li }
41*67e74705SXin Li
fma_3(__m128 a,__m128 b,__m128 c)42*67e74705SXin Li __m128 __attribute__((target("fma,fma4"))) fma_3(__m128 a, __m128 b, __m128 c) {
43*67e74705SXin Li return __builtin_ia32_vfmaddps(a, b, c);
44*67e74705SXin Li }
45*67e74705SXin Li
verifyfeaturestrings()46*67e74705SXin Li void verifyfeaturestrings() {
47*67e74705SXin Li (void)__builtin_cpu_supports("cmov");
48*67e74705SXin Li (void)__builtin_cpu_supports("mmx");
49*67e74705SXin Li (void)__builtin_cpu_supports("popcnt");
50*67e74705SXin Li (void)__builtin_cpu_supports("sse");
51*67e74705SXin Li (void)__builtin_cpu_supports("sse2");
52*67e74705SXin Li (void)__builtin_cpu_supports("sse3");
53*67e74705SXin Li (void)__builtin_cpu_supports("ssse3");
54*67e74705SXin Li (void)__builtin_cpu_supports("sse4.1");
55*67e74705SXin Li (void)__builtin_cpu_supports("sse4.2");
56*67e74705SXin Li (void)__builtin_cpu_supports("avx");
57*67e74705SXin Li (void)__builtin_cpu_supports("avx2");
58*67e74705SXin Li (void)__builtin_cpu_supports("sse4a");
59*67e74705SXin Li (void)__builtin_cpu_supports("fma4");
60*67e74705SXin Li (void)__builtin_cpu_supports("xop");
61*67e74705SXin Li (void)__builtin_cpu_supports("fma");
62*67e74705SXin Li (void)__builtin_cpu_supports("avx512f");
63*67e74705SXin Li (void)__builtin_cpu_supports("bmi");
64*67e74705SXin Li (void)__builtin_cpu_supports("bmi2");
65*67e74705SXin Li (void)__builtin_cpu_supports("aes");
66*67e74705SXin Li (void)__builtin_cpu_supports("pclmul");
67*67e74705SXin Li (void)__builtin_cpu_supports("avx512vl");
68*67e74705SXin Li (void)__builtin_cpu_supports("avx512bw");
69*67e74705SXin Li (void)__builtin_cpu_supports("avx512dq");
70*67e74705SXin Li (void)__builtin_cpu_supports("avx512cd");
71*67e74705SXin Li (void)__builtin_cpu_supports("avx512er");
72*67e74705SXin Li (void)__builtin_cpu_supports("avx512pf");
73*67e74705SXin Li (void)__builtin_cpu_supports("avx512vbmi");
74*67e74705SXin Li (void)__builtin_cpu_supports("avx512ifma");
75*67e74705SXin Li }
76