3 .global memcpy32 @ int *dest, int *src, int count
12 ldmia r1!, {r3,r4,r12,lr}
14 stmia r0!, {r3,r4,r12,lr}
33 .global memset32 @ int *dest, int c, int count
47 stmia r0!, {r1,r3,r12,lr}
62 @ this assumes src is word aligned
63 .global mix_16h_to_32 @ int *dest, short *src, int count
73 add r3, r3, r4, asr #1
84 add r4, r4, r12,asr #17 @ we use half volume
86 add r3, r3, r12,asr #17
87 add r6, r6, lr, asr #17
89 add r5, r5, lr, asr #17
99 add r3, r3, r12,asr #17
100 add r4, r4, r5, asr #17
105 ldmeqfd sp!, {r4-r6,pc}
108 add r3, r3, r4, asr #1
111 ldmfd sp!, {r4-r6,lr}
116 .global mix_16h_to_32_s1 @ int *dest, short *src, int count
119 stmfd sp!, {r4-r6,lr}
129 add r4, r4, r12,asr #17
131 add r3, r3, r12,asr #17 @ we use half volume
132 add r6, r6, lr, asr #17
134 add r5, r5, lr, asr #17
140 beq m16_32_s1_no_unal2
144 add r3, r3, r12,asr #17
145 add r4, r4, r5, asr #17
150 ldmeqfd sp!, {r4-r6,pc}
153 add r3, r3, r4, asr #1
156 ldmfd sp!, {r4-r6,lr}
161 .global mix_16h_to_32_s2 @ int *dest, short *src, int count
164 stmfd sp!, {r4-r6,lr}
174 add r4, r4, r12,asr #17
176 add r3, r3, r12,asr #17 @ we use half volume
177 add r6, r6, lr, asr #17
179 add r5, r5, lr, asr #17
185 beq m16_32_s2_no_unal2
189 add r3, r3, r12,asr #17
190 add r4, r4, r5, asr #17
195 ldmeqfd sp!, {r4-r6,pc}
198 add r3, r3, r4, asr #1
201 ldmfd sp!, {r4-r6,lr}
207 @ reg=int_sample, lr=1, r3=tmp, kills flags
209 add r3, lr, \reg, asr #16
210 bics r3, r3, #1 @ in non-overflow conditions r3 is 0 or 1
216 @ limit and shift up by 16
217 @ reg=int_sample, lr=1, r3=tmp, kills flags
219 @ movs r4, r3, asr #16
221 @ beq c32_16_no_overflow
226 add r3, lr, \reg, asr #16
227 bics r3, r3, #1 @ in non-overflow conditions r3 is 0 or 1
228 moveq \reg, \reg, lsl #16
229 movne \reg, #0x80000000
230 submi \reg, \reg, #0x00010000
234 @ mix 32bit audio (with 16bits really used, upper bits indicate overflow) with normal 16 bit audio with left channel only
235 @ warning: this function assumes dest is word aligned
236 .global mix_32_to_16l_stereo @ short *dest, int *src, int count
238 mix_32_to_16l_stereo:
239 stmfd sp!, {r4-r8,lr}
252 add r4, r4, r8, asr #16
253 add r5, r5, r8, asr #16
254 add r6, r6, r12,asr #16
255 add r7, r7, r12,asr #16
261 orr r4, r5, r4, lsr #16
262 orr r5, r7, r6, lsr #16
267 @ check for remaining bytes to convert
269 beq m32_16l_st_no_unal2
276 orr r4, r5, r4, lsr #16
280 ldmfd sp!, {r4-r8,lr}
284 @ mix 32bit audio (with 16bits really used, upper bits indicate overflow) with normal 16 bit audio (for mono sound)
285 .global mix_32_to_16_mono @ short *dest, int *src, int count
288 stmfd sp!, {r4-r8,lr}
292 @ check if dest is word aligned
294 beq m32_16_mo_no_unalw
309 add r5, r5, r8, asr #16
311 add r4, r4, r8, asr #16
312 add r7, r7, r12,asr #16
314 add r6, r6, r12,asr #16
320 orr r4, r5, r4, lsr #16
321 orr r5, r7, r6, lsr #16
326 @ check for remaining bytes to convert
328 beq m32_16_mo_no_unal2
331 add r5, r5, r6, asr #16
333 add r4, r4, r6, asr #16
336 orr r4, r5, r4, lsr #16
341 ldmeqfd sp!, {r4-r8,pc}
348 ldmfd sp!, {r4-r8,lr}