2 * (C) GraÅžvydas "notaz" Ignotas, 2011
4 * This work is licensed under the terms of any of these licenses
6 * - GNU GPL, version 2 or later.
7 * - GNU LGPL, version 2.1 or later.
8 * See the COPYING file in the top-level directory.
11 #include "arm_features.h"
16 ptr_ChanBuf: .word ESYM(ChanBuf)
17 ptr_SSumLR: .word ESYM(SSumLR)
18 ptr_sRVBStart: .word ESYM(sRVBStart)
24 .macro load_varadr reg var
25 #if defined(__ARM_ARCH_7A__) && !defined(__PIC__)
26 movw \reg, #:lower16:ESYM(\var)
27 movt \reg, #:upper16:ESYM(\var)
28 #elif defined(__ARM_ARCH_7A__) && defined(__MACH__)
29 movw \reg, #:lower16:(ptr_\var-(1678f+8))
30 movt \reg, #:upper16:(ptr_\var-(1678f+8))
40 FUNCTION(mix_chan): @ (int start, int count, int lv, int rv)
42 vmov.32 d14[1], r3 @ multipliers
44 load_varadr r0, ChanBuf
45 load_varadr r2, SSumLR
51 vmul.s32 d10, d14, d0[0]
52 vmul.s32 d11, d14, d0[1]
53 vmul.s32 d12, d14, d1[0]
54 vmul.s32 d13, d14, d1[1]
73 FUNCTION(mix_chan_rvb): @ (int start, int count, int lv, int rv)
75 vmov.32 d14[1], r3 @ multipliers
77 load_varadr r0, ChanBuf
78 load_varadr r3, sRVBStart
79 load_varadr r2, SSumLR
88 vmul.s32 d10, d14, d0[0]
89 vmul.s32 d11, d14, d0[1]
90 vmul.s32 d12, d14, d1[0]
91 vmul.s32 d13, d14, d1[1]
115 #elif defined(HAVE_ARMV5)
117 FUNCTION(mix_chan): @ (int start, int count, int lv, int rv)
118 stmfd sp!, {r4-r8,lr}
119 orr r3, r2, r3, lsl #16
120 lsl r3, #1 @ packed multipliers << 1
122 load_varadr r0, ChanBuf
123 load_varadr r2, SSumLR
129 lsl r4, #1 @ adjust for mul
131 smlawb r6, r4, r3, r6
132 smlawt r7, r4, r3, r7
133 smlawb r8, r5, r3, r8
134 smlawt lr, r5, r3, lr
137 stmia r2!, {r6-r8,lr}
139 ldmeqfd sp!, {r4-r8,pc}
143 ldmfd sp!, {r4-r8,pc}
146 FUNCTION(mix_chan_rvb): @ (int start, int count, int lv, int rv)
147 stmfd sp!, {r4-r8,lr}
148 orr lr, r2, r3, lsl #16
150 load_varadr r3, sRVBStart
151 load_varadr r2, SSumLR
152 load_varadr r4, ChanBuf
154 add r2, r2, r0, lsl #3
155 add r3, r3, r0, lsl #3
156 add r0, r4, r0, lsl #2
162 smlawb r6, r4, lr, r6 @ supposedly takes single cycle?
163 smlawt r7, r4, lr, r7
164 smlawb r8, r4, lr, r8
165 smlawt r12,r4, lr, r12
170 ldmfd sp!, {r4-r8,pc}
174 @ vim:filetype=armasm