From eeabf89d19214bb075709009a76b3354c4332ccf Mon Sep 17 00:00:00 2001 From: John Emmas Date: Wed, 17 Jul 2013 14:55:20 +0100 Subject: Miscellaneous header files (needed for building libpbd with MSVC) --- msvc_extra_headers/ardourext/float_cast.h.input | 73 +++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 msvc_extra_headers/ardourext/float_cast.h.input (limited to 'msvc_extra_headers/ardourext/float_cast.h.input') diff --git a/msvc_extra_headers/ardourext/float_cast.h.input b/msvc_extra_headers/ardourext/float_cast.h.input new file mode 100644 index 0000000000..a5a82e3668 --- /dev/null +++ b/msvc_extra_headers/ardourext/float_cast.h.input @@ -0,0 +1,73 @@ +/* +** Copyright (C) 2001 Erik de Castro Lopo +** +** Permission to use, copy, modify, distribute, and sell this file for any +** purpose is hereby granted without fee, provided that the above copyright +** and this permission notice appear in all copies. No representations are +** made about the suitability of this software for any purpose. It is +** provided "as is" without express or implied warranty. +*/ + +/* Version 1.1 */ + + +/*============================================================================ +** On Intel Pentium processors (especially PIII and probably P4), converting +** from float to int is very slow. To meet the C specs, the code produced by +** most C compilers targeting Pentium needs to change the FPU rounding mode +** before the float to int conversion is performed. +** +** Changing the FPU rounding mode causes the FPU pipeline to be flushed. It +** is this flushing of the pipeline which is so slow. +** +** Fortunately the ISO C99 specifications define the functions lrint, lrintf, +** llrint and llrintf which fix this problem as a side effect. +** +** On Unix-like systems, the configure process should have detected the +** presence of these functions. If they weren't found we have to replace them +** here with a standard C cast. +*/ + +/* +** The C99 prototypes for lrint and lrintf are as follows: +** +** long int lrintf (float x) ; +** long int lrint (double x) ; +*/ +#ifndef __FLOAT_CAST_H__ // Added by JE - 30-11-2009 +#define __FLOAT_CAST_H__ +#if (defined (WIN32) || defined (_WIN32)) + + #include + + /* Win32 doesn't seem to have these functions. + ** Therefore implement inline versions of these functions here. + */ + + __inline long int + lrint (double flt) + { int intgr; + + _asm + { fld flt + fistp intgr + } ; + + return intgr ; + } + + __inline long int + lrintf (float flt) + { int intgr; + + _asm + { fld flt + fistp intgr + } ; + + return intgr ; + } + +#endif + +#endif // __FLOAT_CAST_H__ -- cgit v1.2.3