@ vim:filetype=armasm
-.global memcpy32 @ int *dest, int *src, int count
-
-memcpy32:
- stmfd sp!, {r4,lr}
-
- subs r2, r2, #4
- bmi mcp32_fin
-
-mcp32_loop:
- ldmia r1!, {r3,r4,r12,lr}
- subs r2, r2, #4
- stmia r0!, {r3,r4,r12,lr}
- bpl mcp32_loop
-
-mcp32_fin:
- tst r2, #3
- ldmeqfd sp!, {r4,pc}
- tst r2, #1
- ldrne r3, [r1], #4
- strne r3, [r0], #4
-
-mcp32_no_unal1:
- tst r2, #2
- ldmneia r1!, {r3,r12}
- ldmfd sp!, {r4,lr}
- stmneia r0!, {r3,r12}
- bx lr
-
-
-
-.global memset32 @ int *dest, int c, int count
-
-memset32:
- stmfd sp!, {lr}
-
- mov r3, r1
- subs r2, r2, #4
- bmi mst32_fin
-
- mov r12,r1
- mov lr, r1
-
-mst32_loop:
- subs r2, r2, #4
- stmia r0!, {r1,r3,r12,lr}
- bpl mst32_loop
-
-mst32_fin:
- tst r2, #1
- strne r1, [r0], #4
-
- tst r2, #2
- stmneia r0!, {r1,r3}
-
- ldmfd sp!, {lr}
- bx lr
+@ Generic routines for mixing audio samples
+@ (c) Copyright 2007, Grazvydas "notaz" Ignotas
+.text
+.align 4
@ this assumes src is word aligned
.global mix_16h_to_32 @ int *dest, short *src, int count
ldmfd sp!, {r4-r8,lr}
bx lr
+
+
+.data
+.align 4
+
+.global mix_32_to_16l_level
+mix_32_to_16l_level:
+ .word 0
+
+.text
+.align 4
+
+@ same as mix_32_to_16l_stereo, but with additional shift
+.global mix_32_to_16l_stereo_lvl @ short *dest, int *src, int count
+
+mix_32_to_16l_stereo_lvl:
+ stmfd sp!, {r4-r9,lr}
+
+ ldr r9, =mix_32_to_16l_level
+ mov lr, #1
+ ldr r9, [r9]
+
+ mov r2, r2, lsl #1
+ subs r2, r2, #4
+ bmi m32_16l_st_l_end
+
+m32_16l_st_l_loop:
+ ldmia r0, {r8,r12}
+ ldmia r1!, {r4-r7}
+ mov r8, r8, lsl #16
+ mov r12,r12,lsl #16
+ add r4, r4, r8, asr #16
+ add r5, r5, r8, asr #16
+ add r6, r6, r12,asr #16
+ add r7, r7, r12,asr #16
+ mov r4, r4, asr r9
+ mov r5, r5, asr r9
+ mov r6, r6, asr r9
+ mov r7, r7, asr r9
+ Limitsh r4
+ Limitsh r5
+ Limitsh r6
+ Limitsh r7
+ subs r2, r2, #4
+ orr r4, r5, r4, lsr #16
+ orr r5, r7, r6, lsr #16
+ stmia r0!, {r4,r5}
+ bpl m32_16l_st_l_loop
+
+m32_16l_st_l_end:
+ @ check for remaining bytes to convert
+ tst r2, #2
+ beq m32_16l_st_l_no_unal2
+ ldrsh r6, [r0]
+ ldmia r1!,{r4,r5}
+ add r4, r4, r6
+ add r5, r5, r6
+ mov r4, r4, asr r9
+ mov r5, r5, asr r9
+ Limitsh r4
+ Limitsh r5
+ orr r4, r5, r4, lsr #16
+ str r4, [r0], #4
+
+m32_16l_st_l_no_unal2:
+ ldmfd sp!, {r4-r9,lr}
+ bx lr
+
+