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:    call i64 @llvm.vector.reduce.add.v8i64(<8 x i64> %{{.*}})
8   return _mm512_reduce_add_epi64(__W);
9 }
10 
test_mm512_reduce_mul_epi64(__m512i __W)11 long long test_mm512_reduce_mul_epi64(__m512i __W){
12 // CHECK-LABEL: @test_mm512_reduce_mul_epi64(
13 // CHECK:    call i64 @llvm.vector.reduce.mul.v8i64(<8 x i64> %{{.*}})
14   return _mm512_reduce_mul_epi64(__W);
15 }
16 
test_mm512_reduce_or_epi64(__m512i __W)17 long long test_mm512_reduce_or_epi64(__m512i __W){
18 // CHECK-LABEL: @test_mm512_reduce_or_epi64(
19 // CHECK:    call i64 @llvm.vector.reduce.or.v8i64(<8 x i64> %{{.*}})
20   return _mm512_reduce_or_epi64(__W);
21 }
22 
test_mm512_reduce_and_epi64(__m512i __W)23 long long test_mm512_reduce_and_epi64(__m512i __W){
24 // CHECK-LABEL: @test_mm512_reduce_and_epi64(
25 // CHECK:    call i64 @llvm.vector.reduce.and.v8i64(<8 x i64> %{{.*}})
26   return _mm512_reduce_and_epi64(__W);
27 }
28 
test_mm512_mask_reduce_add_epi64(__mmask8 __M,__m512i __W)29 long long test_mm512_mask_reduce_add_epi64(__mmask8 __M, __m512i __W){
30 // CHECK-LABEL: @test_mm512_mask_reduce_add_epi64(
31 // CHECK:    bitcast i8 %{{.*}} to <8 x i1>
32 // CHECK:    select <8 x i1> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> %{{.*}}
33 // CHECK:    call i64 @llvm.vector.reduce.add.v8i64(<8 x i64> %{{.*}})
34   return _mm512_mask_reduce_add_epi64(__M, __W);
35 }
36 
test_mm512_mask_reduce_mul_epi64(__mmask8 __M,__m512i __W)37 long long test_mm512_mask_reduce_mul_epi64(__mmask8 __M, __m512i __W){
38 // CHECK-LABEL: @test_mm512_mask_reduce_mul_epi64(
39 // CHECK:    bitcast i8 %{{.*}} to <8 x i1>
40 // CHECK:    select <8 x i1> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> %{{.*}}
41 // CHECK:    call i64 @llvm.vector.reduce.mul.v8i64(<8 x i64> %{{.*}})
42   return _mm512_mask_reduce_mul_epi64(__M, __W);
43 }
44 
test_mm512_mask_reduce_and_epi64(__mmask8 __M,__m512i __W)45 long long test_mm512_mask_reduce_and_epi64(__mmask8 __M, __m512i __W){
46 // CHECK-LABEL: @test_mm512_mask_reduce_and_epi64(
47 // CHECK:    bitcast i8 %{{.*}} to <8 x i1>
48 // CHECK:    select <8 x i1> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> %{{.*}}
49 // CHECK:    call i64 @llvm.vector.reduce.and.v8i64(<8 x i64> %{{.*}})
50   return _mm512_mask_reduce_and_epi64(__M, __W);
51 }
52 
test_mm512_mask_reduce_or_epi64(__mmask8 __M,__m512i __W)53 long long test_mm512_mask_reduce_or_epi64(__mmask8 __M, __m512i __W){
54 // CHECK-LABEL: @test_mm512_mask_reduce_or_epi64(
55 // CHECK:    bitcast i8 %{{.*}} to <8 x i1>
56 // CHECK:    select <8 x i1> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> %{{.*}}
57 // CHECK:    call i64 @llvm.vector.reduce.or.v8i64(<8 x i64> %{{.*}})
58   return _mm512_mask_reduce_or_epi64(__M, __W);
59 }
60 
test_mm512_reduce_add_epi32(__m512i __W)61 int test_mm512_reduce_add_epi32(__m512i __W){
62 // CHECK-LABEL: @test_mm512_reduce_add_epi32(
63 // CHECK:    call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %{{.*}})
64   return _mm512_reduce_add_epi32(__W);
65 }
66 
test_mm512_reduce_mul_epi32(__m512i __W)67 int test_mm512_reduce_mul_epi32(__m512i __W){
68 // CHECK-LABEL: @test_mm512_reduce_mul_epi32(
69 // CHECK:    call i32 @llvm.vector.reduce.mul.v16i32(<16 x i32> %{{.*}})
70   return _mm512_reduce_mul_epi32(__W);
71 }
72 
test_mm512_reduce_or_epi32(__m512i __W)73 int test_mm512_reduce_or_epi32(__m512i __W){
74 // CHECK:    call i32 @llvm.vector.reduce.or.v16i32(<16 x i32> %{{.*}})
75   return _mm512_reduce_or_epi32(__W);
76 }
77 
test_mm512_reduce_and_epi32(__m512i __W)78 int test_mm512_reduce_and_epi32(__m512i __W){
79 // CHECK-LABEL: @test_mm512_reduce_and_epi32(
80 // CHECK:    call i32 @llvm.vector.reduce.and.v16i32(<16 x i32> %{{.*}})
81   return _mm512_reduce_and_epi32(__W);
82 }
83 
test_mm512_mask_reduce_add_epi32(__mmask16 __M,__m512i __W)84 int test_mm512_mask_reduce_add_epi32(__mmask16 __M, __m512i __W){
85 // CHECK-LABEL: @test_mm512_mask_reduce_add_epi32(
86 // CHECK:    bitcast i16 %{{.*}} to <16 x i1>
87 // CHECK:    select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}}
88 // CHECK:    call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %{{.*}})
89   return _mm512_mask_reduce_add_epi32(__M, __W);
90 }
91 
test_mm512_mask_reduce_mul_epi32(__mmask16 __M,__m512i __W)92 int test_mm512_mask_reduce_mul_epi32(__mmask16 __M, __m512i __W){
93 // CHECK-LABEL: @test_mm512_mask_reduce_mul_epi32(
94 // CHECK:    bitcast i16 %{{.*}} to <16 x i1>
95 // CHECK:    select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}}
96 // CHECK:    call i32 @llvm.vector.reduce.mul.v16i32(<16 x i32> %{{.*}})
97   return _mm512_mask_reduce_mul_epi32(__M, __W);
98 }
99 
test_mm512_mask_reduce_and_epi32(__mmask16 __M,__m512i __W)100 int test_mm512_mask_reduce_and_epi32(__mmask16 __M, __m512i __W){
101 // CHECK-LABEL: @test_mm512_mask_reduce_and_epi32(
102 // CHECK:    bitcast i16 %{{.*}} to <16 x i1>
103 // CHECK:    select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}}
104 // CHECK:    call i32 @llvm.vector.reduce.and.v16i32(<16 x i32> %{{.*}})
105   return _mm512_mask_reduce_and_epi32(__M, __W);
106 }
107 
test_mm512_mask_reduce_or_epi32(__mmask16 __M,__m512i __W)108 int test_mm512_mask_reduce_or_epi32(__mmask16 __M, __m512i __W){
109 // CHECK-LABEL: @test_mm512_mask_reduce_or_epi32(
110 // CHECK:    bitcast i16 %{{.*}} to <16 x i1>
111 // CHECK:    select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}}
112 // CHECK:    call i32 @llvm.vector.reduce.or.v16i32(<16 x i32> %{{.*}})
113   return _mm512_mask_reduce_or_epi32(__M, __W);
114 }
115 
test_mm512_reduce_add_pd(__m512d __W,double ExtraAddOp)116 double test_mm512_reduce_add_pd(__m512d __W, double ExtraAddOp){
117 // CHECK-LABEL: @test_mm512_reduce_add_pd(
118 // CHECK-NOT: reassoc
119 // CHECK:    call reassoc double @llvm.vector.reduce.fadd.v8f64(double -0.000000e+00, <8 x double> %{{.*}})
120 // CHECK-NOT: reassoc
121   return _mm512_reduce_add_pd(__W) + ExtraAddOp;
122 }
123 
test_mm512_reduce_mul_pd(__m512d __W,double ExtraMulOp)124 double test_mm512_reduce_mul_pd(__m512d __W, double ExtraMulOp){
125 // CHECK-LABEL: @test_mm512_reduce_mul_pd(
126 // CHECK-NOT: reassoc
127 // CHECK:    call reassoc double @llvm.vector.reduce.fmul.v8f64(double 1.000000e+00, <8 x double> %{{.*}})
128 // CHECK-NOT: reassoc
129   return _mm512_reduce_mul_pd(__W) * ExtraMulOp;
130 }
131 
test_mm512_reduce_add_ps(__m512 __W)132 float test_mm512_reduce_add_ps(__m512 __W){
133 // CHECK-LABEL: @test_mm512_reduce_add_ps(
134 // CHECK:    call reassoc float @llvm.vector.reduce.fadd.v16f32(float -0.000000e+00, <16 x float> %{{.*}})
135   return _mm512_reduce_add_ps(__W);
136 }
137 
test_mm512_reduce_mul_ps(__m512 __W)138 float test_mm512_reduce_mul_ps(__m512 __W){
139 // CHECK-LABEL: @test_mm512_reduce_mul_ps(
140 // CHECK:    call reassoc float @llvm.vector.reduce.fmul.v16f32(float 1.000000e+00, <16 x float> %{{.*}})
141   return _mm512_reduce_mul_ps(__W);
142 }
143 
test_mm512_mask_reduce_add_pd(__mmask8 __M,__m512d __W)144 double test_mm512_mask_reduce_add_pd(__mmask8 __M, __m512d __W){
145 // CHECK-LABEL: @test_mm512_mask_reduce_add_pd(
146 // CHECK:    bitcast i8 %{{.*}} to <8 x i1>
147 // CHECK:    select <8 x i1> %{{.*}}, <8 x double> %{{.*}}, <8 x double> %{{.*}}
148 // CHECK:    call reassoc double @llvm.vector.reduce.fadd.v8f64(double -0.000000e+00, <8 x double> %{{.*}})
149   return _mm512_mask_reduce_add_pd(__M, __W);
150 }
151 
test_mm512_mask_reduce_mul_pd(__mmask8 __M,__m512d __W)152 double test_mm512_mask_reduce_mul_pd(__mmask8 __M, __m512d __W){
153 // CHECK-LABEL: @test_mm512_mask_reduce_mul_pd(
154 // CHECK:    bitcast i8 %{{.*}} to <8 x i1>
155 // CHECK:    select <8 x i1> %{{.*}}, <8 x double> %{{.*}}, <8 x double> %{{.*}}
156 // CHECK:    call reassoc double @llvm.vector.reduce.fmul.v8f64(double 1.000000e+00, <8 x double> %{{.*}})
157   return _mm512_mask_reduce_mul_pd(__M, __W);
158 }
159 
test_mm512_mask_reduce_add_ps(__mmask16 __M,__m512 __W)160 float test_mm512_mask_reduce_add_ps(__mmask16 __M, __m512 __W){
161 // CHECK-LABEL: @test_mm512_mask_reduce_add_ps(
162 // CHECK:    bitcast i16 %{{.*}} to <16 x i1>
163 // CHECK:    select <16 x i1> %{{.*}}, <16 x float> {{.*}}, <16 x float> {{.*}}
164 // CHECK:    call reassoc float @llvm.vector.reduce.fadd.v16f32(float -0.000000e+00, <16 x float> %{{.*}})
165   return _mm512_mask_reduce_add_ps(__M, __W);
166 }
167 
test_mm512_mask_reduce_mul_ps(__mmask16 __M,__m512 __W)168 float test_mm512_mask_reduce_mul_ps(__mmask16 __M, __m512 __W){
169 // CHECK-LABEL: @test_mm512_mask_reduce_mul_ps(
170 // CHECK:    bitcast i16 %{{.*}} to <16 x i1>
171 // CHECK:    select <16 x i1> %{{.*}}, <16 x float> {{.*}}, <16 x float> %{{.*}}
172 // CHECK:    call reassoc float @llvm.vector.reduce.fmul.v16f32(float 1.000000e+00, <16 x float> %{{.*}})
173   return _mm512_mask_reduce_mul_ps(__M, __W);
174 }
175