1 //===- PseudoLoweringEmitter.h - PseudoLowering Generator -------*- C++ -*-===// 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 #ifndef PSEUDOLOWERINGEMITTER_H 11 #define PSEUDOLOWERINGEMITTER_H 12 13 #include "CodeGenInstruction.h" 14 #include "CodeGenTarget.h" 15 #include "llvm/TableGen/TableGenBackend.h" 16 #include "llvm/ADT/IndexedMap.h" 17 #include "llvm/ADT/SmallVector.h" 18 19 namespace llvm { 20 21 class PseudoLoweringEmitter : public TableGenBackend { 22 struct OpData { 23 enum MapKind { Operand, Imm, Reg }; 24 MapKind Kind; 25 union { 26 unsigned Operand; // Operand number mapped to. 27 uint64_t Imm; // Integer immedate value. 28 Record *Reg; // Physical register. 29 } Data; 30 }; 31 struct PseudoExpansion { 32 CodeGenInstruction Source; // The source pseudo instruction definition. 33 CodeGenInstruction Dest; // The destination instruction to lower to. 34 IndexedMap<OpData> OperandMap; 35 PseudoExpansionPseudoExpansion36 PseudoExpansion(CodeGenInstruction &s, CodeGenInstruction &d, 37 IndexedMap<OpData> &m) : 38 Source(s), Dest(d), OperandMap(m) {} 39 }; 40 41 RecordKeeper &Records; 42 43 // It's overkill to have an instance of the full CodeGenTarget object, 44 // but it loads everything on demand, not in the constructor, so it's 45 // lightweight in performance, so it works out OK. 46 CodeGenTarget Target; 47 48 SmallVector<PseudoExpansion, 64> Expansions; 49 50 unsigned addDagOperandMapping(Record *Rec, DagInit *Dag, 51 CodeGenInstruction &Insn, 52 IndexedMap<OpData> &OperandMap, 53 unsigned BaseIdx); 54 void evaluateExpansion(Record *Pseudo); 55 void emitLoweringEmitter(raw_ostream &o); 56 public: PseudoLoweringEmitter(RecordKeeper & R)57 PseudoLoweringEmitter(RecordKeeper &R) : Records(R), Target(R) {} 58 59 /// run - Output the pseudo-lowerings. 60 void run(raw_ostream &o); 61 }; 62 63 } // end llvm namespace 64 65 #endif 66