diff options
author | Rafaël Carré <rafael.carre@gmail.com> | 2010-06-11 04:41:36 +0000 |
---|---|---|
committer | Rafaël Carré <rafael.carre@gmail.com> | 2010-06-11 04:41:36 +0000 |
commit | 45c7498f59ad2889f2120a865a51043004eddd5d (patch) | |
tree | 1a62b0e8549a7f2750679de8d7dd3f82039c5719 /apps/dsp_arm.S | |
parent | fe7ca44471b309a0adea563cce947de9efb62ab5 (diff) | |
download | rockbox-45c7498f59ad2889f2120a865a51043004eddd5d.tar.gz rockbox-45c7498f59ad2889f2120a865a51043004eddd5d.zip |
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
Diffstat (limited to 'apps/dsp_arm.S')
-rw-r--r-- | apps/dsp_arm.S | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/apps/dsp_arm.S b/apps/dsp_arm.S index 2150ff0631..7e360749a3 100644 --- a/apps/dsp_arm.S +++ b/apps/dsp_arm.S | |||
@@ -23,6 +23,9 @@ | |||
23 | /**************************************************************************** | 23 | /**************************************************************************** |
24 | * void channels_process_sound_chan_mono(int count, int32_t *buf[]) | 24 | * void channels_process_sound_chan_mono(int count, int32_t *buf[]) |
25 | */ | 25 | */ |
26 | |||
27 | #include "config.h" | ||
28 | |||
26 | .section .icode, "ax", %progbits | 29 | .section .icode, "ax", %progbits |
27 | .align 2 | 30 | .align 2 |
28 | .global channels_process_sound_chan_mono | 31 | .global channels_process_sound_chan_mono |
@@ -47,7 +50,7 @@ channels_process_sound_chan_mono: | |||
47 | stmia r2!, { r12, r14 } @ store Mo0, Mo1 | 50 | stmia r2!, { r12, r14 } @ store Mo0, Mo1 |
48 | bgt .monoloop @ | 51 | bgt .monoloop @ |
49 | @ | 52 | @ |
50 | ldmltfd sp!, { r4, pc } @ if count was even, we're done | 53 | ldmpc cond=lt, regs=r4 @ if count was even, we're done |
51 | @ | 54 | @ |
52 | .mono_singlesample: @ | 55 | .mono_singlesample: @ |
53 | ldr r3, [r1] @ r3 = Ls | 56 | ldr r3, [r1] @ r3 = Ls |
@@ -57,7 +60,7 @@ channels_process_sound_chan_mono: | |||
57 | str r12, [r1] @ store Mo | 60 | str r12, [r1] @ store Mo |
58 | str r12, [r2] @ store Mo | 61 | str r12, [r2] @ store Mo |
59 | @ | 62 | @ |
60 | ldmfd sp!, { r4, pc } @ | 63 | ldmpc regs=r4 @ |
61 | .size channels_process_sound_chan_mono, \ | 64 | .size channels_process_sound_chan_mono, \ |
62 | .-channels_process_sound_chan_mono | 65 | .-channels_process_sound_chan_mono |
63 | 66 | ||
@@ -112,7 +115,7 @@ channels_process_sound_chan_custom: | |||
112 | 115 | ||
113 | bgt .custom_loop | 116 | bgt .custom_loop |
114 | 117 | ||
115 | ldmltfd sp!, { r4-r10, pc } @ < 0? even count | 118 | ldmpc cond=lt, regs=r4-r10 @ < 0? even count |
116 | 119 | ||
117 | .custom_single_sample: | 120 | .custom_single_sample: |
118 | ldr r5, [r1] @ handle odd sample | 121 | ldr r5, [r1] @ handle odd sample |
@@ -131,7 +134,7 @@ channels_process_sound_chan_custom: | |||
131 | str r5, [r1] @ Store Lc0 | 134 | str r5, [r1] @ Store Lc0 |
132 | str r7, [r2] @ Store Rc0 | 135 | str r7, [r2] @ Store Rc0 |
133 | 136 | ||
134 | ldmfd sp!, { r4-r10, pc } | 137 | ldmpc regs=r4-r10 |
135 | .size channels_process_sound_chan_custom, \ | 138 | .size channels_process_sound_chan_custom, \ |
136 | .-channels_process_sound_chan_custom | 139 | .-channels_process_sound_chan_custom |
137 | 140 | ||
@@ -164,7 +167,7 @@ channels_process_sound_chan_karaoke: | |||
164 | stmia r2!, { r12, r14 } @ store Ro0, Ro1 | 167 | stmia r2!, { r12, r14 } @ store Ro0, Ro1 |
165 | bgt .karaokeloop @ | 168 | bgt .karaokeloop @ |
166 | @ | 169 | @ |
167 | ldmltfd sp!, { r4, pc } @ if count was even, we're done | 170 | ldmpc cond=lt, regs=r4 @ if count was even, we're done |
168 | @ | 171 | @ |
169 | .karaoke_singlesample: @ | 172 | .karaoke_singlesample: @ |
170 | ldr r3, [r1] @ r3 = Li | 173 | ldr r3, [r1] @ r3 = Li |
@@ -175,7 +178,7 @@ channels_process_sound_chan_karaoke: | |||
175 | str r3, [r1] @ store Lo | 178 | str r3, [r1] @ store Lo |
176 | str r12, [r2] @ store Ro | 179 | str r12, [r2] @ store Ro |
177 | @ | 180 | @ |
178 | ldmfd sp!, { r4, pc } @ | 181 | ldmpc regs=r4 @ |
179 | .size channels_process_sound_chan_karaoke, \ | 182 | .size channels_process_sound_chan_karaoke, \ |
180 | .-channels_process_sound_chan_karaoke | 183 | .-channels_process_sound_chan_karaoke |
181 | 184 | ||
@@ -225,7 +228,7 @@ sample_output_mono: | |||
225 | subs r0, r0, #2 | 228 | subs r0, r0, #2 |
226 | bgt .somloop | 229 | bgt .somloop |
227 | 230 | ||
228 | ldmltfd sp!, { r4-r6, pc } @ even 'count'? return | 231 | ldmpc cond=lt, regs=r4-r6 @ even 'count'? return |
229 | 232 | ||
230 | .som_singlesample: | 233 | .som_singlesample: |
231 | ldr r5, [r2] @ do odd sample | 234 | ldr r5, [r2] @ do odd sample |
@@ -239,7 +242,7 @@ sample_output_mono: | |||
239 | orr r5, r5, r5, lsl #16 | 242 | orr r5, r5, r5, lsl #16 |
240 | str r5, [r3] | 243 | str r5, [r3] |
241 | 244 | ||
242 | ldmfd sp!, { r4-r6, pc } | 245 | ldmpc regs=r4-r6 |
243 | .size sample_output_mono, .-sample_output_mono | 246 | .size sample_output_mono, .-sample_output_mono |
244 | 247 | ||
245 | /**************************************************************************** | 248 | /**************************************************************************** |
@@ -302,7 +305,7 @@ sample_output_stereo: | |||
302 | subs r0, r0, #2 | 305 | subs r0, r0, #2 |
303 | bgt .sosloop | 306 | bgt .sosloop |
304 | 307 | ||
305 | ldmltfd sp!, { r4-r9, pc } @ even 'count'? return | 308 | ldmpc cond=lt, regs=r4-r9 @ even 'count'? return |
306 | 309 | ||
307 | .sos_singlesample: | 310 | .sos_singlesample: |
308 | ldr r6, [r2] @ left odd sample | 311 | ldr r6, [r2] @ left odd sample |
@@ -324,7 +327,7 @@ sample_output_stereo: | |||
324 | 327 | ||
325 | str r8, [r3] | 328 | str r8, [r3] |
326 | 329 | ||
327 | ldmfd sp!, { r4-r9, pc } | 330 | ldmpc regs=r4-r9 |
328 | .size sample_output_stereo, .-sample_output_stereo | 331 | .size sample_output_stereo, .-sample_output_stereo |
329 | #endif /* ARM_ARCH < 6 */ | 332 | #endif /* ARM_ARCH < 6 */ |
330 | 333 | ||
@@ -387,7 +390,7 @@ apply_crossfeed: | |||
387 | stmia r12, { r8-r11 } @ save filter history | 390 | stmia r12, { r8-r11 } @ save filter history |
388 | str r0, [r12, #30*4] @ save delay line index | 391 | str r0, [r12, #30*4] @ save delay line index |
389 | add sp, sp, #8 @ remove temp variables from stack | 392 | add sp, sp, #8 @ remove temp variables from stack |
390 | ldmia sp!, { r4-r11, pc } | 393 | ldmpc regs=r4-r11 |
391 | .size apply_crossfeed, .-apply_crossfeed | 394 | .size apply_crossfeed, .-apply_crossfeed |
392 | 395 | ||
393 | /**************************************************************************** | 396 | /**************************************************************************** |
@@ -444,7 +447,7 @@ dsp_downsample: | |||
444 | ldr r1, [r3] @ r1 = &dst[0] | 447 | ldr r1, [r3] @ r1 = &dst[0] |
445 | sub r8, r8, r1 @ dst - &dst[0] | 448 | sub r8, r8, r1 @ dst - &dst[0] |
446 | mov r0, r8, lsr #2 @ convert bytes->samples | 449 | mov r0, r8, lsr #2 @ convert bytes->samples |
447 | ldmia sp!, { r4-r11, pc } @ ... and we're out | 450 | ldmpc regs=r4-r11 @ ... and we're out |
448 | .size dsp_downsample, .-dsp_downsample | 451 | .size dsp_downsample, .-dsp_downsample |
449 | 452 | ||
450 | /**************************************************************************** | 453 | /**************************************************************************** |
@@ -507,7 +510,7 @@ dsp_upsample: | |||
507 | sub r8, r8, r2 @ dst - &dst[0] | 510 | sub r8, r8, r2 @ dst - &dst[0] |
508 | mov r0, r8, lsr #2 @ convert bytes->samples | 511 | mov r0, r8, lsr #2 @ convert bytes->samples |
509 | add sp, sp, #8 @ adjust stack for temp variables | 512 | add sp, sp, #8 @ adjust stack for temp variables |
510 | ldmfd sp!, { r4-r11, pc } @ ... and we're out | 513 | ldmpc regs=r4-r11 @ ... and we're out |
511 | .size dsp_upsample, .-dsp_upsample | 514 | .size dsp_upsample, .-dsp_upsample |
512 | 515 | ||
513 | /**************************************************************************** | 516 | /**************************************************************************** |
@@ -554,5 +557,5 @@ dsp_apply_gain: | |||
554 | subs r3, r3, #1 | 557 | subs r3, r3, #1 |
555 | bgt .dag_outerloop @ end of outer loop | 558 | bgt .dag_outerloop @ end of outer loop |
556 | 559 | ||
557 | ldmfd sp!, { r4-r8, pc } | 560 | ldmpc regs=r4-r8 |
558 | .size dsp_apply_gain, .-dsp_apply_gain | 561 | .size dsp_apply_gain, .-dsp_apply_gain |