From: Jason Garrett-Glaser Date: Mon, 1 Jul 2013 19:06:22 +0000 (-0700) Subject: cabac: x86 version of get_cabac_bypass X-Git-Tag: android-x86-4.4-r1~364^2~745 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=d222f6e39e263c3455b9e1108cccda035889622d;p=android-x86%2Fexternal-ffmpeg.git cabac: x86 version of get_cabac_bypass Signed-off-by: Luca Barbato --- diff --git a/libavcodec/cabac_functions.h b/libavcodec/cabac_functions.h index 484ba85db6..afc7c98358 100644 --- a/libavcodec/cabac_functions.h +++ b/libavcodec/cabac_functions.h @@ -113,6 +113,7 @@ static int av_unused get_cabac(CABACContext *c, uint8_t * const state){ return get_cabac_inline(c,state); } +#ifndef get_cabac_bypass static int av_unused get_cabac_bypass(CABACContext *c){ int range; c->low += c->low; @@ -128,7 +129,7 @@ static int av_unused get_cabac_bypass(CABACContext *c){ return 1; } } - +#endif #ifndef get_cabac_bypass_sign static av_always_inline int get_cabac_bypass_sign(CABACContext *c, int val){ diff --git a/libavcodec/x86/cabac.h b/libavcodec/x86/cabac.h index a74cf0bf1f..fdb0a2975c 100644 --- a/libavcodec/x86/cabac.h +++ b/libavcodec/x86/cabac.h @@ -229,5 +229,45 @@ static av_always_inline int get_cabac_bypass_sign_x86(CABACContext *c, int val) return val; } +#define get_cabac_bypass get_cabac_bypass_x86 +static av_always_inline int get_cabac_bypass_x86(CABACContext *c) +{ + x86_reg tmp; + int res; + __asm__ volatile( + "movl %c6(%2), %k1 \n\t" + "movl %c3(%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" + "inc %%edx \n\t" + "test %%ax, %%ax \n\t" + "jnz 1f \n\t" + "mov %c4(%2), %1 \n\t" + "subl $0xFFFF, %%eax \n\t" + "movzwl (%1), %%ecx \n\t" + "bswap %%ecx \n\t" + "shrl $15, %%ecx \n\t" + "addl %%ecx, %%eax \n\t" + "cmp %c5(%2), %1 \n\t" + "jge 1f \n\t" + "add"OPSIZE" $2, %c4(%2) \n\t" + "1: \n\t" + "movl %%eax, %c3(%2) \n\t" + + : "=&d"(res), "=&r"(tmp) + : "r"(c), + "i"(offsetof(CABACContext, low)), + "i"(offsetof(CABACContext, bytestream)), + "i"(offsetof(CABACContext, bytestream_end)), + "i"(offsetof(CABACContext, range)) + : "%eax", "%ecx", "memory" + ); + return res; +} + #endif /* HAVE_INLINE_ASM */ #endif /* AVCODEC_X86_CABAC_H */