mathops: convert MULL/MULH/MUL64 to inline functions rather than macros.

This fixes unexpected name collisions that were occurring with variables
declared within the macros.
It also fixes the fate-acodec-ac3_fixed regression test on x86-32.
This commit is contained in:
Justin Ruggles 2011-03-15 13:30:24 -04:00
parent c76374c6db
commit b181b8fb96
1 changed files with 37 additions and 16 deletions

View File

@ -26,24 +26,45 @@
#include "libavutil/common.h"
#if ARCH_X86_32
#define MULL(ra, rb, shift) \
({ int rt, dummy; __asm__ (\
"imull %3 \n\t"\
"shrdl %4, %%edx, %%eax \n\t"\
: "=a"(rt), "=d"(dummy)\
: "a" ((int)(ra)), "rm" ((int)(rb)), "i"(shift));\
rt; })
#define MULH(ra, rb) \
({ int rt, dummy;\
__asm__ ("imull %3\n\t" : "=d"(rt), "=a"(dummy): "a" ((int)(ra)), "rm" ((int)(rb)));\
rt; })
#define MULL MULL
static av_always_inline av_const int MULL(int a, int b, unsigned shift)
{
int rt, dummy;
__asm__ (
"imull %3 \n\t"
"shrdl %4, %%edx, %%eax \n\t"
:"=a"(rt), "=d"(dummy)
:"a"(a), "rm"(b), "i"(shift)
);
return rt;
}
#define MUL64(ra, rb) \
({ int64_t rt;\
__asm__ ("imull %2\n\t" : "=A"(rt) : "a" ((int)(ra)), "g" ((int)(rb)));\
rt; })
#endif
#define MULH MULH
static av_always_inline av_const int MULH(int a, int b)
{
int rt, dummy;
__asm__ (
"imull %3"
:"=d"(rt), "=a"(dummy)
:"a"(a), "rm"(b)
);
return rt;
}
#define MUL64 MUL64
static av_always_inline av_const int64_t MUL64(int a, int b)
{
int64_t rt;
__asm__ (
"imull %2"
:"=A"(rt)
:"a"(a), "g"(b)
);
return rt;
}
#endif /* ARCH_X86_32 */
#if HAVE_CMOV
/* median of 3 */