/*
	equalizer_3dnow: 3DNow! optimized do_equalizer()

	copyright ?-2006 by the mpg123 project - free software under the terms of the LGPL 2.1
	see COPYING and AUTHORS files in distribution or http://mpg123.org
	initially written by KIMURA Takuhiro
*/

#include "mangle.h"

.text
	ALIGN4
.globl ASM_NAME(do_equalizer_3dnow)
/*	.type	 ASM_NAME(do_equalizer_3dnow),@function */
/* void do_equalizer(real *bandPtr,int channel, real equalizer[2][32]); */
ASM_NAME(do_equalizer_3dnow):
	pushl %esi
	pushl %ebx
	/* bandPtr */
	movl 12(%esp),%ebx
	/* channel */
	movl 16(%esp),%ecx
	xorl %edx,%edx
	/* equalizer */
	movl 20(%esp),%esi
	sall $7,%ecx
	ALIGN4
.L9:
	movq (%ebx,%edx),%mm0
	pfmul (%esi,%ecx),%mm0

	movq 8(%ebx,%edx),%mm1
	pfmul 8(%esi,%ecx),%mm1
	movq %mm0,(%ebx,%edx)
	
	movq 16(%ebx,%edx),%mm0
	pfmul 16(%esi,%ecx),%mm0
	movq %mm1,8(%ebx,%edx)
	
	movq 24(%ebx,%edx),%mm1
	pfmul 24(%esi,%ecx),%mm1
	movq %mm0,16(%ebx,%edx)

	movq 32(%ebx,%edx),%mm0
	pfmul 32(%esi,%ecx),%mm0
	movq %mm1,24(%ebx,%edx)

	movq 40(%ebx,%edx),%mm1
	pfmul 40(%esi,%ecx),%mm1
	movq %mm0,32(%ebx,%edx)
	
	movq 48(%ebx,%edx),%mm0
	pfmul 48(%esi,%ecx),%mm0
	movq %mm1,40(%ebx,%edx)
	
	movq 56(%ebx,%edx),%mm1
	pfmul 56(%esi,%ecx),%mm1
	movq %mm0,48(%ebx,%edx)
	movq %mm1,56(%ebx,%edx)
	
	addl $64,%edx
	addl $32,%ecx
	cmpl $124,%edx
	jle .L9
	ALIGN4
	popl %ebx
	popl %esi
	ret

NONEXEC_STACK