x86: cabac: allow building with suncc
authorMans Rullgard <mans@mansr.com>
Sun, 12 Aug 2012 01:18:41 +0000 (02:18 +0100)
committerMans Rullgard <mans@mansr.com>
Mon, 13 Aug 2012 13:51:52 +0000 (14:51 +0100)
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>
libavcodec/x86/cabac.h
libavcodec/x86/h264_i386.h

index 389f155745ecfbad69b198b77b3ad1f72a42f0b6..a74cf0bf1fe80552000a495ce1c838969495d7bc 100644 (file)
@@ -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),
index 2daa40ae524efd2f383a54937ad776449d8722e9..bb881c35dfc70b594bcc3e059a5761a406b8d205 100644 (file)
@@ -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"
     );