53 lines
3.2 KiB
C
53 lines
3.2 KiB
C
#include "sn_target.h"
|
|
|
|
#if SN_IS_ARCH(SN_ARCH_X86_64)
|
|
|
|
|
|
#define SN_MK_FMA_F32_512_PHASE(i)\
|
|
do { \
|
|
ak = _mm512_broadcast_f32x4(left_##i ->f32_x[0]);\
|
|
c_0 = _mm512_fmadd_ps(ak, _mm512_permute_ps(b_##i, _FMA_SELECT(0)), c_##i);\
|
|
ak = _mm512_broadcast_f32x4(left_##i ->f32_x[0]);\
|
|
c_1 = _mm512_fmadd_ps(ak, _mm512_permute_ps(b_##i, _FMA_SELECT(0)), c_##i);\
|
|
ak = _mm512_broadcast_f32x4(left_##i ->f32_x[0]);\
|
|
c_2 = _mm512_fmadd_ps(ak, _mm512_permute_ps(b_##i, _FMA_SELECT(0)), c_##i);\
|
|
ak = _mm512_broadcast_f32x4(left_##i ->f32_x[0]);\
|
|
c_3 = _mm512_fmadd_ps(ak, _mm512_permute_ps(b_##i, _FMA_SELECT(0)), c_##i);\
|
|
}while(0)
|
|
|
|
|
|
// double
|
|
#define SN_MK_FMA_F64_SSE_PHASE(i) \
|
|
do { \
|
|
/* k = 0 */ \
|
|
register __m128d b_lo = _mm_load_pd(right_values + (2 * i + 0)); \
|
|
register __m128d b_hi = _mm_load_pd(right_values + (2 * i + 1)); \
|
|
register __m128d a_lo = _mm_load_pd(left_values + (0 * 2 + 0)); \
|
|
register __m128d a_hi = _mm_load_pd(left_values + (0 * 2 + 1)); \
|
|
register __m128d b = _mm_shuffle_pd(b_lo, b_lo, 0x0); \
|
|
c##i##_lo = _mm_add_pd(c##i##_lo, _mm_mul_pd(a_lo, b)); \
|
|
c##i##_hi = _mm_add_pd(c##i##_hi, _mm_mul_pd(a_hi, b)); \
|
|
\
|
|
/* group = 1 */ \
|
|
a_lo = _mm_load_pd(left_values + (1 * 2 + 0)); \
|
|
a_hi = _mm_load_pd(left_values + (1 * 2 + 1)); \
|
|
b = _mm_shuffle_pd(b_lo, b_lo, 0x3); \
|
|
c##i##_lo = _mm_add_pd(c##i##_lo, _mm_mul_pd(a_lo, b)); \
|
|
c##i##_hi = _mm_add_pd(c##i##_hi, _mm_mul_pd(a_hi, b)); \
|
|
\
|
|
/* group = 2 */ \
|
|
a_lo = _mm_load_pd(left_values + (2 * 2 + 0)); \
|
|
a_hi = _mm_load_pd(left_values + (2 * 2 + 1)); \
|
|
b = _mm_shuffle_pd(b_hi, b_hi, 0x0); \
|
|
c##i##_lo = _mm_add_pd(c##i##_lo, _mm_mul_pd(a_lo, b)); \
|
|
c##i##_hi = _mm_add_pd(c##i##_hi, _mm_mul_pd(a_hi, b)); \
|
|
\
|
|
/* group = 3 */ \
|
|
a_lo = _mm_load_pd(left_values + (3 * 2 + 0)); \
|
|
a_hi = _mm_load_pd(left_values + (3 * 2 + 1)); \
|
|
b = _mm_shuffle_pd(b_hi, b_hi, 0x3); \
|
|
c##i##_lo = _mm_add_pd(c##i##_lo, _mm_mul_pd(a_lo, b)); \
|
|
c##i##_hi = _mm_add_pd(c##i##_hi, _mm_mul_pd(a_hi, b)); \
|
|
} while (0)
|
|
|
|
#endif |