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 .macro load_varadr reg var
17 #if defined(__ARM_ARCH_7A__) && !defined(__PIC__)
18 movw \reg, #:lower16:\var
19 movt \reg, #:upper16:\var
27 .global mix_chan @ (int start, int count, int lv, int rv)
30 vmov.32 d14[1], r3 @ multipliers
32 load_varadr r0, ChanBuf
33 load_varadr r2, SSumLR
39 vmul.s32 d10, d14, d0[0]
40 vmul.s32 d11, d14, d0[1]
41 vmul.s32 d12, d14, d1[0]
42 vmul.s32 d13, d14, d1[1]
61 .global mix_chan_rvb @ (int start, int count, int lv, int rv)
64 vmov.32 d14[1], r3 @ multipliers
66 load_varadr r0, ChanBuf
67 load_varadr r3, sRVBStart
68 load_varadr r2, SSumLR
77 vmul.s32 d10, d14, d0[0]
78 vmul.s32 d11, d14, d0[1]
79 vmul.s32 d12, d14, d1[0]
80 vmul.s32 d13, d14, d1[1]
104 #elif defined(HAVE_ARMV5)
106 .global mix_chan @ (int start, int count, int lv, int rv)
108 stmfd sp!, {r4-r8,lr}
109 orr r3, r2, r3, lsl #16
110 lsl r3, #1 @ packed multipliers << 1
112 load_varadr r0, ChanBuf
113 load_varadr r2, SSumLR
119 lsl r4, #1 @ adjust for mul
121 smlawb r6, r4, r3, r6
122 smlawt r7, r4, r3, r7
123 smlawb r8, r5, r3, r8
124 smlawt lr, r5, r3, lr
127 stmia r2!, {r6-r8,lr}
129 ldmeqfd sp!, {r4-r8,pc}
133 ldmfd sp!, {r4-r8,pc}
136 .global mix_chan_rvb @ (int start, int count, int lv, int rv)
138 stmfd sp!, {r4-r8,lr}
139 orr lr, r2, r3, lsl #16
141 load_varadr r3, sRVBStart
142 load_varadr r2, SSumLR
143 load_varadr r4, ChanBuf
145 add r2, r2, r0, lsl #3
146 add r3, r3, r0, lsl #3
147 add r0, r4, r0, lsl #2
153 smlawb r6, r4, lr, r6 @ supposedly takes single cycle?
154 smlawt r7, r4, lr, r7
155 smlawb r8, r4, lr, r8
156 smlawt r12,r4, lr, r12
161 ldmfd sp!, {r4-r8,pc}
165 @ vim:filetype=armasm