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