[FFmpeg-devel] [PATCH] Revert commit 599b4c6efddaed33b1667c386b34b07729ba732b

Michael Niedermayer michaelni at gmx.at
Tue Jan 3 16:41:57 CET 2012


	Author: Mans Rullgard <mans at mansr.com>
	Date:   Sun Dec 11 21:41:59 2011 +0000

    	x86: cabac: replace explicit memory references with "m" operands

    	This replaces the explicit offset(reg) memory references with
    	"m" operands for the same locations.  As a result, one fewer
    	register operand is needed for these inline asm statements.

This change appears to have broken compilation on darwin, and subsequent
fixes by martin (which did not fix compilation) removed the register
advantage, thus this change seems not a good idea to keep.
See: http://fate.ffmpeg.org/log.cgi?time=20120103122446&log=compile&slot=i386-darwin-llvm-gcc-4.2.1

Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
---
 libavcodec/x86/cabac.h |   49 ++++++++++++++++++++++++++++-------------------
 1 files changed, 29 insertions(+), 20 deletions(-)

diff --git a/libavcodec/x86/cabac.h b/libavcodec/x86/cabac.h
index 3c3652d..33304ab 100644
--- a/libavcodec/x86/cabac.h
+++ b/libavcodec/x86/cabac.h
@@ -27,7 +27,7 @@
 #include "config.h"
 
 #if HAVE_FAST_CMOV
-#define BRANCHLESS_GET_CABAC_UPDATE(ret, statep, low, lowword, range, tmp)\
+#define BRANCHLESS_GET_CABAC_UPDATE(ret, cabac, statep, low, lowword, range, tmp)\
         "mov    "tmp"       , %%ecx     \n\t"\
         "shl    $17         , "tmp"     \n\t"\
         "cmp    "low"       , "tmp"     \n\t"\
@@ -37,7 +37,7 @@
         "xor    %%ecx       , "ret"     \n\t"\
         "sub    "tmp"       , "low"     \n\t"
 #else /* HAVE_FAST_CMOV */
-#define BRANCHLESS_GET_CABAC_UPDATE(ret, statep, low, lowword, range, tmp)\
+#define BRANCHLESS_GET_CABAC_UPDATE(ret, cabac, statep, low, lowword, range, tmp)\
         "mov    "tmp"       , %%ecx     \n\t"\
         "shl    $17         , "tmp"     \n\t"\
         "sub    "low"       , "tmp"     \n\t"\
@@ -51,13 +51,14 @@
         "xor    "tmp"       , "ret"     \n\t"
 #endif /* HAVE_FAST_CMOV */
 
-#define BRANCHLESS_GET_CABAC(ret, statep, low, lowword, range, tmp, tmpbyte, byte) \
+#define BRANCHLESS_GET_CABAC(ret, cabac, statep, low, lowword, range, tmp, tmpbyte, byte) \
         "movzbl "statep"    , "ret"                                     \n\t"\
         "mov    "range"     , "tmp"                                     \n\t"\
         "and    $0xC0       , "range"                                   \n\t"\
         "movzbl "MANGLE(ff_h264_lps_range)"("ret", "range", 2), "range" \n\t"\
         "sub    "range"     , "tmp"                                     \n\t"\
-        BRANCHLESS_GET_CABAC_UPDATE(ret, statep, low, lowword, range, tmp)   \
+        BRANCHLESS_GET_CABAC_UPDATE(ret, cabac, statep, low, lowword,        \
+                                    range, tmp)                              \
         "movzbl " MANGLE(ff_h264_norm_shift) "("range"), %%ecx          \n\t"\
         "shl    %%cl        , "range"                                   \n\t"\
         "movzbl "MANGLE(ff_h264_mlps_state)"+128("ret"), "tmp"          \n\t"\
@@ -65,8 +66,8 @@
         "mov    "tmpbyte"   , "statep"                                  \n\t"\
         "test   "lowword"   , "lowword"                                 \n\t"\
         " jnz   1f                                                      \n\t"\
-        "mov    "byte"      , %%"REG_c"                                 \n\t"\
-        "add"OPSIZE" $2     , "byte"                                    \n\t"\
+        "mov "byte"("cabac"), %%"REG_c"                                 \n\t"\
+        "add"OPSIZE" $2     , "byte    "("cabac")                       \n\t"\
         "movzwl (%%"REG_c")     , "tmp"                                 \n\t"\
         "lea    -1("low")   , %%ecx                                     \n\t"\
         "xor    "low"       , %%ecx                                     \n\t"\
@@ -86,14 +87,20 @@
 static av_always_inline int get_cabac_inline_x86(CABACContext *c,
                                                  uint8_t *const state)
 {
-    int bit, tmp;
+    int bit, low, range, tmp;
 
     __asm__ volatile(
-        BRANCHLESS_GET_CABAC("%0", "(%5)", "%1", "%w1", "%2",
-                             "%3", "%b3", "%4")
-        :"=&r"(bit), "+&r"(c->low), "+&r"(c->range), "=&q"(tmp),
-         "+m"(c->bytestream)
-        :"r"(state)
+        "movl %a6(%5), %2               \n\t"
+        "movl %a7(%5), %1               \n\t"
+        BRANCHLESS_GET_CABAC("%0", "%5", "(%4)", "%1", "%w1", "%2",
+                             "%3", "%b3", "%a8")
+        "movl %2, %a6(%5)               \n\t"
+        "movl %1, %a7(%5)               \n\t"
+
+        :"=&r"(bit), "=&r"(low), "=&r"(range), "=&q"(tmp)
+        :"r"(state), "r"(c),
+         "i"(offsetof(CABACContext, range)), "i"(offsetof(CABACContext, low)),
+         "i"(offsetof(CABACContext, bytestream))
         : "%"REG_c, "memory"
     );
     return bit & 1;
@@ -105,8 +112,8 @@ static av_always_inline int get_cabac_bypass_sign_x86(CABACContext *c, int val)
 {
     x86_reg tmp;
     __asm__ volatile(
-        "movl %4, %k1                           \n\t"
-        "movl %2, %%eax                         \n\t"
+        "movl %a3(%2), %k1                      \n\t"
+        "movl %a4(%2), %%eax                    \n\t"
         "shl $17, %k1                           \n\t"
         "add %%eax, %%eax                       \n\t"
         "sub %k1, %%eax                         \n\t"
@@ -117,20 +124,22 @@ 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  %3, %1                            \n\t"
+        "mov  %a5(%2), %1                       \n\t"
         "subl $0xFFFF, %%eax                    \n\t"
         "movzwl (%1), %%edx                     \n\t"
         "bswap %%edx                            \n\t"
         "shrl $15, %%edx                        \n\t"
         "add  $2, %1                            \n\t"
         "addl %%edx, %%eax                      \n\t"
-        "mov  %1, %3                            \n\t"
+        "mov  %1, %a5(%2)                       \n\t"
         "1:                                     \n\t"
-        "movl %%eax, %2                         \n\t"
+        "movl %%eax, %a4(%2)                    \n\t"
 
-        :"+c"(val), "=&r"(tmp), "+m"(c->low), "+m"(c->bytestream)
-        :"m"(c->range)
-        : "%eax", "%edx"
+        :"+c"(val), "=&r"(tmp)
+        :"r"(c),
+         "i"(offsetof(CABACContext, range)), "i"(offsetof(CABACContext, low)),
+         "i"(offsetof(CABACContext, bytestream))
+        : "%eax", "%edx", "memory"
     );
     return val;
 }
-- 
1.7.5.4



More information about the ffmpeg-devel mailing list