blob: c47c29177442cf829628a6ba2af186d74a318afb [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]
buzbee9f601a92011-02-11 17:48:20 -080027 * r6 (rSELF) is reserved [holds current &Thread]
Bill Buzbee9bc3df32009-07-30 10:52:29 -070028 * 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,
Ben Cheng7ab74e12011-02-03 14:02:06 -0800132 kFPStatus, // FP status word
133 // The following four bits are for memory disambiguation
134 kDalvikReg, // 1 Dalvik Frame (can be fully disambiguated)
135 kLiteral, // 2 Literal pool (can be fully disambiguated)
136 kHeapRef, // 3 Somewhere on the heap (alias with any other heap)
137 kMustNotAlias, // 4 Guaranteed to be non-alias (eg *(r6+x))
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
Ben Cheng7ab74e12011-02-03 14:02:06 -0800147/* Abstract memory locations */
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)
Bill Buzbee1f748632010-03-02 16:14:41 -0800150#define ENCODE_HEAP_REF (1ULL << kHeapRef)
Ben Cheng7ab74e12011-02-03 14:02:06 -0800151#define ENCODE_MUST_NOT_ALIAS (1ULL << kMustNotAlias)
Bill Buzbee1f748632010-03-02 16:14:41 -0800152
Ben Chengd7d426a2009-09-22 11:23:36 -0700153#define ENCODE_ALL (~0ULL)
Ben Cheng7ab74e12011-02-03 14:02:06 -0800154#define ENCODE_MEM (ENCODE_DALVIK_REG | ENCODE_LITERAL | \
155 ENCODE_HEAP_REF | ENCODE_MUST_NOT_ALIAS)
Ben Chengd7d426a2009-09-22 11:23:36 -0700156
157#define DECODE_ALIAS_INFO_REG(X) (X & 0xffff)
158#define DECODE_ALIAS_INFO_WIDE(X) ((X & 0x80000000) ? 1 : 0)
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700159
Bill Buzbee270c1d62009-08-13 16:58:07 -0700160typedef enum OpSize {
Bill Buzbee1465db52009-09-23 17:17:35 -0700161 kWord,
162 kLong,
163 kSingle,
164 kDouble,
165 kUnsignedHalf,
166 kSignedHalf,
167 kUnsignedByte,
168 kSignedByte,
Bill Buzbee270c1d62009-08-13 16:58:07 -0700169} OpSize;
170
171typedef enum OpKind {
Bill Buzbee1465db52009-09-23 17:17:35 -0700172 kOpMov,
173 kOpMvn,
174 kOpCmp,
175 kOpLsl,
176 kOpLsr,
177 kOpAsr,
178 kOpRor,
179 kOpNot,
180 kOpAnd,
181 kOpOr,
182 kOpXor,
183 kOpNeg,
184 kOpAdd,
185 kOpAdc,
186 kOpSub,
187 kOpSbc,
188 kOpRsub,
189 kOpMul,
190 kOpDiv,
191 kOpRem,
192 kOpBic,
193 kOpCmn,
194 kOpTst,
195 kOpBkpt,
196 kOpBlx,
197 kOpPush,
198 kOpPop,
199 kOp2Char,
200 kOp2Short,
201 kOp2Byte,
202 kOpCondBr,
203 kOpUncondBr,
Bill Buzbee270c1d62009-08-13 16:58:07 -0700204} OpKind;
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700205
Ben Cheng20d7e6c2011-02-18 17:12:42 -0800206/*
207 * Annotate special-purpose core registers:
208 * - VM: r4PC, r5FP, and r6SELF
209 * - ARM architecture: r13sp, r14lr, and r15pc
210 *
211 * rPC, rFP, and rSELF are for architecture-independent code to use.
212 */
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700213typedef enum NativeRegisterPool {
Ben Cheng20d7e6c2011-02-18 17:12:42 -0800214 r0 = 0,
215 r1 = 1,
216 r2 = 2,
217 r3 = 3,
218 rPC = 4,
219 r4PC = rPC,
220 rFP = 5,
221 r5FP = rFP,
222 rSELF = 6,
223 r6SELF = rSELF,
224 r7 = 7,
225 r8 = 8,
226 r9 = 9,
227 r10 = 10,
228 r11 = 11,
229 r12 = 12,
230 r13sp = 13,
231 r14lr = 14,
232 r15pc = 15,
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700233 fr0 = 0 + FP_REG_OFFSET,
234 fr1 = 1 + FP_REG_OFFSET,
235 fr2 = 2 + FP_REG_OFFSET,
236 fr3 = 3 + FP_REG_OFFSET,
237 fr4 = 4 + FP_REG_OFFSET,
238 fr5 = 5 + FP_REG_OFFSET,
239 fr6 = 6 + FP_REG_OFFSET,
240 fr7 = 7 + FP_REG_OFFSET,
241 fr8 = 8 + FP_REG_OFFSET,
242 fr9 = 9 + FP_REG_OFFSET,
243 fr10 = 10 + FP_REG_OFFSET,
244 fr11 = 11 + FP_REG_OFFSET,
245 fr12 = 12 + FP_REG_OFFSET,
246 fr13 = 13 + FP_REG_OFFSET,
247 fr14 = 14 + FP_REG_OFFSET,
248 fr15 = 15 + FP_REG_OFFSET,
249 fr16 = 16 + FP_REG_OFFSET,
250 fr17 = 17 + FP_REG_OFFSET,
251 fr18 = 18 + FP_REG_OFFSET,
252 fr19 = 19 + FP_REG_OFFSET,
253 fr20 = 20 + FP_REG_OFFSET,
254 fr21 = 21 + FP_REG_OFFSET,
255 fr22 = 22 + FP_REG_OFFSET,
256 fr23 = 23 + FP_REG_OFFSET,
257 fr24 = 24 + FP_REG_OFFSET,
258 fr25 = 25 + FP_REG_OFFSET,
259 fr26 = 26 + FP_REG_OFFSET,
260 fr27 = 27 + FP_REG_OFFSET,
261 fr28 = 28 + FP_REG_OFFSET,
262 fr29 = 29 + FP_REG_OFFSET,
263 fr30 = 30 + FP_REG_OFFSET,
264 fr31 = 31 + FP_REG_OFFSET,
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700265 dr0 = fr0 + FP_DOUBLE,
266 dr1 = fr2 + FP_DOUBLE,
267 dr2 = fr4 + FP_DOUBLE,
268 dr3 = fr6 + FP_DOUBLE,
269 dr4 = fr8 + FP_DOUBLE,
270 dr5 = fr10 + FP_DOUBLE,
271 dr6 = fr12 + FP_DOUBLE,
272 dr7 = fr14 + FP_DOUBLE,
273 dr8 = fr16 + FP_DOUBLE,
274 dr9 = fr18 + FP_DOUBLE,
275 dr10 = fr20 + FP_DOUBLE,
276 dr11 = fr22 + FP_DOUBLE,
277 dr12 = fr24 + FP_DOUBLE,
278 dr13 = fr26 + FP_DOUBLE,
279 dr14 = fr28 + FP_DOUBLE,
280 dr15 = fr30 + FP_DOUBLE,
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700281} NativeRegisterPool;
282
Bill Buzbee1465db52009-09-23 17:17:35 -0700283/* Shift encodings */
284typedef enum ArmShiftEncodings {
285 kArmLsl = 0x0,
286 kArmLsr = 0x1,
287 kArmAsr = 0x2,
288 kArmRor = 0x3
289} ArmShiftEncodings;
290
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700291/* Thumb condition encodings */
292typedef enum ArmConditionCode {
Bill Buzbee1465db52009-09-23 17:17:35 -0700293 kArmCondEq = 0x0, /* 0000 */
294 kArmCondNe = 0x1, /* 0001 */
295 kArmCondCs = 0x2, /* 0010 */
296 kArmCondCc = 0x3, /* 0011 */
297 kArmCondMi = 0x4, /* 0100 */
298 kArmCondPl = 0x5, /* 0101 */
299 kArmCondVs = 0x6, /* 0110 */
300 kArmCondVc = 0x7, /* 0111 */
301 kArmCondHi = 0x8, /* 1000 */
302 kArmCondLs = 0x9, /* 1001 */
303 kArmCondGe = 0xa, /* 1010 */
304 kArmCondLt = 0xb, /* 1011 */
305 kArmCondGt = 0xc, /* 1100 */
306 kArmCondLe = 0xd, /* 1101 */
307 kArmCondAl = 0xe, /* 1110 */
308 kArmCondNv = 0xf, /* 1111 */
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700309} ArmConditionCode;
310
Dan Bornstein9a1f8162010-12-01 17:02:26 -0800311#define isPseudoOpcode(opcode) ((int)(opcode) < 0)
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700312
313/*
314 * The following enum defines the list of supported Thumb instructions by the
315 * assembler. Their corresponding snippet positions will be defined in
316 * Assemble.c.
317 */
Dan Bornstein9a1f8162010-12-01 17:02:26 -0800318typedef enum ArmOpcode {
Ben Chengcec26f62010-01-15 15:29:33 -0800319 kArmChainingCellBottom = -18,
Bill Buzbee1465db52009-09-23 17:17:35 -0700320 kArmPseudoBarrier = -17,
321 kArmPseudoExtended = -16,
322 kArmPseudoSSARep = -15,
Ben Chenga4973592010-03-31 11:59:18 -0700323 kArmPseudoEntryBlock = -14,
324 kArmPseudoExitBlock = -13,
Bill Buzbee1465db52009-09-23 17:17:35 -0700325 kArmPseudoTargetLabel = -12,
Ben Chenga4973592010-03-31 11:59:18 -0700326 kArmPseudoChainingCellBackwardBranch = -11,
327 kArmPseudoChainingCellHot = -10,
328 kArmPseudoChainingCellInvokePredicted = -9,
329 kArmPseudoChainingCellInvokeSingleton = -8,
330 kArmPseudoChainingCellNormal = -7,
331 kArmPseudoDalvikByteCodeBoundary = -6,
Bill Buzbee1465db52009-09-23 17:17:35 -0700332 kArmPseudoPseudoAlign4 = -5,
Ben Chenga4973592010-03-31 11:59:18 -0700333 kArmPseudoPCReconstructionCell = -4,
334 kArmPseudoPCReconstructionBlockLabel = -3,
Bill Buzbee1465db52009-09-23 17:17:35 -0700335 kArmPseudoEHBlockLabel = -2,
336 kArmPseudoNormalBlockLabel = -1,
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700337 /************************************************************************/
Bill Buzbee1465db52009-09-23 17:17:35 -0700338 kArm16BitData, /* DATA [0] rd[15..0] */
339 kThumbAdcRR, /* adc [0100000101] rm[5..3] rd[2..0] */
340 kThumbAddRRI3, /* add(1) [0001110] imm_3[8..6] rn[5..3] rd[2..0]*/
341 kThumbAddRI8, /* add(2) [00110] rd[10..8] imm_8[7..0] */
342 kThumbAddRRR, /* add(3) [0001100] rm[8..6] rn[5..3] rd[2..0] */
343 kThumbAddRRLH, /* add(4) [01000100] H12[01] rm[5..3] rd[2..0] */
344 kThumbAddRRHL, /* add(4) [01001000] H12[10] rm[5..3] rd[2..0] */
345 kThumbAddRRHH, /* add(4) [01001100] H12[11] rm[5..3] rd[2..0] */
346 kThumbAddPcRel, /* add(5) [10100] rd[10..8] imm_8[7..0] */
347 kThumbAddSpRel, /* add(6) [10101] rd[10..8] imm_8[7..0] */
348 kThumbAddSpI7, /* add(7) [101100000] imm_7[6..0] */
349 kThumbAndRR, /* and [0100000000] rm[5..3] rd[2..0] */
350 kThumbAsrRRI5, /* asr(1) [00010] imm_5[10..6] rm[5..3] rd[2..0] */
351 kThumbAsrRR, /* asr(2) [0100000100] rs[5..3] rd[2..0] */
352 kThumbBCond, /* b(1) [1101] cond[11..8] offset_8[7..0] */
353 kThumbBUncond, /* b(2) [11100] offset_11[10..0] */
354 kThumbBicRR, /* bic [0100001110] rm[5..3] rd[2..0] */
355 kThumbBkpt, /* bkpt [10111110] imm_8[7..0] */
356 kThumbBlx1, /* blx(1) [111] H[10] offset_11[10..0] */
357 kThumbBlx2, /* blx(1) [111] H[01] offset_11[10..0] */
358 kThumbBl1, /* blx(1) [111] H[10] offset_11[10..0] */
359 kThumbBl2, /* blx(1) [111] H[11] offset_11[10..0] */
360 kThumbBlxR, /* blx(2) [010001111] rm[6..3] [000] */
361 kThumbBx, /* bx [010001110] H2[6..6] rm[5..3] SBZ[000] */
362 kThumbCmnRR, /* cmn [0100001011] rm[5..3] rd[2..0] */
363 kThumbCmpRI8, /* cmp(1) [00101] rn[10..8] imm_8[7..0] */
364 kThumbCmpRR, /* cmp(2) [0100001010] rm[5..3] rd[2..0] */
365 kThumbCmpLH, /* cmp(3) [01000101] H12[01] rm[5..3] rd[2..0] */
366 kThumbCmpHL, /* cmp(3) [01000110] H12[10] rm[5..3] rd[2..0] */
367 kThumbCmpHH, /* cmp(3) [01000111] H12[11] rm[5..3] rd[2..0] */
368 kThumbEorRR, /* eor [0100000001] rm[5..3] rd[2..0] */
369 kThumbLdmia, /* ldmia [11001] rn[10..8] reglist [7..0] */
370 kThumbLdrRRI5, /* ldr(1) [01101] imm_5[10..6] rn[5..3] rd[2..0] */
371 kThumbLdrRRR, /* ldr(2) [0101100] rm[8..6] rn[5..3] rd[2..0] */
372 kThumbLdrPcRel, /* ldr(3) [01001] rd[10..8] imm_8[7..0] */
373 kThumbLdrSpRel, /* ldr(4) [10011] rd[10..8] imm_8[7..0] */
374 kThumbLdrbRRI5, /* ldrb(1) [01111] imm_5[10..6] rn[5..3] rd[2..0] */
375 kThumbLdrbRRR, /* ldrb(2) [0101110] rm[8..6] rn[5..3] rd[2..0] */
376 kThumbLdrhRRI5, /* ldrh(1) [10001] imm_5[10..6] rn[5..3] rd[2..0] */
377 kThumbLdrhRRR, /* ldrh(2) [0101101] rm[8..6] rn[5..3] rd[2..0] */
378 kThumbLdrsbRRR, /* ldrsb [0101011] rm[8..6] rn[5..3] rd[2..0] */
379 kThumbLdrshRRR, /* ldrsh [0101111] rm[8..6] rn[5..3] rd[2..0] */
380 kThumbLslRRI5, /* lsl(1) [00000] imm_5[10..6] rm[5..3] rd[2..0] */
381 kThumbLslRR, /* lsl(2) [0100000010] rs[5..3] rd[2..0] */
382 kThumbLsrRRI5, /* lsr(1) [00001] imm_5[10..6] rm[5..3] rd[2..0] */
383 kThumbLsrRR, /* lsr(2) [0100000011] rs[5..3] rd[2..0] */
384 kThumbMovImm, /* mov(1) [00100] rd[10..8] imm_8[7..0] */
385 kThumbMovRR, /* mov(2) [0001110000] rn[5..3] rd[2..0] */
386 kThumbMovRR_H2H, /* mov(3) [01000111] H12[11] rm[5..3] rd[2..0] */
387 kThumbMovRR_H2L, /* mov(3) [01000110] H12[01] rm[5..3] rd[2..0] */
388 kThumbMovRR_L2H, /* mov(3) [01000101] H12[10] rm[5..3] rd[2..0] */
389 kThumbMul, /* mul [0100001101] rm[5..3] rd[2..0] */
390 kThumbMvn, /* mvn [0100001111] rm[5..3] rd[2..0] */
391 kThumbNeg, /* neg [0100001001] rm[5..3] rd[2..0] */
392 kThumbOrr, /* orr [0100001100] rm[5..3] rd[2..0] */
393 kThumbPop, /* pop [1011110] r[8..8] rl[7..0] */
394 kThumbPush, /* push [1011010] r[8..8] rl[7..0] */
Bill Buzbee799cdf92009-10-30 15:00:52 -0700395 kThumbRorRR, /* ror [0100000111] rs[5..3] rd[2..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700396 kThumbSbc, /* sbc [0100000110] rm[5..3] rd[2..0] */
397 kThumbStmia, /* stmia [11000] rn[10..8] reglist [7.. 0] */
398 kThumbStrRRI5, /* str(1) [01100] imm_5[10..6] rn[5..3] rd[2..0] */
399 kThumbStrRRR, /* str(2) [0101000] rm[8..6] rn[5..3] rd[2..0] */
400 kThumbStrSpRel, /* str(3) [10010] rd[10..8] imm_8[7..0] */
401 kThumbStrbRRI5, /* strb(1) [01110] imm_5[10..6] rn[5..3] rd[2..0] */
402 kThumbStrbRRR, /* strb(2) [0101010] rm[8..6] rn[5..3] rd[2..0] */
403 kThumbStrhRRI5, /* strh(1) [10000] imm_5[10..6] rn[5..3] rd[2..0] */
404 kThumbStrhRRR, /* strh(2) [0101001] rm[8..6] rn[5..3] rd[2..0] */
405 kThumbSubRRI3, /* sub(1) [0001111] imm_3[8..6] rn[5..3] rd[2..0]*/
406 kThumbSubRI8, /* sub(2) [00111] rd[10..8] imm_8[7..0] */
407 kThumbSubRRR, /* sub(3) [0001101] rm[8..6] rn[5..3] rd[2..0] */
408 kThumbSubSpI7, /* sub(4) [101100001] imm_7[6..0] */
409 kThumbSwi, /* swi [11011111] imm_8[7..0] */
410 kThumbTst, /* tst [0100001000] rm[5..3] rn[2..0] */
411 kThumb2Vldrs, /* vldr low sx [111011011001] rn[19..16] rd[15-12]
412 [1010] imm_8[7..0] */
413 kThumb2Vldrd, /* vldr low dx [111011011001] rn[19..16] rd[15-12]
414 [1011] imm_8[7..0] */
415 kThumb2Vmuls, /* vmul vd, vn, vm [111011100010] rn[19..16]
416 rd[15-12] [10100000] rm[3..0] */
417 kThumb2Vmuld, /* vmul vd, vn, vm [111011100010] rn[19..16]
418 rd[15-12] [10110000] rm[3..0] */
419 kThumb2Vstrs, /* vstr low sx [111011011000] rn[19..16] rd[15-12]
420 [1010] imm_8[7..0] */
421 kThumb2Vstrd, /* vstr low dx [111011011000] rn[19..16] rd[15-12]
422 [1011] imm_8[7..0] */
423 kThumb2Vsubs, /* vsub vd, vn, vm [111011100011] rn[19..16]
424 rd[15-12] [10100040] rm[3..0] */
425 kThumb2Vsubd, /* vsub vd, vn, vm [111011100011] rn[19..16]
426 rd[15-12] [10110040] rm[3..0] */
427 kThumb2Vadds, /* vadd vd, vn, vm [111011100011] rn[19..16]
428 rd[15-12] [10100000] rm[3..0] */
429 kThumb2Vaddd, /* vadd vd, vn, vm [111011100011] rn[19..16]
430 rd[15-12] [10110000] rm[3..0] */
431 kThumb2Vdivs, /* vdiv vd, vn, vm [111011101000] rn[19..16]
432 rd[15-12] [10100000] rm[3..0] */
433 kThumb2Vdivd, /* vdiv vd, vn, vm [111011101000] rn[19..16]
434 rd[15-12] [10110000] rm[3..0] */
435 kThumb2VcvtIF, /* vcvt.F32 vd, vm [1110111010111000] vd[15..12]
436 [10101100] vm[3..0] */
437 kThumb2VcvtID, /* vcvt.F64 vd, vm [1110111010111000] vd[15..12]
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700438 [10111100] vm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700439 kThumb2VcvtFI, /* vcvt.S32.F32 vd, vm [1110111010111101] vd[15..12]
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700440 [10101100] vm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700441 kThumb2VcvtDI, /* vcvt.S32.F32 vd, vm [1110111010111101] vd[15..12]
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700442 [10111100] vm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700443 kThumb2VcvtFd, /* vcvt.F64.F32 vd, vm [1110111010110111] vd[15..12]
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700444 [10101100] vm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700445 kThumb2VcvtDF, /* vcvt.F32.F64 vd, vm [1110111010110111] vd[15..12]
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700446 [10111100] vm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700447 kThumb2Vsqrts, /* vsqrt.f32 vd, vm [1110111010110001] vd[15..12]
Bill Buzbee9727c3d2009-08-01 11:32:36 -0700448 [10101100] vm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700449 kThumb2Vsqrtd, /* vsqrt.f64 vd, vm [1110111010110001] vd[15..12]
Bill Buzbee9727c3d2009-08-01 11:32:36 -0700450 [10111100] vm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700451 kThumb2MovImmShift, /* mov(T2) rd, #<const> [11110] i [00001001111]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700452 imm3 rd[11..8] imm8 */
Bill Buzbee1465db52009-09-23 17:17:35 -0700453 kThumb2MovImm16, /* mov(T3) rd, #<const> [11110] i [0010100] imm4 [0]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700454 imm3 rd[11..8] imm8 */
Bill Buzbee1465db52009-09-23 17:17:35 -0700455 kThumb2StrRRI12, /* str(Imm,T3) rd,[rn,#imm12] [111110001100]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700456 rn[19..16] rt[15..12] imm12[11..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700457 kThumb2LdrRRI12, /* str(Imm,T3) rd,[rn,#imm12] [111110001100]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700458 rn[19..16] rt[15..12] imm12[11..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700459 kThumb2StrRRI8Predec, /* str(Imm,T4) rd,[rn,#-imm8] [111110000100]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700460 rn[19..16] rt[15..12] [1100] imm[7..0]*/
Bill Buzbee1465db52009-09-23 17:17:35 -0700461 kThumb2LdrRRI8Predec, /* ldr(Imm,T4) rd,[rn,#-imm8] [111110000101]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700462 rn[19..16] rt[15..12] [1100] imm[7..0]*/
Bill Buzbee1465db52009-09-23 17:17:35 -0700463 kThumb2Cbnz, /* cbnz rd,<label> [101110] i [1] imm5[7..3]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700464 rn[2..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700465 kThumb2Cbz, /* cbn rd,<label> [101100] i [1] imm5[7..3]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700466 rn[2..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700467 kThumb2AddRRI12, /* add rd, rn, #imm12 [11110] i [100000] rn[19..16]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700468 [0] imm3[14..12] rd[11..8] imm8[7..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700469 kThumb2MovRR, /* mov rd, rm [11101010010011110000] rd[11..8]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700470 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700471 kThumb2Vmovs, /* vmov.f32 vd, vm [111011101] D [110000]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700472 vd[15..12] 101001] M [0] vm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700473 kThumb2Vmovd, /* vmov.f64 vd, vm [111011101] D [110000]
Bill Buzbee7ea0f642009-08-10 17:06:51 -0700474 vd[15..12] 101101] M [0] vm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700475 kThumb2Ldmia, /* ldmia [111010001001[ rn[19..16] mask[15..0] */
476 kThumb2Stmia, /* stmia [111010001000[ rn[19..16] mask[15..0] */
477 kThumb2AddRRR, /* add [111010110000] rn[19..16] [0000] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700478 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700479 kThumb2SubRRR, /* sub [111010111010] rn[19..16] [0000] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700480 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700481 kThumb2SbcRRR, /* sbc [111010110110] rn[19..16] [0000] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700482 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700483 kThumb2CmpRR, /* cmp [111010111011] rn[19..16] [0000] [1111]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700484 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700485 kThumb2SubRRI12, /* sub rd, rn, #imm12 [11110] i [01010] rn[19..16]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700486 [0] imm3[14..12] rd[11..8] imm8[7..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700487 kThumb2MvnImmShift, /* mov(T2) rd, #<const> [11110] i [00011011110]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700488 imm3 rd[11..8] imm8 */
Bill Buzbee1465db52009-09-23 17:17:35 -0700489 kThumb2Sel, /* sel rd, rn, rm [111110101010] rn[19-16] rd[11-8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700490 rm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700491 kThumb2Ubfx, /* ubfx rd,rn,#lsb,#width [111100111100] rn[19..16]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700492 [0] imm3[14-12] rd[11-8] w[4-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700493 kThumb2Sbfx, /* ubfx rd,rn,#lsb,#width [111100110100] rn[19..16]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700494 [0] imm3[14-12] rd[11-8] w[4-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700495 kThumb2LdrRRR, /* ldr 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 kThumb2LdrhRRR, /* ldrh 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 kThumb2LdrshRRR, /* ldrsh rt,[rn,rm,LSL #imm] [111110000101] 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 kThumb2LdrbRRR, /* ldrb rt,[rn,rm,LSL #imm] [111110000101] 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 kThumb2LdrsbRRR, /* ldrsb rt,[rn,rm,LSL #imm] [111110000101] 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 kThumb2StrRRR, /* str rt,[rn,rm,LSL #imm] [111110000100] rn[19-16]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700506 rt[15-12] [000000] imm[5-4] rm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700507 kThumb2StrhRRR, /* str rt,[rn,rm,LSL #imm] [111110000010] rn[19-16]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700508 rt[15-12] [000000] imm[5-4] rm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700509 kThumb2StrbRRR, /* str rt,[rn,rm,LSL #imm] [111110000000] rn[19-16]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700510 rt[15-12] [000000] imm[5-4] rm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700511 kThumb2LdrhRRI12, /* ldrh rt,[rn,#imm12] [111110001011]
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 kThumb2LdrshRRI12, /* ldrsh rt,[rn,#imm12] [111110011011]
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 kThumb2LdrbRRI12, /* ldrb rt,[rn,#imm12] [111110001001]
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 kThumb2LdrsbRRI12, /* ldrsb rt,[rn,#imm12] [111110011001]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700518 rt[15..12] rn[19..16] imm12[11..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700519 kThumb2StrhRRI12, /* strh rt,[rn,#imm12] [111110001010]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700520 rt[15..12] rn[19..16] imm12[11..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700521 kThumb2StrbRRI12, /* strb rt,[rn,#imm12] [111110001000]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700522 rt[15..12] rn[19..16] imm12[11..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700523 kThumb2Pop, /* pop [1110100010111101] list[15-0]*/
Ben Cheng18c990e2011-01-24 10:14:29 -0800524 kThumb2Push, /* push [1110100100101101] list[15-0]*/
Bill Buzbee1465db52009-09-23 17:17:35 -0700525 kThumb2CmpRI8, /* cmp rn, #<const> [11110] i [011011] rn[19-16] [0]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700526 imm3 [1111] imm8[7..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700527 kThumb2AdcRRR, /* adc [111010110101] rn[19..16] [0000] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700528 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700529 kThumb2AndRRR, /* and [111010100000] 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 kThumb2BicRRR, /* bic [111010100010] rn[19..16] [0000] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700532 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700533 kThumb2CmnRR, /* cmn [111010110001] rn[19..16] [0000] [1111]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700534 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700535 kThumb2EorRRR, /* eor [111010101000] rn[19..16] [0000] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700536 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700537 kThumb2MulRRR, /* mul [111110110000] rn[19..16] [1111] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700538 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700539 kThumb2MnvRR, /* mvn [11101010011011110] rd[11-8] [0000]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700540 rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700541 kThumb2RsubRRI8, /* rsub [111100011100] rn[19..16] [0000] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700542 imm8[7..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700543 kThumb2NegRR, /* actually rsub rd, rn, #0 */
544 kThumb2OrrRRR, /* orr [111010100100] rn[19..16] [0000] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700545 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700546 kThumb2TstRR, /* tst [111010100001] rn[19..16] [0000] [1111]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700547 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700548 kThumb2LslRRR, /* lsl [111110100000] 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 kThumb2LsrRRR, /* lsr [111110100010] rn[19..16] [1111] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700551 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700552 kThumb2AsrRRR, /* asr [111110100100] rn[19..16] [1111] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700553 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700554 kThumb2RorRRR, /* ror [111110100110] rn[19..16] [1111] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700555 [0000] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700556 kThumb2LslRRI5, /* lsl [11101010010011110] imm[14.12] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700557 [00] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700558 kThumb2LsrRRI5, /* lsr [11101010010011110] imm[14.12] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700559 [01] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700560 kThumb2AsrRRI5, /* asr [11101010010011110] imm[14.12] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700561 [10] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700562 kThumb2RorRRI5, /* ror [11101010010011110] imm[14.12] rd[11..8]
Bill Buzbee270c1d62009-08-13 16:58:07 -0700563 [11] rm[3..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700564 kThumb2BicRRI8, /* bic [111100000010] 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 kThumb2AndRRI8, /* bic [111100000000] 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 kThumb2OrrRRI8, /* orr [111100000100] 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 kThumb2EorRRI8, /* eor [111100001000] 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 kThumb2AddRRI8, /* add [111100001000] 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 kThumb2AdcRRI8, /* adc [111100010101] rn[19..16] [0] imm3
Bill Buzbee270c1d62009-08-13 16:58:07 -0700575 rd[11..8] imm8 */
Bill Buzbee1465db52009-09-23 17:17:35 -0700576 kThumb2SubRRI8, /* sub [111100011011] rn[19..16] [0] imm3
Bill Buzbee270c1d62009-08-13 16:58:07 -0700577 rd[11..8] imm8 */
Bill Buzbee1465db52009-09-23 17:17:35 -0700578 kThumb2SbcRRI8, /* sbc [111100010111] rn[19..16] [0] imm3
Bill Buzbee270c1d62009-08-13 16:58:07 -0700579 rd[11..8] imm8 */
Bill Buzbee1465db52009-09-23 17:17:35 -0700580 kThumb2It, /* it [10111111] firstcond[7-4] mask[3-0] */
581 kThumb2Fmstat, /* fmstat [11101110111100011111101000010000] */
582 kThumb2Vcmpd, /* vcmp [111011101] D [11011] rd[15-12] [1011]
Bill Buzbeea4a7f072009-08-27 13:58:09 -0700583 E [1] M [0] rm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700584 kThumb2Vcmps, /* vcmp [111011101] D [11010] rd[15-12] [1011]
Bill Buzbeea4a7f072009-08-27 13:58:09 -0700585 E [1] M [0] rm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700586 kThumb2LdrPcRel12, /* ldr rd,[pc,#imm12] [1111100011011111] rt[15-12]
587 imm12[11-0] */
588 kThumb2BCond, /* b<c> [1110] S cond[25-22] imm6[21-16] [10]
Bill Buzbeea4a7f072009-08-27 13:58:09 -0700589 J1 [0] J2 imm11[10..0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700590 kThumb2Vmovd_RR, /* vmov [111011101] D [110000] vd[15-12 [101101]
Bill Buzbee7fb2edd2009-08-31 10:25:55 -0700591 M [0] vm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700592 kThumb2Vmovs_RR, /* vmov [111011101] D [110000] vd[15-12 [101001]
Bill Buzbee7fb2edd2009-08-31 10:25:55 -0700593 M [0] vm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700594 kThumb2Fmrs, /* vmov [111011100000] vn[19-16] rt[15-12] [1010]
Bill Buzbee7fb2edd2009-08-31 10:25:55 -0700595 N [0010000] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700596 kThumb2Fmsr, /* vmov [111011100001] vn[19-16] rt[15-12] [1010]
Bill Buzbee7fb2edd2009-08-31 10:25:55 -0700597 N [0010000] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700598 kThumb2Fmrrd, /* vmov [111011000100] rt2[19-16] rt[15-12]
Bill Buzbee7fb2edd2009-08-31 10:25:55 -0700599 [101100] M [1] vm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700600 kThumb2Fmdrr, /* vmov [111011000101] rt2[19-16] rt[15-12]
Bill Buzbee7fb2edd2009-08-31 10:25:55 -0700601 [101100] M [1] vm[3-0] */
Bill Buzbee1465db52009-09-23 17:17:35 -0700602 kThumb2Vabsd, /* vabs.f64 [111011101] D [110000] rd[15-12]
603 [1011110] M [0] vm[3-0] */
604 kThumb2Vabss, /* vabs.f32 [111011101] D [110000] rd[15-12]
605 [1010110] M [0] vm[3-0] */
606 kThumb2Vnegd, /* vneg.f64 [111011101] D [110000] rd[15-12]
607 [1011110] M [0] vm[3-0] */
608 kThumb2Vnegs, /* vneg.f32 [111011101] D [110000] rd[15-12]
609 [1010110] M [0] vm[3-0] */
610 kThumb2Vmovs_IMM8, /* vmov.f32 [111011101] D [11] imm4h[19-16] vd[15-12]
611 [10100000] imm4l[3-0] */
612 kThumb2Vmovd_IMM8, /* vmov.f64 [111011101] D [11] imm4h[19-16] vd[15-12]
613 [10110000] imm4l[3-0] */
614 kThumb2Mla, /* mla [111110110000] rn[19-16] ra[15-12] rd[7-4]
615 [0000] rm[3-0] */
616 kThumb2Umull, /* umull [111110111010] rn[19-16], rdlo[15-12]
617 rdhi[11-8] [0000] rm[3-0] */
618 kThumb2Ldrex, /* ldrex [111010000101] rn[19-16] rt[11-8] [1111]
619 imm8[7-0] */
620 kThumb2Strex, /* strex [111010000100] rn[19-16] rt[11-8] rd[11-8]
621 imm8[7-0] */
Bill Buzbeed0937ef2009-12-22 16:15:39 -0800622 kThumb2Clrex, /* clrex [111100111011111110000111100101111] */
623 kThumb2Bfi, /* bfi [111100110110] rn[19-16] [0] imm3[14-12]
624 rd[11-8] imm2[7-6] [0] msb[4-0] */
625 kThumb2Bfc, /* bfc [11110011011011110] [0] imm3[14-12]
626 rd[11-8] imm2[7-6] [0] msb[4-0] */
buzbeeecf8f6e2010-07-20 14:53:42 -0700627 kThumb2Dmb, /* dmb [1111001110111111100011110101] option[3-0] */
buzbee2e152ba2010-12-15 16:32:35 -0800628 kThumb2LdrPcReln12, /* ldr rd,[pc,-#imm12] [1111100011011111] rt[15-12]
629 imm12[11-0] */
Bill Buzbee7fb2edd2009-08-31 10:25:55 -0700630
Bill Buzbee1465db52009-09-23 17:17:35 -0700631 kArmLast,
Dan Bornstein9a1f8162010-12-01 17:02:26 -0800632} ArmOpcode;
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700633
buzbeeecf8f6e2010-07-20 14:53:42 -0700634/* DMB option encodings */
635typedef enum ArmOpDmbOptions {
636 kSY = 0xf,
637 kST = 0xe,
638 kISH = 0xb,
639 kISHST = 0xa,
640 kNSH = 0x7,
641 kNSHST = 0x6
642} ArmOpDmbOptions;
643
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700644/* Bit flags describing the behavior of each native opcode */
645typedef enum ArmOpFeatureFlags {
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700646 kIsBranch = 0,
647 kRegDef0,
648 kRegDef1,
649 kRegDefSP,
Ben Chengd7d426a2009-09-22 11:23:36 -0700650 kRegDefLR,
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700651 kRegDefList0,
652 kRegDefList1,
653 kRegUse0,
654 kRegUse1,
655 kRegUse2,
Bill Buzbee1465db52009-09-23 17:17:35 -0700656 kRegUse3,
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700657 kRegUseSP,
658 kRegUsePC,
659 kRegUseList0,
660 kRegUseList1,
661 kNoOperand,
662 kIsUnaryOp,
663 kIsBinaryOp,
664 kIsTertiaryOp,
665 kIsQuadOp,
666 kIsIT,
667 kSetsCCodes,
668 kUsesCCodes,
Bill Buzbee1f748632010-03-02 16:14:41 -0800669 kMemLoad,
670 kMemStore,
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700671} ArmOpFeatureFlags;
672
Bill Buzbee1f748632010-03-02 16:14:41 -0800673#define IS_LOAD (1 << kMemLoad)
674#define IS_STORE (1 << kMemStore)
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700675#define IS_BRANCH (1 << kIsBranch)
676#define REG_DEF0 (1 << kRegDef0)
677#define REG_DEF1 (1 << kRegDef1)
678#define REG_DEF_SP (1 << kRegDefSP)
Ben Chengd7d426a2009-09-22 11:23:36 -0700679#define REG_DEF_LR (1 << kRegDefLR)
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700680#define REG_DEF_LIST0 (1 << kRegDefList0)
681#define REG_DEF_LIST1 (1 << kRegDefList1)
682#define REG_USE0 (1 << kRegUse0)
683#define REG_USE1 (1 << kRegUse1)
684#define REG_USE2 (1 << kRegUse2)
Bill Buzbee1465db52009-09-23 17:17:35 -0700685#define REG_USE3 (1 << kRegUse3)
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700686#define REG_USE_SP (1 << kRegUseSP)
Ben Chengd7d426a2009-09-22 11:23:36 -0700687#define REG_USE_PC (1 << kRegUsePC)
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700688#define REG_USE_LIST0 (1 << kRegUseList0)
689#define REG_USE_LIST1 (1 << kRegUseList1)
690#define NO_OPERAND (1 << kNoOperand)
691#define IS_UNARY_OP (1 << kIsUnaryOp)
692#define IS_BINARY_OP (1 << kIsBinaryOp)
693#define IS_TERTIARY_OP (1 << kIsTertiaryOp)
694#define IS_QUAD_OP (1 << kIsQuadOp)
695#define IS_IT (1 << kIsIT)
696#define SETS_CCODES (1 << kSetsCCodes)
697#define USES_CCODES (1 << kUsesCCodes)
698
699/* Common combo register usage patterns */
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700700#define REG_USE01 (REG_USE0 | REG_USE1)
Ben Chengd7d426a2009-09-22 11:23:36 -0700701#define REG_USE012 (REG_USE01 | REG_USE2)
702#define REG_USE12 (REG_USE1 | REG_USE2)
703#define REG_DEF0_USE0 (REG_DEF0 | REG_USE0)
704#define REG_DEF0_USE1 (REG_DEF0 | REG_USE1)
705#define REG_DEF0_USE01 (REG_DEF0 | REG_USE01)
706#define REG_DEF0_USE12 (REG_DEF0 | REG_USE12)
707#define REG_DEF01_USE2 (REG_DEF0 | REG_DEF1 | REG_USE2)
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700708
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700709/* Instruction assembly fieldLoc kind */
710typedef enum ArmEncodingKind {
Bill Buzbee1465db52009-09-23 17:17:35 -0700711 kFmtUnused,
712 kFmtBitBlt, /* Bit string using end/start */
713 kFmtDfp, /* Double FP reg */
714 kFmtSfp, /* Single FP reg */
715 kFmtModImm, /* Shifted 8-bit immed using [26,14..12,7..0] */
716 kFmtImm16, /* Zero-extended immed using [26,19..16,14..12,7..0] */
717 kFmtImm6, /* Encoded branch target using [9,7..3]0 */
718 kFmtImm12, /* Zero-extended immediate using [26,14..12,7..0] */
719 kFmtShift, /* Shift descriptor, [14..12,7..4] */
720 kFmtLsb, /* least significant bit using [14..12][7..6] */
721 kFmtBWidth, /* bit-field width, encoded as width-1 */
722 kFmtShift5, /* Shift count, [14..12,7..6] */
723 kFmtBrOffset, /* Signed extended [26,11,13,21-16,10-0]:0 */
724 kFmtFPImm, /* Encoded floating point immediate */
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700725} ArmEncodingKind;
726
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700727/* Struct used to define the snippet positions for each Thumb opcode */
728typedef struct ArmEncodingMap {
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700729 u4 skeleton;
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700730 struct {
Bill Buzbee9bc3df32009-07-30 10:52:29 -0700731 ArmEncodingKind kind;
Bill Buzbee1465db52009-09-23 17:17:35 -0700732 int end; /* end for kFmtBitBlt, 1-bit slice end for FP regs */
733 int start; /* start for kFmtBitBlt, 4-bit slice end for FP regs */
Bill Buzbee270c1d62009-08-13 16:58:07 -0700734 } fieldLoc[4];
Dan Bornstein9a1f8162010-12-01 17:02:26 -0800735 ArmOpcode opcode;
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700736 int flags;
737 char *name;
738 char* fmt;
739 int size;
740} ArmEncodingMap;
741
Bill Buzbee1f748632010-03-02 16:14:41 -0800742/* Keys for target-specific scheduling and other optimization hints */
743typedef enum ArmTargetOptHints {
744 kMaxHoistDistance,
745} ArmTargetOptHints;
746
Bill Buzbee1465db52009-09-23 17:17:35 -0700747extern ArmEncodingMap EncodingMap[kArmLast];
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700748
749/*
750 * Each instance of this struct holds a pseudo or real LIR instruction:
Elliott Hughesb4c05972010-02-24 16:36:18 -0800751 * - pseudo ones (eg labels and marks) and will be discarded by the assembler.
Ben Chengdcf3e5d2009-09-11 13:42:05 -0700752 * - real ones will be assembled into Thumb instructions.
753 *
754 * Machine resources are encoded into a 64-bit vector, where the encodings are
755 * as following:
756 * - [ 0..15]: general purpose registers including PC, SP, and LR
757 * - [16..47]: floating-point registers where d0 is expanded to s[01] and s0
758 * starts at bit 16
759 * - [48]: IT block
760 * - [49]: integer condition code
761 * - [50]: floatint-point status word
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700762 */
763typedef struct ArmLIR {
764 LIR generic;
Dan Bornstein9a1f8162010-12-01 17:02:26 -0800765 ArmOpcode opcode;
Ben Chengd72564c2011-02-08 17:09:25 -0800766 int operands[4]; // [0..3] = [dest, src1, src2, extra]
767 struct {
768 bool isNop:1; // LIR is optimized away
769 bool insertWrapper:1; // insert branch to emulate memory accesses
770 unsigned int age:4; // default is 0, set lazily by the optimizer
771 unsigned int size:3; // bytes (2 for thumb, 2/4 for thumb2)
772 unsigned int unused:23;
773 } flags;
774 int aliasInfo; // For Dalvik register & litpool disambiguation
775 u8 useMask; // Resource mask for use
776 u8 defMask; // Resource mask for def
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700777} ArmLIR;
778
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700779/* Init values when a predicted chain is initially assembled */
Ben Cheng6999d842010-01-26 16:46:15 -0800780/* E7FE is branch to self */
781#define PREDICTED_CHAIN_BX_PAIR_INIT 0xe7fe
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700782
783/* Utility macros to traverse the LIR/ArmLIR list */
784#define NEXT_LIR(lir) ((ArmLIR *) lir->generic.next)
785#define PREV_LIR(lir) ((ArmLIR *) lir->generic.prev)
786
787#define NEXT_LIR_LVALUE(lir) (lir)->generic.next
788#define PREV_LIR_LVALUE(lir) (lir)->generic.prev
789
790#define CHAIN_CELL_OFFSET_TAG 0xcdab
791
Bill Buzbeebd047242010-05-13 13:02:53 -0700792#define CHAIN_CELL_NORMAL_SIZE 12
793#define CHAIN_CELL_PREDICTED_SIZE 16
794
Bill Buzbee89efc3d2009-07-28 11:22:22 -0700795#endif /* _DALVIK_VM_COMPILER_CODEGEN_ARM_ARMLIR_H */