@ -27,7 +27,7 @@
# include "config.h"
# if HAVE_FAST_CMOV
# define BRANCHLESS_GET_CABAC_UPDATE(ret, cabac, statep, low, lowword, range, tmp)\
# define BRANCHLESS_GET_CABAC_UPDATE(ret, statep, low, lowword, 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, cabac, statep, low, lowword, range, tmp)\
# define BRANCHLESS_GET_CABAC_UPDATE(ret, statep, low, lowword, range, tmp)\
" mov " tmp " , %%ecx \n \t " \
" shl $17 , " tmp " \n \t " \
" sub " low " , " tmp " \n \t " \
@ -51,14 +51,13 @@
" xor " tmp " , " ret " \n \t "
# endif /* HAVE_FAST_CMOV */
# define BRANCHLESS_GET_CABAC(ret, cabac, statep, low, lowword, range, tmp, tmpbyte, byte) \
# define BRANCHLESS_GET_CABAC(ret, statep, low, lowword, range, tmp, tmpbyte, byte) \
" 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 , cabac , statep , low , lowword , \
range , tmp ) \
BRANCHLESS_GET_CABAC_UPDATE ( ret , statep , low , lowword , 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 " \
@ -66,8 +65,8 @@
" mov " tmpbyte " , " statep " \n \t " \
" test " lowword " , " lowword " \n \t " \
" jnz 1f \n \t " \
" mov " byte " ( " cabac " ) , %%" REG_c " \n \t " \
" add " OPSIZE " $2 , " byte " ( " cabac " ) \n \t " \
" mov " byte " , %%" REG_c " \n \t " \
" add " OPSIZE " $2 , " byte " \n \t " \
" movzwl (%% " REG_c " ) , " tmp " \n \t " \
" lea -1( " low " ) , %%ecx \n \t " \
" xor " low " , %%ecx \n \t " \
@ -82,7 +81,7 @@
" add " tmp " , " low " \n \t " \
" 1: \n \t "
# if HAVE_7 REGS && !defined(BROKEN_RELOCATIONS)
# if HAVE_6 REGS && !defined(BROKEN_RELOCATIONS)
# define get_cabac_inline get_cabac_inline_x86
static av_always_inline int get_cabac_inline_x86 ( CABACContext * c ,
uint8_t * const state )
@ -90,24 +89,24 @@ static av_always_inline int get_cabac_inline_x86(CABACContext *c,
int bit , tmp ;
__asm__ volatile (
BRANCHLESS_GET_CABAC ( " %0 " , " %5 " , " (%4 )" , " %1 " , " %w1 " , " %2 " ,
" %3 " , " %b3 " , " %a6 " )
: " =&r " ( bit ) , " +&r " ( c - > low ) , " +&r " ( c - > range ) , " =&q " ( tmp )
: " r " ( state ) , " r " ( c ) ,
" i " ( offsetof ( CABACContext , bytestream ) )
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 )
: " % " REG_c , " memory "
) ;
return bit & 1 ;
}
# endif /* HAVE_7 REGS && !defined(BROKEN_RELOCATIONS) */
# endif /* HAVE_6 REGS && !defined(BROKEN_RELOCATIONS) */
# define get_cabac_bypass_sign get_cabac_bypass_sign_x86
static av_always_inline int get_cabac_bypass_sign_x86 ( CABACContext * c , int val )
{
x86_reg tmp ;
__asm__ volatile (
" movl %a3(%2), %k1 \n \t "
" movl %a4(% 2) , %%eax \n \t "
" 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 "
@ -118,22 +117,20 @@ static av_always_inline int get_cabac_bypass_sign_x86(CABACContext *c, int val)
" sub %%edx, %%ecx \n \t "
" test %%ax, %%ax \n \t "
" jnz 1f \n \t "
" mov %a5(%2), %1 \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, %a5(%2) \n \t "
" mov %1, %3 \n \t "
" 1: \n \t "
" movl %%eax, %a4(%2) \n \t "
" movl %%eax, %2 \n \t "
: " +c " ( val ) , " =&r " ( tmp )
: " r " ( c ) ,
" i " ( offsetof ( CABACContext , range ) ) , " i " ( offsetof ( CABACContext , low ) ) ,
" i " ( offsetof ( CABACContext , bytestream ) )
: " %eax " , " %edx " , " memory "
: " +c " ( val ) , " =&r " ( tmp ) , " +m " ( c - > low ) , " +m " ( c - > bytestream )
: " m " ( c - > range )
: " %eax " , " %edx "
) ;
return val ;
}