1 // RUN: %clang_cc1 -ffreestanding %s -O0 -triple=x86_64-apple-darwin -target-cpu skylake-avx512 -emit-llvm -o - -Wall -Werror | FileCheck %s
2
3 #include <immintrin.h>
4
test_mm512_reduce_add_epi64(__m512i __W)5 long long test_mm512_reduce_add_epi64(__m512i __W){
6 // CHECK-LABEL: @test_mm512_reduce_add_epi64(
7 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
8 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
9 // CHECK: add <4 x i64> %{{.*}}, %{{.*}}
10 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 0, i32 1>
11 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 2, i32 3>
12 // CHECK: add <2 x i64> %{{.*}}, %{{.*}}
13 // CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> <i32 1, i32 0>
14 // CHECK: add <2 x i64> %{{.*}}, %{{.*}}
15 // CHECK: extractelement <2 x i64> %{{.*}}, i32 0
16 return _mm512_reduce_add_epi64(__W);
17 }
18
test_mm512_reduce_mul_epi64(__m512i __W)19 long long test_mm512_reduce_mul_epi64(__m512i __W){
20 // CHECK-LABEL: @test_mm512_reduce_mul_epi64(
21 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
22 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
23 // CHECK: mul <4 x i64> %{{.*}}, %{{.*}}
24 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 0, i32 1>
25 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 2, i32 3>
26 // CHECK: mul <2 x i64> %{{.*}}, %{{.*}}
27 // CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> <i32 1, i32 0>
28 // CHECK: mul <2 x i64> %{{.*}}, %{{.*}}
29 // CHECK: extractelement <2 x i64> %{{.*}}, i32 0
30 return _mm512_reduce_mul_epi64(__W);
31 }
32
test_mm512_reduce_or_epi64(__m512i __W)33 long long test_mm512_reduce_or_epi64(__m512i __W){
34 // CHECK-LABEL: @test_mm512_reduce_or_epi64(
35 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
36 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
37 // CHECK: or <4 x i64> %{{.*}}, %{{.*}}
38 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 0, i32 1>
39 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 2, i32 3>
40 // CHECK: or <2 x i64> %{{.*}}, %{{.*}}
41 // CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> <i32 1, i32 0>
42 // CHECK: or <2 x i64> %{{.*}}, %{{.*}}
43 // CHECK: extractelement <2 x i64> %{{.*}}, i32 0
44 return _mm512_reduce_or_epi64(__W);
45 }
46
test_mm512_reduce_and_epi64(__m512i __W)47 long long test_mm512_reduce_and_epi64(__m512i __W){
48 // CHECK-LABEL: @test_mm512_reduce_and_epi64(
49 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
50 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
51 // CHECK: and <4 x i64> %{{.*}}, %{{.*}}
52 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 0, i32 1>
53 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 2, i32 3>
54 // CHECK: and <2 x i64> %{{.*}}, %{{.*}}
55 // CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> <i32 1, i32 0>
56 // CHECK: and <2 x i64> %{{.*}}, %{{.*}}
57 // CHECK: extractelement <2 x i64> %{{.*}}, i32 0
58 return _mm512_reduce_and_epi64(__W);
59 }
60
test_mm512_mask_reduce_add_epi64(__mmask8 __M,__m512i __W)61 long long test_mm512_mask_reduce_add_epi64(__mmask8 __M, __m512i __W){
62 // CHECK-LABEL: @test_mm512_mask_reduce_add_epi64(
63 // CHECK: bitcast i8 %{{.*}} to <8 x i1>
64 // CHECK: select <8 x i1> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> %{{.*}}
65 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
66 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
67 // CHECK: add <4 x i64> %{{.*}}, %{{.*}}
68 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 0, i32 1>
69 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 2, i32 3>
70 // CHECK: add <2 x i64> %{{.*}}, %{{.*}}
71 // CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> <i32 1, i32 0>
72 // CHECK: add <2 x i64> %{{.*}}, %{{.*}}
73 // CHECK: extractelement <2 x i64> %{{.*}}, i32 0
74 return _mm512_mask_reduce_add_epi64(__M, __W);
75 }
76
test_mm512_mask_reduce_mul_epi64(__mmask8 __M,__m512i __W)77 long long test_mm512_mask_reduce_mul_epi64(__mmask8 __M, __m512i __W){
78 // CHECK-LABEL: @test_mm512_mask_reduce_mul_epi64(
79 // CHECK: bitcast i8 %{{.*}} to <8 x i1>
80 // CHECK: select <8 x i1> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> %{{.*}}
81 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
82 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
83 // CHECK: mul <4 x i64> %{{.*}}, %{{.*}}
84 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 0, i32 1>
85 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 2, i32 3>
86 // CHECK: mul <2 x i64> %{{.*}}, %{{.*}}
87 // CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> <i32 1, i32 0>
88 // CHECK: mul <2 x i64> %{{.*}}, %{{.*}}
89 // CHECK: extractelement <2 x i64> %{{.*}}, i32 0
90 return _mm512_mask_reduce_mul_epi64(__M, __W);
91 }
92
test_mm512_mask_reduce_and_epi64(__mmask8 __M,__m512i __W)93 long long test_mm512_mask_reduce_and_epi64(__mmask8 __M, __m512i __W){
94 // CHECK-LABEL: @test_mm512_mask_reduce_and_epi64(
95 // CHECK: bitcast i8 %{{.*}} to <8 x i1>
96 // CHECK: select <8 x i1> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> %{{.*}}
97 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
98 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
99 // CHECK: and <4 x i64> %{{.*}}, %{{.*}}
100 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 0, i32 1>
101 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 2, i32 3>
102 // CHECK: and <2 x i64> %{{.*}}, %{{.*}}
103 // CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> <i32 1, i32 0>
104 // CHECK: and <2 x i64> %{{.*}}, %{{.*}}
105 // CHECK: extractelement <2 x i64> %{{.*}}, i32 0
106 return _mm512_mask_reduce_and_epi64(__M, __W);
107 }
108
test_mm512_mask_reduce_or_epi64(__mmask8 __M,__m512i __W)109 long long test_mm512_mask_reduce_or_epi64(__mmask8 __M, __m512i __W){
110 // CHECK-LABEL: @test_mm512_mask_reduce_or_epi64(
111 // CHECK: bitcast i8 %{{.*}} to <8 x i1>
112 // CHECK: select <8 x i1> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> %{{.*}}
113 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
114 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
115 // CHECK: or <4 x i64> %{{.*}}, %{{.*}}
116 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 0, i32 1>
117 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 2, i32 3>
118 // CHECK: or <2 x i64> %{{.*}}, %{{.*}}
119 // CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> <i32 1, i32 0>
120 // CHECK: or <2 x i64> %{{.*}}, %{{.*}}
121 // CHECK: extractelement <2 x i64> %{{.*}}, i32 0
122 return _mm512_mask_reduce_or_epi64(__M, __W);
123 }
124
test_mm512_reduce_add_epi32(__m512i __W)125 int test_mm512_reduce_add_epi32(__m512i __W){
126 // CHECK-LABEL: @test_mm512_reduce_add_epi32(
127 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
128 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
129 // CHECK: add <8 x i32> %{{.*}}, %{{.*}}
130 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 0, i32 1>
131 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 2, i32 3>
132 // CHECK: add <4 x i32> %{{.*}}, %{{.*}}
133 // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> <i32 2, i32 3, i32 0, i32 1>
134 // CHECK: add <4 x i32> %{{.*}}, %{{.*}}
135 // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
136 // CHECK: add <4 x i32> %{{.*}}, %{{.*}}
137 // CHECK: extractelement <4 x i32> %{{.*}}, i32 0
138 return _mm512_reduce_add_epi32(__W);
139 }
140
test_mm512_reduce_mul_epi32(__m512i __W)141 int test_mm512_reduce_mul_epi32(__m512i __W){
142 // CHECK-LABEL: @test_mm512_reduce_mul_epi32(
143 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
144 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
145 // CHECK: mul <8 x i32> %{{.*}}, %{{.*}}
146 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 0, i32 1>
147 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 2, i32 3>
148 // CHECK: mul <4 x i32> %{{.*}}, %{{.*}}
149 // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> <i32 2, i32 3, i32 0, i32 1>
150 // CHECK: mul <4 x i32> %{{.*}}, %{{.*}}
151 // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
152 // CHECK: mul <4 x i32> %{{.*}}, %{{.*}}
153 // CHECK: extractelement <4 x i32> %{{.*}}, i32 0
154 return _mm512_reduce_mul_epi32(__W);
155 }
156
test_mm512_reduce_or_epi32(__m512i __W)157 int test_mm512_reduce_or_epi32(__m512i __W){
158 // CHECK-LABEL: @test_mm512_reduce_or_epi32(
159 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
160 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
161 // CHECK: or <8 x i32> %{{.*}}, %{{.*}}
162 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 0, i32 1>
163 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 2, i32 3>
164 // CHECK: or <4 x i32> %{{.*}}, %{{.*}}
165 // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> <i32 2, i32 3, i32 0, i32 1>
166 // CHECK: or <4 x i32> %{{.*}}, %{{.*}}
167 // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
168 // CHECK: or <4 x i32> %{{.*}}, %{{.*}}
169 // CHECK: extractelement <4 x i32> %{{.*}}, i32 0
170 return _mm512_reduce_or_epi32(__W);
171 }
172
test_mm512_reduce_and_epi32(__m512i __W)173 int test_mm512_reduce_and_epi32(__m512i __W){
174 // CHECK-LABEL: @test_mm512_reduce_and_epi32(
175 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
176 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
177 // CHECK: and <8 x i32> %{{.*}}, %{{.*}}
178 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 0, i32 1>
179 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 2, i32 3>
180 // CHECK: and <4 x i32> %{{.*}}, %{{.*}}
181 // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> <i32 2, i32 3, i32 0, i32 1>
182 // CHECK: and <4 x i32> %{{.*}}, %{{.*}}
183 // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
184 // CHECK: and <4 x i32> %{{.*}}, %{{.*}}
185 // CHECK: extractelement <4 x i32> %{{.*}}, i32 0
186 return _mm512_reduce_and_epi32(__W);
187 }
188
test_mm512_mask_reduce_add_epi32(__mmask16 __M,__m512i __W)189 int test_mm512_mask_reduce_add_epi32(__mmask16 __M, __m512i __W){
190 // CHECK-LABEL: @test_mm512_mask_reduce_add_epi32(
191 // CHECK: bitcast i16 %{{.*}} to <16 x i1>
192 // CHECK: select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}}
193 // CHECK: bitcast <16 x i32> %{{.*}} to <8 x i64>
194 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
195 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
196 // CHECK: add <8 x i32> %{{.*}}, %{{.*}}
197 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 0, i32 1>
198 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 2, i32 3>
199 // CHECK: add <4 x i32> %{{.*}}, %{{.*}}
200 // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> <i32 2, i32 3, i32 0, i32 1>
201 // CHECK: add <4 x i32> %{{.*}}, %{{.*}}
202 // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
203 // CHECK: add <4 x i32> %{{.*}}, %{{.*}}
204 // CHECK: extractelement <4 x i32> %{{.*}}, i32 0
205 return _mm512_mask_reduce_add_epi32(__M, __W);
206 }
207
test_mm512_mask_reduce_mul_epi32(__mmask16 __M,__m512i __W)208 int test_mm512_mask_reduce_mul_epi32(__mmask16 __M, __m512i __W){
209 // CHECK-LABEL: @test_mm512_mask_reduce_mul_epi32(
210 // CHECK: bitcast i16 %{{.*}} to <16 x i1>
211 // CHECK: select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}}
212 // CHECK: bitcast <16 x i32> %{{.*}} to <8 x i64>
213 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
214 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
215 // CHECK: mul <8 x i32> %{{.*}}, %{{.*}}
216 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 0, i32 1>
217 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 2, i32 3>
218 // CHECK: mul <4 x i32> %{{.*}}, %{{.*}}
219 // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> <i32 2, i32 3, i32 0, i32 1>
220 // CHECK: mul <4 x i32> %{{.*}}, %{{.*}}
221 // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
222 // CHECK: mul <4 x i32> %{{.*}}, %{{.*}}
223 // CHECK: extractelement <4 x i32> %{{.*}}, i32 0
224 return _mm512_mask_reduce_mul_epi32(__M, __W);
225 }
226
test_mm512_mask_reduce_and_epi32(__mmask16 __M,__m512i __W)227 int test_mm512_mask_reduce_and_epi32(__mmask16 __M, __m512i __W){
228 // CHECK-LABEL: @test_mm512_mask_reduce_and_epi32(
229 // CHECK: bitcast i16 %{{.*}} to <16 x i1>
230 // CHECK: select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}}
231 // CHECK: bitcast <16 x i32> %{{.*}} to <8 x i64>
232 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
233 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
234 // CHECK: and <8 x i32> %{{.*}}, %{{.*}}
235 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 0, i32 1>
236 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 2, i32 3>
237 // CHECK: and <4 x i32> %{{.*}}, %{{.*}}
238 // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> <i32 2, i32 3, i32 0, i32 1>
239 // CHECK: and <4 x i32> %{{.*}}, %{{.*}}
240 // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
241 // CHECK: and <4 x i32> %{{.*}}, %{{.*}}
242 // CHECK: extractelement <4 x i32> %{{.*}}, i32 0
243 return _mm512_mask_reduce_and_epi32(__M, __W);
244 }
245
test_mm512_mask_reduce_or_epi32(__mmask16 __M,__m512i __W)246 int test_mm512_mask_reduce_or_epi32(__mmask16 __M, __m512i __W){
247 // CHECK-LABEL: @test_mm512_mask_reduce_or_epi32(
248 // CHECK: bitcast i16 %{{.*}} to <16 x i1>
249 // CHECK: select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}}
250 // CHECK: bitcast <16 x i32> %{{.*}} to <8 x i64>
251 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
252 // CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
253 // CHECK: or <8 x i32> %{{.*}}, %{{.*}}
254 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 0, i32 1>
255 // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> <i32 2, i32 3>
256 // CHECK: or <4 x i32> %{{.*}}, %{{.*}}
257 // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> <i32 2, i32 3, i32 0, i32 1>
258 // CHECK: or <4 x i32> %{{.*}}, %{{.*}}
259 // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
260 // CHECK: or <4 x i32> %{{.*}}, %{{.*}}
261 // CHECK: extractelement <4 x i32> %{{.*}}, i32 0
262 return _mm512_mask_reduce_or_epi32(__M, __W);
263 }
264
test_mm512_reduce_add_pd(__m512d __W)265 double test_mm512_reduce_add_pd(__m512d __W){
266 // CHECK-LABEL: @test_mm512_reduce_add_pd(
267 // CHECK: shufflevector <8 x double> %{{.*}}, <8 x double> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
268 // CHECK: shufflevector <8 x double> %{{.*}}, <8 x double> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
269 // CHECK: fadd <4 x double> %{{.*}}, %{{.*}}
270 // CHECK: shufflevector <4 x double> %{{.*}}, <4 x double> undef, <2 x i32> <i32 0, i32 1>
271 // CHECK: shufflevector <4 x double> %{{.*}}, <4 x double> undef, <2 x i32> <i32 2, i32 3>
272 // CHECK: fadd <2 x double> %{{.*}}, %{{.*}}
273 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> <i32 1, i32 0>
274 // CHECK: fadd <2 x double> %{{.*}}, %{{.*}}
275 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
276 return _mm512_reduce_add_pd(__W);
277 }
278
test_mm512_reduce_mul_pd(__m512d __W)279 double test_mm512_reduce_mul_pd(__m512d __W){
280 // CHECK-LABEL: @test_mm512_reduce_mul_pd(
281 // CHECK: shufflevector <8 x double> %{{.*}}, <8 x double> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
282 // CHECK: shufflevector <8 x double> %{{.*}}, <8 x double> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
283 // CHECK: fmul <4 x double> %{{.*}}, %{{.*}}
284 // CHECK: shufflevector <4 x double> %{{.*}}, <4 x double> undef, <2 x i32> <i32 0, i32 1>
285 // CHECK: shufflevector <4 x double> %{{.*}}, <4 x double> undef, <2 x i32> <i32 2, i32 3>
286 // CHECK: fmul <2 x double> %{{.*}}, %{{.*}}
287 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> <i32 1, i32 0>
288 // CHECK: fmul <2 x double> %{{.*}}, %{{.*}}
289 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
290 return _mm512_reduce_mul_pd(__W);
291 }
292
test_mm512_reduce_add_ps(__m512 __W)293 float test_mm512_reduce_add_ps(__m512 __W){
294 // CHECK-LABEL: @test_mm512_reduce_add_ps(
295 // CHECK: bitcast <16 x float> %{{.*}} to <8 x double>
296 // CHECK: shufflevector <8 x double> %{{.*}}, <8 x double> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
297 // CHECK: bitcast <4 x double> %{{.*}} to <8 x float>
298 // CHECK: shufflevector <8 x double> %{{.*}}, <8 x double> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
299 // CHECK: bitcast <4 x double> %{{.*}} to <8 x float>
300 // CHECK: fadd <8 x float> %{{.*}}, %{{.*}}
301 // CHECK: shufflevector <8 x float> %{{.*}}, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
302 // CHECK: shufflevector <8 x float> %{{.*}}, <8 x float> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
303 // CHECK: fadd <4 x float> %{{.*}}, %{{.*}}
304 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x i32> <i32 2, i32 3, i32 0, i32 1>
305 // CHECK: fadd <4 x float> %{{.*}}, %{{.*}}
306 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
307 // CHECK: fadd <4 x float> %{{.*}}, %{{.*}}
308 // CHECK: extractelement <4 x float> %{{.*}}, i32 0
309 return _mm512_reduce_add_ps(__W);
310 }
311
test_mm512_reduce_mul_ps(__m512 __W)312 float test_mm512_reduce_mul_ps(__m512 __W){
313 // CHECK-LABEL: @test_mm512_reduce_mul_ps(
314 // CHECK: bitcast <16 x float> %{{.*}} to <8 x double>
315 // CHECK: shufflevector <8 x double> %{{.*}}, <8 x double> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
316 // CHECK: bitcast <4 x double> %{{.*}} to <8 x float>
317 // CHECK: shufflevector <8 x double> %{{.*}}, <8 x double> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
318 // CHECK: bitcast <4 x double> %{{.*}} to <8 x float>
319 // CHECK: fmul <8 x float> %{{.*}}, %{{.*}}
320 // CHECK: shufflevector <8 x float> %{{.*}}, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
321 // CHECK: shufflevector <8 x float> %{{.*}}, <8 x float> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
322 // CHECK: fmul <4 x float> %{{.*}}, %{{.*}}
323 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x i32> <i32 2, i32 3, i32 0, i32 1>
324 // CHECK: fmul <4 x float> %{{.*}}, %{{.*}}
325 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
326 // CHECK: fmul <4 x float> %{{.*}}, %{{.*}}
327 // CHECK: extractelement <4 x float> %{{.*}}, i32 0
328 return _mm512_reduce_mul_ps(__W);
329 }
330
test_mm512_mask_reduce_add_pd(__mmask8 __M,__m512d __W)331 double test_mm512_mask_reduce_add_pd(__mmask8 __M, __m512d __W){
332 // CHECK-LABEL: @test_mm512_mask_reduce_add_pd(
333 // CHECK: bitcast i8 %{{.*}} to <8 x i1>
334 // CHECK: select <8 x i1> %{{.*}}, <8 x double> %{{.*}}, <8 x double> %{{.*}}
335 // CHECK: shufflevector <8 x double> %{{.*}}, <8 x double> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
336 // CHECK: shufflevector <8 x double> %{{.*}}, <8 x double> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
337 // CHECK: fadd <4 x double> %{{.*}}, %{{.*}}
338 // CHECK: shufflevector <4 x double> %{{.*}}, <4 x double> undef, <2 x i32> <i32 0, i32 1>
339 // CHECK: shufflevector <4 x double> %{{.*}}, <4 x double> undef, <2 x i32> <i32 2, i32 3>
340 // CHECK: fadd <2 x double> %{{.*}}, %{{.*}}
341 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> <i32 1, i32 0>
342 // CHECK: fadd <2 x double> %{{.*}}, %{{.*}}
343 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
344 return _mm512_mask_reduce_add_pd(__M, __W);
345 }
346
test_mm512_mask_reduce_mul_pd(__mmask8 __M,__m512d __W)347 double test_mm512_mask_reduce_mul_pd(__mmask8 __M, __m512d __W){
348 // CHECK-LABEL: @test_mm512_mask_reduce_mul_pd(
349 // CHECK: bitcast i8 %{{.*}} to <8 x i1>
350 // CHECK: select <8 x i1> %{{.*}}, <8 x double> %{{.*}}, <8 x double> %{{.*}}
351 // CHECK: shufflevector <8 x double> %{{.*}}, <8 x double> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
352 // CHECK: shufflevector <8 x double> %{{.*}}, <8 x double> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
353 // CHECK: fmul <4 x double> %{{.*}}, %{{.*}}
354 // CHECK: shufflevector <4 x double> %{{.*}}, <4 x double> undef, <2 x i32> <i32 0, i32 1>
355 // CHECK: shufflevector <4 x double> %{{.*}}, <4 x double> undef, <2 x i32> <i32 2, i32 3>
356 // CHECK: fmul <2 x double> %{{.*}}, %{{.*}}
357 // CHECK: shufflevector <2 x double> %{{.*}}, <2 x double> %{{.*}}, <2 x i32> <i32 1, i32 0>
358 // CHECK: fmul <2 x double> %{{.*}}, %{{.*}}
359 // CHECK: extractelement <2 x double> %{{.*}}, i32 0
360 return _mm512_mask_reduce_mul_pd(__M, __W);
361 }
362
test_mm512_mask_reduce_add_ps(__mmask16 __M,__m512 __W)363 float test_mm512_mask_reduce_add_ps(__mmask16 __M, __m512 __W){
364 // CHECK-LABEL: @test_mm512_mask_reduce_add_ps(
365 // CHECK-NEXT: entry:
366 // CHECK: bitcast i16 %{{.*}} to <16 x i1>
367 // CHECK: select <16 x i1> %{{.*}}, <16 x float> {{.*}}, <16 x float> {{.*}}
368 // CHECK: bitcast <16 x float> %{{.*}} to <8 x double>
369 // CHECK: shufflevector <8 x double> %{{.*}}, <8 x double> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
370 // CHECK: bitcast <4 x double> %{{.*}} to <8 x float>
371 // CHECK: shufflevector <8 x double> %{{.*}}, <8 x double> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
372 // CHECK: bitcast <4 x double> %{{.*}} to <8 x float>
373 // CHECK: fadd <8 x float> %{{.*}}, %{{.*}}
374 // CHECK: shufflevector <8 x float> %{{.*}}, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
375 // CHECK: shufflevector <8 x float> %{{.*}}, <8 x float> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
376 // CHECK: fadd <4 x float> %{{.*}}, %{{.*}}
377 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x i32> <i32 2, i32 3, i32 0, i32 1>
378 // CHECK: fadd <4 x float> %{{.*}}, %{{.*}}
379 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
380 // CHECK: fadd <4 x float> %{{.*}}, %{{.*}}
381 // CHECK: extractelement <4 x float> %{{.*}}, i32 0
382 return _mm512_mask_reduce_add_ps(__M, __W);
383 }
384
test_mm512_mask_reduce_mul_ps(__mmask16 __M,__m512 __W)385 float test_mm512_mask_reduce_mul_ps(__mmask16 __M, __m512 __W){
386 // CHECK-LABEL: @test_mm512_mask_reduce_mul_ps(
387 // CHECK: bitcast i16 %{{.*}} to <16 x i1>
388 // CHECK: select <16 x i1> %{{.*}}, <16 x float> {{.*}}, <16 x float> %{{.*}}
389 // CHECK: bitcast <16 x float> %{{.*}} to <8 x double>
390 // CHECK: shufflevector <8 x double> %{{.*}}, <8 x double> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
391 // CHECK: bitcast <4 x double> %{{.*}} to <8 x float>
392 // CHECK: shufflevector <8 x double> %{{.*}}, <8 x double> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
393 // CHECK: bitcast <4 x double> %{{.*}} to <8 x float>
394 // CHECK: fmul <8 x float> %{{.*}}, %{{.*}}
395 // CHECK: shufflevector <8 x float> %{{.*}}, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
396 // CHECK: shufflevector <8 x float> %{{.*}}, <8 x float> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
397 // CHECK: fmul <4 x float> %{{.*}}, %{{.*}}
398 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x i32> <i32 2, i32 3, i32 0, i32 1>
399 // CHECK: fmul <4 x float> %{{.*}}, %{{.*}}
400 // CHECK: shufflevector <4 x float> %{{.*}}, <4 x float> %{{.*}}, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
401 // CHECK: fmul <4 x float> %{{.*}}, %{{.*}}
402 // CHECK: extractelement <4 x float> %{{.*}}, i32 0
403 return _mm512_mask_reduce_mul_ps(__M, __W);
404 }
405