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