void IntRegFile::clear()
{
- int x;
- for (x = 0; x < MaxGL; x++)
- memset(regGlobals[x], 0, sizeof(IntReg) * RegsPerFrame);
- for(int x = 0; x < 2 * NWindows; x++)
- memset(regSegments[x], 0, sizeof(IntReg) * RegsPerFrame);
memset(regs, 0, sizeof(IntReg) * NumIntRegs);
}
IntRegFile::IntRegFile()
{
- offset[Globals] = 0;
- regView[Globals] = regGlobals[0];
clear();
}
{
DPRINTF(IntRegs, "Read register %d = 0x%x\n", intReg, regs[intReg]);
return regs[intReg];
- /* XXX Currently not used. When used again regView/offset need to be
- * serialized!
- IntReg val;
- if(intReg < NumIntArchRegs)
- val = regView[intReg >> FrameOffsetBits][intReg & FrameOffsetMask];
- else if((intReg -= NumIntArchRegs) < NumMicroIntRegs)
- val = microRegs[intReg];
- else
- panic("Tried to read non-existant integer register %d, %d\n",
- NumIntArchRegs + NumMicroIntRegs + intReg, intReg);
-
- DPRINTF(IntRegs, "Read register %d = 0x%x\n", intReg, val);
- return val;
- */
}
void IntRegFile::setReg(int intReg, const IntReg &val)
regs[intReg] = val;
}
return;
- /* XXX Currently not used. When used again regView/offset need to be
- * serialized!
- if(intReg)
- {
- DPRINTF(IntRegs, "Wrote register %d = 0x%x\n", intReg, val);
- if(intReg < NumIntArchRegs)
- regView[intReg >> FrameOffsetBits][intReg & FrameOffsetMask] = val;
- else if((intReg -= NumIntArchRegs) < NumMicroIntRegs)
- microRegs[intReg] = val;
- else
- panic("Tried to set non-existant integer register\n");
- } */
}
void IntRegFile::serialize(std::ostream &os)
{
SERIALIZE_ARRAY(regs, NumIntRegs);
SERIALIZE_ARRAY(microRegs, NumMicroIntRegs);
-
- /* the below doesn't seem needed unless gabe makes regview work*/
- unsigned int x;
- for(x = 0; x < MaxGL; x++)
- SERIALIZE_ARRAY(regGlobals[x], RegsPerFrame);
- for(x = 0; x < 2 * NWindows; x++)
- SERIALIZE_ARRAY(regSegments[x], RegsPerFrame);
}
void IntRegFile::unserialize(Checkpoint *cp, const std::string §ion)
{
UNSERIALIZE_ARRAY(regs, NumIntRegs);
UNSERIALIZE_ARRAY(microRegs, NumMicroIntRegs);
-
- /* the below doesn't seem needed unless gabe makes regview work*/
- unsigned int x;
- for(x = 0; x < MaxGL; x++)
- UNSERIALIZE_ARRAY(regGlobals[x], RegsPerFrame);
- for(unsigned int x = 0; x < 2 * NWindows; x++)
- UNSERIALIZE_ARRAY(regSegments[x], RegsPerFrame);
}
namespace SparcISA
{
- class RegFile;
-
//This function translates integer register file indices into names
std::string getIntRegName(RegIndex);
class IntRegFile
{
- private:
- friend class RegFile;
protected:
- //The number of bits needed to index into each 8 register frame
- static const int FrameOffsetBits = 3;
- //The number of bits to choose between the 4 sets of 8 registers
- static const int FrameNumBits = 2;
-
- //The number of registers per "frame" (8)
- static const int RegsPerFrame = 1 << FrameOffsetBits;
- //A mask to get the frame number
- static const uint64_t FrameNumMask =
- (FrameNumBits == sizeof(int)) ?
- (unsigned int)(-1) :
- (1 << FrameNumBits) - 1;
- static const uint64_t FrameOffsetMask =
- (FrameOffsetBits == sizeof(int)) ?
- (unsigned int)(-1) :
- (1 << FrameOffsetBits) - 1;
-
- IntReg regGlobals[MaxGL+1][RegsPerFrame];
- IntReg regSegments[2 * NWindows][RegsPerFrame];
IntReg microRegs[NumMicroIntRegs];
IntReg regs[NumIntRegs];
- enum regFrame {Globals, Outputs, Locals, Inputs, NumFrames};
-
- IntReg * regView[NumFrames];
-
- static const int RegGlobalOffset = 0;
- static const int FrameOffset = (MaxGL + 1) * RegsPerFrame;
- int offset[NumFrames];
-
public:
void clear();