From 8594ea6dbcdeea0dbdeb5c798446bb03e46af878 Mon Sep 17 00:00:00 2001 From: nick Date: Fri, 18 Jan 2002 09:58:43 +0000 Subject: [PATCH] 3dnow optimization. Not all functions are tested!!! git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@4234 b3059339-0415-0410-9bf9-f77b7e298cf2 --- liba52/downmix.c | 614 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 614 insertions(+) diff --git a/liba52/downmix.c b/liba52/downmix.c index 75c823f244..2f8b80106e 100644 --- a/liba52/downmix.c +++ b/liba52/downmix.c @@ -41,6 +41,8 @@ void (*upmix)(sample_t * samples, int acmod, int output)= NULL; static void downmix_SSE (sample_t * samples, int acmod, int output, sample_t bias, sample_t clev, sample_t slev); +static void downmix_3dnow (sample_t * samples, int acmod, int output, sample_t bias, + sample_t clev, sample_t slev); static void downmix_C (sample_t * samples, int acmod, int output, sample_t bias, sample_t clev, sample_t slev); static void upmix_MMX (sample_t * samples, int acmod, int output); @@ -53,6 +55,7 @@ void downmix_accel_init(uint32_t mm_accel) #ifdef ARCH_X86 if(mm_accel & MM_ACCEL_X86_MMX) upmix= upmix_MMX; if(mm_accel & MM_ACCEL_X86_SSE) downmix= downmix_SSE; + if(mm_accel & MM_ACCEL_X86_3DNOW) downmix= downmix_3dnow; #endif } @@ -685,6 +688,7 @@ static void mix2to1_SSE (sample_t * dest, sample_t * src, sample_t bias) "movlps %2, %%xmm7 \n\t" "shufps $0x00, %%xmm7, %%xmm7 \n\t" "movl $-1024, %%esi \n\t" + ".balign 16\n\t" "1: \n\t" "movaps (%0, %%esi), %%xmm0 \n\t" "movaps 16(%0, %%esi), %%xmm1 \n\t" @@ -707,6 +711,7 @@ static void mix3to1_SSE (sample_t * samples, sample_t bias) "movlps %1, %%xmm7 \n\t" "shufps $0x00, %%xmm7, %%xmm7 \n\t" "movl $-1024, %%esi \n\t" + ".balign 16\n\t" "1: \n\t" "movaps (%0, %%esi), %%xmm0 \n\t" "movaps 1024(%0, %%esi), %%xmm1 \n\t" @@ -727,6 +732,7 @@ static void mix4to1_SSE (sample_t * samples, sample_t bias) "movlps %1, %%xmm7 \n\t" "shufps $0x00, %%xmm7, %%xmm7 \n\t" "movl $-1024, %%esi \n\t" + ".balign 16\n\t" "1: \n\t" "movaps (%0, %%esi), %%xmm0 \n\t" "movaps 1024(%0, %%esi), %%xmm1 \n\t" @@ -748,6 +754,7 @@ static void mix5to1_SSE (sample_t * samples, sample_t bias) "movlps %1, %%xmm7 \n\t" "shufps $0x00, %%xmm7, %%xmm7 \n\t" "movl $-1024, %%esi \n\t" + ".balign 16\n\t" "1: \n\t" "movaps (%0, %%esi), %%xmm0 \n\t" "movaps 1024(%0, %%esi), %%xmm1 \n\t" @@ -770,6 +777,7 @@ static void mix3to2_SSE (sample_t * samples, sample_t bias) "movlps %1, %%xmm7 \n\t" "shufps $0x00, %%xmm7, %%xmm7 \n\t" "movl $-1024, %%esi \n\t" + ".balign 16\n\t" "1: \n\t" "movaps 1024(%0, %%esi), %%xmm0 \n\t" "addps %%xmm7, %%xmm0 \n\t" //common @@ -792,6 +800,7 @@ static void mix21to2_SSE (sample_t * left, sample_t * right, sample_t bias) "movlps %2, %%xmm7 \n\t" "shufps $0x00, %%xmm7, %%xmm7 \n\t" "movl $-1024, %%esi \n\t" + ".balign 16\n\t" "1: \n\t" "movaps 1024(%1, %%esi), %%xmm0 \n\t" "addps %%xmm7, %%xmm0 \n\t" //common @@ -814,6 +823,7 @@ static void mix21toS_SSE (sample_t * samples, sample_t bias) "movlps %1, %%xmm7 \n\t" "shufps $0x00, %%xmm7, %%xmm7 \n\t" "movl $-1024, %%esi \n\t" + ".balign 16\n\t" "1: \n\t" "movaps 2048(%0, %%esi), %%xmm0 \n\t" // surround "movaps (%0, %%esi), %%xmm1 \n\t" @@ -837,6 +847,7 @@ static void mix31to2_SSE (sample_t * samples, sample_t bias) "movlps %1, %%xmm7 \n\t" "shufps $0x00, %%xmm7, %%xmm7 \n\t" "movl $-1024, %%esi \n\t" + ".balign 16\n\t" "1: \n\t" "movaps 1024(%0, %%esi), %%xmm0 \n\t" "addps 3072(%0, %%esi), %%xmm0 \n\t" @@ -860,6 +871,7 @@ static void mix31toS_SSE (sample_t * samples, sample_t bias) "movlps %1, %%xmm7 \n\t" "shufps $0x00, %%xmm7, %%xmm7 \n\t" "movl $-1024, %%esi \n\t" + ".balign 16\n\t" "1: \n\t" "movaps 1024(%0, %%esi), %%xmm0 \n\t" "movaps 3072(%0, %%esi), %%xmm3 \n\t" // surround @@ -885,6 +897,7 @@ static void mix22toS_SSE (sample_t * samples, sample_t bias) "movlps %1, %%xmm7 \n\t" "shufps $0x00, %%xmm7, %%xmm7 \n\t" "movl $-1024, %%esi \n\t" + ".balign 16\n\t" "1: \n\t" "movaps 2048(%0, %%esi), %%xmm0 \n\t" "addps 3072(%0, %%esi), %%xmm0 \n\t" // surround @@ -909,6 +922,7 @@ static void mix32to2_SSE (sample_t * samples, sample_t bias) "movlps %1, %%xmm7 \n\t" "shufps $0x00, %%xmm7, %%xmm7 \n\t" "movl $-1024, %%esi \n\t" + ".balign 16\n\t" "1: \n\t" "movaps 1024(%0, %%esi), %%xmm0 \n\t" "addps %%xmm7, %%xmm0 \n\t" // common @@ -932,6 +946,7 @@ static void mix32toS_SSE (sample_t * samples, sample_t bias) "movlps %1, %%xmm7 \n\t" "shufps $0x00, %%xmm7, %%xmm7 \n\t" "movl $-1024, %%esi \n\t" + ".balign 16\n\t" "1: \n\t" "movaps 1024(%0, %%esi), %%xmm0 \n\t" "movaps 3072(%0, %%esi), %%xmm2 \n\t" @@ -958,6 +973,7 @@ static void move2to1_SSE (sample_t * src, sample_t * dest, sample_t bias) "movlps %2, %%xmm7 \n\t" "shufps $0x00, %%xmm7, %%xmm7 \n\t" "movl $-1024, %%esi \n\t" + ".balign 16\n\t" "1: \n\t" "movaps (%0, %%esi), %%xmm0 \n\t" "movaps 16(%0, %%esi), %%xmm1 \n\t" @@ -979,6 +995,7 @@ static void zero_MMX(sample_t * samples) asm volatile( "movl $-1024, %%esi \n\t" "pxor %%mm0, %%mm0 \n\t" + ".balign 16\n\t" "1: \n\t" "movq %%mm0, (%0, %%esi) \n\t" "movq %%mm0, 8(%0, %%esi) \n\t" @@ -992,6 +1009,38 @@ static void zero_MMX(sample_t * samples) ); } +/* + I hope dest and src will be at least 8 byte aligned and size + will devide on 8 without remain + Note: untested and unused. +*/ +static void copy_MMX(void *dest,const void *src,unsigned size) +{ + unsigned i; + size /= 64; + for(i=0;i