chromium/chromium-85-oscillator_node-cast.patch
2020-08-28 22:03:06 -04:00

35 lines
1.5 KiB
Diff

From abd4ce23840614bb9e47fd0e674d1cbe74ec3fb6 Mon Sep 17 00:00:00 2001
From: Jose Dapena Paz <jdapena@igalia.com>
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);