Showing the changes to libavfilter (2 of 2 files). Show all
Unified · Split
| @@ -67,3 +67,30 @@ INIT_XMM sse3 · 66 unmodified lines | ||
| 67 | 67 | FCMUL_ADD |
| 68 | 68 | INIT_YMM avx |
| 69 | 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 | 26 | ptrdiff_t len); |
| 27 | 27 | void ff_fcmul_add_avx(float *sum, const float *t, const float *c, |
| 28 | 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 | 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 | 39 | if (EXTERNAL_AVX_FAST(cpu_flags)) { |
| 38 | 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 | } |