enum MachineOperandType {
MO_VirtualRegister, // virtual register for *value
MO_MachineRegister, // pre-assigned machine register `regNum'
- MO_CCRegister,
MO_SignExtendedImmed,
MO_UnextendedImmed,
- MO_PCRelativeDisp,
MO_MachineBasicBlock, // MachineBasicBlock reference
MO_FrameIndex, // Abstract Stack Frame Index
MO_ConstantPoolIndex, // Address of indexed Constant in Constant Pool
/// Accessors that tell you what kind of MachineOperand you're looking at.
///
bool isMachineBasicBlock() const { return opType == MO_MachineBasicBlock; }
- bool isPCRelativeDisp() const { return opType == MO_PCRelativeDisp; }
bool isImmediate() const {
return opType == MO_SignExtendedImmed || opType == MO_UnextendedImmed;
}
/// has one. This is deprecated and only used by the SPARC v9 backend.
///
Value* getVRegValueOrNull() const {
- return (opType == MO_VirtualRegister || opType == MO_CCRegister ||
- isPCRelativeDisp()) ? contents.value : NULL;
+ return opType == MO_VirtualRegister ? contents.value : NULL;
}
/// MachineOperand accessors that only work on certain types of
/// MachineOperand...
///
Value* getVRegValue() const {
- assert ((opType == MO_VirtualRegister || opType == MO_CCRegister
- || isPCRelativeDisp()) && "Wrong MachineOperand accessor");
+ assert(opType == MO_VirtualRegister && "Wrong MachineOperand accessor");
return contents.value;
}
int getMachineRegNum() const {
///
bool hasAllocatedReg() const {
return (extra.regNum >= 0 &&
- (opType == MO_VirtualRegister || opType == MO_CCRegister ||
- opType == MO_MachineRegister));
+ (opType == MO_VirtualRegister || opType == MO_MachineRegister));
}
/// getReg - Returns the register number. It is a runtime error to call this
friend std::ostream& operator<<(std::ostream& os, const MachineOperand& mop);
- /// markHi32, markLo32, etc. - These methods are deprecated and only used by
- /// the SPARC v9 back-end.
- ///
- void markHi32() { flags |= HIFLAG32; }
- void markLo32() { flags |= LOFLAG32; }
- void markHi64() { flags |= HIFLAG64; }
- void markLo64() { flags |= LOFLAG64; }
-
-private:
- /// setRegForValue - Replaces the Value with its corresponding physical
- /// register after register allocation is complete. This is deprecated
- /// and only used by the SPARC v9 back-end.
- ///
- void setRegForValue(int reg) {
- assert(opType == MO_VirtualRegister || opType == MO_CCRegister ||
- opType == MO_MachineRegister);
- extra.regNum = reg;
- }
-
friend class MachineInstr;
};
UTy, isPCRelative));
}
- void addCCRegOperand(Value *V,
- MachineOperand::UseType UTy = MachineOperand::Use) {
- assert(!OperandsComplete() &&
- "Trying to add an operand to a machine instr that is already done!");
- operands.push_back(MachineOperand(V, MachineOperand::MO_CCRegister, UTy,
- false));
- }
-
-
/// addRegOperand - Add a symbolic virtual register reference...
///
void addRegOperand(int reg, bool isDef) {
MachineOperand(reg, MachineOperand::MO_VirtualRegister, UTy));
}
- /// addPCDispOperand - Add a PC relative displacement operand to the MI
- ///
- void addPCDispOperand(Value *V) {
- assert(!OperandsComplete() &&
- "Trying to add an operand to a machine instr that is already done!");
- operands.push_back(
- MachineOperand(V, MachineOperand::MO_PCRelativeDisp,MachineOperand::Use));
- }
-
/// addMachineRegOperand - Add a virtual register operand to this MachineInstr
///
void addMachineRegOperand(int reg, bool isDef) {
return *this;
}
- /// addReg - Add an LLVM value that is to be used as a register...
- ///
- const MachineInstrBuilder &addCCReg(
- Value *V,
- MachineOperand::UseType Ty = MachineOperand::Use) const {
- MI->addCCRegOperand(V, Ty);
- return *this;
- }
-
/// addRegDef - Add an LLVM value that is to be defined as a register... this
/// is the same as addReg(V, MachineOperand::Def).
///
return addReg(V, MachineOperand::Def);
}
- /// addPCDisp - Add an LLVM value to be treated as a PC relative
- /// displacement...
- ///
- const MachineInstrBuilder &addPCDisp(Value *V) const {
- MI->addPCDispOperand(V);
- return *this;
- }
-
- /// addMReg - Add a machine register operand...
- ///
- const MachineInstrBuilder &addMReg(int Reg, MachineOperand::UseType Ty
- = MachineOperand::Use) const {
- MI->addMachineRegOperand(Reg, Ty);
- return *this;
- }
-
/// addImm - Add a new immediate operand.
///
const MachineInstrBuilder &addImm(int Val) const {
if (MO.hasAllocatedReg())
OutputReg(OS, MO.getReg(), MRI);
break;
- case MachineOperand::MO_CCRegister:
- OS << "%ccreg";
- OutputValue(OS, MO.getVRegValue());
- if (MO.hasAllocatedReg()) {
- OS << "==";
- OutputReg(OS, MO.getReg(), MRI);
- }
- break;
case MachineOperand::MO_MachineRegister:
OutputReg(OS, MO.getMachineRegNum(), MRI);
break;
case MachineOperand::MO_UnextendedImmed:
OS << (long)MO.getImmedValue();
break;
- case MachineOperand::MO_PCRelativeDisp: {
- const Value* opVal = MO.getVRegValue();
- bool isLabel = isa<Function>(opVal) || isa<BasicBlock>(opVal);
- OS << "%disp(" << (isLabel? "label " : "addr-of-val ");
- if (opVal->hasName())
- OS << opVal->getName();
- else
- OS << (const void*) opVal;
- OS << ")";
- break;
- }
case MachineOperand::MO_MachineBasicBlock:
OS << "mbb<"
<< ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName()
OutputValue(OS, MO.getVRegValue());
}
break;
- case MachineOperand::MO_CCRegister:
- OS << "%ccreg";
- OutputValue(OS, MO.getVRegValue());
- if (MO.hasAllocatedReg()) {
- OS << "==";
- OutputReg(OS, MO.getReg());
- }
- break;
case MachineOperand::MO_MachineRegister:
OutputReg(OS, MO.getMachineRegNum());
break;
case MachineOperand::MO_UnextendedImmed:
OS << (long)MO.getImmedValue();
break;
- case MachineOperand::MO_PCRelativeDisp: {
- const Value* opVal = MO.getVRegValue();
- bool isLabel = isa<Function>(opVal) || isa<BasicBlock>(opVal);
- OS << "%disp(" << (isLabel? "label " : "addr-of-val ");
- if (opVal->hasName())
- OS << opVal->getName();
- else
- OS << (const void*) opVal;
- OS << ")";
- break;
- }
case MachineOperand::MO_MachineBasicBlock:
OS << "<mbb:"
<< ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName()
}
// FALLTHROUGH
case MachineOperand::MO_MachineRegister:
- case MachineOperand::MO_CCRegister:
O << RI.get(MO.getReg()).Name;
return;
abort();
return;
- case MachineOperand::MO_PCRelativeDisp:
- std::cerr << "Shouldn't use addPCDisp() when building Alpha MachineInstrs";
- abort();
- return;
-
case MachineOperand::MO_MachineBasicBlock:
printBasicBlockLabel(MO.getMachineBasicBlock());
return;
}
// FALLTHROUGH
case MachineOperand::MO_MachineRegister:
- case MachineOperand::MO_CCRegister: {
O << RI.get(MO.getReg()).Name;
return;
- }
case MachineOperand::MO_SignExtendedImmed:
case MachineOperand::MO_UnextendedImmed:
case MachineOperand::MO_MachineBasicBlock:
printBasicBlockLabel(MO.getMachineBasicBlock());
return;
- case MachineOperand::MO_PCRelativeDisp:
- std::cerr << "Shouldn't use addPCDisp() when building IA64 MachineInstrs";
- abort ();
- return;
-
case MachineOperand::MO_ConstantPoolIndex: {
O << "@gprel(" << PrivateGlobalPrefix << "CPI" << getFunctionNumber() << "_"
<< MO.getConstantPoolIndex() << ")";
}
// FALLTHROUGH
case MachineOperand::MO_MachineRegister:
- case MachineOperand::MO_CCRegister:
O << RI.get(MO.getReg()).Name;
return;
abort();
return;
- case MachineOperand::MO_PCRelativeDisp:
- std::cerr << "Shouldn't use addPCDisp() when building PPC MachineInstrs";
- abort();
- return;
-
case MachineOperand::MO_MachineBasicBlock:
printBasicBlockLabel(MO.getMachineBasicBlock());
return;
case MachineOperand::MO_MachineBasicBlock:
printBasicBlockLabel(MO.getMachineBasicBlock());
return;
- case MachineOperand::MO_PCRelativeDisp:
- std::cerr << "Shouldn't use addPCDisp() when building Sparc MachineInstrs";
- abort ();
- return;
case MachineOperand::MO_GlobalAddress:
O << Mang->getValueName(MO.getGlobal());
break;
case MachineOperand::MO_MachineBasicBlock:
printBasicBlockLabel(MO.getMachineBasicBlock());
return;
- case MachineOperand::MO_PCRelativeDisp:
- std::cerr << "Shouldn't use addPCDisp() when building X86 MachineInstrs";
- abort ();
- return;
case MachineOperand::MO_JumpTableIndex: {
bool isMemOp = Modifier && !strcmp(Modifier, "mem");
if (!isMemOp) O << '$';
case MachineOperand::MO_MachineBasicBlock:
printBasicBlockLabel(MO.getMachineBasicBlock());
return;
- case MachineOperand::MO_PCRelativeDisp:
- assert(0 && "Shouldn't use addPCDisp() when building X86 MachineInstrs");
- abort ();
- return;
case MachineOperand::MO_ConstantPoolIndex: {
bool isMemOp = Modifier && !strcmp(Modifier, "mem");
if (!isMemOp) O << "OFFSET ";