blob: a9c8286b2304daeabac42986401e51d65793a55a [file] [log] [blame]
buzbee67bf8852011-08-17 17:51:35 -07001/*
2 * Copyright (C) 2011 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#ifndef ART_SRC_COMPILER_CODEGEN_ARM_ARMLIR_H_
18#define ART_SRC_COMPILER_CODEGEN_ARM_ARMLIR_H_
19
20#include "../../Dalvik.h"
21#include "../../CompilerInternals.h"
22
Elliott Hughes11d1b0c2012-01-23 16:57:47 -080023namespace art {
24
buzbeec0ecd652011-09-25 18:11:54 -070025// Set to 1 to measure cost of suspend check
26#define NO_SUSPEND 0
27
buzbee67bf8852011-08-17 17:51:35 -070028/*
29 * Runtime register usage conventions.
30 *
31 * r0-r3: Argument registers in both Dalvik and C/C++ conventions.
32 * However, for Dalvik->Dalvik calls we'll pass the target's Method*
33 * pointer in r0 as a hidden arg0. Otherwise used as codegen scratch
34 * registers.
35 * r0-r1: As in C/C++ r0 is 32-bit return register and r0/r1 is 64-bit
buzbee44b412b2012-02-04 08:50:53 -080036 * r4 : (rSUSPEND) is reserved (suspend check/debugger assist)
buzbee67bf8852011-08-17 17:51:35 -070037 * r5 : Callee save (promotion target)
38 * r6 : Callee save (promotion target)
39 * r7 : Callee save (promotion target)
40 * r8 : Callee save (promotion target)
41 * r9 : (rSELF) is reserved (pointer to thread-local storage)
42 * r10 : Callee save (promotion target)
43 * r11 : Callee save (promotion target)
44 * r12 : Scratch, may be trashed by linkage stubs
45 * r13 : (sp) is reserved
46 * r14 : (lr) is reserved
47 * r15 : (pc) is reserved
48 *
49 * 5 core temps that codegen can use (r0, r1, r2, r3, r12)
50 * 7 core registers that can be used for promotion
51 *
52 * Floating pointer registers
53 * s0-s31
54 * d0-d15, where d0={s0,s1}, d1={s2,s3}, ... , d15={s30,s31}
55 *
56 * s16-s31 (d8-d15) preserved across C calls
57 * s0-s15 (d0-d7) trashed across C calls
58 *
59 * s0-s15/d0-d7 used as codegen temp/scratch
60 * s16-s31/d8-d31 can be used for promotion.
61 *
62 * Calling convention
63 * o On a call to a Dalvik method, pass target's Method* in r0
64 * o r1-r3 will be used for up to the first 3 words of arguments
65 * o Arguments past the first 3 words will be placed in appropriate
66 * out slots by the caller.
67 * o If a 64-bit argument would span the register/memory argument
68 * boundary, it will instead be fully passed in the frame.
69 * o Maintain a 16-byte stack alignment
70 *
71 * Stack frame diagram (stack grows down, higher addresses at top):
72 *
73 * +------------------------+
74 * | IN[ins-1] | {Note: resides in caller's frame}
75 * | . |
76 * | IN[0] |
77 * | caller's Method* |
78 * +========================+ {Note: start of callee's frame}
79 * | spill region | {variable sized - will include lr if non-leaf.}
80 * +------------------------+
81 * | ...filler word... | {Note: used as 2nd word of V[locals-1] if long]
82 * +------------------------+
83 * | V[locals-1] |
84 * | V[locals-2] |
85 * | . |
86 * | . |
87 * | V[1] |
88 * | V[0] |
89 * +------------------------+
90 * | 0 to 3 words padding |
91 * +------------------------+
92 * | OUT[outs-1] |
93 * | OUT[outs-2] |
94 * | . |
95 * | OUT[0] |
96 * | curMethod* | <<== sp w/ 16-byte alignment
97 * +========================+
98 */
99
100/* Offset to distingish FP regs */
101#define FP_REG_OFFSET 32
102/* Offset to distinguish DP FP regs */
103#define FP_DOUBLE 64
buzbeebbaf8942011-10-02 13:08:29 -0700104/* First FP callee save */
105#define FP_CALLEE_SAVE_BASE 16
buzbee67bf8852011-08-17 17:51:35 -0700106/* Reg types */
107#define REGTYPE(x) (x & (FP_REG_OFFSET | FP_DOUBLE))
108#define FPREG(x) ((x & FP_REG_OFFSET) == FP_REG_OFFSET)
109#define LOWREG(x) ((x & 0x7) == x)
110#define DOUBLEREG(x) ((x & FP_DOUBLE) == FP_DOUBLE)
111#define SINGLEREG(x) (FPREG(x) && !DOUBLEREG(x))
112/*
113 * Note: the low register of a floating point pair is sufficient to
114 * create the name of a double, but require both names to be passed to
115 * allow for asserts to verify that the pair is consecutive if significant
116 * rework is done in this area. Also, it is a good reminder in the calling
117 * code that reg locations always describe doubles as a pair of singles.
118 */
119#define S2D(x,y) ((x) | FP_DOUBLE)
120/* Mask to strip off fp flags */
121#define FP_REG_MASK (FP_REG_OFFSET-1)
122/* non-existent Dalvik register */
123#define vNone (-1)
124/* non-existant physical register */
125#define rNone (-1)
126
127/* RegisterLocation templates return values (r0, or r0/r1) */
buzbeee3acd072012-02-25 17:03:10 -0800128#define LOC_C_RETURN {kLocPhysReg, 0, 0, 0, 0, 0, 1, r0, INVALID_REG,\
129 INVALID_SREG}
buzbee67bc2362011-10-11 18:08:40 -0700130#define LOC_C_RETURN_WIDE {kLocPhysReg, 1, 0, 0, 0, 0, 1, r0, r1, INVALID_SREG}
buzbee67bf8852011-08-17 17:51:35 -0700131
132typedef enum ResourceEncodingPos {
133 kGPReg0 = 0,
134 kRegSP = 13,
135 kRegLR = 14,
136 kRegPC = 15,
137 kFPReg0 = 16,
138 kFPReg16 = 32,
139 kRegEnd = 48,
140 kCCode = kRegEnd,
141 kFPStatus, // FP status word
142 // The following four bits are for memory disambiguation
143 kDalvikReg, // 1 Dalvik Frame (can be fully disambiguated)
144 kLiteral, // 2 Literal pool (can be fully disambiguated)
145 kHeapRef, // 3 Somewhere on the heap (alias with any other heap)
146 kMustNotAlias, // 4 Guaranteed to be non-alias (eg *(r6+x))
147} ResourceEncodingPos;
148
149#define ENCODE_REG_LIST(N) ((u8) N)
150#define ENCODE_REG_SP (1ULL << kRegSP)
151#define ENCODE_REG_LR (1ULL << kRegLR)
152#define ENCODE_REG_PC (1ULL << kRegPC)
153#define ENCODE_CCODE (1ULL << kCCode)
154#define ENCODE_FP_STATUS (1ULL << kFPStatus)
155#define ENCODE_REG_FPCS_LIST(N) ((u8)N << kFPReg16)
156
157/* Abstract memory locations */
158#define ENCODE_DALVIK_REG (1ULL << kDalvikReg)
159#define ENCODE_LITERAL (1ULL << kLiteral)
160#define ENCODE_HEAP_REF (1ULL << kHeapRef)
161#define ENCODE_MUST_NOT_ALIAS (1ULL << kMustNotAlias)
162
163#define ENCODE_ALL (~0ULL)
164#define ENCODE_MEM (ENCODE_DALVIK_REG | ENCODE_LITERAL | \
165 ENCODE_HEAP_REF | ENCODE_MUST_NOT_ALIAS)
166
167#define DECODE_ALIAS_INFO_REG(X) (X & 0xffff)
168#define DECODE_ALIAS_INFO_WIDE(X) ((X & 0x80000000) ? 1 : 0)
169
buzbee67bf8852011-08-17 17:51:35 -0700170typedef enum OpKind {
171 kOpMov,
172 kOpMvn,
173 kOpCmp,
174 kOpLsl,
175 kOpLsr,
176 kOpAsr,
177 kOpRor,
178 kOpNot,
179 kOpAnd,
180 kOpOr,
181 kOpXor,
182 kOpNeg,
183 kOpAdd,
184 kOpAdc,
185 kOpSub,
186 kOpSbc,
187 kOpRsub,
188 kOpMul,
189 kOpDiv,
190 kOpRem,
191 kOpBic,
192 kOpCmn,
193 kOpTst,
194 kOpBkpt,
195 kOpBlx,
196 kOpPush,
197 kOpPop,
198 kOp2Char,
199 kOp2Short,
200 kOp2Byte,
201 kOpCondBr,
202 kOpUncondBr,
buzbeee3acd072012-02-25 17:03:10 -0800203 kOpInvalid,
buzbee67bf8852011-08-17 17:51:35 -0700204} OpKind;
205
206/*
207 * Annotate special-purpose core registers:
buzbeec1f45042011-09-21 16:03:19 -0700208 * - VM: r6SELF
buzbee67bf8852011-08-17 17:51:35 -0700209 * - ARM architecture: r13sp, r14lr, and r15pc
210 *
211 * rPC, rFP, and rSELF are for architecture-independent code to use.
212 */
213typedef enum NativeRegisterPool {
214 r0 = 0,
215 r1 = 1,
216 r2 = 2,
217 r3 = 3,
buzbeec1f45042011-09-21 16:03:19 -0700218 rSUSPEND = 4,
buzbee67bf8852011-08-17 17:51:35 -0700219 r5 = 5,
220 r6 = 6,
221 r7 = 7,
222 r8 = 8,
223 rSELF = 9,
224 r10 = 10,
225 r11 = 11,
226 r12 = 12,
227 r13sp = 13,
228 rSP = 13,
229 r14lr = 14,
230 rLR = 14,
231 r15pc = 15,
232 rPC = 15,
233 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,
265 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,
281} NativeRegisterPool;
282
283/* Shift encodings */
284typedef enum ArmShiftEncodings {
285 kArmLsl = 0x0,
286 kArmLsr = 0x1,
287 kArmAsr = 0x2,
288 kArmRor = 0x3
289} ArmShiftEncodings;
290
291/* Thumb condition encodings */
292typedef enum ArmConditionCode {
293 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 */
309} ArmConditionCode;
310
buzbee5ade1d22011-09-09 14:44:52 -0700311typedef enum ArmThrowKind {
312 kArmThrowNullPointer,
313 kArmThrowDivZero,
314 kArmThrowArrayBounds,
315 kArmThrowVerificationError,
316 kArmThrowNegArraySize,
buzbee5ade1d22011-09-09 14:44:52 -0700317 kArmThrowNoSuchMethod,
buzbeeec5adf32011-09-11 15:25:43 -0700318 kArmThrowStackOverflow,
buzbee5ade1d22011-09-09 14:44:52 -0700319} ArmThrowKind;
320
buzbee67bf8852011-08-17 17:51:35 -0700321#define isPseudoOpcode(opcode) ((int)(opcode) < 0)
322
323/*
324 * The following enum defines the list of supported Thumb instructions by the
325 * assembler. Their corresponding snippet positions will be defined in
326 * Assemble.c.
327 */
328typedef enum ArmOpcode {
buzbeec1f45042011-09-21 16:03:19 -0700329 kArmPseudoSuspendTarget = -15,
buzbee5ade1d22011-09-09 14:44:52 -0700330 kArmPseudoThrowTarget = -14,
buzbee67bf8852011-08-17 17:51:35 -0700331 kArmPseudoCaseLabel = -13,
332 kArmPseudoMethodEntry = -12,
333 kArmPseudoMethodExit = -11,
334 kArmPseudoBarrier = -10,
335 kArmPseudoExtended = -9,
336 kArmPseudoSSARep = -8,
337 kArmPseudoEntryBlock = -7,
338 kArmPseudoExitBlock = -6,
339 kArmPseudoTargetLabel = -5,
340 kArmPseudoDalvikByteCodeBoundary = -4,
341 kArmPseudoPseudoAlign4 = -3,
342 kArmPseudoEHBlockLabel = -2,
343 kArmPseudoNormalBlockLabel = -1,
344 /************************************************************************/
345 kArm16BitData, /* DATA [0] rd[15..0] */
346 kThumbAdcRR, /* adc [0100000101] rm[5..3] rd[2..0] */
347 kThumbAddRRI3, /* add(1) [0001110] imm_3[8..6] rn[5..3] rd[2..0]*/
348 kThumbAddRI8, /* add(2) [00110] rd[10..8] imm_8[7..0] */
349 kThumbAddRRR, /* add(3) [0001100] rm[8..6] rn[5..3] rd[2..0] */
350 kThumbAddRRLH, /* add(4) [01000100] H12[01] rm[5..3] rd[2..0] */
351 kThumbAddRRHL, /* add(4) [01001000] H12[10] rm[5..3] rd[2..0] */
352 kThumbAddRRHH, /* add(4) [01001100] H12[11] rm[5..3] rd[2..0] */
353 kThumbAddPcRel, /* add(5) [10100] rd[10..8] imm_8[7..0] */
354 kThumbAddSpRel, /* add(6) [10101] rd[10..8] imm_8[7..0] */
355 kThumbAddSpI7, /* add(7) [101100000] imm_7[6..0] */
356 kThumbAndRR, /* and [0100000000] rm[5..3] rd[2..0] */
357 kThumbAsrRRI5, /* asr(1) [00010] imm_5[10..6] rm[5..3] rd[2..0] */
358 kThumbAsrRR, /* asr(2) [0100000100] rs[5..3] rd[2..0] */
359 kThumbBCond, /* b(1) [1101] cond[11..8] offset_8[7..0] */
360 kThumbBUncond, /* b(2) [11100] offset_11[10..0] */
361 kThumbBicRR, /* bic [0100001110] rm[5..3] rd[2..0] */
362 kThumbBkpt, /* bkpt [10111110] imm_8[7..0] */
363 kThumbBlx1, /* blx(1) [111] H[10] offset_11[10..0] */
364 kThumbBlx2, /* blx(1) [111] H[01] offset_11[10..0] */
365 kThumbBl1, /* blx(1) [111] H[10] offset_11[10..0] */
366 kThumbBl2, /* blx(1) [111] H[11] offset_11[10..0] */
367 kThumbBlxR, /* blx(2) [010001111] rm[6..3] [000] */
368 kThumbBx, /* bx [010001110] H2[6..6] rm[5..3] SBZ[000] */
369 kThumbCmnRR, /* cmn [0100001011] rm[5..3] rd[2..0] */
370 kThumbCmpRI8, /* cmp(1) [00101] rn[10..8] imm_8[7..0] */
371 kThumbCmpRR, /* cmp(2) [0100001010] rm[5..3] rd[2..0] */
372 kThumbCmpLH, /* cmp(3) [01000101] H12[01] rm[5..3] rd[2..0] */
373 kThumbCmpHL, /* cmp(3) [01000110] H12[10] rm[5..3] rd[2..0] */
374 kThumbCmpHH, /* cmp(3) [01000111] H12[11] rm[5..3] rd[2..0] */
375 kThumbEorRR, /* eor [0100000001] rm[5..3] rd[2..0] */
376 kThumbLdmia, /* ldmia [11001] rn[10..8] reglist [7..0] */
377 kThumbLdrRRI5, /* ldr(1) [01101] imm_5[10..6] rn[5..3] rd[2..0] */
378 kThumbLdrRRR, /* ldr(2) [0101100] rm[8..6] rn[5..3] rd[2..0] */
379 kThumbLdrPcRel, /* ldr(3) [01001] rd[10..8] imm_8[7..0] */
380 kThumbLdrSpRel, /* ldr(4) [10011] rd[10..8] imm_8[7..0] */
381 kThumbLdrbRRI5, /* ldrb(1) [01111] imm_5[10..6] rn[5..3] rd[2..0] */
382 kThumbLdrbRRR, /* ldrb(2) [0101110] rm[8..6] rn[5..3] rd[2..0] */
383 kThumbLdrhRRI5, /* ldrh(1) [10001] imm_5[10..6] rn[5..3] rd[2..0] */
384 kThumbLdrhRRR, /* ldrh(2) [0101101] rm[8..6] rn[5..3] rd[2..0] */
385 kThumbLdrsbRRR, /* ldrsb [0101011] rm[8..6] rn[5..3] rd[2..0] */
386 kThumbLdrshRRR, /* ldrsh [0101111] rm[8..6] rn[5..3] rd[2..0] */
387 kThumbLslRRI5, /* lsl(1) [00000] imm_5[10..6] rm[5..3] rd[2..0] */
388 kThumbLslRR, /* lsl(2) [0100000010] rs[5..3] rd[2..0] */
389 kThumbLsrRRI5, /* lsr(1) [00001] imm_5[10..6] rm[5..3] rd[2..0] */
390 kThumbLsrRR, /* lsr(2) [0100000011] rs[5..3] rd[2..0] */
391 kThumbMovImm, /* mov(1) [00100] rd[10..8] imm_8[7..0] */
392 kThumbMovRR, /* mov(2) [0001110000] rn[5..3] rd[2..0] */
393 kThumbMovRR_H2H, /* mov(3) [01000111] H12[11] rm[5..3] rd[2..0] */
394 kThumbMovRR_H2L, /* mov(3) [01000110] H12[01] rm[5..3] rd[2..0] */
395 kThumbMovRR_L2H, /* mov(3) [01000101] H12[10] rm[5..3] rd[2..0] */
396 kThumbMul, /* mul [0100001101] rm[5..3] rd[2..0] */
397 kThumbMvn, /* mvn [0100001111] rm[5..3] rd[2..0] */
398 kThumbNeg, /* neg [0100001001] rm[5..3] rd[2..0] */
399 kThumbOrr, /* orr [0100001100] rm[5..3] rd[2..0] */
400 kThumbPop, /* pop [1011110] r[8..8] rl[7..0] */
401 kThumbPush, /* push [1011010] r[8..8] rl[7..0] */
402 kThumbRorRR, /* ror [0100000111] rs[5..3] rd[2..0] */
403 kThumbSbc, /* sbc [0100000110] rm[5..3] rd[2..0] */
404 kThumbStmia, /* stmia [11000] rn[10..8] reglist [7.. 0] */
405 kThumbStrRRI5, /* str(1) [01100] imm_5[10..6] rn[5..3] rd[2..0] */
406 kThumbStrRRR, /* str(2) [0101000] rm[8..6] rn[5..3] rd[2..0] */
407 kThumbStrSpRel, /* str(3) [10010] rd[10..8] imm_8[7..0] */
408 kThumbStrbRRI5, /* strb(1) [01110] imm_5[10..6] rn[5..3] rd[2..0] */
409 kThumbStrbRRR, /* strb(2) [0101010] rm[8..6] rn[5..3] rd[2..0] */
410 kThumbStrhRRI5, /* strh(1) [10000] imm_5[10..6] rn[5..3] rd[2..0] */
411 kThumbStrhRRR, /* strh(2) [0101001] rm[8..6] rn[5..3] rd[2..0] */
412 kThumbSubRRI3, /* sub(1) [0001111] imm_3[8..6] rn[5..3] rd[2..0]*/
413 kThumbSubRI8, /* sub(2) [00111] rd[10..8] imm_8[7..0] */
414 kThumbSubRRR, /* sub(3) [0001101] rm[8..6] rn[5..3] rd[2..0] */
415 kThumbSubSpI7, /* sub(4) [101100001] imm_7[6..0] */
416 kThumbSwi, /* swi [11011111] imm_8[7..0] */
417 kThumbTst, /* tst [0100001000] rm[5..3] rn[2..0] */
418 kThumb2Vldrs, /* vldr low sx [111011011001] rn[19..16] rd[15-12]
419 [1010] imm_8[7..0] */
420 kThumb2Vldrd, /* vldr low dx [111011011001] rn[19..16] rd[15-12]
421 [1011] imm_8[7..0] */
422 kThumb2Vmuls, /* vmul vd, vn, vm [111011100010] rn[19..16]
423 rd[15-12] [10100000] rm[3..0] */
424 kThumb2Vmuld, /* vmul vd, vn, vm [111011100010] rn[19..16]
425 rd[15-12] [10110000] rm[3..0] */
426 kThumb2Vstrs, /* vstr low sx [111011011000] rn[19..16] rd[15-12]
427 [1010] imm_8[7..0] */
428 kThumb2Vstrd, /* vstr low dx [111011011000] rn[19..16] rd[15-12]
429 [1011] imm_8[7..0] */
430 kThumb2Vsubs, /* vsub vd, vn, vm [111011100011] rn[19..16]
431 rd[15-12] [10100040] rm[3..0] */
432 kThumb2Vsubd, /* vsub vd, vn, vm [111011100011] rn[19..16]
433 rd[15-12] [10110040] rm[3..0] */
434 kThumb2Vadds, /* vadd vd, vn, vm [111011100011] rn[19..16]
435 rd[15-12] [10100000] rm[3..0] */
436 kThumb2Vaddd, /* vadd vd, vn, vm [111011100011] rn[19..16]
437 rd[15-12] [10110000] rm[3..0] */
438 kThumb2Vdivs, /* vdiv vd, vn, vm [111011101000] rn[19..16]
439 rd[15-12] [10100000] rm[3..0] */
440 kThumb2Vdivd, /* vdiv vd, vn, vm [111011101000] rn[19..16]
441 rd[15-12] [10110000] rm[3..0] */
442 kThumb2VcvtIF, /* vcvt.F32 vd, vm [1110111010111000] vd[15..12]
443 [10101100] vm[3..0] */
444 kThumb2VcvtID, /* vcvt.F64 vd, vm [1110111010111000] vd[15..12]
445 [10111100] vm[3..0] */
446 kThumb2VcvtFI, /* vcvt.S32.F32 vd, vm [1110111010111101] vd[15..12]
447 [10101100] vm[3..0] */
448 kThumb2VcvtDI, /* vcvt.S32.F32 vd, vm [1110111010111101] vd[15..12]
449 [10111100] vm[3..0] */
450 kThumb2VcvtFd, /* vcvt.F64.F32 vd, vm [1110111010110111] vd[15..12]
451 [10101100] vm[3..0] */
452 kThumb2VcvtDF, /* vcvt.F32.F64 vd, vm [1110111010110111] vd[15..12]
453 [10111100] vm[3..0] */
454 kThumb2Vsqrts, /* vsqrt.f32 vd, vm [1110111010110001] vd[15..12]
455 [10101100] vm[3..0] */
456 kThumb2Vsqrtd, /* vsqrt.f64 vd, vm [1110111010110001] vd[15..12]
457 [10111100] vm[3..0] */
458 kThumb2MovImmShift, /* mov(T2) rd, #<const> [11110] i [00001001111]
459 imm3 rd[11..8] imm8 */
460 kThumb2MovImm16, /* mov(T3) rd, #<const> [11110] i [0010100] imm4 [0]
461 imm3 rd[11..8] imm8 */
462 kThumb2StrRRI12, /* str(Imm,T3) rd,[rn,#imm12] [111110001100]
463 rn[19..16] rt[15..12] imm12[11..0] */
464 kThumb2LdrRRI12, /* str(Imm,T3) rd,[rn,#imm12] [111110001100]
465 rn[19..16] rt[15..12] imm12[11..0] */
466 kThumb2StrRRI8Predec, /* str(Imm,T4) rd,[rn,#-imm8] [111110000100]
467 rn[19..16] rt[15..12] [1100] imm[7..0]*/
468 kThumb2LdrRRI8Predec, /* ldr(Imm,T4) rd,[rn,#-imm8] [111110000101]
469 rn[19..16] rt[15..12] [1100] imm[7..0]*/
470 kThumb2Cbnz, /* cbnz rd,<label> [101110] i [1] imm5[7..3]
471 rn[2..0] */
472 kThumb2Cbz, /* cbn rd,<label> [101100] i [1] imm5[7..3]
473 rn[2..0] */
474 kThumb2AddRRI12, /* add rd, rn, #imm12 [11110] i [100000] rn[19..16]
475 [0] imm3[14..12] rd[11..8] imm8[7..0] */
476 kThumb2MovRR, /* mov rd, rm [11101010010011110000] rd[11..8]
477 [0000] rm[3..0] */
478 kThumb2Vmovs, /* vmov.f32 vd, vm [111011101] D [110000]
479 vd[15..12] 101001] M [0] vm[3..0] */
480 kThumb2Vmovd, /* vmov.f64 vd, vm [111011101] D [110000]
481 vd[15..12] 101101] M [0] vm[3..0] */
482 kThumb2Ldmia, /* ldmia [111010001001[ rn[19..16] mask[15..0] */
483 kThumb2Stmia, /* stmia [111010001000[ rn[19..16] mask[15..0] */
484 kThumb2AddRRR, /* add [111010110000] rn[19..16] [0000] rd[11..8]
485 [0000] rm[3..0] */
486 kThumb2SubRRR, /* sub [111010111010] rn[19..16] [0000] rd[11..8]
487 [0000] rm[3..0] */
488 kThumb2SbcRRR, /* sbc [111010110110] rn[19..16] [0000] rd[11..8]
489 [0000] rm[3..0] */
490 kThumb2CmpRR, /* cmp [111010111011] rn[19..16] [0000] [1111]
491 [0000] rm[3..0] */
492 kThumb2SubRRI12, /* sub rd, rn, #imm12 [11110] i [01010] rn[19..16]
493 [0] imm3[14..12] rd[11..8] imm8[7..0] */
buzbee58f92742011-10-01 11:22:17 -0700494 kThumb2MvnImm12, /* mov(T2) rd, #<const> [11110] i [00011011110]
buzbee67bf8852011-08-17 17:51:35 -0700495 imm3 rd[11..8] imm8 */
496 kThumb2Sel, /* sel rd, rn, rm [111110101010] rn[19-16] rd[11-8]
497 rm[3-0] */
498 kThumb2Ubfx, /* ubfx rd,rn,#lsb,#width [111100111100] rn[19..16]
499 [0] imm3[14-12] rd[11-8] w[4-0] */
500 kThumb2Sbfx, /* ubfx rd,rn,#lsb,#width [111100110100] rn[19..16]
501 [0] imm3[14-12] rd[11-8] w[4-0] */
502 kThumb2LdrRRR, /* ldr rt,[rn,rm,LSL #imm] [111110000101] rn[19-16]
503 rt[15-12] [000000] imm[5-4] rm[3-0] */
504 kThumb2LdrhRRR, /* ldrh rt,[rn,rm,LSL #imm] [111110000101] rn[19-16]
505 rt[15-12] [000000] imm[5-4] rm[3-0] */
506 kThumb2LdrshRRR, /* ldrsh rt,[rn,rm,LSL #imm] [111110000101] rn[19-16]
507 rt[15-12] [000000] imm[5-4] rm[3-0] */
508 kThumb2LdrbRRR, /* ldrb rt,[rn,rm,LSL #imm] [111110000101] rn[19-16]
509 rt[15-12] [000000] imm[5-4] rm[3-0] */
510 kThumb2LdrsbRRR, /* ldrsb rt,[rn,rm,LSL #imm] [111110000101] rn[19-16]
511 rt[15-12] [000000] imm[5-4] rm[3-0] */
512 kThumb2StrRRR, /* str rt,[rn,rm,LSL #imm] [111110000100] rn[19-16]
513 rt[15-12] [000000] imm[5-4] rm[3-0] */
514 kThumb2StrhRRR, /* str rt,[rn,rm,LSL #imm] [111110000010] rn[19-16]
515 rt[15-12] [000000] imm[5-4] rm[3-0] */
516 kThumb2StrbRRR, /* str rt,[rn,rm,LSL #imm] [111110000000] rn[19-16]
517 rt[15-12] [000000] imm[5-4] rm[3-0] */
518 kThumb2LdrhRRI12, /* ldrh rt,[rn,#imm12] [111110001011]
519 rt[15..12] rn[19..16] imm12[11..0] */
520 kThumb2LdrshRRI12, /* ldrsh rt,[rn,#imm12] [111110011011]
521 rt[15..12] rn[19..16] imm12[11..0] */
522 kThumb2LdrbRRI12, /* ldrb rt,[rn,#imm12] [111110001001]
523 rt[15..12] rn[19..16] imm12[11..0] */
524 kThumb2LdrsbRRI12, /* ldrsb rt,[rn,#imm12] [111110011001]
525 rt[15..12] rn[19..16] imm12[11..0] */
526 kThumb2StrhRRI12, /* strh rt,[rn,#imm12] [111110001010]
527 rt[15..12] rn[19..16] imm12[11..0] */
528 kThumb2StrbRRI12, /* strb rt,[rn,#imm12] [111110001000]
529 rt[15..12] rn[19..16] imm12[11..0] */
530 kThumb2Pop, /* pop [1110100010111101] list[15-0]*/
531 kThumb2Push, /* push [1110100100101101] list[15-0]*/
532 kThumb2CmpRI8, /* cmp rn, #<const> [11110] i [011011] rn[19-16] [0]
533 imm3 [1111] imm8[7..0] */
534 kThumb2AdcRRR, /* adc [111010110101] rn[19..16] [0000] rd[11..8]
535 [0000] rm[3..0] */
536 kThumb2AndRRR, /* and [111010100000] rn[19..16] [0000] rd[11..8]
537 [0000] rm[3..0] */
538 kThumb2BicRRR, /* bic [111010100010] rn[19..16] [0000] rd[11..8]
539 [0000] rm[3..0] */
540 kThumb2CmnRR, /* cmn [111010110001] rn[19..16] [0000] [1111]
541 [0000] rm[3..0] */
542 kThumb2EorRRR, /* eor [111010101000] rn[19..16] [0000] rd[11..8]
543 [0000] rm[3..0] */
544 kThumb2MulRRR, /* mul [111110110000] rn[19..16] [1111] rd[11..8]
545 [0000] rm[3..0] */
546 kThumb2MnvRR, /* mvn [11101010011011110] rd[11-8] [0000]
547 rm[3..0] */
548 kThumb2RsubRRI8, /* rsub [111100011100] rn[19..16] [0000] rd[11..8]
549 imm8[7..0] */
550 kThumb2NegRR, /* actually rsub rd, rn, #0 */
551 kThumb2OrrRRR, /* orr [111010100100] rn[19..16] [0000] rd[11..8]
552 [0000] rm[3..0] */
553 kThumb2TstRR, /* tst [111010100001] rn[19..16] [0000] [1111]
554 [0000] rm[3..0] */
555 kThumb2LslRRR, /* lsl [111110100000] rn[19..16] [1111] rd[11..8]
556 [0000] rm[3..0] */
557 kThumb2LsrRRR, /* lsr [111110100010] rn[19..16] [1111] rd[11..8]
558 [0000] rm[3..0] */
559 kThumb2AsrRRR, /* asr [111110100100] rn[19..16] [1111] rd[11..8]
560 [0000] rm[3..0] */
561 kThumb2RorRRR, /* ror [111110100110] rn[19..16] [1111] rd[11..8]
562 [0000] rm[3..0] */
563 kThumb2LslRRI5, /* lsl [11101010010011110] imm[14.12] rd[11..8]
564 [00] rm[3..0] */
565 kThumb2LsrRRI5, /* lsr [11101010010011110] imm[14.12] rd[11..8]
566 [01] rm[3..0] */
567 kThumb2AsrRRI5, /* asr [11101010010011110] imm[14.12] rd[11..8]
568 [10] rm[3..0] */
569 kThumb2RorRRI5, /* ror [11101010010011110] imm[14.12] rd[11..8]
570 [11] rm[3..0] */
571 kThumb2BicRRI8, /* bic [111100000010] rn[19..16] [0] imm3
572 rd[11..8] imm8 */
573 kThumb2AndRRI8, /* bic [111100000000] rn[19..16] [0] imm3
574 rd[11..8] imm8 */
575 kThumb2OrrRRI8, /* orr [111100000100] rn[19..16] [0] imm3
576 rd[11..8] imm8 */
577 kThumb2EorRRI8, /* eor [111100001000] rn[19..16] [0] imm3
578 rd[11..8] imm8 */
579 kThumb2AddRRI8, /* add [111100001000] rn[19..16] [0] imm3
580 rd[11..8] imm8 */
581 kThumb2AdcRRI8, /* adc [111100010101] rn[19..16] [0] imm3
582 rd[11..8] imm8 */
583 kThumb2SubRRI8, /* sub [111100011011] rn[19..16] [0] imm3
584 rd[11..8] imm8 */
585 kThumb2SbcRRI8, /* sbc [111100010111] rn[19..16] [0] imm3
586 rd[11..8] imm8 */
587 kThumb2It, /* it [10111111] firstcond[7-4] mask[3-0] */
588 kThumb2Fmstat, /* fmstat [11101110111100011111101000010000] */
589 kThumb2Vcmpd, /* vcmp [111011101] D [11011] rd[15-12] [1011]
590 E [1] M [0] rm[3-0] */
591 kThumb2Vcmps, /* vcmp [111011101] D [11010] rd[15-12] [1011]
592 E [1] M [0] rm[3-0] */
593 kThumb2LdrPcRel12, /* ldr rd,[pc,#imm12] [1111100011011111] rt[15-12]
594 imm12[11-0] */
595 kThumb2BCond, /* b<c> [1110] S cond[25-22] imm6[21-16] [10]
596 J1 [0] J2 imm11[10..0] */
597 kThumb2Vmovd_RR, /* vmov [111011101] D [110000] vd[15-12 [101101]
598 M [0] vm[3-0] */
599 kThumb2Vmovs_RR, /* vmov [111011101] D [110000] vd[15-12 [101001]
600 M [0] vm[3-0] */
601 kThumb2Fmrs, /* vmov [111011100000] vn[19-16] rt[15-12] [1010]
602 N [0010000] */
603 kThumb2Fmsr, /* vmov [111011100001] vn[19-16] rt[15-12] [1010]
604 N [0010000] */
605 kThumb2Fmrrd, /* vmov [111011000100] rt2[19-16] rt[15-12]
606 [101100] M [1] vm[3-0] */
607 kThumb2Fmdrr, /* vmov [111011000101] rt2[19-16] rt[15-12]
608 [101100] M [1] vm[3-0] */
609 kThumb2Vabsd, /* vabs.f64 [111011101] D [110000] rd[15-12]
610 [1011110] M [0] vm[3-0] */
611 kThumb2Vabss, /* vabs.f32 [111011101] D [110000] rd[15-12]
612 [1010110] M [0] vm[3-0] */
613 kThumb2Vnegd, /* vneg.f64 [111011101] D [110000] rd[15-12]
614 [1011110] M [0] vm[3-0] */
615 kThumb2Vnegs, /* vneg.f32 [111011101] D [110000] rd[15-12]
616 [1010110] M [0] vm[3-0] */
617 kThumb2Vmovs_IMM8, /* vmov.f32 [111011101] D [11] imm4h[19-16] vd[15-12]
618 [10100000] imm4l[3-0] */
619 kThumb2Vmovd_IMM8, /* vmov.f64 [111011101] D [11] imm4h[19-16] vd[15-12]
620 [10110000] imm4l[3-0] */
621 kThumb2Mla, /* mla [111110110000] rn[19-16] ra[15-12] rd[7-4]
622 [0000] rm[3-0] */
623 kThumb2Umull, /* umull [111110111010] rn[19-16], rdlo[15-12]
624 rdhi[11-8] [0000] rm[3-0] */
625 kThumb2Ldrex, /* ldrex [111010000101] rn[19-16] rt[11-8] [1111]
626 imm8[7-0] */
627 kThumb2Strex, /* strex [111010000100] rn[19-16] rt[11-8] rd[11-8]
628 imm8[7-0] */
629 kThumb2Clrex, /* clrex [111100111011111110000111100101111] */
630 kThumb2Bfi, /* bfi [111100110110] rn[19-16] [0] imm3[14-12]
631 rd[11-8] imm2[7-6] [0] msb[4-0] */
632 kThumb2Bfc, /* bfc [11110011011011110] [0] imm3[14-12]
633 rd[11-8] imm2[7-6] [0] msb[4-0] */
634 kThumb2Dmb, /* dmb [1111001110111111100011110101] option[3-0] */
635 kThumb2LdrPcReln12, /* ldr rd,[pc,-#imm12] [1111100011011111] rt[15-12]
636 imm12[11-0] */
637 kThumb2Stm, /* stm <list> [111010010000] rn[19-16] 000 rl[12-0] */
638 kThumbUndefined, /* undefined [11011110xxxxxxxx] */
639 kThumb2VPopCS, /* vpop <list of callee save fp singles (s16+) */
640 kThumb2VPushCS, /* vpush <list callee save fp singles (s16+) */
641 kThumb2Vldms, /* vldms rd, <list> */
642 kThumb2Vstms, /* vstms rd, <list> */
643 kThumb2BUncond, /* b <label> */
644 kThumb2MovImm16H, /* similar to kThumb2MovImm16, but target high hw */
645 kThumb2AddPCR, /* Thumb2 2-operand add with hard-coded PC target */
buzbee03fa2632011-09-20 17:10:57 -0700646 kThumb2Adr, /* Special purpose encoding of ADR for switch tables */
buzbee67bf8852011-08-17 17:51:35 -0700647 kThumb2MovImm16LST, /* Special purpose version for switch table use */
648 kThumb2MovImm16HST, /* Special purpose version for switch table use */
649 kThumb2LdmiaWB, /* ldmia [111010011001[ rn[19..16] mask[15..0] */
650 kThumb2SubsRRI12, /* setflags encoding */
buzbee58f92742011-10-01 11:22:17 -0700651 kThumb2OrrRRRs, /* orrx [111010100101] rn[19..16] [0000] rd[11..8]
652 [0000] rm[3..0] */
buzbeee7070802011-10-09 17:56:06 -0700653 kThumb2Push1, /* t3 encoding of push */
654 kThumb2Pop1, /* t3 encoding of pop */
buzbee67bf8852011-08-17 17:51:35 -0700655 kArmLast,
656} ArmOpcode;
657
658/* DMB option encodings */
659typedef enum ArmOpDmbOptions {
660 kSY = 0xf,
661 kST = 0xe,
662 kISH = 0xb,
663 kISHST = 0xa,
664 kNSH = 0x7,
665 kNSHST = 0x6
666} ArmOpDmbOptions;
667
668/* Bit flags describing the behavior of each native opcode */
669typedef enum ArmOpFeatureFlags {
670 kIsBranch = 0,
671 kRegDef0,
672 kRegDef1,
673 kRegDefSP,
674 kRegDefLR,
675 kRegDefList0,
676 kRegDefList1,
677 kRegDefFPCSList0,
678 kRegDefFPCSList2,
679 kRegDefList2,
680 kRegUse0,
681 kRegUse1,
682 kRegUse2,
683 kRegUse3,
684 kRegUseSP,
685 kRegUsePC,
686 kRegUseList0,
687 kRegUseList1,
688 kRegUseFPCSList0,
689 kRegUseFPCSList2,
690 kNoOperand,
691 kIsUnaryOp,
692 kIsBinaryOp,
693 kIsTertiaryOp,
694 kIsQuadOp,
695 kIsIT,
696 kSetsCCodes,
697 kUsesCCodes,
698 kMemLoad,
699 kMemStore,
buzbee5abfa3e2012-01-31 17:01:43 -0800700 kPCRelFixup,
buzbee67bf8852011-08-17 17:51:35 -0700701} ArmOpFeatureFlags;
702
703#define IS_LOAD (1 << kMemLoad)
704#define IS_STORE (1 << kMemStore)
705#define IS_BRANCH (1 << kIsBranch)
706#define REG_DEF0 (1 << kRegDef0)
707#define REG_DEF1 (1 << kRegDef1)
708#define REG_DEF_SP (1 << kRegDefSP)
709#define REG_DEF_LR (1 << kRegDefLR)
710#define REG_DEF_LIST0 (1 << kRegDefList0)
711#define REG_DEF_LIST1 (1 << kRegDefList1)
712#define REG_DEF_FPCS_LIST0 (1 << kRegDefFPCSList0)
713#define REG_DEF_FPCS_LIST2 (1 << kRegDefFPCSList2)
714#define REG_USE0 (1 << kRegUse0)
715#define REG_USE1 (1 << kRegUse1)
716#define REG_USE2 (1 << kRegUse2)
717#define REG_USE3 (1 << kRegUse3)
718#define REG_USE_SP (1 << kRegUseSP)
719#define REG_USE_PC (1 << kRegUsePC)
720#define REG_USE_LIST0 (1 << kRegUseList0)
721#define REG_USE_LIST1 (1 << kRegUseList1)
722#define REG_USE_FPCS_LIST0 (1 << kRegUseFPCSList0)
723#define REG_USE_FPCS_LIST2 (1 << kRegUseFPCSList2)
724#define NO_OPERAND (1 << kNoOperand)
725#define IS_UNARY_OP (1 << kIsUnaryOp)
726#define IS_BINARY_OP (1 << kIsBinaryOp)
727#define IS_TERTIARY_OP (1 << kIsTertiaryOp)
728#define IS_QUAD_OP (1 << kIsQuadOp)
729#define IS_IT (1 << kIsIT)
730#define SETS_CCODES (1 << kSetsCCodes)
731#define USES_CCODES (1 << kUsesCCodes)
buzbee5abfa3e2012-01-31 17:01:43 -0800732#define NEEDS_FIXUP (1 << kPCRelFixup)
buzbee67bf8852011-08-17 17:51:35 -0700733
734/* Common combo register usage patterns */
735#define REG_USE01 (REG_USE0 | REG_USE1)
736#define REG_USE012 (REG_USE01 | REG_USE2)
737#define REG_USE12 (REG_USE1 | REG_USE2)
738#define REG_DEF0_USE0 (REG_DEF0 | REG_USE0)
739#define REG_DEF0_USE1 (REG_DEF0 | REG_USE1)
740#define REG_DEF0_USE01 (REG_DEF0 | REG_USE01)
741#define REG_DEF0_USE12 (REG_DEF0 | REG_USE12)
742#define REG_DEF01_USE2 (REG_DEF0 | REG_DEF1 | REG_USE2)
743
744/* Instruction assembly fieldLoc kind */
745typedef enum ArmEncodingKind {
746 kFmtUnused,
747 kFmtBitBlt, /* Bit string using end/start */
748 kFmtDfp, /* Double FP reg */
749 kFmtSfp, /* Single FP reg */
750 kFmtModImm, /* Shifted 8-bit immed using [26,14..12,7..0] */
751 kFmtImm16, /* Zero-extended immed using [26,19..16,14..12,7..0] */
752 kFmtImm6, /* Encoded branch target using [9,7..3]0 */
753 kFmtImm12, /* Zero-extended immediate using [26,14..12,7..0] */
754 kFmtShift, /* Shift descriptor, [14..12,7..4] */
755 kFmtLsb, /* least significant bit using [14..12][7..6] */
756 kFmtBWidth, /* bit-field width, encoded as width-1 */
757 kFmtShift5, /* Shift count, [14..12,7..6] */
758 kFmtBrOffset, /* Signed extended [26,11,13,21-16,10-0]:0 */
759 kFmtFPImm, /* Encoded floating point immediate */
760 kFmtOff24, /* 24-bit Thumb2 unconditional branch encoding */
761} ArmEncodingKind;
762
763/* Struct used to define the snippet positions for each Thumb opcode */
764typedef struct ArmEncodingMap {
765 u4 skeleton;
766 struct {
767 ArmEncodingKind kind;
768 int end; /* end for kFmtBitBlt, 1-bit slice end for FP regs */
769 int start; /* start for kFmtBitBlt, 4-bit slice end for FP regs */
770 } fieldLoc[4];
771 ArmOpcode opcode;
772 int flags;
773 const char* name;
774 const char* fmt;
775 int size;
776} ArmEncodingMap;
777
778/* Keys for target-specific scheduling and other optimization hints */
779typedef enum ArmTargetOptHints {
780 kMaxHoistDistance,
781} ArmTargetOptHints;
782
buzbeeba938cb2012-02-03 14:47:55 -0800783extern const ArmEncodingMap EncodingMap[kArmLast];
buzbee67bf8852011-08-17 17:51:35 -0700784
785/*
786 * Each instance of this struct holds a pseudo or real LIR instruction:
787 * - pseudo ones (eg labels and marks) and will be discarded by the assembler.
788 * - real ones will be assembled into Thumb instructions.
789 *
790 * Machine resources are encoded into a 64-bit vector, where the encodings are
791 * as following:
792 * - [ 0..15]: general purpose registers including PC, SP, and LR
793 * - [16..47]: floating-point registers where d0 is expanded to s[01] and s0
794 * starts at bit 16
795 * - [48]: IT block
796 * - [49]: integer condition code
797 * - [50]: floatint-point status word
798 */
799typedef struct ArmLIR {
800 LIR generic;
801 ArmOpcode opcode;
802 int operands[4]; // [0..3] = [dest, src1, src2, extra]
803 struct {
804 bool isNop:1; // LIR is optimized away
buzbee5abfa3e2012-01-31 17:01:43 -0800805 bool pcRelFixup:1; // May need pc-relative fixup
buzbee67bf8852011-08-17 17:51:35 -0700806 unsigned int age:4; // default is 0, set lazily by the optimizer
807 unsigned int size:3; // bytes (2 for thumb, 2/4 for thumb2)
buzbeee3acd072012-02-25 17:03:10 -0800808 unsigned int unused:23;
buzbee67bf8852011-08-17 17:51:35 -0700809 } flags;
810 int aliasInfo; // For Dalvik register & litpool disambiguation
811 u8 useMask; // Resource mask for use
812 u8 defMask; // Resource mask for def
813} ArmLIR;
814
815typedef struct SwitchTable {
816 int offset;
817 const u2* table; // Original dex table
818 int vaddr; // Dalvik offset of switch opcode
819 ArmLIR* bxInst; // Switch indirect branch instruction
820 ArmLIR** targets; // Array of case targets
821} SwitchTable;
822
823typedef struct FillArrayData {
824 int offset;
825 const u2* table; // Original dex table
826 int size;
827 int vaddr; // Dalvik offset of OP_FILL_ARRAY_DATA opcode
828} FillArrayData;
829
buzbee67bf8852011-08-17 17:51:35 -0700830/* Utility macros to traverse the LIR/ArmLIR list */
831#define NEXT_LIR(lir) ((ArmLIR *) lir->generic.next)
832#define PREV_LIR(lir) ((ArmLIR *) lir->generic.prev)
833
834#define NEXT_LIR_LVALUE(lir) (lir)->generic.next
835#define PREV_LIR_LVALUE(lir) (lir)->generic.prev
836
Elliott Hughes11d1b0c2012-01-23 16:57:47 -0800837} // namespace art
838
buzbee67bf8852011-08-17 17:51:35 -0700839#endif // ART_SRC_COMPILER_CODEGEN_ARM_ARMLIR_H_