mul(avx_simd_complex_float<T> lhs, avx_simd_complex_float<T> rhs) { //lhs = [x1.real, x1.img, x2.real, x2.img, ...] //rhs = [y1.real, y1.img, y2.real, y2.img, ...] //ymm1 = [y1.real, y1.real, y2.real, y2.real, ...] __m256 ymm1 = _mm256_moveldup_ps(rhs.value); //ymm2 = [x1.img, x1.real, x2.img, x2.real] __m256 ymm2 = _mm256_permute_ps(lhs.value, 0b10110001); //ymm3 = [y1.imag, y1.imag, y2.imag, y2.imag] __m256 ymm3 = _mm256_movehdup_ps(rhs.value); //ymm4 = ymm2 * ymm3 __m256 ymm4 = _mm256_mul_ps(ymm2, ymm3); //result = [(lhs * ymm1) -+ ymm4]; #ifdef __FMA__ return _mm256_fmaddsub_ps(lhs.value, ymm1, ymm4); #elif defined(__FMA4__) return _mm256_maddsub_ps(lhs.value, ymm1, ymm4); #else __m256 tmp = _mm256_mul_ps(lhs.value, ymm1); return _mm256_addsub_ps(tmp, ymm4); #endif }
__m256 test_mm256_maddsub_ps(__m256 a, __m256 b, __m256 c) { // CHECK: @llvm.x86.fma.vfmaddsub.ps.256 // CHECK-ASM: vfmaddsubps %ymm{{.*}}, %ymm{{.*}}, %ymm{{.*}}, %ymm{{.*}} return _mm256_maddsub_ps(a, b, c); }
__m256 test_mm256_maddsub_ps(__m256 a, __m256 b, __m256 c) { // CHECK-LABEL: test_mm256_maddsub_ps // CHECK: @llvm.x86.fma.vfmaddsub.ps.256 return _mm256_maddsub_ps(a, b, c); }