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