# CMake build for xerces-c # # Written by Roger Leigh # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # SSE2 support include(CheckCXXSourceCompiles) option(sse2 "SSE2 support" ON) if(sse2) set(CMAKE_CXX_FLAGS_SAVE "${CMAKE_CXX_FLAGS}") if (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(CMAKE_CXX_FLAGS_SAVE "${CMAKE_CXX_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse2") check_cxx_source_compiles(" #include int main() { __m128i one; return 0; }" CXX_NEEDS_msse2) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_SAVE}") if(CXX_NEEDS_msse2) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse2") endif() endif() check_cxx_source_compiles(" #include int main() { return 0; }" XERCES_HAVE_INTRIN_H) check_cxx_source_compiles(" #include int main() { return 0; }" XERCES_HAVE_EMMINTRIN_H) check_cxx_source_compiles(" #include int main() { return 0; }" HAVE_CPUID_H) check_cxx_source_compiles(" #include int main() { int CPUInfo[4]; __cpuid(CPUInfo, 1); return 0; }" XERCES_HAVE_CPUID_INTRINSIC) check_cxx_source_compiles(" #include int main() { unsigned int eax, ebx, ecx, edx; __get_cpuid (1, &eax, &ebx, &ecx, &edx); return 0; }" XERCES_HAVE_GETCPUID) check_cxx_source_compiles(" #include int main() { __m128i* one=(__m128i*)_mm_malloc(4, 16); __m128i* two=(__m128i*)_mm_malloc(4, 16); __m128i xmm1 = _mm_load_si128(one); __m128i xmm2 = _mm_load_si128(two); __m128i xmm3 = _mm_or_si128(xmm1, xmm2); _mm_store_si128(one, xmm3); _mm_free(one); _mm_free(two); return 0; }" XERCES_HAVE_SSE2_INTRINSIC) # SSE2 not functional; restore flags if(NOT XERCES_HAVE_SSE2_INTRINSIC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_SAVE}") endif() endif()