diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-03-29 01:41:04 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-03-29 04:11:10 +0200 |
commit | d40ff29cacf9b8ffa1061392a0e9b3056c4882ea (patch) | |
tree | 3b59f4b9a74e209220f0b0dcb90c466e3e4a9b3d /libavcodec/x86 | |
parent | 99bb88c588ea9a46a06b966b9014394385ebe1c3 (diff) | |
parent | 44257ef4267f01dd698c8ab8abf50fd77136a8ce (diff) | |
download | ffmpeg-d40ff29cacf9b8ffa1061392a0e9b3056c4882ea.tar.gz |
Merge remote-tracking branch 'qatar/master'
* qatar/master:
asf: only set index_read if the index contained entries.
cabac: add overread protection to BRANCHLESS_GET_CABAC().
cabac: increment jump locations by one in callers of BRANCHLESS_GET_CABAC().
cabac: remove unused argument from BRANCHLESS_GET_CABAC_UPDATE().
cabac: use struct+offset instead of memory operand in BRANCHLESS_GET_CABAC().
h264: add overread protection to get_cabac_bypass_sign_x86().
h264: reindent get_cabac_bypass_sign_x86().
h264: use struct offsets in get_cabac_bypass_sign_x86().
h264: fix overreads in cabac reader.
wmall: fix seeking.
lagarith: fix buffer overreads.
dvdec: drop unnecessary dv_tablegen.h #include
build: fix doc generation errors in parallel builds
Replace memset(0) by zero initializations.
faandct: Remove FAAN_POSTSCALE define and related code.
dvenc: print allowed profiles if the video doesn't conform to any of them.
avcodec_encode_{audio,video}: only reallocate output packet when it has non-zero size.
FATE: add a test for vp8 with changing frame size.
fate: add kgv1 fate test.
oggdec: calculate correct timestamps in Ogg/FLAC
Conflicts:
libavcodec/4xm.c
libavcodec/cook.c
libavcodec/dvdata.c
libavcodec/dvdsubdec.c
libavcodec/lagarith.c
libavcodec/lagarithrac.c
libavcodec/utils.c
tests/fate/video.mak
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/x86')
-rw-r--r-- | libavcodec/x86/cabac.h | 78 | ||||
-rw-r--r-- | libavcodec/x86/h264_i386.h | 62 |
2 files changed, 77 insertions, 63 deletions
diff --git a/libavcodec/x86/cabac.h b/libavcodec/x86/cabac.h index 2bb0be6374..0c4419b4f3 100644 --- a/libavcodec/x86/cabac.h +++ b/libavcodec/x86/cabac.h @@ -27,7 +27,7 @@ #include "config.h" #if HAVE_FAST_CMOV -#define BRANCHLESS_GET_CABAC_UPDATE(ret, statep, low, lowword, range, tmp)\ +#define BRANCHLESS_GET_CABAC_UPDATE(ret, statep, low, range, tmp)\ "mov "tmp" , %%ecx \n\t"\ "shl $17 , "tmp" \n\t"\ "cmp "low" , "tmp" \n\t"\ @@ -37,7 +37,7 @@ "xor %%ecx , "ret" \n\t"\ "sub "tmp" , "low" \n\t" #else /* HAVE_FAST_CMOV */ -#define BRANCHLESS_GET_CABAC_UPDATE(ret, statep, low, lowword, range, tmp)\ +#define BRANCHLESS_GET_CABAC_UPDATE(ret, statep, low, range, tmp)\ "mov "tmp" , %%ecx \n\t"\ "shl $17 , "tmp" \n\t"\ "sub "low" , "tmp" \n\t"\ @@ -51,20 +51,20 @@ "xor "tmp" , "ret" \n\t" #endif /* HAVE_FAST_CMOV */ -#define BRANCHLESS_GET_CABAC(ret, statep, low, lowword, range, tmp, tmpbyte, byte) \ +#define BRANCHLESS_GET_CABAC(ret, statep, low, lowword, range, tmp, tmpbyte, byte, end) \ "movzbl "statep" , "ret" \n\t"\ "mov "range" , "tmp" \n\t"\ "and $0xC0 , "range" \n\t"\ "movzbl "MANGLE(ff_h264_lps_range)"("ret", "range", 2), "range" \n\t"\ "sub "range" , "tmp" \n\t"\ - BRANCHLESS_GET_CABAC_UPDATE(ret, statep, low, lowword, range, tmp) \ + BRANCHLESS_GET_CABAC_UPDATE(ret, statep, low, range, tmp) \ "movzbl " MANGLE(ff_h264_norm_shift) "("range"), %%ecx \n\t"\ "shl %%cl , "range" \n\t"\ "movzbl "MANGLE(ff_h264_mlps_state)"+128("ret"), "tmp" \n\t"\ "shl %%cl , "low" \n\t"\ "mov "tmpbyte" , "statep" \n\t"\ "test "lowword" , "lowword" \n\t"\ - " jnz 1f \n\t"\ + " jnz 2f \n\t"\ "mov "byte" , %%"REG_c" \n\t"\ "add"OPSIZE" $2 , "byte" \n\t"\ "movzwl (%%"REG_c") , "tmp" \n\t"\ @@ -79,7 +79,7 @@ "add $7 , %%ecx \n\t"\ "shl %%cl , "tmp" \n\t"\ "add "tmp" , "low" \n\t"\ - "1: \n\t" + "2: \n\t" #if HAVE_7REGS && !defined(BROKEN_RELOCATIONS) && !(defined(__i386) && defined(__clang__) && (__clang_major__<2 || (__clang_major__==2 && __clang_minor__<10)))\ @@ -91,11 +91,13 @@ static av_always_inline int get_cabac_inline_x86(CABACContext *c, int bit, tmp; __asm__ volatile( - BRANCHLESS_GET_CABAC("%0", "(%5)", "%1", "%w1", "%2", - "%3", "%b3", "%4") - :"=&r"(bit), "+&r"(c->low), "+&r"(c->range), "=&q"(tmp), - "+m"(c->bytestream) - :"r"(state) + BRANCHLESS_GET_CABAC("%0", "(%4)", "%1", "%w1", + "%2", "%3", "%b3", + "%a6(%5)", "%a7(%5)") + : "=&r"(bit), "+&r"(c->low), "+&r"(c->range), "=&q"(tmp) + : "r"(state), "r"(c), + "i"(offsetof(CABACContext, bytestream)), + "i"(offsetof(CABACContext, bytestream_end)) : "%"REG_c, "memory" ); return bit & 1; @@ -107,32 +109,36 @@ static av_always_inline int get_cabac_bypass_sign_x86(CABACContext *c, int val) { x86_reg tmp; __asm__ volatile( - "movl %4, %k1 \n\t" - "movl %2, %%eax \n\t" - "shl $17, %k1 \n\t" - "add %%eax, %%eax \n\t" - "sub %k1, %%eax \n\t" - "cltd \n\t" - "and %%edx, %k1 \n\t" - "add %k1, %%eax \n\t" - "xor %%edx, %%ecx \n\t" - "sub %%edx, %%ecx \n\t" - "test %%ax, %%ax \n\t" - " jnz 1f \n\t" - "mov %3, %1 \n\t" - "subl $0xFFFF, %%eax \n\t" - "movzwl (%1), %%edx \n\t" - "bswap %%edx \n\t" - "shrl $15, %%edx \n\t" - "add $2, %1 \n\t" - "addl %%edx, %%eax \n\t" - "mov %1, %3 \n\t" - "1: \n\t" - "movl %%eax, %2 \n\t" + "movl %a6(%2), %k1 \n\t" + "movl %a3(%2), %%eax \n\t" + "shl $17, %k1 \n\t" + "add %%eax, %%eax \n\t" + "sub %k1, %%eax \n\t" + "cltd \n\t" + "and %%edx, %k1 \n\t" + "add %k1, %%eax \n\t" + "xor %%edx, %%ecx \n\t" + "sub %%edx, %%ecx \n\t" + "test %%ax, %%ax \n\t" + "jnz 1f \n\t" + "mov %a4(%2), %1 \n\t" + "subl $0xFFFF, %%eax \n\t" + "movzwl (%1), %%edx \n\t" + "bswap %%edx \n\t" + "shrl $15, %%edx \n\t" + "add $2, %1 \n\t" + "addl %%edx, %%eax \n\t" + "mov %1, %a4(%2) \n\t" + "1: \n\t" + "movl %%eax, %a3(%2) \n\t" - :"+c"(val), "=&r"(tmp), "+m"(c->low), "+m"(c->bytestream) - :"m"(c->range) - : "%eax", "%edx" + : "+c"(val), "=&r"(tmp) + : "r"(c), + "i"(offsetof(CABACContext, low)), + "i"(offsetof(CABACContext, bytestream)), + "i"(offsetof(CABACContext, bytestream_end)), + "i"(offsetof(CABACContext, range)) + : "%eax", "%edx", "memory" ); return val; } diff --git a/libavcodec/x86/h264_i386.h b/libavcodec/x86/h264_i386.h index 510f726ba1..6aa2d073e3 100644 --- a/libavcodec/x86/h264_i386.h +++ b/libavcodec/x86/h264_i386.h @@ -46,17 +46,19 @@ static int decode_significance_x86(CABACContext *c, int max_coeff, int bit; x86_reg coeff_count; __asm__ volatile( - "2: \n\t" + "3: \n\t" - BRANCHLESS_GET_CABAC("%4", "(%1)", "%3", - "%w3", "%5", "%k0", "%b0", "%6") + BRANCHLESS_GET_CABAC("%4", "(%1)", "%3", "%w3", + "%5", "%k0", "%b0", + "%a11(%6)", "%a12(%6)") "test $1, %4 \n\t" - " jz 3f \n\t" + " jz 4f \n\t" "add %10, %1 \n\t" - BRANCHLESS_GET_CABAC("%4", "(%1)", "%3", - "%w3", "%5", "%k0", "%b0", "%6") + BRANCHLESS_GET_CABAC("%4", "(%1)", "%3", "%w3", + "%5", "%k0", "%b0", + "%a11(%6)", "%a12(%6)") "sub %10, %1 \n\t" "mov %2, %0 \n\t" @@ -65,25 +67,26 @@ static int decode_significance_x86(CABACContext *c, int max_coeff, "movl %%ecx, (%0) \n\t" "test $1, %4 \n\t" - " jnz 4f \n\t" + " jnz 5f \n\t" "add"OPSIZE" $4, %2 \n\t" - "3: \n\t" + "4: \n\t" "add $1, %1 \n\t" "cmp %8, %1 \n\t" - " jb 2b \n\t" + " jb 3b \n\t" "mov %2, %0 \n\t" "movl %7, %%ecx \n\t" "add %1, %%"REG_c" \n\t" "movl %%ecx, (%0) \n\t" - "4: \n\t" + "5: \n\t" "add %9, %k0 \n\t" "shr $2, %k0 \n\t" - :"=&q"(coeff_count), "+r"(significant_coeff_ctx_base), "+m"(index), - "+&r"(c->low), "=&r"(bit), "+&r"(c->range), - "+m"(c->bytestream) - :"m"(minusstart), "m"(end), "m"(minusindex), "m"(last_off) + : "=&q"(coeff_count), "+r"(significant_coeff_ctx_base), "+m"(index), + "+&r"(c->low), "=&r"(bit), "+&r"(c->range) + : "r"(c), "m"(minusstart), "m"(end), "m"(minusindex), "m"(last_off), + "i"(offsetof(CABACContext, bytestream)), + "i"(offsetof(CABACContext, bytestream_end)) : "%"REG_c, "memory" ); return coeff_count; @@ -99,47 +102,52 @@ static int decode_significance_8x8_x86(CABACContext *c, x86_reg state; __asm__ volatile( "mov %1, %6 \n\t" - "2: \n\t" + "3: \n\t" "mov %10, %0 \n\t" "movzbl (%0, %6), %k6 \n\t" "add %9, %6 \n\t" - BRANCHLESS_GET_CABAC("%4", "(%6)", "%3", - "%w3", "%5", "%k0", "%b0", "%7") + BRANCHLESS_GET_CABAC("%4", "(%6)", "%3", "%w3", + "%5", "%k0", "%b0", + "%a12(%7)", "%a13(%7)") "mov %1, %k6 \n\t" "test $1, %4 \n\t" - " jz 3f \n\t" + " jz 4f \n\t" "movzbl "MANGLE(last_coeff_flag_offset_8x8)"(%k6), %k6\n\t" "add %11, %6 \n\t" - BRANCHLESS_GET_CABAC("%4", "(%6)", "%3", - "%w3", "%5", "%k0", "%b0", "%7") + BRANCHLESS_GET_CABAC("%4", "(%6)", "%3", "%w3", + "%5", "%k0", "%b0", + "%a12(%7)", "%a13(%7)") "mov %2, %0 \n\t" "mov %1, %k6 \n\t" "movl %k6, (%0) \n\t" "test $1, %4 \n\t" - " jnz 4f \n\t" + " jnz 5f \n\t" "add"OPSIZE" $4, %2 \n\t" - "3: \n\t" + "4: \n\t" "addl $1, %k6 \n\t" "mov %k6, %1 \n\t" "cmpl $63, %k6 \n\t" - " jb 2b \n\t" + " jb 3b \n\t" "mov %2, %0 \n\t" "movl %k6, (%0) \n\t" - "4: \n\t" + "5: \n\t" "addl %8, %k0 \n\t" "shr $2, %k0 \n\t" - :"=&q"(coeff_count),"+m"(last), "+m"(index), "+&r"(c->low), "=&r"(bit), - "+&r"(c->range), "=&r"(state), "+m"(c->bytestream) - :"m"(minusindex), "m"(significant_coeff_ctx_base), "m"(sig_off), "m"(last_coeff_ctx_base) + : "=&q"(coeff_count), "+m"(last), "+m"(index), "+&r"(c->low), + "=&r"(bit), "+&r"(c->range), "=&r"(state) + : "r"(c), "m"(minusindex), "m"(significant_coeff_ctx_base), + "m"(sig_off), "m"(last_coeff_ctx_base), + "i"(offsetof(CABACContext, bytestream)), + "i"(offsetof(CABACContext, bytestream_end)) : "%"REG_c, "memory" ); return coeff_count; |