f946ac73cac24d5b20144250b0941c2747cd5aa0
[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 "Error.h"
22 #include "Record.h"
23 #include "llvm/ADT/SmallString.h"
24 #include "llvm/ADT/VectorExtras.h"
25 #include "llvm/Support/Debug.h"
26 #include "llvm/Support/ErrorHandling.h"
27 using namespace llvm;
28
29 namespace {
30
31 /// InstructionMemo - This class holds additional information about an
32 /// instruction needed to emit code for it.
33 ///
34 struct InstructionMemo {
35   std::string Name;
36   const CodeGenRegisterClass *RC;
37   std::string SubRegNo;
38   std::vector<std::string>* PhysRegs;
39 };
40   
41 /// ImmPredicateSet - This uniques predicates (represented as a string) and
42 /// gives them unique (small) integer ID's that start at 0.
43 class ImmPredicateSet {
44   DenseMap<TreePattern *, unsigned> ImmIDs;
45   std::vector<TreePredicateFn> PredsByName;
46 public:
47   
48   unsigned getIDFor(TreePredicateFn Pred) {
49     unsigned &Entry = ImmIDs[Pred.getOrigPatFragRecord()];
50     if (Entry == 0) {
51       PredsByName.push_back(Pred);
52       Entry = PredsByName.size();
53     }
54     return Entry-1;
55   }
56   
57   const TreePredicateFn &getPredicate(unsigned i) {
58     assert(i < PredsByName.size());
59     return PredsByName[i];
60   }
61   
62   typedef std::vector<TreePredicateFn>::const_iterator iterator;
63   iterator begin() const { return PredsByName.begin(); }
64   iterator end() const { return PredsByName.end(); }
65   
66 };
67
68 /// OperandsSignature - This class holds a description of a list of operand
69 /// types. It has utility methods for emitting text based on the operands.
70 ///
71 struct OperandsSignature {
72   class OpKind {
73     enum { OK_Reg, OK_FP, OK_Imm, OK_Invalid = -1 };
74     char Repr;
75   public:
76     
77     OpKind() : Repr(OK_Invalid) {}
78     
79     bool operator<(OpKind RHS) const { return Repr < RHS.Repr; }
80     bool operator==(OpKind RHS) const { return Repr == RHS.Repr; }
81
82     static OpKind getReg() { OpKind K; K.Repr = OK_Reg; return K; }
83     static OpKind getFP()  { OpKind K; K.Repr = OK_FP; return K; }
84     static OpKind getImm(unsigned V) {
85       assert((unsigned)OK_Imm+V < 128 &&
86              "Too many integer predicates for the 'Repr' char");
87       OpKind K; K.Repr = OK_Imm+V; return K;
88     }
89     
90     bool isReg() const { return Repr == OK_Reg; }
91     bool isFP() const  { return Repr == OK_FP; }
92     bool isImm() const { return Repr >= OK_Imm; }
93     
94     unsigned getImmCode() const { assert(isImm()); return Repr-OK_Imm; }
95     
96     void printManglingSuffix(raw_ostream &OS, ImmPredicateSet &ImmPredicates,
97                              bool StripImmCodes) const {
98       if (isReg())
99         OS << 'r';
100       else if (isFP())
101         OS << 'f';
102       else {
103         OS << 'i';
104         if (!StripImmCodes)
105           if (unsigned Code = getImmCode())
106             OS << "_" << ImmPredicates.getPredicate(Code-1).getFnName();
107       }
108     }
109   };
110   
111   
112   SmallVector<OpKind, 3> Operands;
113
114   bool operator<(const OperandsSignature &O) const {
115     return Operands < O.Operands;
116   }
117   bool operator==(const OperandsSignature &O) const {
118     return Operands == O.Operands;
119   }
120
121   bool empty() const { return Operands.empty(); }
122
123   bool hasAnyImmediateCodes() const {
124     for (unsigned i = 0, e = Operands.size(); i != e; ++i)
125       if (Operands[i].isImm() && Operands[i].getImmCode() != 0)
126         return true;
127     return false;
128   }
129   
130   /// getWithoutImmCodes - Return a copy of this with any immediate codes forced
131   /// to zero.
132   OperandsSignature getWithoutImmCodes() const {
133     OperandsSignature Result;
134     for (unsigned i = 0, e = Operands.size(); i != e; ++i)
135       if (!Operands[i].isImm())
136         Result.Operands.push_back(Operands[i]);
137       else
138         Result.Operands.push_back(OpKind::getImm(0));
139     return Result;
140   }
141   
142   void emitImmediatePredicate(raw_ostream &OS, ImmPredicateSet &ImmPredicates) {
143     bool EmittedAnything = false;
144     for (unsigned i = 0, e = Operands.size(); i != e; ++i) {
145       if (!Operands[i].isImm()) continue;
146       
147       unsigned Code = Operands[i].getImmCode();
148       if (Code == 0) continue;
149       
150       if (EmittedAnything)
151         OS << " &&\n        ";
152       
153       TreePredicateFn PredFn = ImmPredicates.getPredicate(Code-1);
154       
155       // Emit the type check.
156       OS << "VT == "
157          << getEnumName(PredFn.getOrigPatFragRecord()->getTree(0)->getType(0))
158          << " && ";
159       
160       
161       OS << PredFn.getFnName() << "(imm" << i <<')';
162       EmittedAnything = true;
163     }
164   }
165   
166   /// initialize - Examine the given pattern and initialize the contents
167   /// of the Operands array accordingly. Return true if all the operands
168   /// are supported, false otherwise.
169   ///
170   bool initialize(TreePatternNode *InstPatNode, const CodeGenTarget &Target,
171                   MVT::SimpleValueType VT,
172                   ImmPredicateSet &ImmediatePredicates) {
173     if (InstPatNode->isLeaf())
174       return false;
175     
176     if (InstPatNode->getOperator()->getName() == "imm") {
177       Operands.push_back(OpKind::getImm(0));
178       return true;
179     }
180     
181     if (InstPatNode->getOperator()->getName() == "fpimm") {
182       Operands.push_back(OpKind::getFP());
183       return true;
184     }
185
186     const CodeGenRegisterClass *DstRC = 0;
187
188     for (unsigned i = 0, e = InstPatNode->getNumChildren(); i != e; ++i) {
189       TreePatternNode *Op = InstPatNode->getChild(i);
190
191       // Handle imm operands specially.
192       if (!Op->isLeaf() && Op->getOperator()->getName() == "imm") {
193         unsigned PredNo = 0;
194         if (!Op->getPredicateFns().empty()) {
195           TreePredicateFn PredFn = Op->getPredicateFns()[0];
196           // If there is more than one predicate weighing in on this operand
197           // then we don't handle it.  This doesn't typically happen for
198           // immediates anyway.
199           if (Op->getPredicateFns().size() > 1 ||
200               !PredFn.isImmediatePattern())
201             return false;
202           // Ignore any instruction with 'FastIselShouldIgnore', these are
203           // not needed and just bloat the fast instruction selector.  For
204           // example, X86 doesn't need to generate code to match ADD16ri8 since
205           // ADD16ri will do just fine.
206           Record *Rec = PredFn.getOrigPatFragRecord()->getRecord();
207           if (Rec->getValueAsBit("FastIselShouldIgnore"))
208             return false;
209         
210           PredNo = ImmediatePredicates.getIDFor(PredFn)+1;
211         }
212         
213         // Handle unmatched immediate sizes here.
214         //if (Op->getType(0) != VT)
215         //  return false;
216         
217         Operands.push_back(OpKind::getImm(PredNo));
218         continue;
219       }
220
221       
222       // For now, filter out any operand with a predicate.
223       // For now, filter out any operand with multiple values.
224       if (!Op->getPredicateFns().empty() || Op->getNumTypes() != 1)
225         return false;
226
227       if (!Op->isLeaf()) {
228          if (Op->getOperator()->getName() == "fpimm") {
229           Operands.push_back(OpKind::getFP());
230           continue;
231         }
232         // For now, ignore other non-leaf nodes.
233         return false;
234       }
235       
236       assert(Op->hasTypeSet(0) && "Type infererence not done?");
237
238       // For now, all the operands must have the same type (if they aren't
239       // immediates).  Note that this causes us to reject variable sized shifts
240       // on X86.
241       if (Op->getType(0) != VT)
242         return false;
243
244       DefInit *OpDI = dynamic_cast<DefInit*>(Op->getLeafValue());
245       if (!OpDI)
246         return false;
247       Record *OpLeafRec = OpDI->getDef();
248       
249       // For now, the only other thing we accept is register operands.
250       const CodeGenRegisterClass *RC = 0;
251       if (OpLeafRec->isSubClassOf("RegisterClass"))
252         RC = &Target.getRegisterClass(OpLeafRec);
253       else if (OpLeafRec->isSubClassOf("Register"))
254         RC = Target.getRegBank().getRegClassForRegister(OpLeafRec);
255       else
256         return false;
257
258       // For now, this needs to be a register class of some sort.
259       if (!RC)
260         return false;
261
262       // For now, all the operands must have the same register class or be
263       // a strict subclass of the destination.
264       if (DstRC) {
265         if (DstRC != RC && !DstRC->hasSubClass(RC))
266           return false;
267       } else
268         DstRC = RC;
269       Operands.push_back(OpKind::getReg());
270     }
271     return true;
272   }
273
274   void PrintParameters(raw_ostream &OS) const {
275     for (unsigned i = 0, e = Operands.size(); i != e; ++i) {
276       if (Operands[i].isReg()) {
277         OS << "unsigned Op" << i << ", bool Op" << i << "IsKill";
278       } else if (Operands[i].isImm()) {
279         OS << "uint64_t imm" << i;
280       } else if (Operands[i].isFP()) {
281         OS << "ConstantFP *f" << i;
282       } else {
283         llvm_unreachable("Unknown operand kind!");
284       }
285       if (i + 1 != e)
286         OS << ", ";
287     }
288   }
289
290   void PrintArguments(raw_ostream &OS,
291                       const std::vector<std::string> &PR) const {
292     assert(PR.size() == Operands.size());
293     bool PrintedArg = false;
294     for (unsigned i = 0, e = Operands.size(); i != e; ++i) {
295       if (PR[i] != "")
296         // Implicit physical register operand.
297         continue;
298
299       if (PrintedArg)
300         OS << ", ";
301       if (Operands[i].isReg()) {
302         OS << "Op" << i << ", Op" << i << "IsKill";
303         PrintedArg = true;
304       } else if (Operands[i].isImm()) {
305         OS << "imm" << i;
306         PrintedArg = true;
307       } else if (Operands[i].isFP()) {
308         OS << "f" << i;
309         PrintedArg = true;
310       } else {
311         llvm_unreachable("Unknown operand kind!");
312       }
313     }
314   }
315
316   void PrintArguments(raw_ostream &OS) const {
317     for (unsigned i = 0, e = Operands.size(); i != e; ++i) {
318       if (Operands[i].isReg()) {
319         OS << "Op" << i << ", Op" << i << "IsKill";
320       } else if (Operands[i].isImm()) {
321         OS << "imm" << i;
322       } else if (Operands[i].isFP()) {
323         OS << "f" << i;
324       } else {
325         llvm_unreachable("Unknown operand kind!");
326       }
327       if (i + 1 != e)
328         OS << ", ";
329     }
330   }
331
332
333   void PrintManglingSuffix(raw_ostream &OS, const std::vector<std::string> &PR,
334                            ImmPredicateSet &ImmPredicates,
335                            bool StripImmCodes = false) const {
336     for (unsigned i = 0, e = Operands.size(); i != e; ++i) {
337       if (PR[i] != "")
338         // Implicit physical register operand. e.g. Instruction::Mul expect to
339         // select to a binary op. On x86, mul may take a single operand with
340         // the other operand being implicit. We must emit something that looks
341         // like a binary instruction except for the very inner FastEmitInst_*
342         // call.
343         continue;
344       Operands[i].printManglingSuffix(OS, ImmPredicates, StripImmCodes);
345     }
346   }
347
348   void PrintManglingSuffix(raw_ostream &OS, ImmPredicateSet &ImmPredicates,
349                            bool StripImmCodes = false) const {
350     for (unsigned i = 0, e = Operands.size(); i != e; ++i)
351       Operands[i].printManglingSuffix(OS, ImmPredicates, StripImmCodes);
352   }
353 };
354
355 class FastISelMap {
356   typedef std::map<std::string, InstructionMemo> PredMap;
357   typedef std::map<MVT::SimpleValueType, PredMap> RetPredMap;
358   typedef std::map<MVT::SimpleValueType, RetPredMap> TypeRetPredMap;
359   typedef std::map<std::string, TypeRetPredMap> OpcodeTypeRetPredMap;
360   typedef std::map<OperandsSignature, OpcodeTypeRetPredMap>
361             OperandsOpcodeTypeRetPredMap;
362
363   OperandsOpcodeTypeRetPredMap SimplePatterns;
364
365   std::map<OperandsSignature, std::vector<OperandsSignature> >
366     SignaturesWithConstantForms;
367   
368   std::string InstNS;
369   ImmPredicateSet ImmediatePredicates;
370 public:
371   explicit FastISelMap(std::string InstNS);
372
373   void collectPatterns(CodeGenDAGPatterns &CGP);
374   void printImmediatePredicates(raw_ostream &OS);
375   void printFunctionDefinitions(raw_ostream &OS);
376 };
377
378 }
379
380 static std::string getOpcodeName(Record *Op, CodeGenDAGPatterns &CGP) {
381   return CGP.getSDNodeInfo(Op).getEnumName();
382 }
383
384 static std::string getLegalCName(std::string OpName) {
385   std::string::size_type pos = OpName.find("::");
386   if (pos != std::string::npos)
387     OpName.replace(pos, 2, "_");
388   return OpName;
389 }
390
391 FastISelMap::FastISelMap(std::string instns)
392   : InstNS(instns) {
393 }
394
395 static std::string PhyRegForNode(TreePatternNode *Op,
396                                  const CodeGenTarget &Target) {
397   std::string PhysReg;
398
399   if (!Op->isLeaf())
400     return PhysReg;
401
402   DefInit *OpDI = dynamic_cast<DefInit*>(Op->getLeafValue());
403   Record *OpLeafRec = OpDI->getDef();
404   if (!OpLeafRec->isSubClassOf("Register"))
405     return PhysReg;
406
407   PhysReg += static_cast<StringInit*>(OpLeafRec->getValue( \
408              "Namespace")->getValue())->getValue();
409   PhysReg += "::";
410   PhysReg += Target.getRegBank().getReg(OpLeafRec)->getName();
411   return PhysReg;
412 }
413
414 void FastISelMap::collectPatterns(CodeGenDAGPatterns &CGP) {
415   const CodeGenTarget &Target = CGP.getTargetInfo();
416
417   // Determine the target's namespace name.
418   InstNS = Target.getInstNamespace() + "::";
419   assert(InstNS.size() > 2 && "Can't determine target-specific namespace!");
420
421   // Scan through all the patterns and record the simple ones.
422   for (CodeGenDAGPatterns::ptm_iterator I = CGP.ptm_begin(),
423        E = CGP.ptm_end(); I != E; ++I) {
424     const PatternToMatch &Pattern = *I;
425
426     // For now, just look at Instructions, so that we don't have to worry
427     // about emitting multiple instructions for a pattern.
428     TreePatternNode *Dst = Pattern.getDstPattern();
429     if (Dst->isLeaf()) continue;
430     Record *Op = Dst->getOperator();
431     if (!Op->isSubClassOf("Instruction"))
432       continue;
433     CodeGenInstruction &II = CGP.getTargetInfo().getInstruction(Op);
434     if (II.Operands.empty())
435       continue;
436
437     // For now, ignore multi-instruction patterns.
438     bool MultiInsts = false;
439     for (unsigned i = 0, e = Dst->getNumChildren(); i != e; ++i) {
440       TreePatternNode *ChildOp = Dst->getChild(i);
441       if (ChildOp->isLeaf())
442         continue;
443       if (ChildOp->getOperator()->isSubClassOf("Instruction")) {
444         MultiInsts = true;
445         break;
446       }
447     }
448     if (MultiInsts)
449       continue;
450
451     // For now, ignore instructions where the first operand is not an
452     // output register.
453     const CodeGenRegisterClass *DstRC = 0;
454     std::string SubRegNo;
455     if (Op->getName() != "EXTRACT_SUBREG") {
456       Record *Op0Rec = II.Operands[0].Rec;
457       if (!Op0Rec->isSubClassOf("RegisterClass"))
458         continue;
459       DstRC = &Target.getRegisterClass(Op0Rec);
460       if (!DstRC)
461         continue;
462     } else {
463       // If this isn't a leaf, then continue since the register classes are
464       // a bit too complicated for now.
465       if (!Dst->getChild(1)->isLeaf()) continue;
466
467       DefInit *SR = dynamic_cast<DefInit*>(Dst->getChild(1)->getLeafValue());
468       if (SR)
469         SubRegNo = getQualifiedName(SR->getDef());
470       else
471         SubRegNo = Dst->getChild(1)->getLeafValue()->getAsString();
472     }
473
474     // Inspect the pattern.
475     TreePatternNode *InstPatNode = Pattern.getSrcPattern();
476     if (!InstPatNode) continue;
477     if (InstPatNode->isLeaf()) continue;
478
479     // Ignore multiple result nodes for now.
480     if (InstPatNode->getNumTypes() > 1) continue;
481
482     Record *InstPatOp = InstPatNode->getOperator();
483     std::string OpcodeName = getOpcodeName(InstPatOp, CGP);
484     MVT::SimpleValueType RetVT = MVT::isVoid;
485     if (InstPatNode->getNumTypes()) RetVT = InstPatNode->getType(0);
486     MVT::SimpleValueType VT = RetVT;
487     if (InstPatNode->getNumChildren()) {
488       assert(InstPatNode->getChild(0)->getNumTypes() == 1);
489       VT = InstPatNode->getChild(0)->getType(0);
490     }
491
492     // For now, filter out any instructions with predicates.
493     if (!InstPatNode->getPredicateFns().empty())
494       continue;
495
496     // Check all the operands.
497     OperandsSignature Operands;
498     if (!Operands.initialize(InstPatNode, Target, VT, ImmediatePredicates))
499       continue;
500
501     std::vector<std::string>* PhysRegInputs = new std::vector<std::string>();
502     if (InstPatNode->getOperator()->getName() == "imm" ||
503         InstPatNode->getOperator()->getName() == "fpimmm")
504       PhysRegInputs->push_back("");
505     else {
506       // Compute the PhysRegs used by the given pattern, and check that
507       // the mapping from the src to dst patterns is simple.
508       bool FoundNonSimplePattern = false;
509       unsigned DstIndex = 0;
510       for (unsigned i = 0, e = InstPatNode->getNumChildren(); i != e; ++i) {
511         std::string PhysReg = PhyRegForNode(InstPatNode->getChild(i), Target);
512         if (PhysReg.empty()) {
513           if (DstIndex >= Dst->getNumChildren() ||
514               Dst->getChild(DstIndex)->getName() !=
515               InstPatNode->getChild(i)->getName()) {
516             FoundNonSimplePattern = true;
517             break;
518           }
519           ++DstIndex;
520         }
521
522         PhysRegInputs->push_back(PhysReg);
523       }
524
525       if (Op->getName() != "EXTRACT_SUBREG" && DstIndex < Dst->getNumChildren())
526         FoundNonSimplePattern = true;
527
528       if (FoundNonSimplePattern)
529         continue;
530     }
531
532     // Get the predicate that guards this pattern.
533     std::string PredicateCheck = Pattern.getPredicateCheck();
534
535     // Ok, we found a pattern that we can handle. Remember it.
536     InstructionMemo Memo = {
537       Pattern.getDstPattern()->getOperator()->getName(),
538       DstRC,
539       SubRegNo,
540       PhysRegInputs
541     };
542     
543     if (SimplePatterns[Operands][OpcodeName][VT][RetVT].count(PredicateCheck))
544       throw TGError(Pattern.getSrcRecord()->getLoc(),
545                     "Duplicate record in FastISel table!");
546
547     SimplePatterns[Operands][OpcodeName][VT][RetVT][PredicateCheck] = Memo;
548     
549     // If any of the operands were immediates with predicates on them, strip
550     // them down to a signature that doesn't have predicates so that we can
551     // associate them with the stripped predicate version.
552     if (Operands.hasAnyImmediateCodes()) {
553       SignaturesWithConstantForms[Operands.getWithoutImmCodes()]
554         .push_back(Operands);
555     }
556   }
557 }
558
559 void FastISelMap::printImmediatePredicates(raw_ostream &OS) {
560   if (ImmediatePredicates.begin() == ImmediatePredicates.end())
561     return;
562   
563   OS << "\n// FastEmit Immediate Predicate functions.\n";
564   for (ImmPredicateSet::iterator I = ImmediatePredicates.begin(),
565        E = ImmediatePredicates.end(); I != E; ++I) {
566     OS << "static bool " << I->getFnName() << "(int64_t Imm) {\n";
567     OS << I->getImmediatePredicateCode() << "\n}\n";
568   }
569   
570   OS << "\n\n";
571 }
572
573
574 void FastISelMap::printFunctionDefinitions(raw_ostream &OS) {
575   // Now emit code for all the patterns that we collected.
576   for (OperandsOpcodeTypeRetPredMap::const_iterator OI = SimplePatterns.begin(),
577        OE = SimplePatterns.end(); OI != OE; ++OI) {
578     const OperandsSignature &Operands = OI->first;
579     const OpcodeTypeRetPredMap &OTM = OI->second;
580
581     for (OpcodeTypeRetPredMap::const_iterator I = OTM.begin(), E = OTM.end();
582          I != E; ++I) {
583       const std::string &Opcode = I->first;
584       const TypeRetPredMap &TM = I->second;
585
586       OS << "// FastEmit functions for " << Opcode << ".\n";
587       OS << "\n";
588
589       // Emit one function for each opcode,type pair.
590       for (TypeRetPredMap::const_iterator TI = TM.begin(), TE = TM.end();
591            TI != TE; ++TI) {
592         MVT::SimpleValueType VT = TI->first;
593         const RetPredMap &RM = TI->second;
594         if (RM.size() != 1) {
595           for (RetPredMap::const_iterator RI = RM.begin(), RE = RM.end();
596                RI != RE; ++RI) {
597             MVT::SimpleValueType RetVT = RI->first;
598             const PredMap &PM = RI->second;
599             bool HasPred = false;
600
601             OS << "unsigned FastEmit_"
602                << getLegalCName(Opcode)
603                << "_" << getLegalCName(getName(VT))
604                << "_" << getLegalCName(getName(RetVT)) << "_";
605             Operands.PrintManglingSuffix(OS, ImmediatePredicates);
606             OS << "(";
607             Operands.PrintParameters(OS);
608             OS << ") {\n";
609
610             // Emit code for each possible instruction. There may be
611             // multiple if there are subtarget concerns.
612             for (PredMap::const_iterator PI = PM.begin(), PE = PM.end();
613                  PI != PE; ++PI) {
614               std::string PredicateCheck = PI->first;
615               const InstructionMemo &Memo = PI->second;
616
617               if (PredicateCheck.empty()) {
618                 assert(!HasPred &&
619                        "Multiple instructions match, at least one has "
620                        "a predicate and at least one doesn't!");
621               } else {
622                 OS << "  if (" + PredicateCheck + ") {\n";
623                 OS << "  ";
624                 HasPred = true;
625               }
626
627               for (unsigned i = 0; i < Memo.PhysRegs->size(); ++i) {
628                 if ((*Memo.PhysRegs)[i] != "")
629                   OS << "  BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, "
630                      << "TII.get(TargetOpcode::COPY), "
631                      << (*Memo.PhysRegs)[i] << ").addReg(Op" << i << ");\n";
632               }
633
634               OS << "  return FastEmitInst_";
635               if (Memo.SubRegNo.empty()) {
636                 Operands.PrintManglingSuffix(OS, *Memo.PhysRegs,
637                                              ImmediatePredicates, true);
638                 OS << "(" << InstNS << Memo.Name << ", ";
639                 OS << InstNS << Memo.RC->getName() << "RegisterClass";
640                 if (!Operands.empty())
641                   OS << ", ";
642                 Operands.PrintArguments(OS, *Memo.PhysRegs);
643                 OS << ");\n";
644               } else {
645                 OS << "extractsubreg(" << getName(RetVT);
646                 OS << ", Op0, Op0IsKill, " << Memo.SubRegNo << ");\n";
647               }
648
649               if (HasPred)
650                 OS << "  }\n";
651
652             }
653             // Return 0 if none of the predicates were satisfied.
654             if (HasPred)
655               OS << "  return 0;\n";
656             OS << "}\n";
657             OS << "\n";
658           }
659
660           // Emit one function for the type that demultiplexes on return type.
661           OS << "unsigned FastEmit_"
662              << getLegalCName(Opcode) << "_"
663              << getLegalCName(getName(VT)) << "_";
664           Operands.PrintManglingSuffix(OS, ImmediatePredicates);
665           OS << "(MVT RetVT";
666           if (!Operands.empty())
667             OS << ", ";
668           Operands.PrintParameters(OS);
669           OS << ") {\nswitch (RetVT.SimpleTy) {\n";
670           for (RetPredMap::const_iterator RI = RM.begin(), RE = RM.end();
671                RI != RE; ++RI) {
672             MVT::SimpleValueType RetVT = RI->first;
673             OS << "  case " << getName(RetVT) << ": return FastEmit_"
674                << getLegalCName(Opcode) << "_" << getLegalCName(getName(VT))
675                << "_" << getLegalCName(getName(RetVT)) << "_";
676             Operands.PrintManglingSuffix(OS, ImmediatePredicates);
677             OS << "(";
678             Operands.PrintArguments(OS);
679             OS << ");\n";
680           }
681           OS << "  default: return 0;\n}\n}\n\n";
682
683         } else {
684           // Non-variadic return type.
685           OS << "unsigned FastEmit_"
686              << getLegalCName(Opcode) << "_"
687              << getLegalCName(getName(VT)) << "_";
688           Operands.PrintManglingSuffix(OS, ImmediatePredicates);
689           OS << "(MVT RetVT";
690           if (!Operands.empty())
691             OS << ", ";
692           Operands.PrintParameters(OS);
693           OS << ") {\n";
694
695           OS << "  if (RetVT.SimpleTy != " << getName(RM.begin()->first)
696              << ")\n    return 0;\n";
697
698           const PredMap &PM = RM.begin()->second;
699           bool HasPred = false;
700
701           // Emit code for each possible instruction. There may be
702           // multiple if there are subtarget concerns.
703           for (PredMap::const_iterator PI = PM.begin(), PE = PM.end(); PI != PE;
704                ++PI) {
705             std::string PredicateCheck = PI->first;
706             const InstructionMemo &Memo = PI->second;
707
708             if (PredicateCheck.empty()) {
709               assert(!HasPred &&
710                      "Multiple instructions match, at least one has "
711                      "a predicate and at least one doesn't!");
712             } else {
713               OS << "  if (" + PredicateCheck + ") {\n";
714               OS << "  ";
715               HasPred = true;
716             }
717
718             for (unsigned i = 0; i < Memo.PhysRegs->size(); ++i) {
719               if ((*Memo.PhysRegs)[i] != "")
720                 OS << "  BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, "
721                    << "TII.get(TargetOpcode::COPY), "
722                    << (*Memo.PhysRegs)[i] << ").addReg(Op" << i << ");\n";
723             }
724
725             OS << "  return FastEmitInst_";
726
727             if (Memo.SubRegNo.empty()) {
728               Operands.PrintManglingSuffix(OS, *Memo.PhysRegs,
729                                            ImmediatePredicates, true);
730               OS << "(" << InstNS << Memo.Name << ", ";
731               OS << InstNS << Memo.RC->getName() << "RegisterClass";
732               if (!Operands.empty())
733                 OS << ", ";
734               Operands.PrintArguments(OS, *Memo.PhysRegs);
735               OS << ");\n";
736             } else {
737               OS << "extractsubreg(RetVT, Op0, Op0IsKill, ";
738               OS << Memo.SubRegNo;
739               OS << ");\n";
740             }
741
742              if (HasPred)
743                OS << "  }\n";
744           }
745
746           // Return 0 if none of the predicates were satisfied.
747           if (HasPred)
748             OS << "  return 0;\n";
749           OS << "}\n";
750           OS << "\n";
751         }
752       }
753
754       // Emit one function for the opcode that demultiplexes based on the type.
755       OS << "unsigned FastEmit_"
756          << getLegalCName(Opcode) << "_";
757       Operands.PrintManglingSuffix(OS, ImmediatePredicates);
758       OS << "(MVT VT, MVT RetVT";
759       if (!Operands.empty())
760         OS << ", ";
761       Operands.PrintParameters(OS);
762       OS << ") {\n";
763       OS << "  switch (VT.SimpleTy) {\n";
764       for (TypeRetPredMap::const_iterator TI = TM.begin(), TE = TM.end();
765            TI != TE; ++TI) {
766         MVT::SimpleValueType VT = TI->first;
767         std::string TypeName = getName(VT);
768         OS << "  case " << TypeName << ": return FastEmit_"
769            << getLegalCName(Opcode) << "_" << getLegalCName(TypeName) << "_";
770         Operands.PrintManglingSuffix(OS, ImmediatePredicates);
771         OS << "(RetVT";
772         if (!Operands.empty())
773           OS << ", ";
774         Operands.PrintArguments(OS);
775         OS << ");\n";
776       }
777       OS << "  default: return 0;\n";
778       OS << "  }\n";
779       OS << "}\n";
780       OS << "\n";
781     }
782
783     OS << "// Top-level FastEmit function.\n";
784     OS << "\n";
785
786     // Emit one function for the operand signature that demultiplexes based
787     // on opcode and type.
788     OS << "unsigned FastEmit_";
789     Operands.PrintManglingSuffix(OS, ImmediatePredicates);
790     OS << "(MVT VT, MVT RetVT, unsigned Opcode";
791     if (!Operands.empty())
792       OS << ", ";
793     Operands.PrintParameters(OS);
794     OS << ") {\n";
795     
796     // If there are any forms of this signature available that operand on
797     // constrained forms of the immediate (e.g. 32-bit sext immediate in a
798     // 64-bit operand), check them first.
799     
800     std::map<OperandsSignature, std::vector<OperandsSignature> >::iterator MI
801       = SignaturesWithConstantForms.find(Operands);
802     if (MI != SignaturesWithConstantForms.end()) {
803       // Unique any duplicates out of the list.
804       std::sort(MI->second.begin(), MI->second.end());
805       MI->second.erase(std::unique(MI->second.begin(), MI->second.end()),
806                        MI->second.end());
807       
808       // Check each in order it was seen.  It would be nice to have a good
809       // relative ordering between them, but we're not going for optimality
810       // here.
811       for (unsigned i = 0, e = MI->second.size(); i != e; ++i) {
812         OS << "  if (";
813         MI->second[i].emitImmediatePredicate(OS, ImmediatePredicates);
814         OS << ")\n    if (unsigned Reg = FastEmit_";
815         MI->second[i].PrintManglingSuffix(OS, ImmediatePredicates);
816         OS << "(VT, RetVT, Opcode";
817         if (!MI->second[i].empty())
818           OS << ", ";
819         MI->second[i].PrintArguments(OS);
820         OS << "))\n      return Reg;\n\n";
821       }
822       
823       // Done with this, remove it.
824       SignaturesWithConstantForms.erase(MI);
825     }
826     
827     OS << "  switch (Opcode) {\n";
828     for (OpcodeTypeRetPredMap::const_iterator I = OTM.begin(), E = OTM.end();
829          I != E; ++I) {
830       const std::string &Opcode = I->first;
831
832       OS << "  case " << Opcode << ": return FastEmit_"
833          << getLegalCName(Opcode) << "_";
834       Operands.PrintManglingSuffix(OS, ImmediatePredicates);
835       OS << "(VT, RetVT";
836       if (!Operands.empty())
837         OS << ", ";
838       Operands.PrintArguments(OS);
839       OS << ");\n";
840     }
841     OS << "  default: return 0;\n";
842     OS << "  }\n";
843     OS << "}\n";
844     OS << "\n";
845   }
846   
847   // TODO: SignaturesWithConstantForms should be empty here.
848 }
849
850 void FastISelEmitter::run(raw_ostream &OS) {
851   const CodeGenTarget &Target = CGP.getTargetInfo();
852
853   // Determine the target's namespace name.
854   std::string InstNS = Target.getInstNamespace() + "::";
855   assert(InstNS.size() > 2 && "Can't determine target-specific namespace!");
856
857   EmitSourceFileHeader("\"Fast\" Instruction Selector for the " +
858                        Target.getName() + " target", OS);
859
860   FastISelMap F(InstNS);
861   F.collectPatterns(CGP);
862   F.printImmediatePredicates(OS);
863   F.printFunctionDefinitions(OS);
864 }
865
866 FastISelEmitter::FastISelEmitter(RecordKeeper &R)
867   : Records(R), CGP(R) {
868 }
869