xref: /aosp_15_r20/external/capstone/arch/ARM/ARMBaseInfo.h (revision 9a0e4156d50a75a99ec4f1653a0e9602a5d45c18)
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