Mercurial > libavcodec.hg
comparison mpegaudiodec.c @ 3752:32b2da1060ea libavcodec
Use mathops
| author | lu_zero |
|---|---|
| date | Fri, 22 Sep 2006 15:57:23 +0000 |
| parents | 2c0b93338765 |
| children | 1843a85123b7 |
comparison
equal
deleted
inserted
replaced
| 3751:0882d618eb57 | 3752:32b2da1060ea |
|---|---|
| 39 # define USE_HIGHPRECISION | 39 # define USE_HIGHPRECISION |
| 40 #endif | 40 #endif |
| 41 | 41 |
| 42 #include "mpegaudio.h" | 42 #include "mpegaudio.h" |
| 43 | 43 |
| 44 #include "mathops.h" | |
| 45 | |
| 44 #define FRAC_ONE (1 << FRAC_BITS) | 46 #define FRAC_ONE (1 << FRAC_BITS) |
| 45 | 47 |
| 46 #ifdef ARCH_X86 | |
| 47 # define MULL(ra, rb) \ | |
| 48 ({ int rt, dummy; asm (\ | |
| 49 "imull %3 \n\t"\ | |
| 50 "shrdl %4, %%edx, %%eax \n\t"\ | |
| 51 : "=a"(rt), "=d"(dummy)\ | |
| 52 : "a" (ra), "rm" (rb), "i"(FRAC_BITS));\ | |
| 53 rt; }) | |
| 54 # define MUL64(ra, rb) \ | |
| 55 ({ int64_t rt; asm ("imull %2\n\t" : "=A"(rt) : "a" (ra), "g" (rb)); rt; }) | |
| 56 # define MULH(ra, rb) \ | |
| 57 ({ int rt, dummy; asm ("imull %3\n\t" : "=d"(rt), "=a"(dummy): "a" (ra), "rm" (rb)); rt; }) | |
| 58 #elif defined(ARCH_ARMV4L) | |
| 59 # define MULL(a, b) \ | |
| 60 ({ int lo, hi;\ | |
| 61 asm("smull %0, %1, %2, %3 \n\t"\ | |
| 62 "mov %0, %0, lsr %4\n\t"\ | |
| 63 "add %1, %0, %1, lsl %5\n\t"\ | |
| 64 : "=&r"(lo), "=&r"(hi)\ | |
| 65 : "r"(b), "r"(a), "i"(FRAC_BITS), "i"(32-FRAC_BITS));\ | |
| 66 hi; }) | |
| 67 # define MUL64(a,b) ((int64_t)(a) * (int64_t)(b)) | |
| 68 # define MULH(a, b) ({ int lo, hi; asm ("smull %0, %1, %2, %3" : "=&r"(lo), "=&r"(hi) : "r"(b), "r"(a)); hi; }) | |
| 69 #else | |
| 70 # define MULL(a,b) (((int64_t)(a) * (int64_t)(b)) >> FRAC_BITS) | |
| 71 # define MUL64(a,b) ((int64_t)(a) * (int64_t)(b)) | |
| 72 //#define MULH(a,b) (((int64_t)(a) * (int64_t)(b))>>32) //gcc 3.4 creates an incredibly bloated mess out of this | |
| 73 static always_inline int MULH(int a, int b){ | |
| 74 return ((int64_t)(a) * (int64_t)(b))>>32; | |
| 75 } | |
| 76 #endif | |
| 77 #define FIX(a) ((int)((a) * FRAC_ONE)) | 48 #define FIX(a) ((int)((a) * FRAC_ONE)) |
| 78 /* WARNING: only correct for posititive numbers */ | 49 /* WARNING: only correct for posititive numbers */ |
| 79 #define FIXR(a) ((int)((a) * FRAC_ONE + 0.5)) | 50 #define FIXR(a) ((int)((a) * FRAC_ONE + 0.5)) |
| 80 #define FRAC_RND(a) (((a) + (FRAC_ONE/2)) >> FRAC_BITS) | 51 #define FRAC_RND(a) (((a) + (FRAC_ONE/2)) >> FRAC_BITS) |
| 81 | 52 |
| 779 else if (sum1 > OUT_MAX) | 750 else if (sum1 > OUT_MAX) |
| 780 sum1 = OUT_MAX; | 751 sum1 = OUT_MAX; |
| 781 return sum1; | 752 return sum1; |
| 782 } | 753 } |
| 783 | 754 |
| 784 # if defined(ARCH_POWERPC_405) | 755 /* signed 16x16 -> 32 multiply add accumulate */ |
| 785 /* signed 16x16 -> 32 multiply add accumulate */ | 756 #define MACS(rt, ra, rb) MAC16(rt, ra, rb) |
| 786 # define MACS(rt, ra, rb) \ | 757 |
| 787 asm ("maclhw %0, %2, %3" : "=r" (rt) : "0" (rt), "r" (ra), "r" (rb)); | 758 /* signed 16x16 -> 32 multiply */ |
| 788 | 759 #define MULS(ra, rb) MUL16(ra, rb) |
| 789 /* signed 16x16 -> 32 multiply */ | 760 |
| 790 # define MULS(ra, rb) \ | |
| 791 ({ int __rt; asm ("mullhw %0, %1, %2" : "=r" (__rt) : "r" (ra), "r" (rb)); __rt; }) | |
| 792 | |
| 793 # elif defined(HAVE_ARMV5TE) | |
| 794 | |
| 795 /* signed 16x16 -> 32 multiply add accumulate */ | |
| 796 # define MACS(rt, ra, rb) \ | |
| 797 asm ("smlabb %0, %2, %3, %0" : "=r" (rt) : "0" (rt), "r" (ra), "r" (rb)); | |
| 798 | |
| 799 /* signed 16x16 -> 32 multiply */ | |
| 800 # define MULS(ra, rb) \ | |
| 801 ({ int __rt; asm ("smulbb %0, %1, %2" : "=r" (__rt) : "r" (ra), "r" (rb)); __rt; }) | |
| 802 | |
| 803 # else | |
| 804 /* signed 16x16 -> 32 multiply add accumulate */ | |
| 805 # define MACS(rt, ra, rb) rt += (ra) * (rb) | |
| 806 | |
| 807 /* signed 16x16 -> 32 multiply */ | |
| 808 # define MULS(ra, rb) ((ra) * (rb)) | |
| 809 # endif | |
| 810 #else | 761 #else |
| 811 | 762 |
| 812 static inline int round_sample(int64_t *sum) | 763 static inline int round_sample(int64_t *sum) |
| 813 { | 764 { |
| 814 int sum1; | 765 int sum1; |
