merge all mingw and msvc specific code for FPU information into libs/pbd/fpu.cc and remove msvc-specific version

This commit is contained in:
Paul Davis
2015-04-21 11:39:19 -04:00
parent 63b3967724
commit a5d7e8446b
3 changed files with 29 additions and 121 deletions

View File

@@ -16,7 +16,7 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#if !(defined (COMPILER_MSVC) || defined (COMPILER_MINGW))
#include "libpbd-config.h"
#define _XOPEN_SOURCE 600
@@ -43,7 +43,24 @@ FPU::FPU ()
return;
#else
#ifndef _LP64 //USE_X86_64_ASM
#ifdef PLATFORM_WINDOWS
#ifndef USE_X86_64_ASM
/* no 32 bit version of assembler for windows */
return;
#else
// Get CPU flags using Microsoft function
// It works for both 64 and 32 bit systems
// no need to use assembler for getting info from register, this function does this for us
int cpuInfo[4];
__cpuid (cpuInfo, 1);
cpuflags = cpuInfo[3];
#endif
#else
#ifndef USE_X86_64_ASM /* *nix; 32 bit version */
asm volatile (
"mov $1, %%eax\n"
"pushl %%ebx\n"
@@ -55,7 +72,7 @@ FPU::FPU ()
: "%eax", "%ecx", "%edx"
);
#else
#else /* *nix; 64 bit version */
/* asm notes: although we explicitly save&restore rbx, we must tell
gcc that ebx,rbx is clobbered so that it doesn't try to use it as an intermediate
@@ -75,6 +92,7 @@ FPU::FPU ()
);
#endif /* USE_X86_64_ASM */
#endif /* PLATFORM_WINDOWS */
if (cpuflags & (1<<25)) {
_flags = Flags (_flags | (HasSSE|HasFlushToZero));
@@ -112,12 +130,19 @@ FPU::FPU ()
memset (*fxbuf, 0, 512);
#ifdef COMPILER_MSVC
__asm {
mov eax, fxbuf
fxsave [eax]
};
#else
asm volatile (
"fxsave (%0)"
:
: "r" (*fxbuf)
: "memory"
);
#endif
uint32_t mxcsr_mask = *((uint32_t*) &((*fxbuf)[28]));
@@ -140,7 +165,3 @@ FPU::FPU ()
FPU::~FPU ()
{
}
#else // COMPILER_MSVC
const char* pbd_fpu = "pbd/msvc/fpu.cc takes precedence over this file";
#endif // COMPILER_MSVC

View File

@@ -1,111 +0,0 @@
// Added by JE - 05-12-2009. Inline assembler instructions
// have been changed to Intel format and (in the case of
// cpuid) was replaced by the equivalent VC++ system call).
#if defined (COMPILER_MSVC) || defined (COMPILER_MINGW)
#define _XOPEN_SOURCE 600
#include <cstdlib>
#include <stdint.h>
#include <intrin.h> // Added by JE - 05-12-2009
#include <assert.h>
#include <pbd/fpu.h>
#include <pbd/error.h>
#include "i18n.h"
using namespace PBD;
using namespace std;
FPU::FPU ()
{
unsigned long cpuflags = 0;
_flags = (Flags)0;
#ifndef USE_X86_64_ASM
return;
#endif
// Get CPU lfags using Microsof function
// It works for both 64 and 32 bit systems
// no need to use assembler for getting info from register, this function does this for us
int cpuInfo[4];
__cpuid (cpuInfo, 1);
cpuflags = cpuInfo[3];
if (cpuflags & (1<<25)) {
_flags = Flags (_flags | (HasSSE|HasFlushToZero) );
}
if (cpuflags & (1<<26)) {
_flags = Flags (_flags | HasSSE2);
}
if (cpuflags & (1 << 24)) {
char** fxbuf = 0;
// allocate alligned buffer
fxbuf = (char **) malloc (sizeof (char *));
assert (fxbuf);
*fxbuf = (char *) malloc (512);
assert (*fxbuf);
// Verify that fxbuf is correctly aligned
unsigned long long buf_addr = (unsigned long long)(void*)fxbuf;
if ((0 == buf_addr) || (buf_addr % 16))
error << _("cannot allocate 16 byte aligned buffer for h/w feature detection") << endmsg;
else
{
memset(*fxbuf, 0, 512); // Initialize the buffer !!! Added by JE - 12-12-2009
#if defined (COMPILER_MINGW)
asm volatile (
"fxsave (%0)"
:
: "r" (*fxbuf)
: "memory"
);
/*
asm( ".intel_syntax noprefix\n" );
asm volatile (
"mov eax, fxbuf\n"
"fxsave [eax]\n"
);
asm( ".att_syntax prefix\n" );
*/
#elif defined (COMPILER_MSVC)
__asm {
mov eax, fxbuf
fxsave [eax]
};
#endif
uint32_t mxcsr_mask = *((uint32_t*) &fxbuf[28]);
/* if the mask is zero, set its default value (from intel specs) */
if (mxcsr_mask == 0) {
mxcsr_mask = 0xffbf;
}
if (mxcsr_mask & (1<<6)) {
_flags = Flags (_flags | HasDenormalsAreZero);
}
free (*fxbuf);
free (fxbuf);
}
}
}
FPU::~FPU ()
{
}
#else // !COMPILER_MSVC
const char* pbd_fpu = "original pbd/fpu.cc takes precedence over this file";
#endif // COMPILER_MSVC

View File

@@ -48,6 +48,7 @@ libpbd_sources = [
'error.cc',
'ffs.cc',
'file_utils.cc',
'fpu.cc',
'glib_semaphore.cc',
'id.cc',
'locale_guard.cc',
@@ -152,10 +153,7 @@ def build(bld):
obj.defines += [ 'USE_X86_64_ASM' ]
obj.defines += ['NO_POSIX_MEMALIGN' ]
obj.source += [ 'windows_special_dirs.cc' ]
obj.source += [ 'msvc/fpu.cc' ]
obj.uselib += ' OLE'
else:
obj.source += [ 'fpu.cc' ]
if bld.env['BUILD_TESTS'] and bld.is_defined('HAVE_CPPUNIT'):
# Unit tests