X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fx86%2Fh264_i386.h;h=10ea32e0b866c2693da9571c53ab9894f44b7203;hb=40f81769aec24a93563cd547e02ba8478aa95849;hp=31ddaf6ee9e42776d695546fc5167cf4454d72a5;hpb=448dc42571edc5bc91da7b0b017daa61118ba2f5;p=ffmpeg diff --git a/libavcodec/x86/h264_i386.h b/libavcodec/x86/h264_i386.h index 31ddaf6ee9e..10ea32e0b86 100644 --- a/libavcodec/x86/h264_i386.h +++ b/libavcodec/x86/h264_i386.h @@ -36,7 +36,7 @@ //FIXME use some macros to avoid duplicating get_cabac (cannot be done yet //as that would make optimization work hard) -#if HAVE_7REGS && !defined(BROKEN_RELOCATIONS) +#if HAVE_7REGS static int decode_significance_x86(CABACContext *c, int max_coeff, uint8_t *significant_coeff_ctx_base, int *index, x86_reg last_off){ @@ -45,18 +45,30 @@ static int decode_significance_x86(CABACContext *c, int max_coeff, int minusindex= 4-(intptr_t)index; int bit; x86_reg coeff_count; + +#ifdef BROKEN_RELOCATIONS + void *tables; + + __asm__ volatile( + "lea "MANGLE(ff_h264_cabac_tables)", %0 \n\t" + : "=&r"(tables) + ); +#endif + __asm__ volatile( "3: \n\t" - BRANCHLESS_GET_CABAC("%4", "(%1)", "%3", "%w3", - "%5", "%k0", "%b0", "%a11(%6)") + BRANCHLESS_GET_CABAC("%4", "%q4", "(%1)", "%3", "%w3", + "%5", "%q5", "%k0", "%b0", + "%a11(%6)", "%a12(%6)", "%a13", "%a14", "%a15", "%16") "test $1, %4 \n\t" " jz 4f \n\t" "add %10, %1 \n\t" - BRANCHLESS_GET_CABAC("%4", "(%1)", "%3", "%w3", - "%5", "%k0", "%b0", "%a11(%6)") + BRANCHLESS_GET_CABAC("%4", "%q4", "(%1)", "%3", "%w3", + "%5", "%q5", "%k0", "%b0", + "%a11(%6)", "%a12(%6)", "%a13", "%a14", "%a15", "%16") "sub %10, %1 \n\t" "mov %2, %0 \n\t" @@ -83,7 +95,11 @@ static int decode_significance_x86(CABACContext *c, int max_coeff, : "=&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)), + "i"(offsetof(CABACContext, bytestream_end)), + "i"(H264_NORM_SHIFT_OFFSET), + "i"(H264_LPS_RANGE_OFFSET), + "i"(H264_MLPS_STATE_OFFSET) TABLES_ARG : "%"REG_c, "memory" ); return coeff_count; @@ -97,6 +113,16 @@ static int decode_significance_8x8_x86(CABACContext *c, x86_reg coeff_count; x86_reg last=0; x86_reg state; + +#ifdef BROKEN_RELOCATIONS + void *tables; + + __asm__ volatile( + "lea "MANGLE(ff_h264_cabac_tables)", %0 \n\t" + : "=&r"(tables) + ); +#endif + __asm__ volatile( "mov %1, %6 \n\t" "3: \n\t" @@ -105,18 +131,24 @@ static int decode_significance_8x8_x86(CABACContext *c, "movzbl (%0, %6), %k6 \n\t" "add %9, %6 \n\t" - BRANCHLESS_GET_CABAC("%4", "(%6)", "%3", "%w3", - "%5", "%k0", "%b0", "%a12(%7)") + BRANCHLESS_GET_CABAC("%4", "%q4", "(%6)", "%3", "%w3", + "%5", "%q5", "%k0", "%b0", + "%a12(%7)", "%a13(%7)", "%a14", "%a15", "%a16", "%18") "mov %1, %k6 \n\t" "test $1, %4 \n\t" " jz 4f \n\t" - "movzbl "MANGLE(last_coeff_flag_offset_8x8)"(%k6), %k6\n\t" +#ifdef BROKEN_RELOCATIONS + "movzbl %a17(%18, %q6), %k6\n\t" +#else + "movzbl "MANGLE(ff_h264_cabac_tables)"+%a17(%k6), %k6\n\t" +#endif "add %11, %6 \n\t" - BRANCHLESS_GET_CABAC("%4", "(%6)", "%3", "%w3", - "%5", "%k0", "%b0", "%a12(%7)") + BRANCHLESS_GET_CABAC("%4", "%q4", "(%6)", "%3", "%w3", + "%5", "%q5", "%k0", "%b0", + "%a12(%7)", "%a13(%7)", "%a14", "%a15", "%a16", "%18") "mov %2, %0 \n\t" "mov %1, %k6 \n\t" @@ -141,7 +173,12 @@ static int decode_significance_8x8_x86(CABACContext *c, "=&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)), + "i"(offsetof(CABACContext, bytestream_end)), + "i"(H264_NORM_SHIFT_OFFSET), + "i"(H264_LPS_RANGE_OFFSET), + "i"(H264_MLPS_STATE_OFFSET), + "i"(H264_LAST_COEFF_FLAG_OFFSET_8x8_OFFSET) TABLES_ARG : "%"REG_c, "memory" ); return coeff_count;