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);
openSUSE Build Service is sponsored by