File fix-webrtc-vaddvq_s64.diff of Package libqt5-qtwebengine
Index: src/3rdparty/chromium/third_party/webrtc/common_audio/signal_processing/cross_correlation_neon.c
===================================================================
--- src/3rdparty/chromium/third_party/webrtc/common_audio/signal_processing/cross_correlation_neon.c.orig
+++ src/3rdparty/chromium/third_party/webrtc/common_audio/signal_processing/cross_correlation_neon.c
@@ -12,6 +12,17 @@
#include <arm_neon.h>
+__extension__ static __inline int64_t __attribute__ ((__always_inline__))
+vaddvq_s64_workaround (int64x2_t __a)
+{
+ int64_t result;
+ __asm__ ("addp %d0,%0.2d"
+ : "=w"(result)
+ : "w"(__a)
+ : /* No clobbers */);
+ return result;
+}
+
static inline void DotProductWithScaleNeon(int32_t* cross_correlation,
const int16_t* vector1,
const int16_t* vector2,
@@ -57,7 +68,7 @@ static inline void DotProductWithScaleNe
sum0 = vaddq_s64(sum0, sum1);
#if defined(WEBRTC_ARCH_ARM64)
- int64_t sum2 = vaddvq_s64(sum0);
+ int64_t sum2 = vaddvq_s64_workaround(sum0);
*cross_correlation = (int32_t)((sum2 + sum_res) >> scaling);
#else
int64x1_t shift = vdup_n_s64(-scaling);
Index: src/3rdparty/chromium/third_party/webrtc/modules/audio_coding/codecs/isac/fix/source/filters_neon.c
===================================================================
--- src/3rdparty/chromium/third_party/webrtc/modules/audio_coding/codecs/isac/fix/source/filters_neon.c.orig
+++ src/3rdparty/chromium/third_party/webrtc/modules/audio_coding/codecs/isac/fix/source/filters_neon.c
@@ -13,6 +13,17 @@
#include "webrtc/modules/audio_coding/codecs/isac/fix/source/codec.h"
+__extension__ static __inline int64_t __attribute__ ((__always_inline__))
+vaddvq_s64_workaround (int64x2_t __a)
+{
+ int64_t result;
+ __asm__ ("addp %d0,%0.2d"
+ : "=w"(result)
+ : "w"(__a)
+ : /* No clobbers */);
+ return result;
+}
+
// Autocorrelation function in fixed point.
// NOTE! Different from SPLIB-version in how it scales the signal.
int WebRtcIsacfix_AutocorrNeon(int32_t* __restrict r,
@@ -45,7 +56,7 @@ int WebRtcIsacfix_AutocorrNeon(int32_t*
}
#ifdef WEBRTC_ARCH_ARM64
- prod = vaddvq_s64(tmpb_v);
+ prod = vaddvq_s64_workaround(tmpb_v);
#else
prod = vget_lane_s64(vadd_s64(vget_low_s64(tmpb_v), vget_high_s64(tmpb_v)),
0);
@@ -91,7 +102,7 @@ int WebRtcIsacfix_AutocorrNeon(int32_t*
y_start += 4;
}
#ifdef WEBRTC_ARCH_ARM64
- prod = vaddvq_s64(tmpb_v);
+ prod = vaddvq_s64_workaround(tmpb_v);
#else
prod = vget_lane_s64(vadd_s64(vget_low_s64(tmpb_v), vget_high_s64(tmpb_v)),
0);