From d56fc2ed019dc59ae096b4bd87cba89a7171cc7e Mon Sep 17 00:00:00 2001 From: Siarhei Volkau Date: Tue, 19 Aug 2025 11:04:36 +0300 Subject: [PATCH 1/2] MIPS: Github Actions for validating MIPS It includes running tests in QEMU. Note: musl based prebuilt toolchains used. Didn't find GLIBC ones. Signed-off-by: Siarhei Volkau --- .github/workflows/autotools-cross-mips.yml | 75 ++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 .github/workflows/autotools-cross-mips.yml diff --git a/.github/workflows/autotools-cross-mips.yml b/.github/workflows/autotools-cross-mips.yml new file mode 100644 index 000000000..81dfd48ea --- /dev/null +++ b/.github/workflows/autotools-cross-mips.yml @@ -0,0 +1,75 @@ +name: Autotools-cross-MIPS + +on: [push, pull_request] + +jobs: + + AutoMakeBuild: + name: AutoMake/${{ matrix.config.name }} + runs-on: ${{ matrix.config.os }} + strategy: + fail-fast: false + matrix: + config: + - { + name: "MIPS32/GCC", + os: ubuntu-latest, + vcpu: 24Kf, + toolchain-triple: mipsel-unknown-linux-musl, + buildconfig: , + cflags: -mips32 -mtune=24kf, + } + - { + name: "MIPS32/GCC/Fixed", + os: ubuntu-latest, + vcpu: 24Kc, + toolchain-triple: mipsel-unknown-linux-muslsf, + buildconfig: --enable-fixed-point, + cflags: -mips32 -mtune=24kc, + } + - { + name: "MIPS32/GCC/Fixed/DSP", + os: ubuntu-latest, + vcpu: 24KEc, + toolchain-triple: mipsel-unknown-linux-muslsf, + buildconfig: --enable-fixed-point, + cflags: -mips32r2 -mdsp -mtune=24kec, + } + - { + name: "MIPS64/GCC", + os: ubuntu-latest, + vcpu: MIPS64R2-generic, + toolchain-triple: mips64el-unknown-linux-musl, + buildconfig: , + cflags: -mips64, + } + - { + name: "MIPS64/GCC/Fixed", + os: ubuntu-latest, + vcpu: MIPS64R2-generic, + toolchain-triple: mips64el-unknown-linux-musl, + buildconfig: --enable-fixed-point, + cflags: -mips64, + } + - { + name: "MIPS64/GCC/Fixed/DSP", + os: ubuntu-latest, + vcpu: mips64dspr2, + toolchain-triple: mips64el-unknown-linux-musl, + buildconfig: --enable-fixed-point, + cflags: -mips64r2 -mdsp, + } + steps: + - uses: actions/checkout@v3 + - name: Install QEMU + run: sudo apt-get update && sudo apt-get install -y qemu-user + - name: Install prebuilt toolchain + run: wget https://github.com/cross-tools/musl-cross/releases/download/20250815/${{ matrix.config.toolchain-triple }}.tar.xz -O toolchain.tar.xz && sudo tar -C /opt/ -xf toolchain.tar.xz + - name: Autogen + run: ./autogen.sh + - name: Configure + run: CC=/opt/${{ matrix.config.toolchain-triple }}/bin/${{ matrix.config.toolchain-triple }}-gcc CFLAGS="${{ matrix.config.cflags }} -g -O2 -fvisibility=hidden -D_FORTIFY_SOURCE=2 -W -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes" ./configure --disable-shared --enable-assertions --enable-custom-modes --enable-check-asm --host=${{ matrix.config.toolchain-triple }} ${{ matrix.config.buildconfig }} + - name: Build + run: make -j 2 + - name: Test + run: QEMU_LD_PREFIX=/opt/${{ matrix.config.toolchain-triple }}/${{ matrix.config.toolchain-triple }}/sysroot/ QEMU_CPU=${{ matrix.config.vcpu }} make check -j 2 From 4d2db2759d5b561580dcfc934a4cabd5ef17c9c3 Mon Sep 17 00:00:00 2001 From: Siarhei Volkau Date: Wed, 20 Aug 2025 09:03:30 +0300 Subject: [PATCH 2/2] 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 --- celt/_kiss_fft_guts.h | 2 +- celt/celt.c | 2 +- celt/fixed_generic.h | 2 +- celt/mdct.c | 2 +- celt/pitch.h | 2 +- celt/vq.c | 2 +- silk/NSQ_del_dec.c | 2 +- silk/SigProc_FIX.h | 2 +- silk/fixed/noise_shape_analysis_FIX.c | 2 +- silk/fixed/warped_autocorrelation_FIX.c | 2 +- silk/macros.h | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/celt/_kiss_fft_guts.h b/celt/_kiss_fft_guts.h index 5b1bfbcfe..4de1137f9 100644 --- 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 diff --git a/celt/celt.c b/celt/celt.c index 8ca0e0baa..cc2c8c8e7 100644 --- 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 diff --git a/celt/fixed_generic.h b/celt/fixed_generic.h index 86d345335..f499f4f89 100644 --- 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 diff --git a/celt/mdct.c b/celt/mdct.c index 6812b8815..a60081b5c 100644 --- 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 diff --git a/celt/pitch.h b/celt/pitch.h index 25c0ad379..7aa99bb84 100644 --- 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 diff --git a/celt/vq.c b/celt/vq.c index e49054303..c3424a86b 100644 --- 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 diff --git a/silk/NSQ_del_dec.c b/silk/NSQ_del_dec.c index 1ec177446..5a3cdebc6 100644 --- a/silk/NSQ_del_dec.c +++ b/silk/NSQ_del_dec.c @@ -61,7 +61,7 @@ typedef struct { 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( diff --git a/silk/SigProc_FIX.h b/silk/SigProc_FIX.h index 49a70a8e9..88b2119e7 100644 --- a/silk/SigProc_FIX.h +++ b/silk/SigProc_FIX.h @@ -631,7 +631,7 @@ static OPUS_INLINE opus_int64 silk_max_64(opus_int64 a, opus_int64 b) #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 diff --git a/silk/fixed/noise_shape_analysis_FIX.c b/silk/fixed/noise_shape_analysis_FIX.c index a8504e263..d90d7ca58 100644 --- a/silk/fixed/noise_shape_analysis_FIX.c +++ b/silk/fixed/noise_shape_analysis_FIX.c @@ -129,7 +129,7 @@ static OPUS_INLINE void limit_warped_coefs( } /* 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 diff --git a/silk/fixed/warped_autocorrelation_FIX.c b/silk/fixed/warped_autocorrelation_FIX.c index 8caf0afb1..e185df59c 100644 --- a/silk/fixed/warped_autocorrelation_FIX.c +++ b/silk/fixed/warped_autocorrelation_FIX.c @@ -31,7 +31,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "main_FIX.h" -#if defined(__mips_dsp) +#if defined(__mips_dsp) && __mips == 32 #include "mips/warped_autocorrelation_FIX_mipsr1.h" #endif diff --git a/silk/macros.h b/silk/macros.h index 7d3f3a28a..099f84e51 100644 --- a/silk/macros.h +++ b/silk/macros.h @@ -104,7 +104,7 @@ POSSIBILITY OF SUCH DAMAGE. (( (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