X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=decode.cpp;h=3662566737d4d4fc415a525d2071f9185ce0e8b0;hb=22be96e6cc5a38d73af6fc65bc8802b05cac8325;hp=f9e525eeea07b8ebaf351d87d9870be36d1c22cb;hpb=611a1748946aa8e9afe7faf7043a10e52654484e;p=c64tapwav diff --git a/decode.cpp b/decode.cpp index f9e525e..3662566 100644 --- a/decode.cpp +++ b/decode.cpp @@ -7,6 +7,9 @@ #include #include #include +#ifdef __AVX__ +#include +#endif #include #include @@ -328,17 +331,30 @@ std::vector crop(const std::vector& pcm, float crop_start, float c return std::vector(pcm.begin() + start_sample, pcm.begin() + end_sample); } -// TODO: Support AVX here. std::vector do_fir_filter(const std::vector& pcm, const float* filter) { std::vector filtered_pcm; - filtered_pcm.reserve(pcm.size()); - for (unsigned i = NUM_FILTER_COEFF; i < pcm.size(); ++i) { + filtered_pcm.resize(pcm.size()); + unsigned i = NUM_FILTER_COEFF; +#ifdef __AVX__ + unsigned avx_end = i + ((pcm.size() - i) & ~7); + for ( ; i < avx_end; i += 8) { + __m256 s = _mm256_setzero_ps(); + for (int j = 0; j < NUM_FILTER_COEFF; ++j) { + __m256 f = _mm256_set1_ps(filter[j]); + s = _mm256_fmadd_ps(f, _mm256_load_ps(&pcm[i - j]), s); + } + _mm256_storeu_ps(&filtered_pcm[i], s); + } +#endif + // Do what we couldn't do with AVX (which is everything for non-AVX machines) + // as scalar code. + for (; i < pcm.size(); ++i) { float s = 0.0f; for (int j = 0; j < NUM_FILTER_COEFF; ++j) { s += filter[j] * pcm[i - j]; } - filtered_pcm.push_back(s); + filtered_pcm[i] = s; } if (output_filtered) {