35 #ifndef _BLAZE_MATH_SIMD_PROD_H_ 36 #define _BLAZE_MATH_SIMD_PROD_H_ 64 template<
typename T >
67 #if BLAZE_AVX512BW_MODE 68 return (~a)[ 0] * (~a)[ 1] * (~a)[ 2] * (~a)[ 3] * (~a)[ 4] * (~a)[ 5] * (~a)[ 6] * (~a)[ 7] *
69 (~a)[ 8] * (~a)[ 9] * (~a)[10] * (~a)[11] * (~a)[12] * (~a)[13] * (~a)[14] * (~a)[15] *
70 (~a)[16] * (~a)[17] * (~a)[18] * (~a)[19] * (~a)[20] * (~a)[21] * (~a)[22] * (~a)[23] *
71 (~a)[24] * (~a)[25] * (~a)[26] * (~a)[27] * (~a)[28] * (~a)[29] * (~a)[30] * (~a)[31] *
72 (~a)[32] * (~a)[33] * (~a)[34] * (~a)[35] * (~a)[36] * (~a)[37] * (~a)[38] * (~a)[39] *
73 (~a)[40] * (~a)[41] * (~a)[42] * (~a)[43] * (~a)[44] * (~a)[45] * (~a)[46] * (~a)[47] *
74 (~a)[48] * (~a)[49] * (~a)[50] * (~a)[51] * (~a)[52] * (~a)[53] * (~a)[54] * (~a)[55] *
75 (~a)[56] * (~a)[57] * (~a)[58] * (~a)[59] * (~a)[60] * (~a)[61] * (~a)[62] * (~a)[63];
77 return (~a)[ 0] * (~a)[ 1] * (~a)[ 2] * (~a)[ 3] * (~a)[ 4] * (~a)[ 5] * (~a)[ 6] * (~a)[ 7] *
78 (~a)[ 8] * (~a)[ 9] * (~a)[10] * (~a)[11] * (~a)[12] * (~a)[13] * (~a)[14] * (~a)[15] *
79 (~a)[16] * (~a)[17] * (~a)[18] * (~a)[19] * (~a)[20] * (~a)[21] * (~a)[22] * (~a)[23] *
80 (~a)[24] * (~a)[25] * (~a)[26] * (~a)[27] * (~a)[28] * (~a)[29] * (~a)[30] * (~a)[31];
82 return (~a)[ 0] * (~a)[ 1] * (~a)[ 2] * (~a)[ 3] * (~a)[ 4] * (~a)[ 5] * (~a)[ 6] * (~a)[ 7] *
83 (~a)[ 8] * (~a)[ 9] * (~a)[10] * (~a)[11] * (~a)[12] * (~a)[13] * (~a)[14] * (~a)[15];
98 template<
typename T >
101 #if BLAZE_AVX512BW_MODE 102 return complex<int8_t>( (~a)[ 0] * (~a)[ 1] * (~a)[ 2] * (~a)[ 3] * (~a)[ 4] * (~a)[ 5] * (~a)[ 6] * (~a)[ 7] *
103 (~a)[ 8] * (~a)[ 9] * (~a)[10] * (~a)[11] * (~a)[12] * (~a)[13] * (~a)[14] * (~a)[15] *
104 (~a)[16] * (~a)[17] * (~a)[18] * (~a)[19] * (~a)[20] * (~a)[21] * (~a)[22] * (~a)[23] *
105 (~a)[24] * (~a)[25] * (~a)[26] * (~a)[27] * (~a)[28] * (~a)[29] * (~a)[30] * (~a)[31] );
106 #elif BLAZE_AVX2_MODE 107 return complex<int8_t>( (~a)[0] * (~a)[1] * (~a)[ 2] * (~a)[ 3] * (~a)[ 4] * (~a)[ 5] * (~a)[ 6] * (~a)[ 7] *
108 (~a)[8] * (~a)[9] * (~a)[10] * (~a)[11] * (~a)[12] * (~a)[13] * (~a)[14] * (~a)[15] );
109 #elif BLAZE_SSE2_MODE 110 return complex<int8_t>( (~a)[0] * (~a)[1] * (~a)[2] * (~a)[3] * (~a)[4] * (~a)[5] * (~a)[6] * (~a)[7] );
133 template<
typename T >
136 #if BLAZE_AVX512BW_MODE 137 return (~a)[ 0] * (~a)[ 1] * (~a)[ 2] * (~a)[ 3] * (~a)[ 4] * (~a)[ 5] * (~a)[ 6] * (~a)[ 7] *
138 (~a)[ 8] * (~a)[ 9] * (~a)[10] * (~a)[11] * (~a)[12] * (~a)[13] * (~a)[14] * (~a)[15] *
139 (~a)[16] * (~a)[17] * (~a)[18] * (~a)[19] * (~a)[20] * (~a)[21] * (~a)[22] * (~a)[23] *
140 (~a)[24] * (~a)[25] * (~a)[26] * (~a)[27] * (~a)[28] * (~a)[29] * (~a)[30] * (~a)[31];
141 #elif BLAZE_AVX2_MODE 142 return (~a)[ 0] * (~a)[ 1] * (~a)[ 2] * (~a)[ 3] * (~a)[ 4] * (~a)[ 5] * (~a)[ 6] * (~a)[ 7] *
143 (~a)[ 8] * (~a)[ 9] * (~a)[10] * (~a)[11] * (~a)[12] * (~a)[13] * (~a)[14] * (~a)[15];
144 #elif BLAZE_SSE2_MODE 145 return (~a)[0] * (~a)[1] * (~a)[2] * (~a)[3] * (~a)[4] * (~a)[5] * (~a)[6] * (~a)[7];
160 template<
typename T >
163 #if BLAZE_AVX512BW_MODE 164 return complex<int16_t>( (~a)[0] * (~a)[1] * (~a)[ 2] * (~a)[ 3] * (~a)[ 4] * (~a)[ 5] * (~a)[ 6] * (~a)[ 7] *
165 (~a)[8] * (~a)[9] * (~a)[10] * (~a)[11] * (~a)[12] * (~a)[13] * (~a)[14] * (~a)[15] );
166 #elif BLAZE_AVX2_MODE 167 return complex<int16_t>( (~a)[0] * (~a)[1] * (~a)[2] * (~a)[3] * (~a)[4] * (~a)[5] * (~a)[6] * (~a)[7] );
168 #elif BLAZE_SSE2_MODE 169 return complex<int16_t>( (~a)[0] * (~a)[1] * (~a)[2] * (~a)[3] );
192 template<
typename T >
195 #if BLAZE_AVX512F_MODE || BLAZE_MIC_MODE 196 return _mm512_reduce_mul_epi32( (~a).value );
197 #elif BLAZE_AVX2_MODE 198 const __m256i b( _mm256_mullo_epi32( (~a).value, _mm256_shuffle_epi32( (~a).value, _MM_SHUFFLE(1,0,3,2) ) ) );
199 const __m256i c( _mm256_mullo_epi32( b, _mm256_shuffle_epi32( b, _MM_SHUFFLE(2,3,0,1) ) ) );
200 const __m128i d( _mm_mullo_epi32( _mm256_extracti128_si256( c, 1 ), _mm256_castsi256_si128( c ) ) );
201 return _mm_extract_epi32( d, 0 );
202 #elif BLAZE_SSE4_MODE 203 const __m128i b( _mm_mullo_epi32( (~a).value, _mm_shuffle_epi32( (~a).value, _MM_SHUFFLE(1,0,3,2) ) ) );
204 return _mm_extract_epi32( _mm_mullo_epi32( b, _mm_shuffle_epi32( b, 1U ) ), 0 );
205 #elif BLAZE_SSE2_MODE 206 return (~a)[0] * (~a)[1] * (~a)[2] * (~a)[3];
221 template<
typename T >
224 #if BLAZE_AVX512F_MODE || BLAZE_MIC_MODE 225 return complex<int32_t>( (~a)[0] * (~a)[1] * (~a)[2] * (~a)[3] * (~a)[4] * (~a)[5] * (~a)[6] * (~a)[7] );
226 #elif BLAZE_AVX2_MODE 227 return complex<int32_t>( (~a)[0] * (~a)[1] * (~a)[2] * (~a)[3] );
228 #elif BLAZE_SSE2_MODE 229 return complex<int32_t>( (~a)[0] * (~a)[1] );
252 template<
typename T >
255 #if BLAZE_AVX512F_MODE || BLAZE_MIC_MODE 256 return (~a)[0] * (~a)[1] * (~a)[2] * (~a)[3] * (~a)[4] * (~a)[5] * (~a)[6] * (~a)[7];
257 #elif BLAZE_AVX2_MODE 258 return (~a)[0] * (~a)[1] * (~a)[2] * (~a)[3];
259 #elif BLAZE_SSE2_MODE 260 return (~a)[0] * (~a)[1];
275 template<
typename T >
278 #if BLAZE_AVX512F_MODE || BLAZE_MIC_MODE 279 return complex<int64_t>( (~a)[0] * (~a)[1] * (~a)[2] * (~a)[3] );
280 #elif BLAZE_AVX2_MODE 281 return complex<int64_t>( (~a)[0] * (~a)[1] );
282 #elif BLAZE_SSE2_MODE 308 #if BLAZE_AVX512F_MODE || BLAZE_MIC_MODE 309 return _mm512_reduce_mul_ps( a.value );
311 const __m256 b( _mm256_mul_ps( a.value, _mm256_permute2f128_ps( a.value, a.value, 1 ) ) );
312 const __m256 c( _mm256_mul_ps( b, _mm256_shuffle_ps( b, b, _MM_SHUFFLE(1,0,3,2) ) ) );
313 return _mm_cvtss_f32( _mm256_castps256_ps128( _mm256_mul_ps( c, _mm256_shuffle_ps( c, c, 1 ) ) ) );
315 const __m128 b = _mm_mul_ps( a.value, _mm_movehl_ps( a.value, a.value ) );
316 return _mm_cvtss_f32( _mm_mul_ss( b, _mm_shuffle_ps( b, b, 1U ) ) );
333 #if BLAZE_AVX512F_MODE || BLAZE_MIC_MODE 334 return complex<float>( a[0] * a[1] * a[2] * a[3] * a[4] * a[5] * a[6] * a[7] );
336 return complex<float>( a[0] * a[1] * a[2] * a[3] );
338 return complex<float>( a[0] * a[1] );
363 #if BLAZE_AVX512F_MODE || BLAZE_MIC_MODE 364 return _mm512_reduce_mul_pd( a.value );
366 const __m256d b( _mm256_mul_pd( a.value, _mm256_permute2f128_pd( a.value, a.value, 1 ) ) );
367 return _mm_cvtsd_f64( _mm256_castpd256_pd128( _mm256_mul_pd( b, _mm256_shuffle_pd( b, b, 1 ) ) ) );
368 #elif BLAZE_SSE2_MODE 369 return _mm_cvtsd_f64( _mm_mul_sd( a.value, _mm_unpackhi_pd( a.value, a.value ) ) );
386 #if BLAZE_AVX512F_MODE || BLAZE_MIC_MODE 387 return complex<double>( a[0] * a[1] * a[2] * a[3] );
389 return complex<double>( a[0] * a[1] );
390 #elif BLAZE_SSE2_MODE Header file for auxiliary alias declarations.
typename T::ValueType ValueType_t
Alias declaration for nested ValueType type definitions.The ValueType_t alias declaration provides a ...
Definition: Aliases.h:490
decltype(auto) prod(const DenseMatrix< MT, SO > &dm)
Reduces the given dense matrix by means of multiplication.
Definition: DMatReduceExpr.h:2220
SIMD type for 64-bit double precision floating point data values.
Namespace of the Blaze C++ math library.
Definition: Blaze.h:58
#define BLAZE_ALWAYS_INLINE
Platform dependent setup of an enforced inline keyword.
Definition: Inline.h:85
Header file for the basic SIMD types.
SIMD type for 32-bit single precision complex values.
SIMD type for 32-bit single precision floating point data values.
SIMD type for 64-bit double precision complex values.
System settings for the SSE mode.
System settings for the inline keywords.