summaryrefslogtreecommitdiff
path: root/core/multimedia/opieplayer/libmad/fixed.h
Unidiff
Diffstat (limited to 'core/multimedia/opieplayer/libmad/fixed.h') (more/less context) (ignore whitespace changes)
-rw-r--r--core/multimedia/opieplayer/libmad/fixed.h97
1 files changed, 80 insertions, 17 deletions
diff --git a/core/multimedia/opieplayer/libmad/fixed.h b/core/multimedia/opieplayer/libmad/fixed.h
index 00ade62..c9b98ca 100644
--- a/core/multimedia/opieplayer/libmad/fixed.h
+++ b/core/multimedia/opieplayer/libmad/fixed.h
@@ -1,4 +1,4 @@
1/* 1/*
2 * mad - MPEG audio decoder 2 * libmad - MPEG audio decoder library
3 * Copyright (C) 2000-2001 Robert Leslie 3 * Copyright (C) 2000-2001 Robert Leslie
4 * 4 *
@@ -35,4 +35,16 @@ typedef unsigned long mad_fixed64lo_t;
35# endif 35# endif
36 36
37# if defined(_MSC_VER)
38# define mad_fixed64_t signed __int64
39# elif 1 || defined(__GNUC__)
40# define mad_fixed64_t signed long long
41# endif
42
43# if defined(FPM_FLOAT)
44typedef double mad_sample_t;
45# else
46typedef mad_fixed_t mad_sample_t;
47# endif
48
37/* 49/*
38 * Fixed-point format: 0xABBBBBBB 50 * Fixed-point format: 0xABBBBBBB
@@ -95,18 +107,29 @@ typedef unsigned long mad_fixed64lo_t;
95 # define mad_f_sub(x, y)((x) - (y)) 107 # define mad_f_sub(x, y)((x) - (y))
96 108
97# if defined(FPM_64BIT) 109# if defined(FPM_FLOAT)
110# error "FPM_FLOAT not yet supported"
111
112# undef MAD_F
113 # define MAD_F(x) mad_f_todouble(x)
114
115 # define mad_f_mul(x, y)((x) * (y))
116# define mad_f_scale64
117
118# undef ASO_ZEROCHECK
119
120# elif defined(FPM_64BIT)
98 121
99/* 122/*
100 * This version should be the most accurate if 64-bit (long long) types are 123 * This version should be the most accurate if 64-bit types are supported by
101 * supported by the compiler, although it may not be the most efficient. 124 * the compiler, although it may not be the most efficient.
102 */ 125 */
103# if defined(OPT_ACCURACY) 126# if defined(OPT_ACCURACY)
104# define mad_f_mul(x, y) \ 127# define mad_f_mul(x, y) \
105 ((mad_fixed_t) \ 128 ((mad_fixed_t) \
106 ((((signed long long) (x) * (y)) + \ 129 ((((mad_fixed64_t) (x) * (y)) + \
107 (1L << (MAD_F_SCALEBITS - 1))) >> MAD_F_SCALEBITS)) 130 (1L << (MAD_F_SCALEBITS - 1))) >> MAD_F_SCALEBITS))
108# else 131# else
109# define mad_f_mul(x, y) \ 132# define mad_f_mul(x, y) \
110 ((mad_fixed_t) (((signed long long) (x) * (y)) >> MAD_F_SCALEBITS)) 133 ((mad_fixed_t) (((mad_fixed64_t) (x) * (y)) >> MAD_F_SCALEBITS))
111# endif 134# endif
112 135
@@ -117,9 +140,32 @@ typedef unsigned long mad_fixed64lo_t;
117# elif defined(FPM_INTEL) 140# elif defined(FPM_INTEL)
118 141
142# if defined(_MSC_VER)
143# pragma warning(push)
144# pragma warning(disable: 4035) /* no return value */
145static __forceinline
146mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y)
147{
148 enum {
149 fracbits = MAD_F_FRACBITS
150 };
151
152 __asm {
153 mov eax, x
154 imul y
155 shrd eax, edx, fracbits
156 }
157
158 /* implicit return of eax */
159}
160# pragma warning(pop)
161
162 # define mad_f_mul mad_f_mul_inline
163# define mad_f_scale64
164# else
119/* 165/*
120 * This Intel version is fast and accurate; the disposition of the least 166 * This Intel version is fast and accurate; the disposition of the least
121 * significant bit depends on OPT_ACCURACY via mad_f_scale64(). 167 * significant bit depends on OPT_ACCURACY via mad_f_scale64().
122 */ 168 */
123# define MAD_F_MLX(hi, lo, x, y) \ 169# define MAD_F_MLX(hi, lo, x, y) \
124 asm ("imull %3" \ 170 asm ("imull %3" \
125 : "=a" (lo), "=d" (hi) \ 171 : "=a" (lo), "=d" (hi) \
@@ -127,9 +173,9 @@ typedef unsigned long mad_fixed64lo_t;
127 : "cc") 173 : "cc")
128 174
129# if defined(OPT_ACCURACY) 175# if defined(OPT_ACCURACY)
130/* 176/*
131 * This gives best accuracy but is not very fast. 177 * This gives best accuracy but is not very fast.
132 */ 178 */
133# define MAD_F_MLA(hi, lo, x, y) \ 179# define MAD_F_MLA(hi, lo, x, y) \
134 ({ mad_fixed64hi_t __hi; \ 180 ({ mad_fixed64hi_t __hi; \
135 mad_fixed64lo_t __lo; \ 181 mad_fixed64lo_t __lo; \
@@ -141,11 +187,11 @@ typedef unsigned long mad_fixed64lo_t;
141 : "cc"); \ 187 : "cc"); \
142 }) 188 })
143# endif /* OPT_ACCURACY */ 189# endif /* OPT_ACCURACY */
144 190
145# if defined(OPT_ACCURACY) 191# if defined(OPT_ACCURACY)
146/* 192/*
147 * Surprisingly, this is faster than SHRD followed by ADC. 193 * Surprisingly, this is faster than SHRD followed by ADC.
148 */ 194 */
149# define mad_f_scale64(hi, lo) \ 195# define mad_f_scale64(hi, lo) \
150 ({ mad_fixed64hi_t __hi_; \ 196 ({ mad_fixed64hi_t __hi_; \
151 mad_fixed64lo_t __lo_; \ 197 mad_fixed64lo_t __lo_; \
@@ -163,6 +209,6 @@ typedef unsigned long mad_fixed64lo_t;
163 __result; \ 209 __result; \
164 }) 210 })
165# else 211# else
166# define mad_f_scale64(hi, lo) \ 212# define mad_f_scale64(hi, lo) \
167 ({ mad_fixed_t __result; \ 213 ({ mad_fixed_t __result; \
168 asm ("shrdl %3,%2,%1" \ 214 asm ("shrdl %3,%2,%1" \
@@ -172,7 +218,8 @@ typedef unsigned long mad_fixed64lo_t;
172 __result; \ 218 __result; \
173 }) 219 })
174# endif /* OPT_ACCURACY */ 220# endif /* OPT_ACCURACY */
175 221
176# define MAD_F_SCALEBITS MAD_F_FRACBITS 222# define MAD_F_SCALEBITS MAD_F_FRACBITS
223# endif
177 224
178/* --- ARM ----------------------------------------------------------------- */ 225/* --- ARM ----------------------------------------------------------------- */
@@ -218,4 +265,11 @@ typedef unsigned long mad_fixed64lo_t;
218 : "%r" (x), "r" (y)) 265 : "%r" (x), "r" (y))
219 266
267# define MAD_F_MLN(hi, lo) \
268 asm ("rsbs%0, %2, #0\n\t" \
269 "rsc%1, %3, #0" \
270 : "=r" (lo), "=r" (hi) \
271 : "0" (lo), "1" (hi) \
272 : "cc")
273
220# define mad_f_scale64(hi, lo) \ 274# define mad_f_scale64(hi, lo) \
221 ({ mad_fixed_t __result; \ 275 ({ mad_fixed_t __result; \
@@ -358,6 +412,10 @@ typedef unsigned long mad_fixed64lo_t;
358 * Pre-rounding is required to stay within the limits of compliance. 412 * Pre-rounding is required to stay within the limits of compliance.
359 */ 413 */
360 # define mad_f_mul(x, y)((((x) + (1L << 11)) >> 12) * \ 414# if defined(OPT_SPEED)
415 # define mad_f_mul(x, y)(((x) >> 12) * ((y) >> 16))
416# else
417 # define mad_f_mul(x, y)((((x) + (1L << 11)) >> 12) * \
361 (((y) + (1L << 15)) >> 16)) 418 (((y) + (1L << 15)) >> 16))
419# endif
362 420
363/* ------------------------------------------------------------------------- */ 421/* ------------------------------------------------------------------------- */
@@ -381,4 +439,5 @@ typedef unsigned long mad_fixed64lo_t;
381 # define MAD_F_ML0(hi, lo, x, y)((lo) = mad_f_mul((x), (y))) 439 # define MAD_F_ML0(hi, lo, x, y)((lo) = mad_f_mul((x), (y)))
382 # define MAD_F_MLA(hi, lo, x, y)((lo) += mad_f_mul((x), (y))) 440 # define MAD_F_MLA(hi, lo, x, y)((lo) += mad_f_mul((x), (y)))
441 # define MAD_F_MLN(hi, lo) ((lo) = -(lo))
383 # define MAD_F_MLZ(hi, lo) ((void) (hi), (mad_fixed_t) (lo)) 442 # define MAD_F_MLZ(hi, lo) ((void) (hi), (mad_fixed_t) (lo))
384# endif 443# endif
@@ -388,4 +447,8 @@ typedef unsigned long mad_fixed64lo_t;
388# endif 447# endif
389 448
449# if !defined(MAD_F_MLN)
450 # define MAD_F_MLN(hi, lo) ((hi) = ((lo) = -(lo)) ? ~(hi) : -(hi))
451# endif
452
390# if !defined(MAD_F_MLZ) 453# if !defined(MAD_F_MLZ)
391 # define MAD_F_MLZ(hi, lo) mad_f_scale64((hi), (lo)) 454 # define MAD_F_MLZ(hi, lo) mad_f_scale64((hi), (lo))