blob: 6c3a4864bc79289ad4686e66962fe1f3e4703812 [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;
118 int numFPTemps;
119 RegisterInfo *FPTemps;
120 int numCoreRegs;
121 RegisterInfo *coreRegs;
122 int numFPRegs;
123 RegisterInfo *FPRegs;
124} RegisterPool;
125
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700126typedef enum ResourceEncodingPos {
127 kGPReg0 = 0,
128 kRegSP = 13,
129 kRegLR = 14,
130 kRegPC = 15,
131 kFPReg0 = 16,
Ben Chengd7d426a2009-09-22 11:23:36 -0700132 kRegEnd = 48,
133 kCCode = kRegEnd,
134 kFPStatus,
135 kDalvikReg,
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700136} ResourceEncodingPos;
137
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700138#define ENCODE_REG_LIST(N) ((u8) N)
139#define ENCODE_REG_SP (1ULL << kRegSP)
140#define ENCODE_REG_LR (1ULL << kRegLR)
141#define ENCODE_REG_PC (1ULL << kRegPC)
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700142#define ENCODE_CCODE (1ULL << kCCode)
143#define ENCODE_FP_STATUS (1ULL << kFPStatus)
Ben Chengd7d426a2009-09-22 11:23:36 -0700144#define ENCODE_DALVIK_REG (1ULL << kDalvikReg)
145#define ENCODE_ALL (~0ULL)
146
147#define DECODE_ALIAS_INFO_REG(X) (X & 0xffff)
148#define DECODE_ALIAS_INFO_WIDE(X) ((X & 0x80000000) ? 1 : 0)
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700149
Bill Buzbee270c1d62009-08-13 16:58:07 -0700150typedef enum OpSize {
Bill Buzbee1465db52009-09-23 17:17:35 -0700151 kWord,
152 kLong,
153 kSingle,
154 kDouble,
155 kUnsignedHalf,
156 kSignedHalf,
157 kUnsignedByte,
158 kSignedByte,
Bill Buzbee270c1d62009-08-13 16:58:07 -0700159} OpSize;
160
161typedef enum OpKind {
Bill Buzbee1465db52009-09-23 17:17:35 -0700162 kOpMov,
163 kOpMvn,
164 kOpCmp,
165 kOpLsl,
166 kOpLsr,
167 kOpAsr,
168 kOpRor,
169 kOpNot,
170 kOpAnd,
171 kOpOr,
172 kOpXor,
173 kOpNeg,
174 kOpAdd,
175 kOpAdc,
176 kOpSub,
177 kOpSbc,
178 kOpRsub,
179 kOpMul,
180 kOpDiv,
181 kOpRem,
182 kOpBic,
183 kOpCmn,
184 kOpTst,
185 kOpBkpt,
186 kOpBlx,
187 kOpPush,
188 kOpPop,
189 kOp2Char,
190 kOp2Short,
191 kOp2Byte,
192 kOpCondBr,
193 kOpUncondBr,
Bill Buzbee270c1d62009-08-13 16:58:07 -0700194} OpKind;
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700195
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700196typedef enum NativeRegisterPool {
197 r0 = 0,
198 r1 = 1,
199 r2 = 2,
200 r3 = 3,
201 r4PC = 4,
202 rFP = 5,
203 rGLUE = 6,
204 r7 = 7,
205 r8 = 8,
206 r9 = 9,
207 r10 = 10,
208 r11 = 11,
209 r12 = 12,
210 r13 = 13,
211 rlr = 14,
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700212 rpc = 15,
213 fr0 = 0 + FP_REG_OFFSET,
214 fr1 = 1 + FP_REG_OFFSET,
215 fr2 = 2 + FP_REG_OFFSET,
216 fr3 = 3 + FP_REG_OFFSET,
217 fr4 = 4 + FP_REG_OFFSET,
218 fr5 = 5 + FP_REG_OFFSET,
219 fr6 = 6 + FP_REG_OFFSET,
220 fr7 = 7 + FP_REG_OFFSET,
221 fr8 = 8 + FP_REG_OFFSET,
222 fr9 = 9 + FP_REG_OFFSET,
223 fr10 = 10 + FP_REG_OFFSET,
224 fr11 = 11 + FP_REG_OFFSET,
225 fr12 = 12 + FP_REG_OFFSET,
226 fr13 = 13 + FP_REG_OFFSET,
227 fr14 = 14 + FP_REG_OFFSET,
228 fr15 = 15 + FP_REG_OFFSET,
229 fr16 = 16 + FP_REG_OFFSET,
230 fr17 = 17 + FP_REG_OFFSET,
231 fr18 = 18 + FP_REG_OFFSET,
232 fr19 = 19 + FP_REG_OFFSET,
233 fr20 = 20 + FP_REG_OFFSET,
234 fr21 = 21 + FP_REG_OFFSET,
235 fr22 = 22 + FP_REG_OFFSET,
236 fr23 = 23 + FP_REG_OFFSET,
237 fr24 = 24 + FP_REG_OFFSET,
238 fr25 = 25 + FP_REG_OFFSET,
239 fr26 = 26 + FP_REG_OFFSET,
240 fr27 = 27 + FP_REG_OFFSET,
241 fr28 = 28 + FP_REG_OFFSET,
242 fr29 = 29 + FP_REG_OFFSET,
243 fr30 = 30 + FP_REG_OFFSET,
244 fr31 = 31 + FP_REG_OFFSET,
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700245 dr0 = fr0 + FP_DOUBLE,
246 dr1 = fr2 + FP_DOUBLE,
247 dr2 = fr4 + FP_DOUBLE,
248 dr3 = fr6 + FP_DOUBLE,
249 dr4 = fr8 + FP_DOUBLE,
250 dr5 = fr10 + FP_DOUBLE,
251 dr6 = fr12 + FP_DOUBLE,
252 dr7 = fr14 + FP_DOUBLE,
253 dr8 = fr16 + FP_DOUBLE,
254 dr9 = fr18 + FP_DOUBLE,
255 dr10 = fr20 + FP_DOUBLE,
256 dr11 = fr22 + FP_DOUBLE,
257 dr12 = fr24 + FP_DOUBLE,
258 dr13 = fr26 + FP_DOUBLE,
259 dr14 = fr28 + FP_DOUBLE,
260 dr15 = fr30 + FP_DOUBLE,
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700261} NativeRegisterPool;
262
Bill Buzbee1465db52009-09-23 17:17:35 -0700263/* Shift encodings */
264typedef enum ArmShiftEncodings {
265 kArmLsl = 0x0,
266 kArmLsr = 0x1,
267 kArmAsr = 0x2,
268 kArmRor = 0x3
269} ArmShiftEncodings;
270
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700271/* Thumb condition encodings */
272typedef enum ArmConditionCode {
Bill Buzbee1465db52009-09-23 17:17:35 -0700273 kArmCondEq = 0x0, /* 0000 */
274 kArmCondNe = 0x1, /* 0001 */
275 kArmCondCs = 0x2, /* 0010 */
276 kArmCondCc = 0x3, /* 0011 */
277 kArmCondMi = 0x4, /* 0100 */
278 kArmCondPl = 0x5, /* 0101 */
279 kArmCondVs = 0x6, /* 0110 */
280 kArmCondVc = 0x7, /* 0111 */
281 kArmCondHi = 0x8, /* 1000 */
282 kArmCondLs = 0x9, /* 1001 */
283 kArmCondGe = 0xa, /* 1010 */
284 kArmCondLt = 0xb, /* 1011 */
285 kArmCondGt = 0xc, /* 1100 */
286 kArmCondLe = 0xd, /* 1101 */
287 kArmCondAl = 0xe, /* 1110 */
288 kArmCondNv = 0xf, /* 1111 */
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700289} ArmConditionCode;
290
291#define isPseudoOpCode(opCode) ((int)(opCode) < 0)
292
293/*
294 * The following enum defines the list of supported Thumb instructions by the
295 * assembler. Their corresponding snippet positions will be defined in
296 * Assemble.c.
297 */
298typedef enum ArmOpCode {
Bill Buzbee1465db52009-09-23 17:17:35 -0700299 kArmPseudoBarrier = -17,
300 kArmPseudoExtended = -16,
301 kArmPseudoSSARep = -15,
302 ARM_PSEUDO_kEntryBlock = -14,
303 ARM_PSEUDO_kExitBlock = -13,
304 kArmPseudoTargetLabel = -12,
305 ARM_PSEUDO_kChainingCellBackwardBranch = -11,
306 ARM_PSEUDO_kChainingCellHot = -10,
307 ARM_PSEUDO_kChainingCellInvokePredicted = -9,
308 ARM_PSEUDO_kChainingCellInvokeSingleton = -8,
309 ARM_PSEUDO_kChainingCellNormal = -7,
310 ARM_PSEUDO_kDalvikByteCode_BOUNDARY = -6,
311 kArmPseudoPseudoAlign4 = -5,
312 ARM_PSEUDO_kPCReconstruction_CELL = -4,
313 ARM_PSEUDO_kPCReconstruction_BLOCK_LABEL = -3,
314 kArmPseudoEHBlockLabel = -2,
315 kArmPseudoNormalBlockLabel = -1,
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700316 /************************************************************************/
Bill Buzbee1465db52009-09-23 17:17:35 -0700317 kArm16BitData, /* DATA [0] rd[15..0] */
318 kThumbAdcRR, /* adc [0100000101] rm[5..3] rd[2..0] */
319 kThumbAddRRI3, /* add(1) [0001110] imm_3[8..6] rn[5..3] rd[2..0]*/
320 kThumbAddRI8, /* add(2) [00110] rd[10..8] imm_8[7..0] */
321 kThumbAddRRR, /* add(3) [0001100] rm[8..6] rn[5..3] rd[2..0] */
322 kThumbAddRRLH, /* add(4) [01000100] H12[01] rm[5..3] rd[2..0] */
323 kThumbAddRRHL, /* add(4) [01001000] H12[10] rm[5..3] rd[2..0] */
324 kThumbAddRRHH, /* add(4) [01001100] H12[11] rm[5..3] rd[2..0] */
325 kThumbAddPcRel, /* add(5) [10100] rd[10..8] imm_8[7..0] */
326 kThumbAddSpRel, /* add(6) [10101] rd[10..8] imm_8[7..0] */
327 kThumbAddSpI7, /* add(7) [101100000] imm_7[6..0] */
328 kThumbAndRR, /* and [0100000000] rm[5..3] rd[2..0] */
329 kThumbAsrRRI5, /* asr(1) [00010] imm_5[10..6] rm[5..3] rd[2..0] */
330 kThumbAsrRR, /* asr(2) [0100000100] rs[5..3] rd[2..0] */
331 kThumbBCond, /* b(1) [1101] cond[11..8] offset_8[7..0] */
332 kThumbBUncond, /* b(2) [11100] offset_11[10..0] */
333 kThumbBicRR, /* bic [0100001110] rm[5..3] rd[2..0] */
334 kThumbBkpt, /* bkpt [10111110] imm_8[7..0] */
335 kThumbBlx1, /* blx(1) [111] H[10] offset_11[10..0] */
336 kThumbBlx2, /* blx(1) [111] H[01] offset_11[10..0] */
337 kThumbBl1, /* blx(1) [111] H[10] offset_11[10..0] */
338 kThumbBl2, /* blx(1) [111] H[11] offset_11[10..0] */
339 kThumbBlxR, /* blx(2) [010001111] rm[6..3] [000] */
340 kThumbBx, /* bx [010001110] H2[6..6] rm[5..3] SBZ[000] */
341 kThumbCmnRR, /* cmn [0100001011] rm[5..3] rd[2..0] */
342 kThumbCmpRI8, /* cmp(1) [00101] rn[10..8] imm_8[7..0] */
343 kThumbCmpRR, /* cmp(2) [0100001010] rm[5..3] rd[2..0] */
344 kThumbCmpLH, /* cmp(3) [01000101] H12[01] rm[5..3] rd[2..0] */
345 kThumbCmpHL, /* cmp(3) [01000110] H12[10] rm[5..3] rd[2..0] */
346 kThumbCmpHH, /* cmp(3) [01000111] H12[11] rm[5..3] rd[2..0] */
347 kThumbEorRR, /* eor [0100000001] rm[5..3] rd[2..0] */
348 kThumbLdmia, /* ldmia [11001] rn[10..8] reglist [7..0] */
349 kThumbLdrRRI5, /* ldr(1) [01101] imm_5[10..6] rn[5..3] rd[2..0] */
350 kThumbLdrRRR, /* ldr(2) [0101100] rm[8..6] rn[5..3] rd[2..0] */
351 kThumbLdrPcRel, /* ldr(3) [01001] rd[10..8] imm_8[7..0] */
352 kThumbLdrSpRel, /* ldr(4) [10011] rd[10..8] imm_8[7..0] */
353 kThumbLdrbRRI5, /* ldrb(1) [01111] imm_5[10..6] rn[5..3] rd[2..0] */
354 kThumbLdrbRRR, /* ldrb(2) [0101110] rm[8..6] rn[5..3] rd[2..0] */
355 kThumbLdrhRRI5, /* ldrh(1) [10001] imm_5[10..6] rn[5..3] rd[2..0] */
356 kThumbLdrhRRR, /* ldrh(2) [0101101] rm[8..6] rn[5..3] rd[2..0] */
357 kThumbLdrsbRRR, /* ldrsb [0101011] rm[8..6] rn[5..3] rd[2..0] */
358 kThumbLdrshRRR, /* ldrsh [0101111] rm[8..6] rn[5..3] rd[2..0] */
359 kThumbLslRRI5, /* lsl(1) [00000] imm_5[10..6] rm[5..3] rd[2..0] */
360 kThumbLslRR, /* lsl(2) [0100000010] rs[5..3] rd[2..0] */
361 kThumbLsrRRI5, /* lsr(1) [00001] imm_5[10..6] rm[5..3] rd[2..0] */
362 kThumbLsrRR, /* lsr(2) [0100000011] rs[5..3] rd[2..0] */
363 kThumbMovImm, /* mov(1) [00100] rd[10..8] imm_8[7..0] */
364 kThumbMovRR, /* mov(2) [0001110000] rn[5..3] rd[2..0] */
365 kThumbMovRR_H2H, /* mov(3) [01000111] H12[11] rm[5..3] rd[2..0] */
366 kThumbMovRR_H2L, /* mov(3) [01000110] H12[01] rm[5..3] rd[2..0] */
367 kThumbMovRR_L2H, /* mov(3) [01000101] H12[10] rm[5..3] rd[2..0] */
368 kThumbMul, /* mul [0100001101] rm[5..3] rd[2..0] */
369 kThumbMvn, /* mvn [0100001111] rm[5..3] rd[2..0] */
370 kThumbNeg, /* neg [0100001001] rm[5..3] rd[2..0] */
371 kThumbOrr, /* orr [0100001100] rm[5..3] rd[2..0] */
372 kThumbPop, /* pop [1011110] r[8..8] rl[7..0] */
373 kThumbPush, /* push [1011010] r[8..8] rl[7..0] */
Bill Buzbee799cdf92009-10-30 15:00:52 -0700374 kThumbRorRR, /* ror [0100000111] rs[5..3] rd[2..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700375 kThumbSbc, /* sbc [0100000110] rm[5..3] rd[2..0] */
376 kThumbStmia, /* stmia [11000] rn[10..8] reglist [7.. 0] */
377 kThumbStrRRI5, /* str(1) [01100] imm_5[10..6] rn[5..3] rd[2..0] */
378 kThumbStrRRR, /* str(2) [0101000] rm[8..6] rn[5..3] rd[2..0] */
379 kThumbStrSpRel, /* str(3) [10010] rd[10..8] imm_8[7..0] */
380 kThumbStrbRRI5, /* strb(1) [01110] imm_5[10..6] rn[5..3] rd[2..0] */
381 kThumbStrbRRR, /* strb(2) [0101010] rm[8..6] rn[5..3] rd[2..0] */
382 kThumbStrhRRI5, /* strh(1) [10000] imm_5[10..6] rn[5..3] rd[2..0] */
383 kThumbStrhRRR, /* strh(2) [0101001] rm[8..6] rn[5..3] rd[2..0] */
384 kThumbSubRRI3, /* sub(1) [0001111] imm_3[8..6] rn[5..3] rd[2..0]*/
385 kThumbSubRI8, /* sub(2) [00111] rd[10..8] imm_8[7..0] */
386 kThumbSubRRR, /* sub(3) [0001101] rm[8..6] rn[5..3] rd[2..0] */
387 kThumbSubSpI7, /* sub(4) [101100001] imm_7[6..0] */
388 kThumbSwi, /* swi [11011111] imm_8[7..0] */
389 kThumbTst, /* tst [0100001000] rm[5..3] rn[2..0] */
390 kThumb2Vldrs, /* vldr low sx [111011011001] rn[19..16] rd[15-12]
391 [1010] imm_8[7..0] */
392 kThumb2Vldrd, /* vldr low dx [111011011001] rn[19..16] rd[15-12]
393 [1011] imm_8[7..0] */
394 kThumb2Vmuls, /* vmul vd, vn, vm [111011100010] rn[19..16]
395 rd[15-12] [10100000] rm[3..0] */
396 kThumb2Vmuld, /* vmul vd, vn, vm [111011100010] rn[19..16]
397 rd[15-12] [10110000] rm[3..0] */
398 kThumb2Vstrs, /* vstr low sx [111011011000] rn[19..16] rd[15-12]
399 [1010] imm_8[7..0] */
400 kThumb2Vstrd, /* vstr low dx [111011011000] rn[19..16] rd[15-12]
401 [1011] imm_8[7..0] */
402 kThumb2Vsubs, /* vsub vd, vn, vm [111011100011] rn[19..16]
403 rd[15-12] [10100040] rm[3..0] */
404 kThumb2Vsubd, /* vsub vd, vn, vm [111011100011] rn[19..16]
405 rd[15-12] [10110040] rm[3..0] */
406 kThumb2Vadds, /* vadd vd, vn, vm [111011100011] rn[19..16]
407 rd[15-12] [10100000] rm[3..0] */
408 kThumb2Vaddd, /* vadd vd, vn, vm [111011100011] rn[19..16]
409 rd[15-12] [10110000] rm[3..0] */
410 kThumb2Vdivs, /* vdiv vd, vn, vm [111011101000] rn[19..16]
411 rd[15-12] [10100000] rm[3..0] */
412 kThumb2Vdivd, /* vdiv vd, vn, vm [111011101000] rn[19..16]
413 rd[15-12] [10110000] rm[3..0] */
414 kThumb2VcvtIF, /* vcvt.F32 vd, vm [1110111010111000] vd[15..12]
415 [10101100] vm[3..0] */
416 kThumb2VcvtID, /* vcvt.F64 vd, vm [1110111010111000] vd[15..12]
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700417 [10111100] vm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700418 kThumb2VcvtFI, /* vcvt.S32.F32 vd, vm [1110111010111101] vd[15..12]
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700419 [10101100] vm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700420 kThumb2VcvtDI, /* vcvt.S32.F32 vd, vm [1110111010111101] vd[15..12]
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700421 [10111100] vm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700422 kThumb2VcvtFd, /* vcvt.F64.F32 vd, vm [1110111010110111] vd[15..12]
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700423 [10101100] vm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700424 kThumb2VcvtDF, /* vcvt.F32.F64 vd, vm [1110111010110111] vd[15..12]
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700425 [10111100] vm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700426 kThumb2Vsqrts, /* vsqrt.f32 vd, vm [1110111010110001] vd[15..12]
Bill Buzbee9727c3d2009-08-01 11:32:36 -0700427 [10101100] vm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700428 kThumb2Vsqrtd, /* vsqrt.f64 vd, vm [1110111010110001] vd[15..12]
Bill Buzbee9727c3d2009-08-01 11:32:36 -0700429 [10111100] vm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700430 kThumb2MovImmShift, /* mov(T2) rd, #<const> [11110] i [00001001111]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700431 imm3 rd[11..8] imm8 */
Bill Buzbee1465db52009-09-23 17:17:35 -0700432 kThumb2MovImm16, /* mov(T3) rd, #<const> [11110] i [0010100] imm4 [0]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700433 imm3 rd[11..8] imm8 */
Bill Buzbee1465db52009-09-23 17:17:35 -0700434 kThumb2StrRRI12, /* str(Imm,T3) rd,[rn,#imm12] [111110001100]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700435 rn[19..16] rt[15..12] imm12[11..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700436 kThumb2LdrRRI12, /* str(Imm,T3) rd,[rn,#imm12] [111110001100]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700437 rn[19..16] rt[15..12] imm12[11..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700438 kThumb2StrRRI8Predec, /* str(Imm,T4) rd,[rn,#-imm8] [111110000100]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700439 rn[19..16] rt[15..12] [1100] imm[7..0]*/
Bill Buzbee1465db52009-09-23 17:17:35 -0700440 kThumb2LdrRRI8Predec, /* ldr(Imm,T4) rd,[rn,#-imm8] [111110000101]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700441 rn[19..16] rt[15..12] [1100] imm[7..0]*/
Bill Buzbee1465db52009-09-23 17:17:35 -0700442 kThumb2Cbnz, /* cbnz rd,<label> [101110] i [1] imm5[7..3]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700443 rn[2..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700444 kThumb2Cbz, /* cbn rd,<label> [101100] i [1] imm5[7..3]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700445 rn[2..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700446 kThumb2AddRRI12, /* add rd, rn, #imm12 [11110] i [100000] rn[19..16]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700447 [0] imm3[14..12] rd[11..8] imm8[7..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700448 kThumb2MovRR, /* mov rd, rm [11101010010011110000] rd[11..8]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700449 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700450 kThumb2Vmovs, /* vmov.f32 vd, vm [111011101] D [110000]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700451 vd[15..12] 101001] M [0] vm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700452 kThumb2Vmovd, /* vmov.f64 vd, vm [111011101] D [110000]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700453 vd[15..12] 101101] M [0] vm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700454 kThumb2Ldmia, /* ldmia [111010001001[ rn[19..16] mask[15..0] */
455 kThumb2Stmia, /* stmia [111010001000[ rn[19..16] mask[15..0] */
456 kThumb2AddRRR, /* add [111010110000] rn[19..16] [0000] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700457 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700458 kThumb2SubRRR, /* sub [111010111010] rn[19..16] [0000] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700459 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700460 kThumb2SbcRRR, /* sbc [111010110110] rn[19..16] [0000] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700461 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700462 kThumb2CmpRR, /* cmp [111010111011] rn[19..16] [0000] [1111]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700463 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700464 kThumb2SubRRI12, /* sub rd, rn, #imm12 [11110] i [01010] rn[19..16]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700465 [0] imm3[14..12] rd[11..8] imm8[7..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700466 kThumb2MvnImmShift, /* mov(T2) rd, #<const> [11110] i [00011011110]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700467 imm3 rd[11..8] imm8 */
Bill Buzbee1465db52009-09-23 17:17:35 -0700468 kThumb2Sel, /* sel rd, rn, rm [111110101010] rn[19-16] rd[11-8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700469 rm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700470 kThumb2Ubfx, /* ubfx rd,rn,#lsb,#width [111100111100] rn[19..16]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700471 [0] imm3[14-12] rd[11-8] w[4-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700472 kThumb2Sbfx, /* ubfx rd,rn,#lsb,#width [111100110100] rn[19..16]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700473 [0] imm3[14-12] rd[11-8] w[4-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700474 kThumb2LdrRRR, /* ldr rt,[rn,rm,LSL #imm] [111110000101] rn[19-16]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700475 rt[15-12] [000000] imm[5-4] rm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700476 kThumb2LdrhRRR, /* ldrh rt,[rn,rm,LSL #imm] [111110000101] rn[19-16]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700477 rt[15-12] [000000] imm[5-4] rm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700478 kThumb2LdrshRRR, /* ldrsh rt,[rn,rm,LSL #imm] [111110000101] rn[19-16]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700479 rt[15-12] [000000] imm[5-4] rm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700480 kThumb2LdrbRRR, /* ldrb rt,[rn,rm,LSL #imm] [111110000101] rn[19-16]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700481 rt[15-12] [000000] imm[5-4] rm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700482 kThumb2LdrsbRRR, /* ldrsb rt,[rn,rm,LSL #imm] [111110000101] rn[19-16]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700483 rt[15-12] [000000] imm[5-4] rm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700484 kThumb2StrRRR, /* str rt,[rn,rm,LSL #imm] [111110000100] rn[19-16]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700485 rt[15-12] [000000] imm[5-4] rm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700486 kThumb2StrhRRR, /* str rt,[rn,rm,LSL #imm] [111110000010] rn[19-16]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700487 rt[15-12] [000000] imm[5-4] rm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700488 kThumb2StrbRRR, /* str rt,[rn,rm,LSL #imm] [111110000000] rn[19-16]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700489 rt[15-12] [000000] imm[5-4] rm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700490 kThumb2LdrhRRI12, /* ldrh rt,[rn,#imm12] [111110001011]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700491 rt[15..12] rn[19..16] imm12[11..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700492 kThumb2LdrshRRI12, /* ldrsh rt,[rn,#imm12] [111110011011]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700493 rt[15..12] rn[19..16] imm12[11..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700494 kThumb2LdrbRRI12, /* ldrb rt,[rn,#imm12] [111110001001]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700495 rt[15..12] rn[19..16] imm12[11..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700496 kThumb2LdrsbRRI12, /* ldrsb rt,[rn,#imm12] [111110011001]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700497 rt[15..12] rn[19..16] imm12[11..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700498 kThumb2StrhRRI12, /* strh rt,[rn,#imm12] [111110001010]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700499 rt[15..12] rn[19..16] imm12[11..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700500 kThumb2StrbRRI12, /* strb rt,[rn,#imm12] [111110001000]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700501 rt[15..12] rn[19..16] imm12[11..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700502 kThumb2Pop, /* pop [1110100010111101] list[15-0]*/
503 kThumb2Push, /* push [1110100010101101] list[15-0]*/
504 kThumb2CmpRI8, /* cmp rn, #<const> [11110] i [011011] rn[19-16] [0]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700505 imm3 [1111] imm8[7..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700506 kThumb2AdcRRR, /* adc [111010110101] rn[19..16] [0000] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700507 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700508 kThumb2AndRRR, /* and [111010100000] rn[19..16] [0000] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700509 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700510 kThumb2BicRRR, /* bic [111010100010] rn[19..16] [0000] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700511 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700512 kThumb2CmnRR, /* cmn [111010110001] rn[19..16] [0000] [1111]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700513 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700514 kThumb2EorRRR, /* eor [111010101000] rn[19..16] [0000] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700515 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700516 kThumb2MulRRR, /* mul [111110110000] rn[19..16] [1111] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700517 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700518 kThumb2MnvRR, /* mvn [11101010011011110] rd[11-8] [0000]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700519 rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700520 kThumb2RsubRRI8, /* rsub [111100011100] rn[19..16] [0000] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700521 imm8[7..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700522 kThumb2NegRR, /* actually rsub rd, rn, #0 */
523 kThumb2OrrRRR, /* orr [111010100100] 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 kThumb2TstRR, /* tst [111010100001] rn[19..16] [0000] [1111]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700526 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700527 kThumb2LslRRR, /* lsl [111110100000] rn[19..16] [1111] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700528 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700529 kThumb2LsrRRR, /* lsr [111110100010] rn[19..16] [1111] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700530 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700531 kThumb2AsrRRR, /* asr [111110100100] 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 kThumb2RorRRR, /* ror [111110100110] rn[19..16] [1111] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700534 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700535 kThumb2LslRRI5, /* lsl [11101010010011110] imm[14.12] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700536 [00] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700537 kThumb2LsrRRI5, /* lsr [11101010010011110] imm[14.12] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700538 [01] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700539 kThumb2AsrRRI5, /* asr [11101010010011110] imm[14.12] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700540 [10] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700541 kThumb2RorRRI5, /* ror [11101010010011110] imm[14.12] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700542 [11] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700543 kThumb2BicRRI8, /* bic [111100000010] rn[19..16] [0] imm3
Bill Buzbee270c1d62009-08-13 16:58:07 -0700544 rd[11..8] imm8 */
Bill Buzbee1465db52009-09-23 17:17:35 -0700545 kThumb2AndRRI8, /* bic [111100000000] rn[19..16] [0] imm3
Bill Buzbee270c1d62009-08-13 16:58:07 -0700546 rd[11..8] imm8 */
Bill Buzbee1465db52009-09-23 17:17:35 -0700547 kThumb2OrrRRI8, /* orr [111100000100] rn[19..16] [0] imm3
Bill Buzbee270c1d62009-08-13 16:58:07 -0700548 rd[11..8] imm8 */
Bill Buzbee1465db52009-09-23 17:17:35 -0700549 kThumb2EorRRI8, /* eor [111100001000] rn[19..16] [0] imm3
Bill Buzbee270c1d62009-08-13 16:58:07 -0700550 rd[11..8] imm8 */
Bill Buzbee1465db52009-09-23 17:17:35 -0700551 kThumb2AddRRI8, /* add [111100001000] rn[19..16] [0] imm3
Bill Buzbee270c1d62009-08-13 16:58:07 -0700552 rd[11..8] imm8 */
Bill Buzbee1465db52009-09-23 17:17:35 -0700553 kThumb2AdcRRI8, /* adc [111100010101] rn[19..16] [0] imm3
Bill Buzbee270c1d62009-08-13 16:58:07 -0700554 rd[11..8] imm8 */
Bill Buzbee1465db52009-09-23 17:17:35 -0700555 kThumb2SubRRI8, /* sub [111100011011] rn[19..16] [0] imm3
Bill Buzbee270c1d62009-08-13 16:58:07 -0700556 rd[11..8] imm8 */
Bill Buzbee1465db52009-09-23 17:17:35 -0700557 kThumb2SbcRRI8, /* sbc [111100010111] rn[19..16] [0] imm3
Bill Buzbee270c1d62009-08-13 16:58:07 -0700558 rd[11..8] imm8 */
Bill Buzbee1465db52009-09-23 17:17:35 -0700559 kThumb2It, /* it [10111111] firstcond[7-4] mask[3-0] */
560 kThumb2Fmstat, /* fmstat [11101110111100011111101000010000] */
561 kThumb2Vcmpd, /* vcmp [111011101] D [11011] rd[15-12] [1011]
Bill Buzbeea4a7f072009-08-27 13:58:09 -0700562 E [1] M [0] rm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700563 kThumb2Vcmps, /* vcmp [111011101] D [11010] rd[15-12] [1011]
Bill Buzbeea4a7f072009-08-27 13:58:09 -0700564 E [1] M [0] rm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700565 kThumb2LdrPcRel12, /* ldr rd,[pc,#imm12] [1111100011011111] rt[15-12]
566 imm12[11-0] */
567 kThumb2BCond, /* b<c> [1110] S cond[25-22] imm6[21-16] [10]
Bill Buzbeea4a7f072009-08-27 13:58:09 -0700568 J1 [0] J2 imm11[10..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700569 kThumb2Vmovd_RR, /* vmov [111011101] D [110000] vd[15-12 [101101]
Bill Buzbee7fb2edd2009-08-31 10:25:55 -0700570 M [0] vm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700571 kThumb2Vmovs_RR, /* vmov [111011101] D [110000] vd[15-12 [101001]
Bill Buzbee7fb2edd2009-08-31 10:25:55 -0700572 M [0] vm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700573 kThumb2Fmrs, /* vmov [111011100000] vn[19-16] rt[15-12] [1010]
Bill Buzbee7fb2edd2009-08-31 10:25:55 -0700574 N [0010000] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700575 kThumb2Fmsr, /* vmov [111011100001] vn[19-16] rt[15-12] [1010]
Bill Buzbee7fb2edd2009-08-31 10:25:55 -0700576 N [0010000] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700577 kThumb2Fmrrd, /* vmov [111011000100] rt2[19-16] rt[15-12]
Bill Buzbee7fb2edd2009-08-31 10:25:55 -0700578 [101100] M [1] vm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700579 kThumb2Fmdrr, /* vmov [111011000101] rt2[19-16] rt[15-12]
Bill Buzbee7fb2edd2009-08-31 10:25:55 -0700580 [101100] M [1] vm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700581 kThumb2Vabsd, /* vabs.f64 [111011101] D [110000] rd[15-12]
582 [1011110] M [0] vm[3-0] */
583 kThumb2Vabss, /* vabs.f32 [111011101] D [110000] rd[15-12]
584 [1010110] M [0] vm[3-0] */
585 kThumb2Vnegd, /* vneg.f64 [111011101] D [110000] rd[15-12]
586 [1011110] M [0] vm[3-0] */
587 kThumb2Vnegs, /* vneg.f32 [111011101] D [110000] rd[15-12]
588 [1010110] M [0] vm[3-0] */
589 kThumb2Vmovs_IMM8, /* vmov.f32 [111011101] D [11] imm4h[19-16] vd[15-12]
590 [10100000] imm4l[3-0] */
591 kThumb2Vmovd_IMM8, /* vmov.f64 [111011101] D [11] imm4h[19-16] vd[15-12]
592 [10110000] imm4l[3-0] */
593 kThumb2Mla, /* mla [111110110000] rn[19-16] ra[15-12] rd[7-4]
594 [0000] rm[3-0] */
595 kThumb2Umull, /* umull [111110111010] rn[19-16], rdlo[15-12]
596 rdhi[11-8] [0000] rm[3-0] */
597 kThumb2Ldrex, /* ldrex [111010000101] rn[19-16] rt[11-8] [1111]
598 imm8[7-0] */
599 kThumb2Strex, /* strex [111010000100] rn[19-16] rt[11-8] rd[11-8]
600 imm8[7-0] */
601 kThumb2Clrex, /* clrex [111100111011111110000111100101111\ */
Bill Buzbee7fb2edd2009-08-31 10:25:55 -0700602
Bill Buzbee1465db52009-09-23 17:17:35 -0700603 kArmLast,
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700604} ArmOpCode;
605
606/* Bit flags describing the behavior of each native opcode */
607typedef enum ArmOpFeatureFlags {
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700608 kIsBranch = 0,
609 kRegDef0,
610 kRegDef1,
611 kRegDefSP,
Ben Chengd7d426a2009-09-22 11:23:36 -0700612 kRegDefLR,
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700613 kRegDefList0,
614 kRegDefList1,
615 kRegUse0,
616 kRegUse1,
617 kRegUse2,
Bill Buzbee1465db52009-09-23 17:17:35 -0700618 kRegUse3,
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700619 kRegUseSP,
620 kRegUsePC,
621 kRegUseList0,
622 kRegUseList1,
623 kNoOperand,
624 kIsUnaryOp,
625 kIsBinaryOp,
626 kIsTertiaryOp,
627 kIsQuadOp,
628 kIsIT,
629 kSetsCCodes,
630 kUsesCCodes,
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700631} ArmOpFeatureFlags;
632
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700633#define IS_BRANCH (1 << kIsBranch)
634#define REG_DEF0 (1 << kRegDef0)
635#define REG_DEF1 (1 << kRegDef1)
636#define REG_DEF_SP (1 << kRegDefSP)
Ben Chengd7d426a2009-09-22 11:23:36 -0700637#define REG_DEF_LR (1 << kRegDefLR)
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700638#define REG_DEF_LIST0 (1 << kRegDefList0)
639#define REG_DEF_LIST1 (1 << kRegDefList1)
640#define REG_USE0 (1 << kRegUse0)
641#define REG_USE1 (1 << kRegUse1)
642#define REG_USE2 (1 << kRegUse2)
Bill Buzbee1465db52009-09-23 17:17:35 -0700643#define REG_USE3 (1 << kRegUse3)
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700644#define REG_USE_SP (1 << kRegUseSP)
Ben Chengd7d426a2009-09-22 11:23:36 -0700645#define REG_USE_PC (1 << kRegUsePC)
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700646#define REG_USE_LIST0 (1 << kRegUseList0)
647#define REG_USE_LIST1 (1 << kRegUseList1)
648#define NO_OPERAND (1 << kNoOperand)
649#define IS_UNARY_OP (1 << kIsUnaryOp)
650#define IS_BINARY_OP (1 << kIsBinaryOp)
651#define IS_TERTIARY_OP (1 << kIsTertiaryOp)
652#define IS_QUAD_OP (1 << kIsQuadOp)
653#define IS_IT (1 << kIsIT)
654#define SETS_CCODES (1 << kSetsCCodes)
655#define USES_CCODES (1 << kUsesCCodes)
656
657/* Common combo register usage patterns */
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700658#define REG_USE01 (REG_USE0 | REG_USE1)
Ben Chengd7d426a2009-09-22 11:23:36 -0700659#define REG_USE012 (REG_USE01 | REG_USE2)
660#define REG_USE12 (REG_USE1 | REG_USE2)
661#define REG_DEF0_USE0 (REG_DEF0 | REG_USE0)
662#define REG_DEF0_USE1 (REG_DEF0 | REG_USE1)
663#define REG_DEF0_USE01 (REG_DEF0 | REG_USE01)
664#define REG_DEF0_USE12 (REG_DEF0 | REG_USE12)
665#define REG_DEF01_USE2 (REG_DEF0 | REG_DEF1 | REG_USE2)
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700666
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700667/* Instruction assembly fieldLoc kind */
668typedef enum ArmEncodingKind {
Bill Buzbee1465db52009-09-23 17:17:35 -0700669 kFmtUnused,
670 kFmtBitBlt, /* Bit string using end/start */
671 kFmtDfp, /* Double FP reg */
672 kFmtSfp, /* Single FP reg */
673 kFmtModImm, /* Shifted 8-bit immed using [26,14..12,7..0] */
674 kFmtImm16, /* Zero-extended immed using [26,19..16,14..12,7..0] */
675 kFmtImm6, /* Encoded branch target using [9,7..3]0 */
676 kFmtImm12, /* Zero-extended immediate using [26,14..12,7..0] */
677 kFmtShift, /* Shift descriptor, [14..12,7..4] */
678 kFmtLsb, /* least significant bit using [14..12][7..6] */
679 kFmtBWidth, /* bit-field width, encoded as width-1 */
680 kFmtShift5, /* Shift count, [14..12,7..6] */
681 kFmtBrOffset, /* Signed extended [26,11,13,21-16,10-0]:0 */
682 kFmtFPImm, /* Encoded floating point immediate */
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700683} ArmEncodingKind;
684
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700685/* Struct used to define the snippet positions for each Thumb opcode */
686typedef struct ArmEncodingMap {
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700687 u4 skeleton;
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700688 struct {
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700689 ArmEncodingKind kind;
Bill Buzbee1465db52009-09-23 17:17:35 -0700690 int end; /* end for kFmtBitBlt, 1-bit slice end for FP regs */
691 int start; /* start for kFmtBitBlt, 4-bit slice end for FP regs */
Bill Buzbee270c1d62009-08-13 16:58:07 -0700692 } fieldLoc[4];
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700693 ArmOpCode opCode;
694 int flags;
695 char *name;
696 char* fmt;
697 int size;
698} ArmEncodingMap;
699
Bill Buzbee1465db52009-09-23 17:17:35 -0700700extern ArmEncodingMap EncodingMap[kArmLast];
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700701
702/*
703 * Each instance of this struct holds a pseudo or real LIR instruction:
704 * - pesudo ones (eg labels and marks) and will be discarded by the assembler.
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700705 * - real ones will be assembled into Thumb instructions.
706 *
707 * Machine resources are encoded into a 64-bit vector, where the encodings are
708 * as following:
709 * - [ 0..15]: general purpose registers including PC, SP, and LR
710 * - [16..47]: floating-point registers where d0 is expanded to s[01] and s0
711 * starts at bit 16
712 * - [48]: IT block
713 * - [49]: integer condition code
714 * - [50]: floatint-point status word
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700715 */
716typedef struct ArmLIR {
717 LIR generic;
718 ArmOpCode opCode;
Bill Buzbee270c1d62009-08-13 16:58:07 -0700719 int operands[4]; // [0..3] = [dest, src1, src2, extra]
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700720 bool isNop; // LIR is optimized away
721 int age; // default is 0, set lazily by the optimizer
722 int size; // 16-bit unit size (1 for thumb, 1 or 2 for thumb2)
Ben Chengd7d426a2009-09-22 11:23:36 -0700723 int aliasInfo; // For Dalvik register access disambiguation
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700724 u8 useMask; // Resource mask for use
725 u8 defMask; // Resource mask for def
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700726} ArmLIR;
727
728/* Chain cell for predicted method invocation */
729typedef struct PredictedChainingCell {
730 u4 branch; /* Branch to chained destination */
731 const ClassObject *clazz; /* key #1 for prediction */
732 const Method *method; /* key #2 to lookup native PC from dalvik PC */
733 u4 counter; /* counter to patch the chaining cell */
734} PredictedChainingCell;
735
736/* Init values when a predicted chain is initially assembled */
737#define PREDICTED_CHAIN_BX_PAIR_INIT 0
738#define PREDICTED_CHAIN_CLAZZ_INIT 0
739#define PREDICTED_CHAIN_METHOD_INIT 0
740#define PREDICTED_CHAIN_COUNTER_INIT 0
741
742/* Used when the callee is not compiled yet */
Ben Chenga8e64a72009-10-20 13:01:36 -0700743#define PREDICTED_CHAIN_COUNTER_DELAY 512
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700744
745/* Rechain after this many mis-predictions have happened */
Ben Chenga8e64a72009-10-20 13:01:36 -0700746#define PREDICTED_CHAIN_COUNTER_RECHAIN 8192
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700747
748/* Used if the resolved callee is a native method */
749#define PREDICTED_CHAIN_COUNTER_AVOID 0x7fffffff
750
751/* Utility macros to traverse the LIR/ArmLIR list */
752#define NEXT_LIR(lir) ((ArmLIR *) lir->generic.next)
753#define PREV_LIR(lir) ((ArmLIR *) lir->generic.prev)
754
755#define NEXT_LIR_LVALUE(lir) (lir)->generic.next
756#define PREV_LIR_LVALUE(lir) (lir)->generic.prev
757
758#define CHAIN_CELL_OFFSET_TAG 0xcdab
759
Bill Buzbee270c1d62009-08-13 16:58:07 -0700760ArmLIR* dvmCompilerRegCopy(CompilationUnit *cUnit, int rDest, int rSrc);
761
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700762#endif /* _DALVIK_VM_COMPILER_CODEGEN_ARM_ARMLIR_H */