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 | |||||