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