diff options
author | Juergen Beisert <jbe@pengutronix.de> | 2011-06-06 16:57:16 +0200 |
---|---|---|
committer | Juergen Beisert <jbe@pengutronix.de> | 2011-06-06 16:57:16 +0200 |
commit | dd57c62797d2b8d05e224680c7bc6e3d4640dde0 (patch) | |
tree | 30046767e14e220ac2b66e2314530565b2117b40 /common/EndianUtilities.h | |
parent | 3647e131f8f2779d203d737a3c59baf6c061d528 (diff) | |
download | mxs-utils-dd57c62797d2b8d05e224680c7bc6e3d4640dde0.tar.gz mxs-utils-dd57c62797d2b8d05e224680c7bc6e3d4640dde0.tar.xz |
Import FSL's release 10.11.01
Signed-off-by: Juergen Beisert <jbe@pengutronix.de>
Diffstat (limited to 'common/EndianUtilities.h')
-rw-r--r-- | common/EndianUtilities.h | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/common/EndianUtilities.h b/common/EndianUtilities.h new file mode 100644 index 0000000..f915309 --- /dev/null +++ b/common/EndianUtilities.h @@ -0,0 +1,141 @@ +/* + * File: EndianUtilities.h + * + * Copyright (c) Freescale Semiconductor, Inc. All rights reserved. + * See included license file for license details. + */ +#if !defined(_EndianUtilities_h_) +#define _EndianUtilities_h_ + +//! \name Swap macros +//! These macros always swap the data. +//@{ + +//! Byte swap 16-bit value. +#define _BYTESWAP16(value) \ + (((((uint16_t)value)<<8) & 0xFF00) | \ + ((((uint16_t)value)>>8) & 0x00FF)) + +//! Byte swap 32-bit value. +#define _BYTESWAP32(value) \ + (((((uint32_t)value)<<24) & 0xFF000000) | \ + ((((uint32_t)value)<< 8) & 0x00FF0000) | \ + ((((uint32_t)value)>> 8) & 0x0000FF00) | \ + ((((uint32_t)value)>>24) & 0x000000FF)) + +//! Byte swap 64-bit value. +#define _BYTESWAP64(value) \ + (((((uint64_t)value)<<56) & 0xFF00000000000000ULL) | \ + ((((uint64_t)value)<<40) & 0x00FF000000000000ULL) | \ + ((((uint64_t)value)<<24) & 0x0000FF0000000000ULL) | \ + ((((uint64_t)value)<< 8) & 0x000000FF00000000ULL) | \ + ((((uint64_t)value)>> 8) & 0x00000000FF000000ULL) | \ + ((((uint64_t)value)>>24) & 0x0000000000FF0000ULL) | \ + ((((uint64_t)value)>>40) & 0x000000000000FF00ULL) | \ + ((((uint64_t)value)>>56) & 0x00000000000000FFULL)) + +//@} + +//! \name Inline swap functions +//@{ + +inline uint16_t _swap_u16(uint16_t value) { return _BYTESWAP16(value); } +inline int16_t _swap_s16(int16_t value) { return (int16_t)_BYTESWAP16((uint16_t)value); } + +inline uint32_t _swap_u32(uint32_t value) { return _BYTESWAP32(value); } +inline int32_t _swap_s32(int32_t value) { return (int32_t)_BYTESWAP32((uint32_t)value); } + +inline uint64_t _swap_u64(uint64_t value) { return _BYTESWAP64(value); } +inline int64_t _swap_s64(int64_t value) { return (uint64_t)_BYTESWAP64((uint64_t)value); } + +//@} + +#if defined(__LITTLE_ENDIAN__) + + /* little endian host */ + + #define ENDIAN_BIG_TO_HOST_U16(value) (_swap_u16(value)) + #define ENDIAN_HOST_TO_BIG_U16(value) (_swap_u16(value)) + + #define ENDIAN_BIG_TO_HOST_S16(value) (_swap_s16(value)) + #define ENDIAN_HOST_TO_BIG_S16(value) (_swap_s16(value)) + + #define ENDIAN_BIG_TO_HOST_U32(value) (_swap_u32(value)) + #define ENDIAN_HOST_TO_BIG_U32(value) (_swap_u32(value)) + + #define ENDIAN_BIG_TO_HOST_S32(value) (_swap_s32(value)) + #define ENDIAN_HOST_TO_BIG_S32(value) (_swap_s32(value)) + + #define ENDIAN_BIG_TO_HOST_U64(value) (_swap_u64(value)) + #define ENDIAN_HOST_TO_BIG_U64(value) (_swap_u64(value)) + + #define ENDIAN_BIG_TO_HOST_S64(value) (_swap_s64(value)) + #define ENDIAN_HOST_TO_BIG_S64(value) (_swap_s64(value)) + + /* no-ops */ + + #define ENDIAN_LITTLE_TO_HOST_U16(value) (value) + #define ENDIAN_HOST_TO_LITTLE_U16(value) (value) + + #define ENDIAN_LITTLE_TO_HOST_S16(value) (value) + #define ENDIAN_HOST_TO_LITTLE_S16(value) (value) + + #define ENDIAN_LITTLE_TO_HOST_U32(value) (value) + #define ENDIAN_HOST_TO_LITTLE_U32(value) (value) + + #define ENDIAN_LITTLE_TO_HOST_S32(value) (value) + #define ENDIAN_HOST_TO_LITTLE_S32(value) (value) + + #define ENDIAN_LITTLE_TO_HOST_U64(value) (value) + #define ENDIAN_HOST_TO_LITTLE_U64(value) (value) + + #define ENDIAN_LITTLE_TO_HOST_S64(value) (value) + #define ENDIAN_HOST_TO_LITTLE_S64(value) (value) + +#elif defined(__BIG_ENDIAN__) + + /* big endian host */ + + #define ENDIAN_LITTLE_TO_HOST_U16(value) (_swap_u16(value)) + #define ENDIAN_HOST_TO_LITTLE_U16(value) (_swap_u16(value)) + + #define ENDIAN_LITTLE_TO_HOST_S16(value) (_swap_s16(value)) + #define ENDIAN_HOST_TO_LITTLE_S16(value) (_swap_s16(value)) + + #define ENDIAN_LITTLE_TO_HOST_U32(value) (_swap_u32(value)) + #define ENDIAN_HOST_TO_LITTLE_U32(value) (_swap_u32(value)) + + #define ENDIAN_LITTLE_TO_HOST_S32(value) (_swap_s32(value)) + #define ENDIAN_HOST_TO_LITTLE_S32(value) (_swap_s32(value)) + + #define ENDIAN_LITTLE_TO_HOST_U64(value) (_swap_u64(value)) + #define ENDIAN_HOST_TO_LITTLE_U64(value) (_swap_u64(value)) + + #define ENDIAN_LITTLE_TO_HOST_S64(value) (_swap_s64(value)) + #define ENDIAN_HOST_TO_LITTLE_S64(value) (_swap_s64(value)) + + /* no-ops */ + + #define ENDIAN_BIG_TO_HOST_U16(value) (value) + #define ENDIAN_HOST_TO_BIG_U16(value) (value) + + #define ENDIAN_BIG_TO_HOST_S16(value) (value) + #define ENDIAN_HOST_TO_BIG_S16(value) (value) + + #define ENDIAN_BIG_TO_HOST_U32(value) (value) + #define ENDIAN_HOST_TO_BIG_U32(value) (value) + + #define ENDIAN_BIG_TO_HOST_S32(value) (value) + #define ENDIAN_HOST_TO_BIG_S32(value) (value) + + #define ENDIAN_BIG_TO_HOST_U64(value) (value) + #define ENDIAN_HOST_TO_BIG_U64(value) (value) + + #define ENDIAN_BIG_TO_HOST_S64(value) (value) + #define ENDIAN_HOST_TO_BIG_S64(value) (value) + +#endif + + + +#endif // _EndianUtilities_h_ |