1*9a0e4156SSadaf Ebrahimi //===-- ARMBaseInfo.h - Top level definitions for ARM -------- --*- C++ -*-===//
2*9a0e4156SSadaf Ebrahimi //
3*9a0e4156SSadaf Ebrahimi // The LLVM Compiler Infrastructure
4*9a0e4156SSadaf Ebrahimi //
5*9a0e4156SSadaf Ebrahimi // This file is distributed under the University of Illinois Open Source
6*9a0e4156SSadaf Ebrahimi // License. See LICENSE.TXT for details.
7*9a0e4156SSadaf Ebrahimi //
8*9a0e4156SSadaf Ebrahimi //===----------------------------------------------------------------------===//
9*9a0e4156SSadaf Ebrahimi //
10*9a0e4156SSadaf Ebrahimi // This file contains small standalone helper functions and enum definitions for
11*9a0e4156SSadaf Ebrahimi // the ARM target useful for the compiler back-end and the MC libraries.
12*9a0e4156SSadaf Ebrahimi // As such, it deliberately does not include references to LLVM core
13*9a0e4156SSadaf Ebrahimi // code gen types, passes, etc..
14*9a0e4156SSadaf Ebrahimi //
15*9a0e4156SSadaf Ebrahimi //===----------------------------------------------------------------------===//
16*9a0e4156SSadaf Ebrahimi
17*9a0e4156SSadaf Ebrahimi /* Capstone Disassembly Engine */
18*9a0e4156SSadaf Ebrahimi /* By Nguyen Anh Quynh <[email protected]>, 2013-2015 */
19*9a0e4156SSadaf Ebrahimi
20*9a0e4156SSadaf Ebrahimi #ifndef CS_ARMBASEINFO_H
21*9a0e4156SSadaf Ebrahimi #define CS_ARMBASEINFO_H
22*9a0e4156SSadaf Ebrahimi
23*9a0e4156SSadaf Ebrahimi #include "capstone/arm.h"
24*9a0e4156SSadaf Ebrahimi
25*9a0e4156SSadaf Ebrahimi // Defines symbolic names for ARM registers. This defines a mapping from
26*9a0e4156SSadaf Ebrahimi // register name to register number.
27*9a0e4156SSadaf Ebrahimi //
28*9a0e4156SSadaf Ebrahimi #define GET_REGINFO_ENUM
29*9a0e4156SSadaf Ebrahimi #include "ARMGenRegisterInfo.inc"
30*9a0e4156SSadaf Ebrahimi
31*9a0e4156SSadaf Ebrahimi // Enums corresponding to ARM condition codes
32*9a0e4156SSadaf Ebrahimi // The CondCodes constants map directly to the 4-bit encoding of the
33*9a0e4156SSadaf Ebrahimi // condition field for predicated instructions.
34*9a0e4156SSadaf Ebrahimi typedef enum ARMCC_CondCodes { // Meaning (integer) Meaning (floating-point)
35*9a0e4156SSadaf Ebrahimi ARMCC_EQ, // Equal Equal
36*9a0e4156SSadaf Ebrahimi ARMCC_NE, // Not equal Not equal, or unordered
37*9a0e4156SSadaf Ebrahimi ARMCC_HS, // Carry set >, ==, or unordered
38*9a0e4156SSadaf Ebrahimi ARMCC_LO, // Carry clear Less than
39*9a0e4156SSadaf Ebrahimi ARMCC_MI, // Minus, negative Less than
40*9a0e4156SSadaf Ebrahimi ARMCC_PL, // Plus, positive or zero >, ==, or unordered
41*9a0e4156SSadaf Ebrahimi ARMCC_VS, // Overflow Unordered
42*9a0e4156SSadaf Ebrahimi ARMCC_VC, // No overflow Not unordered
43*9a0e4156SSadaf Ebrahimi ARMCC_HI, // Unsigned higher Greater than, or unordered
44*9a0e4156SSadaf Ebrahimi ARMCC_LS, // Unsigned lower or same Less than or equal
45*9a0e4156SSadaf Ebrahimi ARMCC_GE, // Greater than or equal Greater than or equal
46*9a0e4156SSadaf Ebrahimi ARMCC_LT, // Less than Less than, or unordered
47*9a0e4156SSadaf Ebrahimi ARMCC_GT, // Greater than Greater than
48*9a0e4156SSadaf Ebrahimi ARMCC_LE, // Less than or equal <, ==, or unordered
49*9a0e4156SSadaf Ebrahimi ARMCC_AL // Always (unconditional) Always (unconditional)
50*9a0e4156SSadaf Ebrahimi } ARMCC_CondCodes;
51*9a0e4156SSadaf Ebrahimi
ARMCC_getOppositeCondition(ARMCC_CondCodes CC)52*9a0e4156SSadaf Ebrahimi inline static ARMCC_CondCodes ARMCC_getOppositeCondition(ARMCC_CondCodes CC)
53*9a0e4156SSadaf Ebrahimi {
54*9a0e4156SSadaf Ebrahimi switch (CC) {
55*9a0e4156SSadaf Ebrahimi case ARMCC_EQ: return ARMCC_NE;
56*9a0e4156SSadaf Ebrahimi case ARMCC_NE: return ARMCC_EQ;
57*9a0e4156SSadaf Ebrahimi case ARMCC_HS: return ARMCC_LO;
58*9a0e4156SSadaf Ebrahimi case ARMCC_LO: return ARMCC_HS;
59*9a0e4156SSadaf Ebrahimi case ARMCC_MI: return ARMCC_PL;
60*9a0e4156SSadaf Ebrahimi case ARMCC_PL: return ARMCC_MI;
61*9a0e4156SSadaf Ebrahimi case ARMCC_VS: return ARMCC_VC;
62*9a0e4156SSadaf Ebrahimi case ARMCC_VC: return ARMCC_VS;
63*9a0e4156SSadaf Ebrahimi case ARMCC_HI: return ARMCC_LS;
64*9a0e4156SSadaf Ebrahimi case ARMCC_LS: return ARMCC_HI;
65*9a0e4156SSadaf Ebrahimi case ARMCC_GE: return ARMCC_LT;
66*9a0e4156SSadaf Ebrahimi case ARMCC_LT: return ARMCC_GE;
67*9a0e4156SSadaf Ebrahimi case ARMCC_GT: return ARMCC_LE;
68*9a0e4156SSadaf Ebrahimi case ARMCC_LE: return ARMCC_GT;
69*9a0e4156SSadaf Ebrahimi default: return ARMCC_AL;
70*9a0e4156SSadaf Ebrahimi }
71*9a0e4156SSadaf Ebrahimi }
72*9a0e4156SSadaf Ebrahimi
ARMCC_ARMCondCodeToString(ARMCC_CondCodes CC)73*9a0e4156SSadaf Ebrahimi inline static const char *ARMCC_ARMCondCodeToString(ARMCC_CondCodes CC)
74*9a0e4156SSadaf Ebrahimi {
75*9a0e4156SSadaf Ebrahimi switch (CC) {
76*9a0e4156SSadaf Ebrahimi case ARMCC_EQ: return "eq";
77*9a0e4156SSadaf Ebrahimi case ARMCC_NE: return "ne";
78*9a0e4156SSadaf Ebrahimi case ARMCC_HS: return "hs";
79*9a0e4156SSadaf Ebrahimi case ARMCC_LO: return "lo";
80*9a0e4156SSadaf Ebrahimi case ARMCC_MI: return "mi";
81*9a0e4156SSadaf Ebrahimi case ARMCC_PL: return "pl";
82*9a0e4156SSadaf Ebrahimi case ARMCC_VS: return "vs";
83*9a0e4156SSadaf Ebrahimi case ARMCC_VC: return "vc";
84*9a0e4156SSadaf Ebrahimi case ARMCC_HI: return "hi";
85*9a0e4156SSadaf Ebrahimi case ARMCC_LS: return "ls";
86*9a0e4156SSadaf Ebrahimi case ARMCC_GE: return "ge";
87*9a0e4156SSadaf Ebrahimi case ARMCC_LT: return "lt";
88*9a0e4156SSadaf Ebrahimi case ARMCC_GT: return "gt";
89*9a0e4156SSadaf Ebrahimi case ARMCC_LE: return "le";
90*9a0e4156SSadaf Ebrahimi case ARMCC_AL: return "al";
91*9a0e4156SSadaf Ebrahimi default: return "";
92*9a0e4156SSadaf Ebrahimi }
93*9a0e4156SSadaf Ebrahimi }
94*9a0e4156SSadaf Ebrahimi
ARM_PROC_IFlagsToString(unsigned val)95*9a0e4156SSadaf Ebrahimi inline static const char *ARM_PROC_IFlagsToString(unsigned val)
96*9a0e4156SSadaf Ebrahimi {
97*9a0e4156SSadaf Ebrahimi switch (val) {
98*9a0e4156SSadaf Ebrahimi case ARM_CPSFLAG_F: return "f";
99*9a0e4156SSadaf Ebrahimi case ARM_CPSFLAG_I: return "i";
100*9a0e4156SSadaf Ebrahimi case ARM_CPSFLAG_A: return "a";
101*9a0e4156SSadaf Ebrahimi default: return "";
102*9a0e4156SSadaf Ebrahimi }
103*9a0e4156SSadaf Ebrahimi }
104*9a0e4156SSadaf Ebrahimi
ARM_PROC_IModToString(unsigned val)105*9a0e4156SSadaf Ebrahimi inline static const char *ARM_PROC_IModToString(unsigned val)
106*9a0e4156SSadaf Ebrahimi {
107*9a0e4156SSadaf Ebrahimi switch (val) {
108*9a0e4156SSadaf Ebrahimi case ARM_CPSMODE_IE: return "ie";
109*9a0e4156SSadaf Ebrahimi case ARM_CPSMODE_ID: return "id";
110*9a0e4156SSadaf Ebrahimi default: return "";
111*9a0e4156SSadaf Ebrahimi }
112*9a0e4156SSadaf Ebrahimi }
113*9a0e4156SSadaf Ebrahimi
ARM_MB_MemBOptToString(unsigned val,bool HasV8)114*9a0e4156SSadaf Ebrahimi inline static const char *ARM_MB_MemBOptToString(unsigned val, bool HasV8)
115*9a0e4156SSadaf Ebrahimi {
116*9a0e4156SSadaf Ebrahimi switch (val) {
117*9a0e4156SSadaf Ebrahimi default: return "BUGBUG";
118*9a0e4156SSadaf Ebrahimi case ARM_MB_SY: return "sy";
119*9a0e4156SSadaf Ebrahimi case ARM_MB_ST: return "st";
120*9a0e4156SSadaf Ebrahimi case ARM_MB_LD: return HasV8 ? "ld" : "#0xd";
121*9a0e4156SSadaf Ebrahimi case ARM_MB_RESERVED_12: return "#0xc";
122*9a0e4156SSadaf Ebrahimi case ARM_MB_ISH: return "ish";
123*9a0e4156SSadaf Ebrahimi case ARM_MB_ISHST: return "ishst";
124*9a0e4156SSadaf Ebrahimi case ARM_MB_ISHLD: return HasV8 ? "ishld" : "#0x9";
125*9a0e4156SSadaf Ebrahimi case ARM_MB_RESERVED_8: return "#0x8";
126*9a0e4156SSadaf Ebrahimi case ARM_MB_NSH: return "nsh";
127*9a0e4156SSadaf Ebrahimi case ARM_MB_NSHST: return "nshst";
128*9a0e4156SSadaf Ebrahimi case ARM_MB_NSHLD: return HasV8 ? "nshld" : "#0x5";
129*9a0e4156SSadaf Ebrahimi case ARM_MB_RESERVED_4: return "#0x4";
130*9a0e4156SSadaf Ebrahimi case ARM_MB_OSH: return "osh";
131*9a0e4156SSadaf Ebrahimi case ARM_MB_OSHST: return "oshst";
132*9a0e4156SSadaf Ebrahimi case ARM_MB_OSHLD: return HasV8 ? "oshld" : "#0x1";
133*9a0e4156SSadaf Ebrahimi case ARM_MB_RESERVED_0: return "#0x0";
134*9a0e4156SSadaf Ebrahimi }
135*9a0e4156SSadaf Ebrahimi }
136*9a0e4156SSadaf Ebrahimi
137*9a0e4156SSadaf Ebrahimi enum ARM_ISB_InstSyncBOpt {
138*9a0e4156SSadaf Ebrahimi ARM_ISB_RESERVED_0 = 0,
139*9a0e4156SSadaf Ebrahimi ARM_ISB_RESERVED_1 = 1,
140*9a0e4156SSadaf Ebrahimi ARM_ISB_RESERVED_2 = 2,
141*9a0e4156SSadaf Ebrahimi ARM_ISB_RESERVED_3 = 3,
142*9a0e4156SSadaf Ebrahimi ARM_ISB_RESERVED_4 = 4,
143*9a0e4156SSadaf Ebrahimi ARM_ISB_RESERVED_5 = 5,
144*9a0e4156SSadaf Ebrahimi ARM_ISB_RESERVED_6 = 6,
145*9a0e4156SSadaf Ebrahimi ARM_ISB_RESERVED_7 = 7,
146*9a0e4156SSadaf Ebrahimi ARM_ISB_RESERVED_8 = 8,
147*9a0e4156SSadaf Ebrahimi ARM_ISB_RESERVED_9 = 9,
148*9a0e4156SSadaf Ebrahimi ARM_ISB_RESERVED_10 = 10,
149*9a0e4156SSadaf Ebrahimi ARM_ISB_RESERVED_11 = 11,
150*9a0e4156SSadaf Ebrahimi ARM_ISB_RESERVED_12 = 12,
151*9a0e4156SSadaf Ebrahimi ARM_ISB_RESERVED_13 = 13,
152*9a0e4156SSadaf Ebrahimi ARM_ISB_RESERVED_14 = 14,
153*9a0e4156SSadaf Ebrahimi ARM_ISB_SY = 15
154*9a0e4156SSadaf Ebrahimi };
155*9a0e4156SSadaf Ebrahimi
ARM_ISB_InstSyncBOptToString(unsigned val)156*9a0e4156SSadaf Ebrahimi inline static const char *ARM_ISB_InstSyncBOptToString(unsigned val)
157*9a0e4156SSadaf Ebrahimi {
158*9a0e4156SSadaf Ebrahimi switch (val) {
159*9a0e4156SSadaf Ebrahimi default: // never reach
160*9a0e4156SSadaf Ebrahimi case ARM_ISB_RESERVED_0: return "#0x0";
161*9a0e4156SSadaf Ebrahimi case ARM_ISB_RESERVED_1: return "#0x1";
162*9a0e4156SSadaf Ebrahimi case ARM_ISB_RESERVED_2: return "#0x2";
163*9a0e4156SSadaf Ebrahimi case ARM_ISB_RESERVED_3: return "#0x3";
164*9a0e4156SSadaf Ebrahimi case ARM_ISB_RESERVED_4: return "#0x4";
165*9a0e4156SSadaf Ebrahimi case ARM_ISB_RESERVED_5: return "#0x5";
166*9a0e4156SSadaf Ebrahimi case ARM_ISB_RESERVED_6: return "#0x6";
167*9a0e4156SSadaf Ebrahimi case ARM_ISB_RESERVED_7: return "#0x7";
168*9a0e4156SSadaf Ebrahimi case ARM_ISB_RESERVED_8: return "#0x8";
169*9a0e4156SSadaf Ebrahimi case ARM_ISB_RESERVED_9: return "#0x9";
170*9a0e4156SSadaf Ebrahimi case ARM_ISB_RESERVED_10: return "#0xa";
171*9a0e4156SSadaf Ebrahimi case ARM_ISB_RESERVED_11: return "#0xb";
172*9a0e4156SSadaf Ebrahimi case ARM_ISB_RESERVED_12: return "#0xc";
173*9a0e4156SSadaf Ebrahimi case ARM_ISB_RESERVED_13: return "#0xd";
174*9a0e4156SSadaf Ebrahimi case ARM_ISB_RESERVED_14: return "#0xe";
175*9a0e4156SSadaf Ebrahimi case ARM_ISB_SY: return "sy";
176*9a0e4156SSadaf Ebrahimi }
177*9a0e4156SSadaf Ebrahimi }
178*9a0e4156SSadaf Ebrahimi
179*9a0e4156SSadaf Ebrahimi /// isARMLowRegister - Returns true if the register is a low register (r0-r7).
180*9a0e4156SSadaf Ebrahimi ///
isARMLowRegister(unsigned Reg)181*9a0e4156SSadaf Ebrahimi static inline bool isARMLowRegister(unsigned Reg)
182*9a0e4156SSadaf Ebrahimi {
183*9a0e4156SSadaf Ebrahimi //using namespace ARM;
184*9a0e4156SSadaf Ebrahimi switch (Reg) {
185*9a0e4156SSadaf Ebrahimi case ARM_R0: case ARM_R1: case ARM_R2: case ARM_R3:
186*9a0e4156SSadaf Ebrahimi case ARM_R4: case ARM_R5: case ARM_R6: case ARM_R7:
187*9a0e4156SSadaf Ebrahimi return true;
188*9a0e4156SSadaf Ebrahimi default:
189*9a0e4156SSadaf Ebrahimi return false;
190*9a0e4156SSadaf Ebrahimi }
191*9a0e4156SSadaf Ebrahimi }
192*9a0e4156SSadaf Ebrahimi
193*9a0e4156SSadaf Ebrahimi /// ARMII - This namespace holds all of the target specific flags that
194*9a0e4156SSadaf Ebrahimi /// instruction info tracks.
195*9a0e4156SSadaf Ebrahimi ///
196*9a0e4156SSadaf Ebrahimi /// ARM Index Modes
197*9a0e4156SSadaf Ebrahimi enum ARMII_IndexMode {
198*9a0e4156SSadaf Ebrahimi ARMII_IndexModeNone = 0,
199*9a0e4156SSadaf Ebrahimi ARMII_IndexModePre = 1,
200*9a0e4156SSadaf Ebrahimi ARMII_IndexModePost = 2,
201*9a0e4156SSadaf Ebrahimi ARMII_IndexModeUpd = 3
202*9a0e4156SSadaf Ebrahimi };
203*9a0e4156SSadaf Ebrahimi
204*9a0e4156SSadaf Ebrahimi /// ARM Addressing Modes
205*9a0e4156SSadaf Ebrahimi typedef enum ARMII_AddrMode {
206*9a0e4156SSadaf Ebrahimi ARMII_AddrModeNone = 0,
207*9a0e4156SSadaf Ebrahimi ARMII_AddrMode1 = 1,
208*9a0e4156SSadaf Ebrahimi ARMII_AddrMode2 = 2,
209*9a0e4156SSadaf Ebrahimi ARMII_AddrMode3 = 3,
210*9a0e4156SSadaf Ebrahimi ARMII_AddrMode4 = 4,
211*9a0e4156SSadaf Ebrahimi ARMII_AddrMode5 = 5,
212*9a0e4156SSadaf Ebrahimi ARMII_AddrMode6 = 6,
213*9a0e4156SSadaf Ebrahimi ARMII_AddrModeT1_1 = 7,
214*9a0e4156SSadaf Ebrahimi ARMII_AddrModeT1_2 = 8,
215*9a0e4156SSadaf Ebrahimi ARMII_AddrModeT1_4 = 9,
216*9a0e4156SSadaf Ebrahimi ARMII_AddrModeT1_s = 10, // i8 * 4 for pc and sp relative data
217*9a0e4156SSadaf Ebrahimi ARMII_AddrModeT2_i12 = 11,
218*9a0e4156SSadaf Ebrahimi ARMII_AddrModeT2_i8 = 12,
219*9a0e4156SSadaf Ebrahimi ARMII_AddrModeT2_so = 13,
220*9a0e4156SSadaf Ebrahimi ARMII_AddrModeT2_pc = 14, // +/- i12 for pc relative data
221*9a0e4156SSadaf Ebrahimi ARMII_AddrModeT2_i8s4 = 15, // i8 * 4
222*9a0e4156SSadaf Ebrahimi ARMII_AddrMode_i12 = 16
223*9a0e4156SSadaf Ebrahimi } ARMII_AddrMode;
224*9a0e4156SSadaf Ebrahimi
ARMII_AddrModeToString(ARMII_AddrMode addrmode)225*9a0e4156SSadaf Ebrahimi inline static const char *ARMII_AddrModeToString(ARMII_AddrMode addrmode)
226*9a0e4156SSadaf Ebrahimi {
227*9a0e4156SSadaf Ebrahimi switch (addrmode) {
228*9a0e4156SSadaf Ebrahimi case ARMII_AddrModeNone: return "AddrModeNone";
229*9a0e4156SSadaf Ebrahimi case ARMII_AddrMode1: return "AddrMode1";
230*9a0e4156SSadaf Ebrahimi case ARMII_AddrMode2: return "AddrMode2";
231*9a0e4156SSadaf Ebrahimi case ARMII_AddrMode3: return "AddrMode3";
232*9a0e4156SSadaf Ebrahimi case ARMII_AddrMode4: return "AddrMode4";
233*9a0e4156SSadaf Ebrahimi case ARMII_AddrMode5: return "AddrMode5";
234*9a0e4156SSadaf Ebrahimi case ARMII_AddrMode6: return "AddrMode6";
235*9a0e4156SSadaf Ebrahimi case ARMII_AddrModeT1_1: return "AddrModeT1_1";
236*9a0e4156SSadaf Ebrahimi case ARMII_AddrModeT1_2: return "AddrModeT1_2";
237*9a0e4156SSadaf Ebrahimi case ARMII_AddrModeT1_4: return "AddrModeT1_4";
238*9a0e4156SSadaf Ebrahimi case ARMII_AddrModeT1_s: return "AddrModeT1_s";
239*9a0e4156SSadaf Ebrahimi case ARMII_AddrModeT2_i12: return "AddrModeT2_i12";
240*9a0e4156SSadaf Ebrahimi case ARMII_AddrModeT2_i8: return "AddrModeT2_i8";
241*9a0e4156SSadaf Ebrahimi case ARMII_AddrModeT2_so: return "AddrModeT2_so";
242*9a0e4156SSadaf Ebrahimi case ARMII_AddrModeT2_pc: return "AddrModeT2_pc";
243*9a0e4156SSadaf Ebrahimi case ARMII_AddrModeT2_i8s4: return "AddrModeT2_i8s4";
244*9a0e4156SSadaf Ebrahimi case ARMII_AddrMode_i12: return "AddrMode_i12";
245*9a0e4156SSadaf Ebrahimi }
246*9a0e4156SSadaf Ebrahimi }
247*9a0e4156SSadaf Ebrahimi
248*9a0e4156SSadaf Ebrahimi /// Target Operand Flag enum.
249*9a0e4156SSadaf Ebrahimi enum ARMII_TOF {
250*9a0e4156SSadaf Ebrahimi //===------------------------------------------------------------------===//
251*9a0e4156SSadaf Ebrahimi // ARM Specific MachineOperand flags.
252*9a0e4156SSadaf Ebrahimi
253*9a0e4156SSadaf Ebrahimi ARMII_MO_NO_FLAG,
254*9a0e4156SSadaf Ebrahimi
255*9a0e4156SSadaf Ebrahimi /// MO_LO16 - On a symbol operand, this represents a relocation containing
256*9a0e4156SSadaf Ebrahimi /// lower 16 bit of the address. Used only via movw instruction.
257*9a0e4156SSadaf Ebrahimi ARMII_MO_LO16,
258*9a0e4156SSadaf Ebrahimi
259*9a0e4156SSadaf Ebrahimi /// MO_HI16 - On a symbol operand, this represents a relocation containing
260*9a0e4156SSadaf Ebrahimi /// higher 16 bit of the address. Used only via movt instruction.
261*9a0e4156SSadaf Ebrahimi ARMII_MO_HI16,
262*9a0e4156SSadaf Ebrahimi
263*9a0e4156SSadaf Ebrahimi /// MO_LO16_NONLAZY - On a symbol operand "FOO", this represents a
264*9a0e4156SSadaf Ebrahimi /// relocation containing lower 16 bit of the non-lazy-ptr indirect symbol,
265*9a0e4156SSadaf Ebrahimi /// i.e. "FOO$non_lazy_ptr".
266*9a0e4156SSadaf Ebrahimi /// Used only via movw instruction.
267*9a0e4156SSadaf Ebrahimi ARMII_MO_LO16_NONLAZY,
268*9a0e4156SSadaf Ebrahimi
269*9a0e4156SSadaf Ebrahimi /// MO_HI16_NONLAZY - On a symbol operand "FOO", this represents a
270*9a0e4156SSadaf Ebrahimi /// relocation containing lower 16 bit of the non-lazy-ptr indirect symbol,
271*9a0e4156SSadaf Ebrahimi /// i.e. "FOO$non_lazy_ptr". Used only via movt instruction.
272*9a0e4156SSadaf Ebrahimi ARMII_MO_HI16_NONLAZY,
273*9a0e4156SSadaf Ebrahimi
274*9a0e4156SSadaf Ebrahimi /// MO_LO16_NONLAZY_PIC - On a symbol operand "FOO", this represents a
275*9a0e4156SSadaf Ebrahimi /// relocation containing lower 16 bit of the PC relative address of the
276*9a0e4156SSadaf Ebrahimi /// non-lazy-ptr indirect symbol, i.e. "FOO$non_lazy_ptr - LABEL".
277*9a0e4156SSadaf Ebrahimi /// Used only via movw instruction.
278*9a0e4156SSadaf Ebrahimi ARMII_MO_LO16_NONLAZY_PIC,
279*9a0e4156SSadaf Ebrahimi
280*9a0e4156SSadaf Ebrahimi /// MO_HI16_NONLAZY_PIC - On a symbol operand "FOO", this represents a
281*9a0e4156SSadaf Ebrahimi /// relocation containing lower 16 bit of the PC relative address of the
282*9a0e4156SSadaf Ebrahimi /// non-lazy-ptr indirect symbol, i.e. "FOO$non_lazy_ptr - LABEL".
283*9a0e4156SSadaf Ebrahimi /// Used only via movt instruction.
284*9a0e4156SSadaf Ebrahimi ARMII_MO_HI16_NONLAZY_PIC,
285*9a0e4156SSadaf Ebrahimi
286*9a0e4156SSadaf Ebrahimi /// MO_PLT - On a symbol operand, this represents an ELF PLT reference on a
287*9a0e4156SSadaf Ebrahimi /// call operand.
288*9a0e4156SSadaf Ebrahimi ARMII_MO_PLT
289*9a0e4156SSadaf Ebrahimi };
290*9a0e4156SSadaf Ebrahimi
291*9a0e4156SSadaf Ebrahimi enum {
292*9a0e4156SSadaf Ebrahimi //===------------------------------------------------------------------===//
293*9a0e4156SSadaf Ebrahimi // Instruction Flags.
294*9a0e4156SSadaf Ebrahimi
295*9a0e4156SSadaf Ebrahimi //===------------------------------------------------------------------===//
296*9a0e4156SSadaf Ebrahimi // This four-bit field describes the addressing mode used.
297*9a0e4156SSadaf Ebrahimi ARMII_AddrModeMask = 0x1f, // The AddrMode enums are declared in ARMBaseInfo.h
298*9a0e4156SSadaf Ebrahimi
299*9a0e4156SSadaf Ebrahimi // IndexMode - Unindex, pre-indexed, or post-indexed are valid for load
300*9a0e4156SSadaf Ebrahimi // and store ops only. Generic "updating" flag is used for ld/st multiple.
301*9a0e4156SSadaf Ebrahimi // The index mode enums are declared in ARMBaseInfo.h
302*9a0e4156SSadaf Ebrahimi ARMII_IndexModeShift = 5,
303*9a0e4156SSadaf Ebrahimi ARMII_IndexModeMask = 3 << ARMII_IndexModeShift,
304*9a0e4156SSadaf Ebrahimi
305*9a0e4156SSadaf Ebrahimi //===------------------------------------------------------------------===//
306*9a0e4156SSadaf Ebrahimi // Instruction encoding formats.
307*9a0e4156SSadaf Ebrahimi //
308*9a0e4156SSadaf Ebrahimi ARMII_FormShift = 7,
309*9a0e4156SSadaf Ebrahimi ARMII_FormMask = 0x3f << ARMII_FormShift,
310*9a0e4156SSadaf Ebrahimi
311*9a0e4156SSadaf Ebrahimi // Pseudo instructions
312*9a0e4156SSadaf Ebrahimi ARMII_Pseudo = 0 << ARMII_FormShift,
313*9a0e4156SSadaf Ebrahimi
314*9a0e4156SSadaf Ebrahimi // Multiply instructions
315*9a0e4156SSadaf Ebrahimi ARMII_MulFrm = 1 << ARMII_FormShift,
316*9a0e4156SSadaf Ebrahimi
317*9a0e4156SSadaf Ebrahimi // Branch instructions
318*9a0e4156SSadaf Ebrahimi ARMII_BrFrm = 2 << ARMII_FormShift,
319*9a0e4156SSadaf Ebrahimi ARMII_BrMiscFrm = 3 << ARMII_FormShift,
320*9a0e4156SSadaf Ebrahimi
321*9a0e4156SSadaf Ebrahimi // Data Processing instructions
322*9a0e4156SSadaf Ebrahimi ARMII_DPFrm = 4 << ARMII_FormShift,
323*9a0e4156SSadaf Ebrahimi ARMII_DPSoRegFrm = 5 << ARMII_FormShift,
324*9a0e4156SSadaf Ebrahimi
325*9a0e4156SSadaf Ebrahimi // Load and Store
326*9a0e4156SSadaf Ebrahimi ARMII_LdFrm = 6 << ARMII_FormShift,
327*9a0e4156SSadaf Ebrahimi ARMII_StFrm = 7 << ARMII_FormShift,
328*9a0e4156SSadaf Ebrahimi ARMII_LdMiscFrm = 8 << ARMII_FormShift,
329*9a0e4156SSadaf Ebrahimi ARMII_StMiscFrm = 9 << ARMII_FormShift,
330*9a0e4156SSadaf Ebrahimi ARMII_LdStMulFrm = 10 << ARMII_FormShift,
331*9a0e4156SSadaf Ebrahimi
332*9a0e4156SSadaf Ebrahimi ARMII_LdStExFrm = 11 << ARMII_FormShift,
333*9a0e4156SSadaf Ebrahimi
334*9a0e4156SSadaf Ebrahimi // Miscellaneous arithmetic instructions
335*9a0e4156SSadaf Ebrahimi ARMII_ArithMiscFrm = 12 << ARMII_FormShift,
336*9a0e4156SSadaf Ebrahimi ARMII_SatFrm = 13 << ARMII_FormShift,
337*9a0e4156SSadaf Ebrahimi
338*9a0e4156SSadaf Ebrahimi // Extend instructions
339*9a0e4156SSadaf Ebrahimi ARMII_ExtFrm = 14 << ARMII_FormShift,
340*9a0e4156SSadaf Ebrahimi
341*9a0e4156SSadaf Ebrahimi // VFP formats
342*9a0e4156SSadaf Ebrahimi ARMII_VFPUnaryFrm = 15 << ARMII_FormShift,
343*9a0e4156SSadaf Ebrahimi ARMII_VFPBinaryFrm = 16 << ARMII_FormShift,
344*9a0e4156SSadaf Ebrahimi ARMII_VFPConv1Frm = 17 << ARMII_FormShift,
345*9a0e4156SSadaf Ebrahimi ARMII_VFPConv2Frm = 18 << ARMII_FormShift,
346*9a0e4156SSadaf Ebrahimi ARMII_VFPConv3Frm = 19 << ARMII_FormShift,
347*9a0e4156SSadaf Ebrahimi ARMII_VFPConv4Frm = 20 << ARMII_FormShift,
348*9a0e4156SSadaf Ebrahimi ARMII_VFPConv5Frm = 21 << ARMII_FormShift,
349*9a0e4156SSadaf Ebrahimi ARMII_VFPLdStFrm = 22 << ARMII_FormShift,
350*9a0e4156SSadaf Ebrahimi ARMII_VFPLdStMulFrm = 23 << ARMII_FormShift,
351*9a0e4156SSadaf Ebrahimi ARMII_VFPMiscFrm = 24 << ARMII_FormShift,
352*9a0e4156SSadaf Ebrahimi
353*9a0e4156SSadaf Ebrahimi // Thumb format
354*9a0e4156SSadaf Ebrahimi ARMII_ThumbFrm = 25 << ARMII_FormShift,
355*9a0e4156SSadaf Ebrahimi
356*9a0e4156SSadaf Ebrahimi // Miscelleaneous format
357*9a0e4156SSadaf Ebrahimi ARMII_MiscFrm = 26 << ARMII_FormShift,
358*9a0e4156SSadaf Ebrahimi
359*9a0e4156SSadaf Ebrahimi // NEON formats
360*9a0e4156SSadaf Ebrahimi ARMII_NGetLnFrm = 27 << ARMII_FormShift,
361*9a0e4156SSadaf Ebrahimi ARMII_NSetLnFrm = 28 << ARMII_FormShift,
362*9a0e4156SSadaf Ebrahimi ARMII_NDupFrm = 29 << ARMII_FormShift,
363*9a0e4156SSadaf Ebrahimi ARMII_NLdStFrm = 30 << ARMII_FormShift,
364*9a0e4156SSadaf Ebrahimi ARMII_N1RegModImmFrm= 31 << ARMII_FormShift,
365*9a0e4156SSadaf Ebrahimi ARMII_N2RegFrm = 32 << ARMII_FormShift,
366*9a0e4156SSadaf Ebrahimi ARMII_NVCVTFrm = 33 << ARMII_FormShift,
367*9a0e4156SSadaf Ebrahimi ARMII_NVDupLnFrm = 34 << ARMII_FormShift,
368*9a0e4156SSadaf Ebrahimi ARMII_N2RegVShLFrm = 35 << ARMII_FormShift,
369*9a0e4156SSadaf Ebrahimi ARMII_N2RegVShRFrm = 36 << ARMII_FormShift,
370*9a0e4156SSadaf Ebrahimi ARMII_N3RegFrm = 37 << ARMII_FormShift,
371*9a0e4156SSadaf Ebrahimi ARMII_N3RegVShFrm = 38 << ARMII_FormShift,
372*9a0e4156SSadaf Ebrahimi ARMII_NVExtFrm = 39 << ARMII_FormShift,
373*9a0e4156SSadaf Ebrahimi ARMII_NVMulSLFrm = 40 << ARMII_FormShift,
374*9a0e4156SSadaf Ebrahimi ARMII_NVTBLFrm = 41 << ARMII_FormShift,
375*9a0e4156SSadaf Ebrahimi
376*9a0e4156SSadaf Ebrahimi //===------------------------------------------------------------------===//
377*9a0e4156SSadaf Ebrahimi // Misc flags.
378*9a0e4156SSadaf Ebrahimi
379*9a0e4156SSadaf Ebrahimi // UnaryDP - Indicates this is a unary data processing instruction, i.e.
380*9a0e4156SSadaf Ebrahimi // it doesn't have a Rn operand.
381*9a0e4156SSadaf Ebrahimi ARMII_UnaryDP = 1 << 13,
382*9a0e4156SSadaf Ebrahimi
383*9a0e4156SSadaf Ebrahimi // Xform16Bit - Indicates this Thumb2 instruction may be transformed into
384*9a0e4156SSadaf Ebrahimi // a 16-bit Thumb instruction if certain conditions are met.
385*9a0e4156SSadaf Ebrahimi ARMII_Xform16Bit = 1 << 14,
386*9a0e4156SSadaf Ebrahimi
387*9a0e4156SSadaf Ebrahimi // ThumbArithFlagSetting - The instruction is a 16-bit flag setting Thumb
388*9a0e4156SSadaf Ebrahimi // instruction. Used by the parser to determine whether to require the 'S'
389*9a0e4156SSadaf Ebrahimi // suffix on the mnemonic (when not in an IT block) or preclude it (when
390*9a0e4156SSadaf Ebrahimi // in an IT block).
391*9a0e4156SSadaf Ebrahimi ARMII_ThumbArithFlagSetting = 1 << 18,
392*9a0e4156SSadaf Ebrahimi
393*9a0e4156SSadaf Ebrahimi //===------------------------------------------------------------------===//
394*9a0e4156SSadaf Ebrahimi // Code domain.
395*9a0e4156SSadaf Ebrahimi ARMII_DomainShift = 15,
396*9a0e4156SSadaf Ebrahimi ARMII_DomainMask = 7 << ARMII_DomainShift,
397*9a0e4156SSadaf Ebrahimi ARMII_DomainGeneral = 0 << ARMII_DomainShift,
398*9a0e4156SSadaf Ebrahimi ARMII_DomainVFP = 1 << ARMII_DomainShift,
399*9a0e4156SSadaf Ebrahimi ARMII_DomainNEON = 2 << ARMII_DomainShift,
400*9a0e4156SSadaf Ebrahimi ARMII_DomainNEONA8 = 4 << ARMII_DomainShift,
401*9a0e4156SSadaf Ebrahimi
402*9a0e4156SSadaf Ebrahimi //===------------------------------------------------------------------===//
403*9a0e4156SSadaf Ebrahimi // Field shifts - such shifts are used to set field while generating
404*9a0e4156SSadaf Ebrahimi // machine instructions.
405*9a0e4156SSadaf Ebrahimi //
406*9a0e4156SSadaf Ebrahimi // FIXME: This list will need adjusting/fixing as the MC code emitter
407*9a0e4156SSadaf Ebrahimi // takes shape and the ARMCodeEmitter.cpp bits go away.
408*9a0e4156SSadaf Ebrahimi ARMII_ShiftTypeShift = 4,
409*9a0e4156SSadaf Ebrahimi
410*9a0e4156SSadaf Ebrahimi ARMII_M_BitShift = 5,
411*9a0e4156SSadaf Ebrahimi ARMII_ShiftImmShift = 5,
412*9a0e4156SSadaf Ebrahimi ARMII_ShiftShift = 7,
413*9a0e4156SSadaf Ebrahimi ARMII_N_BitShift = 7,
414*9a0e4156SSadaf Ebrahimi ARMII_ImmHiShift = 8,
415*9a0e4156SSadaf Ebrahimi ARMII_SoRotImmShift = 8,
416*9a0e4156SSadaf Ebrahimi ARMII_RegRsShift = 8,
417*9a0e4156SSadaf Ebrahimi ARMII_ExtRotImmShift = 10,
418*9a0e4156SSadaf Ebrahimi ARMII_RegRdLoShift = 12,
419*9a0e4156SSadaf Ebrahimi ARMII_RegRdShift = 12,
420*9a0e4156SSadaf Ebrahimi ARMII_RegRdHiShift = 16,
421*9a0e4156SSadaf Ebrahimi ARMII_RegRnShift = 16,
422*9a0e4156SSadaf Ebrahimi ARMII_S_BitShift = 20,
423*9a0e4156SSadaf Ebrahimi ARMII_W_BitShift = 21,
424*9a0e4156SSadaf Ebrahimi ARMII_AM3_I_BitShift = 22,
425*9a0e4156SSadaf Ebrahimi ARMII_D_BitShift = 22,
426*9a0e4156SSadaf Ebrahimi ARMII_U_BitShift = 23,
427*9a0e4156SSadaf Ebrahimi ARMII_P_BitShift = 24,
428*9a0e4156SSadaf Ebrahimi ARMII_I_BitShift = 25,
429*9a0e4156SSadaf Ebrahimi ARMII_CondShift = 28
430*9a0e4156SSadaf Ebrahimi };
431*9a0e4156SSadaf Ebrahimi
432*9a0e4156SSadaf Ebrahimi #endif
433