//===- PseudoLoweringEmitter.h - PseudoLowering Generator -------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef PSEUDOLOWERINGEMITTER_H #define PSEUDOLOWERINGEMITTER_H #include "CodeGenInstruction.h" #include "CodeGenTarget.h" #include "llvm/TableGen/TableGenBackend.h" #include "llvm/ADT/IndexedMap.h" #include "llvm/ADT/SmallVector.h" namespace llvm { class PseudoLoweringEmitter : public TableGenBackend { struct OpData { enum MapKind { Operand, Imm, Reg }; MapKind Kind; union { unsigned Operand; // Operand number mapped to. uint64_t Imm; // Integer immedate value. Record *Reg; // Physical register. } Data; }; struct PseudoExpansion { CodeGenInstruction Source; // The source pseudo instruction definition. CodeGenInstruction Dest; // The destination instruction to lower to. IndexedMap<OpData> OperandMap; PseudoExpansion(CodeGenInstruction &s, CodeGenInstruction &d, IndexedMap<OpData> &m) : Source(s), Dest(d), OperandMap(m) {} }; RecordKeeper &Records; // It's overkill to have an instance of the full CodeGenTarget object, // but it loads everything on demand, not in the constructor, so it's // lightweight in performance, so it works out OK. CodeGenTarget Target; SmallVector<PseudoExpansion, 64> Expansions; unsigned addDagOperandMapping(Record *Rec, DagInit *Dag, CodeGenInstruction &Insn, IndexedMap<OpData> &OperandMap, unsigned BaseIdx); void evaluateExpansion(Record *Pseudo); void emitLoweringEmitter(raw_ostream &o); public: PseudoLoweringEmitter(RecordKeeper &R) : Records(R), Target(R) {} /// run - Output the pseudo-lowerings. void run(raw_ostream &o); }; } // end llvm namespace #endif