From abd4ce23840614bb9e47fd0e674d1cbe74ec3fb6 Mon Sep 17 00:00:00 2001 From: Jose Dapena Paz Date: Tue, 16 Jun 2020 21:08:28 +0200 Subject: [PATCH] fixup: do not return to 128 integer word from _mm_cmplt_ps in v_wrap_virtual_index. After the changes to convert to SIMD several operations in WebAudio oscillator node, GCC refuses to compile a call to _mm_cmplt_ps as it returns to an m128i (integer quad), though the declaration of _mm_cmplt_ps expects to return to an m128 (float quad). To fix that, we reinterpret_cast<__m128i>. When we obtain 0xffffffff, that is NaN, if we interpret it as an integer, it will convert it to 0x80000000, which is wrong. Verified with webaudio/Oscillator/* web tests. Bug: 819294 Change-Id: Ia00a7695476e84996548b6c679ffeedead49213b --- diff --git a/third_party/blink/renderer/modules/webaudio/oscillator_node.cc b/third_party/blink/renderer/modules/webaudio/oscillator_node.cc index 0e38932..03ff1da 100644 --- a/third_party/blink/renderer/modules/webaudio/oscillator_node.cc +++ b/third_party/blink/renderer/modules/webaudio/oscillator_node.cc @@ -377,7 +377,8 @@ // cmplt(a,b) returns 0xffffffff (-1) if a < b and 0 if not. So cmp is -1 or // 0 depending on whether r < f, which is what we need to compute floor(r). - const __m128i cmp = _mm_cmplt_ps(r, _mm_cvtepi32_ps(f)); + const __m128i cmp = + reinterpret_cast<__m128i>(_mm_cmplt_ps(r, _mm_cvtepi32_ps(f))); // This subtracts 1 if needed to get floor(r). f = _mm_add_epi32(f, cmp);