autodetection: convert path to native separators before displaying it.
[Rockbox.git] / apps / codecs / libmusepack / synth_filter_arm.S
blobce668e888ca439ffa951af95c3b355e8828e1280
1 /***************************************************************************\r
2  *             __________               __   ___.\r
3  *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___\r
4  *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /\r
5  *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <\r
6  *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \\r
7  *                     \/            \/     \/    \/            \/\r
8  * $Id$\r
9  *\r
10  * Copyright (C) 2008 by Andree Buschmann\r
11  *\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
14  *\r
15  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY\r
16  * KIND, either express or implied.\r
17  *\r
18  ****************************************************************************/\r
19  \r
20 #include "mpc_config.h"\r
22     .section .text, "ax", %progbits\r
23     \r
24 /****************************************************************************\r
25  * void mpc_decoder_windowing_D(...)\r
26  * \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
32     .align  2\r
33     .global mpc_decoder_windowing_D\r
34     .type   mpc_decoder_windowing_D, %function\r
35 mpc_decoder_windowing_D:\r
36     /* r0 = Data[] */\r
37     /* r1 = V[] */\r
38     /* r2 = D[] */\r
39     /* lr = counter */\r
40     \r
41     stmfd   sp!, {r4-r12, lr}\r
42     \r
43     mov lr, #32\r
44 .loop32:\r
45     ldmia r2!, { r3-r10 }   /* load first 8 window coefficients */\r
46     ldr r11, [r1]           /*  0 */\r
47     mul r12, r3, r11         \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
81     \r
82     subs lr, lr, #1\r
83     bgt .loop32\r
84     \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
88 #else\r
89 /****************************************************************************\r
90  * void mpc_decoder_windowing_D(...)\r
91  * \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
98     .align  2\r
99     .global mpc_decoder_windowing_D\r
100     .type   mpc_decoder_windowing_D, %function\r
101 mpc_decoder_windowing_D:\r
102     /* r0 = Data[] */\r
103     /* r1 = V[] */\r
104     /* r2 = D[] */\r
105     /* lr = counter */\r
106     \r
107     stmfd   sp!, {r4-r12, lr}\r
108     \r
109     mov lr, #32\r
110 .loop32:\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
148     \r
149     subs lr, lr, #1\r
150     bgt .loop32\r
151     \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
155 #endif\r