From d239b4a230b8ef4246d81ca2b0b4dd1f4eb285a5 Mon Sep 17 00:00:00 2001 From: Natt Akuma Date: Tue, 6 Feb 2024 17:30:10 +0700 Subject: [PATCH] Final ARM ASM fix --- extern/ESFMu/esfm.c | 72 ++++++++++++++++++--------------------------- 1 file changed, 29 insertions(+), 43 deletions(-) diff --git a/extern/ESFMu/esfm.c b/extern/ESFMu/esfm.c index a3298447f..b7373d58a 100644 --- a/extern/ESFMu/esfm.c +++ b/extern/ESFMu/esfm.c @@ -1910,70 +1910,56 @@ ESFM_process_feedback(esfm_chip *chip) ); #elif defined(__GNUC__) && defined(__arm__) asm ( - "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" - "ldrb r0, %[wave] \n\t" - "push {r10-r12,lr} \n\t" - "ldr r10, =%c[sinrom] \n\t" - "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 r3, #0 \n\t" + "movs %[out], #0 \n\t" + "ldr r8, =0x1fff \n\t" "movs r2, #29 \n" "1: \n\t" // phase_feedback = (wave_out + wave_last) >> 2; - "adds r3, r5, r6 \n\t" - "asrs r3, r3, #2 \n\t" + "adds %[p_fb], %[out], r3 \n\t" + "asrs %[p_fb], %[p_fb], #2 \n\t" // wave_last = wave_out - "mov r6, r5 \n\t" + "mov r3, %[out] \n\t" // phase = phase_feedback >> mod_in_shift; - "asr r0, r3, r8 \n\t" + "asr r0, %[p_fb], %[mod_in] \n\t" // phase += phase_acc >> 9; - "add r0, r0, r4, asr #9 \n\t" + "add r0, r0, %[p_acc], asr #9 \n\t" // lookup = logsinrom[(waveform << 10) | (phase & 0x3ff)]; "lsls r0, r0, #22 \n\t" "lsrs r0, r0, #21 \n\t" - "ldrsh r1, [r3, r0] \n\t" + "ldrsh r1, [%[sinrom], r0] \n\t" // level = (lookup & 0x1fff) + (envelope << 3); - "and r0, r12, r1, lsl #1 \n\t" - "add r0, r0, r9, lsl #4 \n\t" + "and r0, r8, r1 \n\t" + "add r0, r0, %[eg_out], lsl #3 \n\t" // if (level > 0x1fff) level = 0x1fff; - "cmp r0, r12 \n\t" + "cmp r0, r8 \n\t" "it hi \n\t" - "movhi r0, r12 \n\t" + "movhi r0, r8 \n\t" // wave_out = exprom[level & 0xff] >> (level >> 8); - "lsrs r5, r0, #9 \n\t" - "and r0, r0, lr \n\t" - "ldrh r0, [r11, r0] \n\t" - "lsr r5, r0, r5 \n\t" + "lsrs %[out], r0, #8 \n\t" + "ands r0, r0, #255 \n\t" + "lsls r0, r0, #1 \n\t" + "ldrh r0, [%[exprom], r0] \n\t" + "lsr %[out], r0, %[out] \n\t" // if (lookup & 0x8000) wave_out = -wave_out; // in other words, lookup is negative "tst r1, r1 \n\t" "it mi \n\t" - "negmi r5, r5 \n\t" + "negmi %[out], %[out] \n\t" // phase_acc += phase_offset - "add r4, r4, r7 \n\t" + "adds %[p_acc], %[p_acc], %[p_off]\n\t" // loop "subs r2, r2, #1 \n\t" "bne 1b \n\t" - "pop {r10-r12,lr} \n\t" - "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] "m" (eg_output), - [sinrom] "i" (logsinrom), - [exprom] "i" (exprom) - : "cc", "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : [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), + [eg_out] "r" (eg_output), + [sinrom] "r" (logsinrom + waveform * 1024), + [exprom] "r" (exprom) + : "cc", "r0", "r1", "r2", "r3", "r8" ); #else wave_out = 0;