From: Gabe Black Date: Sat, 17 Mar 2007 23:33:00 +0000 (+0000) Subject: Created BitUnion type which lets you define nested bitfields for an integer in a... X-Git-Tag: m5_2.0_beta3~91 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=594c415a0d56b37e5516a5f0a315b4d94f70178f;p=gem5.git Created BitUnion type which lets you define nested bitfields for an integer in a portable way. --HG-- extra : convert_revision : 56a9d06b6b7274a493dae4b290c5f9b42e59f20d --- diff --git a/src/base/bitfield.hh b/src/base/bitfield.hh index 79dbcc86c..179e14896 100644 --- a/src/base/bitfield.hh +++ b/src/base/bitfield.hh @@ -33,6 +33,7 @@ #define __BASE_BITFIELD_HH__ #include +//#include "base/misc.hh" /** * Generate a 64-bit mask of 'nbits' 1s, right justified. @@ -130,6 +131,192 @@ findMsbSet(uint64_t val) { return msb; } +template +class BitfieldBase +{ + protected: + uint8_t __data[sizeof(Data)]; + + //These are defined here so it can be specialized for Data, but can be + //hidden by RO and WO variants. + inline uint64_t getBits(int _first, int _last) + { + //build up the right bits from the byte array "data" + //panic("Not yet implemented.\n"); + return 0; + } + + inline void setBits(int _first, int _last, uint64_t val) + { + //Set the right bits from the byte array "data" + //panic("Not yet implemented.\n"); + } +}; + +template +class BitfieldNativeBase +{ + protected: + Data __data; + + inline uint64_t getBits(int _first, int _last) + { + return bits(__data, first, last); + } + + inline void setBits(int _first, int _last, uint64_t val) + { + replaceBits(__data, first, last, val); + } +}; + +template +class BitfieldBase : + public BitfieldNativeBase +{}; + +template +class BitfieldBase : + public BitfieldNativeBase +{}; + +template +class BitfieldBase : + public BitfieldNativeBase +{}; + +template +class BitfieldBase : + public BitfieldNativeBase +{}; + +template +class BitfieldBase : + public BitfieldNativeBase +{}; + +template +class BitfieldBase : + public BitfieldNativeBase +{}; + +template +class BitfieldBase : + public BitfieldNativeBase +{}; + +template +class BitfieldBase : + public BitfieldNativeBase +{}; + +template +class _BitfieldRO : public BitfieldBase +{ + public: + operator const Data & () + { + return this->getBits(first, last); + } +}; + +template +class _BitfieldWO : public BitfieldBase +{ + public: + const Data & operator = (const Data & _data) + { + this->setBits(first, last, _data); + return *this; + } +}; + +template +class _BitfieldRW : public BitfieldBase +{ + public: + operator const Data () + { + return this->getBits(first, last); + } + + const Data operator = (const Data & _data) + { + this->setBits(first, last, _data); + return *this; + } +}; + +template +class BitUnionOperators : public Base +{ + public: + operator const Type () + { + return Base::__data; + } + + const Type operator = (const Type & _data) + { + Base::__data = _data; + } + + bool operator < (const Base & base) + { + return Base::__data < base.__data; + } + + bool operator == (const Base & base) + { + return Base::__data == base.__data; + } +}; + +#define __BitUnion(type, name) \ + class __##name { \ + public: \ + typedef type __DataType; \ + union { \ + type __data;\ + +#define EndBitUnion(name) \ + }; \ + }; \ + typedef BitUnionOperators<__##name::__DataType, __##name> name; + +#define __SubBitUnion(type, name) \ + union { \ + type __data; \ + inline operator const __DataType () \ + { return __data; } \ + \ + inline const __DataType operator = (const __DataType & _data) \ + { __data = _data; } + +#define EndSubBitUnion(name) } name; + +//Regular read/write bitfields +#define BitfieldRW(first, last) _BitfieldRW<__DataType, first, last> +#define SubBitUnionRW(name, first, last) \ + __SubBitUnion(BitfieldRW(first, last), name) +#define Bitfield(first, last) BitfieldRW(first, last) +#define SubBitUnion(name, first, last) SubBitUnionRW(name, first, last) + +//Read only bitfields +#define BitfieldRO(first, last) _BitfieldRO<__DataType, first, last> +#define SubBitUnionRO(name, first, last) \ + __SubBitUnion(BitfieldRO(first, last), name) + +//Write only bitfields +#define BitfieldWO(first, last) _BitfieldWO<__DataType, first, last> +#define SubBitUnionWO(name, first, last) \ + __SubBitUnion(BitfieldWO(first, last), name) + +#define BitUnion(type, name) __BitUnion(type, name) +#define BitUnion64(name) __BitUnion(uint64_t, name) +#define BitUnion32(name) __BitUnion(uint32_t, name) +#define BitUnion16(name) __BitUnion(uint16_t, name) +#define BitUnion8(name) __BitUnion(uint8_t, name) #endif // __BASE_BITFIELD_HH__