Newer
Older
Vikram S. Adve
committed
// $Id$
//***************************************************************************
// File:
// MachineInstr.cpp
//
// Purpose:
//
//
// Strategy:
//
// History:
// 7/2/01 - Vikram Adve - Created
//**************************************************************************/
#include "llvm/CodeGen/MachineInstr.h"
Vikram S. Adve
committed
#include "llvm/Instruction.h"
Vikram S. Adve
committed
Vikram S. Adve
committed
//************************ Class Implementations **************************/
// Constructor for instructions with fixed #operands (nearly all)
Vikram S. Adve
committed
MachineInstr::MachineInstr(MachineOpCode _opCode,
OpCodeMask _opCodeMask)
: opCode(_opCode),
opCodeMask(_opCodeMask),
operands(TargetInstrDescriptors[_opCode].numOperands)
{
assert(TargetInstrDescriptors[_opCode].numOperands >= 0);
}
// Constructor for instructions with variable #operands
MachineInstr::MachineInstr(MachineOpCode _opCode,
unsigned numOperands,
OpCodeMask _opCodeMask)
: opCode(_opCode),
opCodeMask(_opCodeMask),
operands(numOperands)
Vikram S. Adve
committed
{
}
void
MachineInstr::SetMachineOperand(unsigned int i,
MachineOperand::MachineOperandType operandType,
Value* _val, bool isdef=false)
Vikram S. Adve
committed
{
assert(i < operands.size());
Vikram S. Adve
committed
operands[i].Initialize(operandType, _val);
operands[i].isDef = isdef ||
Vikram S. Adve
committed
}
void
MachineInstr::SetMachineOperand(unsigned int i,
MachineOperand::MachineOperandType operandType,
int64_t intValue, bool isdef=false)
Vikram S. Adve
committed
{
assert(i < operands.size());
Vikram S. Adve
committed
operands[i].InitializeConst(operandType, intValue);
operands[i].isDef = isdef ||
Vikram S. Adve
committed
}
void
MachineInstr::SetMachineOperand(unsigned int i,
Vikram S. Adve
committed
{
assert(i < operands.size());
Vikram S. Adve
committed
operands[i].InitializeReg(regNum);
operands[i].isDef = isdef ||
Vikram S. Adve
committed
}
void
MachineInstr::dump(unsigned int indent) const
Vikram S. Adve
committed
{
for (unsigned i=0; i < indent; i++)
cout << " ";
cout << *this;
}
ostream&
operator<< (ostream& os, const MachineInstr& minstr)
{
os << TargetInstrDescriptors[minstr.opCode].opCodeString;
Vikram S. Adve
committed
for (unsigned i=0, N=minstr.getNumOperands(); i < N; i++)
os << "\t" << minstr.getOperand(i);
#undef DEBUG_VAL_OP_ITERATOR
#ifdef DEBUG_VAL_OP_ITERATOR
os << endl << "\tValue operands are: ";
for (MachineInstr::val_op_const_iterator vo(&minstr); ! vo.done(); ++vo)
{
const Value* val = *vo;
os << val << (vo.isDef()? "(def), " : ", ");
}
#endif
#if 1
// code for printing implict references
unsigned NumOfImpRefs = minstr.getNumImplicitRefs();
if( NumOfImpRefs > 0 ) {
os << "\tImplicit:";
for(unsigned z=0; z < NumOfImpRefs; z++) {
os << minstr.getImplicitRef(z);
cout << "\t";
}
}
#endif
Vikram S. Adve
committed
os << endl;
Vikram S. Adve
committed
return os;
}
static inline ostream&
OutputOperand(ostream &os, const MachineOperand &mop)
{
switch (mop.getOperandType())
{
case MachineOperand::MO_CCRegister:
case MachineOperand::MO_VirtualRegister:
return os << "(val " << mop.getVRegValue() << ")";
case MachineOperand::MO_MachineRegister:
return os << "(" << mop.getMachineRegNum() << ")";
default:
assert(0 && "Unknown operand type");
return os;
}
Vikram S. Adve
committed
ostream&
operator<<(ostream &os, const MachineOperand &mop)
{
switch(mop.opType)
{
case MachineOperand::MO_VirtualRegister:
case MachineOperand::MO_MachineRegister:
os << "%reg";
return OutputOperand(os, mop);
case MachineOperand::MO_CCRegister:
os << "%ccreg";
return OutputOperand(os, mop);
case MachineOperand::MO_SignExtendedImmed:
return os << mop.immedVal;
case MachineOperand::MO_UnextendedImmed:
return os << mop.immedVal;
case MachineOperand::MO_PCRelativeDisp:
{
const Value* opVal = mop.getVRegValue();
bool isLabel = isa<Method>(opVal) || isa<BasicBlock>(opVal);
return os << "%disp("
<< (isLabel? "label " : "addr-of-val ")
<< opVal << ")";
}
default:
assert(0 && "Unrecognized operand type");
break;
}
Vikram S. Adve
committed
return os;
}
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
MachineCodeForMethod::putLocalVarAtOffsetFromFP(const Value* local,
int offset,
unsigned int size)
{
offsetsFromFP[local] = offset;
incrementAutomaticVarsSize(size);
}
void
MachineCodeForMethod::putLocalVarAtOffsetFromSP(const Value* local,
int offset,
unsigned int size)
{
offsetsFromSP[local] = offset;
incrementAutomaticVarsSize(size);
}
int
MachineCodeForMethod::getOffsetFromFP(const Value* local) const
{
hash_map<const Value*, int>::const_iterator pair = offsetsFromFP.find(local);
assert(pair != offsetsFromFP.end() && "Offset from FP unknown for Value");
return (*pair).second;
}
int
MachineCodeForMethod::getOffsetFromSP(const Value* local) const
{
hash_map<const Value*, int>::const_iterator pair = offsetsFromSP.find(local);
assert(pair != offsetsFromSP.end() && "Offset from SP unknown for Value");
return (*pair).second;
}
void
MachineCodeForMethod::dump() const
{
cout << "\n" << method->getReturnType()
<< " \"" << method->getName() << "\"" << endl;
for (Method::const_iterator BI = method->begin(); BI != method->end(); ++BI)
{
BasicBlock* bb = *BI;
cout << "\n"
<< (bb->hasName()? bb->getName() : "Label")
<< " (" << bb << ")" << ":"
<< endl;
MachineCodeForBasicBlock& mvec = bb->getMachineInstrVec();
for (unsigned i=0; i < mvec.size(); i++)
Vikram S. Adve
committed
cout << "\t" << *mvec[i];
}
cout << endl << "End method \"" << method->getName() << "\""
<< endl << endl;
}