bswap16/32 as functions

Turn bswap16() and bswap32() into functions
to avoid evaluating the argument more than once.
This commit is contained in:
Michael Davidsaver
2016-07-08 16:20:35 -04:00
parent 11e98798bb
commit 4223b31f9a
3 changed files with 53 additions and 16 deletions

View File

@@ -12,6 +12,8 @@
#define EPICSMMIO_H
#include <epicsEndian.h>
#include <epicsTypes.h>
#include <compilerSpecific.h>
#if defined(_ARCH_PPC) || defined(__PPC__) || defined(__PPC)
# include <libcpu/io.h>
@@ -39,6 +41,24 @@
# define nat_iowrite16 be_iowrite16
# define nat_iowrite32 be_iowrite32
static EPICS_ALWAYS_INLINE
epicsUInt16
bswap16(epicsUInt16 value)
{
return (((epicsUInt16)(value) & 0x00ff) << 8) |
(((epicsUInt16)(value) & 0xff00) >> 8);
}
static EPICS_ALWAYS_INLINE
epicsUInt32
bswap32(epicsUInt32 value)
{
return (((epicsUInt32)(value) & 0x000000ff) << 24) |
(((epicsUInt32)(value) & 0x0000ff00) << 8) |
(((epicsUInt32)(value) & 0x00ff0000) >> 8) |
(((epicsUInt32)(value) & 0xff000000) >> 24);
}
#elif defined(i386) || defined(__i386__) || defined(__i386) || defined(__m68k__)
/* X86 does not need special handling for read/write width.

View File

@@ -90,15 +90,23 @@ nat_iowrite32(volatile void* addr, epicsUInt32 val)
*@{
*/
#define bswap16(value) ((epicsUInt16) ( \
(((epicsUInt16)(value) & 0x00ff) << 8) | \
(((epicsUInt16)(value) & 0xff00) >> 8)))
static EPICS_ALWAYS_INLINE
epicsUInt16
bswap16(epicsUInt16 value)
{
return (((epicsUInt16)(value) & 0x00ff) << 8) |
(((epicsUInt16)(value) & 0xff00) >> 8);
}
#define bswap32(value) ( \
(((epicsUInt32)(value) & 0x000000ff) << 24) | \
(((epicsUInt32)(value) & 0x0000ff00) << 8) | \
(((epicsUInt32)(value) & 0x00ff0000) >> 8) | \
(((epicsUInt32)(value) & 0xff000000) >> 24))
static EPICS_ALWAYS_INLINE
epicsUInt32
bswap32(epicsUInt32 value)
{
return (((epicsUInt32)(value) & 0x000000ff) << 24) |
(((epicsUInt32)(value) & 0x0000ff00) << 8) |
(((epicsUInt32)(value) & 0x00ff0000) >> 8) |
(((epicsUInt32)(value) & 0xff000000) >> 24);
}
# define be_ioread16(A) nat_ioread16(A)
# define be_ioread32(A) nat_ioread32(A)

View File

@@ -37,6 +37,7 @@
#include <epicsTypes.h> /* EPICS Common Type Definitions */
#include <epicsEndian.h> /* EPICS Byte Order Definitions */
#include <compilerSpecific.h>
/*=====================
* vxAtomicLib.h (which defines the memory barrier macros)
@@ -49,15 +50,23 @@
# include <vxAtomicLib.h>
#endif
#define bswap16(value) ((epicsUInt16) ( \
(((epicsUInt16)(value) & 0x00ff) << 8) | \
(((epicsUInt16)(value) & 0xff00) >> 8)))
static EPICS_ALWAYS_INLINE
epicsUInt16
bswap16(epicsUInt16 value)
{
return (((epicsUInt16)(value) & 0x00ff) << 8) |
(((epicsUInt16)(value) & 0xff00) >> 8);
}
#define bswap32(value) ( \
(((epicsUInt32)(value) & 0x000000ff) << 24) | \
(((epicsUInt32)(value) & 0x0000ff00) << 8) | \
(((epicsUInt32)(value) & 0x00ff0000) >> 8) | \
(((epicsUInt32)(value) & 0xff000000) >> 24))
static EPICS_ALWAYS_INLINE
epicsUInt32
bswap32(epicsUInt32 value)
{
return (((epicsUInt32)(value) & 0x000000ff) << 24) |
(((epicsUInt32)(value) & 0x0000ff00) << 8) |
(((epicsUInt32)(value) & 0x00ff0000) >> 8) |
(((epicsUInt32)(value) & 0xff000000) >> 24);
}
#if EPICS_BYTE_ORDER == EPICS_ENDIAN_BIG
# define be16_to_cpu(X) (epicsUInt16)(X)