diff options
author | Rob Purchase <shotofadds@rockbox.org> | 2008-06-27 12:39:03 +0000 |
---|---|---|
committer | Rob Purchase <shotofadds@rockbox.org> | 2008-06-27 12:39:03 +0000 |
commit | 39aaa2f2b5ef1efe7dc8cefdf11877ab10231f88 (patch) | |
tree | 007859859e93a06c1696f1c42e5a9b631814200f /firmware | |
parent | 38b02f3d7a372e2c0af5ffb966b72ffad10e1439 (diff) | |
download | rockbox-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
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/target/arm/tcc780x/pcm-tcc780x.c | 13 |
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 | ); |