| //===- 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 |