aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/x86/lpc_mmx.c
diff options
context:
space:
mode:
authorRamiro Polla <ramiro.polla@gmail.com>2010-10-31 23:36:26 +0000
committerRamiro Polla <ramiro.polla@gmail.com>2010-10-31 23:36:26 +0000
commite5d5407e263228349597f44ab06fa0d362867f84 (patch)
treea224cd9c1f4d2530e05872ad60a400ceb2e918f7 /libavcodec/x86/lpc_mmx.c
parent2839dc974d8cf4155b0a8ddd8983f17abcff405e (diff)
downloadffmpeg-e5d5407e263228349597f44ab06fa0d362867f84.tar.gz
lpc_mmx: merge some asm blocks
These blocks depended on the compiler keeping xmm registers untouched between them. Originally committed as revision 25619 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/x86/lpc_mmx.c')
-rw-r--r--libavcodec/x86/lpc_mmx.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/libavcodec/x86/lpc_mmx.c b/libavcodec/x86/lpc_mmx.c
index 2ef5fa6de3..cbdb239718 100644
--- a/libavcodec/x86/lpc_mmx.c
+++ b/libavcodec/x86/lpc_mmx.c
@@ -29,16 +29,15 @@ static void apply_welch_window_sse2(const int32_t *data, int len, double *w_data
x86_reg i = -n2*sizeof(int32_t);
x86_reg j = n2*sizeof(int32_t);
__asm__ volatile(
- "movsd %0, %%xmm7 \n\t"
+ "movsd %4, %%xmm7 \n\t"
"movapd "MANGLE(ff_pd_1)", %%xmm6 \n\t"
"movapd "MANGLE(ff_pd_2)", %%xmm5 \n\t"
"movlhps %%xmm7, %%xmm7 \n\t"
"subpd %%xmm5, %%xmm7 \n\t"
"addsd %%xmm6, %%xmm7 \n\t"
- ::"m"(c)
- );
+ "test $1, %5 \n\t"
+ "jz 2f \n\t"
#define WELCH(MOVPD, offset)\
- __asm__ volatile(\
"1: \n\t"\
"movapd %%xmm7, %%xmm1 \n\t"\
"mulpd %%xmm1, %%xmm1 \n\t"\
@@ -55,13 +54,15 @@ static void apply_welch_window_sse2(const int32_t *data, int len, double *w_data
"sub $8, %1 \n\t"\
"add $8, %0 \n\t"\
"jl 1b \n\t"\
- :"+&r"(i), "+&r"(j)\
- :"r"(w_data+n2), "r"(data+n2)\
- );
- if(len&1)
+
WELCH("movupd", -1)
- else
+ "jmp 3f \n\t"
+ "2: \n\t"
WELCH("movapd", -2)
+ "3: \n\t"
+ :"+&r"(i), "+&r"(j)
+ :"r"(w_data+n2), "r"(data+n2), "m"(c), "r"(len)
+ );
#undef WELCH
}