for (CodeGenTarget::inst_iterator I = Target.inst_begin(),
E = Target.inst_end(); I != E; ++I)
- if (!(*I)->AsmString.empty() &&
- (*I)->TheDef->getName() != "PHI")
+ if (!I->second.AsmString.empty() &&
+ I->second.TheDef->getName() != "PHI")
Instructions.push_back(
- AsmWriterInst(**I,
+ AsmWriterInst(I->second,
AsmWriter->getValueAsInt("Variant"),
AsmWriter->getValueAsInt("FirstOperandColumn"),
AsmWriter->getValueAsInt("OperandSpacing")));
std::string InstNS;
for (inst_iterator i = inst_begin(), e = inst_end(); i != e; ++i) {
- InstNS = (*i)->Namespace;
+ InstNS = i->second.Namespace;
// Make sure not to pick up "TargetInstrInfo" by accidentally getting
// the namespace off the PHI instruction or something.
/// getInstructionsByEnumValue - Return all of the instructions defined by the
/// target, ordered by their enum value.
-void CodeGenTarget::ComputeInstrsByEnum() const {
+void CodeGenTarget::ComputeInstrsByEnum() {
const std::map<std::string, CodeGenInstruction> &Insts = getInstructions();
const CodeGenInstruction *PHI = GetInstByName("PHI", Insts);
const CodeGenInstruction *INLINEASM = GetInstByName("INLINEASM", Insts);
InstrsByEnum.push_back(COPY_TO_REGCLASS);
InstrsByEnum.push_back(DBG_VALUE);
for (inst_iterator II = inst_begin(), E = inst_end(); II != E; ++II)
- if (*II != PHI &&
- *II != INLINEASM &&
- *II != DBG_LABEL &&
- *II != EH_LABEL &&
- *II != GC_LABEL &&
- *II != KILL &&
- *II != EXTRACT_SUBREG &&
- *II != INSERT_SUBREG &&
- *II != IMPLICIT_DEF &&
- *II != SUBREG_TO_REG &&
- *II != COPY_TO_REGCLASS &&
- *II != DBG_VALUE)
- InstrsByEnum.push_back(*II);
+ if (&II->second != PHI &&
+ &II->second != INLINEASM &&
+ &II->second != DBG_LABEL &&
+ &II->second != EH_LABEL &&
+ &II->second != GC_LABEL &&
+ &II->second != KILL &&
+ &II->second != EXTRACT_SUBREG &&
+ &II->second != INSERT_SUBREG &&
+ &II->second != IMPLICIT_DEF &&
+ &II->second != SUBREG_TO_REG &&
+ &II->second != COPY_TO_REGCLASS &&
+ &II->second != DBG_VALUE)
+ InstrsByEnum.push_back(&II->second);
}
void ReadInstructions() const;
void ReadLegalValueTypes() const;
- mutable std::vector<const CodeGenInstruction*> InstrsByEnum;
+ std::vector<const CodeGenInstruction*> InstrsByEnum;
public:
CodeGenTarget();
CodeGenInstruction &getInstruction(const Record *InstRec) const;
+ typedef std::map<std::string,
+ CodeGenInstruction>::const_iterator inst_iterator;
+ inst_iterator inst_begin() const { return getInstructions().begin(); }
+ inst_iterator inst_end() const { return Instructions.end(); }
+
/// getInstructionsByEnumValue - Return all of the instructions defined by the
/// target, ordered by their enum value.
- const std::vector<const CodeGenInstruction*> &
- getInstructionsByEnumValue() const {
+ const std::vector<const CodeGenInstruction*> &getInstructionsByEnumValue() {
if (InstrsByEnum.empty()) ComputeInstrsByEnum();
return InstrsByEnum;
}
- typedef std::vector<const CodeGenInstruction*>::const_iterator inst_iterator;
- inst_iterator inst_begin() const{return getInstructionsByEnumValue().begin();}
- inst_iterator inst_end() const { return getInstructionsByEnumValue().end(); }
-
-
+
/// isLittleEndianEncoding - are instruction bit patterns defined as [0..n]?
///
bool isLittleEndianEncoding() const;
private:
- void ComputeInstrsByEnum() const;
+ void ComputeInstrsByEnum();
};
/// ComplexPattern - ComplexPattern info, corresponding to the ComplexPattern
std::string Namespace;
for (CodeGenTarget::inst_iterator II = Target.inst_begin(),
E = Target.inst_end(); II != E; ++II) {
- if ((*II)->Namespace != "TargetOpcode") {
- Namespace = (*II)->Namespace;
+ if (II->second.Namespace != "TargetOpcode") {
+ Namespace = II->second.Namespace;
break;
}
}
const CodeGenTarget &Target = CDP.getTargetInfo();
for (CodeGenTarget::inst_iterator II = Target.inst_begin(),
E = Target.inst_end(); II != E; ++II) {
- std::vector<std::string> OperandInfo = GetOperandInfo(**II);
+ std::vector<std::string> OperandInfo = GetOperandInfo(II->second);
unsigned &N = OperandInfoIDs[OperandInfo];
if (N != 0) continue;
// Emit all of the instruction's implicit uses and defs.
for (CodeGenTarget::inst_iterator II = Target.inst_begin(),
E = Target.inst_end(); II != E; ++II) {
- Record *Inst = (*II)->TheDef;
+ Record *Inst = II->second.TheDef;
std::vector<Record*> Uses = Inst->getValueAsListOfDefs("Uses");
if (!Uses.empty()) {
unsigned &IL = EmittedLists[Uses];