Unified · Split
| @@ -67,3 +67,30 @@ INIT_XMM sse3 · 66 unmodified lines | |||
| 67 | FCMUL_ADD | 67 | FCMUL_ADD |
| 68 | INIT_YMM avx | 68 | INIT_YMM avx |
| 69 | FCMUL_ADD | 69 | FCMUL_ADD |
| 70 | |||
| 71 | %if HAVE_FMA3_EXTERNAL | ||
| 72 | INIT_YMM fma3 | ||
| 73 | cglobal fcmul_add, 4,4,4, sum, t, c, len | ||
| 74 | shl lend, 3 | ||
| 75 | add tq, lenq | ||
| 76 | add cq, lenq | ||
| 77 | add sumq, lenq | ||
| 78 | neg lenq | ||
| 79 | .loop: | ||
| 80 | movaps m0, [tq + lenq] | ||
| 81 | movaps m1, [cq + lenq] | ||
| 82 | vpermilps m3, m0, 177 | ||
| 83 | vpermilps m2, m1, 160 | ||
| 84 | vpermilps m1, m1, 245 | ||
| 85 | mulps m1, m1, m3 | ||
| 86 | vfmaddsub132ps m0, m1, m2 | ||
| 87 | addps m0, m0, [sumq + lenq] | ||
| 88 | movaps [sumq + lenq], m0 | ||
| 89 | add lenq, mmsize | ||
| 90 | jl .loop | ||
| 91 | movss xm0, [tq + lenq] | ||
| 92 | mulss xm0, [cq + lenq] | ||
| 93 | addss xm0, [sumq + lenq] | ||
| 94 | movss [sumq + lenq], xm0 | ||
| 95 | RET | ||
| 96 | %endif | ||
| @@ -26,6 +26,8 @@ void ff_fcmul_add_sse3(float *sum, const float *t, const float *c, · 25 unmodified lines | |||
| 26 | ptrdiff_t len); | 26 | ptrdiff_t len); |
| 27 | void ff_fcmul_add_avx(float *sum, const float *t, const float *c, | 27 | void ff_fcmul_add_avx(float *sum, const float *t, const float *c, |
| 28 | ptrdiff_t len); | 28 | ptrdiff_t len); |
| 29 | void ff_fcmul_add_fma3(float *sum, const float *t, const float *c, | ||
| 30 | ptrdiff_t len); | ||
| 29 | 31 | ||
| 30 | av_cold void ff_afir_init_x86(AudioFIRDSPContext *s) | 32 | av_cold void ff_afir_init_x86(AudioFIRDSPContext *s) |
| 31 | { | 33 | { |
| @@ -37,4 +39,7 @@ av_cold void ff_afir_init_x86(AudioFIRDSPContext *s) · 5 unmodified lines | |||
| 37 | if (EXTERNAL_AVX_FAST(cpu_flags)) { | 39 | if (EXTERNAL_AVX_FAST(cpu_flags)) { |
| 38 | s->fcmul_add = ff_fcmul_add_avx; | 40 | s->fcmul_add = ff_fcmul_add_avx; |
| 39 | } | 41 | } |
| 42 | if (EXTERNAL_FMA3_FAST(cpu_flags)) { | ||
| 43 | s->fcmul_add = ff_fcmul_add_fma3; | ||
| 44 | } | ||
| 40 | } | 45 | } |