--- Reverse-merging r107947 into '.':
[oota-llvm.git] / utils / TableGen / FastISelEmitter.cpp
1 //===- FastISelEmitter.cpp - Generate an instruction selector -------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This tablegen backend emits code for use by the "fast" instruction
11 // selection algorithm. See the comments at the top of
12 // lib/CodeGen/SelectionDAG/FastISel.cpp for background.
13 //
14 // This file scans through the target's tablegen instruction-info files
15 // and extracts instructions with obvious-looking patterns, and it emits
16 // code to look up these instructions by type and operator.
17 //
18 //===----------------------------------------------------------------------===//
19
20 #include "FastISelEmitter.h"
21 #include "Record.h"
22 #include "llvm/Support/Debug.h"
23 #include "llvm/ADT/VectorExtras.h"
24 using namespace llvm;
25
26 namespace {
27
28 /// InstructionMemo - This class holds additional information about an
29 /// instruction needed to emit code for it.
30 ///
31 struct InstructionMemo {
32   std::string Name;
33   const CodeGenRegisterClass *RC;
34   std::string SubRegNo;
35   std::vector<std::string>* PhysRegs;
36 };
37
38 /// OperandsSignature - This class holds a description of a list of operand
39 /// types. It has utility methods for emitting text based on the operands.
40 ///
41 struct OperandsSignature {
42   std::vector<std::string> Operands;
43
44   bool operator<(const OperandsSignature &O) const {
45     return Operands < O.Operands;
46   }
47
48   bool empty() const { return Operands.empty(); }
49
50   /// initialize - Examine the given pattern and initialize the contents
51   /// of the Operands array accordingly. Return true if all the operands
52   /// are supported, false otherwise.
53   ///
54   bool initialize(TreePatternNode *InstPatNode,
55                   const CodeGenTarget &Target,
56                   MVT::SimpleValueType VT) {
57     if (!InstPatNode->isLeaf()) {
58       if (InstPatNode->getOperator()->getName() == "imm") {
59         Operands.push_back("i");
60         return true;
61       }
62       if (InstPatNode->getOperator()->getName() == "fpimm") {
63         Operands.push_back("f");
64         return true;
65       }
66     }
67     
68     const CodeGenRegisterClass *DstRC = 0;
69     
70     for (unsigned i = 0, e = InstPatNode->getNumChildren(); i != e; ++i) {
71       TreePatternNode *Op = InstPatNode->getChild(i);
72       // For now, filter out any operand with a predicate.
73       // For now, filter out any operand with multiple values.
74       if (!Op->getPredicateFns().empty() ||
75           Op->getNumTypes() != 1)
76         return false;
77       
78       assert(Op->hasTypeSet(0) && "Type infererence not done?");
79       // For now, all the operands must have the same type.
80       if (Op->getType(0) != VT)
81         return false;
82       
83       if (!Op->isLeaf()) {
84         if (Op->getOperator()->getName() == "imm") {
85           Operands.push_back("i");
86           continue;
87         }
88         if (Op->getOperator()->getName() == "fpimm") {
89           Operands.push_back("f");
90           continue;
91         }
92         // For now, ignore other non-leaf nodes.
93         return false;
94       }
95       DefInit *OpDI = dynamic_cast<DefInit*>(Op->getLeafValue());
96       if (!OpDI)
97         return false;
98       Record *OpLeafRec = OpDI->getDef();
99       // For now, the only other thing we accept is register operands.
100
101       const CodeGenRegisterClass *RC = 0;
102       if (OpLeafRec->isSubClassOf("RegisterClass"))
103         RC = &Target.getRegisterClass(OpLeafRec);
104       else if (OpLeafRec->isSubClassOf("Register"))
105         RC = Target.getRegisterClassForRegister(OpLeafRec);
106       else
107         return false;
108       // For now, require the register operands' register classes to all
109       // be the same.
110       if (!RC)
111         return false;
112       // For now, all the operands must have the same register class.
113       if (DstRC) {
114         if (DstRC != RC)
115           return false;
116       } else
117         DstRC = RC;
118       Operands.push_back("r");
119     }
120     return true;
121   }
122
123   void PrintParameters(raw_ostream &OS) const {
124     for (unsigned i = 0, e = Operands.size(); i != e; ++i) {
125       if (Operands[i] == "r") {
126         OS << "unsigned Op" << i << ", bool Op" << i << "IsKill";
127       } else if (Operands[i] == "i") {
128         OS << "uint64_t imm" << i;
129       } else if (Operands[i] == "f") {
130         OS << "ConstantFP *f" << i;
131       } else {
132         assert("Unknown operand kind!");
133         abort();
134       }
135       if (i + 1 != e)
136         OS << ", ";
137     }
138   }
139
140   void PrintArguments(raw_ostream &OS,
141                       const std::vector<std::string>& PR) const {
142     assert(PR.size() == Operands.size());
143     bool PrintedArg = false;
144     for (unsigned i = 0, e = Operands.size(); i != e; ++i) {
145       if (PR[i] != "")
146         // Implicit physical register operand.
147         continue;
148
149       if (PrintedArg)
150         OS << ", ";
151       if (Operands[i] == "r") {
152         OS << "Op" << i << ", Op" << i << "IsKill";
153         PrintedArg = true;
154       } else if (Operands[i] == "i") {
155         OS << "imm" << i;
156         PrintedArg = true;
157       } else if (Operands[i] == "f") {
158         OS << "f" << i;
159         PrintedArg = true;
160       } else {
161         assert("Unknown operand kind!");
162         abort();
163       }
164     }
165   }
166
167   void PrintArguments(raw_ostream &OS) const {
168     for (unsigned i = 0, e = Operands.size(); i != e; ++i) {
169       if (Operands[i] == "r") {
170         OS << "Op" << i << ", Op" << i << "IsKill";
171       } else if (Operands[i] == "i") {
172         OS << "imm" << i;
173       } else if (Operands[i] == "f") {
174         OS << "f" << i;
175       } else {
176         assert("Unknown operand kind!");
177         abort();
178       }
179       if (i + 1 != e)
180         OS << ", ";
181     }
182   }
183
184
185   void PrintManglingSuffix(raw_ostream &OS,
186                            const std::vector<std::string>& PR) const {
187     for (unsigned i = 0, e = Operands.size(); i != e; ++i) {
188       if (PR[i] != "")
189         // Implicit physical register operand. e.g. Instruction::Mul expect to
190         // select to a binary op. On x86, mul may take a single operand with
191         // the other operand being implicit. We must emit something that looks
192         // like a binary instruction except for the very inner FastEmitInst_*
193         // call.
194         continue;
195       OS << Operands[i];
196     }
197   }
198
199   void PrintManglingSuffix(raw_ostream &OS) const {
200     for (unsigned i = 0, e = Operands.size(); i != e; ++i) {
201       OS << Operands[i];
202     }
203   }
204 };
205
206 class FastISelMap {
207   typedef std::map<std::string, InstructionMemo> PredMap;
208   typedef std::map<MVT::SimpleValueType, PredMap> RetPredMap;
209   typedef std::map<MVT::SimpleValueType, RetPredMap> TypeRetPredMap;
210   typedef std::map<std::string, TypeRetPredMap> OpcodeTypeRetPredMap;
211   typedef std::map<OperandsSignature, OpcodeTypeRetPredMap> OperandsOpcodeTypeRetPredMap;
212
213   OperandsOpcodeTypeRetPredMap SimplePatterns;
214
215   std::string InstNS;
216
217 public:
218   explicit FastISelMap(std::string InstNS);
219
220   void CollectPatterns(CodeGenDAGPatterns &CGP);
221   void PrintFunctionDefinitions(raw_ostream &OS);
222 };
223
224 }
225
226 static std::string getOpcodeName(Record *Op, CodeGenDAGPatterns &CGP) {
227   return CGP.getSDNodeInfo(Op).getEnumName();
228 }
229
230 static std::string getLegalCName(std::string OpName) {
231   std::string::size_type pos = OpName.find("::");
232   if (pos != std::string::npos)
233     OpName.replace(pos, 2, "_");
234   return OpName;
235 }
236
237 FastISelMap::FastISelMap(std::string instns)
238   : InstNS(instns) {
239 }
240
241 void FastISelMap::CollectPatterns(CodeGenDAGPatterns &CGP) {
242   const CodeGenTarget &Target = CGP.getTargetInfo();
243
244   // Determine the target's namespace name.
245   InstNS = Target.getInstNamespace() + "::";
246   assert(InstNS.size() > 2 && "Can't determine target-specific namespace!");
247
248   // Scan through all the patterns and record the simple ones.
249   for (CodeGenDAGPatterns::ptm_iterator I = CGP.ptm_begin(),
250        E = CGP.ptm_end(); I != E; ++I) {
251     const PatternToMatch &Pattern = *I;
252
253     // For now, just look at Instructions, so that we don't have to worry
254     // about emitting multiple instructions for a pattern.
255     TreePatternNode *Dst = Pattern.getDstPattern();
256     if (Dst->isLeaf()) continue;
257     Record *Op = Dst->getOperator();
258     if (!Op->isSubClassOf("Instruction"))
259       continue;
260     CodeGenInstruction &II = CGP.getTargetInfo().getInstruction(Op);
261     if (II.OperandList.empty())
262       continue;
263
264     // For now, ignore multi-instruction patterns.
265     bool MultiInsts = false;
266     for (unsigned i = 0, e = Dst->getNumChildren(); i != e; ++i) {
267       TreePatternNode *ChildOp = Dst->getChild(i);
268       if (ChildOp->isLeaf())
269         continue;
270       if (ChildOp->getOperator()->isSubClassOf("Instruction")) {
271         MultiInsts = true;
272         break;
273       }
274     }
275     if (MultiInsts)
276       continue;
277
278     // For now, ignore instructions where the first operand is not an
279     // output register.
280     const CodeGenRegisterClass *DstRC = 0;
281     std::string SubRegNo;
282     if (Op->getName() != "EXTRACT_SUBREG") {
283       Record *Op0Rec = II.OperandList[0].Rec;
284       if (!Op0Rec->isSubClassOf("RegisterClass"))
285         continue;
286       DstRC = &Target.getRegisterClass(Op0Rec);
287       if (!DstRC)
288         continue;
289     } else {
290       DefInit *SR = dynamic_cast<DefInit*>(Dst->getChild(1)->getLeafValue());
291       if (SR)
292         SubRegNo = getQualifiedName(SR->getDef());
293       else
294         SubRegNo = Dst->getChild(1)->getLeafValue()->getAsString();
295     }
296
297     // Inspect the pattern.
298     TreePatternNode *InstPatNode = Pattern.getSrcPattern();
299     if (!InstPatNode) continue;
300     if (InstPatNode->isLeaf()) continue;
301
302     // Ignore multiple result nodes for now.
303     if (InstPatNode->getNumTypes() > 1) continue;
304     
305     Record *InstPatOp = InstPatNode->getOperator();
306     std::string OpcodeName = getOpcodeName(InstPatOp, CGP);
307     MVT::SimpleValueType RetVT = MVT::isVoid;
308     if (InstPatNode->getNumTypes()) RetVT = InstPatNode->getType(0);
309     MVT::SimpleValueType VT = RetVT;
310     if (InstPatNode->getNumChildren()) {
311       assert(InstPatNode->getChild(0)->getNumTypes() == 1);
312       VT = InstPatNode->getChild(0)->getType(0);
313     }
314
315     // For now, filter out instructions which just set a register to
316     // an Operand or an immediate, like MOV32ri.
317     if (InstPatOp->isSubClassOf("Operand"))
318       continue;
319
320     // For now, filter out any instructions with predicates.
321     if (!InstPatNode->getPredicateFns().empty())
322       continue;
323
324     // Check all the operands.
325     OperandsSignature Operands;
326     if (!Operands.initialize(InstPatNode, Target, VT))
327       continue;
328     
329     std::vector<std::string>* PhysRegInputs = new std::vector<std::string>();
330     if (!InstPatNode->isLeaf() &&
331         (InstPatNode->getOperator()->getName() == "imm" ||
332          InstPatNode->getOperator()->getName() == "fpimmm"))
333       PhysRegInputs->push_back("");
334     else if (!InstPatNode->isLeaf()) {
335       for (unsigned i = 0, e = InstPatNode->getNumChildren(); i != e; ++i) {
336         TreePatternNode *Op = InstPatNode->getChild(i);
337         if (!Op->isLeaf()) {
338           PhysRegInputs->push_back("");
339           continue;
340         }
341         
342         DefInit *OpDI = dynamic_cast<DefInit*>(Op->getLeafValue());
343         Record *OpLeafRec = OpDI->getDef();
344         std::string PhysReg;
345         if (OpLeafRec->isSubClassOf("Register")) {
346           PhysReg += static_cast<StringInit*>(OpLeafRec->getValue( \
347                      "Namespace")->getValue())->getValue();
348           PhysReg += "::";
349           
350           std::vector<CodeGenRegister> Regs = Target.getRegisters();
351           for (unsigned i = 0; i < Regs.size(); ++i) {
352             if (Regs[i].TheDef == OpLeafRec) {
353               PhysReg += Regs[i].getName();
354               break;
355             }
356           }
357         }
358       
359         PhysRegInputs->push_back(PhysReg);
360       }
361     } else
362       PhysRegInputs->push_back("");
363
364     // Get the predicate that guards this pattern.
365     std::string PredicateCheck = Pattern.getPredicateCheck();
366
367     // Ok, we found a pattern that we can handle. Remember it.
368     InstructionMemo Memo = {
369       Pattern.getDstPattern()->getOperator()->getName(),
370       DstRC,
371       SubRegNo,
372       PhysRegInputs
373     };
374     assert(!SimplePatterns[Operands][OpcodeName][VT][RetVT].count(PredicateCheck) &&
375            "Duplicate pattern!");
376     SimplePatterns[Operands][OpcodeName][VT][RetVT][PredicateCheck] = Memo;
377   }
378 }
379
380 void FastISelMap::PrintFunctionDefinitions(raw_ostream &OS) {
381   // Now emit code for all the patterns that we collected.
382   for (OperandsOpcodeTypeRetPredMap::const_iterator OI = SimplePatterns.begin(),
383        OE = SimplePatterns.end(); OI != OE; ++OI) {
384     const OperandsSignature &Operands = OI->first;
385     const OpcodeTypeRetPredMap &OTM = OI->second;
386
387     for (OpcodeTypeRetPredMap::const_iterator I = OTM.begin(), E = OTM.end();
388          I != E; ++I) {
389       const std::string &Opcode = I->first;
390       const TypeRetPredMap &TM = I->second;
391
392       OS << "// FastEmit functions for " << Opcode << ".\n";
393       OS << "\n";
394
395       // Emit one function for each opcode,type pair.
396       for (TypeRetPredMap::const_iterator TI = TM.begin(), TE = TM.end();
397            TI != TE; ++TI) {
398         MVT::SimpleValueType VT = TI->first;
399         const RetPredMap &RM = TI->second;
400         if (RM.size() != 1) {
401           for (RetPredMap::const_iterator RI = RM.begin(), RE = RM.end();
402                RI != RE; ++RI) {
403             MVT::SimpleValueType RetVT = RI->first;
404             const PredMap &PM = RI->second;
405             bool HasPred = false;
406
407             OS << "unsigned FastEmit_"
408                << getLegalCName(Opcode)
409                << "_" << getLegalCName(getName(VT))
410                << "_" << getLegalCName(getName(RetVT)) << "_";
411             Operands.PrintManglingSuffix(OS);
412             OS << "(";
413             Operands.PrintParameters(OS);
414             OS << ") {\n";
415
416             // Emit code for each possible instruction. There may be
417             // multiple if there are subtarget concerns.
418             for (PredMap::const_iterator PI = PM.begin(), PE = PM.end();
419                  PI != PE; ++PI) {
420               std::string PredicateCheck = PI->first;
421               const InstructionMemo &Memo = PI->second;
422   
423               if (PredicateCheck.empty()) {
424                 assert(!HasPred &&
425                        "Multiple instructions match, at least one has "
426                        "a predicate and at least one doesn't!");
427               } else {
428                 OS << "  if (" + PredicateCheck + ") {\n";
429                 OS << "  ";
430                 HasPred = true;
431               }
432               
433               for (unsigned i = 0; i < Memo.PhysRegs->size(); ++i) {
434                 if ((*Memo.PhysRegs)[i] != "")
435                   OS << "  TII.copyRegToReg(*MBB, MBB->end(), "
436                      << (*Memo.PhysRegs)[i] << ", Op" << i << ", "
437                      << "TM.getRegisterInfo()->getPhysicalRegisterRegClass("
438                      << (*Memo.PhysRegs)[i] << "), "
439                      << "MRI.getRegClass(Op" << i << "), DL);\n";
440               }
441               
442               OS << "  return FastEmitInst_";
443               if (Memo.SubRegNo.empty()) {
444                 Operands.PrintManglingSuffix(OS, *Memo.PhysRegs);
445                 OS << "(" << InstNS << Memo.Name << ", ";
446                 OS << InstNS << Memo.RC->getName() << "RegisterClass";
447                 if (!Operands.empty())
448                   OS << ", ";
449                 Operands.PrintArguments(OS, *Memo.PhysRegs);
450                 OS << ");\n";
451               } else {
452                 OS << "extractsubreg(" << getName(RetVT);
453                 OS << ", Op0, Op0IsKill, ";
454                 OS << Memo.SubRegNo;
455                 OS << ");\n";
456               }
457               
458               if (HasPred)
459                 OS << "  }\n";
460               
461             }
462             // Return 0 if none of the predicates were satisfied.
463             if (HasPred)
464               OS << "  return 0;\n";
465             OS << "}\n";
466             OS << "\n";
467           }
468           
469           // Emit one function for the type that demultiplexes on return type.
470           OS << "unsigned FastEmit_"
471              << getLegalCName(Opcode) << "_"
472              << getLegalCName(getName(VT)) << "_";
473           Operands.PrintManglingSuffix(OS);
474           OS << "(MVT RetVT";
475           if (!Operands.empty())
476             OS << ", ";
477           Operands.PrintParameters(OS);
478           OS << ") {\nswitch (RetVT.SimpleTy) {\n";
479           for (RetPredMap::const_iterator RI = RM.begin(), RE = RM.end();
480                RI != RE; ++RI) {
481             MVT::SimpleValueType RetVT = RI->first;
482             OS << "  case " << getName(RetVT) << ": return FastEmit_"
483                << getLegalCName(Opcode) << "_" << getLegalCName(getName(VT))
484                << "_" << getLegalCName(getName(RetVT)) << "_";
485             Operands.PrintManglingSuffix(OS);
486             OS << "(";
487             Operands.PrintArguments(OS);
488             OS << ");\n";
489           }
490           OS << "  default: return 0;\n}\n}\n\n";
491           
492         } else {
493           // Non-variadic return type.
494           OS << "unsigned FastEmit_"
495              << getLegalCName(Opcode) << "_"
496              << getLegalCName(getName(VT)) << "_";
497           Operands.PrintManglingSuffix(OS);
498           OS << "(MVT RetVT";
499           if (!Operands.empty())
500             OS << ", ";
501           Operands.PrintParameters(OS);
502           OS << ") {\n";
503           
504           OS << "  if (RetVT.SimpleTy != " << getName(RM.begin()->first)
505              << ")\n    return 0;\n";
506           
507           const PredMap &PM = RM.begin()->second;
508           bool HasPred = false;
509           
510           // Emit code for each possible instruction. There may be
511           // multiple if there are subtarget concerns.
512           for (PredMap::const_iterator PI = PM.begin(), PE = PM.end(); PI != PE;
513                ++PI) {
514             std::string PredicateCheck = PI->first;
515             const InstructionMemo &Memo = PI->second;
516
517             if (PredicateCheck.empty()) {
518               assert(!HasPred &&
519                      "Multiple instructions match, at least one has "
520                      "a predicate and at least one doesn't!");
521             } else {
522               OS << "  if (" + PredicateCheck + ") {\n";
523               OS << "  ";
524               HasPred = true;
525             }
526             
527              for (unsigned i = 0; i < Memo.PhysRegs->size(); ++i) {
528                 if ((*Memo.PhysRegs)[i] != "")
529                   OS << "  TII.copyRegToReg(*MBB, MBB->end(), "
530                      << (*Memo.PhysRegs)[i] << ", Op" << i << ", "
531                      << "TM.getRegisterInfo()->getPhysicalRegisterRegClass("
532                      << (*Memo.PhysRegs)[i] << "), "
533                      << "MRI.getRegClass(Op" << i << "), DL);\n";
534               }
535             
536             OS << "  return FastEmitInst_";
537             
538             if (Memo.SubRegNo.empty()) {
539               Operands.PrintManglingSuffix(OS, *Memo.PhysRegs);
540               OS << "(" << InstNS << Memo.Name << ", ";
541               OS << InstNS << Memo.RC->getName() << "RegisterClass";
542               if (!Operands.empty())
543                 OS << ", ";
544               Operands.PrintArguments(OS, *Memo.PhysRegs);
545               OS << ");\n";
546             } else {
547               OS << "extractsubreg(RetVT, Op0, Op0IsKill, ";
548               OS << Memo.SubRegNo;
549               OS << ");\n";
550             }
551             
552              if (HasPred)
553                OS << "  }\n";
554           }
555           
556           // Return 0 if none of the predicates were satisfied.
557           if (HasPred)
558             OS << "  return 0;\n";
559           OS << "}\n";
560           OS << "\n";
561         }
562       }
563
564       // Emit one function for the opcode that demultiplexes based on the type.
565       OS << "unsigned FastEmit_"
566          << getLegalCName(Opcode) << "_";
567       Operands.PrintManglingSuffix(OS);
568       OS << "(MVT VT, MVT RetVT";
569       if (!Operands.empty())
570         OS << ", ";
571       Operands.PrintParameters(OS);
572       OS << ") {\n";
573       OS << "  switch (VT.SimpleTy) {\n";
574       for (TypeRetPredMap::const_iterator TI = TM.begin(), TE = TM.end();
575            TI != TE; ++TI) {
576         MVT::SimpleValueType VT = TI->first;
577         std::string TypeName = getName(VT);
578         OS << "  case " << TypeName << ": return FastEmit_"
579            << getLegalCName(Opcode) << "_" << getLegalCName(TypeName) << "_";
580         Operands.PrintManglingSuffix(OS);
581         OS << "(RetVT";
582         if (!Operands.empty())
583           OS << ", ";
584         Operands.PrintArguments(OS);
585         OS << ");\n";
586       }
587       OS << "  default: return 0;\n";
588       OS << "  }\n";
589       OS << "}\n";
590       OS << "\n";
591     }
592
593     OS << "// Top-level FastEmit function.\n";
594     OS << "\n";
595
596     // Emit one function for the operand signature that demultiplexes based
597     // on opcode and type.
598     OS << "unsigned FastEmit_";
599     Operands.PrintManglingSuffix(OS);
600     OS << "(MVT VT, MVT RetVT, unsigned Opcode";
601     if (!Operands.empty())
602       OS << ", ";
603     Operands.PrintParameters(OS);
604     OS << ") {\n";
605     OS << "  switch (Opcode) {\n";
606     for (OpcodeTypeRetPredMap::const_iterator I = OTM.begin(), E = OTM.end();
607          I != E; ++I) {
608       const std::string &Opcode = I->first;
609
610       OS << "  case " << Opcode << ": return FastEmit_"
611          << getLegalCName(Opcode) << "_";
612       Operands.PrintManglingSuffix(OS);
613       OS << "(VT, RetVT";
614       if (!Operands.empty())
615         OS << ", ";
616       Operands.PrintArguments(OS);
617       OS << ");\n";
618     }
619     OS << "  default: return 0;\n";
620     OS << "  }\n";
621     OS << "}\n";
622     OS << "\n";
623   }
624 }
625
626 void FastISelEmitter::run(raw_ostream &OS) {
627   const CodeGenTarget &Target = CGP.getTargetInfo();
628
629   // Determine the target's namespace name.
630   std::string InstNS = Target.getInstNamespace() + "::";
631   assert(InstNS.size() > 2 && "Can't determine target-specific namespace!");
632
633   EmitSourceFileHeader("\"Fast\" Instruction Selector for the " +
634                        Target.getName() + " target", OS);
635
636   FastISelMap F(InstNS);
637   F.CollectPatterns(CGP);
638   F.PrintFunctionDefinitions(OS);
639 }
640
641 FastISelEmitter::FastISelEmitter(RecordKeeper &R)
642   : Records(R),
643     CGP(R) {
644 }
645