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;