@ 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
@ this assumes src is word aligned
@ limit
@ reg=int_sample, lr=1, r3=tmp, kills flags
.macro Limit reg
- add r3, lr, \reg, asr #16
+ add r3, lr, \reg, asr #15
bics r3, r3, #1 @ in non-overflow conditions r3 is 0 or 1
movne \reg, #0x8000
- submi \reg, \reg, #1
+ subpl \reg, \reg, #1
.endm
@ mov r3, #0x8000
@ subpl r3, r3, #1
- add r3, lr, \reg, asr #16
+ add r3, lr, \reg, asr #15
bics r3, r3, #1 @ in non-overflow conditions r3 is 0 or 1
moveq \reg, \reg, lsl #16
movne \reg, #0x80000000
- submi \reg, \reg, #0x00010000
+ subpl \reg, \reg, #0x00010000
.endm
@ check if dest is word aligned
tst r0, #2
beq m32_16_mo_no_unalw
- ldrsh r5, [r0], #2
+ ldrsh r5, [r0]
ldr r4, [r1], #4
sub r2, r2, #1
add r4, r4, r5
m32_16_mo_no_unal2:
tst r2, #1
ldmeqfd sp!, {r4-r8,pc}
- ldrsh r5, [r0], #2
+ ldrsh r5, [r0]
ldr r4, [r1], #4
add r4, r4, r5
Limit r4