diff options
author | Andree Buschmann <AndreeBuschmann@t-online.de> | 2010-07-10 00:11:39 +0000 |
---|---|---|
committer | Andree Buschmann <AndreeBuschmann@t-online.de> | 2010-07-10 00:11:39 +0000 |
commit | 2f271ac54af1f481bd30b9d37240e52dc31c0c0e (patch) | |
tree | 43390b28247bc790d5510b5f0278cafdb36e3316 /apps/codecs/libfaad | |
parent | e7ffe1cd4a52960aa4c1a724dccfcde1e05cb17d (diff) | |
download | rockbox-2f271ac54af1f481bd30b9d37240e52dc31c0c0e.tar.gz rockbox-2f271ac54af1f481bd30b9d37240e52dc31c0c0e.zip |
Just another MHz saved on ARM for aac he decoding.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27365 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/codecs/libfaad')
-rw-r--r-- | apps/codecs/libfaad/sbr_qmf.c | 45 |
1 files changed, 43 insertions, 2 deletions
diff --git a/apps/codecs/libfaad/sbr_qmf.c b/apps/codecs/libfaad/sbr_qmf.c index 3651eedf95..944e619c5a 100644 --- a/apps/codecs/libfaad/sbr_qmf.c +++ b/apps/codecs/libfaad/sbr_qmf.c | |||
@@ -109,7 +109,7 @@ void sbr_qmf_analysis_32(sbr_info *sbr, qmfa_info *qmfa, const real_t *input, | |||
109 | /* window and summation to create array u */ | 109 | /* window and summation to create array u */ |
110 | for (n = 0; n < 64; n++) | 110 | for (n = 0; n < 64; n++) |
111 | { | 111 | { |
112 | idx0 = qmfa->x_index + n; idx1 = n * 2 * 5; | 112 | idx0 = qmfa->x_index + n; idx1 = n * 10; |
113 | u[n] = FAAD_ANALYSIS_SCALE1( | 113 | u[n] = FAAD_ANALYSIS_SCALE1( |
114 | MUL_F(qmfa->x[idx0 ], qmf_c[idx1 ]) + | 114 | MUL_F(qmfa->x[idx0 ], qmf_c[idx1 ]) + |
115 | MUL_F(qmfa->x[idx0 + 64], qmf_c[idx1 + 2]) + | 115 | MUL_F(qmfa->x[idx0 + 64], qmf_c[idx1 + 2]) + |
@@ -512,7 +512,7 @@ void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][6 | |||
512 | p_buf_1 = qmfs->v + qmfs->v_index; | 512 | p_buf_1 = qmfs->v + qmfs->v_index; |
513 | 513 | ||
514 | /* calculate 64 output samples and window */ | 514 | /* calculate 64 output samples and window */ |
515 | 515 | #if !defined(CPU_ARM) | |
516 | for (k = 0; k < 64; k++) | 516 | for (k = 0; k < 64; k++) |
517 | { | 517 | { |
518 | idx0 = k*10; | 518 | idx0 = k*10; |
@@ -528,6 +528,47 @@ void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][6 | |||
528 | MUL_F(p_buf_1[k+1024 ], qmf_c[idx0+8]) + | 528 | MUL_F(p_buf_1[k+1024 ], qmf_c[idx0+8]) + |
529 | MUL_F(p_buf_1[k+1024+192], qmf_c[idx0+9])); | 529 | MUL_F(p_buf_1[k+1024+192], qmf_c[idx0+9])); |
530 | } | 530 | } |
531 | #else | ||
532 | const real_t *qtab = qmf_c; | ||
533 | real_t *pbuf = p_buf_1; | ||
534 | for (k = 0; k < 64; k++, pbuf++) | ||
535 | { | ||
536 | real_t *pout = &output[out++]; | ||
537 | asm volatile ( | ||
538 | "ldmia %[qtab]!, { r0-r3 } \n\t" | ||
539 | "ldr r4, [%[pbuf]] \n\t" | ||
540 | "smull r5, r6, r4, r0 \n\t" | ||
541 | "ldr r4, [%[pbuf], #192*4] \n\t" | ||
542 | "smlal r5, r6, r4, r1 \n\t" | ||
543 | "ldr r4, [%[pbuf], #256*4] \n\t" | ||
544 | "smlal r5, r6, r4, r2 \n\t" | ||
545 | "ldr r4, [%[pbuf], #448*4] \n\t" | ||
546 | "smlal r5, r6, r4, r3 \n\t" | ||
547 | |||
548 | "ldmia %[qtab]!, { r0-r3 } \n\t" | ||
549 | "ldr r4, [%[pbuf], #512*4] \n\t" | ||
550 | "smlal r5, r6, r4, r0 \n\t" | ||
551 | "ldr r4, [%[pbuf], #704*4] \n\t" | ||
552 | "smlal r5, r6, r4, r1 \n\t" | ||
553 | "ldr r4, [%[pbuf], #768*4] \n\t" | ||
554 | "smlal r5, r6, r4, r2 \n\t" | ||
555 | "ldr r4, [%[pbuf], #960*4] \n\t" | ||
556 | "smlal r5, r6, r4, r3 \n\t" | ||
557 | |||
558 | "ldmia %[qtab]!, { r0-r1 } \n\t" | ||
559 | "mov r2, #1024*4 \n\t" | ||
560 | "ldr r4, [%[pbuf], r2] \n\t" | ||
561 | "smlal r5, r6, r4, r0 \n\t" | ||
562 | "mov r2, #1216*4 \n\t" | ||
563 | "ldr r4, [%[pbuf], r2] \n\t" | ||
564 | "smlal r5, r6, r4, r1 \n\t" | ||
565 | |||
566 | "str r6, [%[pout]] \n" | ||
567 | : [qtab] "+r" (qtab) | ||
568 | : [pbuf] "r" (pbuf), [pout] "r" (pout) | ||
569 | : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "memory"); | ||
570 | } | ||
571 | #endif | ||
531 | 572 | ||
532 | /* update ringbuffer index */ | 573 | /* update ringbuffer index */ |
533 | qmfs->v_index -= 128; | 574 | qmfs->v_index -= 128; |