35 #ifndef _BLAZE_MATH_INTRINSICS_MULTIPLICATION_H_
36 #define _BLAZE_MATH_INTRINSICS_MULTIPLICATION_H_
68 return _mm256_mullo_epi16( a.value, b.value );
73 return _mm_mullo_epi16( a.value, b.value );
91 return _mm512_mullo_epi32( a.value, b.value );
96 return _mm256_mullo_epi32( a.value, b.value );
101 return _mm_mullo_epi32( a.value, b.value );
119 return _mm512_mullo_epi64( a.value, b.value );
137 return _mm512_mul_ps( a.value, b.value );
142 return _mm256_mul_ps( a.value, b.value );
147 return _mm_mul_ps( a.value, b.value );
165 return _mm512_mul_pd( a.value, b.value );
170 return _mm256_mul_pd( a.value, b.value );
172 #elif BLAZE_SSE2_MODE
175 return _mm_mul_pd( a.value, b.value );
193 return _mm256_mullo_epi16( a.value, b.value );
195 #elif BLAZE_SSE2_MODE
198 return _mm_mullo_epi16( a.value, b.value );
216 return _mm256_mullo_epi16( a.value, b.value );
218 #elif BLAZE_SSE2_MODE
221 return _mm_mullo_epi16( a.value, b.value );
240 const __m256i neg( _mm256_set_epi16( 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1 ) );
242 x = _mm256_shufflelo_epi16( a.value, 0xA0 );
243 x = _mm256_shufflehi_epi16( x, 0xA0 );
244 z = _mm256_mullo_epi16( x, b.value );
245 x = _mm256_shufflelo_epi16( a.value, 0xF5 );
246 x = _mm256_shufflehi_epi16( x, 0xF5 );
247 y = _mm256_shufflelo_epi16( b.value, 0xB1 );
248 y = _mm256_shufflehi_epi16( y, 0xB1 );
249 y = _mm256_mullo_epi16( x, y );
250 y = _mm256_mullo_epi16( y, neg );
251 return _mm256_add_epi16( z, y );
253 #elif BLAZE_SSE2_MODE
257 const __m128i neg( _mm_set_epi16( 1, -1, 1, -1, 1, -1, 1, -1 ) );
259 x = _mm_shufflelo_epi16( a.value, 0xA0 );
260 x = _mm_shufflehi_epi16( x, 0xA0 );
261 z = _mm_mullo_epi16( x, b.value );
262 x = _mm_shufflelo_epi16( a.value, 0xF5 );
263 x = _mm_shufflehi_epi16( x, 0xF5 );
264 y = _mm_shufflelo_epi16( b.value, 0xB1 );
265 y = _mm_shufflehi_epi16( y, 0xB1 );
266 y = _mm_mullo_epi16( x, y );
267 y = _mm_mullo_epi16( y, neg );
268 return _mm_add_epi16( z, y );
286 return _mm512_mullo_epi32( a.value, b.value );
288 #elif BLAZE_AVX2_MODE
291 return _mm256_mullo_epi32( a.value, b.value );
293 #elif BLAZE_SSE4_MODE
296 return _mm_mullo_epi32( a.value, b.value );
314 return _mm512_mullo_epi32( a.value, b.value );
316 #elif BLAZE_AVX2_MODE
319 return _mm256_mullo_epi32( a.value, b.value );
321 #elif BLAZE_SSE4_MODE
324 return _mm_mullo_epi32( a.value, b.value );
343 const __m512i neg( _mm256_set_epi32( 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1 ) );
345 x = _mm512_shuffle_epi32( a.value, 0xA0 );
346 z = _mm512_mullo_epi32( x, b.value );
347 x = _mm512_shuffle_epi32( a.value, 0xF5 );
348 y = _mm512_shuffle_epi32( b.value, 0xB1 );
349 y = _mm512_mullo_epi32( x, y );
350 y = _mm512_mullo_epi32( y, neg );
351 return _mm512_add_epi32( z, y );
353 #elif BLAZE_AVX2_MODE
357 const __m256i neg( _mm256_set_epi32( 1, -1, 1, -1, 1, -1, 1, -1 ) );
359 x = _mm256_shuffle_epi32( a.value, 0xA0 );
360 z = _mm256_mullo_epi32( x, b.value );
361 x = _mm256_shuffle_epi32( a.value, 0xF5 );
362 y = _mm256_shuffle_epi32( b.value, 0xB1 );
363 y = _mm256_mullo_epi32( x, y );
364 y = _mm256_mullo_epi32( y, neg );
365 return _mm256_add_epi32( z, y );
367 #elif BLAZE_SSE4_MODE
371 const __m128i neg( _mm_set_epi32( 1, -1, 1, -1 ) );
373 x = _mm_shuffle_epi32( a.value, 0xA0 );
374 z = _mm_mullo_epi32( x, b.value );
375 x = _mm_shuffle_epi32( a.value, 0xF5 );
376 y = _mm_shuffle_epi32( b.value, 0xB1 );
377 y = _mm_mullo_epi32( x, y );
378 y = _mm_mullo_epi32( y, neg );
379 return _mm_add_epi32( z, y );
397 return _mm512_mul_ps( a.value, b.value );
402 return _mm256_mul_ps( a.value, b.value );
407 return _mm_mul_ps( a.value, b.value );
425 return _mm512_mul_ps( a.value, b.value );
430 return _mm256_mul_ps( a.value, b.value );
435 return _mm_mul_ps( a.value, b.value );
455 x = _mm256_shuffle_ps( a.value, a.value, 0xA0 );
456 z = _mm256_mul_ps( x, b.value );
457 x = _mm256_shuffle_ps( a.value, a.value, 0xF5 );
458 y = _mm256_shuffle_ps( b.value, b.value, 0xB1 );
459 y = _mm256_mul_ps( x, y );
460 return _mm256_addsub_ps( z, y );
462 #elif BLAZE_SSE3_MODE
467 x = _mm_shuffle_ps( a.value, a.value, 0xA0 );
468 z = _mm_mul_ps( x, b.value );
469 x = _mm_shuffle_ps( a.value, a.value, 0xF5 );
470 y = _mm_shuffle_ps( b.value, b.value, 0xB1 );
471 y = _mm_mul_ps( x, y );
472 return _mm_addsub_ps( z, y );
490 return _mm512_mul_pd( a.value, b.value );
495 return _mm256_mul_pd( a.value, b.value );
497 #elif BLAZE_SSE2_MODE
500 return _mm_mul_pd( a.value, b.value );
518 return _mm512_mul_pd( a.value, b.value );
523 return _mm256_mul_pd( a.value, b.value );
525 #elif BLAZE_SSE2_MODE
528 return _mm_mul_pd( a.value, b.value );
548 x = _mm256_shuffle_pd( a.value, a.value, 0 );
549 z = _mm256_mul_pd( x, b.value );
550 x = _mm256_shuffle_pd( a.value, a.value, 15 );
551 y = _mm256_shuffle_pd( b.value, b.value, 5 );
552 y = _mm256_mul_pd( x, y );
553 return _mm256_addsub_pd( z, y );
555 #elif BLAZE_SSE3_MODE
560 x = _mm_shuffle_pd( a.value, a.value, 0 );
561 z = _mm_mul_pd( x, b.value );
562 x = _mm_shuffle_pd( a.value, a.value, 3 );
563 y = _mm_shuffle_pd( b.value, b.value, 1 );
564 y = _mm_mul_pd( x, y );
565 return _mm_addsub_pd( z, y );
const DMatDMatMultExpr< T1, T2 > operator*(const DenseMatrix< T1, false > &lhs, const DenseMatrix< T2, false > &rhs)
Multiplication operator for the multiplication of two row-major dense matrices ( ).
Definition: DMatDMatMultExpr.h:7820
Namespace of the Blaze C++ math library.
Definition: Blaze.h:57
#define BLAZE_ALWAYS_INLINE
Platform dependent setup of an enforced inline keyword.
Definition: Inline.h:85
Header file for the basic intrinsic types.
System settings for the SSE mode.
System settings for the inline keywords.