diff options
author | Erik de Castro Lopo <erikd@mega-nerd.com> | 2016-05-05 17:21:20 +1000 |
---|---|---|
committer | Erik de Castro Lopo <erikd@mega-nerd.com> | 2016-05-05 17:23:52 +1000 |
commit | 94a61241b02064c7d9fe508f72a742f2a90b8492 (patch) | |
tree | 63929d6dc3541cf2dc6500114f507c3dc155a156 /src/libFLAC/stream_encoder_intrin_ssse3.c | |
parent | 387992bd6411411739014e633a80cfe639e4db36 (diff) | |
download | flac-94a61241b02064c7d9fe508f72a742f2a90b8492.tar.gz |
libFLAC: Add a workaround for a bug in MSVC2105 update2
MSVC2105 update2 compiles the C code:
abs_residual_partition_sums[partition] =
(FLAC__uint32)_mm_cvtsi128_si32(mm_sum);
into this:
movq QWORD PTR [rsi], xmm2
while it should be:
movd eax, xmm2
mov QWORD PTR [rsi], rax
With this patch, MSVC emits:
movq QWORD PTR [rsi], xmm2
mov DWORD PTR [rsi+4], r9d
so the price of this workaround is 1 extra write instruction per
partition.
Patch-from: lvqcl <lvqcl.mail@gmail.com>
Diffstat (limited to 'src/libFLAC/stream_encoder_intrin_ssse3.c')
-rw-r--r-- | src/libFLAC/stream_encoder_intrin_ssse3.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/src/libFLAC/stream_encoder_intrin_ssse3.c b/src/libFLAC/stream_encoder_intrin_ssse3.c index 465950b2..551ffd31 100644 --- a/src/libFLAC/stream_encoder_intrin_ssse3.c +++ b/src/libFLAC/stream_encoder_intrin_ssse3.c @@ -87,6 +87,10 @@ void FLAC__precompute_partition_info_sums_intrin_ssse3(const FLAC__int32 residua mm_sum = _mm_hadd_epi32(mm_sum, mm_sum); mm_sum = _mm_hadd_epi32(mm_sum, mm_sum); abs_residual_partition_sums[partition] = (FLAC__uint32)_mm_cvtsi128_si32(mm_sum); +/* workaround for a bug in MSVC2015U2 - see https://connect.microsoft.com/VisualStudio/feedback/details/2659191/incorrect-code-generation-for-x86-64 */ +#if (defined _MSC_VER) && (_MSC_FULL_VER == 190023918) && (defined FLAC__CPU_X86_64) + abs_residual_partition_sums[partition] &= 0xFFFFFFFF; +#endif } } else { /* have to pessimistically use 64 bits for accumulator */ |