x86: remove FASTDIV inline asm
authorMans Rullgard <mans@mansr.com>
Sat, 18 Aug 2012 19:22:10 +0000 (20:22 +0100)
committerMans Rullgard <mans@mansr.com>
Wed, 22 Aug 2012 13:29:10 +0000 (14:29 +0100)
GCC 4.3 and later do the right thing with the plain C code.  Earlier
versions in 32-bit mode generate one extra instruction, needlessly
zeroing what would be the high half of the shifted value.  At least
two gcc configurations miscompile the inline asm in some situations.

In 64-bit mode, all gcc versions generate imul r64, r64 followed by
shr.  On Intel i7 and later, this imul is faster 32-bit mul.  On
older Intel and all AMD, it is slightly slower.  On Atom it is much
slower.

Considering where the FASTDIV macro is used, any overall negative
performance impact of this change should be negligible.  If anyone
cares, they should file a bug against gcc and get the instruction
selection fixed.

Signed-off-by: Mans Rullgard <mans@mansr.com>
libavutil/intmath.h
libavutil/x86/intmath.h [deleted file]

index 1be96da..ba198c9 100644 (file)
@@ -34,8 +34,6 @@ extern const uint32_t ff_inverse[257];
 
 #if   ARCH_ARM
 #   include "arm/intmath.h"
-#elif ARCH_X86
-#   include "x86/intmath.h"
 #endif
 
 #if HAVE_FAST_CLZ && AV_GCC_VERSION_AT_LEAST(3,4)
diff --git a/libavutil/x86/intmath.h b/libavutil/x86/intmath.h
deleted file mode 100644 (file)
index b23c0f1..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 2010 Mans Rullgard <mans@mansr.com>
- *
- * This file is part of Libav.
- *
- * Libav is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * Libav is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with Libav; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#ifndef AVUTIL_X86_INTMATH_H
-#define AVUTIL_X86_INTMATH_H
-
-#if HAVE_INLINE_ASM
-#define FASTDIV(a,b) \
-    ({\
-        int ret, dmy;\
-        __asm__ volatile(\
-            "mull %3"\
-            :"=d"(ret), "=a"(dmy)\
-            :"1"(a), "g"(ff_inverse[b])\
-            );\
-        ret;\
-    })
-#endif
-
-#endif /* AVUTIL_X86_INTMATH_H */