X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fsim%2Fbyteswap.hh;h=3a0f7ce8ae440c00b55c4691fc3d6f945431e8b2;hb=0ed3c84c7b05d7d3c9d5f0e3f1c05c20afef93b9;hp=03bfad954c99a2a1eda1a585ab45cf6334f7d257;hpb=c698c03705f295459498a9a95ae8461f2867ebb0;p=gem5.git diff --git a/src/sim/byteswap.hh b/src/sim/byteswap.hh index 03bfad954..3a0f7ce8a 100644 --- a/src/sim/byteswap.hh +++ b/src/sim/byteswap.hh @@ -26,6 +26,8 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Authors: Gabe Black + * Ali Saidi + * Nathan Binkert */ //The purpose of this file is to provide endainness conversion utility @@ -35,7 +37,9 @@ #ifndef __SIM_BYTE_SWAP_HH__ #define __SIM_BYTE_SWAP_HH__ -#include "sim/host.hh" +#include "base/bigint.hh" +#include "base/misc.hh" +#include "base/types.hh" // This lets us figure out what the byte order of the host system is #if defined(linux) @@ -44,17 +48,27 @@ // If one doesn't exist, we pretty much get what is listed below, so it all // works out #include +#elif defined (__sun) +#include #else #include #endif +#if defined(__APPLE__) +#include +#endif + +enum ByteOrder {BigEndianByteOrder, LittleEndianByteOrder}; + //These functions actually perform the swapping for parameters //of various bit lengths -static inline uint64_t +inline uint64_t swap_byte64(uint64_t x) { #if defined(linux) return bswap_64(x); +#elif defined(__APPLE__) + return OSSwapInt64(x); #else return (uint64_t)((((uint64_t)(x) & 0xff) << 56) | ((uint64_t)(x) & 0xff00ULL) << 40 | @@ -67,11 +81,13 @@ swap_byte64(uint64_t x) #endif } -static inline uint32_t +inline uint32_t swap_byte32(uint32_t x) { #if defined(linux) return bswap_32(x); +#elif defined(__APPLE__) + return OSSwapInt32(x); #else return (uint32_t)(((uint32_t)(x) & 0xff) << 24 | ((uint32_t)(x) & 0xff00) << 8 | ((uint32_t)(x) & 0xff0000) >> 8 | @@ -79,11 +95,13 @@ swap_byte32(uint32_t x) #endif } -static inline uint16_t +inline uint16_t swap_byte16(uint16_t x) { #if defined(linux) return bswap_16(x); +#elif defined(__APPLE__) + return OSSwapInt16(x); #else return (uint16_t)(((uint16_t)(x) & 0xff) << 8 | ((uint16_t)(x) & 0xff00) >> 8); @@ -92,10 +110,10 @@ swap_byte16(uint16_t x) // This function lets the compiler figure out how to call the // swap_byte functions above for different data types. Since the -// sizeof() values are known at compiel time, it should inline to a +// sizeof() values are known at compile time, it should inline to a // direct call to the right swap_byteNN() function. template -static inline T swap_byte(T x) { +inline T swap_byte(T x) { if (sizeof(T) == 8) return swap_byte64((uint64_t)x); else if (sizeof(T) == 4) @@ -108,56 +126,76 @@ static inline T swap_byte(T x) { panic("Can't byte-swap values larger than 64 bits"); } +template<> +inline Twin64_t swap_byte(Twin64_t x) +{ + x.a = swap_byte(x.a); + x.b = swap_byte(x.b); + return x; +} + +template<> +inline Twin32_t swap_byte(Twin32_t x) +{ + x.a = swap_byte(x.a); + x.b = swap_byte(x.b); + return x; +} + //The conversion functions with fixed endianness on both ends don't need to //be in a namespace -template static inline T betole(T value) {return swap_byte(value);} -template static inline T letobe(T value) {return swap_byte(value);} +template inline T betole(T value) {return swap_byte(value);} +template inline T letobe(T value) {return swap_byte(value);} //For conversions not involving the guest system, we can define the functions //conditionally based on the BYTE_ORDER macro and outside of the namespaces -#if BYTE_ORDER == BIG_ENDIAN -template static inline T htole(T value) {return swap_byte(value);} -template static inline T letoh(T value) {return swap_byte(value);} -template static inline T htobe(T value) {return value;} -template static inline T betoh(T value) {return value;} -#elif BYTE_ORDER == LITTLE_ENDIAN -template static inline T htole(T value) {return value;} -template static inline T letoh(T value) {return value;} -template static inline T htobe(T value) {return swap_byte(value);} -template static inline T betoh(T value) {return swap_byte(value);} +#if defined(_BIG_ENDIAN) || !defined(_LITTLE_ENDIAN) && BYTE_ORDER == BIG_ENDIAN +const ByteOrder HostByteOrder = BigEndianByteOrder; +template inline T htole(T value) {return swap_byte(value);} +template inline T letoh(T value) {return swap_byte(value);} +template inline T htobe(T value) {return value;} +template inline T betoh(T value) {return value;} +#elif defined(_LITTLE_ENDIAN) || BYTE_ORDER == LITTLE_ENDIAN +const ByteOrder HostByteOrder = LittleEndianByteOrder; +template inline T htole(T value) {return value;} +template inline T letoh(T value) {return value;} +template inline T htobe(T value) {return swap_byte(value);} +template inline T betoh(T value) {return swap_byte(value);} #else #error Invalid Endianess #endif namespace BigEndianGuest { - template - static inline T gtole(T value) {return betole(value);} - template - static inline T letog(T value) {return letobe(value);} - template - static inline T gtobe(T value) {return value;} - template - static inline T betog(T value) {return value;} - template - static inline T htog(T value) {return htobe(value);} - template - static inline T gtoh(T value) {return betoh(value);} + const ByteOrder GuestByteOrder = BigEndianByteOrder; + template + inline T gtole(T value) {return betole(value);} + template + inline T letog(T value) {return letobe(value);} + template + inline T gtobe(T value) {return value;} + template + inline T betog(T value) {return value;} + template + inline T htog(T value) {return htobe(value);} + template + inline T gtoh(T value) {return betoh(value);} } namespace LittleEndianGuest { - template - static inline T gtole(T value) {return value;} - template - static inline T letog(T value) {return value;} - template - static inline T gtobe(T value) {return letobe(value);} - template - static inline T betog(T value) {return betole(value);} - template - static inline T htog(T value) {return htole(value);} - template - static inline T gtoh(T value) {return letoh(value);} + const ByteOrder GuestByteOrder = LittleEndianByteOrder; + template + inline T gtole(T value) {return value;} + template + inline T letog(T value) {return value;} + template + inline T gtobe(T value) {return letobe(value);} + template + inline T betog(T value) {return betole(value);} + template + inline T htog(T value) {return htole(value);} + template + inline T gtoh(T value) {return letoh(value);} } #endif // __SIM_BYTE_SWAP_HH__