From 4d662c42b3f984b68b4fc38c8807abff6ec7622b Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 2 Apr 2018 10:27:05 +0200 Subject: [PATCH] Add check for SSE2-support. --- code/CMakeLists.txt | 2 ++ code/simd.cpp | 34 ++++++++++++++++++++++++++++++++++ code/simd.h | 5 +++++ test/CMakeLists.txt | 1 + test/unit/utAnim.cpp | 4 +--- 5 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 code/simd.cpp create mode 100644 code/simd.h diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 7ae1a7e63..d5d05db18 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -186,6 +186,8 @@ SET( Common_SRCS Bitmap.cpp Version.cpp CreateAnimMesh.cpp + simd.h + simd.cpp ) SOURCE_GROUP(Common FILES ${Common_SRCS}) diff --git a/code/simd.cpp b/code/simd.cpp new file mode 100644 index 000000000..e07398156 --- /dev/null +++ b/code/simd.cpp @@ -0,0 +1,34 @@ +#include "simd.h" + +namespace Assimp { + bool CPUSupportsSSE2() { +#if defined(__x86_64__) || defined(_M_X64) + //* x86_64 always has SSE2 instructions */ + return true; +#elif defined(__GNUC__) && defined(i386) + // for GCC x86 we check cpuid + unsigned int d; + __asm__( + "pushl %%ebx\n\t" + "cpuid\n\t" + "popl %%ebx\n\t" + : "=d" ( d ) + :"a" ( 1 ) ); + return ( d & 0x04000000 ) != 0; +#elif (defined(_MSC_VER) && defined(_M_IX86)) + // also check cpuid for MSVC x86 + unsigned int d; + __asm { + xor eax, eax + inc eax + push ebx + cpuid + pop ebx + mov d, edx + } + return ( d & 0x04000000 ) != 0; +#else + return false; +#endif + } +} diff --git a/code/simd.h b/code/simd.h new file mode 100644 index 000000000..d490cbe85 --- /dev/null +++ b/code/simd.h @@ -0,0 +1,5 @@ +#pragma once + +namespace Assimp { + bool CPUSupportsSSE2(); +} diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 049dbcdd2..7c5ff3706 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -53,6 +53,7 @@ endif() LINK_DIRECTORIES( ${Assimp_BINARY_DIR} ${AssetImporter_BINARY_DIR}/lib ) SET( COMMON + unit/utSimd.cpp unit/utIOSystem.cpp unit/utIOStreamBuffer.cpp unit/utIssues.cpp diff --git a/test/unit/utAnim.cpp b/test/unit/utAnim.cpp index 04ee8c96d..40c840d7e 100644 --- a/test/unit/utAnim.cpp +++ b/test/unit/utAnim.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2018, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -106,4 +104,4 @@ TEST_F( utAnim, aiAnimationTest ) { ok = false; } EXPECT_TRUE( ok ); -} \ No newline at end of file +}