Text archives Help
- From: bigler@sci.utah.edu
- To: manta@sci.utah.edu
- Subject: [Manta] r1905 - in trunk: CMake Core/Math include
- Date: Tue, 4 Dec 2007 15:31:14 -0700 (MST)
Author: bigler
Date: Tue Dec 4 15:31:14 2007
New Revision: 1905
Modified:
trunk/CMake/About.cmake
trunk/CMake/CheckSSE.cmake
trunk/CMake/sseTest.cc
trunk/Core/Math/SSEDefs.h
trunk/include/CMakeLists.txt
trunk/include/MantaSSE.h.CMakeTemplate
Log:
CMake/About.cmake
Remove the SvnInfo target. This isn't necessary if you set the
property of the source file to be GENERATED = TRUE. Hopefully this
will fix the recompiling bug.
CMake/CheckSSE.cmake
After looking over the mailing list, I noticed that this was
broken. Hopefully this fixes things.
I added a MANTA_SSE_TEST_VERBOSE cmake variable that will spit all
sorts of stuff out while doing its work.
I added a MANTA_SSE_CAST cmake variable that turns on if the
MANTA_TEST_CAST test worked.
Made MANTA_SSE_GCC, MANTA_SSE_CAST, and MANTA_SSE_TEST_VERBOSE
advanced options, as users generally don't modify these settings.
CMake/sseTest.cc
Made sure the default test uses both SSE and SSE2.
Added a MANTA_TEST_CAST section.
Added main() as TRY_COMPILE expects to compile an executable.
Core/Math/SSEDefs.h
Instead of relying on compiler versions, we actually test for these
features as part of cmake configure and set some compiler macro
variables.
include/CMakeLists.txt
include/MantaSSE.h.CMakeTemplate
Added MANTA_SSE_GCC and MANTA_SSE_CAST preprocessor macro variables
to MantaSSE.h.
Modified: trunk/CMake/About.cmake
==============================================================================
--- trunk/CMake/About.cmake (original)
+++ trunk/CMake/About.cmake Tue Dec 4 15:31:14 2007
@@ -25,22 +25,18 @@
COMMAND ${CMAKE_COMMAND} -P
${CMAKE_BINARY_DIR}/CMake/src/ConfigureAbout.cmake
)
-# Add a custom target to run the whole thing whenever .svn/entries changes.
-ADD_CUSTOM_TARGET(
- SvnInfo
- # DEPENDS Must match custom command OUTPUT.
- ALL
- DEPENDS ${ABOUT_SRC}
+# Since this is a generated file, mark it as such
+SET_SOURCE_FILES_PROPERTIES(${ABOUT_SRC}
+ PROPERTIES GENERATED TRUE
)
+# Explicitly add the -fPIC flag.
+IF(NOT USING_WINDOWS_CL)
+ SET_SOURCE_FILES_PROPERTIES(${ABOUT_SRC} PROPERTIES COMPILE_FLAGS "-fPIC")
+ENDIF(NOT USING_WINDOWS_CL)
+
# Add a static library.
ADD_LIBRARY(About STATIC
${ABOUT_SRC}
)
-
-# Explicitly add the -fPIC flag.
-SET_SOURCE_FILES_PROPERTIES(${ABOUT_SRC} PROPERTIES COMPILE_FLAGS "-fPIC")
-
-
-ADD_DEPENDENCIES(About SvnInfo)
Modified: trunk/CMake/CheckSSE.cmake
==============================================================================
--- trunk/CMake/CheckSSE.cmake (original)
+++ trunk/CMake/CheckSSE.cmake Tue Dec 4 15:31:14 2007
@@ -3,74 +3,120 @@
##################################################################
# Test compilation.
-SET(NOT_MANTA_SSE 1)
+SET(MANTA_SSE_TEST_RESULT 0)
# First try.
SET(SSE_TEST_FILE ${CMAKE_SOURCE_DIR}/CMake/sseTest.cc)
-TRY_COMPILE(NOT_MANTA_SSE ${CMAKE_BINARY_DIR}/testSSE ${SSE_TEST_FILE}
+TRY_COMPILE(MANTA_SSE_TEST_RESULT ${CMAKE_BINARY_DIR}/testSSE
${SSE_TEST_FILE}
CMAKE_FLAGS ${CMAKE_CXX_FLAGS}
- OUTPUT_VARIABLE SSE_TEST_BUILD_OUTPUT
+ OUTPUT_VARIABLE MANTA_SSE_TEST_OUTPUT
)
+SET(MANTA_SSE_TEST_VERBOSE FALSE CACHE BOOL "Turn out verbose SSE checks")
+
+IF(MANTA_SSE_TEST_VERBOSE)
+ MESSAGE("CMAKE_CXX_FLAGS = ${CMAKE_CXX_FLAGS}")
+ MESSAGE("MANTA_SSE_TEST_RESULT = ${MANTA_SSE_TEST_RESULT}")
+ MESSAGE("MANTA_SSE_TEST_OUTPUT = ${MANTA_SSE_TEST_OUTPUT}")
+ENDIF(MANTA_SSE_TEST_VERBOSE)
+
# If not, Try adding -msse flags and see if that makes it work.
-IF (NOT_MANTA_SSE)
+IF (NOT MANTA_SSE_TEST_RESULT)
+ IF(MANTA_SSE_TEST_VERBOSE)
+ MESSAGE("First sse build failed. Trying to add some flags.")
+ ENDIF(MANTA_SSE_TEST_VERBOSE)
- SET(BACKUP ${CMAKE_CXX_FLAGS})
IF (USING_WINDOWS_CL)
- SET(CMAKE_CXX_FLAGS "/arch:SSE /arch:SSE2 ${BACKUP}")
+ SET(SSE_FLAGS "/arch:SSE2")
ELSE(USING_WINDOWS_CL)
- SET(CMAKE_CXX_FLAGS "-msse -msse2 ${BACKUP}")
+ SET(SSE_FLAGS "-msse -msse2")
ENDIF(USING_WINDOWS_CL)
-
+
+ SET(SAFE_CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SSE_FLAGS}" CACHE STRING ""
FORCE)
+
# Test again.
- TRY_COMPILE(NOT_MANTA_SSE ${CMAKE_BINARY_DIR}/testSSE ${SSE_TEST_FILE}
- CMAKE_FLAGS ${CMAKE_CXX_FLAGS}
- OUTPUT_VARIABLE SSE_TEST_BUILD_OUTPUT
+ TRY_COMPILE(MANTA_SSE_TEST_RESULT ${CMAKE_BINARY_DIR}/testSSE
${SSE_TEST_FILE}
+ OUTPUT_VARIABLE MANTA_SSE_TEST_OUTPUT
)
+ IF(MANTA_SSE_TEST_VERBOSE)
+ MESSAGE("CMAKE_CXX_FLAGS = ${CMAKE_CXX_FLAGS}")
+ MESSAGE("MANTA_SSE_TEST_RESULT = ${MANTA_SSE_TEST_RESULT}")
+ MESSAGE("MANTA_SSE_TEST_OUTPUT = ${MANTA_SSE_TEST_OUTPUT}")
+ ENDIF(MANTA_SSE_TEST_VERBOSE)
+
# Reset the flags if they didn't help
- IF(NOT_MANTA_SSE)
- SET(CMAKE_CXX_FLAGS ${BACKUP})
- ENDIF(NOT_MANTA_SSE)
+ IF(NOT MANTA_SSE_TEST_RESULT)
+ SET(CMAKE_CXX_FLAGS "${SAFE_CMAKE_CXX_FLAGS}" CACHE STRING "" FORCE)
+ ENDIF(NOT MANTA_SSE_TEST_RESULT)
-ENDIF(NOT_MANTA_SSE)
+ENDIF(NOT MANTA_SSE_TEST_RESULT)
# Add additional try compile tests here...
##################################################################
-# Check if any of the tests passed.
+# Check if any of the tests passed, and perform additional feature searches.
-IF(NOT NOT_MANTA_SSE) # In other words, if any tests passed.
+IF(MANTA_SSE_TEST_RESULT) # In other words, if any tests passed.
+ IF(MANTA_SSE_TEST_VERBOSE)
+ MESSAGE("We have SSE. Now doing feature tests.")
+ ENDIF(MANTA_SSE_TEST_VERBOSE)
+
SET(MANTA_SSE TRUE CACHE BOOL "Compile SSE code.")
# Check to see if the system is using gcc sse intrinsics.
- TRY_COMPILE(NOT_MANTA_SSE_GCC ${CMAKE_BINARY_DIR}/testSSE ${SSE_TEST_FILE}
- CMAKE_FLAGS ${CMAKE_CXX_FLAGS}
+ TRY_COMPILE(MANTA_SSE_TEST_RESULT ${CMAKE_BINARY_DIR}/testSSE
${SSE_TEST_FILE}
COMPILE_DEFINITIONS -DMANTA_TEST_GCC
- OUTPUT_VARIABLE SSE_TEST_BUILD_OUTPUT
+ OUTPUT_VARIABLE MANTA_SSE_TEST_OUTPUT
)
- IF(NOT NOT_MANTA_SSE_GCC)
+ IF(MANTA_SSE_TEST_VERBOSE)
+ MESSAGE("Test for GCC epi64 instrinsics")
+ MESSAGE("MANTA_SSE_TEST_RESULT = ${MANTA_SSE_TEST_RESULT}")
+ MESSAGE("MANTA_SSE_TEST_OUTPUT = ${MANTA_SSE_TEST_OUTPUT}")
+ ENDIF(MANTA_SSE_TEST_VERBOSE)
+
+ IF(MANTA_SSE_TEST_RESULT)
SET(MANTA_SSE_GCC TRUE CACHE BOOL "Found *epi64x intrinsics")
- ELSE(NOT NOT_MANTA_SSE_GCC)
+ ELSE(MANTA_SSE_TEST_RESULT)
SET(MANTA_SSE_GCC FALSE CACHE BOOL "Couldn't find *epi64x intrinsics"
FORCE)
- ENDIF(NOT NOT_MANTA_SSE_GCC)
+ ENDIF(MANTA_SSE_TEST_RESULT)
+
+ # Check to see if the compiler has the cast intrinsics
+ TRY_COMPILE(MANTA_SSE_TEST_RESULT ${CMAKE_BINARY_DIR}/testSSE
${SSE_TEST_FILE}
+ COMPILE_DEFINITIONS -DMANTA_TEST_CAST
+ OUTPUT_VARIABLE MANTA_SSE_TEST_OUTPUT
+ )
+
+ IF(MANTA_SSE_TEST_VERBOSE)
+ MESSAGE("Test for casting instrinsics")
+ MESSAGE("MANTA_SSE_TEST_RESULT = ${MANTA_SSE_TEST_RESULT}")
+ MESSAGE("MANTA_SSE_TEST_OUTPUT = ${MANTA_SSE_TEST_OUTPUT}")
+ ENDIF(MANTA_SSE_TEST_VERBOSE)
+
+ IF(MANTA_SSE_TEST_RESULT)
+ SET(MANTA_SSE_CAST TRUE CACHE BOOL "Found casting intrinsics")
+ ELSE(MANTA_SSE_TEST_RESULT)
+ SET(MANTA_SSE_CAST FALSE CACHE BOOL "Couldn't find casting intrinsics"
FORCE)
+ ENDIF(MANTA_SSE_TEST_RESULT)
-ELSE(NOT NOT_MANTA_SSE) # All tests failed.
+ELSE(MANTA_SSE_TEST_RESULT) # All tests failed.
IF(MANTA_SSE)
- MESSAGE("Couldn't compile with sse (already tried -msse options..).")
+ MESSAGE("Couldn't compile with sse (already tried ${SSE_FLAGS}
options..).")
+ MESSAGE("--debug-trycompile may be passed to CMake to avoid cleaning up
temporary TRY_COMPILE files.")
+ MESSAGE("Also try setting MANTA_SSE_TEST_VERBOSE to true in the advanced
options to see compiler output.")
MESSAGE("compiler: " ${CMAKE_CXX_COMPILER})
MESSAGE("compiler flags: " ${CMAKE_CXX_FLAGS})
- MESSAGE(${OUTPUT})
+ MESSAGE(${MANTA_SSE_TEST_OUTPUT})
ENDIF(MANTA_SSE)
- # Nothing is available.
+ # Force SSE off
SET(MANTA_SSE FALSE CACHE BOOL "Couldn't compile SSE code." FORCE)
- SET(MANTA_SSE_GCC FALSE CACHE BOOL "Couldn't find *epi64x intrinsics."
FORCE)
-ENDIF(NOT NOT_MANTA_SSE)
+ENDIF(MANTA_SSE_TEST_RESULT)
IF (CYGWIN)
IF (MANTA_SSE)
@@ -79,3 +125,12 @@
ENDIF (MANTA_SSE)
ENDIF (CYGWIN)
+# Turn off other SSE variables if SSE isn't available
+IF(NOT MANTA_SSE)
+ SET(MANTA_SSE_GCC FALSE CACHE BOOL "Couldn't find *epi64x intrinsics."
FORCE)
+ SET(MANTA_SSE_CAST FALSE CACHE BOOL "Couldn't find casting intrinsics"
FORCE)
+ENDIF(NOT MANTA_SSE)
+
+MARK_AS_ADVANCED(MANTA_SSE_GCC)
+MARK_AS_ADVANCED(MANTA_SSE_CAST)
+MARK_AS_ADVANCED(MANTA_SSE_TEST_VERBOSE)
Modified: trunk/CMake/sseTest.cc
==============================================================================
--- trunk/CMake/sseTest.cc (original)
+++ trunk/CMake/sseTest.cc Tue Dec 4 15:31:14 2007
@@ -1,6 +1,22 @@
#include <emmintrin.h>
-static __m128 float_sse_var;
+
+static __m128 float_sse_var = _mm_set_ps1(1.f);
+static __m128i int_sse_var = _mm_set1_epi32(2);
+
#ifdef MANTA_TEST_GCC
-static __m128i int_sse_var = _mm_set1_epi64x( (long long)1 );
+static __m128i gcc_guy = _mm_set1_epi64x( (long long)1 );
#endif
+
+#ifdef MANTA_TEST_CAST
+static __m128i cast_float_to_int = _mm_castps_si128(float_sse_var);
+static __m128 cast_int_to_float = _mm_castsi128_ps(cast_float_to_int);
+static __m128d cast_float_to_double = _mm_castps_pd(float_sse_var);
+static __m128 cast_double_to_float = _mm_castpd_ps(cast_float_to_double);
+#endif
+
+int main()
+{
+ return 0;
+}
+
Modified: trunk/Core/Math/SSEDefs.h
==============================================================================
--- trunk/Core/Math/SSEDefs.h (original)
+++ trunk/Core/Math/SSEDefs.h Tue Dec 4 15:31:14 2007
@@ -82,8 +82,7 @@
int i[4];
};
-#if defined(__x86_64) && defined(__INTEL_COMPILER)
-
+#ifndef MANTA_SSE_GCC
// Stores 1 64 bit int twice in 4 32 bit ints
//
// [high32, low32, high32, low32]
@@ -100,9 +99,8 @@
#endif
- //#ifdef __CYGWIN__
-#if (defined(__GNUC__) && __GNUC__ < 4 && !defined(__INTEL_COMPILER)) ||
(defined(_MSC_VER) && (_MSC_VER < 1500))
- // Intel casting intrinsics.
+#ifndef MANTA_SSE_CAST
+ // Define some casting functions if the intrinsics don't exist
static inline __m128i _mm_castps_si128(__m128 val) { union { __m128 f;
__m128i i;} c; c.f = val; return c.i; }
static inline __m128 _mm_castsi128_ps(__m128i val) { union { __m128 f;
__m128i i;} c; c.i = val; return c.f; }
static inline __m128d _mm_castps_pd (__m128 val) { union { __m128 f;
__m128d d;} c; c.f = val; return c.d; }
Modified: trunk/include/CMakeLists.txt
==============================================================================
--- trunk/include/CMakeLists.txt (original)
+++ trunk/include/CMakeLists.txt Tue Dec 4 15:31:14 2007
@@ -47,6 +47,18 @@
SET(MANTA_SSE_DEF "0" CACHE INTERNAL "Turn off SSE code")
ENDIF(MANTA_SSE)
+IF(MANTA_SSE_GCC)
+ SET(MANTA_SSE_GCC_DEF "1" CACHE INTERNAL "Has GCC 64 bit SSE extensions")
+ELSE(MANTA_SSE_GCC)
+ SET(MANTA_SSE_GCC_DEF "0" CACHE INTERNAL "Doesn't have GCC 64 bit SSE
extensions")
+ENDIF(MANTA_SSE_GCC)
+
+IF(MANTA_SSE_CAST)
+ SET(MANTA_SSE_CAST_DEF "1" CACHE INTERNAL "Casting intrinsics found.")
+ELSE(MANTA_SSE_CAST)
+ SET(MANTA_SSE_CAST_DEF "0" CACHE INTERNAL "No casting intrinsics found.")
+ENDIF(MANTA_SSE_CAST)
+
CONFIGURE_FILE(
${CMAKE_CURRENT_SOURCE_DIR}/MantaSSE.h.CMakeTemplate
${CMAKE_BINARY_DIR}/include/MantaSSE.h
Modified: trunk/include/MantaSSE.h.CMakeTemplate
==============================================================================
--- trunk/include/MantaSSE.h.CMakeTemplate (original)
+++ trunk/include/MantaSSE.h.CMakeTemplate Tue Dec 4 15:31:14 2007
@@ -34,4 +34,12 @@
#define MANTA_SSE 1
#endif
+#if ${MANTA_SSE_GCC_DEF}
+# define MANTA_SSE_GCC ${MANTA_SSE_GCC_DEF}
+#endif
+
+#if ${MANTA_SSE_CAST_DEF}
+# define MANTA_SSE_CAST ${MANTA_SSE_CAST_DEF}
+#endif
+
#endif
- [Manta] r1905 - in trunk: CMake Core/Math include, bigler, 12/04/2007
Archive powered by MHonArc 2.6.16.