From d1998da8ab117008489795cc205da0283d20fe1c Mon Sep 17 00:00:00 2001 From: Marcin Puc Date: Sun, 4 Feb 2024 11:46:57 +0100 Subject: [PATCH] furnace: update to 0.6.1 --- srcpkgs/furnace/patches/fix-arm-esfm.patch | 116 +++++++++++++++++++++ srcpkgs/furnace/template | 5 +- 2 files changed, 119 insertions(+), 2 deletions(-) create mode 100644 srcpkgs/furnace/patches/fix-arm-esfm.patch diff --git a/srcpkgs/furnace/patches/fix-arm-esfm.patch b/srcpkgs/furnace/patches/fix-arm-esfm.patch new file mode 100644 index 0000000000000..4caa0553624f8 --- /dev/null +++ b/srcpkgs/furnace/patches/fix-arm-esfm.patch @@ -0,0 +1,116 @@ +From 9529119691c5c16658bc4b2e9f4216ca8168634c Mon Sep 17 00:00:00 2001 +From: Natt Akuma +Date: Sat, 3 Feb 2024 16:15:12 +0700 +Subject: [PATCH] Fix ARM ASM for later GCC versions They do Thumb-2 by default + for some reason + +--- + extern/ESFMu/esfm.c | 76 +++++++++++++++++++++++++-------------------- + 1 file changed, 43 insertions(+), 33 deletions(-) + +diff --git a/extern/ESFMu/esfm.c b/extern/ESFMu/esfm.c +index 6c743245b..daf8d695d 100644 +--- a/extern/ESFMu/esfm.c ++++ b/extern/ESFMu/esfm.c +@@ -1910,58 +1910,68 @@ ESFM_process_feedback(esfm_chip *chip) + ); + #elif defined(__GNUC__) && defined(__arm__) + asm ( +- "ldr r3, =%[sinrom] \n\t" ++ "ldr r4, %[p_acc] \n\t" ++ "mov r5, #0 \n\t" ++ "mov r6, #0 \n\t" ++ "ldr r7, %[p_off] \n\t" ++ "ldrb r8, %[mod_in] \n\t" ++ "ldrh r9, %[eg_out] \n\t" ++ "ldr r10, =%c[sinrom] \n\t" + "ldrb r0, %[wave] \n\t" +- "add r3, r3, r0, lsl #11 \n\t" +- "mov r4, #0 \n\t" +- "mov %[out], #0 \n\t" +- "ldr r5, =0x1fff<<1 \n\t" +- "ldr r6, =0xff<<1 \n\t" +- "mov r2, #29 \n" ++ "add r10, r10, r0, lsl #11 \n\t" ++ "ldr r11, =%c[exprom] \n\t" ++ "ldr r12, =0x1fff<<1 \n\t" ++ "ldr lr, =0xff<<1 \n\t" ++ "movs r2, #29 \n" + "1: \n\t" + // phase_feedback = (wave_out + wave_last) >> 2; +- "add %[p_fb], %[out], r4 \n\t" +- "asr %[p_fb], %[p_fb], #2 \n\t" ++ "adds r3, r5, r6 \n\t" ++ "asrs r3, r3, #2 \n\t" + // wave_last = wave_out +- "mov r4, %[out] \n\t" ++ "mov r6, r5 \n\t" + // phase = phase_feedback >> mod_in_shift; +- "asr r0, %[p_fb], %[mod_in] \n\t" ++ "asr r0, r3, r8 \n\t" + // phase += phase_acc >> 9; +- "add r0, r0, %[p_acc], asr #9 \n\t" ++ "add r0, r0, r4, asr #9 \n\t" + // lookup = logsinrom[(waveform << 10) | (phase & 0x3ff)]; +- "lsl r0, r0, #22 \n\t" +- "add r0, r3, r0, lsr #21 \n\t" +- "ldrsh r1, [r0] \n\t" ++ "lsls r0, r0, #22 \n\t" ++ "lsrs r0, r0, #21 \n\t" ++ "ldrsh r1, [r3, r0] \n\t" + // level = (lookup & 0x1fff) + (envelope << 3); +- "and r0, r5, r1, lsl #1 \n\t" +- "add r0, r0, %[eg_out], lsl #4 \n\t" ++ "and r0, r12, r1, lsl #1 \n\t" ++ "add r0, r0, r9, lsl #4 \n\t" + // if (level > 0x1fff) level = 0x1fff; +- "cmp r0, r5 \n\t" +- "movhi r0, r5 \n\t" ++ "cmp r0, r12 \n\t" ++ "it hi \n\t" ++ "movhi r0, r12 \n\t" + // wave_out = exprom[level & 0xff] >> (level >> 8); +- "lsr %[out], r0, #9 \n\t" +- "and r0, r0, r6 \n\t" +- "ldrh r0, [%[exprom], r0] \n\t" +- "lsr %[out], r0, %[out] \n\t" ++ "lsrs r5, r0, #9 \n\t" ++ "and r0, r0, lr \n\t" ++ "ldrh r0, [r11, r0] \n\t" ++ "lsr r5, r0, r5 \n\t" + // if (lookup & 0x8000) wave_out = -wave_out; + // in other words, lookup is negative + "tst r1, r1 \n\t" +- "negmi %[out], %[out] \n\t" ++ "it mi \n\t" ++ "negmi r5, r5 \n\t" + // phase_acc += phase_offset +- "add %[p_acc], %[p_acc], %[p_off]\n\t" ++ "add r4, r4, r7 \n\t" + // loop + "subs r2, r2, #1 \n\t" + "bne 1b \n\t" +- : [p_fb] "=&r" (phase_feedback), +- [p_acc] "+r" (phase_acc), +- [out] "=&r" (wave_out) +- : [p_off] "r" (phase_offset), +- [mod_in] "r" (mod_in_shift), ++ "str r3, %[p_fb] \n\t" ++ "str r4, %[p_acc] \n\t" ++ "str r5, %[out] \n\t" ++ : [p_fb] "=m" (phase_feedback), ++ [p_acc] "+m" (phase_acc), ++ [out] "=m" (wave_out) ++ : [p_off] "m" (phase_offset), ++ [mod_in] "m" (mod_in_shift), + [wave] "m" (waveform), +- [eg_out] "r" (eg_output), ++ [eg_out] "m" (eg_output), + [sinrom] "i" (logsinrom), +- [exprom] "r" (exprom) +- : "cc", "r0", "r1", "r2", "r3", "r4", "r5", "r6" ++ [exprom] "i" (exprom) ++ : "cc", "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr" + ); + #else + wave_out = 0; diff --git a/srcpkgs/furnace/template b/srcpkgs/furnace/template index b6f9850d185b8..e29d37fb4cda5 100644 --- a/srcpkgs/furnace/template +++ b/srcpkgs/furnace/template @@ -1,6 +1,6 @@ # Template file for 'furnace' pkgname=furnace -version=0.6 +version=0.6.1 revision=1 _adpcm_commit="ef7a217154badc3b99978ac481b268c8aab67bd8" build_wrksrc=${pkgname}-${version} @@ -15,8 +15,9 @@ license="GPL-2.0-or-later" homepage="https://github.com/tildearrow/furnace" distfiles="https://github.com/tildearrow/furnace/archive/refs/tags/v${version}.tar.gz https://github.com/superctr/adpcm/archive/${_adpcm_commit}.tar.gz" -checksum="d7d40da0234f379a689e8d5ad925e097e0ef487a72fe8d5c1b050cdc18f7fb44 +checksum="4af60c47c3070a176e9edf03663a6319d219083b25f9b43234bd0acfdf62a6b0 46da29342d2968ff222ba00e07c646e038b76af2e6c86de037c653059a056251" +patch_args="-Np1 --directory=${build_wrksrc}" post_extract() { mv -T adpcm-${_adpcm_commit} ${pkgname}-${version}/extern/adpcm