#ifndef _OS_OSBYTEORDERI386_H
#define _OS_OSBYTEORDERI386_H
#include <libkern/OSBase.h>
OS_INLINE
UInt16
OSReadSwapInt16(
volatile void * base,
UInt offset
)
{
UInt16 result;
result = *(volatile UInt16 *)((UInt8 *)base + offset);
__asm__ volatile("xchgb %b0,%h0"
: "=q" (result)
: "0" (result));
return result;
}
OS_INLINE
UInt32
OSReadSwapInt32(
volatile void * base,
UInt offset
)
{
UInt32 result;
result = *(volatile UInt32 *)((UInt8 *)base + offset);
__asm__ volatile("bswap %0"
: "=r" (result)
: "0" (result));
return result;
}
OS_INLINE
UInt64
OSReadSwapInt64(
volatile void * base,
UInt offset
)
{
UInt64 * inp;
union ullc {
UInt64 ull;
UInt ul[2];
} outv;
inp = (UInt64 *)base;
outv.ul[0] = OSReadSwapInt32(inp, offset + 4);
outv.ul[1] = OSReadSwapInt32(inp, offset);
return outv.ull;
}
OS_INLINE
UInt
OSReadSwapInt(
volatile void * base,
UInt offset
)
{
UInt result;
result = *(volatile UInt *)((UInt8 *)base + offset);
__asm__ volatile("bswap %0"
: "=r" (result)
: "0" (result));
return result;
}
OS_INLINE
void
OSWriteSwapInt16(
volatile void * base,
UInt offset,
UInt16 data
)
{
__asm__ volatile("xchgb %b0,%h0"
: "=q" (data)
: "0" (data));
*(volatile UInt16 *)((UInt8 *)base + offset) = data;
}
OS_INLINE
void
OSWriteSwapInt32(
volatile void * base,
UInt offset,
UInt32 data
)
{
__asm__ volatile("bswap %0"
: "=r" (data)
: "0" (data));
*(volatile UInt32 *)((UInt8 *)base + offset) = data;
}
OS_INLINE
void
OSWriteSwapInt64(
volatile void * base,
UInt offset,
UInt64 data
)
{
UInt64 * outp;
union ullc {
UInt64 ull;
UInt ul[2];
} *inp;
outp = (UInt64 *)base;
inp = (union ullc *)&data;
OSWriteSwapInt32(outp, offset, inp->ul[1]);
OSWriteSwapInt32(outp, offset + 4, inp->ul[0]);
}
OS_INLINE
void
OSWriteSwapInt(
volatile void * base,
UInt offset,
UInt data
)
{
__asm__ volatile("bswap %0"
: "=r" (data)
: "0" (data));
*(volatile UInt *)((UInt8 *)base + offset) = data;
}
OS_INLINE
UInt16
OSSwapInt16(
UInt16 data
)
{
UInt16 temp = data;
return OSReadSwapInt16(&temp, 0);
}
OS_INLINE
UInt32
OSSwapInt32(
UInt32 data
)
{
UInt32 temp = data;
return OSReadSwapInt32(&temp, 0);
}
OS_INLINE
UInt64
OSSwapInt64(
UInt64 data
)
{
UInt64 temp = data;
return OSReadSwapInt64(&temp, 0);
}
OS_INLINE
UInt
OSSwapInt(
UInt data
)
{
UInt temp = data;
return OSReadSwapInt(&temp, 0);
}
#endif