//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){
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"
: "=&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;
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"
"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"
"=&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;