blob: 0ee821d3f1043bdb97a7cf80e199f42ebc9f952d [file] [log] [blame]
Bill Buzbee89efc3d2009-07-28 11:22:22 -07001/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "Dalvik.h"
18#include "compiler/CompilerInternals.h"
19
20#ifndef _DALVIK_VM_COMPILER_CODEGEN_ARM_ARMLIR_H
21#define _DALVIK_VM_COMPILER_CODEGEN_ARM_ARMLIR_H
22
23/*
Bill Buzbee9bc3df32009-07-30 10:52:29 -070024 * r0, r1, r2, r3 are always scratch
25 * r4 (rPC) is scratch for Jit, but most be restored when resuming interp
26 * r5 (rFP) is reserved [holds Dalvik frame pointer]
27 * r6 (rGLUE) is reserved [holds current &interpState]
28 * r7 (rINST) is scratch for Jit
29 * r8 (rIBASE) is scratch for Jit, but must be restored when resuming interp
Bill Buzbee270c1d62009-08-13 16:58:07 -070030 * r9 is reserved
Bill Buzbee9bc3df32009-07-30 10:52:29 -070031 * r10 is always scratch
32 * r11 (fp) used by gcc unless -fomit-frame-pointer set [available for jit?]
33 * r12 is always scratch
34 * r13 (sp) is reserved
35 * r14 (lr) is scratch for Jit
36 * r15 (pc) is reserved
37 *
Bill Buzbee270c1d62009-08-13 16:58:07 -070038 * Preserved across C calls: r4, r5, r6, r7, r8, r10, r11
39 * Trashed across C calls: r0, r1, r2, r3, r12, r14
40 *
41 * Floating pointer registers
42 * s0-s31
43 * d0-d15, where d0={s0,s1}, d1={s2,s3}, ... , d15={s30,s31}
44 *
45 * s16-s31 (d8-d15) preserved across C calls
46 * s0-s15 (d0-d7) trashed across C calls
47 *
Bill Buzbee9bc3df32009-07-30 10:52:29 -070048 * For Thumb code use:
Bill Buzbee270c1d62009-08-13 16:58:07 -070049 * r0, r1, r2, r3 to hold operands/results
Bill Buzbee9bc3df32009-07-30 10:52:29 -070050 * r4, r7 for temps
51 *
52 * For Thumb2 code use:
Bill Buzbee270c1d62009-08-13 16:58:07 -070053 * r0, r1, r2, r3, r8, r9, r10, r11, r12, r14 for operands/results
54 * r4, r7 for temps
55 * s16-s31/d8-d15 for operands/results
56 * s0-s15/d0-d7 for temps
Bill Buzbee9bc3df32009-07-30 10:52:29 -070057 *
58 * When transitioning from code cache to interp:
59 * restore rIBASE
60 * restore rPC
Bill Buzbee270c1d62009-08-13 16:58:07 -070061 * restore r11?
Bill Buzbee89efc3d2009-07-28 11:22:22 -070062 */
Bill Buzbee9bc3df32009-07-30 10:52:29 -070063
64/* Offset to distingish FP regs */
65#define FP_REG_OFFSET 32
Bill Buzbee7ea0f642009-08-10 17:06:51 -070066/* Offset to distinguish DP FP regs */
67#define FP_DOUBLE 64
68/* Reg types */
Ben Chengd7d426a2009-09-22 11:23:36 -070069#define REGTYPE(x) (x & (FP_REG_OFFSET | FP_DOUBLE))
Bill Buzbee7ea0f642009-08-10 17:06:51 -070070#define FPREG(x) ((x & FP_REG_OFFSET) == FP_REG_OFFSET)
71#define LOWREG(x) ((x & 0x7) == x)
72#define DOUBLEREG(x) ((x & FP_DOUBLE) == FP_DOUBLE)
73#define SINGLEREG(x) (FPREG(x) && !DOUBLEREG(x))
Bill Buzbee1465db52009-09-23 17:17:35 -070074/*
75 * Note: the low register of a floating point pair is sufficient to
76 * create the name of a double, but require both names to be passed to
77 * allow for asserts to verify that the pair is consecutive if significant
78 * rework is done in this area. Also, it is a good reminder in the calling
79 * code that reg locations always describe doubles as a pair of singles.
80 */
81#define S2D(x,y) ((x) | FP_DOUBLE)
Bill Buzbee9bc3df32009-07-30 10:52:29 -070082/* Mask to strip off fp flags */
83#define FP_REG_MASK (FP_REG_OFFSET-1)
Bill Buzbee270c1d62009-08-13 16:58:07 -070084/* non-existent Dalvik register */
85#define vNone (-1)
86/* non-existant physical register */
87#define rNone (-1)
Bill Buzbee9bc3df32009-07-30 10:52:29 -070088
Bill Buzbee1465db52009-09-23 17:17:35 -070089/* RegisterLocation templates return values (r0, or r0/r1) */
90#define LOC_C_RETURN {kLocPhysReg, 0, 0, r0, 0, -1}
91#define LOC_C_RETURN_WIDE {kLocPhysReg, 1, 0, r0, r1, -1}
92/* RegisterLocation templates for interpState->retVal; */
93#define LOC_DALVIK_RETURN_VAL {kLocRetval, 0, 0, 0, 0, -1}
94#define LOC_DALVIK_RETURN_VAL_WIDE {kLocRetval, 1, 0, 0, 0, -1}
95
96 /*
97 * Data structure tracking the mapping between a Dalvik register (pair) and a
98 * native register (pair). The idea is to reuse the previously loaded value
99 * if possible, otherwise to keep the value in a native register as long as
100 * possible.
101 */
102typedef struct RegisterInfo {
103 int reg; // Reg number
104 bool inUse; // Has it been allocated?
105 bool pair; // Part of a register pair?
106 int partner; // If pair, other reg of pair
107 bool live; // Is there an associated SSA name?
108 bool dirty; // If live, is it dirty?
109 int sReg; // Name of live value
110 struct LIR *defStart; // Starting inst in last def sequence
111 struct LIR *defEnd; // Ending inst in last def sequence
112} RegisterInfo;
113
114typedef struct RegisterPool {
115 BitVector *nullCheckedRegs; // Track which registers have been null-checked
116 int numCoreTemps;
117 RegisterInfo *coreTemps;
Bill Buzbee1f748632010-03-02 16:14:41 -0800118 int nextCoreTemp;
Bill Buzbee1465db52009-09-23 17:17:35 -0700119 int numFPTemps;
120 RegisterInfo *FPTemps;
Bill Buzbee1f748632010-03-02 16:14:41 -0800121 int nextFPTemp;
Bill Buzbee1465db52009-09-23 17:17:35 -0700122} RegisterPool;
123
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700124typedef enum ResourceEncodingPos {
125 kGPReg0 = 0,
126 kRegSP = 13,
127 kRegLR = 14,
128 kRegPC = 15,
129 kFPReg0 = 16,
Ben Chengd7d426a2009-09-22 11:23:36 -0700130 kRegEnd = 48,
131 kCCode = kRegEnd,
132 kFPStatus,
133 kDalvikReg,
Bill Buzbee1f748632010-03-02 16:14:41 -0800134 kLiteral,
135 kFrameRef,
136 kHeapRef,
137 kLitPoolRef
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700138} ResourceEncodingPos;
139
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700140#define ENCODE_REG_LIST(N) ((u8) N)
141#define ENCODE_REG_SP (1ULL << kRegSP)
142#define ENCODE_REG_LR (1ULL << kRegLR)
143#define ENCODE_REG_PC (1ULL << kRegPC)
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700144#define ENCODE_CCODE (1ULL << kCCode)
145#define ENCODE_FP_STATUS (1ULL << kFPStatus)
Bill Buzbee1f748632010-03-02 16:14:41 -0800146
147 /* Must alias */
Ben Chengd7d426a2009-09-22 11:23:36 -0700148#define ENCODE_DALVIK_REG (1ULL << kDalvikReg)
Bill Buzbee1f748632010-03-02 16:14:41 -0800149#define ENCODE_LITERAL (1ULL << kLiteral)
150
151 /* May alias */
152#define ENCODE_FRAME_REF (1ULL << kFrameRef)
153#define ENCODE_HEAP_REF (1ULL << kHeapRef)
154#define ENCODE_LITPOOL_REF (1ULL << kLitPoolRef)
155
Ben Chengd7d426a2009-09-22 11:23:36 -0700156#define ENCODE_ALL (~0ULL)
Bill Buzbee1f748632010-03-02 16:14:41 -0800157#define ENCODE_MEM_DEF (ENCODE_FRAME_REF | ENCODE_HEAP_REF)
158#define ENCODE_MEM_USE (ENCODE_FRAME_REF | ENCODE_HEAP_REF \
159 | ENCODE_LITPOOL_REF)
Ben Chengd7d426a2009-09-22 11:23:36 -0700160
161#define DECODE_ALIAS_INFO_REG(X) (X & 0xffff)
162#define DECODE_ALIAS_INFO_WIDE(X) ((X & 0x80000000) ? 1 : 0)
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700163
Bill Buzbee270c1d62009-08-13 16:58:07 -0700164typedef enum OpSize {
Bill Buzbee1465db52009-09-23 17:17:35 -0700165 kWord,
166 kLong,
167 kSingle,
168 kDouble,
169 kUnsignedHalf,
170 kSignedHalf,
171 kUnsignedByte,
172 kSignedByte,
Bill Buzbee270c1d62009-08-13 16:58:07 -0700173} OpSize;
174
175typedef enum OpKind {
Bill Buzbee1465db52009-09-23 17:17:35 -0700176 kOpMov,
177 kOpMvn,
178 kOpCmp,
179 kOpLsl,
180 kOpLsr,
181 kOpAsr,
182 kOpRor,
183 kOpNot,
184 kOpAnd,
185 kOpOr,
186 kOpXor,
187 kOpNeg,
188 kOpAdd,
189 kOpAdc,
190 kOpSub,
191 kOpSbc,
192 kOpRsub,
193 kOpMul,
194 kOpDiv,
195 kOpRem,
196 kOpBic,
197 kOpCmn,
198 kOpTst,
199 kOpBkpt,
200 kOpBlx,
201 kOpPush,
202 kOpPop,
203 kOp2Char,
204 kOp2Short,
205 kOp2Byte,
206 kOpCondBr,
207 kOpUncondBr,
Bill Buzbee270c1d62009-08-13 16:58:07 -0700208} OpKind;
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700209
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700210typedef enum NativeRegisterPool {
211 r0 = 0,
212 r1 = 1,
213 r2 = 2,
214 r3 = 3,
215 r4PC = 4,
216 rFP = 5,
217 rGLUE = 6,
218 r7 = 7,
219 r8 = 8,
220 r9 = 9,
221 r10 = 10,
222 r11 = 11,
223 r12 = 12,
224 r13 = 13,
225 rlr = 14,
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700226 rpc = 15,
227 fr0 = 0 + FP_REG_OFFSET,
228 fr1 = 1 + FP_REG_OFFSET,
229 fr2 = 2 + FP_REG_OFFSET,
230 fr3 = 3 + FP_REG_OFFSET,
231 fr4 = 4 + FP_REG_OFFSET,
232 fr5 = 5 + FP_REG_OFFSET,
233 fr6 = 6 + FP_REG_OFFSET,
234 fr7 = 7 + FP_REG_OFFSET,
235 fr8 = 8 + FP_REG_OFFSET,
236 fr9 = 9 + FP_REG_OFFSET,
237 fr10 = 10 + FP_REG_OFFSET,
238 fr11 = 11 + FP_REG_OFFSET,
239 fr12 = 12 + FP_REG_OFFSET,
240 fr13 = 13 + FP_REG_OFFSET,
241 fr14 = 14 + FP_REG_OFFSET,
242 fr15 = 15 + FP_REG_OFFSET,
243 fr16 = 16 + FP_REG_OFFSET,
244 fr17 = 17 + FP_REG_OFFSET,
245 fr18 = 18 + FP_REG_OFFSET,
246 fr19 = 19 + FP_REG_OFFSET,
247 fr20 = 20 + FP_REG_OFFSET,
248 fr21 = 21 + FP_REG_OFFSET,
249 fr22 = 22 + FP_REG_OFFSET,
250 fr23 = 23 + FP_REG_OFFSET,
251 fr24 = 24 + FP_REG_OFFSET,
252 fr25 = 25 + FP_REG_OFFSET,
253 fr26 = 26 + FP_REG_OFFSET,
254 fr27 = 27 + FP_REG_OFFSET,
255 fr28 = 28 + FP_REG_OFFSET,
256 fr29 = 29 + FP_REG_OFFSET,
257 fr30 = 30 + FP_REG_OFFSET,
258 fr31 = 31 + FP_REG_OFFSET,
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700259 dr0 = fr0 + FP_DOUBLE,
260 dr1 = fr2 + FP_DOUBLE,
261 dr2 = fr4 + FP_DOUBLE,
262 dr3 = fr6 + FP_DOUBLE,
263 dr4 = fr8 + FP_DOUBLE,
264 dr5 = fr10 + FP_DOUBLE,
265 dr6 = fr12 + FP_DOUBLE,
266 dr7 = fr14 + FP_DOUBLE,
267 dr8 = fr16 + FP_DOUBLE,
268 dr9 = fr18 + FP_DOUBLE,
269 dr10 = fr20 + FP_DOUBLE,
270 dr11 = fr22 + FP_DOUBLE,
271 dr12 = fr24 + FP_DOUBLE,
272 dr13 = fr26 + FP_DOUBLE,
273 dr14 = fr28 + FP_DOUBLE,
274 dr15 = fr30 + FP_DOUBLE,
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700275} NativeRegisterPool;
276
Bill Buzbee1465db52009-09-23 17:17:35 -0700277/* Shift encodings */
278typedef enum ArmShiftEncodings {
279 kArmLsl = 0x0,
280 kArmLsr = 0x1,
281 kArmAsr = 0x2,
282 kArmRor = 0x3
283} ArmShiftEncodings;
284
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700285/* Thumb condition encodings */
286typedef enum ArmConditionCode {
Bill Buzbee1465db52009-09-23 17:17:35 -0700287 kArmCondEq = 0x0, /* 0000 */
288 kArmCondNe = 0x1, /* 0001 */
289 kArmCondCs = 0x2, /* 0010 */
290 kArmCondCc = 0x3, /* 0011 */
291 kArmCondMi = 0x4, /* 0100 */
292 kArmCondPl = 0x5, /* 0101 */
293 kArmCondVs = 0x6, /* 0110 */
294 kArmCondVc = 0x7, /* 0111 */
295 kArmCondHi = 0x8, /* 1000 */
296 kArmCondLs = 0x9, /* 1001 */
297 kArmCondGe = 0xa, /* 1010 */
298 kArmCondLt = 0xb, /* 1011 */
299 kArmCondGt = 0xc, /* 1100 */
300 kArmCondLe = 0xd, /* 1101 */
301 kArmCondAl = 0xe, /* 1110 */
302 kArmCondNv = 0xf, /* 1111 */
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700303} ArmConditionCode;
304
Dan Bornstein9a1f8162010-12-01 17:02:26 -0800305#define isPseudoOpcode(opcode) ((int)(opcode) < 0)
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700306
307/*
308 * The following enum defines the list of supported Thumb instructions by the
309 * assembler. Their corresponding snippet positions will be defined in
310 * Assemble.c.
311 */
Dan Bornstein9a1f8162010-12-01 17:02:26 -0800312typedef enum ArmOpcode {
Ben Chengcec26f62010-01-15 15:29:33 -0800313 kArmChainingCellBottom = -18,
Bill Buzbee1465db52009-09-23 17:17:35 -0700314 kArmPseudoBarrier = -17,
315 kArmPseudoExtended = -16,
316 kArmPseudoSSARep = -15,
Ben Chenga4973592010-03-31 11:59:18 -0700317 kArmPseudoEntryBlock = -14,
318 kArmPseudoExitBlock = -13,
Bill Buzbee1465db52009-09-23 17:17:35 -0700319 kArmPseudoTargetLabel = -12,
Ben Chenga4973592010-03-31 11:59:18 -0700320 kArmPseudoChainingCellBackwardBranch = -11,
321 kArmPseudoChainingCellHot = -10,
322 kArmPseudoChainingCellInvokePredicted = -9,
323 kArmPseudoChainingCellInvokeSingleton = -8,
324 kArmPseudoChainingCellNormal = -7,
325 kArmPseudoDalvikByteCodeBoundary = -6,
Bill Buzbee1465db52009-09-23 17:17:35 -0700326 kArmPseudoPseudoAlign4 = -5,
Ben Chenga4973592010-03-31 11:59:18 -0700327 kArmPseudoPCReconstructionCell = -4,
328 kArmPseudoPCReconstructionBlockLabel = -3,
Bill Buzbee1465db52009-09-23 17:17:35 -0700329 kArmPseudoEHBlockLabel = -2,
330 kArmPseudoNormalBlockLabel = -1,
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700331 /************************************************************************/
Bill Buzbee1465db52009-09-23 17:17:35 -0700332 kArm16BitData, /* DATA [0] rd[15..0] */
333 kThumbAdcRR, /* adc [0100000101] rm[5..3] rd[2..0] */
334 kThumbAddRRI3, /* add(1) [0001110] imm_3[8..6] rn[5..3] rd[2..0]*/
335 kThumbAddRI8, /* add(2) [00110] rd[10..8] imm_8[7..0] */
336 kThumbAddRRR, /* add(3) [0001100] rm[8..6] rn[5..3] rd[2..0] */
337 kThumbAddRRLH, /* add(4) [01000100] H12[01] rm[5..3] rd[2..0] */
338 kThumbAddRRHL, /* add(4) [01001000] H12[10] rm[5..3] rd[2..0] */
339 kThumbAddRRHH, /* add(4) [01001100] H12[11] rm[5..3] rd[2..0] */
340 kThumbAddPcRel, /* add(5) [10100] rd[10..8] imm_8[7..0] */
341 kThumbAddSpRel, /* add(6) [10101] rd[10..8] imm_8[7..0] */
342 kThumbAddSpI7, /* add(7) [101100000] imm_7[6..0] */
343 kThumbAndRR, /* and [0100000000] rm[5..3] rd[2..0] */
344 kThumbAsrRRI5, /* asr(1) [00010] imm_5[10..6] rm[5..3] rd[2..0] */
345 kThumbAsrRR, /* asr(2) [0100000100] rs[5..3] rd[2..0] */
346 kThumbBCond, /* b(1) [1101] cond[11..8] offset_8[7..0] */
347 kThumbBUncond, /* b(2) [11100] offset_11[10..0] */
348 kThumbBicRR, /* bic [0100001110] rm[5..3] rd[2..0] */
349 kThumbBkpt, /* bkpt [10111110] imm_8[7..0] */
350 kThumbBlx1, /* blx(1) [111] H[10] offset_11[10..0] */
351 kThumbBlx2, /* blx(1) [111] H[01] offset_11[10..0] */
352 kThumbBl1, /* blx(1) [111] H[10] offset_11[10..0] */
353 kThumbBl2, /* blx(1) [111] H[11] offset_11[10..0] */
354 kThumbBlxR, /* blx(2) [010001111] rm[6..3] [000] */
355 kThumbBx, /* bx [010001110] H2[6..6] rm[5..3] SBZ[000] */
356 kThumbCmnRR, /* cmn [0100001011] rm[5..3] rd[2..0] */
357 kThumbCmpRI8, /* cmp(1) [00101] rn[10..8] imm_8[7..0] */
358 kThumbCmpRR, /* cmp(2) [0100001010] rm[5..3] rd[2..0] */
359 kThumbCmpLH, /* cmp(3) [01000101] H12[01] rm[5..3] rd[2..0] */
360 kThumbCmpHL, /* cmp(3) [01000110] H12[10] rm[5..3] rd[2..0] */
361 kThumbCmpHH, /* cmp(3) [01000111] H12[11] rm[5..3] rd[2..0] */
362 kThumbEorRR, /* eor [0100000001] rm[5..3] rd[2..0] */
363 kThumbLdmia, /* ldmia [11001] rn[10..8] reglist [7..0] */
364 kThumbLdrRRI5, /* ldr(1) [01101] imm_5[10..6] rn[5..3] rd[2..0] */
365 kThumbLdrRRR, /* ldr(2) [0101100] rm[8..6] rn[5..3] rd[2..0] */
366 kThumbLdrPcRel, /* ldr(3) [01001] rd[10..8] imm_8[7..0] */
367 kThumbLdrSpRel, /* ldr(4) [10011] rd[10..8] imm_8[7..0] */
368 kThumbLdrbRRI5, /* ldrb(1) [01111] imm_5[10..6] rn[5..3] rd[2..0] */
369 kThumbLdrbRRR, /* ldrb(2) [0101110] rm[8..6] rn[5..3] rd[2..0] */
370 kThumbLdrhRRI5, /* ldrh(1) [10001] imm_5[10..6] rn[5..3] rd[2..0] */
371 kThumbLdrhRRR, /* ldrh(2) [0101101] rm[8..6] rn[5..3] rd[2..0] */
372 kThumbLdrsbRRR, /* ldrsb [0101011] rm[8..6] rn[5..3] rd[2..0] */
373 kThumbLdrshRRR, /* ldrsh [0101111] rm[8..6] rn[5..3] rd[2..0] */
374 kThumbLslRRI5, /* lsl(1) [00000] imm_5[10..6] rm[5..3] rd[2..0] */
375 kThumbLslRR, /* lsl(2) [0100000010] rs[5..3] rd[2..0] */
376 kThumbLsrRRI5, /* lsr(1) [00001] imm_5[10..6] rm[5..3] rd[2..0] */
377 kThumbLsrRR, /* lsr(2) [0100000011] rs[5..3] rd[2..0] */
378 kThumbMovImm, /* mov(1) [00100] rd[10..8] imm_8[7..0] */
379 kThumbMovRR, /* mov(2) [0001110000] rn[5..3] rd[2..0] */
380 kThumbMovRR_H2H, /* mov(3) [01000111] H12[11] rm[5..3] rd[2..0] */
381 kThumbMovRR_H2L, /* mov(3) [01000110] H12[01] rm[5..3] rd[2..0] */
382 kThumbMovRR_L2H, /* mov(3) [01000101] H12[10] rm[5..3] rd[2..0] */
383 kThumbMul, /* mul [0100001101] rm[5..3] rd[2..0] */
384 kThumbMvn, /* mvn [0100001111] rm[5..3] rd[2..0] */
385 kThumbNeg, /* neg [0100001001] rm[5..3] rd[2..0] */
386 kThumbOrr, /* orr [0100001100] rm[5..3] rd[2..0] */
387 kThumbPop, /* pop [1011110] r[8..8] rl[7..0] */
388 kThumbPush, /* push [1011010] r[8..8] rl[7..0] */
Bill Buzbee799cdf92009-10-30 15:00:52 -0700389 kThumbRorRR, /* ror [0100000111] rs[5..3] rd[2..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700390 kThumbSbc, /* sbc [0100000110] rm[5..3] rd[2..0] */
391 kThumbStmia, /* stmia [11000] rn[10..8] reglist [7.. 0] */
392 kThumbStrRRI5, /* str(1) [01100] imm_5[10..6] rn[5..3] rd[2..0] */
393 kThumbStrRRR, /* str(2) [0101000] rm[8..6] rn[5..3] rd[2..0] */
394 kThumbStrSpRel, /* str(3) [10010] rd[10..8] imm_8[7..0] */
395 kThumbStrbRRI5, /* strb(1) [01110] imm_5[10..6] rn[5..3] rd[2..0] */
396 kThumbStrbRRR, /* strb(2) [0101010] rm[8..6] rn[5..3] rd[2..0] */
397 kThumbStrhRRI5, /* strh(1) [10000] imm_5[10..6] rn[5..3] rd[2..0] */
398 kThumbStrhRRR, /* strh(2) [0101001] rm[8..6] rn[5..3] rd[2..0] */
399 kThumbSubRRI3, /* sub(1) [0001111] imm_3[8..6] rn[5..3] rd[2..0]*/
400 kThumbSubRI8, /* sub(2) [00111] rd[10..8] imm_8[7..0] */
401 kThumbSubRRR, /* sub(3) [0001101] rm[8..6] rn[5..3] rd[2..0] */
402 kThumbSubSpI7, /* sub(4) [101100001] imm_7[6..0] */
403 kThumbSwi, /* swi [11011111] imm_8[7..0] */
404 kThumbTst, /* tst [0100001000] rm[5..3] rn[2..0] */
405 kThumb2Vldrs, /* vldr low sx [111011011001] rn[19..16] rd[15-12]
406 [1010] imm_8[7..0] */
407 kThumb2Vldrd, /* vldr low dx [111011011001] rn[19..16] rd[15-12]
408 [1011] imm_8[7..0] */
409 kThumb2Vmuls, /* vmul vd, vn, vm [111011100010] rn[19..16]
410 rd[15-12] [10100000] rm[3..0] */
411 kThumb2Vmuld, /* vmul vd, vn, vm [111011100010] rn[19..16]
412 rd[15-12] [10110000] rm[3..0] */
413 kThumb2Vstrs, /* vstr low sx [111011011000] rn[19..16] rd[15-12]
414 [1010] imm_8[7..0] */
415 kThumb2Vstrd, /* vstr low dx [111011011000] rn[19..16] rd[15-12]
416 [1011] imm_8[7..0] */
417 kThumb2Vsubs, /* vsub vd, vn, vm [111011100011] rn[19..16]
418 rd[15-12] [10100040] rm[3..0] */
419 kThumb2Vsubd, /* vsub vd, vn, vm [111011100011] rn[19..16]
420 rd[15-12] [10110040] rm[3..0] */
421 kThumb2Vadds, /* vadd vd, vn, vm [111011100011] rn[19..16]
422 rd[15-12] [10100000] rm[3..0] */
423 kThumb2Vaddd, /* vadd vd, vn, vm [111011100011] rn[19..16]
424 rd[15-12] [10110000] rm[3..0] */
425 kThumb2Vdivs, /* vdiv vd, vn, vm [111011101000] rn[19..16]
426 rd[15-12] [10100000] rm[3..0] */
427 kThumb2Vdivd, /* vdiv vd, vn, vm [111011101000] rn[19..16]
428 rd[15-12] [10110000] rm[3..0] */
429 kThumb2VcvtIF, /* vcvt.F32 vd, vm [1110111010111000] vd[15..12]
430 [10101100] vm[3..0] */
431 kThumb2VcvtID, /* vcvt.F64 vd, vm [1110111010111000] vd[15..12]
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700432 [10111100] vm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700433 kThumb2VcvtFI, /* vcvt.S32.F32 vd, vm [1110111010111101] vd[15..12]
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700434 [10101100] vm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700435 kThumb2VcvtDI, /* vcvt.S32.F32 vd, vm [1110111010111101] vd[15..12]
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700436 [10111100] vm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700437 kThumb2VcvtFd, /* vcvt.F64.F32 vd, vm [1110111010110111] vd[15..12]
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700438 [10101100] vm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700439 kThumb2VcvtDF, /* vcvt.F32.F64 vd, vm [1110111010110111] vd[15..12]
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700440 [10111100] vm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700441 kThumb2Vsqrts, /* vsqrt.f32 vd, vm [1110111010110001] vd[15..12]
Bill Buzbee9727c3d2009-08-01 11:32:36 -0700442 [10101100] vm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700443 kThumb2Vsqrtd, /* vsqrt.f64 vd, vm [1110111010110001] vd[15..12]
Bill Buzbee9727c3d2009-08-01 11:32:36 -0700444 [10111100] vm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700445 kThumb2MovImmShift, /* mov(T2) rd, #<const> [11110] i [00001001111]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700446 imm3 rd[11..8] imm8 */
Bill Buzbee1465db52009-09-23 17:17:35 -0700447 kThumb2MovImm16, /* mov(T3) rd, #<const> [11110] i [0010100] imm4 [0]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700448 imm3 rd[11..8] imm8 */
Bill Buzbee1465db52009-09-23 17:17:35 -0700449 kThumb2StrRRI12, /* str(Imm,T3) rd,[rn,#imm12] [111110001100]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700450 rn[19..16] rt[15..12] imm12[11..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700451 kThumb2LdrRRI12, /* str(Imm,T3) rd,[rn,#imm12] [111110001100]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700452 rn[19..16] rt[15..12] imm12[11..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700453 kThumb2StrRRI8Predec, /* str(Imm,T4) rd,[rn,#-imm8] [111110000100]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700454 rn[19..16] rt[15..12] [1100] imm[7..0]*/
Bill Buzbee1465db52009-09-23 17:17:35 -0700455 kThumb2LdrRRI8Predec, /* ldr(Imm,T4) rd,[rn,#-imm8] [111110000101]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700456 rn[19..16] rt[15..12] [1100] imm[7..0]*/
Bill Buzbee1465db52009-09-23 17:17:35 -0700457 kThumb2Cbnz, /* cbnz rd,<label> [101110] i [1] imm5[7..3]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700458 rn[2..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700459 kThumb2Cbz, /* cbn rd,<label> [101100] i [1] imm5[7..3]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700460 rn[2..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700461 kThumb2AddRRI12, /* add rd, rn, #imm12 [11110] i [100000] rn[19..16]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700462 [0] imm3[14..12] rd[11..8] imm8[7..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700463 kThumb2MovRR, /* mov rd, rm [11101010010011110000] rd[11..8]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700464 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700465 kThumb2Vmovs, /* vmov.f32 vd, vm [111011101] D [110000]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700466 vd[15..12] 101001] M [0] vm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700467 kThumb2Vmovd, /* vmov.f64 vd, vm [111011101] D [110000]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700468 vd[15..12] 101101] M [0] vm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700469 kThumb2Ldmia, /* ldmia [111010001001[ rn[19..16] mask[15..0] */
470 kThumb2Stmia, /* stmia [111010001000[ rn[19..16] mask[15..0] */
471 kThumb2AddRRR, /* add [111010110000] rn[19..16] [0000] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700472 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700473 kThumb2SubRRR, /* sub [111010111010] rn[19..16] [0000] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700474 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700475 kThumb2SbcRRR, /* sbc [111010110110] rn[19..16] [0000] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700476 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700477 kThumb2CmpRR, /* cmp [111010111011] rn[19..16] [0000] [1111]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700478 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700479 kThumb2SubRRI12, /* sub rd, rn, #imm12 [11110] i [01010] rn[19..16]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700480 [0] imm3[14..12] rd[11..8] imm8[7..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700481 kThumb2MvnImmShift, /* mov(T2) rd, #<const> [11110] i [00011011110]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700482 imm3 rd[11..8] imm8 */
Bill Buzbee1465db52009-09-23 17:17:35 -0700483 kThumb2Sel, /* sel rd, rn, rm [111110101010] rn[19-16] rd[11-8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700484 rm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700485 kThumb2Ubfx, /* ubfx rd,rn,#lsb,#width [111100111100] rn[19..16]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700486 [0] imm3[14-12] rd[11-8] w[4-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700487 kThumb2Sbfx, /* ubfx rd,rn,#lsb,#width [111100110100] rn[19..16]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700488 [0] imm3[14-12] rd[11-8] w[4-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700489 kThumb2LdrRRR, /* ldr rt,[rn,rm,LSL #imm] [111110000101] rn[19-16]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700490 rt[15-12] [000000] imm[5-4] rm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700491 kThumb2LdrhRRR, /* ldrh rt,[rn,rm,LSL #imm] [111110000101] rn[19-16]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700492 rt[15-12] [000000] imm[5-4] rm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700493 kThumb2LdrshRRR, /* ldrsh rt,[rn,rm,LSL #imm] [111110000101] rn[19-16]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700494 rt[15-12] [000000] imm[5-4] rm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700495 kThumb2LdrbRRR, /* ldrb rt,[rn,rm,LSL #imm] [111110000101] rn[19-16]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700496 rt[15-12] [000000] imm[5-4] rm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700497 kThumb2LdrsbRRR, /* ldrsb rt,[rn,rm,LSL #imm] [111110000101] rn[19-16]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700498 rt[15-12] [000000] imm[5-4] rm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700499 kThumb2StrRRR, /* str rt,[rn,rm,LSL #imm] [111110000100] rn[19-16]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700500 rt[15-12] [000000] imm[5-4] rm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700501 kThumb2StrhRRR, /* str rt,[rn,rm,LSL #imm] [111110000010] rn[19-16]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700502 rt[15-12] [000000] imm[5-4] rm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700503 kThumb2StrbRRR, /* str rt,[rn,rm,LSL #imm] [111110000000] rn[19-16]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700504 rt[15-12] [000000] imm[5-4] rm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700505 kThumb2LdrhRRI12, /* ldrh rt,[rn,#imm12] [111110001011]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700506 rt[15..12] rn[19..16] imm12[11..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700507 kThumb2LdrshRRI12, /* ldrsh rt,[rn,#imm12] [111110011011]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700508 rt[15..12] rn[19..16] imm12[11..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700509 kThumb2LdrbRRI12, /* ldrb rt,[rn,#imm12] [111110001001]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700510 rt[15..12] rn[19..16] imm12[11..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700511 kThumb2LdrsbRRI12, /* ldrsb rt,[rn,#imm12] [111110011001]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700512 rt[15..12] rn[19..16] imm12[11..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700513 kThumb2StrhRRI12, /* strh rt,[rn,#imm12] [111110001010]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700514 rt[15..12] rn[19..16] imm12[11..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700515 kThumb2StrbRRI12, /* strb rt,[rn,#imm12] [111110001000]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700516 rt[15..12] rn[19..16] imm12[11..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700517 kThumb2Pop, /* pop [1110100010111101] list[15-0]*/
Ben Cheng18c990e2011-01-24 10:14:29 -0800518 kThumb2Push, /* push [1110100100101101] list[15-0]*/
Bill Buzbee1465db52009-09-23 17:17:35 -0700519 kThumb2CmpRI8, /* cmp rn, #<const> [11110] i [011011] rn[19-16] [0]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700520 imm3 [1111] imm8[7..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700521 kThumb2AdcRRR, /* adc [111010110101] rn[19..16] [0000] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700522 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700523 kThumb2AndRRR, /* and [111010100000] rn[19..16] [0000] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700524 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700525 kThumb2BicRRR, /* bic [111010100010] rn[19..16] [0000] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700526 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700527 kThumb2CmnRR, /* cmn [111010110001] rn[19..16] [0000] [1111]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700528 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700529 kThumb2EorRRR, /* eor [111010101000] rn[19..16] [0000] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700530 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700531 kThumb2MulRRR, /* mul [111110110000] rn[19..16] [1111] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700532 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700533 kThumb2MnvRR, /* mvn [11101010011011110] rd[11-8] [0000]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700534 rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700535 kThumb2RsubRRI8, /* rsub [111100011100] rn[19..16] [0000] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700536 imm8[7..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700537 kThumb2NegRR, /* actually rsub rd, rn, #0 */
538 kThumb2OrrRRR, /* orr [111010100100] rn[19..16] [0000] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700539 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700540 kThumb2TstRR, /* tst [111010100001] rn[19..16] [0000] [1111]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700541 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700542 kThumb2LslRRR, /* lsl [111110100000] rn[19..16] [1111] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700543 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700544 kThumb2LsrRRR, /* lsr [111110100010] rn[19..16] [1111] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700545 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700546 kThumb2AsrRRR, /* asr [111110100100] rn[19..16] [1111] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700547 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700548 kThumb2RorRRR, /* ror [111110100110] rn[19..16] [1111] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700549 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700550 kThumb2LslRRI5, /* lsl [11101010010011110] imm[14.12] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700551 [00] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700552 kThumb2LsrRRI5, /* lsr [11101010010011110] imm[14.12] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700553 [01] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700554 kThumb2AsrRRI5, /* asr [11101010010011110] imm[14.12] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700555 [10] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700556 kThumb2RorRRI5, /* ror [11101010010011110] imm[14.12] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700557 [11] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700558 kThumb2BicRRI8, /* bic [111100000010] rn[19..16] [0] imm3
Bill Buzbee270c1d62009-08-13 16:58:07 -0700559 rd[11..8] imm8 */
Bill Buzbee1465db52009-09-23 17:17:35 -0700560 kThumb2AndRRI8, /* bic [111100000000] rn[19..16] [0] imm3
Bill Buzbee270c1d62009-08-13 16:58:07 -0700561 rd[11..8] imm8 */
Bill Buzbee1465db52009-09-23 17:17:35 -0700562 kThumb2OrrRRI8, /* orr [111100000100] rn[19..16] [0] imm3
Bill Buzbee270c1d62009-08-13 16:58:07 -0700563 rd[11..8] imm8 */
Bill Buzbee1465db52009-09-23 17:17:35 -0700564 kThumb2EorRRI8, /* eor [111100001000] rn[19..16] [0] imm3
Bill Buzbee270c1d62009-08-13 16:58:07 -0700565 rd[11..8] imm8 */
Bill Buzbee1465db52009-09-23 17:17:35 -0700566 kThumb2AddRRI8, /* add [111100001000] rn[19..16] [0] imm3
Bill Buzbee270c1d62009-08-13 16:58:07 -0700567 rd[11..8] imm8 */
Bill Buzbee1465db52009-09-23 17:17:35 -0700568 kThumb2AdcRRI8, /* adc [111100010101] rn[19..16] [0] imm3
Bill Buzbee270c1d62009-08-13 16:58:07 -0700569 rd[11..8] imm8 */
Bill Buzbee1465db52009-09-23 17:17:35 -0700570 kThumb2SubRRI8, /* sub [111100011011] rn[19..16] [0] imm3
Bill Buzbee270c1d62009-08-13 16:58:07 -0700571 rd[11..8] imm8 */
Bill Buzbee1465db52009-09-23 17:17:35 -0700572 kThumb2SbcRRI8, /* sbc [111100010111] rn[19..16] [0] imm3
Bill Buzbee270c1d62009-08-13 16:58:07 -0700573 rd[11..8] imm8 */
Bill Buzbee1465db52009-09-23 17:17:35 -0700574 kThumb2It, /* it [10111111] firstcond[7-4] mask[3-0] */
575 kThumb2Fmstat, /* fmstat [11101110111100011111101000010000] */
576 kThumb2Vcmpd, /* vcmp [111011101] D [11011] rd[15-12] [1011]
Bill Buzbeea4a7f072009-08-27 13:58:09 -0700577 E [1] M [0] rm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700578 kThumb2Vcmps, /* vcmp [111011101] D [11010] rd[15-12] [1011]
Bill Buzbeea4a7f072009-08-27 13:58:09 -0700579 E [1] M [0] rm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700580 kThumb2LdrPcRel12, /* ldr rd,[pc,#imm12] [1111100011011111] rt[15-12]
581 imm12[11-0] */
582 kThumb2BCond, /* b<c> [1110] S cond[25-22] imm6[21-16] [10]
Bill Buzbeea4a7f072009-08-27 13:58:09 -0700583 J1 [0] J2 imm11[10..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700584 kThumb2Vmovd_RR, /* vmov [111011101] D [110000] vd[15-12 [101101]
Bill Buzbee7fb2edd2009-08-31 10:25:55 -0700585 M [0] vm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700586 kThumb2Vmovs_RR, /* vmov [111011101] D [110000] vd[15-12 [101001]
Bill Buzbee7fb2edd2009-08-31 10:25:55 -0700587 M [0] vm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700588 kThumb2Fmrs, /* vmov [111011100000] vn[19-16] rt[15-12] [1010]
Bill Buzbee7fb2edd2009-08-31 10:25:55 -0700589 N [0010000] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700590 kThumb2Fmsr, /* vmov [111011100001] vn[19-16] rt[15-12] [1010]
Bill Buzbee7fb2edd2009-08-31 10:25:55 -0700591 N [0010000] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700592 kThumb2Fmrrd, /* vmov [111011000100] rt2[19-16] rt[15-12]
Bill Buzbee7fb2edd2009-08-31 10:25:55 -0700593 [101100] M [1] vm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700594 kThumb2Fmdrr, /* vmov [111011000101] rt2[19-16] rt[15-12]
Bill Buzbee7fb2edd2009-08-31 10:25:55 -0700595 [101100] M [1] vm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700596 kThumb2Vabsd, /* vabs.f64 [111011101] D [110000] rd[15-12]
597 [1011110] M [0] vm[3-0] */
598 kThumb2Vabss, /* vabs.f32 [111011101] D [110000] rd[15-12]
599 [1010110] M [0] vm[3-0] */
600 kThumb2Vnegd, /* vneg.f64 [111011101] D [110000] rd[15-12]
601 [1011110] M [0] vm[3-0] */
602 kThumb2Vnegs, /* vneg.f32 [111011101] D [110000] rd[15-12]
603 [1010110] M [0] vm[3-0] */
604 kThumb2Vmovs_IMM8, /* vmov.f32 [111011101] D [11] imm4h[19-16] vd[15-12]
605 [10100000] imm4l[3-0] */
606 kThumb2Vmovd_IMM8, /* vmov.f64 [111011101] D [11] imm4h[19-16] vd[15-12]
607 [10110000] imm4l[3-0] */
608 kThumb2Mla, /* mla [111110110000] rn[19-16] ra[15-12] rd[7-4]
609 [0000] rm[3-0] */
610 kThumb2Umull, /* umull [111110111010] rn[19-16], rdlo[15-12]
611 rdhi[11-8] [0000] rm[3-0] */
612 kThumb2Ldrex, /* ldrex [111010000101] rn[19-16] rt[11-8] [1111]
613 imm8[7-0] */
614 kThumb2Strex, /* strex [111010000100] rn[19-16] rt[11-8] rd[11-8]
615 imm8[7-0] */
Bill Buzbeed0937ef2009-12-22 16:15:39 -0800616 kThumb2Clrex, /* clrex [111100111011111110000111100101111] */
617 kThumb2Bfi, /* bfi [111100110110] rn[19-16] [0] imm3[14-12]
618 rd[11-8] imm2[7-6] [0] msb[4-0] */
619 kThumb2Bfc, /* bfc [11110011011011110] [0] imm3[14-12]
620 rd[11-8] imm2[7-6] [0] msb[4-0] */
buzbeeecf8f6e2010-07-20 14:53:42 -0700621 kThumb2Dmb, /* dmb [1111001110111111100011110101] option[3-0] */
buzbee2e152ba2010-12-15 16:32:35 -0800622 kThumb2LdrPcReln12, /* ldr rd,[pc,-#imm12] [1111100011011111] rt[15-12]
623 imm12[11-0] */
Bill Buzbee7fb2edd2009-08-31 10:25:55 -0700624
Bill Buzbee1465db52009-09-23 17:17:35 -0700625 kArmLast,
Dan Bornstein9a1f8162010-12-01 17:02:26 -0800626} ArmOpcode;
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700627
buzbeeecf8f6e2010-07-20 14:53:42 -0700628/* DMB option encodings */
629typedef enum ArmOpDmbOptions {
630 kSY = 0xf,
631 kST = 0xe,
632 kISH = 0xb,
633 kISHST = 0xa,
634 kNSH = 0x7,
635 kNSHST = 0x6
636} ArmOpDmbOptions;
637
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700638/* Bit flags describing the behavior of each native opcode */
639typedef enum ArmOpFeatureFlags {
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700640 kIsBranch = 0,
641 kRegDef0,
642 kRegDef1,
643 kRegDefSP,
Ben Chengd7d426a2009-09-22 11:23:36 -0700644 kRegDefLR,
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700645 kRegDefList0,
646 kRegDefList1,
647 kRegUse0,
648 kRegUse1,
649 kRegUse2,
Bill Buzbee1465db52009-09-23 17:17:35 -0700650 kRegUse3,
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700651 kRegUseSP,
652 kRegUsePC,
653 kRegUseList0,
654 kRegUseList1,
655 kNoOperand,
656 kIsUnaryOp,
657 kIsBinaryOp,
658 kIsTertiaryOp,
659 kIsQuadOp,
660 kIsIT,
661 kSetsCCodes,
662 kUsesCCodes,
Bill Buzbee1f748632010-03-02 16:14:41 -0800663 kMemLoad,
664 kMemStore,
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700665} ArmOpFeatureFlags;
666
Bill Buzbee1f748632010-03-02 16:14:41 -0800667#define IS_LOAD (1 << kMemLoad)
668#define IS_STORE (1 << kMemStore)
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700669#define IS_BRANCH (1 << kIsBranch)
670#define REG_DEF0 (1 << kRegDef0)
671#define REG_DEF1 (1 << kRegDef1)
672#define REG_DEF_SP (1 << kRegDefSP)
Ben Chengd7d426a2009-09-22 11:23:36 -0700673#define REG_DEF_LR (1 << kRegDefLR)
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700674#define REG_DEF_LIST0 (1 << kRegDefList0)
675#define REG_DEF_LIST1 (1 << kRegDefList1)
676#define REG_USE0 (1 << kRegUse0)
677#define REG_USE1 (1 << kRegUse1)
678#define REG_USE2 (1 << kRegUse2)
Bill Buzbee1465db52009-09-23 17:17:35 -0700679#define REG_USE3 (1 << kRegUse3)
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700680#define REG_USE_SP (1 << kRegUseSP)
Ben Chengd7d426a2009-09-22 11:23:36 -0700681#define REG_USE_PC (1 << kRegUsePC)
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700682#define REG_USE_LIST0 (1 << kRegUseList0)
683#define REG_USE_LIST1 (1 << kRegUseList1)
684#define NO_OPERAND (1 << kNoOperand)
685#define IS_UNARY_OP (1 << kIsUnaryOp)
686#define IS_BINARY_OP (1 << kIsBinaryOp)
687#define IS_TERTIARY_OP (1 << kIsTertiaryOp)
688#define IS_QUAD_OP (1 << kIsQuadOp)
689#define IS_IT (1 << kIsIT)
690#define SETS_CCODES (1 << kSetsCCodes)
691#define USES_CCODES (1 << kUsesCCodes)
692
693/* Common combo register usage patterns */
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700694#define REG_USE01 (REG_USE0 | REG_USE1)
Ben Chengd7d426a2009-09-22 11:23:36 -0700695#define REG_USE012 (REG_USE01 | REG_USE2)
696#define REG_USE12 (REG_USE1 | REG_USE2)
697#define REG_DEF0_USE0 (REG_DEF0 | REG_USE0)
698#define REG_DEF0_USE1 (REG_DEF0 | REG_USE1)
699#define REG_DEF0_USE01 (REG_DEF0 | REG_USE01)
700#define REG_DEF0_USE12 (REG_DEF0 | REG_USE12)
701#define REG_DEF01_USE2 (REG_DEF0 | REG_DEF1 | REG_USE2)
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700702
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700703/* Instruction assembly fieldLoc kind */
704typedef enum ArmEncodingKind {
Bill Buzbee1465db52009-09-23 17:17:35 -0700705 kFmtUnused,
706 kFmtBitBlt, /* Bit string using end/start */
707 kFmtDfp, /* Double FP reg */
708 kFmtSfp, /* Single FP reg */
709 kFmtModImm, /* Shifted 8-bit immed using [26,14..12,7..0] */
710 kFmtImm16, /* Zero-extended immed using [26,19..16,14..12,7..0] */
711 kFmtImm6, /* Encoded branch target using [9,7..3]0 */
712 kFmtImm12, /* Zero-extended immediate using [26,14..12,7..0] */
713 kFmtShift, /* Shift descriptor, [14..12,7..4] */
714 kFmtLsb, /* least significant bit using [14..12][7..6] */
715 kFmtBWidth, /* bit-field width, encoded as width-1 */
716 kFmtShift5, /* Shift count, [14..12,7..6] */
717 kFmtBrOffset, /* Signed extended [26,11,13,21-16,10-0]:0 */
718 kFmtFPImm, /* Encoded floating point immediate */
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700719} ArmEncodingKind;
720
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700721/* Struct used to define the snippet positions for each Thumb opcode */
722typedef struct ArmEncodingMap {
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700723 u4 skeleton;
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700724 struct {
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700725 ArmEncodingKind kind;
Bill Buzbee1465db52009-09-23 17:17:35 -0700726 int end; /* end for kFmtBitBlt, 1-bit slice end for FP regs */
727 int start; /* start for kFmtBitBlt, 4-bit slice end for FP regs */
Bill Buzbee270c1d62009-08-13 16:58:07 -0700728 } fieldLoc[4];
Dan Bornstein9a1f8162010-12-01 17:02:26 -0800729 ArmOpcode opcode;
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700730 int flags;
731 char *name;
732 char* fmt;
733 int size;
734} ArmEncodingMap;
735
Bill Buzbee1f748632010-03-02 16:14:41 -0800736/* Keys for target-specific scheduling and other optimization hints */
737typedef enum ArmTargetOptHints {
738 kMaxHoistDistance,
739} ArmTargetOptHints;
740
Bill Buzbee1465db52009-09-23 17:17:35 -0700741extern ArmEncodingMap EncodingMap[kArmLast];
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700742
743/*
744 * Each instance of this struct holds a pseudo or real LIR instruction:
Elliott Hughesb4c05972010-02-24 16:36:18 -0800745 * - pseudo ones (eg labels and marks) and will be discarded by the assembler.
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700746 * - real ones will be assembled into Thumb instructions.
747 *
748 * Machine resources are encoded into a 64-bit vector, where the encodings are
749 * as following:
750 * - [ 0..15]: general purpose registers including PC, SP, and LR
751 * - [16..47]: floating-point registers where d0 is expanded to s[01] and s0
752 * starts at bit 16
753 * - [48]: IT block
754 * - [49]: integer condition code
755 * - [50]: floatint-point status word
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700756 */
757typedef struct ArmLIR {
758 LIR generic;
Dan Bornstein9a1f8162010-12-01 17:02:26 -0800759 ArmOpcode opcode;
Bill Buzbee270c1d62009-08-13 16:58:07 -0700760 int operands[4]; // [0..3] = [dest, src1, src2, extra]
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700761 bool isNop; // LIR is optimized away
jeffhao9e45c0b2010-02-03 10:24:05 -0800762 bool branchInsertSV;// mark for insertion of branch before this instruction,
763 // used to identify mem ops for self verification mode
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700764 int age; // default is 0, set lazily by the optimizer
765 int size; // 16-bit unit size (1 for thumb, 1 or 2 for thumb2)
Bill Buzbee1f748632010-03-02 16:14:41 -0800766 int aliasInfo; // For Dalvik register access & litpool disambiguation
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700767 u8 useMask; // Resource mask for use
768 u8 defMask; // Resource mask for def
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700769} ArmLIR;
770
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700771/* Init values when a predicted chain is initially assembled */
Ben Cheng6999d842010-01-26 16:46:15 -0800772/* E7FE is branch to self */
773#define PREDICTED_CHAIN_BX_PAIR_INIT 0xe7fe
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700774
775/* Utility macros to traverse the LIR/ArmLIR list */
776#define NEXT_LIR(lir) ((ArmLIR *) lir->generic.next)
777#define PREV_LIR(lir) ((ArmLIR *) lir->generic.prev)
778
779#define NEXT_LIR_LVALUE(lir) (lir)->generic.next
780#define PREV_LIR_LVALUE(lir) (lir)->generic.prev
781
782#define CHAIN_CELL_OFFSET_TAG 0xcdab
783
Bill Buzbeebd047242010-05-13 13:02:53 -0700784#define CHAIN_CELL_NORMAL_SIZE 12
785#define CHAIN_CELL_PREDICTED_SIZE 16
786
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700787#endif /* _DALVIK_VM_COMPILER_CODEGEN_ARM_ARMLIR_H */