File: MipsInstPrinter.h

package info (click to toggle)
llvm-toolchain-17 1%3A17.0.6-22
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,799,624 kB
  • sloc: cpp: 6,428,607; ansic: 1,383,196; asm: 793,408; python: 223,504; objc: 75,364; f90: 60,502; lisp: 33,869; pascal: 15,282; sh: 9,684; perl: 7,453; ml: 4,937; awk: 3,523; makefile: 2,889; javascript: 2,149; xml: 888; fortran: 619; cs: 573
file content (130 lines) | stat: -rw-r--r-- 4,512 bytes parent folder | download | duplicates (13)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
//=== MipsInstPrinter.h - Convert Mips MCInst to assembly syntax -*- C++ -*-==//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This class prints a Mips MCInst to a .s file.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSINSTPRINTER_H
#define LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSINSTPRINTER_H
#include "llvm/MC/MCInstPrinter.h"

namespace llvm {
// These enumeration declarations were originally in MipsInstrInfo.h but
// had to be moved here to avoid circular dependencies between
// LLVMMipsCodeGen and LLVMMipsAsmPrinter.
namespace Mips {
// Mips Branch Codes
enum FPBranchCode {
  BRANCH_F,
  BRANCH_T,
  BRANCH_FL,
  BRANCH_TL,
  BRANCH_INVALID
};

// Mips Condition Codes
enum CondCode {
  // To be used with float branch True
  FCOND_F,
  FCOND_UN,
  FCOND_OEQ,
  FCOND_UEQ,
  FCOND_OLT,
  FCOND_ULT,
  FCOND_OLE,
  FCOND_ULE,
  FCOND_SF,
  FCOND_NGLE,
  FCOND_SEQ,
  FCOND_NGL,
  FCOND_LT,
  FCOND_NGE,
  FCOND_LE,
  FCOND_NGT,

  // To be used with float branch False
  // This conditions have the same mnemonic as the
  // above ones, but are used with a branch False;
  FCOND_T,
  FCOND_OR,
  FCOND_UNE,
  FCOND_ONE,
  FCOND_UGE,
  FCOND_OGE,
  FCOND_UGT,
  FCOND_OGT,
  FCOND_ST,
  FCOND_GLE,
  FCOND_SNE,
  FCOND_GL,
  FCOND_NLT,
  FCOND_GE,
  FCOND_NLE,
  FCOND_GT
};

const char *MipsFCCToString(Mips::CondCode CC);
} // end namespace Mips

class MipsInstPrinter : public MCInstPrinter {
public:
  MipsInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
                  const MCRegisterInfo &MRI)
    : MCInstPrinter(MAI, MII, MRI) {}

  // Autogenerated by tblgen.
  std::pair<const char *, uint64_t> getMnemonic(const MCInst *MI) override;
  void printInstruction(const MCInst *MI, uint64_t Address,
                        const MCSubtargetInfo &STI, raw_ostream &O);
  static const char *getRegisterName(MCRegister Reg);

  void printRegName(raw_ostream &OS, MCRegister Reg) const override;
  void printInst(const MCInst *MI, uint64_t Address, StringRef Annot,
                 const MCSubtargetInfo &STI, raw_ostream &O) override;

  bool printAliasInstr(const MCInst *MI, uint64_t Address,
                       const MCSubtargetInfo &STI, raw_ostream &OS);
  void printCustomAliasOperand(const MCInst *MI, uint64_t Address,
                               unsigned OpIdx, unsigned PrintMethodIdx,
                               const MCSubtargetInfo &STI, raw_ostream &O);

private:
  void printOperand(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
                    raw_ostream &O);
  void printJumpOperand(const MCInst *MI, unsigned OpNo,
                        const MCSubtargetInfo &STI, raw_ostream &O);
  void printBranchOperand(const MCInst *MI, uint64_t Address, unsigned OpNo,
                          const MCSubtargetInfo &STI, raw_ostream &O);
  template <unsigned Bits, unsigned Offset = 0>
  void printUImm(const MCInst *MI, int opNum, const MCSubtargetInfo &STI,
                 raw_ostream &O);
  void printMemOperand(const MCInst *MI, int opNum, const MCSubtargetInfo &STI,
                       raw_ostream &O);
  void printMemOperandEA(const MCInst *MI, int opNum,
                         const MCSubtargetInfo &STI, raw_ostream &O);
  void printFCCOperand(const MCInst *MI, int opNum, const MCSubtargetInfo &STI,
                       raw_ostream &O);
  void printSHFMask(const MCInst *MI, int opNum, raw_ostream &O);

  bool printAlias(const char *Str, const MCInst &MI, uint64_t Address,
                  unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &OS,
                  bool IsBranch = false);
  bool printAlias(const char *Str, const MCInst &MI, uint64_t Address,
                  unsigned OpNo0, unsigned OpNo1, const MCSubtargetInfo &STI,
                  raw_ostream &OS, bool IsBranch = false);
  bool printAlias(const MCInst &MI, uint64_t Address,
                  const MCSubtargetInfo &STI, raw_ostream &OS);
  void printSaveRestore(const MCInst *MI, const MCSubtargetInfo &STI,
                        raw_ostream &O);
  void printRegisterList(const MCInst *MI, int opNum,
                         const MCSubtargetInfo &STI, raw_ostream &O);
};
} // end namespace llvm

#endif