1//===------------ FixedLenDecoderEmitter.h - Decoder 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// It contains the tablegen backend that emits the decoder functions for
11// targets with fixed length instruction set.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef FixedLenDECODEREMITTER_H
16#define FixedLenDECODEREMITTER_H
17
18#include "CodeGenTarget.h"
19
20#include "llvm/TableGen/TableGenBackend.h"
21#include "llvm/Support/DataTypes.h"
22
23namespace llvm {
24
25struct EncodingField {
26  unsigned Base, Width, Offset;
27  EncodingField(unsigned B, unsigned W, unsigned O)
28    : Base(B), Width(W), Offset(O) { }
29};
30
31struct OperandInfo {
32  std::vector<EncodingField> Fields;
33  std::string Decoder;
34
35  OperandInfo(std::string D)
36    : Decoder(D) { }
37
38  void addField(unsigned Base, unsigned Width, unsigned Offset) {
39    Fields.push_back(EncodingField(Base, Width, Offset));
40  }
41
42  unsigned numFields() { return Fields.size(); }
43
44  typedef std::vector<EncodingField>::iterator iterator;
45
46  iterator begin() { return Fields.begin(); }
47  iterator end()   { return Fields.end();   }
48};
49
50class FixedLenDecoderEmitter : public TableGenBackend {
51public:
52  FixedLenDecoderEmitter(RecordKeeper &R,
53                         std::string PredicateNamespace,
54                         std::string GPrefix  = "if (",
55                         std::string GPostfix = " == MCDisassembler::Fail) return MCDisassembler::Fail;",
56                         std::string ROK      = "MCDisassembler::Success",
57                         std::string RFail    = "MCDisassembler::Fail",
58                         std::string L        = "") :
59    Records(R), Target(R),
60    NumberedInstructions(Target.getInstructionsByEnumValue()),
61    PredicateNamespace(PredicateNamespace),
62    GuardPrefix(GPrefix), GuardPostfix(GPostfix),
63    ReturnOK(ROK), ReturnFail(RFail), Locals(L) {}
64
65  // run - Output the code emitter
66  void run(raw_ostream &o);
67
68private:
69  RecordKeeper &Records;
70  CodeGenTarget Target;
71  std::vector<const CodeGenInstruction*> NumberedInstructions;
72  std::vector<unsigned> Opcodes;
73  std::map<unsigned, std::vector<OperandInfo> > Operands;
74public:
75  std::string PredicateNamespace;
76  std::string GuardPrefix, GuardPostfix;
77  std::string ReturnOK, ReturnFail;
78  std::string Locals;
79};
80
81} // end llvm namespace
82
83#endif
84