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