mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-10-31 09:11:13 +00:00
Add support for marking each operand as a %hh, %hm, %lm or %lo.
Represent previous bools and these ones with flags in a single byte per operand. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2863 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e694366259
commit
69cacd4710
@ -64,6 +64,15 @@ public:
|
|||||||
MO_PCRelativeDisp,
|
MO_PCRelativeDisp,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Bit fields of the flags variable used for different operand properties
|
||||||
|
static const char DEFFLAG = 0x1; // this is a def of the operand
|
||||||
|
static const char DEFUSEFLAG = 0x2; // this is both a def and a use
|
||||||
|
static const char HIFLAG32 = 0x4; // operand is %hi32(value_or_immedVal)
|
||||||
|
static const char LOFLAG32 = 0x8; // operand is %lo32(value_or_immedVal)
|
||||||
|
static const char HIFLAG64 = 0x10; // operand is %hi64(value_or_immedVal)
|
||||||
|
static const char LOFLAG64 = 0x20; // operand is %lo64(value_or_immedVal)
|
||||||
|
|
||||||
private:
|
private:
|
||||||
MachineOperandType opType;
|
MachineOperandType opType;
|
||||||
|
|
||||||
@ -78,9 +87,8 @@ private:
|
|||||||
|
|
||||||
int regNum; // register number for an explicit register
|
int regNum; // register number for an explicit register
|
||||||
// will be set for a value after reg allocation
|
// will be set for a value after reg allocation
|
||||||
bool isDef; // is this a definition for the value?
|
char flags; // see bit field definitions above
|
||||||
bool isDefAndUse; // is this a both a def and a use of the value?
|
|
||||||
// we assume that a non-def *must* be a use.
|
|
||||||
public:
|
public:
|
||||||
/*ctor*/ MachineOperand ();
|
/*ctor*/ MachineOperand ();
|
||||||
/*ctor*/ MachineOperand (MachineOperandType operandType,
|
/*ctor*/ MachineOperand (MachineOperandType operandType,
|
||||||
@ -108,20 +116,39 @@ public:
|
|||||||
return immedVal;
|
return immedVal;
|
||||||
}
|
}
|
||||||
inline bool opIsDef () const {
|
inline bool opIsDef () const {
|
||||||
return isDef;
|
return flags & DEFFLAG;
|
||||||
}
|
}
|
||||||
inline bool opIsDefAndUse () const {
|
inline bool opIsDefAndUse () const {
|
||||||
return isDefAndUse;
|
return flags & DEFUSEFLAG;
|
||||||
|
}
|
||||||
|
inline bool opHiBits32 () const {
|
||||||
|
return flags & HIFLAG32;
|
||||||
|
}
|
||||||
|
inline bool opLoBits32 () const {
|
||||||
|
return flags & LOFLAG32;
|
||||||
|
}
|
||||||
|
inline bool opHiBits64 () const {
|
||||||
|
return flags & HIFLAG64;
|
||||||
|
}
|
||||||
|
inline bool opLoBits64 () const {
|
||||||
|
return flags & LOFLAG64;
|
||||||
|
}
|
||||||
|
|
||||||
|
// used to get the reg number if when one is allocated (must be
|
||||||
|
// called only after reg alloc)
|
||||||
|
inline int getAllocatedRegNum() const {
|
||||||
|
assert(opType == MO_VirtualRegister || opType == MO_CCRegister ||
|
||||||
|
opType == MO_MachineRegister);
|
||||||
|
return regNum;
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
friend std::ostream& operator<<(std::ostream& os, const MachineOperand& mop);
|
friend std::ostream& operator<<(std::ostream& os, const MachineOperand& mop);
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// These functions are provided so that a vector of operands can be
|
// These functions are provided so that a vector of operands can be
|
||||||
// statically allocated and individual ones can be initialized later.
|
// statically allocated and individual ones can be initialized later.
|
||||||
// Give class MachineInstr gets access to these functions.
|
// Give class MachineInstr access to these functions.
|
||||||
//
|
//
|
||||||
void Initialize (MachineOperandType operandType,
|
void Initialize (MachineOperandType operandType,
|
||||||
Value* _val);
|
Value* _val);
|
||||||
@ -130,6 +157,15 @@ private:
|
|||||||
void InitializeReg (int regNum,
|
void InitializeReg (int regNum,
|
||||||
bool isCCReg);
|
bool isCCReg);
|
||||||
|
|
||||||
|
// Construction methods needed for fine-grain control.
|
||||||
|
// These must be accessed via coresponding methods in MachineInstr.
|
||||||
|
void markDef() { flags |= DEFFLAG; }
|
||||||
|
void markDefAndUse() { flags |= DEFUSEFLAG; }
|
||||||
|
void markHi32() { flags |= HIFLAG32; }
|
||||||
|
void markLo32() { flags |= LOFLAG32; }
|
||||||
|
void markHi64() { flags |= HIFLAG64; }
|
||||||
|
void markLo64() { flags |= LOFLAG64; }
|
||||||
|
|
||||||
// Replaces the Value with its corresponding physical register after
|
// Replaces the Value with its corresponding physical register after
|
||||||
// register allocation is complete
|
// register allocation is complete
|
||||||
void setRegForValue(int reg) {
|
void setRegForValue(int reg) {
|
||||||
@ -139,16 +175,6 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
friend class MachineInstr;
|
friend class MachineInstr;
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
// used to get the reg number if when one is allocted (must be
|
|
||||||
// called only after reg alloc)
|
|
||||||
inline int getAllocatedRegNum() const {
|
|
||||||
assert(opType == MO_VirtualRegister || opType == MO_CCRegister ||
|
|
||||||
opType == MO_MachineRegister);
|
|
||||||
return regNum;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -157,8 +183,7 @@ MachineOperand::MachineOperand()
|
|||||||
: opType(MO_VirtualRegister),
|
: opType(MO_VirtualRegister),
|
||||||
immedVal(0),
|
immedVal(0),
|
||||||
regNum(-1),
|
regNum(-1),
|
||||||
isDef(false),
|
flags(0)
|
||||||
isDefAndUse(false)
|
|
||||||
{}
|
{}
|
||||||
|
|
||||||
inline
|
inline
|
||||||
@ -167,15 +192,13 @@ MachineOperand::MachineOperand(MachineOperandType operandType,
|
|||||||
: opType(operandType),
|
: opType(operandType),
|
||||||
immedVal(0),
|
immedVal(0),
|
||||||
regNum(-1),
|
regNum(-1),
|
||||||
isDef(false),
|
flags(0)
|
||||||
isDefAndUse(false)
|
|
||||||
{}
|
{}
|
||||||
|
|
||||||
inline
|
inline
|
||||||
MachineOperand::MachineOperand(const MachineOperand& mo)
|
MachineOperand::MachineOperand(const MachineOperand& mo)
|
||||||
: opType(mo.opType),
|
: opType(mo.opType),
|
||||||
isDef(false),
|
flags(mo.flags)
|
||||||
isDefAndUse(false)
|
|
||||||
{
|
{
|
||||||
switch(opType) {
|
switch(opType) {
|
||||||
case MO_VirtualRegister:
|
case MO_VirtualRegister:
|
||||||
@ -195,6 +218,7 @@ MachineOperand::Initialize(MachineOperandType operandType,
|
|||||||
opType = operandType;
|
opType = operandType;
|
||||||
value = _val;
|
value = _val;
|
||||||
regNum = -1;
|
regNum = -1;
|
||||||
|
flags = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void
|
inline void
|
||||||
@ -205,6 +229,7 @@ MachineOperand::InitializeConst(MachineOperandType operandType,
|
|||||||
value = NULL;
|
value = NULL;
|
||||||
immedVal = intValue;
|
immedVal = intValue;
|
||||||
regNum = -1;
|
regNum = -1;
|
||||||
|
flags = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void
|
inline void
|
||||||
@ -213,6 +238,7 @@ MachineOperand::InitializeReg(int _regNum, bool isCCReg)
|
|||||||
opType = isCCReg? MO_CCRegister : MO_MachineRegister;
|
opType = isCCReg? MO_CCRegister : MO_MachineRegister;
|
||||||
value = NULL;
|
value = NULL;
|
||||||
regNum = (int) _regNum;
|
regNum = (int) _regNum;
|
||||||
|
flags = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -331,6 +357,12 @@ public:
|
|||||||
bool isDef=false,
|
bool isDef=false,
|
||||||
bool isDefAndUse=false);
|
bool isDefAndUse=false);
|
||||||
|
|
||||||
|
void setOperandHi32 (unsigned i);
|
||||||
|
void setOperandLo32 (unsigned i);
|
||||||
|
void setOperandHi64 (unsigned i);
|
||||||
|
void setOperandLo64 (unsigned i);
|
||||||
|
|
||||||
|
|
||||||
// Replaces the Value for the operand with its allocated
|
// Replaces the Value for the operand with its allocated
|
||||||
// physical register after register allocation is complete.
|
// physical register after register allocation is complete.
|
||||||
//
|
//
|
||||||
@ -477,6 +509,30 @@ MachineInstr::setImplicitRef(unsigned int i,
|
|||||||
implicitIsDefAndUse[i] = isDefAndUse;
|
implicitIsDefAndUse[i] = isDefAndUse;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void
|
||||||
|
MachineInstr::setOperandHi32(unsigned i)
|
||||||
|
{
|
||||||
|
operands[i].markHi32();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void
|
||||||
|
MachineInstr::setOperandLo32(unsigned i)
|
||||||
|
{
|
||||||
|
operands[i].markLo32();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void
|
||||||
|
MachineInstr::setOperandHi64(unsigned i)
|
||||||
|
{
|
||||||
|
operands[i].markHi64();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void
|
||||||
|
MachineInstr::setOperandLo64(unsigned i)
|
||||||
|
{
|
||||||
|
operands[i].markLo64();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
// Debugging Support
|
// Debugging Support
|
||||||
|
Loading…
Reference in New Issue
Block a user