blob: a43702c1ac7ad8b1c7e22c5cf6b692fe0a7502ed [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}
Ian Rogersf7d9ad32012-03-13 18:45:39 -0700131#define LOC_C_RETURN_FLOAT LOC_C_RETURN
132#define LOC_C_RETURN_WIDE_DOUBLE LOC_C_RETURN_WIDE
buzbee67bf8852011-08-17 17:51:35 -0700133
Elliott Hughes719ace42012-03-09 18:06:03 -0800134enum ResourceEncodingPos {
buzbee67bf8852011-08-17 17:51:35 -0700135 kGPReg0 = 0,
136 kRegSP = 13,
137 kRegLR = 14,
138 kRegPC = 15,
139 kFPReg0 = 16,
140 kFPReg16 = 32,
141 kRegEnd = 48,
142 kCCode = kRegEnd,
143 kFPStatus, // FP status word
144 // The following four bits are for memory disambiguation
145 kDalvikReg, // 1 Dalvik Frame (can be fully disambiguated)
146 kLiteral, // 2 Literal pool (can be fully disambiguated)
147 kHeapRef, // 3 Somewhere on the heap (alias with any other heap)
148 kMustNotAlias, // 4 Guaranteed to be non-alias (eg *(r6+x))
Elliott Hughes719ace42012-03-09 18:06:03 -0800149};
buzbee67bf8852011-08-17 17:51:35 -0700150
151#define ENCODE_REG_LIST(N) ((u8) N)
152#define ENCODE_REG_SP (1ULL << kRegSP)
153#define ENCODE_REG_LR (1ULL << kRegLR)
154#define ENCODE_REG_PC (1ULL << kRegPC)
155#define ENCODE_CCODE (1ULL << kCCode)
156#define ENCODE_FP_STATUS (1ULL << kFPStatus)
157#define ENCODE_REG_FPCS_LIST(N) ((u8)N << kFPReg16)
158
159/* Abstract memory locations */
160#define ENCODE_DALVIK_REG (1ULL << kDalvikReg)
161#define ENCODE_LITERAL (1ULL << kLiteral)
162#define ENCODE_HEAP_REF (1ULL << kHeapRef)
163#define ENCODE_MUST_NOT_ALIAS (1ULL << kMustNotAlias)
164
165#define ENCODE_ALL (~0ULL)
166#define ENCODE_MEM (ENCODE_DALVIK_REG | ENCODE_LITERAL | \
167 ENCODE_HEAP_REF | ENCODE_MUST_NOT_ALIAS)
168
169#define DECODE_ALIAS_INFO_REG(X) (X & 0xffff)
170#define DECODE_ALIAS_INFO_WIDE(X) ((X & 0x80000000) ? 1 : 0)
171
buzbee67bf8852011-08-17 17:51:35 -0700172/*
173 * Annotate special-purpose core registers:
buzbeec1f45042011-09-21 16:03:19 -0700174 * - VM: r6SELF
buzbee67bf8852011-08-17 17:51:35 -0700175 * - ARM architecture: r13sp, r14lr, and r15pc
176 *
177 * rPC, rFP, and rSELF are for architecture-independent code to use.
178 */
Elliott Hughes719ace42012-03-09 18:06:03 -0800179enum NativeRegisterPool {
buzbee67bf8852011-08-17 17:51:35 -0700180 r0 = 0,
181 r1 = 1,
182 r2 = 2,
183 r3 = 3,
buzbeec1f45042011-09-21 16:03:19 -0700184 rSUSPEND = 4,
buzbee67bf8852011-08-17 17:51:35 -0700185 r5 = 5,
186 r6 = 6,
187 r7 = 7,
188 r8 = 8,
189 rSELF = 9,
190 r10 = 10,
191 r11 = 11,
192 r12 = 12,
193 r13sp = 13,
194 rSP = 13,
195 r14lr = 14,
196 rLR = 14,
197 r15pc = 15,
198 rPC = 15,
199 fr0 = 0 + FP_REG_OFFSET,
200 fr1 = 1 + FP_REG_OFFSET,
201 fr2 = 2 + FP_REG_OFFSET,
202 fr3 = 3 + FP_REG_OFFSET,
203 fr4 = 4 + FP_REG_OFFSET,
204 fr5 = 5 + FP_REG_OFFSET,
205 fr6 = 6 + FP_REG_OFFSET,
206 fr7 = 7 + FP_REG_OFFSET,
207 fr8 = 8 + FP_REG_OFFSET,
208 fr9 = 9 + FP_REG_OFFSET,
209 fr10 = 10 + FP_REG_OFFSET,
210 fr11 = 11 + FP_REG_OFFSET,
211 fr12 = 12 + FP_REG_OFFSET,
212 fr13 = 13 + FP_REG_OFFSET,
213 fr14 = 14 + FP_REG_OFFSET,
214 fr15 = 15 + FP_REG_OFFSET,
215 fr16 = 16 + FP_REG_OFFSET,
216 fr17 = 17 + FP_REG_OFFSET,
217 fr18 = 18 + FP_REG_OFFSET,
218 fr19 = 19 + FP_REG_OFFSET,
219 fr20 = 20 + FP_REG_OFFSET,
220 fr21 = 21 + FP_REG_OFFSET,
221 fr22 = 22 + FP_REG_OFFSET,
222 fr23 = 23 + FP_REG_OFFSET,
223 fr24 = 24 + FP_REG_OFFSET,
224 fr25 = 25 + FP_REG_OFFSET,
225 fr26 = 26 + FP_REG_OFFSET,
226 fr27 = 27 + FP_REG_OFFSET,
227 fr28 = 28 + FP_REG_OFFSET,
228 fr29 = 29 + FP_REG_OFFSET,
229 fr30 = 30 + FP_REG_OFFSET,
230 fr31 = 31 + FP_REG_OFFSET,
231 dr0 = fr0 + FP_DOUBLE,
232 dr1 = fr2 + FP_DOUBLE,
233 dr2 = fr4 + FP_DOUBLE,
234 dr3 = fr6 + FP_DOUBLE,
235 dr4 = fr8 + FP_DOUBLE,
236 dr5 = fr10 + FP_DOUBLE,
237 dr6 = fr12 + FP_DOUBLE,
238 dr7 = fr14 + FP_DOUBLE,
239 dr8 = fr16 + FP_DOUBLE,
240 dr9 = fr18 + FP_DOUBLE,
241 dr10 = fr20 + FP_DOUBLE,
242 dr11 = fr22 + FP_DOUBLE,
243 dr12 = fr24 + FP_DOUBLE,
244 dr13 = fr26 + FP_DOUBLE,
245 dr14 = fr28 + FP_DOUBLE,
246 dr15 = fr30 + FP_DOUBLE,
Elliott Hughes719ace42012-03-09 18:06:03 -0800247};
buzbee67bf8852011-08-17 17:51:35 -0700248
buzbee31a4a6f2012-02-28 15:36:15 -0800249/* Target-independent aliases */
250#define rARG0 r0
251#define rARG1 r1
252#define rARG2 r2
253#define rARG3 r3
254#define rRET0 r0
255#define rRET1 r1
buzbee0398c422012-03-02 15:22:47 -0800256#define rINVOKE_TGT rLR
buzbee31a4a6f2012-02-28 15:36:15 -0800257
buzbee67bf8852011-08-17 17:51:35 -0700258/* Shift encodings */
Elliott Hughes719ace42012-03-09 18:06:03 -0800259enum ArmShiftEncodings {
buzbee67bf8852011-08-17 17:51:35 -0700260 kArmLsl = 0x0,
261 kArmLsr = 0x1,
262 kArmAsr = 0x2,
263 kArmRor = 0x3
Elliott Hughes719ace42012-03-09 18:06:03 -0800264};
buzbee67bf8852011-08-17 17:51:35 -0700265
266/* Thumb condition encodings */
Elliott Hughes719ace42012-03-09 18:06:03 -0800267enum ArmConditionCode {
buzbee67bf8852011-08-17 17:51:35 -0700268 kArmCondEq = 0x0, /* 0000 */
269 kArmCondNe = 0x1, /* 0001 */
270 kArmCondCs = 0x2, /* 0010 */
271 kArmCondCc = 0x3, /* 0011 */
272 kArmCondMi = 0x4, /* 0100 */
273 kArmCondPl = 0x5, /* 0101 */
274 kArmCondVs = 0x6, /* 0110 */
275 kArmCondVc = 0x7, /* 0111 */
276 kArmCondHi = 0x8, /* 1000 */
277 kArmCondLs = 0x9, /* 1001 */
278 kArmCondGe = 0xa, /* 1010 */
279 kArmCondLt = 0xb, /* 1011 */
280 kArmCondGt = 0xc, /* 1100 */
281 kArmCondLe = 0xd, /* 1101 */
282 kArmCondAl = 0xe, /* 1110 */
283 kArmCondNv = 0xf, /* 1111 */
Elliott Hughes719ace42012-03-09 18:06:03 -0800284};
buzbee67bf8852011-08-17 17:51:35 -0700285
286#define isPseudoOpcode(opcode) ((int)(opcode) < 0)
287
288/*
289 * The following enum defines the list of supported Thumb instructions by the
Ian Rogersde797832012-03-06 10:18:10 -0800290 * assembler. Their corresponding EncodingMap positions will be defined in
291 * Assemble.cc.
buzbee67bf8852011-08-17 17:51:35 -0700292 */
Elliott Hughes719ace42012-03-09 18:06:03 -0800293enum ArmOpcode {
buzbee31a4a6f2012-02-28 15:36:15 -0800294 kPseudoSuspendTarget = -15,
295 kPseudoThrowTarget = -14,
296 kPseudoCaseLabel = -13,
297 kPseudoMethodEntry = -12,
298 kPseudoMethodExit = -11,
299 kPseudoBarrier = -10,
300 kPseudoExtended = -9,
301 kPseudoSSARep = -8,
302 kPseudoEntryBlock = -7,
303 kPseudoExitBlock = -6,
304 kPseudoTargetLabel = -5,
305 kPseudoDalvikByteCodeBoundary = -4,
306 kPseudoPseudoAlign4 = -3,
307 kPseudoEHBlockLabel = -2,
308 kPseudoNormalBlockLabel = -1,
buzbee67bf8852011-08-17 17:51:35 -0700309 /************************************************************************/
310 kArm16BitData, /* DATA [0] rd[15..0] */
311 kThumbAdcRR, /* adc [0100000101] rm[5..3] rd[2..0] */
312 kThumbAddRRI3, /* add(1) [0001110] imm_3[8..6] rn[5..3] rd[2..0]*/
313 kThumbAddRI8, /* add(2) [00110] rd[10..8] imm_8[7..0] */
314 kThumbAddRRR, /* add(3) [0001100] rm[8..6] rn[5..3] rd[2..0] */
315 kThumbAddRRLH, /* add(4) [01000100] H12[01] rm[5..3] rd[2..0] */
316 kThumbAddRRHL, /* add(4) [01001000] H12[10] rm[5..3] rd[2..0] */
317 kThumbAddRRHH, /* add(4) [01001100] H12[11] rm[5..3] rd[2..0] */
318 kThumbAddPcRel, /* add(5) [10100] rd[10..8] imm_8[7..0] */
319 kThumbAddSpRel, /* add(6) [10101] rd[10..8] imm_8[7..0] */
320 kThumbAddSpI7, /* add(7) [101100000] imm_7[6..0] */
321 kThumbAndRR, /* and [0100000000] rm[5..3] rd[2..0] */
322 kThumbAsrRRI5, /* asr(1) [00010] imm_5[10..6] rm[5..3] rd[2..0] */
323 kThumbAsrRR, /* asr(2) [0100000100] rs[5..3] rd[2..0] */
324 kThumbBCond, /* b(1) [1101] cond[11..8] offset_8[7..0] */
325 kThumbBUncond, /* b(2) [11100] offset_11[10..0] */
326 kThumbBicRR, /* bic [0100001110] rm[5..3] rd[2..0] */
327 kThumbBkpt, /* bkpt [10111110] imm_8[7..0] */
328 kThumbBlx1, /* blx(1) [111] H[10] offset_11[10..0] */
329 kThumbBlx2, /* blx(1) [111] H[01] offset_11[10..0] */
330 kThumbBl1, /* blx(1) [111] H[10] offset_11[10..0] */
331 kThumbBl2, /* blx(1) [111] H[11] offset_11[10..0] */
332 kThumbBlxR, /* blx(2) [010001111] rm[6..3] [000] */
333 kThumbBx, /* bx [010001110] H2[6..6] rm[5..3] SBZ[000] */
334 kThumbCmnRR, /* cmn [0100001011] rm[5..3] rd[2..0] */
335 kThumbCmpRI8, /* cmp(1) [00101] rn[10..8] imm_8[7..0] */
336 kThumbCmpRR, /* cmp(2) [0100001010] rm[5..3] rd[2..0] */
337 kThumbCmpLH, /* cmp(3) [01000101] H12[01] rm[5..3] rd[2..0] */
338 kThumbCmpHL, /* cmp(3) [01000110] H12[10] rm[5..3] rd[2..0] */
339 kThumbCmpHH, /* cmp(3) [01000111] H12[11] rm[5..3] rd[2..0] */
340 kThumbEorRR, /* eor [0100000001] rm[5..3] rd[2..0] */
341 kThumbLdmia, /* ldmia [11001] rn[10..8] reglist [7..0] */
342 kThumbLdrRRI5, /* ldr(1) [01101] imm_5[10..6] rn[5..3] rd[2..0] */
343 kThumbLdrRRR, /* ldr(2) [0101100] rm[8..6] rn[5..3] rd[2..0] */
344 kThumbLdrPcRel, /* ldr(3) [01001] rd[10..8] imm_8[7..0] */
345 kThumbLdrSpRel, /* ldr(4) [10011] rd[10..8] imm_8[7..0] */
346 kThumbLdrbRRI5, /* ldrb(1) [01111] imm_5[10..6] rn[5..3] rd[2..0] */
347 kThumbLdrbRRR, /* ldrb(2) [0101110] rm[8..6] rn[5..3] rd[2..0] */
348 kThumbLdrhRRI5, /* ldrh(1) [10001] imm_5[10..6] rn[5..3] rd[2..0] */
349 kThumbLdrhRRR, /* ldrh(2) [0101101] rm[8..6] rn[5..3] rd[2..0] */
350 kThumbLdrsbRRR, /* ldrsb [0101011] rm[8..6] rn[5..3] rd[2..0] */
351 kThumbLdrshRRR, /* ldrsh [0101111] rm[8..6] rn[5..3] rd[2..0] */
352 kThumbLslRRI5, /* lsl(1) [00000] imm_5[10..6] rm[5..3] rd[2..0] */
353 kThumbLslRR, /* lsl(2) [0100000010] rs[5..3] rd[2..0] */
354 kThumbLsrRRI5, /* lsr(1) [00001] imm_5[10..6] rm[5..3] rd[2..0] */
355 kThumbLsrRR, /* lsr(2) [0100000011] rs[5..3] rd[2..0] */
356 kThumbMovImm, /* mov(1) [00100] rd[10..8] imm_8[7..0] */
357 kThumbMovRR, /* mov(2) [0001110000] rn[5..3] rd[2..0] */
358 kThumbMovRR_H2H, /* mov(3) [01000111] H12[11] rm[5..3] rd[2..0] */
359 kThumbMovRR_H2L, /* mov(3) [01000110] H12[01] rm[5..3] rd[2..0] */
360 kThumbMovRR_L2H, /* mov(3) [01000101] H12[10] rm[5..3] rd[2..0] */
361 kThumbMul, /* mul [0100001101] rm[5..3] rd[2..0] */
362 kThumbMvn, /* mvn [0100001111] rm[5..3] rd[2..0] */
363 kThumbNeg, /* neg [0100001001] rm[5..3] rd[2..0] */
364 kThumbOrr, /* orr [0100001100] rm[5..3] rd[2..0] */
365 kThumbPop, /* pop [1011110] r[8..8] rl[7..0] */
366 kThumbPush, /* push [1011010] r[8..8] rl[7..0] */
367 kThumbRorRR, /* ror [0100000111] rs[5..3] rd[2..0] */
368 kThumbSbc, /* sbc [0100000110] rm[5..3] rd[2..0] */
369 kThumbStmia, /* stmia [11000] rn[10..8] reglist [7.. 0] */
370 kThumbStrRRI5, /* str(1) [01100] imm_5[10..6] rn[5..3] rd[2..0] */
371 kThumbStrRRR, /* str(2) [0101000] rm[8..6] rn[5..3] rd[2..0] */
372 kThumbStrSpRel, /* str(3) [10010] rd[10..8] imm_8[7..0] */
373 kThumbStrbRRI5, /* strb(1) [01110] imm_5[10..6] rn[5..3] rd[2..0] */
374 kThumbStrbRRR, /* strb(2) [0101010] rm[8..6] rn[5..3] rd[2..0] */
375 kThumbStrhRRI5, /* strh(1) [10000] imm_5[10..6] rn[5..3] rd[2..0] */
376 kThumbStrhRRR, /* strh(2) [0101001] rm[8..6] rn[5..3] rd[2..0] */
377 kThumbSubRRI3, /* sub(1) [0001111] imm_3[8..6] rn[5..3] rd[2..0]*/
378 kThumbSubRI8, /* sub(2) [00111] rd[10..8] imm_8[7..0] */
379 kThumbSubRRR, /* sub(3) [0001101] rm[8..6] rn[5..3] rd[2..0] */
380 kThumbSubSpI7, /* sub(4) [101100001] imm_7[6..0] */
381 kThumbSwi, /* swi [11011111] imm_8[7..0] */
382 kThumbTst, /* tst [0100001000] rm[5..3] rn[2..0] */
383 kThumb2Vldrs, /* vldr low sx [111011011001] rn[19..16] rd[15-12]
384 [1010] imm_8[7..0] */
385 kThumb2Vldrd, /* vldr low dx [111011011001] rn[19..16] rd[15-12]
386 [1011] imm_8[7..0] */
387 kThumb2Vmuls, /* vmul vd, vn, vm [111011100010] rn[19..16]
388 rd[15-12] [10100000] rm[3..0] */
389 kThumb2Vmuld, /* vmul vd, vn, vm [111011100010] rn[19..16]
390 rd[15-12] [10110000] rm[3..0] */
391 kThumb2Vstrs, /* vstr low sx [111011011000] rn[19..16] rd[15-12]
392 [1010] imm_8[7..0] */
393 kThumb2Vstrd, /* vstr low dx [111011011000] rn[19..16] rd[15-12]
394 [1011] imm_8[7..0] */
395 kThumb2Vsubs, /* vsub vd, vn, vm [111011100011] rn[19..16]
396 rd[15-12] [10100040] rm[3..0] */
397 kThumb2Vsubd, /* vsub vd, vn, vm [111011100011] rn[19..16]
398 rd[15-12] [10110040] rm[3..0] */
399 kThumb2Vadds, /* vadd vd, vn, vm [111011100011] rn[19..16]
400 rd[15-12] [10100000] rm[3..0] */
401 kThumb2Vaddd, /* vadd vd, vn, vm [111011100011] rn[19..16]
402 rd[15-12] [10110000] rm[3..0] */
403 kThumb2Vdivs, /* vdiv vd, vn, vm [111011101000] rn[19..16]
404 rd[15-12] [10100000] rm[3..0] */
405 kThumb2Vdivd, /* vdiv vd, vn, vm [111011101000] rn[19..16]
406 rd[15-12] [10110000] rm[3..0] */
407 kThumb2VcvtIF, /* vcvt.F32 vd, vm [1110111010111000] vd[15..12]
408 [10101100] vm[3..0] */
409 kThumb2VcvtID, /* vcvt.F64 vd, vm [1110111010111000] vd[15..12]
410 [10111100] vm[3..0] */
411 kThumb2VcvtFI, /* vcvt.S32.F32 vd, vm [1110111010111101] vd[15..12]
412 [10101100] vm[3..0] */
413 kThumb2VcvtDI, /* vcvt.S32.F32 vd, vm [1110111010111101] vd[15..12]
414 [10111100] vm[3..0] */
415 kThumb2VcvtFd, /* vcvt.F64.F32 vd, vm [1110111010110111] vd[15..12]
416 [10101100] vm[3..0] */
417 kThumb2VcvtDF, /* vcvt.F32.F64 vd, vm [1110111010110111] vd[15..12]
418 [10111100] vm[3..0] */
419 kThumb2Vsqrts, /* vsqrt.f32 vd, vm [1110111010110001] vd[15..12]
420 [10101100] vm[3..0] */
421 kThumb2Vsqrtd, /* vsqrt.f64 vd, vm [1110111010110001] vd[15..12]
422 [10111100] vm[3..0] */
423 kThumb2MovImmShift, /* mov(T2) rd, #<const> [11110] i [00001001111]
424 imm3 rd[11..8] imm8 */
425 kThumb2MovImm16, /* mov(T3) rd, #<const> [11110] i [0010100] imm4 [0]
426 imm3 rd[11..8] imm8 */
427 kThumb2StrRRI12, /* str(Imm,T3) rd,[rn,#imm12] [111110001100]
428 rn[19..16] rt[15..12] imm12[11..0] */
429 kThumb2LdrRRI12, /* str(Imm,T3) rd,[rn,#imm12] [111110001100]
430 rn[19..16] rt[15..12] imm12[11..0] */
431 kThumb2StrRRI8Predec, /* str(Imm,T4) rd,[rn,#-imm8] [111110000100]
432 rn[19..16] rt[15..12] [1100] imm[7..0]*/
433 kThumb2LdrRRI8Predec, /* ldr(Imm,T4) rd,[rn,#-imm8] [111110000101]
434 rn[19..16] rt[15..12] [1100] imm[7..0]*/
435 kThumb2Cbnz, /* cbnz rd,<label> [101110] i [1] imm5[7..3]
436 rn[2..0] */
437 kThumb2Cbz, /* cbn rd,<label> [101100] i [1] imm5[7..3]
438 rn[2..0] */
439 kThumb2AddRRI12, /* add rd, rn, #imm12 [11110] i [100000] rn[19..16]
440 [0] imm3[14..12] rd[11..8] imm8[7..0] */
441 kThumb2MovRR, /* mov rd, rm [11101010010011110000] rd[11..8]
442 [0000] rm[3..0] */
443 kThumb2Vmovs, /* vmov.f32 vd, vm [111011101] D [110000]
444 vd[15..12] 101001] M [0] vm[3..0] */
445 kThumb2Vmovd, /* vmov.f64 vd, vm [111011101] D [110000]
446 vd[15..12] 101101] M [0] vm[3..0] */
447 kThumb2Ldmia, /* ldmia [111010001001[ rn[19..16] mask[15..0] */
448 kThumb2Stmia, /* stmia [111010001000[ rn[19..16] mask[15..0] */
449 kThumb2AddRRR, /* add [111010110000] rn[19..16] [0000] rd[11..8]
450 [0000] rm[3..0] */
451 kThumb2SubRRR, /* sub [111010111010] rn[19..16] [0000] rd[11..8]
452 [0000] rm[3..0] */
453 kThumb2SbcRRR, /* sbc [111010110110] rn[19..16] [0000] rd[11..8]
454 [0000] rm[3..0] */
455 kThumb2CmpRR, /* cmp [111010111011] rn[19..16] [0000] [1111]
456 [0000] rm[3..0] */
457 kThumb2SubRRI12, /* sub rd, rn, #imm12 [11110] i [01010] rn[19..16]
458 [0] imm3[14..12] rd[11..8] imm8[7..0] */
buzbee58f92742011-10-01 11:22:17 -0700459 kThumb2MvnImm12, /* mov(T2) rd, #<const> [11110] i [00011011110]
buzbee67bf8852011-08-17 17:51:35 -0700460 imm3 rd[11..8] imm8 */
461 kThumb2Sel, /* sel rd, rn, rm [111110101010] rn[19-16] rd[11-8]
462 rm[3-0] */
463 kThumb2Ubfx, /* ubfx rd,rn,#lsb,#width [111100111100] rn[19..16]
464 [0] imm3[14-12] rd[11-8] w[4-0] */
465 kThumb2Sbfx, /* ubfx rd,rn,#lsb,#width [111100110100] rn[19..16]
466 [0] imm3[14-12] rd[11-8] w[4-0] */
467 kThumb2LdrRRR, /* ldr rt,[rn,rm,LSL #imm] [111110000101] rn[19-16]
468 rt[15-12] [000000] imm[5-4] rm[3-0] */
469 kThumb2LdrhRRR, /* ldrh rt,[rn,rm,LSL #imm] [111110000101] rn[19-16]
470 rt[15-12] [000000] imm[5-4] rm[3-0] */
471 kThumb2LdrshRRR, /* ldrsh rt,[rn,rm,LSL #imm] [111110000101] rn[19-16]
472 rt[15-12] [000000] imm[5-4] rm[3-0] */
473 kThumb2LdrbRRR, /* ldrb rt,[rn,rm,LSL #imm] [111110000101] rn[19-16]
474 rt[15-12] [000000] imm[5-4] rm[3-0] */
475 kThumb2LdrsbRRR, /* ldrsb rt,[rn,rm,LSL #imm] [111110000101] rn[19-16]
476 rt[15-12] [000000] imm[5-4] rm[3-0] */
477 kThumb2StrRRR, /* str rt,[rn,rm,LSL #imm] [111110000100] rn[19-16]
478 rt[15-12] [000000] imm[5-4] rm[3-0] */
479 kThumb2StrhRRR, /* str rt,[rn,rm,LSL #imm] [111110000010] rn[19-16]
480 rt[15-12] [000000] imm[5-4] rm[3-0] */
481 kThumb2StrbRRR, /* str rt,[rn,rm,LSL #imm] [111110000000] rn[19-16]
482 rt[15-12] [000000] imm[5-4] rm[3-0] */
483 kThumb2LdrhRRI12, /* ldrh rt,[rn,#imm12] [111110001011]
484 rt[15..12] rn[19..16] imm12[11..0] */
485 kThumb2LdrshRRI12, /* ldrsh rt,[rn,#imm12] [111110011011]
486 rt[15..12] rn[19..16] imm12[11..0] */
487 kThumb2LdrbRRI12, /* ldrb rt,[rn,#imm12] [111110001001]
488 rt[15..12] rn[19..16] imm12[11..0] */
489 kThumb2LdrsbRRI12, /* ldrsb rt,[rn,#imm12] [111110011001]
490 rt[15..12] rn[19..16] imm12[11..0] */
491 kThumb2StrhRRI12, /* strh rt,[rn,#imm12] [111110001010]
492 rt[15..12] rn[19..16] imm12[11..0] */
493 kThumb2StrbRRI12, /* strb rt,[rn,#imm12] [111110001000]
494 rt[15..12] rn[19..16] imm12[11..0] */
495 kThumb2Pop, /* pop [1110100010111101] list[15-0]*/
496 kThumb2Push, /* push [1110100100101101] list[15-0]*/
497 kThumb2CmpRI8, /* cmp rn, #<const> [11110] i [011011] rn[19-16] [0]
498 imm3 [1111] imm8[7..0] */
499 kThumb2AdcRRR, /* adc [111010110101] rn[19..16] [0000] rd[11..8]
500 [0000] rm[3..0] */
501 kThumb2AndRRR, /* and [111010100000] rn[19..16] [0000] rd[11..8]
502 [0000] rm[3..0] */
503 kThumb2BicRRR, /* bic [111010100010] rn[19..16] [0000] rd[11..8]
504 [0000] rm[3..0] */
505 kThumb2CmnRR, /* cmn [111010110001] rn[19..16] [0000] [1111]
506 [0000] rm[3..0] */
507 kThumb2EorRRR, /* eor [111010101000] rn[19..16] [0000] rd[11..8]
508 [0000] rm[3..0] */
509 kThumb2MulRRR, /* mul [111110110000] rn[19..16] [1111] rd[11..8]
510 [0000] rm[3..0] */
511 kThumb2MnvRR, /* mvn [11101010011011110] rd[11-8] [0000]
512 rm[3..0] */
513 kThumb2RsubRRI8, /* rsub [111100011100] rn[19..16] [0000] rd[11..8]
514 imm8[7..0] */
515 kThumb2NegRR, /* actually rsub rd, rn, #0 */
516 kThumb2OrrRRR, /* orr [111010100100] rn[19..16] [0000] rd[11..8]
517 [0000] rm[3..0] */
518 kThumb2TstRR, /* tst [111010100001] rn[19..16] [0000] [1111]
519 [0000] rm[3..0] */
520 kThumb2LslRRR, /* lsl [111110100000] rn[19..16] [1111] rd[11..8]
521 [0000] rm[3..0] */
522 kThumb2LsrRRR, /* lsr [111110100010] rn[19..16] [1111] rd[11..8]
523 [0000] rm[3..0] */
524 kThumb2AsrRRR, /* asr [111110100100] rn[19..16] [1111] rd[11..8]
525 [0000] rm[3..0] */
526 kThumb2RorRRR, /* ror [111110100110] rn[19..16] [1111] rd[11..8]
527 [0000] rm[3..0] */
528 kThumb2LslRRI5, /* lsl [11101010010011110] imm[14.12] rd[11..8]
529 [00] rm[3..0] */
530 kThumb2LsrRRI5, /* lsr [11101010010011110] imm[14.12] rd[11..8]
531 [01] rm[3..0] */
532 kThumb2AsrRRI5, /* asr [11101010010011110] imm[14.12] rd[11..8]
533 [10] rm[3..0] */
534 kThumb2RorRRI5, /* ror [11101010010011110] imm[14.12] rd[11..8]
535 [11] rm[3..0] */
536 kThumb2BicRRI8, /* bic [111100000010] rn[19..16] [0] imm3
537 rd[11..8] imm8 */
538 kThumb2AndRRI8, /* bic [111100000000] rn[19..16] [0] imm3
539 rd[11..8] imm8 */
540 kThumb2OrrRRI8, /* orr [111100000100] rn[19..16] [0] imm3
541 rd[11..8] imm8 */
542 kThumb2EorRRI8, /* eor [111100001000] rn[19..16] [0] imm3
543 rd[11..8] imm8 */
544 kThumb2AddRRI8, /* add [111100001000] rn[19..16] [0] imm3
545 rd[11..8] imm8 */
546 kThumb2AdcRRI8, /* adc [111100010101] rn[19..16] [0] imm3
547 rd[11..8] imm8 */
548 kThumb2SubRRI8, /* sub [111100011011] rn[19..16] [0] imm3
549 rd[11..8] imm8 */
550 kThumb2SbcRRI8, /* sbc [111100010111] rn[19..16] [0] imm3
551 rd[11..8] imm8 */
552 kThumb2It, /* it [10111111] firstcond[7-4] mask[3-0] */
553 kThumb2Fmstat, /* fmstat [11101110111100011111101000010000] */
554 kThumb2Vcmpd, /* vcmp [111011101] D [11011] rd[15-12] [1011]
555 E [1] M [0] rm[3-0] */
556 kThumb2Vcmps, /* vcmp [111011101] D [11010] rd[15-12] [1011]
557 E [1] M [0] rm[3-0] */
558 kThumb2LdrPcRel12, /* ldr rd,[pc,#imm12] [1111100011011111] rt[15-12]
559 imm12[11-0] */
560 kThumb2BCond, /* b<c> [1110] S cond[25-22] imm6[21-16] [10]
561 J1 [0] J2 imm11[10..0] */
562 kThumb2Vmovd_RR, /* vmov [111011101] D [110000] vd[15-12 [101101]
563 M [0] vm[3-0] */
564 kThumb2Vmovs_RR, /* vmov [111011101] D [110000] vd[15-12 [101001]
565 M [0] vm[3-0] */
566 kThumb2Fmrs, /* vmov [111011100000] vn[19-16] rt[15-12] [1010]
567 N [0010000] */
568 kThumb2Fmsr, /* vmov [111011100001] vn[19-16] rt[15-12] [1010]
569 N [0010000] */
570 kThumb2Fmrrd, /* vmov [111011000100] rt2[19-16] rt[15-12]
571 [101100] M [1] vm[3-0] */
572 kThumb2Fmdrr, /* vmov [111011000101] rt2[19-16] rt[15-12]
573 [101100] M [1] vm[3-0] */
574 kThumb2Vabsd, /* vabs.f64 [111011101] D [110000] rd[15-12]
575 [1011110] M [0] vm[3-0] */
576 kThumb2Vabss, /* vabs.f32 [111011101] D [110000] rd[15-12]
577 [1010110] M [0] vm[3-0] */
578 kThumb2Vnegd, /* vneg.f64 [111011101] D [110000] rd[15-12]
579 [1011110] M [0] vm[3-0] */
580 kThumb2Vnegs, /* vneg.f32 [111011101] D [110000] rd[15-12]
581 [1010110] M [0] vm[3-0] */
582 kThumb2Vmovs_IMM8, /* vmov.f32 [111011101] D [11] imm4h[19-16] vd[15-12]
583 [10100000] imm4l[3-0] */
584 kThumb2Vmovd_IMM8, /* vmov.f64 [111011101] D [11] imm4h[19-16] vd[15-12]
585 [10110000] imm4l[3-0] */
586 kThumb2Mla, /* mla [111110110000] rn[19-16] ra[15-12] rd[7-4]
587 [0000] rm[3-0] */
588 kThumb2Umull, /* umull [111110111010] rn[19-16], rdlo[15-12]
589 rdhi[11-8] [0000] rm[3-0] */
590 kThumb2Ldrex, /* ldrex [111010000101] rn[19-16] rt[11-8] [1111]
591 imm8[7-0] */
592 kThumb2Strex, /* strex [111010000100] rn[19-16] rt[11-8] rd[11-8]
593 imm8[7-0] */
594 kThumb2Clrex, /* clrex [111100111011111110000111100101111] */
595 kThumb2Bfi, /* bfi [111100110110] rn[19-16] [0] imm3[14-12]
596 rd[11-8] imm2[7-6] [0] msb[4-0] */
597 kThumb2Bfc, /* bfc [11110011011011110] [0] imm3[14-12]
598 rd[11-8] imm2[7-6] [0] msb[4-0] */
599 kThumb2Dmb, /* dmb [1111001110111111100011110101] option[3-0] */
600 kThumb2LdrPcReln12, /* ldr rd,[pc,-#imm12] [1111100011011111] rt[15-12]
601 imm12[11-0] */
602 kThumb2Stm, /* stm <list> [111010010000] rn[19-16] 000 rl[12-0] */
603 kThumbUndefined, /* undefined [11011110xxxxxxxx] */
604 kThumb2VPopCS, /* vpop <list of callee save fp singles (s16+) */
605 kThumb2VPushCS, /* vpush <list callee save fp singles (s16+) */
606 kThumb2Vldms, /* vldms rd, <list> */
607 kThumb2Vstms, /* vstms rd, <list> */
608 kThumb2BUncond, /* b <label> */
609 kThumb2MovImm16H, /* similar to kThumb2MovImm16, but target high hw */
610 kThumb2AddPCR, /* Thumb2 2-operand add with hard-coded PC target */
buzbee03fa2632011-09-20 17:10:57 -0700611 kThumb2Adr, /* Special purpose encoding of ADR for switch tables */
buzbee67bf8852011-08-17 17:51:35 -0700612 kThumb2MovImm16LST, /* Special purpose version for switch table use */
613 kThumb2MovImm16HST, /* Special purpose version for switch table use */
614 kThumb2LdmiaWB, /* ldmia [111010011001[ rn[19..16] mask[15..0] */
615 kThumb2SubsRRI12, /* setflags encoding */
buzbee58f92742011-10-01 11:22:17 -0700616 kThumb2OrrRRRs, /* orrx [111010100101] rn[19..16] [0000] rd[11..8]
617 [0000] rm[3..0] */
buzbeee7070802011-10-09 17:56:06 -0700618 kThumb2Push1, /* t3 encoding of push */
619 kThumb2Pop1, /* t3 encoding of pop */
buzbee67bf8852011-08-17 17:51:35 -0700620 kArmLast,
Elliott Hughes719ace42012-03-09 18:06:03 -0800621};
buzbee67bf8852011-08-17 17:51:35 -0700622
623/* DMB option encodings */
Elliott Hughes719ace42012-03-09 18:06:03 -0800624enum ArmOpDmbOptions {
buzbee67bf8852011-08-17 17:51:35 -0700625 kSY = 0xf,
626 kST = 0xe,
627 kISH = 0xb,
628 kISHST = 0xa,
629 kNSH = 0x7,
630 kNSHST = 0x6
Elliott Hughes719ace42012-03-09 18:06:03 -0800631};
buzbee67bf8852011-08-17 17:51:35 -0700632
633/* Bit flags describing the behavior of each native opcode */
Elliott Hughes719ace42012-03-09 18:06:03 -0800634enum ArmOpFeatureFlags {
buzbee67bf8852011-08-17 17:51:35 -0700635 kIsBranch = 0,
636 kRegDef0,
637 kRegDef1,
638 kRegDefSP,
639 kRegDefLR,
640 kRegDefList0,
641 kRegDefList1,
642 kRegDefFPCSList0,
643 kRegDefFPCSList2,
644 kRegDefList2,
645 kRegUse0,
646 kRegUse1,
647 kRegUse2,
648 kRegUse3,
649 kRegUseSP,
650 kRegUsePC,
651 kRegUseList0,
652 kRegUseList1,
653 kRegUseFPCSList0,
654 kRegUseFPCSList2,
655 kNoOperand,
656 kIsUnaryOp,
657 kIsBinaryOp,
658 kIsTertiaryOp,
659 kIsQuadOp,
660 kIsIT,
661 kSetsCCodes,
662 kUsesCCodes,
663 kMemLoad,
664 kMemStore,
buzbee5abfa3e2012-01-31 17:01:43 -0800665 kPCRelFixup,
Elliott Hughes719ace42012-03-09 18:06:03 -0800666};
buzbee67bf8852011-08-17 17:51:35 -0700667
668#define IS_LOAD (1 << kMemLoad)
669#define IS_STORE (1 << kMemStore)
670#define IS_BRANCH (1 << kIsBranch)
671#define REG_DEF0 (1 << kRegDef0)
672#define REG_DEF1 (1 << kRegDef1)
673#define REG_DEF_SP (1 << kRegDefSP)
674#define REG_DEF_LR (1 << kRegDefLR)
675#define REG_DEF_LIST0 (1 << kRegDefList0)
676#define REG_DEF_LIST1 (1 << kRegDefList1)
677#define REG_DEF_FPCS_LIST0 (1 << kRegDefFPCSList0)
678#define REG_DEF_FPCS_LIST2 (1 << kRegDefFPCSList2)
679#define REG_USE0 (1 << kRegUse0)
680#define REG_USE1 (1 << kRegUse1)
681#define REG_USE2 (1 << kRegUse2)
682#define REG_USE3 (1 << kRegUse3)
683#define REG_USE_SP (1 << kRegUseSP)
684#define REG_USE_PC (1 << kRegUsePC)
685#define REG_USE_LIST0 (1 << kRegUseList0)
686#define REG_USE_LIST1 (1 << kRegUseList1)
687#define REG_USE_FPCS_LIST0 (1 << kRegUseFPCSList0)
688#define REG_USE_FPCS_LIST2 (1 << kRegUseFPCSList2)
689#define NO_OPERAND (1 << kNoOperand)
690#define IS_UNARY_OP (1 << kIsUnaryOp)
691#define IS_BINARY_OP (1 << kIsBinaryOp)
692#define IS_TERTIARY_OP (1 << kIsTertiaryOp)
693#define IS_QUAD_OP (1 << kIsQuadOp)
Ian Rogersb5d09b22012-03-06 22:14:17 -0800694#define IS_QUIN_OP 0
buzbee67bf8852011-08-17 17:51:35 -0700695#define IS_IT (1 << kIsIT)
696#define SETS_CCODES (1 << kSetsCCodes)
697#define USES_CCODES (1 << kUsesCCodes)
buzbee5abfa3e2012-01-31 17:01:43 -0800698#define NEEDS_FIXUP (1 << kPCRelFixup)
buzbee67bf8852011-08-17 17:51:35 -0700699
700/* Common combo register usage patterns */
701#define REG_USE01 (REG_USE0 | REG_USE1)
702#define REG_USE012 (REG_USE01 | REG_USE2)
703#define REG_USE12 (REG_USE1 | REG_USE2)
704#define REG_DEF0_USE0 (REG_DEF0 | REG_USE0)
705#define REG_DEF0_USE1 (REG_DEF0 | REG_USE1)
706#define REG_DEF0_USE01 (REG_DEF0 | REG_USE01)
707#define REG_DEF0_USE12 (REG_DEF0 | REG_USE12)
708#define REG_DEF01_USE2 (REG_DEF0 | REG_DEF1 | REG_USE2)
709
710/* Instruction assembly fieldLoc kind */
Elliott Hughes719ace42012-03-09 18:06:03 -0800711enum ArmEncodingKind {
buzbee67bf8852011-08-17 17:51:35 -0700712 kFmtUnused,
713 kFmtBitBlt, /* Bit string using end/start */
714 kFmtDfp, /* Double FP reg */
715 kFmtSfp, /* Single FP reg */
716 kFmtModImm, /* Shifted 8-bit immed using [26,14..12,7..0] */
717 kFmtImm16, /* Zero-extended immed using [26,19..16,14..12,7..0] */
718 kFmtImm6, /* Encoded branch target using [9,7..3]0 */
719 kFmtImm12, /* Zero-extended immediate using [26,14..12,7..0] */
720 kFmtShift, /* Shift descriptor, [14..12,7..4] */
721 kFmtLsb, /* least significant bit using [14..12][7..6] */
722 kFmtBWidth, /* bit-field width, encoded as width-1 */
723 kFmtShift5, /* Shift count, [14..12,7..6] */
724 kFmtBrOffset, /* Signed extended [26,11,13,21-16,10-0]:0 */
725 kFmtFPImm, /* Encoded floating point immediate */
726 kFmtOff24, /* 24-bit Thumb2 unconditional branch encoding */
Elliott Hughes719ace42012-03-09 18:06:03 -0800727};
buzbee67bf8852011-08-17 17:51:35 -0700728
729/* Struct used to define the snippet positions for each Thumb opcode */
Elliott Hughes719ace42012-03-09 18:06:03 -0800730struct ArmEncodingMap {
buzbee67bf8852011-08-17 17:51:35 -0700731 u4 skeleton;
732 struct {
733 ArmEncodingKind kind;
734 int end; /* end for kFmtBitBlt, 1-bit slice end for FP regs */
735 int start; /* start for kFmtBitBlt, 4-bit slice end for FP regs */
736 } fieldLoc[4];
737 ArmOpcode opcode;
738 int flags;
739 const char* name;
740 const char* fmt;
buzbee71ac9942012-03-01 17:23:10 -0800741 int size; /* Size in bytes */
Elliott Hughes719ace42012-03-09 18:06:03 -0800742};
buzbee67bf8852011-08-17 17:51:35 -0700743
744/* Keys for target-specific scheduling and other optimization hints */
Elliott Hughes719ace42012-03-09 18:06:03 -0800745enum ArmTargetOptHints {
buzbee67bf8852011-08-17 17:51:35 -0700746 kMaxHoistDistance,
Elliott Hughes719ace42012-03-09 18:06:03 -0800747};
buzbee67bf8852011-08-17 17:51:35 -0700748
buzbeeba938cb2012-02-03 14:47:55 -0800749extern const ArmEncodingMap EncodingMap[kArmLast];
buzbee67bf8852011-08-17 17:51:35 -0700750
Elliott Hughes11d1b0c2012-01-23 16:57:47 -0800751} // namespace art
752
buzbee67bf8852011-08-17 17:51:35 -0700753#endif // ART_SRC_COMPILER_CODEGEN_ARM_ARMLIR_H_