Separate detection of GCC builtin bswap() functions for 16b and 32b

This commit is contained in:
Hugues Delorme 2014-02-25 09:53:36 +01:00
parent cd271d709c
commit 01d9e3a3f7
3 changed files with 13 additions and 5 deletions

View File

@ -30,8 +30,12 @@ endif()
# Have builtin byte swap functions ?
if(CMAKE_COMPILER_IS_GNUCC)
# __builtin_bswap16() is missing in x86 GCC version prior to v4.7
# See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52624
check_c_source_compiles("int main() { return (int)__builtin_bswap16(0x1122); }"
FOUG_HAVE_GCC_BUILTIN_BSWAP16_FUNC)
check_c_source_compiles("int main() { return (int)__builtin_bswap32(0x11223344); }"
FOUG_HAVE_GCC_BUILTIN_BSWAP_FUNC)
FOUG_HAVE_GCC_BUILTIN_BSWAP32_FUNC)
elseif(MSVC)
check_c_source_compiles("#include <stdlib.h>
int main() { return (int)_byteswap_ulong(0x11223344); }"

View File

@ -11,8 +11,12 @@
#cmakedefine FOUG_HAVE_STRTOF_FUNC
#endif
#ifndef FOUG_HAVE_GCC_BUILTIN_BSWAP_FUNC
#cmakedefine FOUG_HAVE_GCC_BUILTIN_BSWAP_FUNC
#ifndef FOUG_HAVE_GCC_BUILTIN_BSWAP16_FUNC
#cmakedefine FOUG_HAVE_GCC_BUILTIN_BSWAP16_FUNC
#endif
#ifndef FOUG_HAVE_GCC_BUILTIN_BSWAP32_FUNC
#cmakedefine FOUG_HAVE_GCC_BUILTIN_BSWAP32_FUNC
#endif
#ifndef FOUG_HAVE_MSVC_BUILTIN_BSWAP_FUNC

View File

@ -12,7 +12,7 @@
/*! Returns \p val with the order of bytes reversed, uses compiler builtin functions if available */
FOUG_INLINE static uint16_t foug_uint16_bswap(uint16_t val)
{
#ifdef FOUG_HAVE_GCC_BUILTIN_BSWAP_FUNC
#ifdef FOUG_HAVE_GCC_BUILTIN_BSWAP16_FUNC
return __builtin_bswap16(val);
#elif defined(FOUG_HAVE_MSVC_BUILTIN_BSWAP_FUNC)
return _byteswap_ushort(val);
@ -24,7 +24,7 @@ FOUG_INLINE static uint16_t foug_uint16_bswap(uint16_t val)
/*! Returns \p val with the order of bytes reversed, uses compiler builtin functions if available */
FOUG_INLINE static uint32_t foug_uint32_bswap(uint32_t val)
{
#ifdef FOUG_HAVE_GCC_BUILTIN_BSWAP_FUNC
#ifdef FOUG_HAVE_GCC_BUILTIN_BSWAP32_FUNC
return __builtin_bswap32(val);
#elif defined(FOUG_HAVE_MSVC_BUILTIN_BSWAP_FUNC)
return _byteswap_ulong(val);