blob: f179e017278e90c57a8431f0009e7429314f4353 [file] [log] [blame]
Jia Liub22310f2012-02-18 12:03:15 +00001//===- ARMInstPrinter.h - Convert ARM MCInst to assembly syntax -*- C++ -*-===//
Chris Lattnera2907782009-10-19 19:56:26 +00002//
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// This class prints an ARM MCInst to a .s file.
11//
12//===----------------------------------------------------------------------===//
13
Benjamin Kramera7c40ef2014-08-13 16:26:38 +000014#ifndef LLVM_LIB_TARGET_ARM_INSTPRINTER_ARMINSTPRINTER_H
15#define LLVM_LIB_TARGET_ARM_INSTPRINTER_ARMINSTPRINTER_H
Chris Lattnera2907782009-10-19 19:56:26 +000016
17#include "llvm/MC/MCInstPrinter.h"
James Molloy4c493e82011-09-07 17:24:38 +000018#include "llvm/MC/MCSubtargetInfo.h"
Chris Lattnera2907782009-10-19 19:56:26 +000019
20namespace llvm {
Bill Wendling00f0cdd2011-03-21 04:13:46 +000021
22class MCOperand;
Jim Grosbach4e51d0b2010-09-17 21:25:10 +000023
Chris Lattnera2907782009-10-19 19:56:26 +000024class ARMInstPrinter : public MCInstPrinter {
25public:
Craig Topper54bfde72012-04-02 06:09:36 +000026 ARMInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
27 const MCRegisterInfo &MRI, const MCSubtargetInfo &STI);
Chris Lattnera2907782009-10-19 19:56:26 +000028
Craig Topper6bc27bf2014-03-10 02:09:33 +000029 void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot) override;
30 void printRegName(raw_ostream &OS, unsigned RegNo) const override;
Chris Lattnerf20f7982010-10-28 21:37:33 +000031
Chris Lattnera2907782009-10-19 19:56:26 +000032 // Autogenerated by tblgen.
Chris Lattner76c564b2010-04-04 04:47:45 +000033 void printInstruction(const MCInst *MI, raw_ostream &O);
Chris Lattnera2907782009-10-19 19:56:26 +000034 static const char *getRegisterName(unsigned RegNo);
35
36
Jim Grosbache7f7de92010-11-03 01:11:15 +000037 void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
Jim Grosbach4e51d0b2010-09-17 21:25:10 +000038
Owen Anderson04912702011-07-21 23:38:37 +000039 void printSORegRegOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
40 void printSORegImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Bruno Cardoso Lopesab830502011-03-31 23:26:08 +000041
Jim Grosbach05541f42011-09-19 22:21:13 +000042 void printAddrModeTBB(const MCInst *MI, unsigned OpNum, raw_ostream &O);
43 void printAddrModeTBH(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Chris Lattner76c564b2010-04-04 04:47:45 +000044 void printAddrMode2Operand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Bruno Cardoso Lopesab830502011-03-31 23:26:08 +000045 void printAM2PostIndexOp(const MCInst *MI, unsigned OpNum, raw_ostream &O);
46 void printAM2PreOrOffsetIndexOp(const MCInst *MI, unsigned OpNum,
47 raw_ostream &O);
Chris Lattner76c564b2010-04-04 04:47:45 +000048 void printAddrMode2OffsetOperand(const MCInst *MI, unsigned OpNum,
49 raw_ostream &O);
Quentin Colombetc3132202013-04-12 18:47:25 +000050 template <bool AlwaysPrintImm0>
Chris Lattner76c564b2010-04-04 04:47:45 +000051 void printAddrMode3Operand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
52 void printAddrMode3OffsetOperand(const MCInst *MI, unsigned OpNum,
53 raw_ostream &O);
Quentin Colombetc3132202013-04-12 18:47:25 +000054 void printAM3PreOrOffsetIndexOp(const MCInst *MI, unsigned Op, raw_ostream &O,
55 bool AlwaysPrintImm0);
Jim Grosbachd3595712011-08-03 23:50:40 +000056 void printPostIdxImm8Operand(const MCInst *MI, unsigned OpNum,
57 raw_ostream &O);
Jim Grosbachbafce842011-08-05 15:48:21 +000058 void printPostIdxRegOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Owen Andersonce519032011-08-04 18:24:14 +000059 void printPostIdxImm8s4Operand(const MCInst *MI, unsigned OpNum,
60 raw_ostream &O);
Bruno Cardoso Lopesbda36322011-04-04 17:18:19 +000061
Jim Grosbache7f7de92010-11-03 01:11:15 +000062 void printLdStmModeOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Quentin Colombetc3132202013-04-12 18:47:25 +000063 template <bool AlwaysPrintImm0>
Jim Grosbache7f7de92010-11-03 01:11:15 +000064 void printAddrMode5Operand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Chris Lattner76c564b2010-04-04 04:47:45 +000065 void printAddrMode6Operand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Bruno Cardoso Lopesf170f8b2011-03-24 21:04:58 +000066 void printAddrMode7Operand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Chris Lattner76c564b2010-04-04 04:47:45 +000067 void printAddrMode6OffsetOperand(const MCInst *MI, unsigned OpNum,
68 raw_ostream &O);
Johnny Chen9a3e2392010-03-10 18:59:38 +000069
Chris Lattner76c564b2010-04-04 04:47:45 +000070 void printBitfieldInvMaskImmOperand(const MCInst *MI, unsigned OpNum,
71 raw_ostream &O);
Johnny Chen8e8f1c12010-08-12 20:46:17 +000072 void printMemBOption(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Amaury de la Vieuville43cb13a2013-06-10 14:17:08 +000073 void printInstSyncBOption(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Bob Wilson481d7a92010-08-16 18:27:34 +000074 void printShiftImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Jim Grosbacha288b1c2011-07-20 21:40:26 +000075 void printPKHLSLShiftImm(const MCInst *MI, unsigned OpNum, raw_ostream &O);
76 void printPKHASRShiftImm(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Evan Chengb1852592009-11-19 06:57:41 +000077
Mihai Popad36cbaa2013-07-03 09:21:44 +000078 template <unsigned scale>
Jiangning Liu10dd40e2012-08-02 08:13:13 +000079 void printAdrLabelOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Chris Lattner76c564b2010-04-04 04:47:45 +000080 void printThumbS4ImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Jim Grosbach46dd4132011-08-17 21:51:27 +000081 void printThumbSRImm(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Chris Lattner76c564b2010-04-04 04:47:45 +000082 void printThumbITMask(const MCInst *MI, unsigned OpNum, raw_ostream &O);
83 void printThumbAddrModeRROperand(const MCInst *MI, unsigned OpNum,
84 raw_ostream &O);
Bill Wendling092a7bd2010-12-14 03:36:38 +000085 void printThumbAddrModeImm5SOperand(const MCInst *MI, unsigned OpNum,
86 raw_ostream &O, unsigned Scale);
87 void printThumbAddrModeImm5S1Operand(const MCInst *MI, unsigned OpNum,
88 raw_ostream &O);
89 void printThumbAddrModeImm5S2Operand(const MCInst *MI, unsigned OpNum,
90 raw_ostream &O);
91 void printThumbAddrModeImm5S4Operand(const MCInst *MI, unsigned OpNum,
92 raw_ostream &O);
Chris Lattner76c564b2010-04-04 04:47:45 +000093 void printThumbAddrModeSPOperand(const MCInst *MI, unsigned OpNum,
94 raw_ostream &O);
Jim Grosbach4e51d0b2010-09-17 21:25:10 +000095
Chris Lattner76c564b2010-04-04 04:47:45 +000096 void printT2SOOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Quentin Colombetc3132202013-04-12 18:47:25 +000097 template<bool AlwaysPrintImm0>
Jim Grosbache6fe1a02010-10-25 20:00:01 +000098 void printAddrModeImm12Operand(const MCInst *MI, unsigned OpNum,
99 raw_ostream &O);
Amaury de la Vieuvilleaa7fdf82013-06-18 08:12:51 +0000100 template<bool AlwaysPrintImm0>
Chris Lattner76c564b2010-04-04 04:47:45 +0000101 void printT2AddrModeImm8Operand(const MCInst *MI, unsigned OpNum,
102 raw_ostream &O);
Amaury de la Vieuvilleaa7fdf82013-06-18 08:12:51 +0000103 template<bool AlwaysPrintImm0>
Chris Lattner76c564b2010-04-04 04:47:45 +0000104 void printT2AddrModeImm8s4Operand(const MCInst *MI, unsigned OpNum,
105 raw_ostream &O);
Jim Grosbacha05627e2011-09-09 18:37:27 +0000106 void printT2AddrModeImm0_1020s4Operand(const MCInst *MI, unsigned OpNum,
107 raw_ostream &O);
Chris Lattner76c564b2010-04-04 04:47:45 +0000108 void printT2AddrModeImm8OffsetOperand(const MCInst *MI, unsigned OpNum,
109 raw_ostream &O);
110 void printT2AddrModeImm8s4OffsetOperand(const MCInst *MI, unsigned OpNum,
111 raw_ostream &O);
112 void printT2AddrModeSoRegOperand(const MCInst *MI, unsigned OpNum,
113 raw_ostream &O);
Jim Grosbach4e51d0b2010-09-17 21:25:10 +0000114
Jim Grosbach7e72ec62010-10-13 21:00:04 +0000115 void printSetendOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Bruno Cardoso Lopes90d1dfe2011-02-14 13:09:44 +0000116 void printCPSIMod(const MCInst *MI, unsigned OpNum, raw_ostream &O);
117 void printCPSIFlag(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Chris Lattner76c564b2010-04-04 04:47:45 +0000118 void printMSRMaskOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Tim Northoveree843ef2014-08-15 10:47:12 +0000119 void printBankedRegOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Chris Lattner76c564b2010-04-04 04:47:45 +0000120 void printPredicateOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
121 void printMandatoryPredicateOperand(const MCInst *MI, unsigned OpNum,
122 raw_ostream &O);
123 void printSBitModifierOperand(const MCInst *MI, unsigned OpNum,
124 raw_ostream &O);
125 void printRegisterList(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Chris Lattner76c564b2010-04-04 04:47:45 +0000126 void printNoHashImmediate(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Owen Andersonc3c7f5d2011-01-13 21:46:02 +0000127 void printPImmediate(const MCInst *MI, unsigned OpNum, raw_ostream &O);
128 void printCImmediate(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Jim Grosbach48399582011-10-12 17:34:41 +0000129 void printCoprocOptionImm(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Jim Grosbachefc761a2011-09-30 00:50:06 +0000130 void printFPImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Bob Wilson6eae5202010-06-11 21:34:50 +0000131 void printNEONModImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Jim Grosbach475c6db2011-07-25 23:09:14 +0000132 void printImmPlusOneOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Jim Grosbachd2659132011-07-26 21:28:43 +0000133 void printRotImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Asiri Rathnayakea0199b92014-12-02 10:53:20 +0000134 void printModImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Weiming Zhao8f56f882012-11-16 21:55:34 +0000135 void printGPRPairOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Chris Lattneradd57492009-10-19 22:23:04 +0000136
Jim Grosbach4e51d0b2010-09-17 21:25:10 +0000137 void printPCLabel(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Jim Grosbach4739f2e2012-10-30 01:04:51 +0000138 void printThumbLdrLabelOperand(const MCInst *MI, unsigned OpNum,
139 raw_ostream &O);
Jim Grosbachea231912011-12-22 22:19:05 +0000140 void printFBits16(const MCInst *MI, unsigned OpNum, raw_ostream &O);
141 void printFBits32(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Jim Grosbachd0637bf2011-10-07 23:56:00 +0000142 void printVectorIndex(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Jim Grosbachad47cfc2011-10-18 23:02:30 +0000143 void printVectorListOne(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Jim Grosbach13a292c2012-03-06 22:01:44 +0000144 void printVectorListTwo(const MCInst *MI, unsigned OpNum, raw_ostream &O);
145 void printVectorListTwoSpaced(const MCInst *MI, unsigned OpNum,
146 raw_ostream &O);
Jim Grosbachc4360fe2011-10-21 20:02:19 +0000147 void printVectorListThree(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Jim Grosbach846bcff2011-10-21 20:35:01 +0000148 void printVectorListFour(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Jim Grosbachcd6f5e72011-11-30 01:09:44 +0000149 void printVectorListOneAllLanes(const MCInst *MI, unsigned OpNum,
150 raw_ostream &O);
Jim Grosbach3ecf9762011-11-30 18:21:25 +0000151 void printVectorListTwoAllLanes(const MCInst *MI, unsigned OpNum,
152 raw_ostream &O);
Jim Grosbachb78403c2012-01-24 23:47:04 +0000153 void printVectorListThreeAllLanes(const MCInst *MI, unsigned OpNum,
154 raw_ostream &O);
Jim Grosbach086cbfa2012-01-25 00:01:08 +0000155 void printVectorListFourAllLanes(const MCInst *MI, unsigned OpNum,
156 raw_ostream &O);
Jim Grosbachc5af54e2011-12-21 00:38:54 +0000157 void printVectorListTwoSpacedAllLanes(const MCInst *MI, unsigned OpNum,
158 raw_ostream &O);
Jim Grosbachb78403c2012-01-24 23:47:04 +0000159 void printVectorListThreeSpacedAllLanes(const MCInst *MI, unsigned OpNum,
160 raw_ostream &O);
Jim Grosbach086cbfa2012-01-25 00:01:08 +0000161 void printVectorListFourSpacedAllLanes(const MCInst *MI, unsigned OpNum,
162 raw_ostream &O);
Jim Grosbachac2af3f2012-01-23 23:20:46 +0000163 void printVectorListThreeSpaced(const MCInst *MI, unsigned OpNum,
164 raw_ostream &O);
Jim Grosbached561fc2012-01-24 00:43:17 +0000165 void printVectorListFourSpaced(const MCInst *MI, unsigned OpNum,
166 raw_ostream &O);
Chris Lattnera2907782009-10-19 19:56:26 +0000167};
Jim Grosbach4e51d0b2010-09-17 21:25:10 +0000168
Chris Lattnera76eab42010-11-14 19:40:38 +0000169} // end namespace llvm
Chris Lattnera2907782009-10-19 19:56:26 +0000170
171#endif