diff --git a/src/sim/byteswap.hh b/src/sim/byteswap.hh index 7b1ae701e3..7b63cf6e0c 100644 --- a/src/sim/byteswap.hh +++ b/src/sim/byteswap.hh @@ -57,6 +57,8 @@ #include #endif +enum ByteOrder {BigEndianByteOrder, LittleEndianByteOrder}; + //These functions actually perform the swapping for parameters //of various bit lengths static inline uint64_t @@ -131,11 +133,13 @@ template static 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 defined(_BIG_ENDIAN) || BYTE_ORDER == BIG_ENDIAN +const ByteOrder HostByteOrder = BigEndianByteOrder; 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 defined(_LITTLE_ENDIAN) || BYTE_ORDER == LITTLE_ENDIAN +const ByteOrder HostByteOrder = LittleEndianByteOrder; 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);} @@ -146,33 +150,35 @@ template static inline T betoh(T value) {return swap_byte(value);} 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 bool ByteOrderDiffers = (HostByteOrder != BigEndianByteOrder); + 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);} } 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 bool ByteOrderDiffers = (HostByteOrder != LittleEndianByteOrder); + 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);} } #endif // __SIM_BYTE_SWAP_HH__