79 lines
1.5 KiB
ArmAsm
79 lines
1.5 KiB
ArmAsm
# MMX 16-bit signed audio MIX function
|
|
# by Matt Ownby - May 7th, 2007
|
|
# For GNU Assembler
|
|
|
|
.data
|
|
|
|
.globl _asm_pSampleDst
|
|
_asm_pSampleDst:
|
|
.space 8
|
|
|
|
.globl _asm_pMixBufs
|
|
_asm_pMixBufs:
|
|
.space 4
|
|
|
|
.globl _asm_uBytesToMix
|
|
_asm_uBytesToMix:
|
|
.space 4
|
|
|
|
####################################
|
|
|
|
.text
|
|
|
|
.globl _mix_mmx
|
|
_mix_mmx:
|
|
|
|
push %ebp # needs to be preserved
|
|
push %esi # points to sample2
|
|
push %ebx # # of iterations we are to do
|
|
push %ecx # # of iterations we have done
|
|
push %edx # points to sample1
|
|
# eax points to the destination buffer, but eax doesn't need to be preserved because
|
|
# it is assumed to hold the return value
|
|
|
|
####################
|
|
|
|
movl _asm_uBytesToMix, %ebx
|
|
xorl %ecx, %ecx # ecx = 0
|
|
movl _asm_pSampleDst, %eax
|
|
|
|
MainLoop:
|
|
# NOTE : for optimization purposes, we assume that asm_pMixBufs is never NULL
|
|
movl _asm_pMixBufs, %edx
|
|
|
|
pxor %mm0, %mm0 ; mm0 = 0
|
|
|
|
MoreStreams:
|
|
# get pMixBuf
|
|
mov (%edx), %esi
|
|
|
|
# edx = edx->next pointer
|
|
mov 4(%edx), %edx
|
|
|
|
# add bytes together with each other, 16-bit signed with 'saturation' (clipping)
|
|
paddsw (%esi,%ecx), %mm0
|
|
|
|
# is edx 0?
|
|
test $-1, %edx
|
|
jnz MoreStreams
|
|
|
|
movq %mm0, (%eax, %ecx) # store final result back to system memory
|
|
|
|
add $8, %ecx # advance index over the 8 bytes we've just handled
|
|
cmp %ebx, %ecx # is our current index less than the total iterations ?
|
|
|
|
jl MainLoop # if we have more iterations to do, then loop
|
|
|
|
#####################
|
|
|
|
emms
|
|
|
|
pop %edx
|
|
pop %ecx
|
|
pop %ebx
|
|
pop %esi
|
|
pop %ebp
|
|
|
|
ret
|
|
|
|
####################################################
|