aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/x86/h264_i386.h
diff options
context:
space:
mode:
authorRoland Scheidegger <rscheidegger_lists@hispeed.ch>2012-04-27 22:12:20 +0200
committerMichael Niedermayer <michaelni@gmx.at>2012-04-28 20:02:27 +0200
commit82c71913e46552f9b41ed3f63571b7777a999f68 (patch)
treea0b43714aba491eb6f4b6096b3c901d51645bb55 /libavcodec/x86/h264_i386.h
parent7f668cd2b5f13afa0de9f593948ce2f703ab5aaa (diff)
downloadffmpeg-82c71913e46552f9b41ed3f63571b7777a999f68.tar.gz
h264: new assembly version of get_cabac for x86_64 with PIC
This adds a hand-optimized assembly version for get_cabac much like the existing one, but it works if the table offsets are RIP-relative. Compared to the non-RIP-relative version this adds 2 lea instructions and it needs one extra register. There is a surprisingly large performance improvement over the c version (more so than the generated assembly seems to suggest) just in get_cabac, I measured roughly 40% faster for get_cabac on a K8. However, overall the difference is not that big, I measured roughly 5% on a test clip on a K8 and a Core2. Hopefully it still compiles on x86 32bit... Now that only one table is used, there's some chance even darwin as compiles this (apparently the label arithmetic used previously doesn't work if it involves symbols defined in a different file, thanks to Ronald S. Bultje for helping me with this). Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/x86/h264_i386.h')
-rw-r--r--libavcodec/x86/h264_i386.h53
1 files changed, 37 insertions, 16 deletions
diff --git a/libavcodec/x86/h264_i386.h b/libavcodec/x86/h264_i386.h
index d2787087cf..2a502b7c0b 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){
@@ -46,20 +46,29 @@ static int decode_significance_x86(CABACContext *c, int max_coeff,
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)", "%a12(%6)", "%a13", "%a14", "%a15")
+ 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)", "%a12(%6)", "%a13", "%a14", "%a15")
+ 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"
@@ -90,7 +99,7 @@ static int decode_significance_x86(CABACContext *c, int max_coeff,
"i"(offsetof(CABACContext, bytestream_end)),
"i"(H264_NORM_SHIFT_OFFSET),
"i"(H264_LPS_RANGE_OFFSET),
- "i"(H264_MLPS_STATE_OFFSET)
+ "i"(H264_MLPS_STATE_OFFSET) TABLES_ARG
: "%"REG_c, "memory"
);
return coeff_count;
@@ -105,6 +114,15 @@ static int decode_significance_8x8_x86(CABACContext *c,
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"
@@ -113,21 +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)", "%a13(%7)", "%a14", "%a15", "%a16")
+ 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"
+#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)", "%a13(%7)", "%a14", "%a15", "%a16")
+ 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"
@@ -157,7 +178,7 @@ static int decode_significance_8x8_x86(CABACContext *c,
"i"(H264_NORM_SHIFT_OFFSET),
"i"(H264_LPS_RANGE_OFFSET),
"i"(H264_MLPS_STATE_OFFSET),
- "i"(H264_LAST_COEFF_FLAG_OFFSET_8x8_OFFSET)
+ "i"(H264_LAST_COEFF_FLAG_OFFSET_8x8_OFFSET) TABLES_ARG
: "%"REG_c, "memory"
);
return coeff_count;