|
|
|
@@ -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 */ |
|
|
|
|