InstrInfoEmitter.cpp revision 5f89bf0f9df54687f4474fe13f5d1a8635d85d5a
133ccf7edff6d784c7f6ea85ada2b67062272073eChris Lattner//===- InstrInfoEmitter.cpp - Generate a Instruction Set Desc. ------------===// 23da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 301d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell// The LLVM Compiler Infrastructure 401d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell// 501d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell// This file was developed by the LLVM research group and is distributed under 601d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details. 73da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 801d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell//===----------------------------------------------------------------------===// 933ccf7edff6d784c7f6ea85ada2b67062272073eChris Lattner// 1033ccf7edff6d784c7f6ea85ada2b67062272073eChris Lattner// This tablegen backend is responsible for emitting a description of the target 1133ccf7edff6d784c7f6ea85ada2b67062272073eChris Lattner// instruction set for the code generator. 1233ccf7edff6d784c7f6ea85ada2b67062272073eChris Lattner// 1333ccf7edff6d784c7f6ea85ada2b67062272073eChris Lattner//===----------------------------------------------------------------------===// 1433ccf7edff6d784c7f6ea85ada2b67062272073eChris Lattner 1533ccf7edff6d784c7f6ea85ada2b67062272073eChris Lattner#include "InstrInfoEmitter.h" 16803a5f6ecb1823280f80e3c4459aa58627d0484cChris Lattner#include "CodeGenTarget.h" 1733ccf7edff6d784c7f6ea85ada2b67062272073eChris Lattner#include "Record.h" 182082ebe8b3a5db302748828ab4f79a36d239c1d9Chris Lattnerusing namespace llvm; 19d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 2033ccf7edff6d784c7f6ea85ada2b67062272073eChris Lattner// runEnums - Print out enum values for all of the instructions. 2133ccf7edff6d784c7f6ea85ada2b67062272073eChris Lattnervoid InstrInfoEmitter::runEnums(std::ostream &OS) { 22bc01723605de979e67b1aea67385a029f851de34Chris Lattner EmitSourceFileHeader("Target Instruction Enum Values", OS); 232c38413b3f5420f45f2f8220b21862246d446dd0Chris Lattner OS << "namespace llvm {\n\n"; 2433ccf7edff6d784c7f6ea85ada2b67062272073eChris Lattner 257884b750c33b750177b3f22af75c874c97f728d8Chris Lattner CodeGenTarget Target; 267884b750c33b750177b3f22af75c874c97f728d8Chris Lattner 27a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner // We must emit the PHI opcode first... 287884b750c33b750177b3f22af75c874c97f728d8Chris Lattner Record *InstrInfo = Target.getInstructionSet(); 2933ccf7edff6d784c7f6ea85ada2b67062272073eChris Lattner 30ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner std::string Namespace = Target.inst_begin()->second.Namespace; 31ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner 32ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner if (!Namespace.empty()) 33ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner OS << "namespace " << Namespace << " {\n"; 34ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner OS << " enum {\n"; 35ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner 36d6488671736d0a5aaee1218748b94d8c68f33716Chris Lattner std::vector<const CodeGenInstruction*> NumberedInstructions; 37d6488671736d0a5aaee1218748b94d8c68f33716Chris Lattner Target.getInstructionsByEnumValue(NumberedInstructions); 38d6488671736d0a5aaee1218748b94d8c68f33716Chris Lattner 39d6488671736d0a5aaee1218748b94d8c68f33716Chris Lattner for (unsigned i = 0, e = NumberedInstructions.size(); i != e; ++i) { 40d6488671736d0a5aaee1218748b94d8c68f33716Chris Lattner OS << " " << NumberedInstructions[i]->TheDef->getName() 41d6488671736d0a5aaee1218748b94d8c68f33716Chris Lattner << ", \t// " << i << "\n"; 42d6488671736d0a5aaee1218748b94d8c68f33716Chris Lattner } 439fdd6e3f50b7fdafff9aa0e1bac0bd2a78d03d71Chris Lattner OS << " INSTRUCTION_LIST_END\n"; 4433ccf7edff6d784c7f6ea85ada2b67062272073eChris Lattner OS << " };\n"; 4533ccf7edff6d784c7f6ea85ada2b67062272073eChris Lattner if (!Namespace.empty()) 4633ccf7edff6d784c7f6ea85ada2b67062272073eChris Lattner OS << "}\n"; 472c38413b3f5420f45f2f8220b21862246d446dd0Chris Lattner OS << "} // End llvm namespace \n"; 4833ccf7edff6d784c7f6ea85ada2b67062272073eChris Lattner} 49a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner 50a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattnerstatic std::vector<Record*> GetDefList(ListInit *LI, const std::string &Name) { 51a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner std::vector<Record*> Result; 52a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner for (unsigned i = 0, e = LI->getSize(); i != e; ++i) 53a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner if (DefInit *DI = dynamic_cast<DefInit*>(LI->getElement(i))) 54a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner Result.push_back(DI->getDef()); 55a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner else 56a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner throw "Illegal value in '" + Name + "' list!"; 57a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner return Result; 58a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner} 59a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner 60a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattnervoid InstrInfoEmitter::printDefList(const std::vector<Record*> &Uses, 61a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner unsigned Num, std::ostream &OS) const { 62a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner OS << "static const unsigned ImplicitList" << Num << "[] = { "; 63a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner for (unsigned i = 0, e = Uses.size(); i != e; ++i) 64a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner OS << getQualifiedName(Uses[i]) << ", "; 65a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner OS << "0 };\n"; 66a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner} 67a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner 68d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattnerstatic std::vector<Record*> GetOperandInfo(const CodeGenInstruction &Inst) { 69d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner std::vector<Record*> Result; 70d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner if (Inst.hasVariableNumberOfOperands) 71d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner return Result; // No info for variable operand instrs. 72d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner 73d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner for (unsigned i = 0, e = Inst.OperandList.size(); i != e; ++i) { 74d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner if (Inst.OperandList[i].Rec->isSubClassOf("RegisterClass")) 75d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner Result.push_back(Inst.OperandList[i].Rec); 76d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner else { 77d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner // This might be a multiple operand thing. 78d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner // FIXME: Targets like X86 have registers in their multi-operand operands. 79d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner for (unsigned j = 0, e = Inst.OperandList[i].MINumOperands; j != e; ++j) 80d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner Result.push_back(0); 81d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner } 82d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner } 83d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner return Result; 84d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner} 85d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner 86a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner 87a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner// run - Emit the main instruction description records for the target... 88a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattnervoid InstrInfoEmitter::run(std::ostream &OS) { 89bc01723605de979e67b1aea67385a029f851de34Chris Lattner EmitSourceFileHeader("Target Instruction Descriptors", OS); 902c38413b3f5420f45f2f8220b21862246d446dd0Chris Lattner OS << "namespace llvm {\n\n"; 912c38413b3f5420f45f2f8220b21862246d446dd0Chris Lattner 927884b750c33b750177b3f22af75c874c97f728d8Chris Lattner CodeGenTarget Target; 937884b750c33b750177b3f22af75c874c97f728d8Chris Lattner const std::string &TargetName = Target.getName(); 947884b750c33b750177b3f22af75c874c97f728d8Chris Lattner Record *InstrInfo = Target.getInstructionSet(); 95a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner Record *PHI = InstrInfo->getValueAsDef("PHIInst"); 96a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner 9773ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos // Emit empty implicit uses and defs lists 98a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner OS << "static const unsigned EmptyImpList[] = { 0 };\n"; 99a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner 100a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner // Keep track of all of the def lists we have emitted already. 101a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner std::map<std::vector<Record*>, unsigned> EmittedLists; 102a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner std::map<ListInit*, unsigned> ListNumbers; 103a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner unsigned ListNumber = 0; 104a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner 105a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner // Emit all of the instruction's implicit uses and defs. 106ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner for (CodeGenTarget::inst_iterator II = Target.inst_begin(), 107ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner E = Target.inst_end(); II != E; ++II) { 108ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner Record *Inst = II->second.TheDef; 109a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner ListInit *LI = Inst->getValueAsListInit("Uses"); 110a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner if (LI->getSize()) { 111a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner std::vector<Record*> Uses = GetDefList(LI, Inst->getName()); 112a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner unsigned &IL = EmittedLists[Uses]; 113a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner if (!IL) printDefList(Uses, IL = ++ListNumber, OS); 114a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner ListNumbers[LI] = IL; 115a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner } 116a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner LI = Inst->getValueAsListInit("Defs"); 117a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner if (LI->getSize()) { 118a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner std::vector<Record*> Uses = GetDefList(LI, Inst->getName()); 119a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner unsigned &IL = EmittedLists[Uses]; 120a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner if (!IL) printDefList(Uses, IL = ++ListNumber, OS); 121a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner ListNumbers[LI] = IL; 122a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner } 123a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner } 124a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner 125d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner std::map<std::vector<Record*>, unsigned> OperandInfosEmitted; 126d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner unsigned OperandListNum = 0; 127d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner OperandInfosEmitted[std::vector<Record*>()] = ++OperandListNum; 128d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner 1290e384b66a781fc0ff005f475a7ab151afa054fb0Chris Lattner // Emit all of the operand info records. 1300e384b66a781fc0ff005f475a7ab151afa054fb0Chris Lattner OS << "\n"; 1310e384b66a781fc0ff005f475a7ab151afa054fb0Chris Lattner for (CodeGenTarget::inst_iterator II = Target.inst_begin(), 1320e384b66a781fc0ff005f475a7ab151afa054fb0Chris Lattner E = Target.inst_end(); II != E; ++II) { 133d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner std::vector<Record*> OperandInfo = GetOperandInfo(II->second); 134d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner unsigned &N = OperandInfosEmitted[OperandInfo]; 135d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner if (N == 0) { 136d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner N = ++OperandListNum; 137d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner OS << "static const TargetOperandInfo OperandInfo" << N << "[] = { "; 138d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner for (unsigned i = 0, e = OperandInfo.size(); i != e; ++i) { 139d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner if (Record *RC = OperandInfo[i]) { 1408d30c23d2638bdc9a3e4fc7ba764adf5df043ee5Chris Lattner OS << "{ &" << getQualifiedName(RC) << "RegClass }, "; 141d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner } else { 142d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner OS << "{ 0 }, "; 143d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner } 144d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner } 1450e384b66a781fc0ff005f475a7ab151afa054fb0Chris Lattner OS << "};\n"; 1460e384b66a781fc0ff005f475a7ab151afa054fb0Chris Lattner } 1470e384b66a781fc0ff005f475a7ab151afa054fb0Chris Lattner } 1480e384b66a781fc0ff005f475a7ab151afa054fb0Chris Lattner 1490e384b66a781fc0ff005f475a7ab151afa054fb0Chris Lattner // Emit all of the TargetInstrDescriptor records. 1500e384b66a781fc0ff005f475a7ab151afa054fb0Chris Lattner // 151a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner OS << "\nstatic const TargetInstrDescriptor " << TargetName 152a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner << "Insts[] = {\n"; 153d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner emitRecord(Target.getPHIInstruction(), 0, InstrInfo, ListNumbers, 154d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner OperandInfosEmitted, OS); 155a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner 156ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner unsigned i = 0; 157ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner for (CodeGenTarget::inst_iterator II = Target.inst_begin(), 158ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner E = Target.inst_end(); II != E; ++II) 159ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner if (II->second.TheDef != PHI) 160d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner emitRecord(II->second, ++i, InstrInfo, ListNumbers, 161d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner OperandInfosEmitted, OS); 162a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner OS << "};\n"; 1632c38413b3f5420f45f2f8220b21862246d446dd0Chris Lattner OS << "} // End llvm namespace \n"; 164a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner} 165a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner 166ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattnervoid InstrInfoEmitter::emitRecord(const CodeGenInstruction &Inst, unsigned Num, 167a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner Record *InstrInfo, 168a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner std::map<ListInit*, unsigned> &ListNumbers, 169d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner std::map<std::vector<Record*>, unsigned> &OpInfo, 170a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner std::ostream &OS) { 171d98958f4bdd5a41b1d30668c25fe259069a04f92Chris Lattner int NumOperands; 172d98958f4bdd5a41b1d30668c25fe259069a04f92Chris Lattner if (Inst.hasVariableNumberOfOperands) 173d98958f4bdd5a41b1d30668c25fe259069a04f92Chris Lattner NumOperands = -1; 174d98958f4bdd5a41b1d30668c25fe259069a04f92Chris Lattner else if (!Inst.OperandList.empty()) 175d98958f4bdd5a41b1d30668c25fe259069a04f92Chris Lattner // Each logical operand can be multiple MI operands. 176d98958f4bdd5a41b1d30668c25fe259069a04f92Chris Lattner NumOperands = Inst.OperandList.back().MIOperandNo + 177d98958f4bdd5a41b1d30668c25fe259069a04f92Chris Lattner Inst.OperandList.back().MINumOperands; 178d98958f4bdd5a41b1d30668c25fe259069a04f92Chris Lattner else 179d98958f4bdd5a41b1d30668c25fe259069a04f92Chris Lattner NumOperands = 0; 180d98958f4bdd5a41b1d30668c25fe259069a04f92Chris Lattner 1812d12b2cf7513e7ee855deec0de293311d676cb75Chris Lattner OS << " { \""; 1822d12b2cf7513e7ee855deec0de293311d676cb75Chris Lattner if (Inst.Name.empty()) 1832d12b2cf7513e7ee855deec0de293311d676cb75Chris Lattner OS << Inst.TheDef->getName(); 1842d12b2cf7513e7ee855deec0de293311d676cb75Chris Lattner else 1852d12b2cf7513e7ee855deec0de293311d676cb75Chris Lattner OS << Inst.Name; 186d98958f4bdd5a41b1d30668c25fe259069a04f92Chris Lattner OS << "\",\t" << NumOperands << ", -1, 0, false, 0, 0, 0, 0"; 187a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner 188a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner // Emit all of the target indepedent flags... 189ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner if (Inst.isReturn) OS << "|M_RET_FLAG"; 190ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner if (Inst.isBranch) OS << "|M_BRANCH_FLAG"; 191ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner if (Inst.isBarrier) OS << "|M_BARRIER_FLAG"; 1925b71d3af35f941585acb50de4909cff20f68680dChris Lattner if (Inst.hasDelaySlot) OS << "|M_DELAY_SLOT_FLAG"; 193ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner if (Inst.isCall) OS << "|M_CALL_FLAG"; 194cdd66b524f62ef6acd6bfa4e586edf8a406c4928Nate Begeman if (Inst.isLoad) OS << "|M_LOAD_FLAG"; 195cdd66b524f62ef6acd6bfa4e586edf8a406c4928Nate Begeman if (Inst.isStore) OS << "|M_STORE_FLAG"; 196ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner if (Inst.isTwoAddress) OS << "|M_2_ADDR_FLAG"; 197aad75aa1a235ec1ab121ec2a9c745577493ed323Chris Lattner if (Inst.isConvertibleToThreeAddress) OS << "|M_CONVERTIBLE_TO_3_ADDR"; 198aad75aa1a235ec1ab121ec2a9c745577493ed323Chris Lattner if (Inst.isCommutable) OS << "|M_COMMUTABLE"; 199ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner if (Inst.isTerminator) OS << "|M_TERMINATOR_FLAG"; 2005f89bf0f9df54687f4474fe13f5d1a8635d85d5aChris Lattner if (Inst.usesCustomDAGSchedInserter) 2018b50f9b8dcd6da00ddc961ecda967719eb745deeChris Lattner OS << "|M_USES_CUSTOM_DAG_SCHED_INSERTION"; 202a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner OS << ", 0"; 203a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner 204a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner // Emit all of the target-specific flags... 205a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner ListInit *LI = InstrInfo->getValueAsListInit("TSFlagsFields"); 206a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner ListInit *Shift = InstrInfo->getValueAsListInit("TSFlagsShifts"); 207a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner if (LI->getSize() != Shift->getSize()) 208a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner throw "Lengths of " + InstrInfo->getName() + 209a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner ":(TargetInfoFields, TargetInfoPositions) must be equal!"; 210a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner 211a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner for (unsigned i = 0, e = LI->getSize(); i != e; ++i) 212ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner emitShiftedValue(Inst.TheDef, dynamic_cast<StringInit*>(LI->getElement(i)), 213a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner dynamic_cast<IntInit*>(Shift->getElement(i)), OS); 214a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner 215a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner OS << ", "; 216a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner 217a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner // Emit the implicit uses and defs lists... 218ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner LI = Inst.TheDef->getValueAsListInit("Uses"); 219a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner if (!LI->getSize()) 220a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner OS << "EmptyImpList, "; 2213da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman else 222a3ac88d8ab4605f6c1c298a8cdaa89d16c3756b4Chris Lattner OS << "ImplicitList" << ListNumbers[LI] << ", "; 223a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner 224ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner LI = Inst.TheDef->getValueAsListInit("Defs"); 225a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner if (!LI->getSize()) 2260e384b66a781fc0ff005f475a7ab151afa054fb0Chris Lattner OS << "EmptyImpList, "; 2273da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman else 2280e384b66a781fc0ff005f475a7ab151afa054fb0Chris Lattner OS << "ImplicitList" << ListNumbers[LI] << ", "; 229a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner 2300e384b66a781fc0ff005f475a7ab151afa054fb0Chris Lattner // Emit the operand info. 231d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner std::vector<Record*> OperandInfo = GetOperandInfo(Inst); 232d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner if (OperandInfo.empty()) 233d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner OS << "0"; 2340e384b66a781fc0ff005f475a7ab151afa054fb0Chris Lattner else 235d5aa3e26bb02732fddadecfd66112352a74742a0Chris Lattner OS << "OperandInfo" << OpInfo[OperandInfo]; 2360e384b66a781fc0ff005f475a7ab151afa054fb0Chris Lattner 237ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner OS << " }, // Inst #" << Num << " = " << Inst.TheDef->getName() << "\n"; 238a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner} 239a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner 240a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattnervoid InstrInfoEmitter::emitShiftedValue(Record *R, StringInit *Val, 241a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner IntInit *ShiftInt, std::ostream &OS) { 242a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner if (Val == 0 || ShiftInt == 0) 243a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner throw std::string("Illegal value or shift amount in TargetInfo*!"); 244a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner RecordVal *RV = R->getValue(Val->getValue()); 245a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner int Shift = ShiftInt->getValue(); 246a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner 247a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner if (RV == 0 || RV->getValue() == 0) 248a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner throw R->getName() + " doesn't have a field named '" + Val->getValue()+"'!"; 249a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner 250a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner Init *Value = RV->getValue(); 251a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner if (BitInit *BI = dynamic_cast<BitInit*>(Value)) { 252a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner if (BI->getValue()) OS << "|(1<<" << Shift << ")"; 253a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner return; 254a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner } else if (BitsInit *BI = dynamic_cast<BitsInit*>(Value)) { 255a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner // Convert the Bits to an integer to print... 256a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner Init *I = BI->convertInitializerTo(new IntRecTy()); 257a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner if (I) 258a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner if (IntInit *II = dynamic_cast<IntInit*>(I)) { 259a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner if (II->getValue()) 260a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner OS << "|(" << II->getValue() << "<<" << Shift << ")"; 261a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner return; 262a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner } 263a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner 264a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner } else if (IntInit *II = dynamic_cast<IntInit*>(Value)) { 265a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner if (II->getValue()) OS << "|(" << II->getValue() << "<<" << Shift << ")"; 266a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner return; 267a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner } 268a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner 269a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner std::cerr << "Unhandled initializer: " << *Val << "\n"; 270a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner throw "In record '" + R->getName() + "' for TSFlag emission."; 271a3ae6143c1ec9c39a7beb07960f89edd4736b018Chris Lattner} 272d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 273