comparison external Frameworks/aubioFullOSXUni/include/libsamplerate/float_cast.h @ 0:8f67db3c0b01

started repository, works as max object aubioOnsetDetect
author Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk>
date Tue, 18 Oct 2011 01:28:42 +0100
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:8f67db3c0b01
1 /*
2 ** Copyright (C) 2001-2008 Erik de Castro Lopo <erikd@mega-nerd.com>
3 **
4 ** This program is free software; you can redistribute it and/or modify
5 ** it under the terms of the GNU Lesser General Public License as published by
6 ** the Free Software Foundation; either version 2.1 of the License, or
7 ** (at your option) any later version.
8 **
9 ** This program is distributed in the hope that it will be useful,
10 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 ** GNU Lesser General Public License for more details.
13 **
14 ** You should have received a copy of the GNU Lesser General Public License
15 ** along with this program; if not, write to the Free Software
16 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17 */
18
19 /* Version 1.4 */
20
21 #ifndef FLOAT_CAST_HEADER
22 #define FLOAT_CAST_HEADER
23
24 /*============================================================================
25 ** On Intel Pentium processors (especially PIII and probably P4), converting
26 ** from float to int is very slow. To meet the C specs, the code produced by
27 ** most C compilers targeting Pentium needs to change the FPU rounding mode
28 ** before the float to int conversion is performed.
29 **
30 ** Changing the FPU rounding mode causes the FPU pipeline to be flushed. It
31 ** is this flushing of the pipeline which is so slow.
32 **
33 ** Fortunately the ISO C99 specifications define the functions lrint, lrintf,
34 ** llrint and llrintf which fix this problem as a side effect.
35 **
36 ** On Unix-like systems, the configure process should have detected the
37 ** presence of these functions. If they weren't found we have to replace them
38 ** here with a standard C cast.
39 */
40
41 /*
42 ** The C99 prototypes for lrint and lrintf are as follows:
43 **
44 ** long int lrintf (float x) ;
45 ** long int lrint (double x) ;
46 */
47
48 #include "config.h"
49
50 /*
51 ** The presence of the required functions are detected during the configure
52 ** process and the values HAVE_LRINT and HAVE_LRINTF are set accordingly in
53 ** the config.h file.
54 */
55
56 #define HAVE_LRINT_REPLACEMENT 0
57
58 #if (HAVE_LRINT && HAVE_LRINTF)
59
60 /*
61 ** These defines enable functionality introduced with the 1999 ISO C
62 ** standard. They must be defined before the inclusion of math.h to
63 ** engage them. If optimisation is enabled, these functions will be
64 ** inlined. With optimisation switched off, you have to link in the
65 ** maths library using -lm.
66 */
67
68 #define _ISOC9X_SOURCE 1
69 #define _ISOC99_SOURCE 1
70
71 #define __USE_ISOC9X 1
72 #define __USE_ISOC99 1
73
74 #include <math.h>
75
76 #elif (defined (__CYGWIN__))
77
78 #include <math.h>
79
80 #undef HAVE_LRINT_REPLACEMENT
81 #define HAVE_LRINT_REPLACEMENT 1
82
83 #undef lrint
84 #undef lrintf
85
86 #define lrint double2int
87 #define lrintf float2int
88
89 /*
90 ** The native CYGWIN lrint and lrintf functions are buggy:
91 ** http://sourceware.org/ml/cygwin/2005-06/msg00153.html
92 ** http://sourceware.org/ml/cygwin/2005-09/msg00047.html
93 ** and slow.
94 ** These functions (pulled from the Public Domain MinGW math.h header)
95 ** replace the native versions.
96 */
97
98 static inline long double2int (double in)
99 { long retval ;
100
101 __asm__ __volatile__
102 ( "fistpl %0"
103 : "=m" (retval)
104 : "t" (in)
105 : "st"
106 ) ;
107
108 return retval ;
109 } /* double2int */
110
111 static inline long float2int (float in)
112 { long retval ;
113
114 __asm__ __volatile__
115 ( "fistpl %0"
116 : "=m" (retval)
117 : "t" (in)
118 : "st"
119 ) ;
120
121 return retval ;
122 } /* float2int */
123
124 #elif (defined (WIN32) || defined (_WIN32))
125
126 #undef HAVE_LRINT_REPLACEMENT
127 #define HAVE_LRINT_REPLACEMENT 1
128
129 #include <math.h>
130
131 /*
132 ** Win32 doesn't seem to have these functions.
133 ** Therefore implement inline versions of these functions here.
134 */
135
136 __inline long int
137 lrint (double flt)
138 { int intgr ;
139
140 _asm
141 { fld flt
142 fistp intgr
143 } ;
144
145 return intgr ;
146 }
147
148 __inline long int
149 lrintf (float flt)
150 { int intgr ;
151
152 _asm
153 { fld flt
154 fistp intgr
155 } ;
156
157 return intgr ;
158 }
159
160 #elif (defined (__MWERKS__) && defined (macintosh))
161
162 /* This MacOS 9 solution was provided by Stephane Letz */
163
164 #undef HAVE_LRINT_REPLACEMENT
165 #define HAVE_LRINT_REPLACEMENT 1
166 #include <math.h>
167
168 #undef lrint
169 #undef lrintf
170
171 #define lrint double2int
172 #define lrintf float2int
173
174 inline int
175 float2int (register float in)
176 { long res [2] ;
177
178 asm
179 { fctiw in, in
180 stfd in, res
181 }
182 return res [1] ;
183 } /* float2int */
184
185 inline int
186 double2int (register double in)
187 { long res [2] ;
188
189 asm
190 { fctiw in, in
191 stfd in, res
192 }
193 return res [1] ;
194 } /* double2int */
195
196 #elif (defined (__MACH__) && defined (__APPLE__))
197
198 /* For Apple MacOSX. */
199
200 #undef HAVE_LRINT_REPLACEMENT
201 #define HAVE_LRINT_REPLACEMENT 1
202 #include <math.h>
203
204 #undef lrint
205 #undef lrintf
206
207 #define lrint double2int
208 #define lrintf float2int
209
210 inline static long
211 float2int (register float in)
212 { int res [2] ;
213
214 __asm__ __volatile__
215 ( "fctiw %1, %1\n\t"
216 "stfd %1, %0"
217 : "=m" (res) /* Output */
218 : "f" (in) /* Input */
219 : "memory"
220 ) ;
221
222 return res [1] ;
223 } /* lrintf */
224
225 inline static long
226 double2int (register double in)
227 { int res [2] ;
228
229 __asm__ __volatile__
230 ( "fctiw %1, %1\n\t"
231 "stfd %1, %0"
232 : "=m" (res) /* Output */
233 : "f" (in) /* Input */
234 : "memory"
235 ) ;
236
237 return res [1] ;
238 } /* lrint */
239
240 #else
241 #ifndef __sgi
242 #warning "Don't have the functions lrint() and lrintf()."
243 #warning "Replacing these functions with a standard C cast."
244 #endif
245
246 #include <math.h>
247
248 #define lrint(dbl) ((long) (dbl))
249 #define lrintf(flt) ((long) (flt))
250
251 #endif
252
253
254 #endif /* FLOAT_CAST_HEADER */
255