From 45c7498f59ad2889f2120a865a51043004eddd5d Mon Sep 17 00:00:00 2001 From: Rafaël Carré Date: Fri, 11 Jun 2010 04:41:36 +0000 Subject: FS#11335 by me: make ARM assembly functions thumb-friendly We can't pop into pc on ARMv4t when using thumb: the T bit won't be modified if we are returning to a thumb function Code running on ARMv4t should use the new ldrpc / ldmpc macros instead of ldr pc, [sp], #4 and ldm(cond) sp!, {regs, pc} No modification on pure ARM builds and ARMv5+ Note: USE_THUMB is currently never defined, no targets can currently be built with -mthumb, see FS#6734 git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26756 a1c6a512-1295-4272-9138-f99709370657 --- apps/codecs/demac/libdemac/predictor-arm.S | 8 ++++++++ apps/codecs/lib/mdct_arm.S | 6 +++--- apps/codecs/libatrac/atrac3_arm.S | 6 ++++-- apps/codecs/libffmpegFLAC/arm.S | 2 +- apps/codecs/libmad/dct32_arm.S | 2 +- apps/codecs/libmad/imdct_l_arm.S | 5 +++-- apps/codecs/libmad/synth_full_arm.S | 9 +++++---- apps/codecs/libmusepack/synth_filter_arm.S | 6 ++++-- apps/codecs/libspeex/filters_arm4.S | 10 +++++----- apps/codecs/libtta/filter_arm.S | 4 ++-- apps/codecs/libwavpack/arm.S | 5 ++++- apps/codecs/libwavpack/arml.S | 4 +++- 12 files changed, 43 insertions(+), 24 deletions(-) (limited to 'apps/codecs') diff --git a/apps/codecs/demac/libdemac/predictor-arm.S b/apps/codecs/demac/libdemac/predictor-arm.S index 1d5587661a..92a78ed9b4 100644 --- a/apps/codecs/demac/libdemac/predictor-arm.S +++ b/apps/codecs/demac/libdemac/predictor-arm.S @@ -505,7 +505,11 @@ loop: done: str r14, [r12] @ Save value of p->buf add sp, sp, #12 @ Don't bother restoring r1-r3 +#ifdef ROCKBOX + ldmpc regs=r4-r11 +#else ldmia sp!, {r4 - r11, pc} +#endif move_hist: @ dest = r11 (p->historybuffer) @@ -664,7 +668,11 @@ loopm: donem: str r14, [r12] @ Save value of p->buf add sp, sp, #8 @ Don't bother restoring r1, r2 +#ifdef ROCKBOX + ldmpc regs=r4-r11 +#else ldmia sp!, {r4 - r11, pc} +#endif move_histm: @ dest = r11 (p->historybuffer) diff --git a/apps/codecs/lib/mdct_arm.S b/apps/codecs/lib/mdct_arm.S index f2fa1d9c3e..515b859b44 100644 --- a/apps/codecs/lib/mdct_arm.S +++ b/apps/codecs/lib/mdct_arm.S @@ -127,7 +127,7 @@ mdct_butterfly_16: @ mdct_butterfly_8 increments r0 by another #8*4 here @ at end, r0 has been incremented by #16*4 - ldr pc, [sp], #4 + ldrpc mdct_butterfly_32: stmdb sp!, {r4-r11, lr} @@ -257,7 +257,7 @@ mdct_butterfly_32: @ and we wanted to advance by #16*4 anyway, so just call again bl mdct_butterfly_16 - ldmia sp!, {r4-r11, pc} + ldmpc regs=r4-r11 @ mdct_butterfly_generic_loop(x1, x2, T0, step, Ttop) mdct_butterfly_generic_loop: @@ -433,5 +433,5 @@ mdct_butterfly_generic_loop: cmp r2, r4 bhi 1b - ldmia sp!, {r4-r11, pc} + ldmpc regs=r4-r11 diff --git a/apps/codecs/libatrac/atrac3_arm.S b/apps/codecs/libatrac/atrac3_arm.S index 0908d582ed..80eaa7954d 100644 --- a/apps/codecs/libatrac/atrac3_arm.S +++ b/apps/codecs/libatrac/atrac3_arm.S @@ -19,6 +19,8 @@ * ****************************************************************************/ +#include "config.h" + .section .text, "ax", %progbits /**************************************************************************** @@ -63,7 +65,7 @@ atrac3_iqmf_matrixing: subs r3, r3, #4 /* counter -= 4 */ bgt .iqmf_matrixing_loop - ldmfd sp!, {r4-r9, pc} /* restore registers */ + ldmpc regs=r4-r9 /* restore registers */ .atrac3_iqmf_matrixing_end: .size atrac3_iqmf_matrixing,.atrac3_iqmf_matrixing_end-atrac3_iqmf_matrixing @@ -218,7 +220,7 @@ atrac3_iqmf_dewindowing: subs r3, r3, #1 /* outer loop -= 1 */ bgt .iqmf_dewindow_outer_loop - ldmfd sp!, {r4-r9, pc} /* restore registers */ + ldmpc regs=r4-r9 /* restore registers */ .atrac3_iqmf_dewindowing_end: .size atrac3_iqmf_dewindowing,.atrac3_iqmf_dewindowing_end-atrac3_iqmf_dewindowing diff --git a/apps/codecs/libffmpegFLAC/arm.S b/apps/codecs/libffmpegFLAC/arm.S index 2a2746eefa..8adca77ce5 100644 --- a/apps/codecs/libffmpegFLAC/arm.S +++ b/apps/codecs/libffmpegFLAC/arm.S @@ -267,5 +267,5 @@ lpc_decode_arm: bne .default @ no, prepare for next sample .exit: - ldmia sp!, { r4-r11, pc } + ldmpc regs=r4-r11 diff --git a/apps/codecs/libmad/dct32_arm.S b/apps/codecs/libmad/dct32_arm.S index a4eda8a087..440841bb5e 100644 --- a/apps/codecs/libmad/dct32_arm.S +++ b/apps/codecs/libmad/dct32_arm.S @@ -220,7 +220,7 @@ dct32: cmp r0, #9 bne .l4 add sp, sp, #144 - ldmia sp!, {r4-r11, pc} + ldmpc regs=r4-r11 bitrev: .word 0x0 .word 0x2 diff --git a/apps/codecs/libmad/imdct_l_arm.S b/apps/codecs/libmad/imdct_l_arm.S index b86ba1120d..b511ff169d 100644 --- a/apps/codecs/libmad/imdct_l_arm.S +++ b/apps/codecs/libmad/imdct_l_arm.S @@ -45,6 +45,7 @@ * ****************************************************************************/ +#include "config.h" /* On entry: @@ -823,7 +824,7 @@ normal_block_x18_to_x35: @---- add sp, sp, #(21*4) @ return stack frame - ldmia sp!, { r4 - r11, pc } @ restore callee saved regs, and return + ldmpc regs=r4-r11 @ restore callee saved regs, and return @---- @@ -992,7 +993,7 @@ start_block_x18_to_x35: @---- add sp, sp, #(21*4) @ return stack frame - ldmia sp!, { r4 - r11, pc } @ restore callee saved regs, and return + ldmpc regs=r4-r11 @ restore callee saved regs, and return @---- @END diff --git a/apps/codecs/libmad/synth_full_arm.S b/apps/codecs/libmad/synth_full_arm.S index e663b8ffcb..dec437f666 100644 --- a/apps/codecs/libmad/synth_full_arm.S +++ b/apps/codecs/libmad/synth_full_arm.S @@ -19,6 +19,7 @@ * ****************************************************************************/ +#include "config.h" #include "mad_iram.h" .section ICODE_SECTION_MPA_ARM,"ax",%progbits @@ -135,7 +136,7 @@ synth_full_odd_sbsample: ldr r5, =synth_full_sp ldr sp, [r5] - ldmia sp!, {r4-r11, pc} + ldmpc regs=r4-r11 synth_full_even_sbsample: stmdb sp!, {r4-r11, lr} @@ -241,7 +242,7 @@ synth_full_even_sbsample: ldr r5, =synth_full_sp ldr sp, [r5] - ldmia sp!, {r4-r11, pc} + ldmpc regs=r4-r11 .global III_aliasreduce @@ -289,7 +290,7 @@ III_aliasreduce: add r0, r0, #72 cmp r0, r1 blo .arl1 - ldmia sp!, {r4-r11, pc} + ldmpc regs=r4-r11 csa: .word +0x0db84a81 @@ -332,7 +333,7 @@ III_overlap: stmia r1!, {r4, r5, r6, r7, r12, lr} ldmia r0!, {r4, r5, r6, r7, r12, lr} stmia r1!, {r4, r5, r6, r7, r12, lr} - ldmia sp!, {r4-r7, pc} + ldmpc regs=r4-r7 .section IBSS_SECTION_MPA_ARM,"aw",%nobits synth_full_sp: diff --git a/apps/codecs/libmusepack/synth_filter_arm.S b/apps/codecs/libmusepack/synth_filter_arm.S index 3f78469948..731a21ce21 100644 --- a/apps/codecs/libmusepack/synth_filter_arm.S +++ b/apps/codecs/libmusepack/synth_filter_arm.S @@ -19,6 +19,8 @@ * ****************************************************************************/ +#include "config.h" + .section .text, "ax", %progbits /**************************************************************************** @@ -89,7 +91,7 @@ mpc_decoder_windowing_D: subs lr, lr, #1 bgt .loop32 - ldmfd sp!, {r4-r8, pc} + ldmpc regs=r4-r8 #else mpc_decoder_windowing_D: /* r0 = Data[] */ @@ -287,7 +289,7 @@ mpc_decoder_windowing_D: str r8, [r0], #4 /* store Data */ add r1, r1, #4 /* V++ */ - ldmfd sp!, {r4-r11, pc} + ldmpc regs=r4-r11 #endif .mpc_dewindowing_end: .size mpc_decoder_windowing_D,.mpc_dewindowing_end-mpc_decoder_windowing_D diff --git a/apps/codecs/libspeex/filters_arm4.S b/apps/codecs/libspeex/filters_arm4.S index 109556fa92..dcd1691982 100644 --- a/apps/codecs/libspeex/filters_arm4.S +++ b/apps/codecs/libspeex/filters_arm4.S @@ -49,7 +49,7 @@ iir_mem16: beq .order_10 cmp r5, #8 beq .order_8 - ldmia sp!, { r4-r11, pc } @ Non-supported order, return + ldmpc regs=r4-r11 @ Non-supported order, return @ TODO: try using direct form 1 filtering .order_8: @@ -94,7 +94,7 @@ iir_mem16: bne 0b ldr r4, [sp, #40] @ r4 = mem stmia r4, { r5-r12 } @ Save back mem[] - ldmia sp!, { r4-r11, pc } @ Exit + ldmpc regs=r4-r11 @ Exit .order_10: ldmia r4, { r5-r9 } @ r5-r9 = mem[0..4] @@ -154,7 +154,7 @@ iir_mem16: sub r1, r1, #10*2 subs r3, r3, #1 bne .order_10 - ldmia sp!, { r4-r11, pc } @ Exit + ldmpc regs=r4-r11 @ Exit /* void qmf_synth(const spx_word16_t *x1, const spx_word16_t *x2, const spx_word16_t *a, spx_word16_t *y, int N, int M, spx_word32_t *mem1, spx_word32_t *mem2, char *stack) */ @@ -300,7 +300,7 @@ qmf_synth: strh r8, [r6], #4 subs r4, r4, #4 bne 0b - ldmia sp!, { r4-r11, pc } @ Exit + ldmpc regs=r4-r11 @ Exit /* void signal_mul(const spx_sig_t *x, spx_sig_t *y, spx_word32_t scale, int len) */ @@ -325,5 +325,5 @@ signal_mul: subs r3, r3, #4 @ Are we done? bne 0b - ldmia sp!, { r4-r8, pc } @ Exit + ldmpc regs=r4-r8 @ Exit diff --git a/apps/codecs/libtta/filter_arm.S b/apps/codecs/libtta/filter_arm.S index d34b182a04..f3959b83ca 100644 --- a/apps/codecs/libtta/filter_arm.S +++ b/apps/codecs/libtta/filter_arm.S @@ -167,7 +167,7 @@ hybrid_filter: @ set to the memory: *pA, *(pA-1), *(pA-2), *(pA-3), *pM, *(pM-1), *(pM-2), *(pM-3) stmneda r2, {r10, r11, r12, lr} stmneda r3, {r5, r6, r7, r8} - ldmnefd sp!, {r4-r12, pc} @ hybrid_filter end (when fs->index != 0) + ldmpc cond=ne regs=r4-r12 @ hybrid_filter end (when fs->index != 0) .hf_memshl: @ memshl (fs->dl) @@ -192,7 +192,7 @@ hybrid_filter: ldmia r9, {r1, r2, r3, r4} sub r9, r9, #64 @ r9 = fs->dx stmia r9, {r1 - r8} - ldmfd sp!, {r4 - r12, pc} @ hybrid_filter end (when fs->index == 0) + ldmpc regs=r4-r12 @ hybrid_filter end (when fs->index == 0) hybrid_filter_end: .size hybrid_filter, hybrid_filter_end - hybrid_filter diff --git a/apps/codecs/libwavpack/arm.S b/apps/codecs/libwavpack/arm.S index 90dfd46c6e..32de1df7de 100644 --- a/apps/codecs/libwavpack/arm.S +++ b/apps/codecs/libwavpack/arm.S @@ -35,6 +35,9 @@ * 32-bit multiply-accumulate instruction and so will overflow with 24-bit * WavPack files. */ + +#include "config.h" + .text .align .global decorr_stereo_pass_cont_arm @@ -470,5 +473,5 @@ term_minus_3_loop: common_exit: strh r4, [r5, #4] strh r0, [r5, #6] - ldmfd sp!, {r4 - r8, r10, r11, pc} + ldmpc regs="r4-r8, r10-r11" diff --git a/apps/codecs/libwavpack/arml.S b/apps/codecs/libwavpack/arml.S index 5745c81ed0..60818aa1e6 100644 --- a/apps/codecs/libwavpack/arml.S +++ b/apps/codecs/libwavpack/arml.S @@ -38,6 +38,8 @@ * instruction. */ +#include "config.h" + .text .align .global decorr_stereo_pass_cont_arml @@ -500,5 +502,5 @@ common_exit: mov r4, r4, asr #18 strh r4, [r5, #4] strh r0, [r5, #6] - ldmfd sp!, {r4 - r8, r10, r11, pc} + ldmpc regs="r4-r8, r10-r11" -- cgit v1.2.3