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 |