Originally committed as revision 6291 to svn://svn.ffmpeg.org/ffmpeg/trunktags/v0.5
@@ -0,0 +1,47 @@ | |||
/* | |||
* simple math operations | |||
* Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> et al | |||
* | |||
* This library 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 of the License, or (at your option) any later version. | |||
* | |||
* This library 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 this library; if not, write to the Free Software | |||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
*/ | |||
#ifdef FRAC_BITS | |||
# define MULL(a, b) \ | |||
({ int lo, hi;\ | |||
asm("smull %0, %1, %2, %3 \n\t"\ | |||
"mov %0, %0, lsr %4\n\t"\ | |||
"add %1, %0, %1, lsl %5\n\t"\ | |||
: "=&r"(lo), "=&r"(hi)\ | |||
: "r"(b), "r"(a), "i"(FRAC_BITS), "i"(32-FRAC_BITS));\ | |||
hi; }) | |||
#endif | |||
#define MULH(a, b) \ | |||
({ int lo, hi;\ | |||
asm ("smull %0, %1, %2, %3" : "=&r"(lo), "=&r"(hi) : "r"(b), "r"(a));\ | |||
hi; }) | |||
#if defined(HAVE_ARMV5TE) | |||
/* signed 16x16 -> 32 multiply add accumulate */ | |||
# define MAC16(rt, ra, rb) \ | |||
asm ("smlabb %0, %2, %3, %0" : "=r" (rt) : "0" (rt), "r" (ra), "r" (rb)); | |||
/* signed 16x16 -> 32 multiply */ | |||
# define MUL16(ra, rb) \ | |||
({ int __rt;\ | |||
asm ("smulbb %0, %1, %2" : "=r" (__rt) : "r" (ra), "r" (rb)); | |||
__rt; }) | |||
#endif |
@@ -0,0 +1,39 @@ | |||
/* | |||
* simple math operations | |||
* Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> et al | |||
* | |||
* This library 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 of the License, or (at your option) any later version. | |||
* | |||
* This library 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 this library; if not, write to the Free Software | |||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
*/ | |||
#ifdef FRAC_BITS | |||
# define MULL(ra, rb) \ | |||
({ int rt, dummy; asm (\ | |||
"imull %3 \n\t"\ | |||
"shrdl %4, %%edx, %%eax \n\t"\ | |||
: "=a"(rt), "=d"(dummy)\ | |||
: "a" (ra), "rm" (rb), "i"(FRAC_BITS));\ | |||
rt; }) | |||
#endif | |||
#define MULH(ra, rb) \ | |||
({ int rt, dummy;\ | |||
asm ("imull %3\n\t" : "=d"(rt), "=a"(dummy): "a" (ra), "rm" (rb));\ | |||
rt; }) | |||
#define MUL64(ra, rb) \ | |||
({ int64_t rt;\ | |||
asm ("imull %2\n\t" : "=A"(rt) : "a" (ra), "g" (rb));\ | |||
rt; }) | |||
@@ -0,0 +1,67 @@ | |||
/* | |||
* simple math operations | |||
* Copyright (c) 2001, 2002 Fabrice Bellard. | |||
* Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> et al | |||
* | |||
* This library 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 of the License, or (at your option) any later version. | |||
* | |||
* This library 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 this library; if not, write to the Free Software | |||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
*/ | |||
#ifndef MATHOPS_H | |||
#define MATHOPS_H | |||
#ifdef ARCH_X86 | |||
#include "i386/mathops.h" | |||
#elif defined(ARCH_ARMV4L) | |||
#include "armv4l/mathops.h" | |||
#elif defined(ARCH_PPC) | |||
#include "ppc/mathops.h" | |||
#endif | |||
/* generic implementation */ | |||
#ifndef MULL | |||
# define MULL(a,b) (((int64_t)(a) * (int64_t)(b)) >> FRAC_BITS) | |||
#endif | |||
#ifndef MULH | |||
//gcc 3.4 creates an incredibly bloated mess out of this | |||
//# define MULH(a,b) (((int64_t)(a) * (int64_t)(b))>>32) | |||
static always_inline int MULH(int a, int b){ | |||
return ((int64_t)(a) * (int64_t)(b))>>32; | |||
} | |||
#endif | |||
#ifndef MUL64 | |||
# define MUL64(a,b) ((int64_t)(a) * (int64_t)(b)) | |||
#endif | |||
/* signed 16x16 -> 32 multiply add accumulate */ | |||
#ifndef MAC16 | |||
# define MAC16(rt, ra, rb) rt += (ra) * (rb) | |||
#endif | |||
/* signed 16x16 -> 32 multiply */ | |||
#ifndef MUL16 | |||
# define MUL16(ra, rb) ((ra) * (rb)) | |||
#endif | |||
#endif //MATHOPS_H | |||
@@ -0,0 +1,31 @@ | |||
/* | |||
* simple math operations | |||
* Copyright (c) 2001, 2002 Fabrice Bellard. | |||
* Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> et al | |||
* | |||
* This library 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 of the License, or (at your option) any later version. | |||
* | |||
* This library 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 this library; if not, write to the Free Software | |||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
*/ | |||
#if defined(ARCH_POWERPC_405) | |||
/* signed 16x16 -> 32 multiply add accumulate */ | |||
# define MAC16(rt, ra, rb) \ | |||
asm ("maclhw %0, %2, %3" : "=r" (rt) : "0" (rt), "r" (ra), "r" (rb)); | |||
/* signed 16x16 -> 32 multiply */ | |||
# define MUL16(ra, rb) \ | |||
({ int __rt; | |||
asm ("mullhw %0, %1, %2" : "=r" (__rt) : "r" (ra), "r" (rb)); | |||
__rt; }) | |||
#endif |