1 /***************************************************************************
\r
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
\r
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
\r
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
\r
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
\r
10 * Copyright (C) 2008 by Andree Buschmann
\r
12 * All files in this archive are subject to the GNU General Public License.
\r
13 * See the file COPYING in the source tree root for full license agreement.
\r
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
\r
16 * KIND, either express or implied.
\r
18 ****************************************************************************/
\r
20 #include "mpc_config.h"
\r
22 .section .text, "ax", %progbits
\r
24 /****************************************************************************
\r
25 * void mpc_decoder_windowing_D(...)
\r
27 * 2nd step within synthesis filter. Does the dewindowing.
\r
28 * 32=32x32 multiplies (OPTIMIZE_FOR_SPEED)
\r
29 * Uses pre-shifted V[] and D[] values.
\r
30 ****************************************************************************/
\r
31 #if defined(OPTIMIZE_FOR_SPEED)
\r
33 .global mpc_decoder_windowing_D
\r
34 .type mpc_decoder_windowing_D, %function
\r
35 mpc_decoder_windowing_D:
\r
41 stmfd sp!, {r4-r12, lr}
\r
45 ldmia r2!, { r3-r10 } /* load first 8 window coefficients */
\r
46 ldr r11, [r1] /* 0 */
\r
48 ldr r11, [r1, #96*4] /* 1 */
\r
49 mla r12, r4, r11, r12
\r
50 ldr r11, [r1, #128*4] /* 2 */
\r
51 mla r12, r5, r11, r12
\r
52 ldr r11, [r1, #224*4] /* 3 */
\r
53 mla r12, r6, r11, r12
\r
54 ldr r11, [r1, #256*4] /* 4 */
\r
55 mla r12, r7, r11, r12
\r
56 ldr r11, [r1, #352*4] /* 5 */
\r
57 mla r12, r8, r11, r12
\r
58 ldr r11, [r1, #384*4] /* 6 */
\r
59 mla r12, r9, r11, r12
\r
60 ldr r11, [r1, #480*4] /* 7 */
\r
61 mla r12, r10, r11, r12
\r
62 ldmia r2!, { r3-r10 } /* load last 8 window coefficients */
\r
63 ldr r11, [r1, #512*4] /* 8 */
\r
64 mla r12, r3, r11, r12
\r
65 ldr r11, [r1, #608*4] /* 9 */
\r
66 mla r12, r4, r11, r12
\r
67 ldr r11, [r1, #640*4] /* 10 */
\r
68 mla r12, r5, r11, r12
\r
69 ldr r11, [r1, #736*4] /* 11 */
\r
70 mla r12, r6, r11, r12
\r
71 ldr r11, [r1, #768*4] /* 12 */
\r
72 mla r12, r7, r11, r12
\r
73 ldr r11, [r1, #864*4] /* 13 */
\r
74 mla r12, r8, r11, r12
\r
75 ldr r11, [r1, #896*4] /* 14 */
\r
76 mla r12, r9, r11, r12
\r
77 ldr r11, [r1, #992*4] /* 15 */
\r
78 mla r12, r10, r11, r12
\r
79 str r12, [r0], #4 /* store Data */
\r
80 add r1, r1, #4 /* V++ */
\r
85 ldmfd sp!, {r4-r12, pc}
\r
86 .mpc_dewindowing_end:
\r
87 .size mpc_decoder_windowing_D,.mpc_dewindowing_end-mpc_decoder_windowing_D
\r
89 /****************************************************************************
\r
90 * void mpc_decoder_windowing_D(...)
\r
92 * 2nd step within synthesis filter. Does the dewindowing.
\r
93 * 64=32x32 multiplies
\r
94 * Drops lo-part of 64bit multiply results and will therefor loose 1 bit
\r
95 * accuracy. The decoder output is binary identical as this imprecision is
\r
96 * far below the output's 16bit resolution.
\r
97 ****************************************************************************/
\r
99 .global mpc_decoder_windowing_D
\r
100 .type mpc_decoder_windowing_D, %function
\r
101 mpc_decoder_windowing_D:
\r
107 stmfd sp!, {r4-r12, lr}
\r
111 ldmia r2!, { r3-r10 } /* load first 8 window coefficients */
\r
112 ldr r11, [r1] /* 0 */
\r
113 smull r11, r12, r3, r11
\r
114 ldr r11, [r1, #96*4] /* 1 */
\r
115 smlal r11, r12, r4, r11
\r
116 ldr r11, [r1, #128*4] /* 2 */
\r
117 smlal r11, r12, r5, r11
\r
118 ldr r11, [r1, #224*4] /* 3 */
\r
119 smlal r11, r12, r6, r11
\r
120 ldr r11, [r1, #256*4] /* 4 */
\r
121 smlal r11, r12, r7, r11
\r
122 ldr r11, [r1, #352*4] /* 5 */
\r
123 smlal r11, r12, r8, r11
\r
124 ldr r11, [r1, #384*4] /* 6 */
\r
125 smlal r11, r12, r9, r11
\r
126 ldr r11, [r1, #480*4] /* 7 */
\r
127 smlal r11, r12, r10, r11
\r
128 ldmia r2!, { r3-r10 } /* load last 8 window coefficients */
\r
129 ldr r11, [r1, #512*4] /* 8 */
\r
130 smlal r11, r12, r3, r11
\r
131 ldr r11, [r1, #608*4] /* 9 */
\r
132 smlal r11, r12, r4, r11
\r
133 ldr r11, [r1, #640*4] /* 10 */
\r
134 smlal r11, r12, r5, r11
\r
135 ldr r11, [r1, #736*4] /* 11 */
\r
136 smlal r11, r12, r6, r11
\r
137 ldr r11, [r1, #768*4] /* 12 */
\r
138 smlal r11, r12, r7, r11
\r
139 ldr r11, [r1, #864*4] /* 13 */
\r
140 smlal r11, r12, r8, r11
\r
141 ldr r11, [r1, #896*4] /* 14 */
\r
142 smlal r11, r12, r9, r11
\r
143 ldr r11, [r1, #992*4] /* 15 */
\r
144 smlal r11, r12, r10, r11
\r
145 mov r4, r12, lsl #1 /* get result from hi-part */
\r
146 str r4, [r0], #4 /* store Data */
\r
147 add r1, r1, #4 /* V++ */
\r
152 ldmfd sp!, {r4-r12, pc}
\r
153 .mpc_dewindowing_end:
\r
154 .size mpc_decoder_windowing_D,.mpc_dewindowing_end-mpc_decoder_windowing_D
\r