4 @ this assumes src is word aligned
5 .global mix_16h_to_32 @ int *dest, short *src, int count
15 add r3, r3, r4, asr #1
26 add r4, r4, r12,asr #17 @ we use half volume
28 add r3, r3, r12,asr #17
29 add r6, r6, lr, asr #17
31 add r5, r5, lr, asr #17
41 add r3, r3, r12,asr #17
42 add r4, r4, r5, asr #17
47 ldmeqfd sp!, {r4-r6,pc}
50 add r3, r3, r4, asr #1
58 .global mix_16h_to_32_s1 @ int *dest, short *src, int count
71 add r4, r4, r12,asr #17
73 add r3, r3, r12,asr #17 @ we use half volume
74 add r6, r6, lr, asr #17
76 add r5, r5, lr, asr #17
82 beq m16_32_s1_no_unal2
86 add r3, r3, r12,asr #17
87 add r4, r4, r5, asr #17
92 ldmeqfd sp!, {r4-r6,pc}
95 add r3, r3, r4, asr #1
103 .global mix_16h_to_32_s2 @ int *dest, short *src, int count
106 stmfd sp!, {r4-r6,lr}
116 add r4, r4, r12,asr #17
118 add r3, r3, r12,asr #17 @ we use half volume
119 add r6, r6, lr, asr #17
121 add r5, r5, lr, asr #17
127 beq m16_32_s2_no_unal2
131 add r3, r3, r12,asr #17
132 add r4, r4, r5, asr #17
137 ldmeqfd sp!, {r4-r6,pc}
140 add r3, r3, r4, asr #1
143 ldmfd sp!, {r4-r6,lr}
149 @ reg=int_sample, lr=1, r3=tmp, kills flags
151 add r3, lr, \reg, asr #15
152 bics r3, r3, #1 @ in non-overflow conditions r3 is 0 or 1
158 @ limit and shift up by 16
159 @ reg=int_sample, lr=1, r3=tmp, kills flags
161 @ movs r4, r3, asr #16
163 @ beq c32_16_no_overflow
168 add r3, lr, \reg, asr #15
169 bics r3, r3, #1 @ in non-overflow conditions r3 is 0 or 1
170 moveq \reg, \reg, lsl #16
171 movne \reg, #0x80000000
172 subpl \reg, \reg, #0x00010000
176 @ mix 32bit audio (with 16bits really used, upper bits indicate overflow) with normal 16 bit audio with left channel only
177 @ warning: this function assumes dest is word aligned
178 .global mix_32_to_16l_stereo @ short *dest, int *src, int count
180 mix_32_to_16l_stereo:
181 stmfd sp!, {r4-r8,lr}
194 add r4, r4, r8, asr #16
195 add r5, r5, r8, asr #16
196 add r6, r6, r12,asr #16
197 add r7, r7, r12,asr #16
203 orr r4, r5, r4, lsr #16
204 orr r5, r7, r6, lsr #16
209 @ check for remaining bytes to convert
211 beq m32_16l_st_no_unal2
218 orr r4, r5, r4, lsr #16
222 ldmfd sp!, {r4-r8,lr}
226 @ mix 32bit audio (with 16bits really used, upper bits indicate overflow) with normal 16 bit audio (for mono sound)
227 .global mix_32_to_16_mono @ short *dest, int *src, int count
230 stmfd sp!, {r4-r8,lr}
234 @ check if dest is word aligned
236 beq m32_16_mo_no_unalw
251 add r5, r5, r8, asr #16
253 add r4, r4, r8, asr #16
254 add r7, r7, r12,asr #16
256 add r6, r6, r12,asr #16
262 orr r4, r5, r4, lsr #16
263 orr r5, r7, r6, lsr #16
268 @ check for remaining bytes to convert
270 beq m32_16_mo_no_unal2
273 add r5, r5, r6, asr #16
275 add r4, r4, r6, asr #16
278 orr r4, r5, r4, lsr #16
283 ldmeqfd sp!, {r4-r8,pc}
290 ldmfd sp!, {r4-r8,lr}