shithub: opus

Download patch

ref: d0c3972856df5c0d73b76984d34a6850b4680237
parent: 362f542cfb71e70d3f3ef82f5e3407857648ca6c
author: Siarhei Volkau <lis8215@gmail.com>
date: Wed Aug 20 05:03:30 EDT 2025

MIPS DSP: disable DSP code for MIPS64 with DSP

Because support for MIPS64 DSP in GCC completely broken:
- no builtin functions for mult, madd, msub, extr, shilo
  used here.
- inline assembly with accumulators not works well when
  GCC reaches limit of 4 accumulators: observed in
  xcorr_kernel_mips and silk_warped_autocorrelation_FIX_c.

Signed-off-by: Siarhei Volkau <lis8215@gmail.com>
Signed-off-by: Jean-Marc Valin <jeanmarcv@google.com>

--- a/celt/_kiss_fft_guts.h
+++ b/celt/_kiss_fft_guts.h
@@ -102,7 +102,7 @@
 #if defined(OPUS_ARM_INLINE_EDSP)
 #include "arm/kiss_fft_armv5e.h"
 #endif
-#if defined(__mips_dsp)
+#if defined(__mips_dsp) && __mips == 32
 #include "mips/kiss_fft_mipsr1.h"
 #endif
 
--- a/celt/celt.c
+++ b/celt/celt.c
@@ -54,7 +54,7 @@
 #define PACKAGE_VERSION "unknown"
 #endif
 
-#if defined(FIXED_POINT) && defined(__mips_dsp)
+#if defined(FIXED_POINT) && defined(__mips_dsp) && __mips == 32
 #include "mips/celt_mipsr1.h"
 #endif
 
--- a/celt/fixed_generic.h
+++ b/celt/fixed_generic.h
@@ -200,7 +200,7 @@
 /** Divide a 32-bit value by a 32-bit value. Result fits in 32 bits */
 #define DIV32(a,b) (((opus_val32)(a))/((opus_val32)(b)))
 
-#if defined(__mips_dsp)
+#if defined(__mips_dsp) && __mips == 32
 #include "mips/fixed_generic_mipsr1.h"
 #endif
 
--- a/celt/mdct.c
+++ b/celt/mdct.c
@@ -53,7 +53,7 @@
 #include "mathops.h"
 #include "stack_alloc.h"
 
-#if defined(FIXED_POINT) && defined(__mips_dsp)
+#if defined(FIXED_POINT) && defined(__mips_dsp) && __mips == 32
 #include "mips/mdct_mipsr1.h"
 #endif
 
--- a/celt/pitch.h
+++ b/celt/pitch.h
@@ -42,7 +42,7 @@
 #include "x86/pitch_sse.h"
 #endif
 
-#if defined(FIXED_POINT) && defined(__mips_dsp)
+#if defined(FIXED_POINT) && defined(__mips_dsp) && __mips == 32
 #include "mips/pitch_mipsr1.h"
 #endif
 
--- a/celt/vq.c
+++ b/celt/vq.c
@@ -39,7 +39,7 @@
 #include "rate.h"
 #include "pitch.h"
 
-#if defined(FIXED_POINT) && defined(__mips_dsp)
+#if defined(FIXED_POINT) && defined(__mips_dsp) && __mips == 32
 #include "mips/vq_mipsr1.h"
 #endif
 
--- a/silk/NSQ_del_dec.c
+++ b/silk/NSQ_del_dec.c
@@ -61,7 +61,7 @@
 
 typedef NSQ_sample_struct  NSQ_sample_pair[ 2 ];
 
-#if defined(FIXED_POINT) && defined(__mips_dsp)
+#if defined(FIXED_POINT) && defined(__mips_dsp) && __mips == 32
 #include "mips/NSQ_del_dec_mipsr1.h"
 #endif
 static OPUS_INLINE void silk_nsq_del_dec_scale_states(
--- a/silk/SigProc_FIX.h
+++ b/silk/SigProc_FIX.h
@@ -631,7 +631,7 @@
 #include "arm/SigProc_FIX_armv5e.h"
 #endif
 
-#if defined(FIXED_POINT) && defined(__mips_dsp)
+#if defined(FIXED_POINT) && defined(__mips_dsp) && __mips == 32
 #include "mips/sigproc_fix_mipsr1.h"
 #endif
 
--- a/silk/fixed/noise_shape_analysis_FIX.c
+++ b/silk/fixed/noise_shape_analysis_FIX.c
@@ -129,7 +129,7 @@
 }
 
 /* Disable MIPS DSP version until it's updated. */
-#if 0 && defined(__mips_dsp)
+#if 0 && defined(__mips_dsp) && __mips == 32
 #include "mips/noise_shape_analysis_FIX_mipsr1.h"
 #endif
 
--- a/silk/fixed/warped_autocorrelation_FIX.c
+++ b/silk/fixed/warped_autocorrelation_FIX.c
@@ -31,7 +31,7 @@
 
 #include "main_FIX.h"
 
-#if defined(__mips_dsp)
+#if defined(__mips_dsp) && __mips == 32
 #include "mips/warped_autocorrelation_FIX_mipsr1.h"
 #endif
 
--- a/silk/macros.h
+++ b/silk/macros.h
@@ -104,7 +104,7 @@
                                         (( (a) & ((b)^0x80000000) & 0x80000000) ? silk_int32_MIN : (a)-(b)) :    \
                                         ((((a)^0x80000000) & (b)  & 0x80000000) ? silk_int32_MAX : (a)-(b)) )
 
-#if defined(FIXED_POINT) && defined(__mips_dsp)
+#if defined(FIXED_POINT) && defined(__mips_dsp) && __mips == 32
 #include "mips/macros_mipsr1.h"
 #endif
 
--