system/ByteOrder: use GCC built-ins if available
This commit is contained in:
parent
6e66a5b77b
commit
821bc6d777
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2011-2013 Max Kellermann <max@duempel.org>,
|
* Copyright (C) 2011-2015 Max Kellermann <max@duempel.org>,
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
@ -30,6 +30,8 @@
|
|||||||
#ifndef BYTE_ORDER_HXX
|
#ifndef BYTE_ORDER_HXX
|
||||||
#define BYTE_ORDER_HXX
|
#define BYTE_ORDER_HXX
|
||||||
|
|
||||||
|
#include "Compiler.h"
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#if defined(__i386__) || defined(__x86_64__) || defined(__ARMEL__)
|
#if defined(__i386__) || defined(__x86_64__) || defined(__ARMEL__)
|
||||||
@ -74,24 +76,54 @@ IsBigEndian()
|
|||||||
return IS_BIG_ENDIAN;
|
return IS_BIG_ENDIAN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline constexpr uint16_t
|
||||||
|
GenericByteSwap16(uint16_t value)
|
||||||
|
{
|
||||||
|
return (value >> 8) | (value << 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline constexpr uint32_t
|
||||||
|
GenericByteSwap32(uint32_t value)
|
||||||
|
{
|
||||||
|
return (value >> 24) | ((value >> 8) & 0x0000ff00) |
|
||||||
|
((value << 8) & 0x00ff0000) | (value << 24);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline constexpr uint64_t
|
||||||
|
GenericByteSwap64(uint64_t value)
|
||||||
|
{
|
||||||
|
return uint64_t(GenericByteSwap32(uint32_t(value >> 32)))
|
||||||
|
| (uint64_t(GenericByteSwap32(value)) << 32);
|
||||||
|
}
|
||||||
|
|
||||||
static inline constexpr uint16_t
|
static inline constexpr uint16_t
|
||||||
ByteSwap16(uint16_t value)
|
ByteSwap16(uint16_t value)
|
||||||
{
|
{
|
||||||
return (value >> 8) | (value << 8);
|
#if CLANG_OR_GCC_VERSION(4,8)
|
||||||
|
return __builtin_bswap16(value);
|
||||||
|
#else
|
||||||
|
return GenericByteSwap16(value);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline constexpr uint32_t
|
static inline constexpr uint32_t
|
||||||
ByteSwap32(uint32_t value)
|
ByteSwap32(uint32_t value)
|
||||||
{
|
{
|
||||||
return (value >> 24) | ((value >> 8) & 0x0000ff00) |
|
#if CLANG_OR_GCC_VERSION(4,3)
|
||||||
((value << 8) & 0x00ff0000) | (value << 24);
|
return __builtin_bswap32(value);
|
||||||
|
#else
|
||||||
|
return GenericByteSwap32(value);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline constexpr uint64_t
|
static inline constexpr uint64_t
|
||||||
ByteSwap64(uint64_t value)
|
ByteSwap64(uint64_t value)
|
||||||
{
|
{
|
||||||
return uint64_t(ByteSwap32(uint32_t(value >> 32)))
|
#if CLANG_OR_GCC_VERSION(4,3)
|
||||||
| (uint64_t(ByteSwap32(value)) << 32);
|
return __builtin_bswap64(value);
|
||||||
|
#else
|
||||||
|
return GenericByteSwap64(value);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user