summaryrefslogtreecommitdiff
path: root/src/base
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2007-03-19 13:28:36 +0000
committerGabe Black <gblack@eecs.umich.edu>2007-03-19 13:28:36 +0000
commitad9ab66175f4ed93e44857cd061aa16046f9ca40 (patch)
treec12bcdce2c74a6d60edb49afd2777f6ed1b21c7a /src/base
parent594c415a0d56b37e5516a5f0a315b4d94f70178f (diff)
downloadgem5-ad9ab66175f4ed93e44857cd061aa16046f9ca40.tar.xz
Reworked the BitUnion stuff a bit. There is moderately better isolation of the backend parts, although there are still macros.
--HG-- extra : convert_revision : e9692c5e697c96061ef70cf78ef532c99dbbd672
Diffstat (limited to 'src/base')
-rw-r--r--src/base/bitfield.hh258
1 files changed, 110 insertions, 148 deletions
diff --git a/src/base/bitfield.hh b/src/base/bitfield.hh
index 179e14896..5af453a76 100644
--- a/src/base/bitfield.hh
+++ b/src/base/bitfield.hh
@@ -33,7 +33,6 @@
#define __BASE_BITFIELD_HH__
#include <inttypes.h>
-//#include "base/misc.hh"
/**
* Generate a 64-bit mask of 'nbits' 1s, right justified.
@@ -131,149 +130,100 @@ findMsbSet(uint64_t val) {
return msb;
}
-template<class Data, int first, int last=first>
-class BitfieldBase
+namespace BitfieldBackend
{
- 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 Data, int first, int last=first>
-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 <int first>
-class BitfieldBase<uint64_t, first, first> :
- public BitfieldNativeBase<uint64_t, first, first>
-{};
-
-template <int first, int last>
-class BitfieldBase<uint64_t, first, last> :
- public BitfieldNativeBase<uint64_t, first, last>
-{};
-
-template <int first>
-class BitfieldBase<uint32_t, first, first> :
- public BitfieldNativeBase<uint32_t, first, first>
-{};
-
-template <int first, int last>
-class BitfieldBase<uint32_t, first, last> :
- public BitfieldNativeBase<uint32_t, first, last>
-{};
-
-template <int first>
-class BitfieldBase<uint16_t, first, first> :
- public BitfieldNativeBase<uint16_t, first, first>
-{};
-
-template <int first, int last>
-class BitfieldBase<uint16_t, first, last> :
- public BitfieldNativeBase<uint16_t, first, last>
-{};
-
-template <int first>
-class BitfieldBase<uint8_t, first, first> :
- public BitfieldNativeBase<uint8_t, first, first>
-{};
-
-template <int first, int last>
-class BitfieldBase<uint8_t, first, last> :
- public BitfieldNativeBase<uint8_t, first, last>
-{};
-
-template<class Data, int first, int last=first>
-class _BitfieldRO : public BitfieldBase<Data, first, last>
-{
- public:
- operator const Data & ()
- {
- return this->getBits(first, last);
- }
-};
-
-template<class Data, int first, int last=first>
-class _BitfieldWO : public BitfieldBase<Data, first, last>
-{
- public:
- const Data & operator = (const Data & _data)
- {
- this->setBits(first, last, _data);
- return *this;
- }
-};
-
-template<class Data, int first, int last=first>
-class _BitfieldRW : public BitfieldBase<Data, first, last>
-{
- public:
- operator const Data ()
+ template<class Data>
+ class BitfieldBase
{
- return this->getBits(first, last);
- }
-
- const Data operator = (const Data & _data)
- {
- this->setBits(first, last, _data);
- return *this;
- }
-};
-
-template <class Type, class Base>
-class BitUnionOperators : public Base
-{
- public:
- operator const Type ()
+ 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 Type, class Base>
+ class _BitfieldRO : public Base
{
- return Base::__data;
- }
-
- const Type operator = (const Type & _data)
+ public:
+ operator const Type ()
+ {
+ return *((Base *)this);
+ }
+ };
+
+ template<class Type, class Base>
+ class _BitfieldWO : public Base
{
- Base::__data = _data;
- }
-
- bool operator < (const Base & base)
+ public:
+ const Type operator = (const Type & _data)
+ {
+ *((Base *)this) = _data;
+ return _data;
+ }
+ };
+
+ template<class Data, int first, int last=first>
+ class _Bitfield : public BitfieldBase<Data>
{
- return Base::__data < base.__data;
- }
-
- bool operator == (const Base & base)
+ public:
+ operator const Data ()
+ {
+ return this->getBits(first, last);
+ }
+
+ const Data
+ operator = (const Data & _data)
+ {
+ this->setBits(first, last, _data);
+ return _data;
+ }
+ };
+
+ template <class Type, class Base>
+ class BitUnionOperators : public Base
{
- return Base::__data == base.__data;
- }
-};
+ 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 { \
+ namespace BitfieldUnderlyingClasses \
+ { \
+ class name; \
+ } \
+ class BitfieldUnderlyingClasses::name { \
public: \
typedef type __DataType; \
union { \
@@ -282,7 +232,9 @@ class BitUnionOperators : public Base
#define EndBitUnion(name) \
}; \
}; \
- typedef BitUnionOperators<__##name::__DataType, __##name> name;
+ typedef BitfieldBackend::BitUnionOperators< \
+ BitfieldUnderlyingClasses::name::__DataType, \
+ BitfieldUnderlyingClasses::name> name;
#define __SubBitUnion(type, name) \
union { \
@@ -295,22 +247,32 @@ class BitUnionOperators : public Base
#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)
+//This is so we can send in parameters with commas
+#define wrap(guts) guts
//Read only bitfields
-#define BitfieldRO(first, last) _BitfieldRO<__DataType, first, last>
-#define SubBitUnionRO(name, first, last) \
- __SubBitUnion(BitfieldRO(first, last), name)
+#define __BitfieldRO(base) \
+ BitfieldBackend::_BitfieldRO<__DataType, base>
+#define __SubBitUnionRO(name, base) \
+ __SubBitUnion(wrap(_BitfieldRO<__DataType, base>), name)
//Write only bitfields
-#define BitfieldWO(first, last) _BitfieldWO<__DataType, first, last>
+#define __BitfieldWO(base) \
+ BitfieldBackend::_BitfieldWO<__DataType, base>
+#define __SubBitUnionWO(name, base) \
+ __SubBitUnion(wrap(_BitfieldWO<__DataType, base>), name)
+
+//Regular bitfields
+#define Bitfield(first, last) \
+ BitfieldBackend::_Bitfield<__DataType, first, last>
+#define SubBitUnion(name, first, last) \
+ __SubBitUnion(Bitfield(first, last), name)
+#define BitfieldRO(first, last) __BitfieldRO(Bitfield(first, last))
+#define SubBitUnionRO(name, first, last) \
+ __SubBitUnionRO(Bitfield(first, last), name)
+#define BitfieldWO(first, last) __BitfieldWO(Bitfield(first, last))
#define SubBitUnionWO(name, first, last) \
- __SubBitUnion(BitfieldWO(first, last), name)
+ __SubBitUnionWO(Bitfield(first, last), name)
#define BitUnion(type, name) __BitUnion(type, name)