diff options
author | Mans Rullgard <mans@mansr.com> | 2012-08-12 05:18:41 +0400 |
---|---|---|
committer | Mans Rullgard <mans@mansr.com> | 2012-08-13 17:51:52 +0400 |
commit | 8ec0204ee4ee93218c51a86d2faa24937c8108e7 (patch) | |
tree | 661130cb96734266a4f46057d86075172c601109 /libavcodec/x86/h264_i386.h | |
parent | c8252e80eb1d0d0964e94b3186bfdb776fee99d6 (diff) |
x86: cabac: allow building with suncc
This fixes two issues preventing suncc from building this code.
The undocumented 'a' operand modifier, causing gcc to omit a $ in
front of immediate operands (as required in addresses), is not
supported by suncc. Luckily, the also undocumented 'c' modifer
has the same effect and is supported.
On some asm statements with a large number of operands, suncc for no
obvious reason fails to correctly substitute some of the operands.
Fortunately, some of the operands in these statements are plain
numbers which can be inserted directly into the code block instead
of passed as operands.
With these changes, the code builds correctly with both gcc and
suncc.
Signed-off-by: Mans Rullgard <mans@mansr.com>
Diffstat (limited to 'libavcodec/x86/h264_i386.h')
-rw-r--r-- | libavcodec/x86/h264_i386.h | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/libavcodec/x86/h264_i386.h b/libavcodec/x86/h264_i386.h index 2daa40ae52..bb881c35df 100644 --- a/libavcodec/x86/h264_i386.h +++ b/libavcodec/x86/h264_i386.h @@ -63,7 +63,11 @@ static int decode_significance_x86(CABACContext *c, int max_coeff, BRANCHLESS_GET_CABAC("%4", "%q4", "(%1)", "%3", "%w3", "%5", "%q5", "%k0", "%b0", - "%a11(%6)", "%a12(%6)", "%a13", "%a14", "%a15", "%16") + "%c11(%6)", "%c12(%6)", + AV_STRINGIFY(H264_NORM_SHIFT_OFFSET), + AV_STRINGIFY(H264_LPS_RANGE_OFFSET), + AV_STRINGIFY(H264_MLPS_STATE_OFFSET), + "%13") "test $1, %4 \n\t" " jz 4f \n\t" @@ -71,7 +75,11 @@ static int decode_significance_x86(CABACContext *c, int max_coeff, BRANCHLESS_GET_CABAC("%4", "%q4", "(%1)", "%3", "%w3", "%5", "%q5", "%k0", "%b0", - "%a11(%6)", "%a12(%6)", "%a13", "%a14", "%a15", "%16") + "%c11(%6)", "%c12(%6)", + AV_STRINGIFY(H264_NORM_SHIFT_OFFSET), + AV_STRINGIFY(H264_LPS_RANGE_OFFSET), + AV_STRINGIFY(H264_MLPS_STATE_OFFSET), + "%13") "sub %10, %1 \n\t" "mov %2, %0 \n\t" @@ -99,10 +107,8 @@ static int decode_significance_x86(CABACContext *c, int max_coeff, "+&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_end)), - "i"(H264_NORM_SHIFT_OFFSET), - "i"(H264_LPS_RANGE_OFFSET), - "i"(H264_MLPS_STATE_OFFSET) TABLES_ARG + "i"(offsetof(CABACContext, bytestream_end)) + TABLES_ARG : "%"REG_c, "memory" ); return coeff_count; @@ -137,22 +143,30 @@ static int decode_significance_8x8_x86(CABACContext *c, BRANCHLESS_GET_CABAC("%4", "%q4", "(%6)", "%3", "%w3", "%5", "%q5", "%k0", "%b0", - "%a12(%7)", "%a13(%7)", "%a14", "%a15", "%a16", "%18") + "%c12(%7)", "%c13(%7)", + AV_STRINGIFY(H264_NORM_SHIFT_OFFSET), + AV_STRINGIFY(H264_LPS_RANGE_OFFSET), + AV_STRINGIFY(H264_MLPS_STATE_OFFSET), + "%15") "mov %1, %k6 \n\t" "test $1, %4 \n\t" " jz 4f \n\t" #ifdef BROKEN_RELOCATIONS - "movzbl %a17(%18, %q6), %k6\n\t" + "movzbl %c14(%15, %q6), %k6\n\t" #else - "movzbl "MANGLE(ff_h264_cabac_tables)"+%a17(%k6), %k6\n\t" + "movzbl "MANGLE(ff_h264_cabac_tables)"+%c14(%k6), %k6\n\t" #endif "add %11, %6 \n\t" BRANCHLESS_GET_CABAC("%4", "%q4", "(%6)", "%3", "%w3", "%5", "%q5", "%k0", "%b0", - "%a12(%7)", "%a13(%7)", "%a14", "%a15", "%a16", "%18") + "%c12(%7)", "%c13(%7)", + AV_STRINGIFY(H264_NORM_SHIFT_OFFSET), + AV_STRINGIFY(H264_LPS_RANGE_OFFSET), + AV_STRINGIFY(H264_MLPS_STATE_OFFSET), + "%15") "mov %2, %0 \n\t" "mov %1, %k6 \n\t" @@ -179,9 +193,6 @@ static int decode_significance_8x8_x86(CABACContext *c, "m"(sig_off), "m"(last_coeff_ctx_base), "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" ); |