1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2010 Yoshihisa Uchida
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
25 * The following are assembler optimised version of
26 * void hybrid_filter(fltst *fs, int *in)
30 .section .icode, "ax", %progbits
36 .type hybrid_filter, %function
39 @ input: r0 = fs, r1 = in
40 stmdb sp!, {r4 - r12, lr}
43 @ r2 pA := fs->dl + fs->index
44 @ r3 pM := fs->dx + fs->index
50 add r2, r0, #148 @ r2 = fs->dl
51 add r3, r0, #52 @ r3 = fs->dx
52 add r4, r0, #20 @ r4 = fs->qm
53 ldmia r0, {r5, r6, lr} @ r5 = fs->index
57 add r2, r2, r5 @ r2 = fs->dl + fs->index
58 add r3, r3, r5 @ r3 = fs->dx + fs->index
66 ldmia r4!, {r5, r6, r7, r8 }
67 ldmia r2!, {r9, r10, r11, r12}
72 ldmia r4!, {r5, r6, r7, r8 }
80 ldmia r4, {r5, r6, r7, r8 }
81 ldmia r3!, {r9, r10, r11, r12}
86 stmia r4!, {r5, r6, r7, r8 } @ update fs->qm[0], ..., fs->qm[3]
87 ldmia r2!, {r9, r10, r11, r12}
92 ldmia r4, {r5, r6, r7, r8 }
93 ldmia r3!, {r9, r10, r11, r12}
98 stmia r4!, {r5, r6, r7, r8 } @ update fs->qm[4], ..., fs->qm[7]
104 ldmia r4, {r5, r6, r7, r8 }
105 ldmia r3!, {r9, r10, r11, r12}
110 stmia r4!, {r5, r6, r7, r8 } @ update fs->qm[0], ..., fs->qm[3]
111 ldmia r2!, {r9, r10, r11, r12}
116 ldmia r4, {r5, r6, r7, r8 }
117 ldmia r3!, {r9, r10, r11, r12}
122 stmia r4!, {r5, r6, r7, r8 } @ update fs->qm[4], ..., fs->qm[7]
125 ldmia r2!, {r9, r10, r11, r12}
132 @ *in += (sum >> fs->shift)
135 ldr r5, [r1] @ r5 = *in
136 ldr r6, [r0, #12] @ r6 = fs->shift
137 add lr, r5, lr, asr r6
138 str lr, [r1] @ *in += (sum >> fs->shift)
142 ldr r1, [r0] @ r1 = fs->index
144 ands r1, r1, #15 @ set Z flag (after this, CPSR must keep !!)
145 stmia r0, {r1, r5} @ fs->index = (++fs->index & 15)
146 @ fs->error = (original) *in
148 @ change *pM, *(pM-1), *(pM-2), *(pM-3)
149 @ r9 = *(pA-4), r5 = *(pM-3)
150 @ r10 = *(pA-3), r6 = *(pM-2)
151 @ r11 = *(pA-2), r7 = *(pM-1)
152 @ r12 = *(pA-1), r8 = *(pM-0)
156 orr r5, r4, r9, asr #30
157 orr r6, r4, r10, asr #30
158 orr r7, r4, r11, asr #30
159 orr r8, r4, r12, asr #30
164 @ change *(pA-1), *(pA-2), *(pA-3)
169 @ check fs->index is zero
172 @ set to the memory: *pA, *(pA-1), *(pA-2), *(pA-3), *pM, *(pM-1), *(pM-2), *(pM-3)
173 stmda r2, {r10, r11, r12, lr}
174 stmda r3, {r5, r6, r7, r8}
175 ldmfd sp!, {r4-r12, pc} @ hybrid_filter end (when fs->index != 0)
179 @ r9 = fs->dl[16 + 3]
180 @ r10 = fs->dl[16 + 4]
181 @ r11 = fs->dl[16 + 5]
182 @ r12 = fs->dl[16 + 6]
183 @ lr = fs->dl[16 + 7]
185 add r2, r0, #212 @ r2 = fs->dl + 16
186 ldmia r2, {r1, r3, r4}
187 sub r2, r2, #64 @ r2 = fs->dl
188 stmia r2, {r1, r3, r4, r9 - r12, lr}
191 @ r5 = fs->dx[16 + 4]
192 @ r6 = fs->dx[16 + 5]
193 @ r7 = fs->dx[16 + 6]
194 @ r8 = fs->dx[16 + 7]
196 add r9, r0, #116 @ r9 = fs->dx + 16
197 ldmia r9, {r1, r2, r3, r4}
198 sub r9, r9, #64 @ r9 = fs->dx
200 ldmfd sp!, {r4 - r12, pc} @ hybrid_filter end (when fs->index == 0)
203 .size hybrid_filter, hybrid_filter_end - hybrid_filter