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>
This commit is contained in:
parent
c8252e80eb
commit
8ec0204ee4
@ -173,14 +173,16 @@ static av_always_inline int get_cabac_inline_x86(CABACContext *c,
|
||||
__asm__ volatile(
|
||||
BRANCHLESS_GET_CABAC("%0", "%q0", "(%4)", "%1", "%w1",
|
||||
"%2", "%q2", "%3", "%b3",
|
||||
"%a6(%5)", "%a7(%5)", "%a8", "%a9", "%a10", "%11")
|
||||
"%c6(%5)", "%c7(%5)",
|
||||
AV_STRINGIFY(H264_NORM_SHIFT_OFFSET),
|
||||
AV_STRINGIFY(H264_LPS_RANGE_OFFSET),
|
||||
AV_STRINGIFY(H264_MLPS_STATE_OFFSET),
|
||||
"%8")
|
||||
: "=&r"(bit), "+&r"(c->low), "+&r"(c->range), "=&q"(tmp)
|
||||
: "r"(state), "r"(c),
|
||||
"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 bit & 1;
|
||||
@ -192,8 +194,8 @@ static av_always_inline int get_cabac_bypass_sign_x86(CABACContext *c, int val)
|
||||
{
|
||||
x86_reg tmp;
|
||||
__asm__ volatile(
|
||||
"movl %a6(%2), %k1 \n\t"
|
||||
"movl %a3(%2), %%eax \n\t"
|
||||
"movl %c6(%2), %k1 \n\t"
|
||||
"movl %c3(%2), %%eax \n\t"
|
||||
"shl $17, %k1 \n\t"
|
||||
"add %%eax, %%eax \n\t"
|
||||
"sub %k1, %%eax \n\t"
|
||||
@ -204,17 +206,17 @@ 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 %a4(%2), %1 \n\t"
|
||||
"mov %c4(%2), %1 \n\t"
|
||||
"subl $0xFFFF, %%eax \n\t"
|
||||
"movzwl (%1), %%edx \n\t"
|
||||
"bswap %%edx \n\t"
|
||||
"shrl $15, %%edx \n\t"
|
||||
"addl %%edx, %%eax \n\t"
|
||||
"cmp %a5(%2), %1 \n\t"
|
||||
"cmp %c5(%2), %1 \n\t"
|
||||
"jge 1f \n\t"
|
||||
"add"OPSIZE" $2, %a4(%2) \n\t"
|
||||
"add"OPSIZE" $2, %c4(%2) \n\t"
|
||||
"1: \n\t"
|
||||
"movl %%eax, %a3(%2) \n\t"
|
||||
"movl %%eax, %c3(%2) \n\t"
|
||||
|
||||
: "+c"(val), "=&r"(tmp)
|
||||
: "r"(c),
|
||||
|
@ -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"
|
||||
);
|
||||
|
Loading…
x
Reference in New Issue
Block a user