1 // RUN: %clang_cc1 %s -O0 -triple=x86_64-apple-darwin -target-feature +avx512f -emit-llvm -o - -Werror | FileCheck %s
2 
3 // Don't include mm_malloc.h, it's system specific.
4 #define __MM_MALLOC_H
5 
6 #include <immintrin.h>
7 
8 __m512d test_mm512_sqrt_pd(__m512d a)
9 {
10   // CHECK-LABEL: @test_mm512_sqrt_pd
11   // CHECK: @llvm.x86.avx512.sqrt.pd.512
12   return _mm512_sqrt_pd(a);
13 }
14 
15 __m512 test_mm512_sqrt_ps(__m512 a)
16 {
17   // CHECK-LABEL: @test_mm512_sqrt_ps
18   // CHECK: @llvm.x86.avx512.sqrt.ps.512
19   return _mm512_sqrt_ps(a);
20 }
21 
22 __m512d test_mm512_rsqrt14_pd(__m512d a)
23 {
24   // CHECK-LABEL: @test_mm512_rsqrt14_pd
25   // CHECK: @llvm.x86.avx512.rsqrt14.pd.512
26   return _mm512_rsqrt14_pd(a);
27 }
28 
29 __m512 test_mm512_rsqrt14_ps(__m512 a)
30 {
31   // CHECK-LABEL: @test_mm512_rsqrt14_ps
32   // CHECK: @llvm.x86.avx512.rsqrt14.ps.512
33   return _mm512_rsqrt14_ps(a);
34 }
35 
36 __m512 test_mm512_add_ps(__m512 a, __m512 b)
37 {
38   // CHECK-LABEL: @test_mm512_add_ps
39   // CHECK: fadd <16 x float>
40   return _mm512_add_ps(a, b);
41 }
42 
43 __m512d test_mm512_add_pd(__m512d a, __m512d b)
44 {
45   // CHECK-LABEL: @test_mm512_add_pd
46   // CHECK: fadd <8 x double>
47   return _mm512_add_pd(a, b);
48 }
49 
50 __m512 test_mm512_mul_ps(__m512 a, __m512 b)
51 {
52   // CHECK-LABEL: @test_mm512_mul_ps
53   // CHECK: fmul <16 x float>
54   return _mm512_mul_ps(a, b);
55 }
56 
57 __m512d test_mm512_mul_pd(__m512d a, __m512d b)
58 {
59   // CHECK-LABEL: @test_mm512_mul_pd
60   // CHECK: fmul <8 x double>
61   return _mm512_mul_pd(a, b);
62 }
63 
64 void test_mm512_storeu_ps(void *p, __m512 a)
65 {
66   // CHECK-LABEL: @test_mm512_storeu_ps
67   // CHECK: @llvm.x86.avx512.mask.storeu.ps.512
68   _mm512_storeu_ps(p, a);
69 }
70 
71 void test_mm512_storeu_pd(void *p, __m512d a)
72 {
73   // CHECK-LABEL: @test_mm512_storeu_pd
74   // CHECK: @llvm.x86.avx512.mask.storeu.pd.512
75   _mm512_storeu_pd(p, a);
76 }
77 
78 void test_mm512_store_ps(void *p, __m512 a)
79 {
80   // CHECK-LABEL: @test_mm512_store_ps
81   // CHECK: store <16 x float>
82   _mm512_store_ps(p, a);
83 }
84 
85 void test_mm512_store_pd(void *p, __m512d a)
86 {
87   // CHECK-LABEL: @test_mm512_store_pd
88   // CHECK: store <8 x double>
89   _mm512_store_pd(p, a);
90 }
91 
92 __m512 test_mm512_loadu_ps(void *p)
93 {
94   // CHECK-LABEL: @test_mm512_loadu_ps
95   // CHECK: load <16 x float>* {{.*}}, align 1{{$}}
96   return _mm512_loadu_ps(p);
97 }
98 
99 __m512d test_mm512_loadu_pd(void *p)
100 {
101   // CHECK-LABEL: @test_mm512_loadu_pd
102   // CHECK: load <8 x double>* {{.*}}, align 1{{$}}
103   return _mm512_loadu_pd(p);
104 }
105 
106 __m512d test_mm512_set1_pd(double d)
107 {
108   // CHECK-LABEL: @test_mm512_set1_pd
109   // CHECK: insertelement <8 x double> {{.*}}, i32 0
110   // CHECK: insertelement <8 x double> {{.*}}, i32 1
111   // CHECK: insertelement <8 x double> {{.*}}, i32 2
112   // CHECK: insertelement <8 x double> {{.*}}, i32 3
113   // CHECK: insertelement <8 x double> {{.*}}, i32 4
114   // CHECK: insertelement <8 x double> {{.*}}, i32 5
115   // CHECK: insertelement <8 x double> {{.*}}, i32 6
116   // CHECK: insertelement <8 x double> {{.*}}, i32 7
117   return _mm512_set1_pd(d);
118 }
119 
120 __m512d test_mm512_castpd256_pd512(__m256d a)
121 {
122   // CHECK-LABEL: @test_mm512_castpd256_pd512
123   // CHECK: shufflevector <4 x double> {{.*}} <i32 0, i32 1, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef>
124   return _mm512_castpd256_pd512(a);
125 }
126 
127 __mmask16 test_mm512_knot(__mmask16 a)
128 {
129   // CHECK-LABEL: @test_mm512_knot
130   // CHECK: @llvm.x86.avx512.knot.w
131   return _mm512_knot(a);
132 }
133 
134 __m512i test_mm512_valign_epi64(__m512i a, __m512i b)
135 {
136   // CHECK-LABEL: @test_mm512_valign_epi64
137   // CHECK: @llvm.x86.avx512.mask.valign.q.512
138   return _mm512_valign_epi64(a, b, 2);
139 }
140 
141 __m512d test_mm512_broadcastsd_pd(__m128d a)
142 {
143   // CHECK-LABEL: @test_mm512_broadcastsd_pd
144   // CHECK: insertelement <8 x double> {{.*}}, i32 0
145   // CHECK: insertelement <8 x double> {{.*}}, i32 1
146   // CHECK: insertelement <8 x double> {{.*}}, i32 2
147   // CHECK: insertelement <8 x double> {{.*}}, i32 3
148   // CHECK: insertelement <8 x double> {{.*}}, i32 4
149   // CHECK: insertelement <8 x double> {{.*}}, i32 5
150   // CHECK: insertelement <8 x double> {{.*}}, i32 6
151   // CHECK: insertelement <8 x double> {{.*}}, i32 7
152   return _mm512_broadcastsd_pd(a);
153 }
154 
155 __m512i test_mm512_fmadd_pd(__m512d a, __m512d b, __m512d c)
156 {
157   // CHECK-LABEL: @test_mm512_fmadd_pd
158   // CHECK: @llvm.x86.fma.mask.vfmadd.pd.512
159   return _mm512_fmadd_pd(a, b, c);
160 }
161 
162 __mmask16 test_mm512_cmpeq_epi32_mask(__m512i __a, __m512i __b) {
163   // CHECK-LABEL: @test_mm512_cmpeq_epi32_mask
164   // CHECK: @llvm.x86.avx512.mask.pcmpeq.d.512
165   return (__mmask16)_mm512_cmpeq_epi32_mask(__a, __b);
166 }
167 
168 __mmask16 test_mm512_mask_cmpeq_epi32_mask(__mmask16 __u, __m512i __a, __m512i __b) {
169   // CHECK-LABEL: @test_mm512_mask_cmpeq_epi32_mask
170   // CHECK: @llvm.x86.avx512.mask.pcmpeq.d.512
171   return (__mmask16)_mm512_mask_cmpeq_epi32_mask(__u, __a, __b);
172 }
173 
174 __mmask8 test_mm512_mask_cmpeq_epi64_mask(__mmask8 __u, __m512i __a, __m512i __b) {
175   // CHECK-LABEL: @test_mm512_mask_cmpeq_epi64_mask
176   // CHECK: @llvm.x86.avx512.mask.pcmpeq.q.512
177   return (__mmask8)_mm512_mask_cmpeq_epi64_mask(__u, __a, __b);
178 }
179 
180 __mmask8 test_mm512_cmpeq_epi64_mask(__m512i __a, __m512i __b) {
181   // CHECK-LABEL: @test_mm512_cmpeq_epi64_mask
182   // CHECK: @llvm.x86.avx512.mask.pcmpeq.q.512
183   return (__mmask8)_mm512_cmpeq_epi64_mask(__a, __b);
184 }
185 
186 __m512d test_mm512_unpackhi_pd(__m512d a, __m512d b)
187 {
188   // CHECK-LABEL: @test_mm512_unpackhi_pd
189   // CHECK: shufflevector <8 x double> {{.*}} <i32 1, i32 9, i32 3, i32 11, i32 5, i32 13, i32 7, i32 15>
190   return _mm512_unpackhi_pd(a, b);
191 }
192 
193 __m512d test_mm512_unpacklo_pd(__m512d a, __m512d b)
194 {
195   // CHECK-LABEL: @test_mm512_unpacklo_pd
196   // CHECK: shufflevector <8 x double> {{.*}} <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14>
197   return _mm512_unpacklo_pd(a, b);
198 }
199 
200 __m512d test_mm512_unpackhi_ps(__m512d a, __m512d b)
201 {
202   // CHECK-LABEL: @test_mm512_unpackhi_ps
203   // CHECK: shufflevector <16 x float> {{.*}} <i32 2, i32 18, i32 3, i32 19, i32 6, i32 22, i32 7, i32 23, i32 10, i32 26, i32 11, i32 27, i32 14, i32 30, i32 15, i32 31>
204   return _mm512_unpackhi_ps(a, b);
205 }
206 
207 __m512d test_mm512_unpacklo_ps(__m512d a, __m512d b)
208 {
209   // CHECK-LABEL: @test_mm512_unpacklo_ps
210   // CHECK: shufflevector <16 x float> {{.*}} <i32 0, i32 16, i32 1, i32 17, i32 4, i32 20, i32 5, i32 21, i32 8, i32 24, i32 9, i32 25, i32 12, i32 28, i32 13, i32 29>
211   return _mm512_unpacklo_ps(a, b);
212 }
213