summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Purchase <shotofadds@rockbox.org>2008-06-27 12:39:03 +0000
committerRob Purchase <shotofadds@rockbox.org>2008-06-27 12:39:03 +0000
commit39aaa2f2b5ef1efe7dc8cefdf11877ab10231f88 (patch)
tree007859859e93a06c1696f1c42e5a9b631814200f
parent38b02f3d7a372e2c0af5ffb966b72ffad10e1439 (diff)
downloadrockbox-39aaa2f2b5ef1efe7dc8cefdf11877ab10231f88.tar.gz
rockbox-39aaa2f2b5ef1efe7dc8cefdf11877ab10231f88.zip
D2: Small optimisation to the PCM FIQ (only stack registers when necessary).
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17806 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/target/arm/tcc780x/pcm-tcc780x.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/firmware/target/arm/tcc780x/pcm-tcc780x.c b/firmware/target/arm/tcc780x/pcm-tcc780x.c
index 7db775d4c7..c20651a99a 100644
--- a/firmware/target/arm/tcc780x/pcm-tcc780x.c
+++ b/firmware/target/arm/tcc780x/pcm-tcc780x.c
@@ -209,8 +209,10 @@ void fiq_handler(void)
209 * r8 and r9 contains local copies of p and size respectively. 209 * r8 and r9 contains local copies of p and size respectively.
210 * r0-r3 and r12 is a working register. 210 * r0-r3 and r12 is a working register.
211 */ 211 */
212 asm volatile ( 212 asm volatile (
213 "stmfd sp!, { r0-r3, lr } \n" /* stack scratch regs and lr */ 213 "mov r8, #0xc000 \n" /* DAI_TX_IRQ_MASK | DAI_RX_IRQ_MASK */
214 "ldr r9, =0xf3001004 \n" /* CREQ */
215 "str r8, [r9] \n" /* clear DAI IRQs */
214 216
215 "ldmia r11, { r8-r9 } \n" /* r8 = p, r9 = size */ 217 "ldmia r11, { r8-r9 } \n" /* r8 = p, r9 = size */
216 "cmp r9, #0x10 \n" /* is size <16? */ 218 "cmp r9, #0x10 \n" /* is size <16? */
@@ -237,13 +239,10 @@ void fiq_handler(void)
237 "stmia r11, { r8-r9 } \n" /* save p and size */ 239 "stmia r11, { r8-r9 } \n" /* save p and size */
238 240
239 ".exit: \n" 241 ".exit: \n"
240 "mov r8, #0xc000 \n" /* DAI_TX_IRQ_MASK | DAI_RX_IRQ_MASK */
241 "ldr r9, =0xf3001004 \n" /* CREQ */
242 "str r8, [r9] \n" /* clear DAI IRQs */
243 "ldmfd sp!, { r0-r3, lr } \n"
244 "subs pc, lr, #4 \n" /* FIQ specific return sequence */ 242 "subs pc, lr, #4 \n" /* FIQ specific return sequence */
245 243
246 ".more_data: \n" 244 ".more_data: \n"
245 "stmfd sp!, { r0-r3, lr } \n" /* stack scratch regs and lr */
247 "ldr r2, =pcm_callback_for_more \n" 246 "ldr r2, =pcm_callback_for_more \n"
248 "ldr r2, [r2] \n" /* get callback address */ 247 "ldr r2, [r2] \n" /* get callback address */
249 "cmp r2, #0 \n" /* check for null pointer */ 248 "cmp r2, #0 \n" /* check for null pointer */
@@ -252,11 +251,13 @@ void fiq_handler(void)
252 "blxne r2 \n" /* call pcm_callback_for_more */ 251 "blxne r2 \n" /* call pcm_callback_for_more */
253 "ldmia r11, { r8-r9 } \n" /* reload p and size */ 252 "ldmia r11, { r8-r9 } \n" /* reload p and size */
254 "cmp r9, #0x10 \n" /* did we actually get more data? */ 253 "cmp r9, #0x10 \n" /* did we actually get more data? */
254 "ldmgefd sp!, { r0-r3, lr } \n"
255 "bge .fill_fifo \n" /* yes: fill the fifo */ 255 "bge .fill_fifo \n" /* yes: fill the fifo */
256 "ldr r12, =pcm_play_dma_stop \n" 256 "ldr r12, =pcm_play_dma_stop \n"
257 "blx r12 \n" /* no: stop playback */ 257 "blx r12 \n" /* no: stop playback */
258 "ldr r12, =pcm_play_dma_stopped_callback \n" 258 "ldr r12, =pcm_play_dma_stopped_callback \n"
259 "blx r12 \n" 259 "blx r12 \n"
260 "ldmfd sp!, { r0-r3, lr } \n"
260 "b .exit \n" 261 "b .exit \n"
261 ".ltorg \n" 262 ".ltorg \n"
262 ); 263 );