blob: b1fe9a142febdb8dad4d805853c1045ac8553347 [file] [log] [blame]
Chris Lattnerfd603822009-10-19 19:56:26 +00001//===-- ARMInstPrinter.h - Convert ARM MCInst to assembly syntax ----------===//
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// This class prints an ARM MCInst to a .s file.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef ARMINSTPRINTER_H
15#define ARMINSTPRINTER_H
16
17#include "llvm/MC/MCInstPrinter.h"
James Molloyb9505852011-09-07 17:24:38 +000018#include "llvm/MC/MCSubtargetInfo.h"
Chris Lattnerfd603822009-10-19 19:56:26 +000019
20namespace llvm {
Bill Wendlinga5c177e2011-03-21 04:13:46 +000021
22class MCOperand;
Jim Grosbach196b48b2010-09-17 21:25:10 +000023
Chris Lattnerfd603822009-10-19 19:56:26 +000024class ARMInstPrinter : public MCInstPrinter {
25public:
James Molloyb9505852011-09-07 17:24:38 +000026 ARMInstPrinter(const MCAsmInfo &MAI, const MCSubtargetInfo &STI);
Chris Lattnerfd603822009-10-19 19:56:26 +000027
Owen Anderson98c5dda2011-09-15 23:38:46 +000028 virtual void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot);
Chris Lattner6274ec42010-10-28 21:37:33 +000029 virtual StringRef getOpcodeName(unsigned Opcode) const;
Rafael Espindolacde4ce42011-06-02 02:34:55 +000030 virtual void printRegName(raw_ostream &OS, unsigned RegNo) const;
Chris Lattner6274ec42010-10-28 21:37:33 +000031
32 static const char *getInstructionName(unsigned Opcode);
Jim Grosbach196b48b2010-09-17 21:25:10 +000033
Chris Lattnerfd603822009-10-19 19:56:26 +000034 // Autogenerated by tblgen.
Chris Lattner35c33bd2010-04-04 04:47:45 +000035 void printInstruction(const MCInst *MI, raw_ostream &O);
Chris Lattnerfd603822009-10-19 19:56:26 +000036 static const char *getRegisterName(unsigned RegNo);
37
38
Jim Grosbach0a2287b2010-11-03 01:11:15 +000039 void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
Jim Grosbach196b48b2010-09-17 21:25:10 +000040
Owen Anderson152d4a42011-07-21 23:38:37 +000041 void printSORegRegOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
42 void printSORegImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Bruno Cardoso Lopesae085542011-03-31 23:26:08 +000043
Jim Grosbach7f739be2011-09-19 22:21:13 +000044 void printAddrModeTBB(const MCInst *MI, unsigned OpNum, raw_ostream &O);
45 void printAddrModeTBH(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Chris Lattner35c33bd2010-04-04 04:47:45 +000046 void printAddrMode2Operand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Bruno Cardoso Lopesae085542011-03-31 23:26:08 +000047 void printAM2PostIndexOp(const MCInst *MI, unsigned OpNum, raw_ostream &O);
48 void printAM2PreOrOffsetIndexOp(const MCInst *MI, unsigned OpNum,
49 raw_ostream &O);
Chris Lattner35c33bd2010-04-04 04:47:45 +000050 void printAddrMode2OffsetOperand(const MCInst *MI, unsigned OpNum,
51 raw_ostream &O);
Bruno Cardoso Lopesac79e4c2011-04-04 17:18:19 +000052
Chris Lattner35c33bd2010-04-04 04:47:45 +000053 void printAddrMode3Operand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
54 void printAddrMode3OffsetOperand(const MCInst *MI, unsigned OpNum,
55 raw_ostream &O);
Jim Grosbach7ce05792011-08-03 23:50:40 +000056 void printAM3PostIndexOp(const MCInst *MI, unsigned Op, raw_ostream &O);
57 void printAM3PreOrOffsetIndexOp(const MCInst *MI, unsigned Op,raw_ostream &O);
58 void printPostIdxImm8Operand(const MCInst *MI, unsigned OpNum,
59 raw_ostream &O);
Jim Grosbachca8c70b2011-08-05 15:48:21 +000060 void printPostIdxRegOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Owen Anderson154c41d2011-08-04 18:24:14 +000061 void printPostIdxImm8s4Operand(const MCInst *MI, unsigned OpNum,
62 raw_ostream &O);
Bruno Cardoso Lopesac79e4c2011-04-04 17:18:19 +000063
Jim Grosbach0a2287b2010-11-03 01:11:15 +000064 void printLdStmModeOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
65 void printAddrMode5Operand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Chris Lattner35c33bd2010-04-04 04:47:45 +000066 void printAddrMode6Operand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Bruno Cardoso Lopes505f3cd2011-03-24 21:04:58 +000067 void printAddrMode7Operand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Chris Lattner35c33bd2010-04-04 04:47:45 +000068 void printAddrMode6OffsetOperand(const MCInst *MI, unsigned OpNum,
69 raw_ostream &O);
Johnny Chendd0f3cf2010-03-10 18:59:38 +000070
Chris Lattner35c33bd2010-04-04 04:47:45 +000071 void printBitfieldInvMaskImmOperand(const MCInst *MI, unsigned OpNum,
72 raw_ostream &O);
Johnny Chen1adc40c2010-08-12 20:46:17 +000073 void printMemBOption(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Bob Wilson22f5dc72010-08-16 18:27:34 +000074 void printShiftImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Jim Grosbachdde038a2011-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 Cheng2ef9c8a2009-11-19 06:57:41 +000077
Chris Lattner35c33bd2010-04-04 04:47:45 +000078 void printThumbS4ImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Jim Grosbach70939ee2011-08-17 21:51:27 +000079 void printThumbSRImm(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Chris Lattner35c33bd2010-04-04 04:47:45 +000080 void printThumbITMask(const MCInst *MI, unsigned OpNum, raw_ostream &O);
81 void printThumbAddrModeRROperand(const MCInst *MI, unsigned OpNum,
82 raw_ostream &O);
Bill Wendlingf4caf692010-12-14 03:36:38 +000083 void printThumbAddrModeImm5SOperand(const MCInst *MI, unsigned OpNum,
84 raw_ostream &O, unsigned Scale);
85 void printThumbAddrModeImm5S1Operand(const MCInst *MI, unsigned OpNum,
86 raw_ostream &O);
87 void printThumbAddrModeImm5S2Operand(const MCInst *MI, unsigned OpNum,
88 raw_ostream &O);
89 void printThumbAddrModeImm5S4Operand(const MCInst *MI, unsigned OpNum,
90 raw_ostream &O);
Chris Lattner35c33bd2010-04-04 04:47:45 +000091 void printThumbAddrModeSPOperand(const MCInst *MI, unsigned OpNum,
92 raw_ostream &O);
Jim Grosbach196b48b2010-09-17 21:25:10 +000093
Chris Lattner35c33bd2010-04-04 04:47:45 +000094 void printT2SOOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Jim Grosbach458f2dc2010-10-25 20:00:01 +000095 void printAddrModeImm12Operand(const MCInst *MI, unsigned OpNum,
96 raw_ostream &O);
Chris Lattner35c33bd2010-04-04 04:47:45 +000097 void printT2AddrModeImm8Operand(const MCInst *MI, unsigned OpNum,
98 raw_ostream &O);
99 void printT2AddrModeImm8s4Operand(const MCInst *MI, unsigned OpNum,
100 raw_ostream &O);
Jim Grosbachb6aed502011-09-09 18:37:27 +0000101 void printT2AddrModeImm0_1020s4Operand(const MCInst *MI, unsigned OpNum,
102 raw_ostream &O);
Chris Lattner35c33bd2010-04-04 04:47:45 +0000103 void printT2AddrModeImm8OffsetOperand(const MCInst *MI, unsigned OpNum,
104 raw_ostream &O);
105 void printT2AddrModeImm8s4OffsetOperand(const MCInst *MI, unsigned OpNum,
106 raw_ostream &O);
107 void printT2AddrModeSoRegOperand(const MCInst *MI, unsigned OpNum,
108 raw_ostream &O);
Jim Grosbach196b48b2010-09-17 21:25:10 +0000109
Jim Grosbachb3af5de2010-10-13 21:00:04 +0000110 void printSetendOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Bruno Cardoso Lopesa2b6e412011-02-14 13:09:44 +0000111 void printCPSIMod(const MCInst *MI, unsigned OpNum, raw_ostream &O);
112 void printCPSIFlag(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Chris Lattner35c33bd2010-04-04 04:47:45 +0000113 void printMSRMaskOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Chris Lattner35c33bd2010-04-04 04:47:45 +0000114 void printPredicateOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
115 void printMandatoryPredicateOperand(const MCInst *MI, unsigned OpNum,
116 raw_ostream &O);
117 void printSBitModifierOperand(const MCInst *MI, unsigned OpNum,
118 raw_ostream &O);
119 void printRegisterList(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Chris Lattner35c33bd2010-04-04 04:47:45 +0000120 void printNoHashImmediate(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Owen Andersone4e5e2a2011-01-13 21:46:02 +0000121 void printPImmediate(const MCInst *MI, unsigned OpNum, raw_ostream &O);
122 void printCImmediate(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Jim Grosbach9b8f2a02011-10-12 17:34:41 +0000123 void printCoprocOptionImm(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Jim Grosbach4ebbf7b2011-09-30 00:50:06 +0000124 void printFPImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Bob Wilson1a913ed2010-06-11 21:34:50 +0000125 void printNEONModImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Jim Grosbachf4943352011-07-25 23:09:14 +0000126 void printImmPlusOneOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Jim Grosbach85bfd3b2011-07-26 21:28:43 +0000127 void printRotImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Chris Lattner4d152222009-10-19 22:23:04 +0000128
Jim Grosbach196b48b2010-09-17 21:25:10 +0000129 void printPCLabel(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Owen Andersone1368722011-09-21 23:44:46 +0000130 void printT2LdrLabelOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Jim Grosbach460a9052011-10-07 23:56:00 +0000131 void printVectorIndex(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Jim Grosbach862019c2011-10-18 23:02:30 +0000132 void printVectorListOne(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Jim Grosbach280dfad2011-10-21 18:54:25 +0000133 void printVectorListTwo(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Jim Grosbachcdcfa282011-10-21 20:02:19 +0000134 void printVectorListThree(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Jim Grosbachb6310312011-10-21 20:35:01 +0000135 void printVectorListFour(const MCInst *MI, unsigned OpNum, raw_ostream &O);
Jim Grosbach98b05a52011-11-30 01:09:44 +0000136 void printVectorListOneAllLanes(const MCInst *MI, unsigned OpNum,
137 raw_ostream &O);
Jim Grosbach13af2222011-11-30 18:21:25 +0000138 void printVectorListTwoAllLanes(const MCInst *MI, unsigned OpNum,
139 raw_ostream &O);
Chris Lattnerfd603822009-10-19 19:56:26 +0000140};
Jim Grosbach196b48b2010-09-17 21:25:10 +0000141
Chris Lattner60d5b5f2010-11-14 19:40:38 +0000142} // end namespace llvm
Chris Lattnerfd603822009-10-19 19:56:26 +0000143
144#endif