blob: ee195598db834aa678cc09a1aab4875af45100cf [file] [log] [blame]
buzbee1452bee2015-03-06 14:43:04 -08001/*
2 * This file was generated automatically by gen-mterp.py for 'arm'.
3 *
4 * --> DO NOT EDIT <--
5 */
6
7/* File: arm/header.S */
8/*
9 * Copyright (C) 2016 The Android Open Source Project
10 *
11 * Licensed under the Apache License, Version 2.0 (the "License");
12 * you may not use this file except in compliance with the License.
13 * You may obtain a copy of the License at
14 *
15 * http://www.apache.org/licenses/LICENSE-2.0
16 *
17 * Unless required by applicable law or agreed to in writing, software
18 * distributed under the License is distributed on an "AS IS" BASIS,
19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 * See the License for the specific language governing permissions and
21 * limitations under the License.
22 */
23
24/*
25 Art assembly interpreter notes:
26
27 First validate assembly code by implementing ExecuteXXXImpl() style body (doesn't
28 handle invoke, allows higher-level code to create frame & shadow frame.
29
30 Once that's working, support direct entry code & eliminate shadow frame (and
31 excess locals allocation.
32
33 Some (hopefully) temporary ugliness. We'll treat rFP as pointing to the
34 base of the vreg array within the shadow frame. Access the other fields,
35 dex_pc_, method_ and number_of_vregs_ via negative offsets. For now, we'll continue
36 the shadow frame mechanism of double-storing object references - via rFP &
37 number_of_vregs_.
38
39 */
40
41/*
42ARM EABI general notes:
43
44r0-r3 hold first 4 args to a method; they are not preserved across method calls
45r4-r8 are available for general use
46r9 is given special treatment in some situations, but not for us
47r10 (sl) seems to be generally available
48r11 (fp) is used by gcc (unless -fomit-frame-pointer is set)
49r12 (ip) is scratch -- not preserved across method calls
50r13 (sp) should be managed carefully in case a signal arrives
51r14 (lr) must be preserved
52r15 (pc) can be tinkered with directly
53
54r0 holds returns of <= 4 bytes
55r0-r1 hold returns of 8 bytes, low word in r0
56
57Callee must save/restore r4+ (except r12) if it modifies them. If VFP
58is present, registers s16-s31 (a/k/a d8-d15, a/k/a q4-q7) must be preserved,
59s0-s15 (d0-d7, q0-a3) do not need to be.
60
61Stack is "full descending". Only the arguments that don't fit in the first 4
62registers are placed on the stack. "sp" points at the first stacked argument
63(i.e. the 5th arg).
64
65VFP: single-precision results in s0, double-precision results in d0.
66
67In the EABI, "sp" must be 64-bit aligned on entry to a function, and any
6864-bit quantities (long long, double) must be 64-bit aligned.
69*/
70
71/*
72Mterp and ARM notes:
73
74The following registers have fixed assignments:
75
76 reg nick purpose
77 r4 rPC interpreted program counter, used for fetching instructions
78 r5 rFP interpreted frame pointer, used for accessing locals and args
79 r6 rSELF self (Thread) pointer
80 r7 rINST first 16-bit code unit of current instruction
81 r8 rIBASE interpreted instruction base pointer, used for computed goto
82 r11 rREFS base of object references in shadow frame (ideally, we'll get rid of this later).
83
84Macros are provided for common operations. Each macro MUST emit only
85one instruction to make instruction-counting easier. They MUST NOT alter
86unspecified registers or condition codes.
87*/
88
89/*
90 * This is a #include, not a %include, because we want the C pre-processor
91 * to expand the macros into assembler assignment statements.
92 */
93#include "asm_support.h"
94
95/* During bringup, we'll use the shadow frame model instead of rFP */
96/* single-purpose registers, given names for clarity */
97#define rPC r4
98#define rFP r5
99#define rSELF r6
100#define rINST r7
101#define rIBASE r8
102#define rREFS r11
103
104/*
105 * Instead of holding a pointer to the shadow frame, we keep rFP at the base of the vregs. So,
106 * to access other shadow frame fields, we need to use a backwards offset. Define those here.
107 */
108#define OFF_FP(a) (a - SHADOWFRAME_VREGS_OFFSET)
109#define OFF_FP_NUMBER_OF_VREGS OFF_FP(SHADOWFRAME_NUMBER_OF_VREGS_OFFSET)
110#define OFF_FP_DEX_PC OFF_FP(SHADOWFRAME_DEX_PC_OFFSET)
111#define OFF_FP_LINK OFF_FP(SHADOWFRAME_LINK_OFFSET)
112#define OFF_FP_METHOD OFF_FP(SHADOWFRAME_METHOD_OFFSET)
113#define OFF_FP_RESULT_REGISTER OFF_FP(SHADOWFRAME_RESULT_REGISTER_OFFSET)
114#define OFF_FP_DEX_PC_PTR OFF_FP(SHADOWFRAME_DEX_PC_PTR_OFFSET)
115#define OFF_FP_CODE_ITEM OFF_FP(SHADOWFRAME_CODE_ITEM_OFFSET)
116#define OFF_FP_SHADOWFRAME (-SHADOWFRAME_VREGS_OFFSET)
117
118/*
119 *
120 * The reference interpreter performs explicit suspect checks, which is somewhat wasteful.
121 * Dalvik's interpreter folded suspend checks into the jump table mechanism, and eventually
122 * mterp should do so as well.
123 */
124#define MTERP_SUSPEND 0
125
126/*
127 * "export" the PC to dex_pc field in the shadow frame, f/b/o future exception objects. Must
128 * be done *before* something throws.
129 *
130 * It's okay to do this more than once.
131 *
132 * NOTE: the fast interpreter keeps track of dex pc as a direct pointer to the mapped
133 * dex byte codes. However, the rest of the runtime expects dex pc to be an instruction
134 * offset into the code_items_[] array. For effiency, we will "export" the
135 * current dex pc as a direct pointer using the EXPORT_PC macro, and rely on GetDexPC
136 * to convert to a dex pc when needed.
137 */
138.macro EXPORT_PC
139 str rPC, [rFP, #OFF_FP_DEX_PC_PTR]
140.endm
141
142.macro EXPORT_DEX_PC tmp
143 ldr \tmp, [rFP, #OFF_FP_CODE_ITEM]
144 str rPC, [rFP, #OFF_FP_DEX_PC_PTR]
145 add \tmp, #CODEITEM_INSNS_OFFSET
146 sub \tmp, rPC, \tmp
147 asr \tmp, #1
148 str \tmp, [rFP, #OFF_FP_DEX_PC]
149.endm
150
151/*
152 * Fetch the next instruction from rPC into rINST. Does not advance rPC.
153 */
154.macro FETCH_INST
155 ldrh rINST, [rPC]
156.endm
157
158/*
159 * Fetch the next instruction from the specified offset. Advances rPC
160 * to point to the next instruction. "_count" is in 16-bit code units.
161 *
162 * Because of the limited size of immediate constants on ARM, this is only
163 * suitable for small forward movements (i.e. don't try to implement "goto"
164 * with this).
165 *
166 * This must come AFTER anything that can throw an exception, or the
167 * exception catch may miss. (This also implies that it must come after
168 * EXPORT_PC.)
169 */
170.macro FETCH_ADVANCE_INST count
171 ldrh rINST, [rPC, #((\count)*2)]!
172.endm
173
174/*
175 * The operation performed here is similar to FETCH_ADVANCE_INST, except the
176 * src and dest registers are parameterized (not hard-wired to rPC and rINST).
177 */
178.macro PREFETCH_ADVANCE_INST dreg, sreg, count
179 ldrh \dreg, [\sreg, #((\count)*2)]!
180.endm
181
182/*
183 * Similar to FETCH_ADVANCE_INST, but does not update rPC. Used to load
184 * rINST ahead of possible exception point. Be sure to manually advance rPC
185 * later.
186 */
187.macro PREFETCH_INST count
188 ldrh rINST, [rPC, #((\count)*2)]
189.endm
190
191/* Advance rPC by some number of code units. */
192.macro ADVANCE count
193 add rPC, #((\count)*2)
194.endm
195
196/*
197 * Fetch the next instruction from an offset specified by _reg. Updates
198 * rPC to point to the next instruction. "_reg" must specify the distance
199 * in bytes, *not* 16-bit code units, and may be a signed value.
200 *
201 * We want to write "ldrh rINST, [rPC, _reg, lsl #1]!", but some of the
202 * bits that hold the shift distance are used for the half/byte/sign flags.
203 * In some cases we can pre-double _reg for free, so we require a byte offset
204 * here.
205 */
206.macro FETCH_ADVANCE_INST_RB reg
207 ldrh rINST, [rPC, \reg]!
208.endm
209
210/*
211 * Fetch a half-word code unit from an offset past the current PC. The
212 * "_count" value is in 16-bit code units. Does not advance rPC.
213 *
214 * The "_S" variant works the same but treats the value as signed.
215 */
216.macro FETCH reg, count
217 ldrh \reg, [rPC, #((\count)*2)]
218.endm
219
220.macro FETCH_S reg, count
221 ldrsh \reg, [rPC, #((\count)*2)]
222.endm
223
224/*
225 * Fetch one byte from an offset past the current PC. Pass in the same
226 * "_count" as you would for FETCH, and an additional 0/1 indicating which
227 * byte of the halfword you want (lo/hi).
228 */
229.macro FETCH_B reg, count, byte
230 ldrb \reg, [rPC, #((\count)*2+(\byte))]
231.endm
232
233/*
234 * Put the instruction's opcode field into the specified register.
235 */
236.macro GET_INST_OPCODE reg
237 and \reg, rINST, #255
238.endm
239
240/*
241 * Put the prefetched instruction's opcode field into the specified register.
242 */
243.macro GET_PREFETCHED_OPCODE oreg, ireg
244 and \oreg, \ireg, #255
245.endm
246
247/*
248 * Begin executing the opcode in _reg. Because this only jumps within the
249 * interpreter, we don't have to worry about pre-ARMv5 THUMB interwork.
250 */
251.macro GOTO_OPCODE reg
252 add pc, rIBASE, \reg, lsl #7
253.endm
254.macro GOTO_OPCODE_BASE base,reg
255 add pc, \base, \reg, lsl #7
256.endm
257
258/*
259 * Get/set the 32-bit value from a Dalvik register.
260 */
261.macro GET_VREG reg, vreg
262 ldr \reg, [rFP, \vreg, lsl #2]
263.endm
264.macro SET_VREG reg, vreg
265 str \reg, [rFP, \vreg, lsl #2]
266 mov \reg, #0
267 str \reg, [rREFS, \vreg, lsl #2]
268.endm
269.macro SET_VREG_OBJECT reg, vreg, tmpreg
270 str \reg, [rFP, \vreg, lsl #2]
271 str \reg, [rREFS, \vreg, lsl #2]
272.endm
buzbee50cf6002016-02-10 08:59:12 -0800273.macro SET_VREG_SHADOW reg, vreg
274 str \reg, [rREFS, \vreg, lsl #2]
275.endm
276
277/*
278 * Clear the corresponding shadow regs for a vreg pair
279 */
280.macro CLEAR_SHADOW_PAIR vreg, tmp1, tmp2
281 mov \tmp1, #0
282 add \tmp2, \vreg, #1
283 SET_VREG_SHADOW \tmp1, \vreg
284 SET_VREG_SHADOW \tmp1, \tmp2
285.endm
buzbee1452bee2015-03-06 14:43:04 -0800286
287/*
288 * Convert a virtual register index into an address.
289 */
290.macro VREG_INDEX_TO_ADDR reg, vreg
291 add \reg, rFP, \vreg, lsl #2 /* WARNING/FIXME: handle shadow frame vreg zero if store */
292.endm
293
294/*
295 * Refresh handler table.
296 */
297.macro REFRESH_IBASE
298 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]
299.endm
300
301/* File: arm/entry.S */
302/*
303 * Copyright (C) 2016 The Android Open Source Project
304 *
305 * Licensed under the Apache License, Version 2.0 (the "License");
306 * you may not use this file except in compliance with the License.
307 * You may obtain a copy of the License at
308 *
309 * http://www.apache.org/licenses/LICENSE-2.0
310 *
311 * Unless required by applicable law or agreed to in writing, software
312 * distributed under the License is distributed on an "AS IS" BASIS,
313 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
314 * See the License for the specific language governing permissions and
315 * limitations under the License.
316 */
317/*
318 * Interpreter entry point.
319 */
320
321 .text
322 .align 2
323 .global ExecuteMterpImpl
324 .type ExecuteMterpImpl, %function
325
326/*
327 * On entry:
328 * r0 Thread* self/
329 * r1 code_item
330 * r2 ShadowFrame
331 * r3 JValue* result_register
332 *
333 */
334
335ExecuteMterpImpl:
336 .fnstart
337 .save {r4-r10,fp,lr}
338 stmfd sp!, {r4-r10,fp,lr} @ save 9 regs
339 .pad #4
340 sub sp, sp, #4 @ align 64
341
342 /* Remember the return register */
343 str r3, [r2, #SHADOWFRAME_RESULT_REGISTER_OFFSET]
344
345 /* Remember the code_item */
346 str r1, [r2, #SHADOWFRAME_CODE_ITEM_OFFSET]
347
348 /* set up "named" registers */
349 mov rSELF, r0
350 ldr r0, [r2, #SHADOWFRAME_NUMBER_OF_VREGS_OFFSET]
351 add rFP, r2, #SHADOWFRAME_VREGS_OFFSET @ point to insns[] (i.e. - the dalivk byte code).
352 add rREFS, rFP, r0, lsl #2 @ point to reference array in shadow frame
353 ldr r0, [r2, #SHADOWFRAME_DEX_PC_OFFSET] @ Get starting dex_pc.
354 add rPC, r1, #CODEITEM_INSNS_OFFSET @ Point to base of insns[]
355 add rPC, rPC, r0, lsl #1 @ Create direct pointer to 1st dex opcode
356 EXPORT_PC
357
358 /* Starting ibase */
359 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]
360
361 /* start executing the instruction at rPC */
362 FETCH_INST @ load rINST from rPC
363 GET_INST_OPCODE ip @ extract opcode from rINST
364 GOTO_OPCODE ip @ jump to next instruction
365 /* NOTE: no fallthrough */
366
367
368 .global artMterpAsmInstructionStart
369 .type artMterpAsmInstructionStart, %function
370artMterpAsmInstructionStart = .L_op_nop
371 .text
372
373/* ------------------------------ */
374 .balign 128
375.L_op_nop: /* 0x00 */
376/* File: arm/op_nop.S */
377 FETCH_ADVANCE_INST 1 @ advance to next instr, load rINST
378 GET_INST_OPCODE ip @ ip<- opcode from rINST
379 GOTO_OPCODE ip @ execute it
380
381/* ------------------------------ */
382 .balign 128
383.L_op_move: /* 0x01 */
384/* File: arm/op_move.S */
385 /* for move, move-object, long-to-int */
386 /* op vA, vB */
387 mov r1, rINST, lsr #12 @ r1<- B from 15:12
388 ubfx r0, rINST, #8, #4 @ r0<- A from 11:8
389 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
390 GET_VREG r2, r1 @ r2<- fp[B]
391 GET_INST_OPCODE ip @ ip<- opcode from rINST
392 .if 0
393 SET_VREG_OBJECT r2, r0 @ fp[A]<- r2
394 .else
395 SET_VREG r2, r0 @ fp[A]<- r2
396 .endif
397 GOTO_OPCODE ip @ execute next instruction
398
399/* ------------------------------ */
400 .balign 128
401.L_op_move_from16: /* 0x02 */
402/* File: arm/op_move_from16.S */
403 /* for: move/from16, move-object/from16 */
404 /* op vAA, vBBBB */
405 FETCH r1, 1 @ r1<- BBBB
406 mov r0, rINST, lsr #8 @ r0<- AA
407 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
408 GET_VREG r2, r1 @ r2<- fp[BBBB]
409 GET_INST_OPCODE ip @ extract opcode from rINST
410 .if 0
411 SET_VREG_OBJECT r2, r0 @ fp[AA]<- r2
412 .else
413 SET_VREG r2, r0 @ fp[AA]<- r2
414 .endif
415 GOTO_OPCODE ip @ jump to next instruction
416
417/* ------------------------------ */
418 .balign 128
419.L_op_move_16: /* 0x03 */
420/* File: arm/op_move_16.S */
421 /* for: move/16, move-object/16 */
422 /* op vAAAA, vBBBB */
423 FETCH r1, 2 @ r1<- BBBB
424 FETCH r0, 1 @ r0<- AAAA
425 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
426 GET_VREG r2, r1 @ r2<- fp[BBBB]
427 GET_INST_OPCODE ip @ extract opcode from rINST
428 .if 0
429 SET_VREG_OBJECT r2, r0 @ fp[AAAA]<- r2
430 .else
431 SET_VREG r2, r0 @ fp[AAAA]<- r2
432 .endif
433 GOTO_OPCODE ip @ jump to next instruction
434
435/* ------------------------------ */
436 .balign 128
437.L_op_move_wide: /* 0x04 */
438/* File: arm/op_move_wide.S */
439 /* move-wide vA, vB */
440 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
441 mov r3, rINST, lsr #12 @ r3<- B
buzbee50cf6002016-02-10 08:59:12 -0800442 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -0800443 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -0800444 add r2, rFP, rINST, lsl #2 @ r2<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -0800445 ldmia r3, {r0-r1} @ r0/r1<- fp[B]
buzbee50cf6002016-02-10 08:59:12 -0800446 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -0800447 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
448 GET_INST_OPCODE ip @ extract opcode from rINST
449 stmia r2, {r0-r1} @ fp[A]<- r0/r1
450 GOTO_OPCODE ip @ jump to next instruction
451
452/* ------------------------------ */
453 .balign 128
454.L_op_move_wide_from16: /* 0x05 */
455/* File: arm/op_move_wide_from16.S */
456 /* move-wide/from16 vAA, vBBBB */
457 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
458 FETCH r3, 1 @ r3<- BBBB
buzbee50cf6002016-02-10 08:59:12 -0800459 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -0800460 add r3, rFP, r3, lsl #2 @ r3<- &fp[BBBB]
buzbee50cf6002016-02-10 08:59:12 -0800461 add r2, rFP, rINST, lsl #2 @ r2<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -0800462 ldmia r3, {r0-r1} @ r0/r1<- fp[BBBB]
buzbee50cf6002016-02-10 08:59:12 -0800463 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -0800464 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
465 GET_INST_OPCODE ip @ extract opcode from rINST
466 stmia r2, {r0-r1} @ fp[AA]<- r0/r1
467 GOTO_OPCODE ip @ jump to next instruction
468
469/* ------------------------------ */
470 .balign 128
471.L_op_move_wide_16: /* 0x06 */
472/* File: arm/op_move_wide_16.S */
473 /* move-wide/16 vAAAA, vBBBB */
474 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
475 FETCH r3, 2 @ r3<- BBBB
476 FETCH r2, 1 @ r2<- AAAA
477 add r3, rFP, r3, lsl #2 @ r3<- &fp[BBBB]
buzbee50cf6002016-02-10 08:59:12 -0800478 add lr, rFP, r2, lsl #2 @ r2<- &fp[AAAA]
buzbee1452bee2015-03-06 14:43:04 -0800479 ldmia r3, {r0-r1} @ r0/r1<- fp[BBBB]
480 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
buzbee50cf6002016-02-10 08:59:12 -0800481 CLEAR_SHADOW_PAIR r2, r3, ip @ Zero out the shadow regs
482 stmia lr, {r0-r1} @ fp[AAAA]<- r0/r1
buzbee1452bee2015-03-06 14:43:04 -0800483 GET_INST_OPCODE ip @ extract opcode from rINST
484 GOTO_OPCODE ip @ jump to next instruction
485
486/* ------------------------------ */
487 .balign 128
488.L_op_move_object: /* 0x07 */
489/* File: arm/op_move_object.S */
490/* File: arm/op_move.S */
491 /* for move, move-object, long-to-int */
492 /* op vA, vB */
493 mov r1, rINST, lsr #12 @ r1<- B from 15:12
494 ubfx r0, rINST, #8, #4 @ r0<- A from 11:8
495 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
496 GET_VREG r2, r1 @ r2<- fp[B]
497 GET_INST_OPCODE ip @ ip<- opcode from rINST
498 .if 1
499 SET_VREG_OBJECT r2, r0 @ fp[A]<- r2
500 .else
501 SET_VREG r2, r0 @ fp[A]<- r2
502 .endif
503 GOTO_OPCODE ip @ execute next instruction
504
505
506/* ------------------------------ */
507 .balign 128
508.L_op_move_object_from16: /* 0x08 */
509/* File: arm/op_move_object_from16.S */
510/* File: arm/op_move_from16.S */
511 /* for: move/from16, move-object/from16 */
512 /* op vAA, vBBBB */
513 FETCH r1, 1 @ r1<- BBBB
514 mov r0, rINST, lsr #8 @ r0<- AA
515 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
516 GET_VREG r2, r1 @ r2<- fp[BBBB]
517 GET_INST_OPCODE ip @ extract opcode from rINST
518 .if 1
519 SET_VREG_OBJECT r2, r0 @ fp[AA]<- r2
520 .else
521 SET_VREG r2, r0 @ fp[AA]<- r2
522 .endif
523 GOTO_OPCODE ip @ jump to next instruction
524
525
526/* ------------------------------ */
527 .balign 128
528.L_op_move_object_16: /* 0x09 */
529/* File: arm/op_move_object_16.S */
530/* File: arm/op_move_16.S */
531 /* for: move/16, move-object/16 */
532 /* op vAAAA, vBBBB */
533 FETCH r1, 2 @ r1<- BBBB
534 FETCH r0, 1 @ r0<- AAAA
535 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
536 GET_VREG r2, r1 @ r2<- fp[BBBB]
537 GET_INST_OPCODE ip @ extract opcode from rINST
538 .if 1
539 SET_VREG_OBJECT r2, r0 @ fp[AAAA]<- r2
540 .else
541 SET_VREG r2, r0 @ fp[AAAA]<- r2
542 .endif
543 GOTO_OPCODE ip @ jump to next instruction
544
545
546/* ------------------------------ */
547 .balign 128
548.L_op_move_result: /* 0x0a */
549/* File: arm/op_move_result.S */
550 /* for: move-result, move-result-object */
551 /* op vAA */
552 mov r2, rINST, lsr #8 @ r2<- AA
553 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
554 ldr r0, [rFP, #OFF_FP_RESULT_REGISTER] @ get pointer to result JType.
555 ldr r0, [r0] @ r0 <- result.i.
556 GET_INST_OPCODE ip @ extract opcode from rINST
557 .if 0
558 SET_VREG_OBJECT r0, r2, r1 @ fp[AA]<- r0
559 .else
560 SET_VREG r0, r2 @ fp[AA]<- r0
561 .endif
562 GOTO_OPCODE ip @ jump to next instruction
563
564/* ------------------------------ */
565 .balign 128
566.L_op_move_result_wide: /* 0x0b */
567/* File: arm/op_move_result_wide.S */
568 /* move-result-wide vAA */
buzbee50cf6002016-02-10 08:59:12 -0800569 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -0800570 ldr r3, [rFP, #OFF_FP_RESULT_REGISTER]
buzbee50cf6002016-02-10 08:59:12 -0800571 add r2, rFP, rINST, lsl #2 @ r2<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -0800572 ldmia r3, {r0-r1} @ r0/r1<- retval.j
buzbee50cf6002016-02-10 08:59:12 -0800573 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -0800574 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
575 stmia r2, {r0-r1} @ fp[AA]<- r0/r1
576 GET_INST_OPCODE ip @ extract opcode from rINST
577 GOTO_OPCODE ip @ jump to next instruction
578
579/* ------------------------------ */
580 .balign 128
581.L_op_move_result_object: /* 0x0c */
582/* File: arm/op_move_result_object.S */
583/* File: arm/op_move_result.S */
584 /* for: move-result, move-result-object */
585 /* op vAA */
586 mov r2, rINST, lsr #8 @ r2<- AA
587 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
588 ldr r0, [rFP, #OFF_FP_RESULT_REGISTER] @ get pointer to result JType.
589 ldr r0, [r0] @ r0 <- result.i.
590 GET_INST_OPCODE ip @ extract opcode from rINST
591 .if 1
592 SET_VREG_OBJECT r0, r2, r1 @ fp[AA]<- r0
593 .else
594 SET_VREG r0, r2 @ fp[AA]<- r0
595 .endif
596 GOTO_OPCODE ip @ jump to next instruction
597
598
599/* ------------------------------ */
600 .balign 128
601.L_op_move_exception: /* 0x0d */
602/* File: arm/op_move_exception.S */
603 /* move-exception vAA */
604 mov r2, rINST, lsr #8 @ r2<- AA
605 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
606 mov r1, #0 @ r1<- 0
607 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
608 SET_VREG_OBJECT r3, r2 @ fp[AA]<- exception obj
609 GET_INST_OPCODE ip @ extract opcode from rINST
610 str r1, [rSELF, #THREAD_EXCEPTION_OFFSET] @ clear exception
611 GOTO_OPCODE ip @ jump to next instruction
612
613/* ------------------------------ */
614 .balign 128
615.L_op_return_void: /* 0x0e */
616/* File: arm/op_return_void.S */
617 .extern MterpThreadFenceForConstructor
618 bl MterpThreadFenceForConstructor
buzbeea2c97a92016-01-25 15:41:24 -0800619 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
620 mov r0, rSELF
621 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
622 blne MterpSuspendCheck @ (self)
buzbee1452bee2015-03-06 14:43:04 -0800623 mov r0, #0
624 mov r1, #0
625 b MterpReturn
626
627/* ------------------------------ */
628 .balign 128
629.L_op_return: /* 0x0f */
630/* File: arm/op_return.S */
631 /*
632 * Return a 32-bit value.
633 *
634 * for: return, return-object
635 */
636 /* op vAA */
637 .extern MterpThreadFenceForConstructor
638 bl MterpThreadFenceForConstructor
buzbeea2c97a92016-01-25 15:41:24 -0800639 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
640 mov r0, rSELF
641 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
642 blne MterpSuspendCheck @ (self)
buzbee1452bee2015-03-06 14:43:04 -0800643 mov r2, rINST, lsr #8 @ r2<- AA
644 GET_VREG r0, r2 @ r0<- vAA
645 mov r1, #0
646 b MterpReturn
647
648/* ------------------------------ */
649 .balign 128
650.L_op_return_wide: /* 0x10 */
651/* File: arm/op_return_wide.S */
652 /*
653 * Return a 64-bit value.
654 */
655 /* return-wide vAA */
656 .extern MterpThreadFenceForConstructor
657 bl MterpThreadFenceForConstructor
buzbeea2c97a92016-01-25 15:41:24 -0800658 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
659 mov r0, rSELF
660 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
661 blne MterpSuspendCheck @ (self)
buzbee1452bee2015-03-06 14:43:04 -0800662 mov r2, rINST, lsr #8 @ r2<- AA
663 add r2, rFP, r2, lsl #2 @ r2<- &fp[AA]
664 ldmia r2, {r0-r1} @ r0/r1 <- vAA/vAA+1
665 b MterpReturn
666
667/* ------------------------------ */
668 .balign 128
669.L_op_return_object: /* 0x11 */
670/* File: arm/op_return_object.S */
671/* File: arm/op_return.S */
672 /*
673 * Return a 32-bit value.
674 *
675 * for: return, return-object
676 */
677 /* op vAA */
678 .extern MterpThreadFenceForConstructor
679 bl MterpThreadFenceForConstructor
buzbeea2c97a92016-01-25 15:41:24 -0800680 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
681 mov r0, rSELF
682 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
683 blne MterpSuspendCheck @ (self)
buzbee1452bee2015-03-06 14:43:04 -0800684 mov r2, rINST, lsr #8 @ r2<- AA
685 GET_VREG r0, r2 @ r0<- vAA
686 mov r1, #0
687 b MterpReturn
688
689
690/* ------------------------------ */
691 .balign 128
692.L_op_const_4: /* 0x12 */
693/* File: arm/op_const_4.S */
694 /* const/4 vA, #+B */
695 mov r1, rINST, lsl #16 @ r1<- Bxxx0000
696 ubfx r0, rINST, #8, #4 @ r0<- A
697 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
698 mov r1, r1, asr #28 @ r1<- sssssssB (sign-extended)
699 GET_INST_OPCODE ip @ ip<- opcode from rINST
700 SET_VREG r1, r0 @ fp[A]<- r1
701 GOTO_OPCODE ip @ execute next instruction
702
703/* ------------------------------ */
704 .balign 128
705.L_op_const_16: /* 0x13 */
706/* File: arm/op_const_16.S */
707 /* const/16 vAA, #+BBBB */
708 FETCH_S r0, 1 @ r0<- ssssBBBB (sign-extended
709 mov r3, rINST, lsr #8 @ r3<- AA
710 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
711 SET_VREG r0, r3 @ vAA<- r0
712 GET_INST_OPCODE ip @ extract opcode from rINST
713 GOTO_OPCODE ip @ jump to next instruction
714
715/* ------------------------------ */
716 .balign 128
717.L_op_const: /* 0x14 */
718/* File: arm/op_const.S */
719 /* const vAA, #+BBBBbbbb */
720 mov r3, rINST, lsr #8 @ r3<- AA
721 FETCH r0, 1 @ r0<- bbbb (low
722 FETCH r1, 2 @ r1<- BBBB (high
723 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
724 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb
725 GET_INST_OPCODE ip @ extract opcode from rINST
726 SET_VREG r0, r3 @ vAA<- r0
727 GOTO_OPCODE ip @ jump to next instruction
728
729/* ------------------------------ */
730 .balign 128
731.L_op_const_high16: /* 0x15 */
732/* File: arm/op_const_high16.S */
733 /* const/high16 vAA, #+BBBB0000 */
734 FETCH r0, 1 @ r0<- 0000BBBB (zero-extended
735 mov r3, rINST, lsr #8 @ r3<- AA
736 mov r0, r0, lsl #16 @ r0<- BBBB0000
737 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
738 SET_VREG r0, r3 @ vAA<- r0
739 GET_INST_OPCODE ip @ extract opcode from rINST
740 GOTO_OPCODE ip @ jump to next instruction
741
742/* ------------------------------ */
743 .balign 128
744.L_op_const_wide_16: /* 0x16 */
745/* File: arm/op_const_wide_16.S */
746 /* const-wide/16 vAA, #+BBBB */
747 FETCH_S r0, 1 @ r0<- ssssBBBB (sign-extended
748 mov r3, rINST, lsr #8 @ r3<- AA
749 mov r1, r0, asr #31 @ r1<- ssssssss
750 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee50cf6002016-02-10 08:59:12 -0800751 CLEAR_SHADOW_PAIR r3, r2, lr @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -0800752 add r3, rFP, r3, lsl #2 @ r3<- &fp[AA]
753 GET_INST_OPCODE ip @ extract opcode from rINST
754 stmia r3, {r0-r1} @ vAA<- r0/r1
755 GOTO_OPCODE ip @ jump to next instruction
756
757/* ------------------------------ */
758 .balign 128
759.L_op_const_wide_32: /* 0x17 */
760/* File: arm/op_const_wide_32.S */
761 /* const-wide/32 vAA, #+BBBBbbbb */
762 FETCH r0, 1 @ r0<- 0000bbbb (low)
763 mov r3, rINST, lsr #8 @ r3<- AA
764 FETCH_S r2, 2 @ r2<- ssssBBBB (high)
765 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
766 orr r0, r0, r2, lsl #16 @ r0<- BBBBbbbb
buzbee50cf6002016-02-10 08:59:12 -0800767 CLEAR_SHADOW_PAIR r3, r2, lr @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -0800768 add r3, rFP, r3, lsl #2 @ r3<- &fp[AA]
769 mov r1, r0, asr #31 @ r1<- ssssssss
770 GET_INST_OPCODE ip @ extract opcode from rINST
771 stmia r3, {r0-r1} @ vAA<- r0/r1
772 GOTO_OPCODE ip @ jump to next instruction
773
774/* ------------------------------ */
775 .balign 128
776.L_op_const_wide: /* 0x18 */
777/* File: arm/op_const_wide.S */
778 /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
779 FETCH r0, 1 @ r0<- bbbb (low)
780 FETCH r1, 2 @ r1<- BBBB (low middle)
781 FETCH r2, 3 @ r2<- hhhh (high middle)
782 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb (low word)
783 FETCH r3, 4 @ r3<- HHHH (high)
784 mov r9, rINST, lsr #8 @ r9<- AA
785 orr r1, r2, r3, lsl #16 @ r1<- HHHHhhhh (high word)
buzbee50cf6002016-02-10 08:59:12 -0800786 CLEAR_SHADOW_PAIR r9, r2, r3 @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -0800787 FETCH_ADVANCE_INST 5 @ advance rPC, load rINST
788 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
789 GET_INST_OPCODE ip @ extract opcode from rINST
790 stmia r9, {r0-r1} @ vAA<- r0/r1
791 GOTO_OPCODE ip @ jump to next instruction
792
793/* ------------------------------ */
794 .balign 128
795.L_op_const_wide_high16: /* 0x19 */
796/* File: arm/op_const_wide_high16.S */
797 /* const-wide/high16 vAA, #+BBBB000000000000 */
798 FETCH r1, 1 @ r1<- 0000BBBB (zero-extended)
799 mov r3, rINST, lsr #8 @ r3<- AA
800 mov r0, #0 @ r0<- 00000000
801 mov r1, r1, lsl #16 @ r1<- BBBB0000
802 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee50cf6002016-02-10 08:59:12 -0800803 CLEAR_SHADOW_PAIR r3, r0, r2 @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -0800804 add r3, rFP, r3, lsl #2 @ r3<- &fp[AA]
805 GET_INST_OPCODE ip @ extract opcode from rINST
806 stmia r3, {r0-r1} @ vAA<- r0/r1
807 GOTO_OPCODE ip @ jump to next instruction
808
809/* ------------------------------ */
810 .balign 128
811.L_op_const_string: /* 0x1a */
812/* File: arm/op_const_string.S */
813 /* const/string vAA, String@BBBB */
814 EXPORT_PC
815 FETCH r0, 1 @ r0<- BBBB
816 mov r1, rINST, lsr #8 @ r1<- AA
817 add r2, rFP, #OFF_FP_SHADOWFRAME
818 mov r3, rSELF
819 bl MterpConstString @ (index, tgt_reg, shadow_frame, self)
820 PREFETCH_INST 2 @ load rINST
821 cmp r0, #0 @ fail?
822 bne MterpPossibleException @ let reference interpreter deal with it.
823 ADVANCE 2 @ advance rPC
824 GET_INST_OPCODE ip @ extract opcode from rINST
825 GOTO_OPCODE ip @ jump to next instruction
826
827/* ------------------------------ */
828 .balign 128
829.L_op_const_string_jumbo: /* 0x1b */
830/* File: arm/op_const_string_jumbo.S */
831 /* const/string vAA, String@BBBBBBBB */
832 EXPORT_PC
833 FETCH r0, 1 @ r0<- bbbb (low
834 FETCH r2, 2 @ r2<- BBBB (high
835 mov r1, rINST, lsr #8 @ r1<- AA
836 orr r0, r0, r2, lsl #16 @ r1<- BBBBbbbb
837 add r2, rFP, #OFF_FP_SHADOWFRAME
838 mov r3, rSELF
839 bl MterpConstString @ (index, tgt_reg, shadow_frame, self)
840 PREFETCH_INST 3 @ advance rPC
841 cmp r0, #0 @ fail?
842 bne MterpPossibleException @ let reference interpreter deal with it.
843 ADVANCE 3 @ advance rPC
844 GET_INST_OPCODE ip @ extract opcode from rINST
845 GOTO_OPCODE ip @ jump to next instruction
846
847/* ------------------------------ */
848 .balign 128
849.L_op_const_class: /* 0x1c */
850/* File: arm/op_const_class.S */
851 /* const/class vAA, Class@BBBB */
852 EXPORT_PC
853 FETCH r0, 1 @ r0<- BBBB
854 mov r1, rINST, lsr #8 @ r1<- AA
855 add r2, rFP, #OFF_FP_SHADOWFRAME
856 mov r3, rSELF
857 bl MterpConstClass @ (index, tgt_reg, shadow_frame, self)
858 PREFETCH_INST 2
859 cmp r0, #0
860 bne MterpPossibleException
861 ADVANCE 2
862 GET_INST_OPCODE ip @ extract opcode from rINST
863 GOTO_OPCODE ip @ jump to next instruction
864
865/* ------------------------------ */
866 .balign 128
867.L_op_monitor_enter: /* 0x1d */
868/* File: arm/op_monitor_enter.S */
869 /*
870 * Synchronize on an object.
871 */
872 /* monitor-enter vAA */
873 EXPORT_PC
874 mov r2, rINST, lsr #8 @ r2<- AA
875 GET_VREG r0, r2 @ r0<- vAA (object)
876 mov r1, rSELF @ r1<- self
877 bl artLockObjectFromCode
878 cmp r0, #0
879 bne MterpException
880 FETCH_ADVANCE_INST 1
881 GET_INST_OPCODE ip @ extract opcode from rINST
882 GOTO_OPCODE ip @ jump to next instruction
883
884/* ------------------------------ */
885 .balign 128
886.L_op_monitor_exit: /* 0x1e */
887/* File: arm/op_monitor_exit.S */
888 /*
889 * Unlock an object.
890 *
891 * Exceptions that occur when unlocking a monitor need to appear as
892 * if they happened at the following instruction. See the Dalvik
893 * instruction spec.
894 */
895 /* monitor-exit vAA */
896 EXPORT_PC
897 mov r2, rINST, lsr #8 @ r2<- AA
898 GET_VREG r0, r2 @ r0<- vAA (object)
899 mov r1, rSELF @ r0<- self
900 bl artUnlockObjectFromCode @ r0<- success for unlock(self, obj)
901 cmp r0, #0 @ failed?
902 bne MterpException
903 FETCH_ADVANCE_INST 1 @ before throw: advance rPC, load rINST
904 GET_INST_OPCODE ip @ extract opcode from rINST
905 GOTO_OPCODE ip @ jump to next instruction
906
907/* ------------------------------ */
908 .balign 128
909.L_op_check_cast: /* 0x1f */
910/* File: arm/op_check_cast.S */
911 /*
912 * Check to see if a cast from one class to another is allowed.
913 */
914 /* check-cast vAA, class@BBBB */
915 EXPORT_PC
916 FETCH r0, 1 @ r0<- BBBB
917 mov r1, rINST, lsr #8 @ r1<- AA
buzbeea2c97a92016-01-25 15:41:24 -0800918 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &object
buzbee1452bee2015-03-06 14:43:04 -0800919 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- method
920 mov r3, rSELF @ r3<- self
buzbeea2c97a92016-01-25 15:41:24 -0800921 bl MterpCheckCast @ (index, &obj, method, self)
buzbee1452bee2015-03-06 14:43:04 -0800922 PREFETCH_INST 2
923 cmp r0, #0
924 bne MterpPossibleException
925 ADVANCE 2
926 GET_INST_OPCODE ip @ extract opcode from rINST
927 GOTO_OPCODE ip @ jump to next instruction
928
929/* ------------------------------ */
930 .balign 128
931.L_op_instance_of: /* 0x20 */
932/* File: arm/op_instance_of.S */
933 /*
934 * Check to see if an object reference is an instance of a class.
935 *
936 * Most common situation is a non-null object, being compared against
937 * an already-resolved class.
938 */
939 /* instance-of vA, vB, class@CCCC */
940 EXPORT_PC
941 FETCH r0, 1 @ r0<- CCCC
942 mov r1, rINST, lsr #12 @ r1<- B
buzbeea2c97a92016-01-25 15:41:24 -0800943 VREG_INDEX_TO_ADDR r1, r1 @ r1<- &object
buzbee1452bee2015-03-06 14:43:04 -0800944 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- method
945 mov r3, rSELF @ r3<- self
946 mov r9, rINST, lsr #8 @ r9<- A+
947 and r9, r9, #15 @ r9<- A
buzbeea2c97a92016-01-25 15:41:24 -0800948 bl MterpInstanceOf @ (index, &obj, method, self)
buzbee1452bee2015-03-06 14:43:04 -0800949 ldr r1, [rSELF, #THREAD_EXCEPTION_OFFSET]
950 PREFETCH_INST 2
951 cmp r1, #0 @ exception pending?
952 bne MterpException
953 ADVANCE 2 @ advance rPC
954 SET_VREG r0, r9 @ vA<- r0
955 GET_INST_OPCODE ip @ extract opcode from rINST
956 GOTO_OPCODE ip @ jump to next instruction
957
958/* ------------------------------ */
959 .balign 128
960.L_op_array_length: /* 0x21 */
961/* File: arm/op_array_length.S */
962 /*
963 * Return the length of an array.
964 */
965 mov r1, rINST, lsr #12 @ r1<- B
966 ubfx r2, rINST, #8, #4 @ r2<- A
967 GET_VREG r0, r1 @ r0<- vB (object ref)
968 cmp r0, #0 @ is object null?
969 beq common_errNullObject @ yup, fail
970 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
971 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- array length
972 GET_INST_OPCODE ip @ extract opcode from rINST
973 SET_VREG r3, r2 @ vB<- length
974 GOTO_OPCODE ip @ jump to next instruction
975
976/* ------------------------------ */
977 .balign 128
978.L_op_new_instance: /* 0x22 */
979/* File: arm/op_new_instance.S */
980 /*
981 * Create a new instance of a class.
982 */
983 /* new-instance vAA, class@BBBB */
984 EXPORT_PC
985 add r0, rFP, #OFF_FP_SHADOWFRAME
986 mov r1, rSELF
987 mov r2, rINST
988 bl MterpNewInstance @ (shadow_frame, self, inst_data)
989 cmp r0, #0
990 beq MterpPossibleException
991 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
992 GET_INST_OPCODE ip @ extract opcode from rINST
993 GOTO_OPCODE ip @ jump to next instruction
994
995/* ------------------------------ */
996 .balign 128
997.L_op_new_array: /* 0x23 */
998/* File: arm/op_new_array.S */
999 /*
1000 * Allocate an array of objects, specified with the array class
1001 * and a count.
1002 *
1003 * The verifier guarantees that this is an array class, so we don't
1004 * check for it here.
1005 */
1006 /* new-array vA, vB, class@CCCC */
1007 EXPORT_PC
1008 add r0, rFP, #OFF_FP_SHADOWFRAME
1009 mov r1, rPC
1010 mov r2, rINST
1011 mov r3, rSELF
1012 bl MterpNewArray
1013 cmp r0, #0
1014 beq MterpPossibleException
1015 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
1016 GET_INST_OPCODE ip @ extract opcode from rINST
1017 GOTO_OPCODE ip @ jump to next instruction
1018
1019/* ------------------------------ */
1020 .balign 128
1021.L_op_filled_new_array: /* 0x24 */
1022/* File: arm/op_filled_new_array.S */
1023 /*
1024 * Create a new array with elements filled from registers.
1025 *
1026 * for: filled-new-array, filled-new-array/range
1027 */
1028 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1029 /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1030 .extern MterpFilledNewArray
1031 EXPORT_PC
1032 add r0, rFP, #OFF_FP_SHADOWFRAME
1033 mov r1, rPC
1034 mov r2, rSELF
1035 bl MterpFilledNewArray
1036 cmp r0, #0
1037 beq MterpPossibleException
1038 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
1039 GET_INST_OPCODE ip @ extract opcode from rINST
1040 GOTO_OPCODE ip @ jump to next instruction
1041
1042/* ------------------------------ */
1043 .balign 128
1044.L_op_filled_new_array_range: /* 0x25 */
1045/* File: arm/op_filled_new_array_range.S */
1046/* File: arm/op_filled_new_array.S */
1047 /*
1048 * Create a new array with elements filled from registers.
1049 *
1050 * for: filled-new-array, filled-new-array/range
1051 */
1052 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1053 /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1054 .extern MterpFilledNewArrayRange
1055 EXPORT_PC
1056 add r0, rFP, #OFF_FP_SHADOWFRAME
1057 mov r1, rPC
1058 mov r2, rSELF
1059 bl MterpFilledNewArrayRange
1060 cmp r0, #0
1061 beq MterpPossibleException
1062 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
1063 GET_INST_OPCODE ip @ extract opcode from rINST
1064 GOTO_OPCODE ip @ jump to next instruction
1065
1066
1067/* ------------------------------ */
1068 .balign 128
1069.L_op_fill_array_data: /* 0x26 */
1070/* File: arm/op_fill_array_data.S */
1071 /* fill-array-data vAA, +BBBBBBBB */
1072 EXPORT_PC
1073 FETCH r0, 1 @ r0<- bbbb (lo)
1074 FETCH r1, 2 @ r1<- BBBB (hi)
1075 mov r3, rINST, lsr #8 @ r3<- AA
1076 orr r1, r0, r1, lsl #16 @ r1<- BBBBbbbb
1077 GET_VREG r0, r3 @ r0<- vAA (array object)
1078 add r1, rPC, r1, lsl #1 @ r1<- PC + BBBBbbbb*2 (array data off.)
1079 bl MterpFillArrayData @ (obj, payload)
1080 cmp r0, #0 @ 0 means an exception is thrown
1081 beq MterpPossibleException @ exception?
1082 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
1083 GET_INST_OPCODE ip @ extract opcode from rINST
1084 GOTO_OPCODE ip @ jump to next instruction
1085
1086/* ------------------------------ */
1087 .balign 128
1088.L_op_throw: /* 0x27 */
1089/* File: arm/op_throw.S */
1090 /*
1091 * Throw an exception object in the current thread.
1092 */
1093 /* throw vAA */
1094 EXPORT_PC
1095 mov r2, rINST, lsr #8 @ r2<- AA
1096 GET_VREG r1, r2 @ r1<- vAA (exception object)
1097 cmp r1, #0 @ null object?
1098 beq common_errNullObject @ yes, throw an NPE instead
1099 str r1, [rSELF, #THREAD_EXCEPTION_OFFSET] @ thread->exception<- obj
1100 b MterpException
1101
1102/* ------------------------------ */
1103 .balign 128
1104.L_op_goto: /* 0x28 */
1105/* File: arm/op_goto.S */
1106 /*
1107 * Unconditional branch, 8-bit offset.
1108 *
1109 * The branch distance is a signed code-unit offset, which we need to
1110 * double to get a byte offset.
1111 */
1112 /* goto +AA */
1113 /* tuning: use sbfx for 6t2+ targets */
1114#if MTERP_SUSPEND
1115 mov r0, rINST, lsl #16 @ r0<- AAxx0000
1116 movs r1, r0, asr #24 @ r1<- ssssssAA (sign-extended)
1117 add r2, r1, r1 @ r2<- byte offset, set flags
1118 @ If backwards branch refresh rIBASE
1119 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh handler base
1120 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1121 GET_INST_OPCODE ip @ extract opcode from rINST
1122 GOTO_OPCODE ip @ jump to next instruction
1123#else
buzbeea0a16102016-02-03 15:23:56 -08001124 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001125 mov r0, rINST, lsl #16 @ r0<- AAxx0000
1126 movs r1, r0, asr #24 @ r1<- ssssssAA (sign-extended)
1127 add r2, r1, r1 @ r2<- byte offset, set flags
buzbee1452bee2015-03-06 14:43:04 -08001128 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1129 @ If backwards branch refresh rIBASE
1130 bmi MterpCheckSuspendAndContinue
1131 GET_INST_OPCODE ip @ extract opcode from rINST
1132 GOTO_OPCODE ip @ jump to next instruction
1133#endif
1134
1135/* ------------------------------ */
1136 .balign 128
1137.L_op_goto_16: /* 0x29 */
1138/* File: arm/op_goto_16.S */
1139 /*
1140 * Unconditional branch, 16-bit offset.
1141 *
1142 * The branch distance is a signed code-unit offset, which we need to
1143 * double to get a byte offset.
1144 */
1145 /* goto/16 +AAAA */
1146#if MTERP_SUSPEND
1147 FETCH_S r0, 1 @ r0<- ssssAAAA (sign-extended)
1148 adds r1, r0, r0 @ r1<- byte offset, flags set
1149 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1150 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh handler base
1151 GET_INST_OPCODE ip @ extract opcode from rINST
1152 GOTO_OPCODE ip @ jump to next instruction
1153#else
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001154 FETCH_S r0, 1 @ r0<- ssssAAAA (sign-extended)
buzbee1452bee2015-03-06 14:43:04 -08001155 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001156 adds r1, r0, r0 @ r1<- byte offset, flags set
buzbee1452bee2015-03-06 14:43:04 -08001157 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1158 bmi MterpCheckSuspendAndContinue
1159 GET_INST_OPCODE ip @ extract opcode from rINST
1160 GOTO_OPCODE ip @ jump to next instruction
1161#endif
1162
1163/* ------------------------------ */
1164 .balign 128
1165.L_op_goto_32: /* 0x2a */
1166/* File: arm/op_goto_32.S */
1167 /*
1168 * Unconditional branch, 32-bit offset.
1169 *
1170 * The branch distance is a signed code-unit offset, which we need to
1171 * double to get a byte offset.
1172 *
1173 * Unlike most opcodes, this one is allowed to branch to itself, so
1174 * our "backward branch" test must be "<=0" instead of "<0". Because
1175 * we need the V bit set, we'll use an adds to convert from Dalvik
1176 * offset to byte offset.
1177 */
1178 /* goto/32 +AAAAAAAA */
1179#if MTERP_SUSPEND
1180 FETCH r0, 1 @ r0<- aaaa (lo)
1181 FETCH r1, 2 @ r1<- AAAA (hi)
1182 orr r0, r0, r1, lsl #16 @ r0<- AAAAaaaa
1183 adds r1, r0, r0 @ r1<- byte offset
1184 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1185 ldrle rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh handler base
1186 GET_INST_OPCODE ip @ extract opcode from rINST
1187 GOTO_OPCODE ip @ jump to next instruction
1188#else
1189 FETCH r0, 1 @ r0<- aaaa (lo)
1190 FETCH r1, 2 @ r1<- AAAA (hi)
1191 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001192 orr r0, r0, r1, lsl #16 @ r0<- AAAAaaaa
1193 adds r1, r0, r0 @ r1<- byte offset
buzbee1452bee2015-03-06 14:43:04 -08001194 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1195 ble MterpCheckSuspendAndContinue
1196 GET_INST_OPCODE ip @ extract opcode from rINST
1197 GOTO_OPCODE ip @ jump to next instruction
1198#endif
1199
1200/* ------------------------------ */
1201 .balign 128
1202.L_op_packed_switch: /* 0x2b */
1203/* File: arm/op_packed_switch.S */
1204 /*
1205 * Handle a packed-switch or sparse-switch instruction. In both cases
1206 * we decode it and hand it off to a helper function.
1207 *
1208 * We don't really expect backward branches in a switch statement, but
1209 * they're perfectly legal, so we check for them here.
1210 *
1211 * for: packed-switch, sparse-switch
1212 */
1213 /* op vAA, +BBBB */
1214#if MTERP_SUSPEND
1215 FETCH r0, 1 @ r0<- bbbb (lo)
1216 FETCH r1, 2 @ r1<- BBBB (hi)
1217 mov r3, rINST, lsr #8 @ r3<- AA
1218 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb
1219 GET_VREG r1, r3 @ r1<- vAA
1220 add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2
1221 bl MterpDoPackedSwitch @ r0<- code-unit branch offset
1222 adds r1, r0, r0 @ r1<- byte offset; clear V
1223 ldrle rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh handler base
1224 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1225 GET_INST_OPCODE ip @ extract opcode from rINST
1226 GOTO_OPCODE ip @ jump to next instruction
1227#else
1228 FETCH r0, 1 @ r0<- bbbb (lo)
1229 FETCH r1, 2 @ r1<- BBBB (hi)
1230 mov r3, rINST, lsr #8 @ r3<- AA
1231 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb
1232 GET_VREG r1, r3 @ r1<- vAA
1233 add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2
1234 bl MterpDoPackedSwitch @ r0<- code-unit branch offset
1235 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001236 adds r1, r0, r0 @ r1<- byte offset; clear V
buzbee1452bee2015-03-06 14:43:04 -08001237 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1238 ble MterpCheckSuspendAndContinue
1239 GET_INST_OPCODE ip @ extract opcode from rINST
1240 GOTO_OPCODE ip @ jump to next instruction
1241#endif
1242
1243/* ------------------------------ */
1244 .balign 128
1245.L_op_sparse_switch: /* 0x2c */
1246/* File: arm/op_sparse_switch.S */
1247/* File: arm/op_packed_switch.S */
1248 /*
1249 * Handle a packed-switch or sparse-switch instruction. In both cases
1250 * we decode it and hand it off to a helper function.
1251 *
1252 * We don't really expect backward branches in a switch statement, but
1253 * they're perfectly legal, so we check for them here.
1254 *
1255 * for: packed-switch, sparse-switch
1256 */
1257 /* op vAA, +BBBB */
1258#if MTERP_SUSPEND
1259 FETCH r0, 1 @ r0<- bbbb (lo)
1260 FETCH r1, 2 @ r1<- BBBB (hi)
1261 mov r3, rINST, lsr #8 @ r3<- AA
1262 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb
1263 GET_VREG r1, r3 @ r1<- vAA
1264 add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2
1265 bl MterpDoSparseSwitch @ r0<- code-unit branch offset
1266 adds r1, r0, r0 @ r1<- byte offset; clear V
1267 ldrle rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh handler base
1268 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1269 GET_INST_OPCODE ip @ extract opcode from rINST
1270 GOTO_OPCODE ip @ jump to next instruction
1271#else
1272 FETCH r0, 1 @ r0<- bbbb (lo)
1273 FETCH r1, 2 @ r1<- BBBB (hi)
1274 mov r3, rINST, lsr #8 @ r3<- AA
1275 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb
1276 GET_VREG r1, r3 @ r1<- vAA
1277 add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2
1278 bl MterpDoSparseSwitch @ r0<- code-unit branch offset
1279 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001280 adds r1, r0, r0 @ r1<- byte offset; clear V
buzbee1452bee2015-03-06 14:43:04 -08001281 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1282 ble MterpCheckSuspendAndContinue
1283 GET_INST_OPCODE ip @ extract opcode from rINST
1284 GOTO_OPCODE ip @ jump to next instruction
1285#endif
1286
1287
1288/* ------------------------------ */
1289 .balign 128
1290.L_op_cmpl_float: /* 0x2d */
1291/* File: arm/op_cmpl_float.S */
1292 /*
1293 * Compare two floating-point values. Puts 0, 1, or -1 into the
1294 * destination register based on the results of the comparison.
1295 *
1296 * int compare(x, y) {
1297 * if (x == y) {
1298 * return 0;
1299 * } else if (x > y) {
1300 * return 1;
1301 * } else if (x < y) {
1302 * return -1;
1303 * } else {
1304 * return -1;
1305 * }
1306 * }
1307 */
1308 /* op vAA, vBB, vCC */
1309 FETCH r0, 1 @ r0<- CCBB
1310 mov r9, rINST, lsr #8 @ r9<- AA
1311 and r2, r0, #255 @ r2<- BB
1312 mov r3, r0, lsr #8 @ r3<- CC
1313 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
1314 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
1315 flds s0, [r2] @ s0<- vBB
1316 flds s1, [r3] @ s1<- vCC
1317 fcmpes s0, s1 @ compare (vBB, vCC)
1318 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
1319 mvn r0, #0 @ r0<- -1 (default)
1320 GET_INST_OPCODE ip @ extract opcode from rINST
1321 fmstat @ export status flags
1322 movgt r0, #1 @ (greater than) r1<- 1
1323 moveq r0, #0 @ (equal) r1<- 0
1324 SET_VREG r0, r9 @ vAA<- r0
1325 GOTO_OPCODE ip @ jump to next instruction
1326
1327/* ------------------------------ */
1328 .balign 128
1329.L_op_cmpg_float: /* 0x2e */
1330/* File: arm/op_cmpg_float.S */
1331 /*
1332 * Compare two floating-point values. Puts 0, 1, or -1 into the
1333 * destination register based on the results of the comparison.
1334 *
1335 * int compare(x, y) {
1336 * if (x == y) {
1337 * return 0;
1338 * } else if (x < y) {
1339 * return -1;
1340 * } else if (x > y) {
1341 * return 1;
1342 * } else {
1343 * return 1;
1344 * }
1345 * }
1346 */
1347 /* op vAA, vBB, vCC */
1348 FETCH r0, 1 @ r0<- CCBB
1349 mov r9, rINST, lsr #8 @ r9<- AA
1350 and r2, r0, #255 @ r2<- BB
1351 mov r3, r0, lsr #8 @ r3<- CC
1352 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
1353 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
1354 flds s0, [r2] @ s0<- vBB
1355 flds s1, [r3] @ s1<- vCC
1356 fcmpes s0, s1 @ compare (vBB, vCC)
1357 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
1358 mov r0, #1 @ r0<- 1 (default)
1359 GET_INST_OPCODE ip @ extract opcode from rINST
1360 fmstat @ export status flags
1361 mvnmi r0, #0 @ (less than) r1<- -1
1362 moveq r0, #0 @ (equal) r1<- 0
1363 SET_VREG r0, r9 @ vAA<- r0
1364 GOTO_OPCODE ip @ jump to next instruction
1365
1366/* ------------------------------ */
1367 .balign 128
1368.L_op_cmpl_double: /* 0x2f */
1369/* File: arm/op_cmpl_double.S */
1370 /*
1371 * Compare two floating-point values. Puts 0, 1, or -1 into the
1372 * destination register based on the results of the comparison.
1373 *
1374 * int compare(x, y) {
1375 * if (x == y) {
1376 * return 0;
1377 * } else if (x > y) {
1378 * return 1;
1379 * } else if (x < y) {
1380 * return -1;
1381 * } else {
1382 * return -1;
1383 * }
1384 * }
1385 */
1386 /* op vAA, vBB, vCC */
1387 FETCH r0, 1 @ r0<- CCBB
1388 mov r9, rINST, lsr #8 @ r9<- AA
1389 and r2, r0, #255 @ r2<- BB
1390 mov r3, r0, lsr #8 @ r3<- CC
1391 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
1392 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
1393 fldd d0, [r2] @ d0<- vBB
1394 fldd d1, [r3] @ d1<- vCC
1395 fcmped d0, d1 @ compare (vBB, vCC)
1396 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
1397 mvn r0, #0 @ r0<- -1 (default)
1398 GET_INST_OPCODE ip @ extract opcode from rINST
1399 fmstat @ export status flags
1400 movgt r0, #1 @ (greater than) r1<- 1
1401 moveq r0, #0 @ (equal) r1<- 0
1402 SET_VREG r0, r9 @ vAA<- r0
1403 GOTO_OPCODE ip @ jump to next instruction
1404
1405/* ------------------------------ */
1406 .balign 128
1407.L_op_cmpg_double: /* 0x30 */
1408/* File: arm/op_cmpg_double.S */
1409 /*
1410 * Compare two floating-point values. Puts 0, 1, or -1 into the
1411 * destination register based on the results of the comparison.
1412 *
1413 * int compare(x, y) {
1414 * if (x == y) {
1415 * return 0;
1416 * } else if (x < y) {
1417 * return -1;
1418 * } else if (x > y) {
1419 * return 1;
1420 * } else {
1421 * return 1;
1422 * }
1423 * }
1424 */
1425 /* op vAA, vBB, vCC */
1426 FETCH r0, 1 @ r0<- CCBB
1427 mov r9, rINST, lsr #8 @ r9<- AA
1428 and r2, r0, #255 @ r2<- BB
1429 mov r3, r0, lsr #8 @ r3<- CC
1430 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
1431 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
1432 fldd d0, [r2] @ d0<- vBB
1433 fldd d1, [r3] @ d1<- vCC
1434 fcmped d0, d1 @ compare (vBB, vCC)
1435 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
1436 mov r0, #1 @ r0<- 1 (default)
1437 GET_INST_OPCODE ip @ extract opcode from rINST
1438 fmstat @ export status flags
1439 mvnmi r0, #0 @ (less than) r1<- -1
1440 moveq r0, #0 @ (equal) r1<- 0
1441 SET_VREG r0, r9 @ vAA<- r0
1442 GOTO_OPCODE ip @ jump to next instruction
1443
1444/* ------------------------------ */
1445 .balign 128
1446.L_op_cmp_long: /* 0x31 */
1447/* File: arm/op_cmp_long.S */
1448 /*
1449 * Compare two 64-bit values. Puts 0, 1, or -1 into the destination
1450 * register based on the results of the comparison.
1451 *
1452 * We load the full values with LDM, but in practice many values could
1453 * be resolved by only looking at the high word. This could be made
1454 * faster or slower by splitting the LDM into a pair of LDRs.
1455 *
1456 * If we just wanted to set condition flags, we could do this:
1457 * subs ip, r0, r2
1458 * sbcs ip, r1, r3
1459 * subeqs ip, r0, r2
1460 * Leaving { <0, 0, >0 } in ip. However, we have to set it to a specific
1461 * integer value, which we can do with 2 conditional mov/mvn instructions
1462 * (set 1, set -1; if they're equal we already have 0 in ip), giving
1463 * us a constant 5-cycle path plus a branch at the end to the
1464 * instruction epilogue code. The multi-compare approach below needs
1465 * 2 or 3 cycles + branch if the high word doesn't match, 6 + branch
1466 * in the worst case (the 64-bit values are equal).
1467 */
1468 /* cmp-long vAA, vBB, vCC */
1469 FETCH r0, 1 @ r0<- CCBB
1470 mov r9, rINST, lsr #8 @ r9<- AA
1471 and r2, r0, #255 @ r2<- BB
1472 mov r3, r0, lsr #8 @ r3<- CC
1473 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
1474 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
1475 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
1476 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
1477 cmp r1, r3 @ compare (vBB+1, vCC+1)
1478 blt .Lop_cmp_long_less @ signed compare on high part
1479 bgt .Lop_cmp_long_greater
1480 subs r1, r0, r2 @ r1<- r0 - r2
1481 bhi .Lop_cmp_long_greater @ unsigned compare on low part
1482 bne .Lop_cmp_long_less
1483 b .Lop_cmp_long_finish @ equal; r1 already holds 0
1484
1485/* ------------------------------ */
1486 .balign 128
1487.L_op_if_eq: /* 0x32 */
1488/* File: arm/op_if_eq.S */
1489/* File: arm/bincmp.S */
1490 /*
1491 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1492 * fragment that specifies the *reverse* comparison to perform, e.g.
1493 * for "if-le" you would use "gt".
1494 *
1495 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1496 */
1497 /* if-cmp vA, vB, +CCCC */
1498#if MTERP_SUSPEND
1499 mov r1, rINST, lsr #12 @ r1<- B
1500 ubfx r0, rINST, #8, #4 @ r0<- A
1501 GET_VREG r3, r1 @ r3<- vB
1502 GET_VREG r2, r0 @ r2<- vA
1503 FETCH_S r1, 1 @ r1<- branch offset, in code units
1504 cmp r2, r3 @ compare (vA, vB)
1505 movne r1, #2 @ r1<- BYTE branch dist for not-taken
1506 adds r2, r1, r1 @ convert to bytes, check sign
1507 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1508 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh rIBASE
1509 GET_INST_OPCODE ip @ extract opcode from rINST
1510 GOTO_OPCODE ip @ jump to next instruction
1511#else
1512 mov r1, rINST, lsr #12 @ r1<- B
1513 ubfx r0, rINST, #8, #4 @ r0<- A
1514 GET_VREG r3, r1 @ r3<- vB
1515 GET_VREG r2, r0 @ r2<- vA
1516 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001517 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001518 cmp r2, r3 @ compare (vA, vB)
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001519 movne r1, #2 @ r1<- BYTE branch dist for not-taken
1520 adds r2, r1, r1 @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001521 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1522 bmi MterpCheckSuspendAndContinue
1523 GET_INST_OPCODE ip @ extract opcode from rINST
1524 GOTO_OPCODE ip @ jump to next instruction
1525#endif
1526
1527
1528/* ------------------------------ */
1529 .balign 128
1530.L_op_if_ne: /* 0x33 */
1531/* File: arm/op_if_ne.S */
1532/* File: arm/bincmp.S */
1533 /*
1534 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1535 * fragment that specifies the *reverse* comparison to perform, e.g.
1536 * for "if-le" you would use "gt".
1537 *
1538 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1539 */
1540 /* if-cmp vA, vB, +CCCC */
1541#if MTERP_SUSPEND
1542 mov r1, rINST, lsr #12 @ r1<- B
1543 ubfx r0, rINST, #8, #4 @ r0<- A
1544 GET_VREG r3, r1 @ r3<- vB
1545 GET_VREG r2, r0 @ r2<- vA
1546 FETCH_S r1, 1 @ r1<- branch offset, in code units
1547 cmp r2, r3 @ compare (vA, vB)
1548 moveq r1, #2 @ r1<- BYTE branch dist for not-taken
1549 adds r2, r1, r1 @ convert to bytes, check sign
1550 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1551 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh rIBASE
1552 GET_INST_OPCODE ip @ extract opcode from rINST
1553 GOTO_OPCODE ip @ jump to next instruction
1554#else
1555 mov r1, rINST, lsr #12 @ r1<- B
1556 ubfx r0, rINST, #8, #4 @ r0<- A
1557 GET_VREG r3, r1 @ r3<- vB
1558 GET_VREG r2, r0 @ r2<- vA
1559 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001560 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001561 cmp r2, r3 @ compare (vA, vB)
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001562 moveq r1, #2 @ r1<- BYTE branch dist for not-taken
1563 adds r2, r1, r1 @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001564 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1565 bmi MterpCheckSuspendAndContinue
1566 GET_INST_OPCODE ip @ extract opcode from rINST
1567 GOTO_OPCODE ip @ jump to next instruction
1568#endif
1569
1570
1571/* ------------------------------ */
1572 .balign 128
1573.L_op_if_lt: /* 0x34 */
1574/* File: arm/op_if_lt.S */
1575/* File: arm/bincmp.S */
1576 /*
1577 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1578 * fragment that specifies the *reverse* comparison to perform, e.g.
1579 * for "if-le" you would use "gt".
1580 *
1581 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1582 */
1583 /* if-cmp vA, vB, +CCCC */
1584#if MTERP_SUSPEND
1585 mov r1, rINST, lsr #12 @ r1<- B
1586 ubfx r0, rINST, #8, #4 @ r0<- A
1587 GET_VREG r3, r1 @ r3<- vB
1588 GET_VREG r2, r0 @ r2<- vA
1589 FETCH_S r1, 1 @ r1<- branch offset, in code units
1590 cmp r2, r3 @ compare (vA, vB)
1591 movge r1, #2 @ r1<- BYTE branch dist for not-taken
1592 adds r2, r1, r1 @ convert to bytes, check sign
1593 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1594 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh rIBASE
1595 GET_INST_OPCODE ip @ extract opcode from rINST
1596 GOTO_OPCODE ip @ jump to next instruction
1597#else
1598 mov r1, rINST, lsr #12 @ r1<- B
1599 ubfx r0, rINST, #8, #4 @ r0<- A
1600 GET_VREG r3, r1 @ r3<- vB
1601 GET_VREG r2, r0 @ r2<- vA
1602 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001603 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001604 cmp r2, r3 @ compare (vA, vB)
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001605 movge r1, #2 @ r1<- BYTE branch dist for not-taken
1606 adds r2, r1, r1 @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001607 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1608 bmi MterpCheckSuspendAndContinue
1609 GET_INST_OPCODE ip @ extract opcode from rINST
1610 GOTO_OPCODE ip @ jump to next instruction
1611#endif
1612
1613
1614/* ------------------------------ */
1615 .balign 128
1616.L_op_if_ge: /* 0x35 */
1617/* File: arm/op_if_ge.S */
1618/* File: arm/bincmp.S */
1619 /*
1620 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1621 * fragment that specifies the *reverse* comparison to perform, e.g.
1622 * for "if-le" you would use "gt".
1623 *
1624 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1625 */
1626 /* if-cmp vA, vB, +CCCC */
1627#if MTERP_SUSPEND
1628 mov r1, rINST, lsr #12 @ r1<- B
1629 ubfx r0, rINST, #8, #4 @ r0<- A
1630 GET_VREG r3, r1 @ r3<- vB
1631 GET_VREG r2, r0 @ r2<- vA
1632 FETCH_S r1, 1 @ r1<- branch offset, in code units
1633 cmp r2, r3 @ compare (vA, vB)
1634 movlt r1, #2 @ r1<- BYTE branch dist for not-taken
1635 adds r2, r1, r1 @ convert to bytes, check sign
1636 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1637 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh rIBASE
1638 GET_INST_OPCODE ip @ extract opcode from rINST
1639 GOTO_OPCODE ip @ jump to next instruction
1640#else
1641 mov r1, rINST, lsr #12 @ r1<- B
1642 ubfx r0, rINST, #8, #4 @ r0<- A
1643 GET_VREG r3, r1 @ r3<- vB
1644 GET_VREG r2, r0 @ r2<- vA
1645 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001646 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001647 cmp r2, r3 @ compare (vA, vB)
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001648 movlt r1, #2 @ r1<- BYTE branch dist for not-taken
1649 adds r2, r1, r1 @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001650 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1651 bmi MterpCheckSuspendAndContinue
1652 GET_INST_OPCODE ip @ extract opcode from rINST
1653 GOTO_OPCODE ip @ jump to next instruction
1654#endif
1655
1656
1657/* ------------------------------ */
1658 .balign 128
1659.L_op_if_gt: /* 0x36 */
1660/* File: arm/op_if_gt.S */
1661/* File: arm/bincmp.S */
1662 /*
1663 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1664 * fragment that specifies the *reverse* comparison to perform, e.g.
1665 * for "if-le" you would use "gt".
1666 *
1667 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1668 */
1669 /* if-cmp vA, vB, +CCCC */
1670#if MTERP_SUSPEND
1671 mov r1, rINST, lsr #12 @ r1<- B
1672 ubfx r0, rINST, #8, #4 @ r0<- A
1673 GET_VREG r3, r1 @ r3<- vB
1674 GET_VREG r2, r0 @ r2<- vA
1675 FETCH_S r1, 1 @ r1<- branch offset, in code units
1676 cmp r2, r3 @ compare (vA, vB)
1677 movle r1, #2 @ r1<- BYTE branch dist for not-taken
1678 adds r2, r1, r1 @ convert to bytes, check sign
1679 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1680 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh rIBASE
1681 GET_INST_OPCODE ip @ extract opcode from rINST
1682 GOTO_OPCODE ip @ jump to next instruction
1683#else
1684 mov r1, rINST, lsr #12 @ r1<- B
1685 ubfx r0, rINST, #8, #4 @ r0<- A
1686 GET_VREG r3, r1 @ r3<- vB
1687 GET_VREG r2, r0 @ r2<- vA
1688 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001689 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001690 cmp r2, r3 @ compare (vA, vB)
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001691 movle r1, #2 @ r1<- BYTE branch dist for not-taken
1692 adds r2, r1, r1 @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001693 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1694 bmi MterpCheckSuspendAndContinue
1695 GET_INST_OPCODE ip @ extract opcode from rINST
1696 GOTO_OPCODE ip @ jump to next instruction
1697#endif
1698
1699
1700/* ------------------------------ */
1701 .balign 128
1702.L_op_if_le: /* 0x37 */
1703/* File: arm/op_if_le.S */
1704/* File: arm/bincmp.S */
1705 /*
1706 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1707 * fragment that specifies the *reverse* comparison to perform, e.g.
1708 * for "if-le" you would use "gt".
1709 *
1710 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1711 */
1712 /* if-cmp vA, vB, +CCCC */
1713#if MTERP_SUSPEND
1714 mov r1, rINST, lsr #12 @ r1<- B
1715 ubfx r0, rINST, #8, #4 @ r0<- A
1716 GET_VREG r3, r1 @ r3<- vB
1717 GET_VREG r2, r0 @ r2<- vA
1718 FETCH_S r1, 1 @ r1<- branch offset, in code units
1719 cmp r2, r3 @ compare (vA, vB)
1720 movgt r1, #2 @ r1<- BYTE branch dist for not-taken
1721 adds r2, r1, r1 @ convert to bytes, check sign
1722 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1723 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh rIBASE
1724 GET_INST_OPCODE ip @ extract opcode from rINST
1725 GOTO_OPCODE ip @ jump to next instruction
1726#else
1727 mov r1, rINST, lsr #12 @ r1<- B
1728 ubfx r0, rINST, #8, #4 @ r0<- A
1729 GET_VREG r3, r1 @ r3<- vB
1730 GET_VREG r2, r0 @ r2<- vA
1731 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001732 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001733 cmp r2, r3 @ compare (vA, vB)
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001734 movgt r1, #2 @ r1<- BYTE branch dist for not-taken
1735 adds r2, r1, r1 @ convert to bytes, check sign
buzbee1452bee2015-03-06 14:43:04 -08001736 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1737 bmi MterpCheckSuspendAndContinue
1738 GET_INST_OPCODE ip @ extract opcode from rINST
1739 GOTO_OPCODE ip @ jump to next instruction
1740#endif
1741
1742
1743/* ------------------------------ */
1744 .balign 128
1745.L_op_if_eqz: /* 0x38 */
1746/* File: arm/op_if_eqz.S */
1747/* File: arm/zcmp.S */
1748 /*
1749 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1750 * fragment that specifies the *reverse* comparison to perform, e.g.
1751 * for "if-le" you would use "gt".
1752 *
1753 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1754 */
1755 /* if-cmp vAA, +BBBB */
1756#if MTERP_SUSPEND
1757 mov r0, rINST, lsr #8 @ r0<- AA
1758 GET_VREG r2, r0 @ r2<- vAA
1759 FETCH_S r1, 1 @ r1<- branch offset, in code units
1760 cmp r2, #0 @ compare (vA, 0)
1761 movne r1, #2 @ r1<- inst branch dist for not-taken
1762 adds r1, r1, r1 @ convert to bytes & set flags
1763 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1764 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh table base
1765 GET_INST_OPCODE ip @ extract opcode from rINST
1766 GOTO_OPCODE ip @ jump to next instruction
1767#else
1768 mov r0, rINST, lsr #8 @ r0<- AA
1769 GET_VREG r2, r0 @ r2<- vAA
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001770 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001771 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1772 cmp r2, #0 @ compare (vA, 0)
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001773 movne r1, #2 @ r1<- inst branch dist for not-taken
1774 adds r1, r1, r1 @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08001775 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1776 bmi MterpCheckSuspendAndContinue
1777 GET_INST_OPCODE ip @ extract opcode from rINST
1778 GOTO_OPCODE ip @ jump to next instruction
1779#endif
1780
1781
1782/* ------------------------------ */
1783 .balign 128
1784.L_op_if_nez: /* 0x39 */
1785/* File: arm/op_if_nez.S */
1786/* File: arm/zcmp.S */
1787 /*
1788 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1789 * fragment that specifies the *reverse* comparison to perform, e.g.
1790 * for "if-le" you would use "gt".
1791 *
1792 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1793 */
1794 /* if-cmp vAA, +BBBB */
1795#if MTERP_SUSPEND
1796 mov r0, rINST, lsr #8 @ r0<- AA
1797 GET_VREG r2, r0 @ r2<- vAA
1798 FETCH_S r1, 1 @ r1<- branch offset, in code units
1799 cmp r2, #0 @ compare (vA, 0)
1800 moveq r1, #2 @ r1<- inst branch dist for not-taken
1801 adds r1, r1, r1 @ convert to bytes & set flags
1802 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1803 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh table base
1804 GET_INST_OPCODE ip @ extract opcode from rINST
1805 GOTO_OPCODE ip @ jump to next instruction
1806#else
1807 mov r0, rINST, lsr #8 @ r0<- AA
1808 GET_VREG r2, r0 @ r2<- vAA
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001809 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001810 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1811 cmp r2, #0 @ compare (vA, 0)
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001812 moveq r1, #2 @ r1<- inst branch dist for not-taken
1813 adds r1, r1, r1 @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08001814 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1815 bmi MterpCheckSuspendAndContinue
1816 GET_INST_OPCODE ip @ extract opcode from rINST
1817 GOTO_OPCODE ip @ jump to next instruction
1818#endif
1819
1820
1821/* ------------------------------ */
1822 .balign 128
1823.L_op_if_ltz: /* 0x3a */
1824/* File: arm/op_if_ltz.S */
1825/* File: arm/zcmp.S */
1826 /*
1827 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1828 * fragment that specifies the *reverse* comparison to perform, e.g.
1829 * for "if-le" you would use "gt".
1830 *
1831 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1832 */
1833 /* if-cmp vAA, +BBBB */
1834#if MTERP_SUSPEND
1835 mov r0, rINST, lsr #8 @ r0<- AA
1836 GET_VREG r2, r0 @ r2<- vAA
1837 FETCH_S r1, 1 @ r1<- branch offset, in code units
1838 cmp r2, #0 @ compare (vA, 0)
1839 movge r1, #2 @ r1<- inst branch dist for not-taken
1840 adds r1, r1, r1 @ convert to bytes & set flags
1841 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1842 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh table base
1843 GET_INST_OPCODE ip @ extract opcode from rINST
1844 GOTO_OPCODE ip @ jump to next instruction
1845#else
1846 mov r0, rINST, lsr #8 @ r0<- AA
1847 GET_VREG r2, r0 @ r2<- vAA
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001848 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001849 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1850 cmp r2, #0 @ compare (vA, 0)
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001851 movge r1, #2 @ r1<- inst branch dist for not-taken
1852 adds r1, r1, r1 @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08001853 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1854 bmi MterpCheckSuspendAndContinue
1855 GET_INST_OPCODE ip @ extract opcode from rINST
1856 GOTO_OPCODE ip @ jump to next instruction
1857#endif
1858
1859
1860/* ------------------------------ */
1861 .balign 128
1862.L_op_if_gez: /* 0x3b */
1863/* File: arm/op_if_gez.S */
1864/* File: arm/zcmp.S */
1865 /*
1866 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1867 * fragment that specifies the *reverse* comparison to perform, e.g.
1868 * for "if-le" you would use "gt".
1869 *
1870 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1871 */
1872 /* if-cmp vAA, +BBBB */
1873#if MTERP_SUSPEND
1874 mov r0, rINST, lsr #8 @ r0<- AA
1875 GET_VREG r2, r0 @ r2<- vAA
1876 FETCH_S r1, 1 @ r1<- branch offset, in code units
1877 cmp r2, #0 @ compare (vA, 0)
1878 movlt r1, #2 @ r1<- inst branch dist for not-taken
1879 adds r1, r1, r1 @ convert to bytes & set flags
1880 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1881 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh table base
1882 GET_INST_OPCODE ip @ extract opcode from rINST
1883 GOTO_OPCODE ip @ jump to next instruction
1884#else
1885 mov r0, rINST, lsr #8 @ r0<- AA
1886 GET_VREG r2, r0 @ r2<- vAA
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001887 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001888 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1889 cmp r2, #0 @ compare (vA, 0)
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001890 movlt r1, #2 @ r1<- inst branch dist for not-taken
1891 adds r1, r1, r1 @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08001892 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1893 bmi MterpCheckSuspendAndContinue
1894 GET_INST_OPCODE ip @ extract opcode from rINST
1895 GOTO_OPCODE ip @ jump to next instruction
1896#endif
1897
1898
1899/* ------------------------------ */
1900 .balign 128
1901.L_op_if_gtz: /* 0x3c */
1902/* File: arm/op_if_gtz.S */
1903/* File: arm/zcmp.S */
1904 /*
1905 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1906 * fragment that specifies the *reverse* comparison to perform, e.g.
1907 * for "if-le" you would use "gt".
1908 *
1909 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1910 */
1911 /* if-cmp vAA, +BBBB */
1912#if MTERP_SUSPEND
1913 mov r0, rINST, lsr #8 @ r0<- AA
1914 GET_VREG r2, r0 @ r2<- vAA
1915 FETCH_S r1, 1 @ r1<- branch offset, in code units
1916 cmp r2, #0 @ compare (vA, 0)
1917 movle r1, #2 @ r1<- inst branch dist for not-taken
1918 adds r1, r1, r1 @ convert to bytes & set flags
1919 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1920 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh table base
1921 GET_INST_OPCODE ip @ extract opcode from rINST
1922 GOTO_OPCODE ip @ jump to next instruction
1923#else
1924 mov r0, rINST, lsr #8 @ r0<- AA
1925 GET_VREG r2, r0 @ r2<- vAA
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001926 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001927 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1928 cmp r2, #0 @ compare (vA, 0)
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001929 movle r1, #2 @ r1<- inst branch dist for not-taken
1930 adds r1, r1, r1 @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08001931 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1932 bmi MterpCheckSuspendAndContinue
1933 GET_INST_OPCODE ip @ extract opcode from rINST
1934 GOTO_OPCODE ip @ jump to next instruction
1935#endif
1936
1937
1938/* ------------------------------ */
1939 .balign 128
1940.L_op_if_lez: /* 0x3d */
1941/* File: arm/op_if_lez.S */
1942/* File: arm/zcmp.S */
1943 /*
1944 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1945 * fragment that specifies the *reverse* comparison to perform, e.g.
1946 * for "if-le" you would use "gt".
1947 *
1948 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1949 */
1950 /* if-cmp vAA, +BBBB */
1951#if MTERP_SUSPEND
1952 mov r0, rINST, lsr #8 @ r0<- AA
1953 GET_VREG r2, r0 @ r2<- vAA
1954 FETCH_S r1, 1 @ r1<- branch offset, in code units
1955 cmp r2, #0 @ compare (vA, 0)
1956 movgt r1, #2 @ r1<- inst branch dist for not-taken
1957 adds r1, r1, r1 @ convert to bytes & set flags
1958 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1959 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh table base
1960 GET_INST_OPCODE ip @ extract opcode from rINST
1961 GOTO_OPCODE ip @ jump to next instruction
1962#else
1963 mov r0, rINST, lsr #8 @ r0<- AA
1964 GET_VREG r2, r0 @ r2<- vAA
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001965 FETCH_S r1, 1 @ r1<- branch offset, in code units
buzbee1452bee2015-03-06 14:43:04 -08001966 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1967 cmp r2, #0 @ compare (vA, 0)
Nicolas Geoffray95717f02016-02-05 09:24:02 +00001968 movgt r1, #2 @ r1<- inst branch dist for not-taken
1969 adds r1, r1, r1 @ convert to bytes & set flags
buzbee1452bee2015-03-06 14:43:04 -08001970 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1971 bmi MterpCheckSuspendAndContinue
1972 GET_INST_OPCODE ip @ extract opcode from rINST
1973 GOTO_OPCODE ip @ jump to next instruction
1974#endif
1975
1976
1977/* ------------------------------ */
1978 .balign 128
1979.L_op_unused_3e: /* 0x3e */
1980/* File: arm/op_unused_3e.S */
1981/* File: arm/unused.S */
1982/*
1983 * Bail to reference interpreter to throw.
1984 */
1985 b MterpFallback
1986
1987
1988/* ------------------------------ */
1989 .balign 128
1990.L_op_unused_3f: /* 0x3f */
1991/* File: arm/op_unused_3f.S */
1992/* File: arm/unused.S */
1993/*
1994 * Bail to reference interpreter to throw.
1995 */
1996 b MterpFallback
1997
1998
1999/* ------------------------------ */
2000 .balign 128
2001.L_op_unused_40: /* 0x40 */
2002/* File: arm/op_unused_40.S */
2003/* File: arm/unused.S */
2004/*
2005 * Bail to reference interpreter to throw.
2006 */
2007 b MterpFallback
2008
2009
2010/* ------------------------------ */
2011 .balign 128
2012.L_op_unused_41: /* 0x41 */
2013/* File: arm/op_unused_41.S */
2014/* File: arm/unused.S */
2015/*
2016 * Bail to reference interpreter to throw.
2017 */
2018 b MterpFallback
2019
2020
2021/* ------------------------------ */
2022 .balign 128
2023.L_op_unused_42: /* 0x42 */
2024/* File: arm/op_unused_42.S */
2025/* File: arm/unused.S */
2026/*
2027 * Bail to reference interpreter to throw.
2028 */
2029 b MterpFallback
2030
2031
2032/* ------------------------------ */
2033 .balign 128
2034.L_op_unused_43: /* 0x43 */
2035/* File: arm/op_unused_43.S */
2036/* File: arm/unused.S */
2037/*
2038 * Bail to reference interpreter to throw.
2039 */
2040 b MterpFallback
2041
2042
2043/* ------------------------------ */
2044 .balign 128
2045.L_op_aget: /* 0x44 */
2046/* File: arm/op_aget.S */
2047 /*
2048 * Array get, 32 bits or less. vAA <- vBB[vCC].
2049 *
2050 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2051 * instructions. We use a pair of FETCH_Bs instead.
2052 *
buzbee76833da2016-01-13 13:06:22 -08002053 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002054 *
2055 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2056 * If this changes, specialize.
2057 */
2058 /* op vAA, vBB, vCC */
2059 FETCH_B r2, 1, 0 @ r2<- BB
2060 mov r9, rINST, lsr #8 @ r9<- AA
2061 FETCH_B r3, 1, 1 @ r3<- CC
2062 GET_VREG r0, r2 @ r0<- vBB (array object)
2063 GET_VREG r1, r3 @ r1<- vCC (requested index)
2064 cmp r0, #0 @ null array object?
2065 beq common_errNullObject @ yes, bail
2066 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2067 add r0, r0, r1, lsl #2 @ r0<- arrayObj + index*width
2068 cmp r1, r3 @ compare unsigned index, length
2069 bcs common_errArrayIndex @ index >= length, bail
2070 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2071 ldr r2, [r0, #MIRROR_INT_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2072 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002073 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002074 GOTO_OPCODE ip @ jump to next instruction
2075
2076/* ------------------------------ */
2077 .balign 128
2078.L_op_aget_wide: /* 0x45 */
2079/* File: arm/op_aget_wide.S */
2080 /*
2081 * Array get, 64 bits. vAA <- vBB[vCC].
2082 *
2083 * Arrays of long/double are 64-bit aligned, so it's okay to use LDRD.
2084 */
2085 /* aget-wide vAA, vBB, vCC */
2086 FETCH r0, 1 @ r0<- CCBB
2087 mov r9, rINST, lsr #8 @ r9<- AA
2088 and r2, r0, #255 @ r2<- BB
2089 mov r3, r0, lsr #8 @ r3<- CC
2090 GET_VREG r0, r2 @ r0<- vBB (array object)
2091 GET_VREG r1, r3 @ r1<- vCC (requested index)
buzbee50cf6002016-02-10 08:59:12 -08002092 CLEAR_SHADOW_PAIR r9, r2, r3 @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08002093 cmp r0, #0 @ null array object?
2094 beq common_errNullObject @ yes, bail
2095 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2096 add r0, r0, r1, lsl #3 @ r0<- arrayObj + index*width
2097 cmp r1, r3 @ compare unsigned index, length
2098 bcs common_errArrayIndex @ index >= length, bail
2099 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2100 ldrd r2, [r0, #MIRROR_WIDE_ARRAY_DATA_OFFSET] @ r2/r3<- vBB[vCC]
2101 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
2102 GET_INST_OPCODE ip @ extract opcode from rINST
2103 stmia r9, {r2-r3} @ vAA/vAA+1<- r2/r3
2104 GOTO_OPCODE ip @ jump to next instruction
2105
2106/* ------------------------------ */
2107 .balign 128
2108.L_op_aget_object: /* 0x46 */
2109/* File: arm/op_aget_object.S */
2110 /*
2111 * Array object get. vAA <- vBB[vCC].
2112 *
2113 * for: aget-object
2114 */
2115 /* op vAA, vBB, vCC */
2116 FETCH_B r2, 1, 0 @ r2<- BB
2117 mov r9, rINST, lsr #8 @ r9<- AA
2118 FETCH_B r3, 1, 1 @ r3<- CC
2119 EXPORT_PC
2120 GET_VREG r0, r2 @ r0<- vBB (array object)
2121 GET_VREG r1, r3 @ r1<- vCC (requested index)
2122 bl artAGetObjectFromMterp @ (array, index)
2123 ldr r1, [rSELF, #THREAD_EXCEPTION_OFFSET]
2124 PREFETCH_INST 2
2125 cmp r1, #0
2126 bne MterpException
2127 SET_VREG_OBJECT r0, r9
2128 ADVANCE 2
2129 GET_INST_OPCODE ip
2130 GOTO_OPCODE ip @ jump to next instruction
2131
2132/* ------------------------------ */
2133 .balign 128
2134.L_op_aget_boolean: /* 0x47 */
2135/* File: arm/op_aget_boolean.S */
2136/* File: arm/op_aget.S */
2137 /*
2138 * Array get, 32 bits or less. vAA <- vBB[vCC].
2139 *
2140 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2141 * instructions. We use a pair of FETCH_Bs instead.
2142 *
buzbee76833da2016-01-13 13:06:22 -08002143 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002144 *
2145 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2146 * If this changes, specialize.
2147 */
2148 /* op vAA, vBB, vCC */
2149 FETCH_B r2, 1, 0 @ r2<- BB
2150 mov r9, rINST, lsr #8 @ r9<- AA
2151 FETCH_B r3, 1, 1 @ r3<- CC
2152 GET_VREG r0, r2 @ r0<- vBB (array object)
2153 GET_VREG r1, r3 @ r1<- vCC (requested index)
2154 cmp r0, #0 @ null array object?
2155 beq common_errNullObject @ yes, bail
2156 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2157 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2158 cmp r1, r3 @ compare unsigned index, length
2159 bcs common_errArrayIndex @ index >= length, bail
2160 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2161 ldrb r2, [r0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2162 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002163 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002164 GOTO_OPCODE ip @ jump to next instruction
2165
2166
2167/* ------------------------------ */
2168 .balign 128
2169.L_op_aget_byte: /* 0x48 */
2170/* File: arm/op_aget_byte.S */
2171/* File: arm/op_aget.S */
2172 /*
2173 * Array get, 32 bits or less. vAA <- vBB[vCC].
2174 *
2175 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2176 * instructions. We use a pair of FETCH_Bs instead.
2177 *
buzbee76833da2016-01-13 13:06:22 -08002178 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002179 *
2180 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2181 * If this changes, specialize.
2182 */
2183 /* op vAA, vBB, vCC */
2184 FETCH_B r2, 1, 0 @ r2<- BB
2185 mov r9, rINST, lsr #8 @ r9<- AA
2186 FETCH_B r3, 1, 1 @ r3<- CC
2187 GET_VREG r0, r2 @ r0<- vBB (array object)
2188 GET_VREG r1, r3 @ r1<- vCC (requested index)
2189 cmp r0, #0 @ null array object?
2190 beq common_errNullObject @ yes, bail
2191 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2192 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2193 cmp r1, r3 @ compare unsigned index, length
2194 bcs common_errArrayIndex @ index >= length, bail
2195 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2196 ldrsb r2, [r0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2197 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002198 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002199 GOTO_OPCODE ip @ jump to next instruction
2200
2201
2202/* ------------------------------ */
2203 .balign 128
2204.L_op_aget_char: /* 0x49 */
2205/* File: arm/op_aget_char.S */
2206/* File: arm/op_aget.S */
2207 /*
2208 * Array get, 32 bits or less. vAA <- vBB[vCC].
2209 *
2210 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2211 * instructions. We use a pair of FETCH_Bs instead.
2212 *
buzbee76833da2016-01-13 13:06:22 -08002213 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002214 *
2215 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2216 * If this changes, specialize.
2217 */
2218 /* op vAA, vBB, vCC */
2219 FETCH_B r2, 1, 0 @ r2<- BB
2220 mov r9, rINST, lsr #8 @ r9<- AA
2221 FETCH_B r3, 1, 1 @ r3<- CC
2222 GET_VREG r0, r2 @ r0<- vBB (array object)
2223 GET_VREG r1, r3 @ r1<- vCC (requested index)
2224 cmp r0, #0 @ null array object?
2225 beq common_errNullObject @ yes, bail
2226 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2227 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2228 cmp r1, r3 @ compare unsigned index, length
2229 bcs common_errArrayIndex @ index >= length, bail
2230 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2231 ldrh r2, [r0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2232 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002233 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002234 GOTO_OPCODE ip @ jump to next instruction
2235
2236
2237/* ------------------------------ */
2238 .balign 128
2239.L_op_aget_short: /* 0x4a */
2240/* File: arm/op_aget_short.S */
2241/* File: arm/op_aget.S */
2242 /*
2243 * Array get, 32 bits or less. vAA <- vBB[vCC].
2244 *
2245 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2246 * instructions. We use a pair of FETCH_Bs instead.
2247 *
buzbee76833da2016-01-13 13:06:22 -08002248 * for: aget, aget-boolean, aget-byte, aget-char, aget-short
buzbee1452bee2015-03-06 14:43:04 -08002249 *
2250 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2251 * If this changes, specialize.
2252 */
2253 /* op vAA, vBB, vCC */
2254 FETCH_B r2, 1, 0 @ r2<- BB
2255 mov r9, rINST, lsr #8 @ r9<- AA
2256 FETCH_B r3, 1, 1 @ r3<- CC
2257 GET_VREG r0, r2 @ r0<- vBB (array object)
2258 GET_VREG r1, r3 @ r1<- vCC (requested index)
2259 cmp r0, #0 @ null array object?
2260 beq common_errNullObject @ yes, bail
2261 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2262 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2263 cmp r1, r3 @ compare unsigned index, length
2264 bcs common_errArrayIndex @ index >= length, bail
2265 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2266 ldrsh r2, [r0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2267 GET_INST_OPCODE ip @ extract opcode from rINST
buzbee1452bee2015-03-06 14:43:04 -08002268 SET_VREG r2, r9 @ vAA<- r2
buzbee1452bee2015-03-06 14:43:04 -08002269 GOTO_OPCODE ip @ jump to next instruction
2270
2271
2272/* ------------------------------ */
2273 .balign 128
2274.L_op_aput: /* 0x4b */
2275/* File: arm/op_aput.S */
2276 /*
2277 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2278 *
2279 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2280 * instructions. We use a pair of FETCH_Bs instead.
2281 *
2282 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2283 *
2284 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2285 * If this changes, specialize.
2286 */
2287 /* op vAA, vBB, vCC */
2288 FETCH_B r2, 1, 0 @ r2<- BB
2289 mov r9, rINST, lsr #8 @ r9<- AA
2290 FETCH_B r3, 1, 1 @ r3<- CC
2291 GET_VREG r0, r2 @ r0<- vBB (array object)
2292 GET_VREG r1, r3 @ r1<- vCC (requested index)
2293 cmp r0, #0 @ null array object?
2294 beq common_errNullObject @ yes, bail
2295 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2296 add r0, r0, r1, lsl #2 @ r0<- arrayObj + index*width
2297 cmp r1, r3 @ compare unsigned index, length
2298 bcs common_errArrayIndex @ index >= length, bail
2299 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2300 GET_VREG r2, r9 @ r2<- vAA
2301 GET_INST_OPCODE ip @ extract opcode from rINST
2302 str r2, [r0, #MIRROR_INT_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2303 GOTO_OPCODE ip @ jump to next instruction
2304
2305/* ------------------------------ */
2306 .balign 128
2307.L_op_aput_wide: /* 0x4c */
2308/* File: arm/op_aput_wide.S */
2309 /*
2310 * Array put, 64 bits. vBB[vCC] <- vAA.
2311 *
2312 * Arrays of long/double are 64-bit aligned, so it's okay to use STRD.
2313 */
2314 /* aput-wide vAA, vBB, vCC */
2315 FETCH r0, 1 @ r0<- CCBB
2316 mov r9, rINST, lsr #8 @ r9<- AA
2317 and r2, r0, #255 @ r2<- BB
2318 mov r3, r0, lsr #8 @ r3<- CC
2319 GET_VREG r0, r2 @ r0<- vBB (array object)
2320 GET_VREG r1, r3 @ r1<- vCC (requested index)
2321 cmp r0, #0 @ null array object?
2322 beq common_errNullObject @ yes, bail
2323 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2324 add r0, r0, r1, lsl #3 @ r0<- arrayObj + index*width
2325 cmp r1, r3 @ compare unsigned index, length
2326 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
2327 bcs common_errArrayIndex @ index >= length, bail
2328 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2329 ldmia r9, {r2-r3} @ r2/r3<- vAA/vAA+1
2330 GET_INST_OPCODE ip @ extract opcode from rINST
2331 strd r2, [r0, #MIRROR_WIDE_ARRAY_DATA_OFFSET] @ r2/r3<- vBB[vCC]
2332 GOTO_OPCODE ip @ jump to next instruction
2333
2334/* ------------------------------ */
2335 .balign 128
2336.L_op_aput_object: /* 0x4d */
2337/* File: arm/op_aput_object.S */
2338 /*
2339 * Store an object into an array. vBB[vCC] <- vAA.
2340 */
2341 /* op vAA, vBB, vCC */
2342 EXPORT_PC
2343 add r0, rFP, #OFF_FP_SHADOWFRAME
2344 mov r1, rPC
2345 mov r2, rINST
2346 bl MterpAputObject
2347 cmp r0, #0
2348 beq MterpPossibleException
2349 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2350 GET_INST_OPCODE ip @ extract opcode from rINST
2351 GOTO_OPCODE ip @ jump to next instruction
2352
2353/* ------------------------------ */
2354 .balign 128
2355.L_op_aput_boolean: /* 0x4e */
2356/* File: arm/op_aput_boolean.S */
2357/* File: arm/op_aput.S */
2358 /*
2359 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2360 *
2361 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2362 * instructions. We use a pair of FETCH_Bs instead.
2363 *
2364 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2365 *
2366 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2367 * If this changes, specialize.
2368 */
2369 /* op vAA, vBB, vCC */
2370 FETCH_B r2, 1, 0 @ r2<- BB
2371 mov r9, rINST, lsr #8 @ r9<- AA
2372 FETCH_B r3, 1, 1 @ r3<- CC
2373 GET_VREG r0, r2 @ r0<- vBB (array object)
2374 GET_VREG r1, r3 @ r1<- vCC (requested index)
2375 cmp r0, #0 @ null array object?
2376 beq common_errNullObject @ yes, bail
2377 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2378 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2379 cmp r1, r3 @ compare unsigned index, length
2380 bcs common_errArrayIndex @ index >= length, bail
2381 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2382 GET_VREG r2, r9 @ r2<- vAA
2383 GET_INST_OPCODE ip @ extract opcode from rINST
2384 strb r2, [r0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2385 GOTO_OPCODE ip @ jump to next instruction
2386
2387
2388/* ------------------------------ */
2389 .balign 128
2390.L_op_aput_byte: /* 0x4f */
2391/* File: arm/op_aput_byte.S */
2392/* File: arm/op_aput.S */
2393 /*
2394 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2395 *
2396 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2397 * instructions. We use a pair of FETCH_Bs instead.
2398 *
2399 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2400 *
2401 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2402 * If this changes, specialize.
2403 */
2404 /* op vAA, vBB, vCC */
2405 FETCH_B r2, 1, 0 @ r2<- BB
2406 mov r9, rINST, lsr #8 @ r9<- AA
2407 FETCH_B r3, 1, 1 @ r3<- CC
2408 GET_VREG r0, r2 @ r0<- vBB (array object)
2409 GET_VREG r1, r3 @ r1<- vCC (requested index)
2410 cmp r0, #0 @ null array object?
2411 beq common_errNullObject @ yes, bail
2412 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2413 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2414 cmp r1, r3 @ compare unsigned index, length
2415 bcs common_errArrayIndex @ index >= length, bail
2416 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2417 GET_VREG r2, r9 @ r2<- vAA
2418 GET_INST_OPCODE ip @ extract opcode from rINST
2419 strb r2, [r0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2420 GOTO_OPCODE ip @ jump to next instruction
2421
2422
2423/* ------------------------------ */
2424 .balign 128
2425.L_op_aput_char: /* 0x50 */
2426/* File: arm/op_aput_char.S */
2427/* File: arm/op_aput.S */
2428 /*
2429 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2430 *
2431 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2432 * instructions. We use a pair of FETCH_Bs instead.
2433 *
2434 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2435 *
2436 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2437 * If this changes, specialize.
2438 */
2439 /* op vAA, vBB, vCC */
2440 FETCH_B r2, 1, 0 @ r2<- BB
2441 mov r9, rINST, lsr #8 @ r9<- AA
2442 FETCH_B r3, 1, 1 @ r3<- CC
2443 GET_VREG r0, r2 @ r0<- vBB (array object)
2444 GET_VREG r1, r3 @ r1<- vCC (requested index)
2445 cmp r0, #0 @ null array object?
2446 beq common_errNullObject @ yes, bail
2447 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2448 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2449 cmp r1, r3 @ compare unsigned index, length
2450 bcs common_errArrayIndex @ index >= length, bail
2451 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2452 GET_VREG r2, r9 @ r2<- vAA
2453 GET_INST_OPCODE ip @ extract opcode from rINST
2454 strh r2, [r0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2455 GOTO_OPCODE ip @ jump to next instruction
2456
2457
2458/* ------------------------------ */
2459 .balign 128
2460.L_op_aput_short: /* 0x51 */
2461/* File: arm/op_aput_short.S */
2462/* File: arm/op_aput.S */
2463 /*
2464 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2465 *
2466 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2467 * instructions. We use a pair of FETCH_Bs instead.
2468 *
2469 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2470 *
2471 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2472 * If this changes, specialize.
2473 */
2474 /* op vAA, vBB, vCC */
2475 FETCH_B r2, 1, 0 @ r2<- BB
2476 mov r9, rINST, lsr #8 @ r9<- AA
2477 FETCH_B r3, 1, 1 @ r3<- CC
2478 GET_VREG r0, r2 @ r0<- vBB (array object)
2479 GET_VREG r1, r3 @ r1<- vCC (requested index)
2480 cmp r0, #0 @ null array object?
2481 beq common_errNullObject @ yes, bail
2482 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2483 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2484 cmp r1, r3 @ compare unsigned index, length
2485 bcs common_errArrayIndex @ index >= length, bail
2486 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2487 GET_VREG r2, r9 @ r2<- vAA
2488 GET_INST_OPCODE ip @ extract opcode from rINST
2489 strh r2, [r0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2490 GOTO_OPCODE ip @ jump to next instruction
2491
2492
2493/* ------------------------------ */
2494 .balign 128
2495.L_op_iget: /* 0x52 */
2496/* File: arm/op_iget.S */
2497 /*
2498 * General instance field get.
2499 *
2500 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2501 */
2502 EXPORT_PC
2503 FETCH r0, 1 @ r0<- field ref CCCC
2504 mov r1, rINST, lsr #12 @ r1<- B
2505 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2506 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2507 mov r3, rSELF @ r3<- self
2508 bl artGet32InstanceFromCode
2509 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2510 ubfx r2, rINST, #8, #4 @ r2<- A
2511 PREFETCH_INST 2
2512 cmp r3, #0
2513 bne MterpPossibleException @ bail out
2514 .if 0
2515 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2516 .else
2517 SET_VREG r0, r2 @ fp[A]<- r0
2518 .endif
2519 ADVANCE 2
2520 GET_INST_OPCODE ip @ extract opcode from rINST
2521 GOTO_OPCODE ip @ jump to next instruction
2522
2523/* ------------------------------ */
2524 .balign 128
2525.L_op_iget_wide: /* 0x53 */
2526/* File: arm/op_iget_wide.S */
2527 /*
2528 * 64-bit instance field get.
2529 *
2530 * for: iget-wide
2531 */
2532 EXPORT_PC
2533 FETCH r0, 1 @ r0<- field ref CCCC
2534 mov r1, rINST, lsr #12 @ r1<- B
2535 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2536 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2537 mov r3, rSELF @ r3<- self
2538 bl artGet64InstanceFromCode
2539 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2540 ubfx r2, rINST, #8, #4 @ r2<- A
2541 PREFETCH_INST 2
2542 cmp r3, #0
2543 bne MterpException @ bail out
buzbee50cf6002016-02-10 08:59:12 -08002544 CLEAR_SHADOW_PAIR r2, ip, lr @ Zero out the shadow regs
2545 add r3, rFP, r2, lsl #2 @ r3<- &fp[A]
2546 stmia r3, {r0-r1} @ fp[A]<- r0/r1
buzbee1452bee2015-03-06 14:43:04 -08002547 ADVANCE 2
2548 GET_INST_OPCODE ip @ extract opcode from rINST
2549 GOTO_OPCODE ip @ jump to next instruction
2550
2551/* ------------------------------ */
2552 .balign 128
2553.L_op_iget_object: /* 0x54 */
2554/* File: arm/op_iget_object.S */
2555/* File: arm/op_iget.S */
2556 /*
2557 * General instance field get.
2558 *
2559 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2560 */
2561 EXPORT_PC
2562 FETCH r0, 1 @ r0<- field ref CCCC
2563 mov r1, rINST, lsr #12 @ r1<- B
2564 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2565 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2566 mov r3, rSELF @ r3<- self
2567 bl artGetObjInstanceFromCode
2568 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2569 ubfx r2, rINST, #8, #4 @ r2<- A
2570 PREFETCH_INST 2
2571 cmp r3, #0
2572 bne MterpPossibleException @ bail out
2573 .if 1
2574 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2575 .else
2576 SET_VREG r0, r2 @ fp[A]<- r0
2577 .endif
2578 ADVANCE 2
2579 GET_INST_OPCODE ip @ extract opcode from rINST
2580 GOTO_OPCODE ip @ jump to next instruction
2581
2582
2583/* ------------------------------ */
2584 .balign 128
2585.L_op_iget_boolean: /* 0x55 */
2586/* File: arm/op_iget_boolean.S */
2587/* File: arm/op_iget.S */
2588 /*
2589 * General instance field get.
2590 *
2591 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2592 */
2593 EXPORT_PC
2594 FETCH r0, 1 @ r0<- field ref CCCC
2595 mov r1, rINST, lsr #12 @ r1<- B
2596 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2597 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2598 mov r3, rSELF @ r3<- self
2599 bl artGetBooleanInstanceFromCode
2600 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2601 ubfx r2, rINST, #8, #4 @ r2<- A
2602 PREFETCH_INST 2
2603 cmp r3, #0
2604 bne MterpPossibleException @ bail out
2605 .if 0
2606 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2607 .else
2608 SET_VREG r0, r2 @ fp[A]<- r0
2609 .endif
2610 ADVANCE 2
2611 GET_INST_OPCODE ip @ extract opcode from rINST
2612 GOTO_OPCODE ip @ jump to next instruction
2613
2614
2615/* ------------------------------ */
2616 .balign 128
2617.L_op_iget_byte: /* 0x56 */
2618/* File: arm/op_iget_byte.S */
2619/* File: arm/op_iget.S */
2620 /*
2621 * General instance field get.
2622 *
2623 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2624 */
2625 EXPORT_PC
2626 FETCH r0, 1 @ r0<- field ref CCCC
2627 mov r1, rINST, lsr #12 @ r1<- B
2628 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2629 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2630 mov r3, rSELF @ r3<- self
2631 bl artGetByteInstanceFromCode
2632 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2633 ubfx r2, rINST, #8, #4 @ r2<- A
2634 PREFETCH_INST 2
2635 cmp r3, #0
2636 bne MterpPossibleException @ bail out
2637 .if 0
2638 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2639 .else
2640 SET_VREG r0, r2 @ fp[A]<- r0
2641 .endif
2642 ADVANCE 2
2643 GET_INST_OPCODE ip @ extract opcode from rINST
2644 GOTO_OPCODE ip @ jump to next instruction
2645
2646
2647/* ------------------------------ */
2648 .balign 128
2649.L_op_iget_char: /* 0x57 */
2650/* File: arm/op_iget_char.S */
2651/* File: arm/op_iget.S */
2652 /*
2653 * General instance field get.
2654 *
2655 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2656 */
2657 EXPORT_PC
2658 FETCH r0, 1 @ r0<- field ref CCCC
2659 mov r1, rINST, lsr #12 @ r1<- B
2660 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2661 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2662 mov r3, rSELF @ r3<- self
2663 bl artGetCharInstanceFromCode
2664 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2665 ubfx r2, rINST, #8, #4 @ r2<- A
2666 PREFETCH_INST 2
2667 cmp r3, #0
2668 bne MterpPossibleException @ bail out
2669 .if 0
2670 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2671 .else
2672 SET_VREG r0, r2 @ fp[A]<- r0
2673 .endif
2674 ADVANCE 2
2675 GET_INST_OPCODE ip @ extract opcode from rINST
2676 GOTO_OPCODE ip @ jump to next instruction
2677
2678
2679/* ------------------------------ */
2680 .balign 128
2681.L_op_iget_short: /* 0x58 */
2682/* File: arm/op_iget_short.S */
2683/* File: arm/op_iget.S */
2684 /*
2685 * General instance field get.
2686 *
2687 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2688 */
2689 EXPORT_PC
2690 FETCH r0, 1 @ r0<- field ref CCCC
2691 mov r1, rINST, lsr #12 @ r1<- B
2692 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2693 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2694 mov r3, rSELF @ r3<- self
2695 bl artGetShortInstanceFromCode
2696 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2697 ubfx r2, rINST, #8, #4 @ r2<- A
2698 PREFETCH_INST 2
2699 cmp r3, #0
2700 bne MterpPossibleException @ bail out
2701 .if 0
2702 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2703 .else
2704 SET_VREG r0, r2 @ fp[A]<- r0
2705 .endif
2706 ADVANCE 2
2707 GET_INST_OPCODE ip @ extract opcode from rINST
2708 GOTO_OPCODE ip @ jump to next instruction
2709
2710
2711/* ------------------------------ */
2712 .balign 128
2713.L_op_iput: /* 0x59 */
2714/* File: arm/op_iput.S */
2715 /*
2716 * General 32-bit instance field put.
2717 *
2718 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2719 */
2720 /* op vA, vB, field@CCCC */
2721 .extern artSet32InstanceFromMterp
2722 EXPORT_PC
2723 FETCH r0, 1 @ r0<- field ref CCCC
2724 mov r1, rINST, lsr #12 @ r1<- B
2725 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2726 ubfx r2, rINST, #8, #4 @ r2<- A
2727 GET_VREG r2, r2 @ r2<- fp[A]
2728 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2729 PREFETCH_INST 2
2730 bl artSet32InstanceFromMterp
2731 cmp r0, #0
2732 bne MterpPossibleException
2733 ADVANCE 2 @ advance rPC
2734 GET_INST_OPCODE ip @ extract opcode from rINST
2735 GOTO_OPCODE ip @ jump to next instruction
2736
2737/* ------------------------------ */
2738 .balign 128
2739.L_op_iput_wide: /* 0x5a */
2740/* File: arm/op_iput_wide.S */
2741 /* iput-wide vA, vB, field@CCCC */
2742 .extern artSet64InstanceFromMterp
2743 EXPORT_PC
2744 FETCH r0, 1 @ r0<- field ref CCCC
2745 mov r1, rINST, lsr #12 @ r1<- B
2746 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2747 ubfx r2, rINST, #8, #4 @ r2<- A
2748 add r2, rFP, r2, lsl #2 @ r2<- &fp[A]
2749 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2750 PREFETCH_INST 2
2751 bl artSet64InstanceFromMterp
2752 cmp r0, #0
2753 bne MterpPossibleException
2754 ADVANCE 2 @ advance rPC
2755 GET_INST_OPCODE ip @ extract opcode from rINST
2756 GOTO_OPCODE ip @ jump to next instruction
2757
2758/* ------------------------------ */
2759 .balign 128
2760.L_op_iput_object: /* 0x5b */
2761/* File: arm/op_iput_object.S */
2762 EXPORT_PC
2763 add r0, rFP, #OFF_FP_SHADOWFRAME
2764 mov r1, rPC
2765 mov r2, rINST
2766 mov r3, rSELF
2767 bl MterpIputObject
2768 cmp r0, #0
2769 beq MterpException
2770 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2771 GET_INST_OPCODE ip @ extract opcode from rINST
2772 GOTO_OPCODE ip @ jump to next instruction
2773
2774/* ------------------------------ */
2775 .balign 128
2776.L_op_iput_boolean: /* 0x5c */
2777/* File: arm/op_iput_boolean.S */
2778/* File: arm/op_iput.S */
2779 /*
2780 * General 32-bit instance field put.
2781 *
2782 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2783 */
2784 /* op vA, vB, field@CCCC */
2785 .extern artSet8InstanceFromMterp
2786 EXPORT_PC
2787 FETCH r0, 1 @ r0<- field ref CCCC
2788 mov r1, rINST, lsr #12 @ r1<- B
2789 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2790 ubfx r2, rINST, #8, #4 @ r2<- A
2791 GET_VREG r2, r2 @ r2<- fp[A]
2792 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2793 PREFETCH_INST 2
2794 bl artSet8InstanceFromMterp
2795 cmp r0, #0
2796 bne MterpPossibleException
2797 ADVANCE 2 @ advance rPC
2798 GET_INST_OPCODE ip @ extract opcode from rINST
2799 GOTO_OPCODE ip @ jump to next instruction
2800
2801
2802/* ------------------------------ */
2803 .balign 128
2804.L_op_iput_byte: /* 0x5d */
2805/* File: arm/op_iput_byte.S */
2806/* File: arm/op_iput.S */
2807 /*
2808 * General 32-bit instance field put.
2809 *
2810 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2811 */
2812 /* op vA, vB, field@CCCC */
2813 .extern artSet8InstanceFromMterp
2814 EXPORT_PC
2815 FETCH r0, 1 @ r0<- field ref CCCC
2816 mov r1, rINST, lsr #12 @ r1<- B
2817 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2818 ubfx r2, rINST, #8, #4 @ r2<- A
2819 GET_VREG r2, r2 @ r2<- fp[A]
2820 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2821 PREFETCH_INST 2
2822 bl artSet8InstanceFromMterp
2823 cmp r0, #0
2824 bne MterpPossibleException
2825 ADVANCE 2 @ advance rPC
2826 GET_INST_OPCODE ip @ extract opcode from rINST
2827 GOTO_OPCODE ip @ jump to next instruction
2828
2829
2830/* ------------------------------ */
2831 .balign 128
2832.L_op_iput_char: /* 0x5e */
2833/* File: arm/op_iput_char.S */
2834/* File: arm/op_iput.S */
2835 /*
2836 * General 32-bit instance field put.
2837 *
2838 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2839 */
2840 /* op vA, vB, field@CCCC */
2841 .extern artSet16InstanceFromMterp
2842 EXPORT_PC
2843 FETCH r0, 1 @ r0<- field ref CCCC
2844 mov r1, rINST, lsr #12 @ r1<- B
2845 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2846 ubfx r2, rINST, #8, #4 @ r2<- A
2847 GET_VREG r2, r2 @ r2<- fp[A]
2848 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2849 PREFETCH_INST 2
2850 bl artSet16InstanceFromMterp
2851 cmp r0, #0
2852 bne MterpPossibleException
2853 ADVANCE 2 @ advance rPC
2854 GET_INST_OPCODE ip @ extract opcode from rINST
2855 GOTO_OPCODE ip @ jump to next instruction
2856
2857
2858/* ------------------------------ */
2859 .balign 128
2860.L_op_iput_short: /* 0x5f */
2861/* File: arm/op_iput_short.S */
2862/* File: arm/op_iput.S */
2863 /*
2864 * General 32-bit instance field put.
2865 *
2866 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2867 */
2868 /* op vA, vB, field@CCCC */
2869 .extern artSet16InstanceFromMterp
2870 EXPORT_PC
2871 FETCH r0, 1 @ r0<- field ref CCCC
2872 mov r1, rINST, lsr #12 @ r1<- B
2873 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2874 ubfx r2, rINST, #8, #4 @ r2<- A
2875 GET_VREG r2, r2 @ r2<- fp[A]
2876 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2877 PREFETCH_INST 2
2878 bl artSet16InstanceFromMterp
2879 cmp r0, #0
2880 bne MterpPossibleException
2881 ADVANCE 2 @ advance rPC
2882 GET_INST_OPCODE ip @ extract opcode from rINST
2883 GOTO_OPCODE ip @ jump to next instruction
2884
2885
2886/* ------------------------------ */
2887 .balign 128
2888.L_op_sget: /* 0x60 */
2889/* File: arm/op_sget.S */
2890 /*
2891 * General SGET handler wrapper.
2892 *
2893 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2894 */
2895 /* op vAA, field@BBBB */
2896
2897 .extern artGet32StaticFromCode
2898 EXPORT_PC
2899 FETCH r0, 1 @ r0<- field ref BBBB
2900 ldr r1, [rFP, #OFF_FP_METHOD]
2901 mov r2, rSELF
2902 bl artGet32StaticFromCode
2903 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2904 mov r2, rINST, lsr #8 @ r2<- AA
2905 PREFETCH_INST 2
2906 cmp r3, #0 @ Fail to resolve?
2907 bne MterpException @ bail out
2908.if 0
2909 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
2910.else
2911 SET_VREG r0, r2 @ fp[AA]<- r0
2912.endif
2913 ADVANCE 2
2914 GET_INST_OPCODE ip @ extract opcode from rINST
2915 GOTO_OPCODE ip
2916
2917/* ------------------------------ */
2918 .balign 128
2919.L_op_sget_wide: /* 0x61 */
2920/* File: arm/op_sget_wide.S */
2921 /*
2922 * SGET_WIDE handler wrapper.
2923 *
2924 */
2925 /* sget-wide vAA, field@BBBB */
2926
2927 .extern artGet64StaticFromCode
2928 EXPORT_PC
2929 FETCH r0, 1 @ r0<- field ref BBBB
2930 ldr r1, [rFP, #OFF_FP_METHOD]
2931 mov r2, rSELF
2932 bl artGet64StaticFromCode
2933 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2934 mov r9, rINST, lsr #8 @ r9<- AA
buzbee50cf6002016-02-10 08:59:12 -08002935 add lr, rFP, r9, lsl #2 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08002936 cmp r3, #0 @ Fail to resolve?
2937 bne MterpException @ bail out
2938 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee50cf6002016-02-10 08:59:12 -08002939 CLEAR_SHADOW_PAIR r9, r2, ip @ Zero out the shadow regs
2940 stmia lr, {r0-r1} @ vAA/vAA+1<- r0/r1
buzbee1452bee2015-03-06 14:43:04 -08002941 GET_INST_OPCODE ip @ extract opcode from rINST
2942 GOTO_OPCODE ip @ jump to next instruction
2943
2944/* ------------------------------ */
2945 .balign 128
2946.L_op_sget_object: /* 0x62 */
2947/* File: arm/op_sget_object.S */
2948/* File: arm/op_sget.S */
2949 /*
2950 * General SGET handler wrapper.
2951 *
2952 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2953 */
2954 /* op vAA, field@BBBB */
2955
2956 .extern artGetObjStaticFromCode
2957 EXPORT_PC
2958 FETCH r0, 1 @ r0<- field ref BBBB
2959 ldr r1, [rFP, #OFF_FP_METHOD]
2960 mov r2, rSELF
2961 bl artGetObjStaticFromCode
2962 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2963 mov r2, rINST, lsr #8 @ r2<- AA
2964 PREFETCH_INST 2
2965 cmp r3, #0 @ Fail to resolve?
2966 bne MterpException @ bail out
2967.if 1
2968 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
2969.else
2970 SET_VREG r0, r2 @ fp[AA]<- r0
2971.endif
2972 ADVANCE 2
2973 GET_INST_OPCODE ip @ extract opcode from rINST
2974 GOTO_OPCODE ip
2975
2976
2977/* ------------------------------ */
2978 .balign 128
2979.L_op_sget_boolean: /* 0x63 */
2980/* File: arm/op_sget_boolean.S */
2981/* File: arm/op_sget.S */
2982 /*
2983 * General SGET handler wrapper.
2984 *
2985 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2986 */
2987 /* op vAA, field@BBBB */
2988
2989 .extern artGetBooleanStaticFromCode
2990 EXPORT_PC
2991 FETCH r0, 1 @ r0<- field ref BBBB
2992 ldr r1, [rFP, #OFF_FP_METHOD]
2993 mov r2, rSELF
2994 bl artGetBooleanStaticFromCode
2995 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2996 mov r2, rINST, lsr #8 @ r2<- AA
2997 PREFETCH_INST 2
2998 cmp r3, #0 @ Fail to resolve?
2999 bne MterpException @ bail out
3000.if 0
3001 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3002.else
3003 SET_VREG r0, r2 @ fp[AA]<- r0
3004.endif
3005 ADVANCE 2
3006 GET_INST_OPCODE ip @ extract opcode from rINST
3007 GOTO_OPCODE ip
3008
3009
3010/* ------------------------------ */
3011 .balign 128
3012.L_op_sget_byte: /* 0x64 */
3013/* File: arm/op_sget_byte.S */
3014/* File: arm/op_sget.S */
3015 /*
3016 * General SGET handler wrapper.
3017 *
3018 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3019 */
3020 /* op vAA, field@BBBB */
3021
3022 .extern artGetByteStaticFromCode
3023 EXPORT_PC
3024 FETCH r0, 1 @ r0<- field ref BBBB
3025 ldr r1, [rFP, #OFF_FP_METHOD]
3026 mov r2, rSELF
3027 bl artGetByteStaticFromCode
3028 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3029 mov r2, rINST, lsr #8 @ r2<- AA
3030 PREFETCH_INST 2
3031 cmp r3, #0 @ Fail to resolve?
3032 bne MterpException @ bail out
3033.if 0
3034 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3035.else
3036 SET_VREG r0, r2 @ fp[AA]<- r0
3037.endif
3038 ADVANCE 2
3039 GET_INST_OPCODE ip @ extract opcode from rINST
3040 GOTO_OPCODE ip
3041
3042
3043/* ------------------------------ */
3044 .balign 128
3045.L_op_sget_char: /* 0x65 */
3046/* File: arm/op_sget_char.S */
3047/* File: arm/op_sget.S */
3048 /*
3049 * General SGET handler wrapper.
3050 *
3051 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3052 */
3053 /* op vAA, field@BBBB */
3054
3055 .extern artGetCharStaticFromCode
3056 EXPORT_PC
3057 FETCH r0, 1 @ r0<- field ref BBBB
3058 ldr r1, [rFP, #OFF_FP_METHOD]
3059 mov r2, rSELF
3060 bl artGetCharStaticFromCode
3061 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3062 mov r2, rINST, lsr #8 @ r2<- AA
3063 PREFETCH_INST 2
3064 cmp r3, #0 @ Fail to resolve?
3065 bne MterpException @ bail out
3066.if 0
3067 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3068.else
3069 SET_VREG r0, r2 @ fp[AA]<- r0
3070.endif
3071 ADVANCE 2
3072 GET_INST_OPCODE ip @ extract opcode from rINST
3073 GOTO_OPCODE ip
3074
3075
3076/* ------------------------------ */
3077 .balign 128
3078.L_op_sget_short: /* 0x66 */
3079/* File: arm/op_sget_short.S */
3080/* File: arm/op_sget.S */
3081 /*
3082 * General SGET handler wrapper.
3083 *
3084 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3085 */
3086 /* op vAA, field@BBBB */
3087
3088 .extern artGetShortStaticFromCode
3089 EXPORT_PC
3090 FETCH r0, 1 @ r0<- field ref BBBB
3091 ldr r1, [rFP, #OFF_FP_METHOD]
3092 mov r2, rSELF
3093 bl artGetShortStaticFromCode
3094 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3095 mov r2, rINST, lsr #8 @ r2<- AA
3096 PREFETCH_INST 2
3097 cmp r3, #0 @ Fail to resolve?
3098 bne MterpException @ bail out
3099.if 0
3100 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3101.else
3102 SET_VREG r0, r2 @ fp[AA]<- r0
3103.endif
3104 ADVANCE 2
3105 GET_INST_OPCODE ip @ extract opcode from rINST
3106 GOTO_OPCODE ip
3107
3108
3109/* ------------------------------ */
3110 .balign 128
3111.L_op_sput: /* 0x67 */
3112/* File: arm/op_sput.S */
3113 /*
3114 * General SPUT handler wrapper.
3115 *
3116 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3117 */
3118 /* op vAA, field@BBBB */
3119 EXPORT_PC
3120 FETCH r0, 1 @ r0<- field ref BBBB
3121 mov r3, rINST, lsr #8 @ r3<- AA
3122 GET_VREG r1, r3 @ r1<= fp[AA]
3123 ldr r2, [rFP, #OFF_FP_METHOD]
3124 mov r3, rSELF
3125 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3126 bl artSet32StaticFromCode
3127 cmp r0, #0 @ 0 on success, -1 on failure
3128 bne MterpException
3129 ADVANCE 2 @ Past exception point - now advance rPC
3130 GET_INST_OPCODE ip @ extract opcode from rINST
3131 GOTO_OPCODE ip @ jump to next instruction
3132
3133/* ------------------------------ */
3134 .balign 128
3135.L_op_sput_wide: /* 0x68 */
3136/* File: arm/op_sput_wide.S */
3137 /*
3138 * SPUT_WIDE handler wrapper.
3139 *
3140 */
3141 /* sput-wide vAA, field@BBBB */
3142 .extern artSet64IndirectStaticFromMterp
3143 EXPORT_PC
3144 FETCH r0, 1 @ r0<- field ref BBBB
3145 ldr r1, [rFP, #OFF_FP_METHOD]
3146 mov r2, rINST, lsr #8 @ r3<- AA
3147 add r2, rFP, r2, lsl #2
3148 mov r3, rSELF
3149 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3150 bl artSet64IndirectStaticFromMterp
3151 cmp r0, #0 @ 0 on success, -1 on failure
3152 bne MterpException
3153 ADVANCE 2 @ Past exception point - now advance rPC
3154 GET_INST_OPCODE ip @ extract opcode from rINST
3155 GOTO_OPCODE ip @ jump to next instruction
3156
3157/* ------------------------------ */
3158 .balign 128
3159.L_op_sput_object: /* 0x69 */
3160/* File: arm/op_sput_object.S */
3161 EXPORT_PC
3162 add r0, rFP, #OFF_FP_SHADOWFRAME
3163 mov r1, rPC
3164 mov r2, rINST
3165 mov r3, rSELF
3166 bl MterpSputObject
3167 cmp r0, #0
3168 beq MterpException
3169 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
3170 GET_INST_OPCODE ip @ extract opcode from rINST
3171 GOTO_OPCODE ip @ jump to next instruction
3172
3173/* ------------------------------ */
3174 .balign 128
3175.L_op_sput_boolean: /* 0x6a */
3176/* File: arm/op_sput_boolean.S */
3177/* File: arm/op_sput.S */
3178 /*
3179 * General SPUT handler wrapper.
3180 *
3181 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3182 */
3183 /* op vAA, field@BBBB */
3184 EXPORT_PC
3185 FETCH r0, 1 @ r0<- field ref BBBB
3186 mov r3, rINST, lsr #8 @ r3<- AA
3187 GET_VREG r1, r3 @ r1<= fp[AA]
3188 ldr r2, [rFP, #OFF_FP_METHOD]
3189 mov r3, rSELF
3190 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3191 bl artSet8StaticFromCode
3192 cmp r0, #0 @ 0 on success, -1 on failure
3193 bne MterpException
3194 ADVANCE 2 @ Past exception point - now advance rPC
3195 GET_INST_OPCODE ip @ extract opcode from rINST
3196 GOTO_OPCODE ip @ jump to next instruction
3197
3198
3199/* ------------------------------ */
3200 .balign 128
3201.L_op_sput_byte: /* 0x6b */
3202/* File: arm/op_sput_byte.S */
3203/* File: arm/op_sput.S */
3204 /*
3205 * General SPUT handler wrapper.
3206 *
3207 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3208 */
3209 /* op vAA, field@BBBB */
3210 EXPORT_PC
3211 FETCH r0, 1 @ r0<- field ref BBBB
3212 mov r3, rINST, lsr #8 @ r3<- AA
3213 GET_VREG r1, r3 @ r1<= fp[AA]
3214 ldr r2, [rFP, #OFF_FP_METHOD]
3215 mov r3, rSELF
3216 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3217 bl artSet8StaticFromCode
3218 cmp r0, #0 @ 0 on success, -1 on failure
3219 bne MterpException
3220 ADVANCE 2 @ Past exception point - now advance rPC
3221 GET_INST_OPCODE ip @ extract opcode from rINST
3222 GOTO_OPCODE ip @ jump to next instruction
3223
3224
3225/* ------------------------------ */
3226 .balign 128
3227.L_op_sput_char: /* 0x6c */
3228/* File: arm/op_sput_char.S */
3229/* File: arm/op_sput.S */
3230 /*
3231 * General SPUT handler wrapper.
3232 *
3233 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3234 */
3235 /* op vAA, field@BBBB */
3236 EXPORT_PC
3237 FETCH r0, 1 @ r0<- field ref BBBB
3238 mov r3, rINST, lsr #8 @ r3<- AA
3239 GET_VREG r1, r3 @ r1<= fp[AA]
3240 ldr r2, [rFP, #OFF_FP_METHOD]
3241 mov r3, rSELF
3242 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3243 bl artSet16StaticFromCode
3244 cmp r0, #0 @ 0 on success, -1 on failure
3245 bne MterpException
3246 ADVANCE 2 @ Past exception point - now advance rPC
3247 GET_INST_OPCODE ip @ extract opcode from rINST
3248 GOTO_OPCODE ip @ jump to next instruction
3249
3250
3251/* ------------------------------ */
3252 .balign 128
3253.L_op_sput_short: /* 0x6d */
3254/* File: arm/op_sput_short.S */
3255/* File: arm/op_sput.S */
3256 /*
3257 * General SPUT handler wrapper.
3258 *
3259 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3260 */
3261 /* op vAA, field@BBBB */
3262 EXPORT_PC
3263 FETCH r0, 1 @ r0<- field ref BBBB
3264 mov r3, rINST, lsr #8 @ r3<- AA
3265 GET_VREG r1, r3 @ r1<= fp[AA]
3266 ldr r2, [rFP, #OFF_FP_METHOD]
3267 mov r3, rSELF
3268 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3269 bl artSet16StaticFromCode
3270 cmp r0, #0 @ 0 on success, -1 on failure
3271 bne MterpException
3272 ADVANCE 2 @ Past exception point - now advance rPC
3273 GET_INST_OPCODE ip @ extract opcode from rINST
3274 GOTO_OPCODE ip @ jump to next instruction
3275
3276
3277/* ------------------------------ */
3278 .balign 128
3279.L_op_invoke_virtual: /* 0x6e */
3280/* File: arm/op_invoke_virtual.S */
3281/* File: arm/invoke.S */
3282 /*
3283 * Generic invoke handler wrapper.
3284 */
3285 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3286 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3287 .extern MterpInvokeVirtual
3288 EXPORT_PC
3289 mov r0, rSELF
3290 add r1, rFP, #OFF_FP_SHADOWFRAME
3291 mov r2, rPC
3292 mov r3, rINST
3293 bl MterpInvokeVirtual
3294 cmp r0, #0
3295 beq MterpException
3296 FETCH_ADVANCE_INST 3
3297 GET_INST_OPCODE ip
3298 GOTO_OPCODE ip
3299
3300
3301 /*
3302 * Handle a virtual method call.
3303 *
3304 * for: invoke-virtual, invoke-virtual/range
3305 */
3306 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3307 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3308
3309/* ------------------------------ */
3310 .balign 128
3311.L_op_invoke_super: /* 0x6f */
3312/* File: arm/op_invoke_super.S */
3313/* File: arm/invoke.S */
3314 /*
3315 * Generic invoke handler wrapper.
3316 */
3317 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3318 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3319 .extern MterpInvokeSuper
3320 EXPORT_PC
3321 mov r0, rSELF
3322 add r1, rFP, #OFF_FP_SHADOWFRAME
3323 mov r2, rPC
3324 mov r3, rINST
3325 bl MterpInvokeSuper
3326 cmp r0, #0
3327 beq MterpException
3328 FETCH_ADVANCE_INST 3
3329 GET_INST_OPCODE ip
3330 GOTO_OPCODE ip
3331
3332
3333 /*
3334 * Handle a "super" method call.
3335 *
3336 * for: invoke-super, invoke-super/range
3337 */
3338 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3339 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3340
3341/* ------------------------------ */
3342 .balign 128
3343.L_op_invoke_direct: /* 0x70 */
3344/* File: arm/op_invoke_direct.S */
3345/* File: arm/invoke.S */
3346 /*
3347 * Generic invoke handler wrapper.
3348 */
3349 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3350 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3351 .extern MterpInvokeDirect
3352 EXPORT_PC
3353 mov r0, rSELF
3354 add r1, rFP, #OFF_FP_SHADOWFRAME
3355 mov r2, rPC
3356 mov r3, rINST
3357 bl MterpInvokeDirect
3358 cmp r0, #0
3359 beq MterpException
3360 FETCH_ADVANCE_INST 3
3361 GET_INST_OPCODE ip
3362 GOTO_OPCODE ip
3363
3364
3365
3366/* ------------------------------ */
3367 .balign 128
3368.L_op_invoke_static: /* 0x71 */
3369/* File: arm/op_invoke_static.S */
3370/* File: arm/invoke.S */
3371 /*
3372 * Generic invoke handler wrapper.
3373 */
3374 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3375 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3376 .extern MterpInvokeStatic
3377 EXPORT_PC
3378 mov r0, rSELF
3379 add r1, rFP, #OFF_FP_SHADOWFRAME
3380 mov r2, rPC
3381 mov r3, rINST
3382 bl MterpInvokeStatic
3383 cmp r0, #0
3384 beq MterpException
3385 FETCH_ADVANCE_INST 3
3386 GET_INST_OPCODE ip
3387 GOTO_OPCODE ip
3388
3389
3390
3391
3392/* ------------------------------ */
3393 .balign 128
3394.L_op_invoke_interface: /* 0x72 */
3395/* File: arm/op_invoke_interface.S */
3396/* File: arm/invoke.S */
3397 /*
3398 * Generic invoke handler wrapper.
3399 */
3400 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3401 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3402 .extern MterpInvokeInterface
3403 EXPORT_PC
3404 mov r0, rSELF
3405 add r1, rFP, #OFF_FP_SHADOWFRAME
3406 mov r2, rPC
3407 mov r3, rINST
3408 bl MterpInvokeInterface
3409 cmp r0, #0
3410 beq MterpException
3411 FETCH_ADVANCE_INST 3
3412 GET_INST_OPCODE ip
3413 GOTO_OPCODE ip
3414
3415
3416 /*
3417 * Handle an interface method call.
3418 *
3419 * for: invoke-interface, invoke-interface/range
3420 */
3421 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3422 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3423
3424/* ------------------------------ */
3425 .balign 128
3426.L_op_return_void_no_barrier: /* 0x73 */
3427/* File: arm/op_return_void_no_barrier.S */
buzbeea2c97a92016-01-25 15:41:24 -08003428 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
3429 mov r0, rSELF
3430 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
3431 blne MterpSuspendCheck @ (self)
buzbee1452bee2015-03-06 14:43:04 -08003432 mov r0, #0
3433 mov r1, #0
3434 b MterpReturn
3435
3436/* ------------------------------ */
3437 .balign 128
3438.L_op_invoke_virtual_range: /* 0x74 */
3439/* File: arm/op_invoke_virtual_range.S */
3440/* File: arm/invoke.S */
3441 /*
3442 * Generic invoke handler wrapper.
3443 */
3444 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3445 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3446 .extern MterpInvokeVirtualRange
3447 EXPORT_PC
3448 mov r0, rSELF
3449 add r1, rFP, #OFF_FP_SHADOWFRAME
3450 mov r2, rPC
3451 mov r3, rINST
3452 bl MterpInvokeVirtualRange
3453 cmp r0, #0
3454 beq MterpException
3455 FETCH_ADVANCE_INST 3
3456 GET_INST_OPCODE ip
3457 GOTO_OPCODE ip
3458
3459
3460
3461/* ------------------------------ */
3462 .balign 128
3463.L_op_invoke_super_range: /* 0x75 */
3464/* File: arm/op_invoke_super_range.S */
3465/* File: arm/invoke.S */
3466 /*
3467 * Generic invoke handler wrapper.
3468 */
3469 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3470 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3471 .extern MterpInvokeSuperRange
3472 EXPORT_PC
3473 mov r0, rSELF
3474 add r1, rFP, #OFF_FP_SHADOWFRAME
3475 mov r2, rPC
3476 mov r3, rINST
3477 bl MterpInvokeSuperRange
3478 cmp r0, #0
3479 beq MterpException
3480 FETCH_ADVANCE_INST 3
3481 GET_INST_OPCODE ip
3482 GOTO_OPCODE ip
3483
3484
3485
3486/* ------------------------------ */
3487 .balign 128
3488.L_op_invoke_direct_range: /* 0x76 */
3489/* File: arm/op_invoke_direct_range.S */
3490/* File: arm/invoke.S */
3491 /*
3492 * Generic invoke handler wrapper.
3493 */
3494 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3495 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3496 .extern MterpInvokeDirectRange
3497 EXPORT_PC
3498 mov r0, rSELF
3499 add r1, rFP, #OFF_FP_SHADOWFRAME
3500 mov r2, rPC
3501 mov r3, rINST
3502 bl MterpInvokeDirectRange
3503 cmp r0, #0
3504 beq MterpException
3505 FETCH_ADVANCE_INST 3
3506 GET_INST_OPCODE ip
3507 GOTO_OPCODE ip
3508
3509
3510
3511/* ------------------------------ */
3512 .balign 128
3513.L_op_invoke_static_range: /* 0x77 */
3514/* File: arm/op_invoke_static_range.S */
3515/* File: arm/invoke.S */
3516 /*
3517 * Generic invoke handler wrapper.
3518 */
3519 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3520 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3521 .extern MterpInvokeStaticRange
3522 EXPORT_PC
3523 mov r0, rSELF
3524 add r1, rFP, #OFF_FP_SHADOWFRAME
3525 mov r2, rPC
3526 mov r3, rINST
3527 bl MterpInvokeStaticRange
3528 cmp r0, #0
3529 beq MterpException
3530 FETCH_ADVANCE_INST 3
3531 GET_INST_OPCODE ip
3532 GOTO_OPCODE ip
3533
3534
3535
3536/* ------------------------------ */
3537 .balign 128
3538.L_op_invoke_interface_range: /* 0x78 */
3539/* File: arm/op_invoke_interface_range.S */
3540/* File: arm/invoke.S */
3541 /*
3542 * Generic invoke handler wrapper.
3543 */
3544 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3545 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3546 .extern MterpInvokeInterfaceRange
3547 EXPORT_PC
3548 mov r0, rSELF
3549 add r1, rFP, #OFF_FP_SHADOWFRAME
3550 mov r2, rPC
3551 mov r3, rINST
3552 bl MterpInvokeInterfaceRange
3553 cmp r0, #0
3554 beq MterpException
3555 FETCH_ADVANCE_INST 3
3556 GET_INST_OPCODE ip
3557 GOTO_OPCODE ip
3558
3559
3560
3561/* ------------------------------ */
3562 .balign 128
3563.L_op_unused_79: /* 0x79 */
3564/* File: arm/op_unused_79.S */
3565/* File: arm/unused.S */
3566/*
3567 * Bail to reference interpreter to throw.
3568 */
3569 b MterpFallback
3570
3571
3572/* ------------------------------ */
3573 .balign 128
3574.L_op_unused_7a: /* 0x7a */
3575/* File: arm/op_unused_7a.S */
3576/* File: arm/unused.S */
3577/*
3578 * Bail to reference interpreter to throw.
3579 */
3580 b MterpFallback
3581
3582
3583/* ------------------------------ */
3584 .balign 128
3585.L_op_neg_int: /* 0x7b */
3586/* File: arm/op_neg_int.S */
3587/* File: arm/unop.S */
3588 /*
3589 * Generic 32-bit unary operation. Provide an "instr" line that
3590 * specifies an instruction that performs "result = op r0".
3591 * This could be an ARM instruction or a function call.
3592 *
3593 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3594 * int-to-byte, int-to-char, int-to-short
3595 */
3596 /* unop vA, vB */
3597 mov r3, rINST, lsr #12 @ r3<- B
3598 ubfx r9, rINST, #8, #4 @ r9<- A
3599 GET_VREG r0, r3 @ r0<- vB
3600 @ optional op; may set condition codes
3601 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3602 rsb r0, r0, #0 @ r0<- op, r0-r3 changed
3603 GET_INST_OPCODE ip @ extract opcode from rINST
3604 SET_VREG r0, r9 @ vAA<- r0
3605 GOTO_OPCODE ip @ jump to next instruction
3606 /* 8-9 instructions */
3607
3608
3609/* ------------------------------ */
3610 .balign 128
3611.L_op_not_int: /* 0x7c */
3612/* File: arm/op_not_int.S */
3613/* File: arm/unop.S */
3614 /*
3615 * Generic 32-bit unary operation. Provide an "instr" line that
3616 * specifies an instruction that performs "result = op r0".
3617 * This could be an ARM instruction or a function call.
3618 *
3619 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3620 * int-to-byte, int-to-char, int-to-short
3621 */
3622 /* unop vA, vB */
3623 mov r3, rINST, lsr #12 @ r3<- B
3624 ubfx r9, rINST, #8, #4 @ r9<- A
3625 GET_VREG r0, r3 @ r0<- vB
3626 @ optional op; may set condition codes
3627 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3628 mvn r0, r0 @ r0<- op, r0-r3 changed
3629 GET_INST_OPCODE ip @ extract opcode from rINST
3630 SET_VREG r0, r9 @ vAA<- r0
3631 GOTO_OPCODE ip @ jump to next instruction
3632 /* 8-9 instructions */
3633
3634
3635/* ------------------------------ */
3636 .balign 128
3637.L_op_neg_long: /* 0x7d */
3638/* File: arm/op_neg_long.S */
3639/* File: arm/unopWide.S */
3640 /*
3641 * Generic 64-bit unary operation. Provide an "instr" line that
3642 * specifies an instruction that performs "result = op r0/r1".
3643 * This could be an ARM instruction or a function call.
3644 *
3645 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3646 */
3647 /* unop vA, vB */
3648 mov r3, rINST, lsr #12 @ r3<- B
buzbee50cf6002016-02-10 08:59:12 -08003649 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08003650 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08003651 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08003652 ldmia r3, {r0-r1} @ r0/r1<- vAA
buzbee50cf6002016-02-10 08:59:12 -08003653 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08003654 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3655 rsbs r0, r0, #0 @ optional op; may set condition codes
3656 rsc r1, r1, #0 @ r0/r1<- op, r2-r3 changed
3657 GET_INST_OPCODE ip @ extract opcode from rINST
3658 stmia r9, {r0-r1} @ vAA<- r0/r1
3659 GOTO_OPCODE ip @ jump to next instruction
3660 /* 10-11 instructions */
3661
3662
3663/* ------------------------------ */
3664 .balign 128
3665.L_op_not_long: /* 0x7e */
3666/* File: arm/op_not_long.S */
3667/* File: arm/unopWide.S */
3668 /*
3669 * Generic 64-bit unary operation. Provide an "instr" line that
3670 * specifies an instruction that performs "result = op r0/r1".
3671 * This could be an ARM instruction or a function call.
3672 *
3673 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3674 */
3675 /* unop vA, vB */
3676 mov r3, rINST, lsr #12 @ r3<- B
buzbee50cf6002016-02-10 08:59:12 -08003677 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08003678 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08003679 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08003680 ldmia r3, {r0-r1} @ r0/r1<- vAA
buzbee50cf6002016-02-10 08:59:12 -08003681 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08003682 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3683 mvn r0, r0 @ optional op; may set condition codes
3684 mvn r1, r1 @ r0/r1<- op, r2-r3 changed
3685 GET_INST_OPCODE ip @ extract opcode from rINST
3686 stmia r9, {r0-r1} @ vAA<- r0/r1
3687 GOTO_OPCODE ip @ jump to next instruction
3688 /* 10-11 instructions */
3689
3690
3691/* ------------------------------ */
3692 .balign 128
3693.L_op_neg_float: /* 0x7f */
3694/* File: arm/op_neg_float.S */
3695/* File: arm/unop.S */
3696 /*
3697 * Generic 32-bit unary operation. Provide an "instr" line that
3698 * specifies an instruction that performs "result = op r0".
3699 * This could be an ARM instruction or a function call.
3700 *
3701 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3702 * int-to-byte, int-to-char, int-to-short
3703 */
3704 /* unop vA, vB */
3705 mov r3, rINST, lsr #12 @ r3<- B
3706 ubfx r9, rINST, #8, #4 @ r9<- A
3707 GET_VREG r0, r3 @ r0<- vB
3708 @ optional op; may set condition codes
3709 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3710 add r0, r0, #0x80000000 @ r0<- op, r0-r3 changed
3711 GET_INST_OPCODE ip @ extract opcode from rINST
3712 SET_VREG r0, r9 @ vAA<- r0
3713 GOTO_OPCODE ip @ jump to next instruction
3714 /* 8-9 instructions */
3715
3716
3717/* ------------------------------ */
3718 .balign 128
3719.L_op_neg_double: /* 0x80 */
3720/* File: arm/op_neg_double.S */
3721/* File: arm/unopWide.S */
3722 /*
3723 * Generic 64-bit unary operation. Provide an "instr" line that
3724 * specifies an instruction that performs "result = op r0/r1".
3725 * This could be an ARM instruction or a function call.
3726 *
3727 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3728 */
3729 /* unop vA, vB */
3730 mov r3, rINST, lsr #12 @ r3<- B
buzbee50cf6002016-02-10 08:59:12 -08003731 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08003732 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08003733 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08003734 ldmia r3, {r0-r1} @ r0/r1<- vAA
buzbee50cf6002016-02-10 08:59:12 -08003735 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08003736 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3737 @ optional op; may set condition codes
3738 add r1, r1, #0x80000000 @ r0/r1<- op, r2-r3 changed
3739 GET_INST_OPCODE ip @ extract opcode from rINST
3740 stmia r9, {r0-r1} @ vAA<- r0/r1
3741 GOTO_OPCODE ip @ jump to next instruction
3742 /* 10-11 instructions */
3743
3744
3745/* ------------------------------ */
3746 .balign 128
3747.L_op_int_to_long: /* 0x81 */
3748/* File: arm/op_int_to_long.S */
3749/* File: arm/unopWider.S */
3750 /*
3751 * Generic 32bit-to-64bit unary operation. Provide an "instr" line
3752 * that specifies an instruction that performs "result = op r0", where
3753 * "result" is a 64-bit quantity in r0/r1.
3754 *
3755 * For: int-to-long, int-to-double, float-to-long, float-to-double
3756 */
3757 /* unop vA, vB */
3758 mov r3, rINST, lsr #12 @ r3<- B
buzbee50cf6002016-02-10 08:59:12 -08003759 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08003760 GET_VREG r0, r3 @ r0<- vB
buzbee50cf6002016-02-10 08:59:12 -08003761 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08003762 @ optional op; may set condition codes
buzbee50cf6002016-02-10 08:59:12 -08003763 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08003764 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3765 mov r1, r0, asr #31 @ r0<- op, r0-r3 changed
3766 GET_INST_OPCODE ip @ extract opcode from rINST
3767 stmia r9, {r0-r1} @ vA/vA+1<- r0/r1
3768 GOTO_OPCODE ip @ jump to next instruction
3769 /* 9-10 instructions */
3770
3771
3772/* ------------------------------ */
3773 .balign 128
3774.L_op_int_to_float: /* 0x82 */
3775/* File: arm/op_int_to_float.S */
3776/* File: arm/funop.S */
3777 /*
3778 * Generic 32-bit unary floating-point operation. Provide an "instr"
3779 * line that specifies an instruction that performs "s1 = op s0".
3780 *
3781 * for: int-to-float, float-to-int
3782 */
3783 /* unop vA, vB */
3784 mov r3, rINST, lsr #12 @ r3<- B
3785 mov r9, rINST, lsr #8 @ r9<- A+
3786 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3787 flds s0, [r3] @ s0<- vB
3788 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3789 and r9, r9, #15 @ r9<- A
3790 fsitos s1, s0 @ s1<- op
3791 GET_INST_OPCODE ip @ extract opcode from rINST
3792 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
3793 fsts s1, [r9] @ vA<- s1
3794 GOTO_OPCODE ip @ jump to next instruction
3795
3796
3797/* ------------------------------ */
3798 .balign 128
3799.L_op_int_to_double: /* 0x83 */
3800/* File: arm/op_int_to_double.S */
3801/* File: arm/funopWider.S */
3802 /*
3803 * Generic 32bit-to-64bit floating point unary operation. Provide an
3804 * "instr" line that specifies an instruction that performs "d0 = op s0".
3805 *
3806 * For: int-to-double, float-to-double
3807 */
3808 /* unop vA, vB */
3809 mov r3, rINST, lsr #12 @ r3<- B
3810 mov r9, rINST, lsr #8 @ r9<- A+
3811 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3812 flds s0, [r3] @ s0<- vB
3813 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3814 and r9, r9, #15 @ r9<- A
3815 fsitod d0, s0 @ d0<- op
buzbee50cf6002016-02-10 08:59:12 -08003816 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08003817 GET_INST_OPCODE ip @ extract opcode from rINST
3818 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
3819 fstd d0, [r9] @ vA<- d0
3820 GOTO_OPCODE ip @ jump to next instruction
3821
3822
3823/* ------------------------------ */
3824 .balign 128
3825.L_op_long_to_int: /* 0x84 */
3826/* File: arm/op_long_to_int.S */
3827/* we ignore the high word, making this equivalent to a 32-bit reg move */
3828/* File: arm/op_move.S */
3829 /* for move, move-object, long-to-int */
3830 /* op vA, vB */
3831 mov r1, rINST, lsr #12 @ r1<- B from 15:12
3832 ubfx r0, rINST, #8, #4 @ r0<- A from 11:8
3833 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3834 GET_VREG r2, r1 @ r2<- fp[B]
3835 GET_INST_OPCODE ip @ ip<- opcode from rINST
3836 .if 0
3837 SET_VREG_OBJECT r2, r0 @ fp[A]<- r2
3838 .else
3839 SET_VREG r2, r0 @ fp[A]<- r2
3840 .endif
3841 GOTO_OPCODE ip @ execute next instruction
3842
3843
3844/* ------------------------------ */
3845 .balign 128
3846.L_op_long_to_float: /* 0x85 */
3847/* File: arm/op_long_to_float.S */
3848/* File: arm/unopNarrower.S */
3849 /*
3850 * Generic 64bit-to-32bit unary operation. Provide an "instr" line
3851 * that specifies an instruction that performs "result = op r0/r1", where
3852 * "result" is a 32-bit quantity in r0.
3853 *
3854 * For: long-to-float, double-to-int, double-to-float
3855 *
3856 * (This would work for long-to-int, but that instruction is actually
3857 * an exact match for op_move.)
3858 */
3859 /* unop vA, vB */
3860 mov r3, rINST, lsr #12 @ r3<- B
3861 ubfx r9, rINST, #8, #4 @ r9<- A
3862 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
3863 ldmia r3, {r0-r1} @ r0/r1<- vB/vB+1
3864 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3865 @ optional op; may set condition codes
3866 bl __aeabi_l2f @ r0<- op, r0-r3 changed
3867 GET_INST_OPCODE ip @ extract opcode from rINST
3868 SET_VREG r0, r9 @ vA<- r0
3869 GOTO_OPCODE ip @ jump to next instruction
3870 /* 9-10 instructions */
3871
3872
3873/* ------------------------------ */
3874 .balign 128
3875.L_op_long_to_double: /* 0x86 */
3876/* File: arm/op_long_to_double.S */
3877 /*
3878 * Specialised 64-bit floating point operation.
3879 *
3880 * Note: The result will be returned in d2.
3881 *
3882 * For: long-to-double
3883 */
3884 mov r3, rINST, lsr #12 @ r3<- B
3885 ubfx r9, rINST, #8, #4 @ r9<- A
3886 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
3887 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
3888 vldr d0, [r3] @ d0<- vAA
3889 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3890
3891 vcvt.f64.s32 d1, s1 @ d1<- (double)(vAAh)
3892 vcvt.f64.u32 d2, s0 @ d2<- (double)(vAAl)
3893 vldr d3, constvalop_long_to_double
3894 vmla.f64 d2, d1, d3 @ d2<- vAAh*2^32 + vAAl
3895
3896 GET_INST_OPCODE ip @ extract opcode from rINST
3897 vstr.64 d2, [r9] @ vAA<- d2
3898 GOTO_OPCODE ip @ jump to next instruction
3899
3900 /* literal pool helper */
3901constvalop_long_to_double:
3902 .8byte 0x41f0000000000000
3903
3904/* ------------------------------ */
3905 .balign 128
3906.L_op_float_to_int: /* 0x87 */
3907/* File: arm/op_float_to_int.S */
3908/* File: arm/funop.S */
3909 /*
3910 * Generic 32-bit unary floating-point operation. Provide an "instr"
3911 * line that specifies an instruction that performs "s1 = op s0".
3912 *
3913 * for: int-to-float, float-to-int
3914 */
3915 /* unop vA, vB */
3916 mov r3, rINST, lsr #12 @ r3<- B
3917 mov r9, rINST, lsr #8 @ r9<- A+
3918 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3919 flds s0, [r3] @ s0<- vB
3920 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3921 and r9, r9, #15 @ r9<- A
3922 ftosizs s1, s0 @ s1<- op
3923 GET_INST_OPCODE ip @ extract opcode from rINST
3924 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
3925 fsts s1, [r9] @ vA<- s1
3926 GOTO_OPCODE ip @ jump to next instruction
3927
3928
3929/* ------------------------------ */
3930 .balign 128
3931.L_op_float_to_long: /* 0x88 */
3932/* File: arm/op_float_to_long.S */
3933@include "arm/unopWider.S" {"instr":"bl __aeabi_f2lz"}
3934/* File: arm/unopWider.S */
3935 /*
3936 * Generic 32bit-to-64bit unary operation. Provide an "instr" line
3937 * that specifies an instruction that performs "result = op r0", where
3938 * "result" is a 64-bit quantity in r0/r1.
3939 *
3940 * For: int-to-long, int-to-double, float-to-long, float-to-double
3941 */
3942 /* unop vA, vB */
3943 mov r3, rINST, lsr #12 @ r3<- B
buzbee50cf6002016-02-10 08:59:12 -08003944 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08003945 GET_VREG r0, r3 @ r0<- vB
buzbee50cf6002016-02-10 08:59:12 -08003946 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08003947 @ optional op; may set condition codes
buzbee50cf6002016-02-10 08:59:12 -08003948 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08003949 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3950 bl f2l_doconv @ r0<- op, r0-r3 changed
3951 GET_INST_OPCODE ip @ extract opcode from rINST
3952 stmia r9, {r0-r1} @ vA/vA+1<- r0/r1
3953 GOTO_OPCODE ip @ jump to next instruction
3954 /* 9-10 instructions */
3955
3956
3957
3958/* ------------------------------ */
3959 .balign 128
3960.L_op_float_to_double: /* 0x89 */
3961/* File: arm/op_float_to_double.S */
3962/* File: arm/funopWider.S */
3963 /*
3964 * Generic 32bit-to-64bit floating point unary operation. Provide an
3965 * "instr" line that specifies an instruction that performs "d0 = op s0".
3966 *
3967 * For: int-to-double, float-to-double
3968 */
3969 /* unop vA, vB */
3970 mov r3, rINST, lsr #12 @ r3<- B
3971 mov r9, rINST, lsr #8 @ r9<- A+
3972 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3973 flds s0, [r3] @ s0<- vB
3974 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3975 and r9, r9, #15 @ r9<- A
3976 fcvtds d0, s0 @ d0<- op
buzbee50cf6002016-02-10 08:59:12 -08003977 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08003978 GET_INST_OPCODE ip @ extract opcode from rINST
3979 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
3980 fstd d0, [r9] @ vA<- d0
3981 GOTO_OPCODE ip @ jump to next instruction
3982
3983
3984/* ------------------------------ */
3985 .balign 128
3986.L_op_double_to_int: /* 0x8a */
3987/* File: arm/op_double_to_int.S */
3988/* File: arm/funopNarrower.S */
3989 /*
3990 * Generic 64bit-to-32bit unary floating point operation. Provide an
3991 * "instr" line that specifies an instruction that performs "s0 = op d0".
3992 *
3993 * For: double-to-int, double-to-float
3994 */
3995 /* unop vA, vB */
3996 mov r3, rINST, lsr #12 @ r3<- B
3997 mov r9, rINST, lsr #8 @ r9<- A+
3998 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3999 fldd d0, [r3] @ d0<- vB
4000 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4001 and r9, r9, #15 @ r9<- A
4002 ftosizd s0, d0 @ s0<- op
4003 GET_INST_OPCODE ip @ extract opcode from rINST
4004 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
4005 fsts s0, [r9] @ vA<- s0
4006 GOTO_OPCODE ip @ jump to next instruction
4007
4008
4009/* ------------------------------ */
4010 .balign 128
4011.L_op_double_to_long: /* 0x8b */
4012/* File: arm/op_double_to_long.S */
4013@include "arm/unopWide.S" {"instr":"bl __aeabi_d2lz"}
4014/* File: arm/unopWide.S */
4015 /*
4016 * Generic 64-bit unary operation. Provide an "instr" line that
4017 * specifies an instruction that performs "result = op r0/r1".
4018 * This could be an ARM instruction or a function call.
4019 *
4020 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
4021 */
4022 /* unop vA, vB */
4023 mov r3, rINST, lsr #12 @ r3<- B
buzbee50cf6002016-02-10 08:59:12 -08004024 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08004025 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08004026 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08004027 ldmia r3, {r0-r1} @ r0/r1<- vAA
buzbee50cf6002016-02-10 08:59:12 -08004028 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004029 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4030 @ optional op; may set condition codes
4031 bl d2l_doconv @ r0/r1<- op, r2-r3 changed
4032 GET_INST_OPCODE ip @ extract opcode from rINST
4033 stmia r9, {r0-r1} @ vAA<- r0/r1
4034 GOTO_OPCODE ip @ jump to next instruction
4035 /* 10-11 instructions */
4036
4037
4038
4039/* ------------------------------ */
4040 .balign 128
4041.L_op_double_to_float: /* 0x8c */
4042/* File: arm/op_double_to_float.S */
4043/* File: arm/funopNarrower.S */
4044 /*
4045 * Generic 64bit-to-32bit unary floating point operation. Provide an
4046 * "instr" line that specifies an instruction that performs "s0 = op d0".
4047 *
4048 * For: double-to-int, double-to-float
4049 */
4050 /* unop vA, vB */
4051 mov r3, rINST, lsr #12 @ r3<- B
4052 mov r9, rINST, lsr #8 @ r9<- A+
4053 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
4054 fldd d0, [r3] @ d0<- vB
4055 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4056 and r9, r9, #15 @ r9<- A
4057 fcvtsd s0, d0 @ s0<- op
4058 GET_INST_OPCODE ip @ extract opcode from rINST
4059 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
4060 fsts s0, [r9] @ vA<- s0
4061 GOTO_OPCODE ip @ jump to next instruction
4062
4063
4064/* ------------------------------ */
4065 .balign 128
4066.L_op_int_to_byte: /* 0x8d */
4067/* File: arm/op_int_to_byte.S */
4068/* File: arm/unop.S */
4069 /*
4070 * Generic 32-bit unary operation. Provide an "instr" line that
4071 * specifies an instruction that performs "result = op r0".
4072 * This could be an ARM instruction or a function call.
4073 *
4074 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4075 * int-to-byte, int-to-char, int-to-short
4076 */
4077 /* unop vA, vB */
4078 mov r3, rINST, lsr #12 @ r3<- B
4079 ubfx r9, rINST, #8, #4 @ r9<- A
4080 GET_VREG r0, r3 @ r0<- vB
4081 @ optional op; may set condition codes
4082 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4083 sxtb r0, r0 @ r0<- op, r0-r3 changed
4084 GET_INST_OPCODE ip @ extract opcode from rINST
4085 SET_VREG r0, r9 @ vAA<- r0
4086 GOTO_OPCODE ip @ jump to next instruction
4087 /* 8-9 instructions */
4088
4089
4090/* ------------------------------ */
4091 .balign 128
4092.L_op_int_to_char: /* 0x8e */
4093/* File: arm/op_int_to_char.S */
4094/* File: arm/unop.S */
4095 /*
4096 * Generic 32-bit unary operation. Provide an "instr" line that
4097 * specifies an instruction that performs "result = op r0".
4098 * This could be an ARM instruction or a function call.
4099 *
4100 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4101 * int-to-byte, int-to-char, int-to-short
4102 */
4103 /* unop vA, vB */
4104 mov r3, rINST, lsr #12 @ r3<- B
4105 ubfx r9, rINST, #8, #4 @ r9<- A
4106 GET_VREG r0, r3 @ r0<- vB
4107 @ optional op; may set condition codes
4108 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4109 uxth r0, r0 @ r0<- op, r0-r3 changed
4110 GET_INST_OPCODE ip @ extract opcode from rINST
4111 SET_VREG r0, r9 @ vAA<- r0
4112 GOTO_OPCODE ip @ jump to next instruction
4113 /* 8-9 instructions */
4114
4115
4116/* ------------------------------ */
4117 .balign 128
4118.L_op_int_to_short: /* 0x8f */
4119/* File: arm/op_int_to_short.S */
4120/* File: arm/unop.S */
4121 /*
4122 * Generic 32-bit unary operation. Provide an "instr" line that
4123 * specifies an instruction that performs "result = op r0".
4124 * This could be an ARM instruction or a function call.
4125 *
4126 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4127 * int-to-byte, int-to-char, int-to-short
4128 */
4129 /* unop vA, vB */
4130 mov r3, rINST, lsr #12 @ r3<- B
4131 ubfx r9, rINST, #8, #4 @ r9<- A
4132 GET_VREG r0, r3 @ r0<- vB
4133 @ optional op; may set condition codes
4134 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4135 sxth r0, r0 @ r0<- op, r0-r3 changed
4136 GET_INST_OPCODE ip @ extract opcode from rINST
4137 SET_VREG r0, r9 @ vAA<- r0
4138 GOTO_OPCODE ip @ jump to next instruction
4139 /* 8-9 instructions */
4140
4141
4142/* ------------------------------ */
4143 .balign 128
4144.L_op_add_int: /* 0x90 */
4145/* File: arm/op_add_int.S */
4146/* File: arm/binop.S */
4147 /*
4148 * Generic 32-bit binary operation. Provide an "instr" line that
4149 * specifies an instruction that performs "result = r0 op r1".
4150 * This could be an ARM instruction or a function call. (If the result
4151 * comes back in a register other than r0, you can override "result".)
4152 *
4153 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4154 * vCC (r1). Useful for integer division and modulus. Note that we
4155 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4156 * handles it correctly.
4157 *
4158 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4159 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4160 * mul-float, div-float, rem-float
4161 */
4162 /* binop vAA, vBB, vCC */
4163 FETCH r0, 1 @ r0<- CCBB
4164 mov r9, rINST, lsr #8 @ r9<- AA
4165 mov r3, r0, lsr #8 @ r3<- CC
4166 and r2, r0, #255 @ r2<- BB
4167 GET_VREG r1, r3 @ r1<- vCC
4168 GET_VREG r0, r2 @ r0<- vBB
4169 .if 0
4170 cmp r1, #0 @ is second operand zero?
4171 beq common_errDivideByZero
4172 .endif
4173
4174 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4175 @ optional op; may set condition codes
4176 add r0, r0, r1 @ r0<- op, r0-r3 changed
4177 GET_INST_OPCODE ip @ extract opcode from rINST
4178 SET_VREG r0, r9 @ vAA<- r0
4179 GOTO_OPCODE ip @ jump to next instruction
4180 /* 11-14 instructions */
4181
4182
4183/* ------------------------------ */
4184 .balign 128
4185.L_op_sub_int: /* 0x91 */
4186/* File: arm/op_sub_int.S */
4187/* File: arm/binop.S */
4188 /*
4189 * Generic 32-bit binary operation. Provide an "instr" line that
4190 * specifies an instruction that performs "result = r0 op r1".
4191 * This could be an ARM instruction or a function call. (If the result
4192 * comes back in a register other than r0, you can override "result".)
4193 *
4194 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4195 * vCC (r1). Useful for integer division and modulus. Note that we
4196 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4197 * handles it correctly.
4198 *
4199 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4200 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4201 * mul-float, div-float, rem-float
4202 */
4203 /* binop vAA, vBB, vCC */
4204 FETCH r0, 1 @ r0<- CCBB
4205 mov r9, rINST, lsr #8 @ r9<- AA
4206 mov r3, r0, lsr #8 @ r3<- CC
4207 and r2, r0, #255 @ r2<- BB
4208 GET_VREG r1, r3 @ r1<- vCC
4209 GET_VREG r0, r2 @ r0<- vBB
4210 .if 0
4211 cmp r1, #0 @ is second operand zero?
4212 beq common_errDivideByZero
4213 .endif
4214
4215 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4216 @ optional op; may set condition codes
4217 sub r0, r0, r1 @ r0<- op, r0-r3 changed
4218 GET_INST_OPCODE ip @ extract opcode from rINST
4219 SET_VREG r0, r9 @ vAA<- r0
4220 GOTO_OPCODE ip @ jump to next instruction
4221 /* 11-14 instructions */
4222
4223
4224/* ------------------------------ */
4225 .balign 128
4226.L_op_mul_int: /* 0x92 */
4227/* File: arm/op_mul_int.S */
4228/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
4229/* File: arm/binop.S */
4230 /*
4231 * Generic 32-bit binary operation. Provide an "instr" line that
4232 * specifies an instruction that performs "result = r0 op r1".
4233 * This could be an ARM instruction or a function call. (If the result
4234 * comes back in a register other than r0, you can override "result".)
4235 *
4236 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4237 * vCC (r1). Useful for integer division and modulus. Note that we
4238 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4239 * handles it correctly.
4240 *
4241 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4242 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4243 * mul-float, div-float, rem-float
4244 */
4245 /* binop vAA, vBB, vCC */
4246 FETCH r0, 1 @ r0<- CCBB
4247 mov r9, rINST, lsr #8 @ r9<- AA
4248 mov r3, r0, lsr #8 @ r3<- CC
4249 and r2, r0, #255 @ r2<- BB
4250 GET_VREG r1, r3 @ r1<- vCC
4251 GET_VREG r0, r2 @ r0<- vBB
4252 .if 0
4253 cmp r1, #0 @ is second operand zero?
4254 beq common_errDivideByZero
4255 .endif
4256
4257 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4258 @ optional op; may set condition codes
4259 mul r0, r1, r0 @ r0<- op, r0-r3 changed
4260 GET_INST_OPCODE ip @ extract opcode from rINST
4261 SET_VREG r0, r9 @ vAA<- r0
4262 GOTO_OPCODE ip @ jump to next instruction
4263 /* 11-14 instructions */
4264
4265
4266/* ------------------------------ */
4267 .balign 128
4268.L_op_div_int: /* 0x93 */
4269/* File: arm/op_div_int.S */
4270 /*
4271 * Specialized 32-bit binary operation
4272 *
4273 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
4274 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
4275 * ARMv7 CPUs that have hardware division support).
4276 *
4277 * div-int
4278 *
4279 */
4280 FETCH r0, 1 @ r0<- CCBB
4281 mov r9, rINST, lsr #8 @ r9<- AA
4282 mov r3, r0, lsr #8 @ r3<- CC
4283 and r2, r0, #255 @ r2<- BB
4284 GET_VREG r1, r3 @ r1<- vCC
4285 GET_VREG r0, r2 @ r0<- vBB
4286 cmp r1, #0 @ is second operand zero?
4287 beq common_errDivideByZero
4288
4289 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4290#ifdef __ARM_ARCH_EXT_IDIV__
4291 sdiv r0, r0, r1 @ r0<- op
4292#else
4293 bl __aeabi_idiv @ r0<- op, r0-r3 changed
4294#endif
4295 GET_INST_OPCODE ip @ extract opcode from rINST
4296 SET_VREG r0, r9 @ vAA<- r0
4297 GOTO_OPCODE ip @ jump to next instruction
4298 /* 11-14 instructions */
4299
4300/* ------------------------------ */
4301 .balign 128
4302.L_op_rem_int: /* 0x94 */
4303/* File: arm/op_rem_int.S */
4304 /*
4305 * Specialized 32-bit binary operation
4306 *
4307 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
4308 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
4309 * ARMv7 CPUs that have hardware division support).
4310 *
4311 * NOTE: idivmod returns quotient in r0 and remainder in r1
4312 *
4313 * rem-int
4314 *
4315 */
4316 FETCH r0, 1 @ r0<- CCBB
4317 mov r9, rINST, lsr #8 @ r9<- AA
4318 mov r3, r0, lsr #8 @ r3<- CC
4319 and r2, r0, #255 @ r2<- BB
4320 GET_VREG r1, r3 @ r1<- vCC
4321 GET_VREG r0, r2 @ r0<- vBB
4322 cmp r1, #0 @ is second operand zero?
4323 beq common_errDivideByZero
4324
4325 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4326#ifdef __ARM_ARCH_EXT_IDIV__
4327 sdiv r2, r0, r1
4328 mls r1, r1, r2, r0 @ r1<- op, r0-r2 changed
4329#else
4330 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
4331#endif
4332 GET_INST_OPCODE ip @ extract opcode from rINST
4333 SET_VREG r1, r9 @ vAA<- r1
4334 GOTO_OPCODE ip @ jump to next instruction
4335 /* 11-14 instructions */
4336
4337/* ------------------------------ */
4338 .balign 128
4339.L_op_and_int: /* 0x95 */
4340/* File: arm/op_and_int.S */
4341/* File: arm/binop.S */
4342 /*
4343 * Generic 32-bit binary operation. Provide an "instr" line that
4344 * specifies an instruction that performs "result = r0 op r1".
4345 * This could be an ARM instruction or a function call. (If the result
4346 * comes back in a register other than r0, you can override "result".)
4347 *
4348 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4349 * vCC (r1). Useful for integer division and modulus. Note that we
4350 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4351 * handles it correctly.
4352 *
4353 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4354 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4355 * mul-float, div-float, rem-float
4356 */
4357 /* binop vAA, vBB, vCC */
4358 FETCH r0, 1 @ r0<- CCBB
4359 mov r9, rINST, lsr #8 @ r9<- AA
4360 mov r3, r0, lsr #8 @ r3<- CC
4361 and r2, r0, #255 @ r2<- BB
4362 GET_VREG r1, r3 @ r1<- vCC
4363 GET_VREG r0, r2 @ r0<- vBB
4364 .if 0
4365 cmp r1, #0 @ is second operand zero?
4366 beq common_errDivideByZero
4367 .endif
4368
4369 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4370 @ optional op; may set condition codes
4371 and r0, r0, r1 @ r0<- op, r0-r3 changed
4372 GET_INST_OPCODE ip @ extract opcode from rINST
4373 SET_VREG r0, r9 @ vAA<- r0
4374 GOTO_OPCODE ip @ jump to next instruction
4375 /* 11-14 instructions */
4376
4377
4378/* ------------------------------ */
4379 .balign 128
4380.L_op_or_int: /* 0x96 */
4381/* File: arm/op_or_int.S */
4382/* File: arm/binop.S */
4383 /*
4384 * Generic 32-bit binary operation. Provide an "instr" line that
4385 * specifies an instruction that performs "result = r0 op r1".
4386 * This could be an ARM instruction or a function call. (If the result
4387 * comes back in a register other than r0, you can override "result".)
4388 *
4389 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4390 * vCC (r1). Useful for integer division and modulus. Note that we
4391 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4392 * handles it correctly.
4393 *
4394 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4395 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4396 * mul-float, div-float, rem-float
4397 */
4398 /* binop vAA, vBB, vCC */
4399 FETCH r0, 1 @ r0<- CCBB
4400 mov r9, rINST, lsr #8 @ r9<- AA
4401 mov r3, r0, lsr #8 @ r3<- CC
4402 and r2, r0, #255 @ r2<- BB
4403 GET_VREG r1, r3 @ r1<- vCC
4404 GET_VREG r0, r2 @ r0<- vBB
4405 .if 0
4406 cmp r1, #0 @ is second operand zero?
4407 beq common_errDivideByZero
4408 .endif
4409
4410 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4411 @ optional op; may set condition codes
4412 orr r0, r0, r1 @ r0<- op, r0-r3 changed
4413 GET_INST_OPCODE ip @ extract opcode from rINST
4414 SET_VREG r0, r9 @ vAA<- r0
4415 GOTO_OPCODE ip @ jump to next instruction
4416 /* 11-14 instructions */
4417
4418
4419/* ------------------------------ */
4420 .balign 128
4421.L_op_xor_int: /* 0x97 */
4422/* File: arm/op_xor_int.S */
4423/* File: arm/binop.S */
4424 /*
4425 * Generic 32-bit binary operation. Provide an "instr" line that
4426 * specifies an instruction that performs "result = r0 op r1".
4427 * This could be an ARM instruction or a function call. (If the result
4428 * comes back in a register other than r0, you can override "result".)
4429 *
4430 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4431 * vCC (r1). Useful for integer division and modulus. Note that we
4432 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4433 * handles it correctly.
4434 *
4435 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4436 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4437 * mul-float, div-float, rem-float
4438 */
4439 /* binop vAA, vBB, vCC */
4440 FETCH r0, 1 @ r0<- CCBB
4441 mov r9, rINST, lsr #8 @ r9<- AA
4442 mov r3, r0, lsr #8 @ r3<- CC
4443 and r2, r0, #255 @ r2<- BB
4444 GET_VREG r1, r3 @ r1<- vCC
4445 GET_VREG r0, r2 @ r0<- vBB
4446 .if 0
4447 cmp r1, #0 @ is second operand zero?
4448 beq common_errDivideByZero
4449 .endif
4450
4451 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4452 @ optional op; may set condition codes
4453 eor r0, r0, r1 @ r0<- op, r0-r3 changed
4454 GET_INST_OPCODE ip @ extract opcode from rINST
4455 SET_VREG r0, r9 @ vAA<- r0
4456 GOTO_OPCODE ip @ jump to next instruction
4457 /* 11-14 instructions */
4458
4459
4460/* ------------------------------ */
4461 .balign 128
4462.L_op_shl_int: /* 0x98 */
4463/* File: arm/op_shl_int.S */
4464/* File: arm/binop.S */
4465 /*
4466 * Generic 32-bit binary operation. Provide an "instr" line that
4467 * specifies an instruction that performs "result = r0 op r1".
4468 * This could be an ARM instruction or a function call. (If the result
4469 * comes back in a register other than r0, you can override "result".)
4470 *
4471 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4472 * vCC (r1). Useful for integer division and modulus. Note that we
4473 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4474 * handles it correctly.
4475 *
4476 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4477 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4478 * mul-float, div-float, rem-float
4479 */
4480 /* binop vAA, vBB, vCC */
4481 FETCH r0, 1 @ r0<- CCBB
4482 mov r9, rINST, lsr #8 @ r9<- AA
4483 mov r3, r0, lsr #8 @ r3<- CC
4484 and r2, r0, #255 @ r2<- BB
4485 GET_VREG r1, r3 @ r1<- vCC
4486 GET_VREG r0, r2 @ r0<- vBB
4487 .if 0
4488 cmp r1, #0 @ is second operand zero?
4489 beq common_errDivideByZero
4490 .endif
4491
4492 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4493 and r1, r1, #31 @ optional op; may set condition codes
4494 mov r0, r0, asl r1 @ r0<- op, r0-r3 changed
4495 GET_INST_OPCODE ip @ extract opcode from rINST
4496 SET_VREG r0, r9 @ vAA<- r0
4497 GOTO_OPCODE ip @ jump to next instruction
4498 /* 11-14 instructions */
4499
4500
4501/* ------------------------------ */
4502 .balign 128
4503.L_op_shr_int: /* 0x99 */
4504/* File: arm/op_shr_int.S */
4505/* File: arm/binop.S */
4506 /*
4507 * Generic 32-bit binary operation. Provide an "instr" line that
4508 * specifies an instruction that performs "result = r0 op r1".
4509 * This could be an ARM instruction or a function call. (If the result
4510 * comes back in a register other than r0, you can override "result".)
4511 *
4512 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4513 * vCC (r1). Useful for integer division and modulus. Note that we
4514 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4515 * handles it correctly.
4516 *
4517 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4518 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4519 * mul-float, div-float, rem-float
4520 */
4521 /* binop vAA, vBB, vCC */
4522 FETCH r0, 1 @ r0<- CCBB
4523 mov r9, rINST, lsr #8 @ r9<- AA
4524 mov r3, r0, lsr #8 @ r3<- CC
4525 and r2, r0, #255 @ r2<- BB
4526 GET_VREG r1, r3 @ r1<- vCC
4527 GET_VREG r0, r2 @ r0<- vBB
4528 .if 0
4529 cmp r1, #0 @ is second operand zero?
4530 beq common_errDivideByZero
4531 .endif
4532
4533 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4534 and r1, r1, #31 @ optional op; may set condition codes
4535 mov r0, r0, asr r1 @ r0<- op, r0-r3 changed
4536 GET_INST_OPCODE ip @ extract opcode from rINST
4537 SET_VREG r0, r9 @ vAA<- r0
4538 GOTO_OPCODE ip @ jump to next instruction
4539 /* 11-14 instructions */
4540
4541
4542/* ------------------------------ */
4543 .balign 128
4544.L_op_ushr_int: /* 0x9a */
4545/* File: arm/op_ushr_int.S */
4546/* File: arm/binop.S */
4547 /*
4548 * Generic 32-bit binary operation. Provide an "instr" line that
4549 * specifies an instruction that performs "result = r0 op r1".
4550 * This could be an ARM instruction or a function call. (If the result
4551 * comes back in a register other than r0, you can override "result".)
4552 *
4553 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4554 * vCC (r1). Useful for integer division and modulus. Note that we
4555 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4556 * handles it correctly.
4557 *
4558 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4559 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4560 * mul-float, div-float, rem-float
4561 */
4562 /* binop vAA, vBB, vCC */
4563 FETCH r0, 1 @ r0<- CCBB
4564 mov r9, rINST, lsr #8 @ r9<- AA
4565 mov r3, r0, lsr #8 @ r3<- CC
4566 and r2, r0, #255 @ r2<- BB
4567 GET_VREG r1, r3 @ r1<- vCC
4568 GET_VREG r0, r2 @ r0<- vBB
4569 .if 0
4570 cmp r1, #0 @ is second operand zero?
4571 beq common_errDivideByZero
4572 .endif
4573
4574 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4575 and r1, r1, #31 @ optional op; may set condition codes
4576 mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed
4577 GET_INST_OPCODE ip @ extract opcode from rINST
4578 SET_VREG r0, r9 @ vAA<- r0
4579 GOTO_OPCODE ip @ jump to next instruction
4580 /* 11-14 instructions */
4581
4582
4583/* ------------------------------ */
4584 .balign 128
4585.L_op_add_long: /* 0x9b */
4586/* File: arm/op_add_long.S */
4587/* File: arm/binopWide.S */
4588 /*
4589 * Generic 64-bit binary operation. Provide an "instr" line that
4590 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4591 * This could be an ARM instruction or a function call. (If the result
4592 * comes back in a register other than r0, you can override "result".)
4593 *
4594 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4595 * vCC (r1). Useful for integer division and modulus.
4596 *
4597 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4598 * xor-long, add-double, sub-double, mul-double, div-double,
4599 * rem-double
4600 *
4601 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4602 */
4603 /* binop vAA, vBB, vCC */
4604 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08004605 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08004606 and r2, r0, #255 @ r2<- BB
4607 mov r3, r0, lsr #8 @ r3<- CC
buzbee50cf6002016-02-10 08:59:12 -08004608 add r9, rFP, rINST, lsl #2 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08004609 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4610 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4611 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4612 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4613 .if 0
4614 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4615 beq common_errDivideByZero
4616 .endif
buzbee50cf6002016-02-10 08:59:12 -08004617 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004618 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08004619 adds r0, r0, r2 @ optional op; may set condition codes
4620 adc r1, r1, r3 @ result<- op, r0-r3 changed
4621 GET_INST_OPCODE ip @ extract opcode from rINST
4622 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4623 GOTO_OPCODE ip @ jump to next instruction
4624 /* 14-17 instructions */
4625
4626
4627/* ------------------------------ */
4628 .balign 128
4629.L_op_sub_long: /* 0x9c */
4630/* File: arm/op_sub_long.S */
4631/* File: arm/binopWide.S */
4632 /*
4633 * Generic 64-bit binary operation. Provide an "instr" line that
4634 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4635 * This could be an ARM instruction or a function call. (If the result
4636 * comes back in a register other than r0, you can override "result".)
4637 *
4638 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4639 * vCC (r1). Useful for integer division and modulus.
4640 *
4641 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4642 * xor-long, add-double, sub-double, mul-double, div-double,
4643 * rem-double
4644 *
4645 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4646 */
4647 /* binop vAA, vBB, vCC */
4648 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08004649 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08004650 and r2, r0, #255 @ r2<- BB
4651 mov r3, r0, lsr #8 @ r3<- CC
buzbee50cf6002016-02-10 08:59:12 -08004652 add r9, rFP, rINST, lsl #2 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08004653 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4654 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4655 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4656 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4657 .if 0
4658 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4659 beq common_errDivideByZero
4660 .endif
buzbee50cf6002016-02-10 08:59:12 -08004661 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004662 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08004663 subs r0, r0, r2 @ optional op; may set condition codes
4664 sbc r1, r1, r3 @ result<- op, r0-r3 changed
4665 GET_INST_OPCODE ip @ extract opcode from rINST
4666 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4667 GOTO_OPCODE ip @ jump to next instruction
4668 /* 14-17 instructions */
4669
4670
4671/* ------------------------------ */
4672 .balign 128
4673.L_op_mul_long: /* 0x9d */
4674/* File: arm/op_mul_long.S */
4675 /*
4676 * Signed 64-bit integer multiply.
4677 *
4678 * Consider WXxYZ (r1r0 x r3r2) with a long multiply:
4679 * WX
4680 * x YZ
4681 * --------
4682 * ZW ZX
4683 * YW YX
4684 *
4685 * The low word of the result holds ZX, the high word holds
4686 * (ZW+YX) + (the high overflow from ZX). YW doesn't matter because
4687 * it doesn't fit in the low 64 bits.
4688 *
4689 * Unlike most ARM math operations, multiply instructions have
4690 * restrictions on using the same register more than once (Rd and Rm
4691 * cannot be the same).
4692 */
4693 /* mul-long vAA, vBB, vCC */
4694 FETCH r0, 1 @ r0<- CCBB
4695 and r2, r0, #255 @ r2<- BB
4696 mov r3, r0, lsr #8 @ r3<- CC
4697 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4698 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4699 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4700 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4701 mul ip, r2, r1 @ ip<- ZxW
4702 umull r9, r10, r2, r0 @ r9/r10 <- ZxX
4703 mla r2, r0, r3, ip @ r2<- YxX + (ZxW)
4704 mov r0, rINST, lsr #8 @ r0<- AA
4705 add r10, r2, r10 @ r10<- r10 + low(ZxW + (YxX))
4706 add r0, rFP, r0, lsl #2 @ r0<- &fp[AA]
4707 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4708 GET_INST_OPCODE ip @ extract opcode from rINST
4709 stmia r0, {r9-r10} @ vAA/vAA+1<- r9/r10
4710 GOTO_OPCODE ip @ jump to next instruction
4711
4712/* ------------------------------ */
4713 .balign 128
4714.L_op_div_long: /* 0x9e */
4715/* File: arm/op_div_long.S */
4716/* File: arm/binopWide.S */
4717 /*
4718 * Generic 64-bit binary operation. Provide an "instr" line that
4719 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4720 * This could be an ARM instruction or a function call. (If the result
4721 * comes back in a register other than r0, you can override "result".)
4722 *
4723 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4724 * vCC (r1). Useful for integer division and modulus.
4725 *
4726 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4727 * xor-long, add-double, sub-double, mul-double, div-double,
4728 * rem-double
4729 *
4730 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4731 */
4732 /* binop vAA, vBB, vCC */
4733 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08004734 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08004735 and r2, r0, #255 @ r2<- BB
4736 mov r3, r0, lsr #8 @ r3<- CC
buzbee50cf6002016-02-10 08:59:12 -08004737 add r9, rFP, rINST, lsl #2 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08004738 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4739 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4740 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4741 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4742 .if 1
4743 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4744 beq common_errDivideByZero
4745 .endif
buzbee50cf6002016-02-10 08:59:12 -08004746 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004747 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08004748 @ optional op; may set condition codes
4749 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
4750 GET_INST_OPCODE ip @ extract opcode from rINST
4751 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4752 GOTO_OPCODE ip @ jump to next instruction
4753 /* 14-17 instructions */
4754
4755
4756/* ------------------------------ */
4757 .balign 128
4758.L_op_rem_long: /* 0x9f */
4759/* File: arm/op_rem_long.S */
4760/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
4761/* File: arm/binopWide.S */
4762 /*
4763 * Generic 64-bit binary operation. Provide an "instr" line that
4764 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4765 * This could be an ARM instruction or a function call. (If the result
4766 * comes back in a register other than r0, you can override "result".)
4767 *
4768 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4769 * vCC (r1). Useful for integer division and modulus.
4770 *
4771 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4772 * xor-long, add-double, sub-double, mul-double, div-double,
4773 * rem-double
4774 *
4775 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4776 */
4777 /* binop vAA, vBB, vCC */
4778 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08004779 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08004780 and r2, r0, #255 @ r2<- BB
4781 mov r3, r0, lsr #8 @ r3<- CC
buzbee50cf6002016-02-10 08:59:12 -08004782 add r9, rFP, rINST, lsl #2 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08004783 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4784 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4785 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4786 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4787 .if 1
4788 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4789 beq common_errDivideByZero
4790 .endif
buzbee50cf6002016-02-10 08:59:12 -08004791 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004792 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08004793 @ optional op; may set condition codes
4794 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
4795 GET_INST_OPCODE ip @ extract opcode from rINST
4796 stmia r9, {r2,r3} @ vAA/vAA+1<- r2/r3
4797 GOTO_OPCODE ip @ jump to next instruction
4798 /* 14-17 instructions */
4799
4800
4801/* ------------------------------ */
4802 .balign 128
4803.L_op_and_long: /* 0xa0 */
4804/* File: arm/op_and_long.S */
4805/* File: arm/binopWide.S */
4806 /*
4807 * Generic 64-bit binary operation. Provide an "instr" line that
4808 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4809 * This could be an ARM instruction or a function call. (If the result
4810 * comes back in a register other than r0, you can override "result".)
4811 *
4812 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4813 * vCC (r1). Useful for integer division and modulus.
4814 *
4815 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4816 * xor-long, add-double, sub-double, mul-double, div-double,
4817 * rem-double
4818 *
4819 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4820 */
4821 /* binop vAA, vBB, vCC */
4822 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08004823 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08004824 and r2, r0, #255 @ r2<- BB
4825 mov r3, r0, lsr #8 @ r3<- CC
buzbee50cf6002016-02-10 08:59:12 -08004826 add r9, rFP, rINST, lsl #2 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08004827 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4828 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4829 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4830 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4831 .if 0
4832 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4833 beq common_errDivideByZero
4834 .endif
buzbee50cf6002016-02-10 08:59:12 -08004835 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004836 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08004837 and r0, r0, r2 @ optional op; may set condition codes
4838 and r1, r1, r3 @ result<- op, r0-r3 changed
4839 GET_INST_OPCODE ip @ extract opcode from rINST
4840 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4841 GOTO_OPCODE ip @ jump to next instruction
4842 /* 14-17 instructions */
4843
4844
4845/* ------------------------------ */
4846 .balign 128
4847.L_op_or_long: /* 0xa1 */
4848/* File: arm/op_or_long.S */
4849/* File: arm/binopWide.S */
4850 /*
4851 * Generic 64-bit binary operation. Provide an "instr" line that
4852 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4853 * This could be an ARM instruction or a function call. (If the result
4854 * comes back in a register other than r0, you can override "result".)
4855 *
4856 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4857 * vCC (r1). Useful for integer division and modulus.
4858 *
4859 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4860 * xor-long, add-double, sub-double, mul-double, div-double,
4861 * rem-double
4862 *
4863 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4864 */
4865 /* binop vAA, vBB, vCC */
4866 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08004867 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08004868 and r2, r0, #255 @ r2<- BB
4869 mov r3, r0, lsr #8 @ r3<- CC
buzbee50cf6002016-02-10 08:59:12 -08004870 add r9, rFP, rINST, lsl #2 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08004871 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4872 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4873 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4874 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4875 .if 0
4876 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4877 beq common_errDivideByZero
4878 .endif
buzbee50cf6002016-02-10 08:59:12 -08004879 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004880 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08004881 orr r0, r0, r2 @ optional op; may set condition codes
4882 orr r1, r1, r3 @ result<- op, r0-r3 changed
4883 GET_INST_OPCODE ip @ extract opcode from rINST
4884 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4885 GOTO_OPCODE ip @ jump to next instruction
4886 /* 14-17 instructions */
4887
4888
4889/* ------------------------------ */
4890 .balign 128
4891.L_op_xor_long: /* 0xa2 */
4892/* File: arm/op_xor_long.S */
4893/* File: arm/binopWide.S */
4894 /*
4895 * Generic 64-bit binary operation. Provide an "instr" line that
4896 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4897 * This could be an ARM instruction or a function call. (If the result
4898 * comes back in a register other than r0, you can override "result".)
4899 *
4900 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4901 * vCC (r1). Useful for integer division and modulus.
4902 *
4903 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4904 * xor-long, add-double, sub-double, mul-double, div-double,
4905 * rem-double
4906 *
4907 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4908 */
4909 /* binop vAA, vBB, vCC */
4910 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08004911 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08004912 and r2, r0, #255 @ r2<- BB
4913 mov r3, r0, lsr #8 @ r3<- CC
buzbee50cf6002016-02-10 08:59:12 -08004914 add r9, rFP, rINST, lsl #2 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08004915 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4916 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4917 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4918 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4919 .if 0
4920 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4921 beq common_errDivideByZero
4922 .endif
buzbee50cf6002016-02-10 08:59:12 -08004923 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08004924 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08004925 eor r0, r0, r2 @ optional op; may set condition codes
4926 eor r1, r1, r3 @ result<- op, r0-r3 changed
4927 GET_INST_OPCODE ip @ extract opcode from rINST
4928 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4929 GOTO_OPCODE ip @ jump to next instruction
4930 /* 14-17 instructions */
4931
4932
4933/* ------------------------------ */
4934 .balign 128
4935.L_op_shl_long: /* 0xa3 */
4936/* File: arm/op_shl_long.S */
4937 /*
4938 * Long integer shift. This is different from the generic 32/64-bit
4939 * binary operations because vAA/vBB are 64-bit but vCC (the shift
4940 * distance) is 32-bit. Also, Dalvik requires us to mask off the low
4941 * 6 bits of the shift distance.
4942 */
4943 /* shl-long vAA, vBB, vCC */
4944 FETCH r0, 1 @ r0<- CCBB
4945 mov r9, rINST, lsr #8 @ r9<- AA
4946 and r3, r0, #255 @ r3<- BB
4947 mov r0, r0, lsr #8 @ r0<- CC
4948 add r3, rFP, r3, lsl #2 @ r3<- &fp[BB]
4949 GET_VREG r2, r0 @ r2<- vCC
4950 ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1
4951 and r2, r2, #63 @ r2<- r2 & 0x3f
4952 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4953
4954 mov r1, r1, asl r2 @ r1<- r1 << r2
4955 rsb r3, r2, #32 @ r3<- 32 - r2
4956 orr r1, r1, r0, lsr r3 @ r1<- r1 | (r0 << (32-r2))
4957 subs ip, r2, #32 @ ip<- r2 - 32
4958 movpl r1, r0, asl ip @ if r2 >= 32, r1<- r0 << (r2-32)
4959 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4960 mov r0, r0, asl r2 @ r0<- r0 << r2
4961 GET_INST_OPCODE ip @ extract opcode from rINST
4962 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
4963 GOTO_OPCODE ip @ jump to next instruction
4964
4965/* ------------------------------ */
4966 .balign 128
4967.L_op_shr_long: /* 0xa4 */
4968/* File: arm/op_shr_long.S */
4969 /*
4970 * Long integer shift. This is different from the generic 32/64-bit
4971 * binary operations because vAA/vBB are 64-bit but vCC (the shift
4972 * distance) is 32-bit. Also, Dalvik requires us to mask off the low
4973 * 6 bits of the shift distance.
4974 */
4975 /* shr-long vAA, vBB, vCC */
4976 FETCH r0, 1 @ r0<- CCBB
4977 mov r9, rINST, lsr #8 @ r9<- AA
4978 and r3, r0, #255 @ r3<- BB
4979 mov r0, r0, lsr #8 @ r0<- CC
4980 add r3, rFP, r3, lsl #2 @ r3<- &fp[BB]
4981 GET_VREG r2, r0 @ r2<- vCC
4982 ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1
4983 and r2, r2, #63 @ r0<- r0 & 0x3f
4984 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4985
4986 mov r0, r0, lsr r2 @ r0<- r2 >> r2
4987 rsb r3, r2, #32 @ r3<- 32 - r2
4988 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
4989 subs ip, r2, #32 @ ip<- r2 - 32
4990 movpl r0, r1, asr ip @ if r2 >= 32, r0<-r1 >> (r2-32)
4991 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4992 mov r1, r1, asr r2 @ r1<- r1 >> r2
4993 GET_INST_OPCODE ip @ extract opcode from rINST
4994 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
4995 GOTO_OPCODE ip @ jump to next instruction
4996
4997/* ------------------------------ */
4998 .balign 128
4999.L_op_ushr_long: /* 0xa5 */
5000/* File: arm/op_ushr_long.S */
5001 /*
5002 * Long integer shift. This is different from the generic 32/64-bit
5003 * binary operations because vAA/vBB are 64-bit but vCC (the shift
5004 * distance) is 32-bit. Also, Dalvik requires us to mask off the low
5005 * 6 bits of the shift distance.
5006 */
5007 /* ushr-long vAA, vBB, vCC */
5008 FETCH r0, 1 @ r0<- CCBB
5009 mov r9, rINST, lsr #8 @ r9<- AA
5010 and r3, r0, #255 @ r3<- BB
5011 mov r0, r0, lsr #8 @ r0<- CC
5012 add r3, rFP, r3, lsl #2 @ r3<- &fp[BB]
5013 GET_VREG r2, r0 @ r2<- vCC
5014 ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1
5015 and r2, r2, #63 @ r0<- r0 & 0x3f
5016 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
5017
5018 mov r0, r0, lsr r2 @ r0<- r2 >> r2
5019 rsb r3, r2, #32 @ r3<- 32 - r2
5020 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
5021 subs ip, r2, #32 @ ip<- r2 - 32
5022 movpl r0, r1, lsr ip @ if r2 >= 32, r0<-r1 >>> (r2-32)
5023 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5024 mov r1, r1, lsr r2 @ r1<- r1 >>> r2
5025 GET_INST_OPCODE ip @ extract opcode from rINST
5026 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
5027 GOTO_OPCODE ip @ jump to next instruction
5028
5029/* ------------------------------ */
5030 .balign 128
5031.L_op_add_float: /* 0xa6 */
5032/* File: arm/op_add_float.S */
5033/* File: arm/fbinop.S */
5034 /*
5035 * Generic 32-bit floating-point operation. Provide an "instr" line that
5036 * specifies an instruction that performs "s2 = s0 op s1". Because we
5037 * use the "softfp" ABI, this must be an instruction, not a function call.
5038 *
5039 * For: add-float, sub-float, mul-float, div-float
5040 */
5041 /* floatop vAA, vBB, vCC */
5042 FETCH r0, 1 @ r0<- CCBB
5043 mov r9, rINST, lsr #8 @ r9<- AA
5044 mov r3, r0, lsr #8 @ r3<- CC
5045 and r2, r0, #255 @ r2<- BB
5046 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5047 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5048 flds s1, [r3] @ s1<- vCC
5049 flds s0, [r2] @ s0<- vBB
5050
5051 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5052 fadds s2, s0, s1 @ s2<- op
5053 GET_INST_OPCODE ip @ extract opcode from rINST
5054 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5055 fsts s2, [r9] @ vAA<- s2
5056 GOTO_OPCODE ip @ jump to next instruction
5057
5058
5059/* ------------------------------ */
5060 .balign 128
5061.L_op_sub_float: /* 0xa7 */
5062/* File: arm/op_sub_float.S */
5063/* File: arm/fbinop.S */
5064 /*
5065 * Generic 32-bit floating-point operation. Provide an "instr" line that
5066 * specifies an instruction that performs "s2 = s0 op s1". Because we
5067 * use the "softfp" ABI, this must be an instruction, not a function call.
5068 *
5069 * For: add-float, sub-float, mul-float, div-float
5070 */
5071 /* floatop vAA, vBB, vCC */
5072 FETCH r0, 1 @ r0<- CCBB
5073 mov r9, rINST, lsr #8 @ r9<- AA
5074 mov r3, r0, lsr #8 @ r3<- CC
5075 and r2, r0, #255 @ r2<- BB
5076 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5077 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5078 flds s1, [r3] @ s1<- vCC
5079 flds s0, [r2] @ s0<- vBB
5080
5081 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5082 fsubs s2, s0, s1 @ s2<- op
5083 GET_INST_OPCODE ip @ extract opcode from rINST
5084 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5085 fsts s2, [r9] @ vAA<- s2
5086 GOTO_OPCODE ip @ jump to next instruction
5087
5088
5089/* ------------------------------ */
5090 .balign 128
5091.L_op_mul_float: /* 0xa8 */
5092/* File: arm/op_mul_float.S */
5093/* File: arm/fbinop.S */
5094 /*
5095 * Generic 32-bit floating-point operation. Provide an "instr" line that
5096 * specifies an instruction that performs "s2 = s0 op s1". Because we
5097 * use the "softfp" ABI, this must be an instruction, not a function call.
5098 *
5099 * For: add-float, sub-float, mul-float, div-float
5100 */
5101 /* floatop vAA, vBB, vCC */
5102 FETCH r0, 1 @ r0<- CCBB
5103 mov r9, rINST, lsr #8 @ r9<- AA
5104 mov r3, r0, lsr #8 @ r3<- CC
5105 and r2, r0, #255 @ r2<- BB
5106 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5107 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5108 flds s1, [r3] @ s1<- vCC
5109 flds s0, [r2] @ s0<- vBB
5110
5111 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5112 fmuls s2, s0, s1 @ s2<- op
5113 GET_INST_OPCODE ip @ extract opcode from rINST
5114 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5115 fsts s2, [r9] @ vAA<- s2
5116 GOTO_OPCODE ip @ jump to next instruction
5117
5118
5119/* ------------------------------ */
5120 .balign 128
5121.L_op_div_float: /* 0xa9 */
5122/* File: arm/op_div_float.S */
5123/* File: arm/fbinop.S */
5124 /*
5125 * Generic 32-bit floating-point operation. Provide an "instr" line that
5126 * specifies an instruction that performs "s2 = s0 op s1". Because we
5127 * use the "softfp" ABI, this must be an instruction, not a function call.
5128 *
5129 * For: add-float, sub-float, mul-float, div-float
5130 */
5131 /* floatop vAA, vBB, vCC */
5132 FETCH r0, 1 @ r0<- CCBB
5133 mov r9, rINST, lsr #8 @ r9<- AA
5134 mov r3, r0, lsr #8 @ r3<- CC
5135 and r2, r0, #255 @ r2<- BB
5136 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5137 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5138 flds s1, [r3] @ s1<- vCC
5139 flds s0, [r2] @ s0<- vBB
5140
5141 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5142 fdivs s2, s0, s1 @ s2<- op
5143 GET_INST_OPCODE ip @ extract opcode from rINST
5144 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5145 fsts s2, [r9] @ vAA<- s2
5146 GOTO_OPCODE ip @ jump to next instruction
5147
5148
5149/* ------------------------------ */
5150 .balign 128
5151.L_op_rem_float: /* 0xaa */
5152/* File: arm/op_rem_float.S */
5153/* EABI doesn't define a float remainder function, but libm does */
5154/* File: arm/binop.S */
5155 /*
5156 * Generic 32-bit binary operation. Provide an "instr" line that
5157 * specifies an instruction that performs "result = r0 op r1".
5158 * This could be an ARM instruction or a function call. (If the result
5159 * comes back in a register other than r0, you can override "result".)
5160 *
5161 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5162 * vCC (r1). Useful for integer division and modulus. Note that we
5163 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5164 * handles it correctly.
5165 *
5166 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5167 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5168 * mul-float, div-float, rem-float
5169 */
5170 /* binop vAA, vBB, vCC */
5171 FETCH r0, 1 @ r0<- CCBB
5172 mov r9, rINST, lsr #8 @ r9<- AA
5173 mov r3, r0, lsr #8 @ r3<- CC
5174 and r2, r0, #255 @ r2<- BB
5175 GET_VREG r1, r3 @ r1<- vCC
5176 GET_VREG r0, r2 @ r0<- vBB
5177 .if 0
5178 cmp r1, #0 @ is second operand zero?
5179 beq common_errDivideByZero
5180 .endif
5181
5182 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5183 @ optional op; may set condition codes
5184 bl fmodf @ r0<- op, r0-r3 changed
5185 GET_INST_OPCODE ip @ extract opcode from rINST
5186 SET_VREG r0, r9 @ vAA<- r0
5187 GOTO_OPCODE ip @ jump to next instruction
5188 /* 11-14 instructions */
5189
5190
5191/* ------------------------------ */
5192 .balign 128
5193.L_op_add_double: /* 0xab */
5194/* File: arm/op_add_double.S */
5195/* File: arm/fbinopWide.S */
5196 /*
5197 * Generic 64-bit double-precision floating point binary operation.
5198 * Provide an "instr" line that specifies an instruction that performs
5199 * "d2 = d0 op d1".
5200 *
5201 * for: add-double, sub-double, mul-double, div-double
5202 */
5203 /* doubleop vAA, vBB, vCC */
5204 FETCH r0, 1 @ r0<- CCBB
5205 mov r9, rINST, lsr #8 @ r9<- AA
5206 mov r3, r0, lsr #8 @ r3<- CC
5207 and r2, r0, #255 @ r2<- BB
5208 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5209 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5210 fldd d1, [r3] @ d1<- vCC
5211 fldd d0, [r2] @ d0<- vBB
buzbee1452bee2015-03-06 14:43:04 -08005212 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5213 faddd d2, d0, d1 @ s2<- op
buzbee50cf6002016-02-10 08:59:12 -08005214 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005215 GET_INST_OPCODE ip @ extract opcode from rINST
5216 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5217 fstd d2, [r9] @ vAA<- d2
5218 GOTO_OPCODE ip @ jump to next instruction
5219
5220
5221/* ------------------------------ */
5222 .balign 128
5223.L_op_sub_double: /* 0xac */
5224/* File: arm/op_sub_double.S */
5225/* File: arm/fbinopWide.S */
5226 /*
5227 * Generic 64-bit double-precision floating point binary operation.
5228 * Provide an "instr" line that specifies an instruction that performs
5229 * "d2 = d0 op d1".
5230 *
5231 * for: add-double, sub-double, mul-double, div-double
5232 */
5233 /* doubleop vAA, vBB, vCC */
5234 FETCH r0, 1 @ r0<- CCBB
5235 mov r9, rINST, lsr #8 @ r9<- AA
5236 mov r3, r0, lsr #8 @ r3<- CC
5237 and r2, r0, #255 @ r2<- BB
5238 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5239 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5240 fldd d1, [r3] @ d1<- vCC
5241 fldd d0, [r2] @ d0<- vBB
buzbee1452bee2015-03-06 14:43:04 -08005242 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5243 fsubd d2, d0, d1 @ s2<- op
buzbee50cf6002016-02-10 08:59:12 -08005244 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005245 GET_INST_OPCODE ip @ extract opcode from rINST
5246 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5247 fstd d2, [r9] @ vAA<- d2
5248 GOTO_OPCODE ip @ jump to next instruction
5249
5250
5251/* ------------------------------ */
5252 .balign 128
5253.L_op_mul_double: /* 0xad */
5254/* File: arm/op_mul_double.S */
5255/* File: arm/fbinopWide.S */
5256 /*
5257 * Generic 64-bit double-precision floating point binary operation.
5258 * Provide an "instr" line that specifies an instruction that performs
5259 * "d2 = d0 op d1".
5260 *
5261 * for: add-double, sub-double, mul-double, div-double
5262 */
5263 /* doubleop vAA, vBB, vCC */
5264 FETCH r0, 1 @ r0<- CCBB
5265 mov r9, rINST, lsr #8 @ r9<- AA
5266 mov r3, r0, lsr #8 @ r3<- CC
5267 and r2, r0, #255 @ r2<- BB
5268 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5269 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5270 fldd d1, [r3] @ d1<- vCC
5271 fldd d0, [r2] @ d0<- vBB
buzbee1452bee2015-03-06 14:43:04 -08005272 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5273 fmuld d2, d0, d1 @ s2<- op
buzbee50cf6002016-02-10 08:59:12 -08005274 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005275 GET_INST_OPCODE ip @ extract opcode from rINST
5276 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5277 fstd d2, [r9] @ vAA<- d2
5278 GOTO_OPCODE ip @ jump to next instruction
5279
5280
5281/* ------------------------------ */
5282 .balign 128
5283.L_op_div_double: /* 0xae */
5284/* File: arm/op_div_double.S */
5285/* File: arm/fbinopWide.S */
5286 /*
5287 * Generic 64-bit double-precision floating point binary operation.
5288 * Provide an "instr" line that specifies an instruction that performs
5289 * "d2 = d0 op d1".
5290 *
5291 * for: add-double, sub-double, mul-double, div-double
5292 */
5293 /* doubleop vAA, vBB, vCC */
5294 FETCH r0, 1 @ r0<- CCBB
5295 mov r9, rINST, lsr #8 @ r9<- AA
5296 mov r3, r0, lsr #8 @ r3<- CC
5297 and r2, r0, #255 @ r2<- BB
5298 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5299 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5300 fldd d1, [r3] @ d1<- vCC
5301 fldd d0, [r2] @ d0<- vBB
buzbee1452bee2015-03-06 14:43:04 -08005302 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5303 fdivd d2, d0, d1 @ s2<- op
buzbee50cf6002016-02-10 08:59:12 -08005304 CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005305 GET_INST_OPCODE ip @ extract opcode from rINST
5306 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5307 fstd d2, [r9] @ vAA<- d2
5308 GOTO_OPCODE ip @ jump to next instruction
5309
5310
5311/* ------------------------------ */
5312 .balign 128
5313.L_op_rem_double: /* 0xaf */
5314/* File: arm/op_rem_double.S */
5315/* EABI doesn't define a double remainder function, but libm does */
5316/* File: arm/binopWide.S */
5317 /*
5318 * Generic 64-bit binary operation. Provide an "instr" line that
5319 * specifies an instruction that performs "result = r0-r1 op r2-r3".
5320 * This could be an ARM instruction or a function call. (If the result
5321 * comes back in a register other than r0, you can override "result".)
5322 *
5323 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5324 * vCC (r1). Useful for integer division and modulus.
5325 *
5326 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5327 * xor-long, add-double, sub-double, mul-double, div-double,
5328 * rem-double
5329 *
5330 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5331 */
5332 /* binop vAA, vBB, vCC */
5333 FETCH r0, 1 @ r0<- CCBB
buzbee50cf6002016-02-10 08:59:12 -08005334 mov rINST, rINST, lsr #8 @ rINST<- AA
buzbee1452bee2015-03-06 14:43:04 -08005335 and r2, r0, #255 @ r2<- BB
5336 mov r3, r0, lsr #8 @ r3<- CC
buzbee50cf6002016-02-10 08:59:12 -08005337 add r9, rFP, rINST, lsl #2 @ r9<- &fp[AA]
buzbee1452bee2015-03-06 14:43:04 -08005338 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
5339 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
5340 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
5341 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
5342 .if 0
5343 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5344 beq common_errDivideByZero
5345 .endif
buzbee50cf6002016-02-10 08:59:12 -08005346 CLEAR_SHADOW_PAIR rINST, lr, ip @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005347 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08005348 @ optional op; may set condition codes
5349 bl fmod @ result<- op, r0-r3 changed
5350 GET_INST_OPCODE ip @ extract opcode from rINST
5351 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5352 GOTO_OPCODE ip @ jump to next instruction
5353 /* 14-17 instructions */
5354
5355
5356/* ------------------------------ */
5357 .balign 128
5358.L_op_add_int_2addr: /* 0xb0 */
5359/* File: arm/op_add_int_2addr.S */
5360/* File: arm/binop2addr.S */
5361 /*
5362 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5363 * that specifies an instruction that performs "result = r0 op r1".
5364 * This could be an ARM instruction or a function call. (If the result
5365 * comes back in a register other than r0, you can override "result".)
5366 *
5367 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5368 * vCC (r1). Useful for integer division and modulus.
5369 *
5370 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5371 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5372 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5373 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5374 */
5375 /* binop/2addr vA, vB */
5376 mov r3, rINST, lsr #12 @ r3<- B
5377 ubfx r9, rINST, #8, #4 @ r9<- A
5378 GET_VREG r1, r3 @ r1<- vB
5379 GET_VREG r0, r9 @ r0<- vA
5380 .if 0
5381 cmp r1, #0 @ is second operand zero?
5382 beq common_errDivideByZero
5383 .endif
5384 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5385
5386 @ optional op; may set condition codes
5387 add r0, r0, r1 @ r0<- op, r0-r3 changed
5388 GET_INST_OPCODE ip @ extract opcode from rINST
5389 SET_VREG r0, r9 @ vAA<- r0
5390 GOTO_OPCODE ip @ jump to next instruction
5391 /* 10-13 instructions */
5392
5393
5394/* ------------------------------ */
5395 .balign 128
5396.L_op_sub_int_2addr: /* 0xb1 */
5397/* File: arm/op_sub_int_2addr.S */
5398/* File: arm/binop2addr.S */
5399 /*
5400 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5401 * that specifies an instruction that performs "result = r0 op r1".
5402 * This could be an ARM instruction or a function call. (If the result
5403 * comes back in a register other than r0, you can override "result".)
5404 *
5405 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5406 * vCC (r1). Useful for integer division and modulus.
5407 *
5408 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5409 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5410 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5411 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5412 */
5413 /* binop/2addr vA, vB */
5414 mov r3, rINST, lsr #12 @ r3<- B
5415 ubfx r9, rINST, #8, #4 @ r9<- A
5416 GET_VREG r1, r3 @ r1<- vB
5417 GET_VREG r0, r9 @ r0<- vA
5418 .if 0
5419 cmp r1, #0 @ is second operand zero?
5420 beq common_errDivideByZero
5421 .endif
5422 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5423
5424 @ optional op; may set condition codes
5425 sub r0, r0, r1 @ r0<- op, r0-r3 changed
5426 GET_INST_OPCODE ip @ extract opcode from rINST
5427 SET_VREG r0, r9 @ vAA<- r0
5428 GOTO_OPCODE ip @ jump to next instruction
5429 /* 10-13 instructions */
5430
5431
5432/* ------------------------------ */
5433 .balign 128
5434.L_op_mul_int_2addr: /* 0xb2 */
5435/* File: arm/op_mul_int_2addr.S */
5436/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
5437/* File: arm/binop2addr.S */
5438 /*
5439 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5440 * that specifies an instruction that performs "result = r0 op r1".
5441 * This could be an ARM instruction or a function call. (If the result
5442 * comes back in a register other than r0, you can override "result".)
5443 *
5444 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5445 * vCC (r1). Useful for integer division and modulus.
5446 *
5447 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5448 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5449 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5450 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5451 */
5452 /* binop/2addr vA, vB */
5453 mov r3, rINST, lsr #12 @ r3<- B
5454 ubfx r9, rINST, #8, #4 @ r9<- A
5455 GET_VREG r1, r3 @ r1<- vB
5456 GET_VREG r0, r9 @ r0<- vA
5457 .if 0
5458 cmp r1, #0 @ is second operand zero?
5459 beq common_errDivideByZero
5460 .endif
5461 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5462
5463 @ optional op; may set condition codes
5464 mul r0, r1, r0 @ r0<- op, r0-r3 changed
5465 GET_INST_OPCODE ip @ extract opcode from rINST
5466 SET_VREG r0, r9 @ vAA<- r0
5467 GOTO_OPCODE ip @ jump to next instruction
5468 /* 10-13 instructions */
5469
5470
5471/* ------------------------------ */
5472 .balign 128
5473.L_op_div_int_2addr: /* 0xb3 */
5474/* File: arm/op_div_int_2addr.S */
5475 /*
5476 * Specialized 32-bit binary operation
5477 *
5478 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
5479 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
5480 * ARMv7 CPUs that have hardware division support).
5481 *
5482 * div-int/2addr
5483 *
5484 */
5485 mov r3, rINST, lsr #12 @ r3<- B
5486 ubfx r9, rINST, #8, #4 @ r9<- A
5487 GET_VREG r1, r3 @ r1<- vB
5488 GET_VREG r0, r9 @ r0<- vA
5489 cmp r1, #0 @ is second operand zero?
5490 beq common_errDivideByZero
5491 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5492
5493#ifdef __ARM_ARCH_EXT_IDIV__
5494 sdiv r0, r0, r1 @ r0<- op
5495#else
5496 bl __aeabi_idiv @ r0<- op, r0-r3 changed
5497#endif
5498 GET_INST_OPCODE ip @ extract opcode from rINST
5499 SET_VREG r0, r9 @ vAA<- r0
5500 GOTO_OPCODE ip @ jump to next instruction
5501 /* 10-13 instructions */
5502
5503
5504/* ------------------------------ */
5505 .balign 128
5506.L_op_rem_int_2addr: /* 0xb4 */
5507/* File: arm/op_rem_int_2addr.S */
5508 /*
5509 * Specialized 32-bit binary operation
5510 *
5511 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
5512 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
5513 * ARMv7 CPUs that have hardware division support).
5514 *
5515 * NOTE: idivmod returns quotient in r0 and remainder in r1
5516 *
5517 * rem-int/2addr
5518 *
5519 */
5520 mov r3, rINST, lsr #12 @ r3<- B
5521 ubfx r9, rINST, #8, #4 @ r9<- A
5522 GET_VREG r1, r3 @ r1<- vB
5523 GET_VREG r0, r9 @ r0<- vA
5524 cmp r1, #0 @ is second operand zero?
5525 beq common_errDivideByZero
5526 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5527
5528#ifdef __ARM_ARCH_EXT_IDIV__
5529 sdiv r2, r0, r1
5530 mls r1, r1, r2, r0 @ r1<- op
5531#else
5532 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
5533#endif
5534 GET_INST_OPCODE ip @ extract opcode from rINST
5535 SET_VREG r1, r9 @ vAA<- r1
5536 GOTO_OPCODE ip @ jump to next instruction
5537 /* 10-13 instructions */
5538
5539
5540/* ------------------------------ */
5541 .balign 128
5542.L_op_and_int_2addr: /* 0xb5 */
5543/* File: arm/op_and_int_2addr.S */
5544/* File: arm/binop2addr.S */
5545 /*
5546 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5547 * that specifies an instruction that performs "result = r0 op r1".
5548 * This could be an ARM instruction or a function call. (If the result
5549 * comes back in a register other than r0, you can override "result".)
5550 *
5551 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5552 * vCC (r1). Useful for integer division and modulus.
5553 *
5554 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5555 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5556 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5557 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5558 */
5559 /* binop/2addr vA, vB */
5560 mov r3, rINST, lsr #12 @ r3<- B
5561 ubfx r9, rINST, #8, #4 @ r9<- A
5562 GET_VREG r1, r3 @ r1<- vB
5563 GET_VREG r0, r9 @ r0<- vA
5564 .if 0
5565 cmp r1, #0 @ is second operand zero?
5566 beq common_errDivideByZero
5567 .endif
5568 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5569
5570 @ optional op; may set condition codes
5571 and r0, r0, r1 @ r0<- op, r0-r3 changed
5572 GET_INST_OPCODE ip @ extract opcode from rINST
5573 SET_VREG r0, r9 @ vAA<- r0
5574 GOTO_OPCODE ip @ jump to next instruction
5575 /* 10-13 instructions */
5576
5577
5578/* ------------------------------ */
5579 .balign 128
5580.L_op_or_int_2addr: /* 0xb6 */
5581/* File: arm/op_or_int_2addr.S */
5582/* File: arm/binop2addr.S */
5583 /*
5584 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5585 * that specifies an instruction that performs "result = r0 op r1".
5586 * This could be an ARM instruction or a function call. (If the result
5587 * comes back in a register other than r0, you can override "result".)
5588 *
5589 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5590 * vCC (r1). Useful for integer division and modulus.
5591 *
5592 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5593 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5594 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5595 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5596 */
5597 /* binop/2addr vA, vB */
5598 mov r3, rINST, lsr #12 @ r3<- B
5599 ubfx r9, rINST, #8, #4 @ r9<- A
5600 GET_VREG r1, r3 @ r1<- vB
5601 GET_VREG r0, r9 @ r0<- vA
5602 .if 0
5603 cmp r1, #0 @ is second operand zero?
5604 beq common_errDivideByZero
5605 .endif
5606 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5607
5608 @ optional op; may set condition codes
5609 orr r0, r0, r1 @ r0<- op, r0-r3 changed
5610 GET_INST_OPCODE ip @ extract opcode from rINST
5611 SET_VREG r0, r9 @ vAA<- r0
5612 GOTO_OPCODE ip @ jump to next instruction
5613 /* 10-13 instructions */
5614
5615
5616/* ------------------------------ */
5617 .balign 128
5618.L_op_xor_int_2addr: /* 0xb7 */
5619/* File: arm/op_xor_int_2addr.S */
5620/* File: arm/binop2addr.S */
5621 /*
5622 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5623 * that specifies an instruction that performs "result = r0 op r1".
5624 * This could be an ARM instruction or a function call. (If the result
5625 * comes back in a register other than r0, you can override "result".)
5626 *
5627 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5628 * vCC (r1). Useful for integer division and modulus.
5629 *
5630 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5631 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5632 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5633 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5634 */
5635 /* binop/2addr vA, vB */
5636 mov r3, rINST, lsr #12 @ r3<- B
5637 ubfx r9, rINST, #8, #4 @ r9<- A
5638 GET_VREG r1, r3 @ r1<- vB
5639 GET_VREG r0, r9 @ r0<- vA
5640 .if 0
5641 cmp r1, #0 @ is second operand zero?
5642 beq common_errDivideByZero
5643 .endif
5644 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5645
5646 @ optional op; may set condition codes
5647 eor r0, r0, r1 @ r0<- op, r0-r3 changed
5648 GET_INST_OPCODE ip @ extract opcode from rINST
5649 SET_VREG r0, r9 @ vAA<- r0
5650 GOTO_OPCODE ip @ jump to next instruction
5651 /* 10-13 instructions */
5652
5653
5654/* ------------------------------ */
5655 .balign 128
5656.L_op_shl_int_2addr: /* 0xb8 */
5657/* File: arm/op_shl_int_2addr.S */
5658/* File: arm/binop2addr.S */
5659 /*
5660 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5661 * that specifies an instruction that performs "result = r0 op r1".
5662 * This could be an ARM instruction or a function call. (If the result
5663 * comes back in a register other than r0, you can override "result".)
5664 *
5665 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5666 * vCC (r1). Useful for integer division and modulus.
5667 *
5668 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5669 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5670 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5671 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5672 */
5673 /* binop/2addr vA, vB */
5674 mov r3, rINST, lsr #12 @ r3<- B
5675 ubfx r9, rINST, #8, #4 @ r9<- A
5676 GET_VREG r1, r3 @ r1<- vB
5677 GET_VREG r0, r9 @ r0<- vA
5678 .if 0
5679 cmp r1, #0 @ is second operand zero?
5680 beq common_errDivideByZero
5681 .endif
5682 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5683
5684 and r1, r1, #31 @ optional op; may set condition codes
5685 mov r0, r0, asl r1 @ r0<- op, r0-r3 changed
5686 GET_INST_OPCODE ip @ extract opcode from rINST
5687 SET_VREG r0, r9 @ vAA<- r0
5688 GOTO_OPCODE ip @ jump to next instruction
5689 /* 10-13 instructions */
5690
5691
5692/* ------------------------------ */
5693 .balign 128
5694.L_op_shr_int_2addr: /* 0xb9 */
5695/* File: arm/op_shr_int_2addr.S */
5696/* File: arm/binop2addr.S */
5697 /*
5698 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5699 * that specifies an instruction that performs "result = r0 op r1".
5700 * This could be an ARM instruction or a function call. (If the result
5701 * comes back in a register other than r0, you can override "result".)
5702 *
5703 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5704 * vCC (r1). Useful for integer division and modulus.
5705 *
5706 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5707 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5708 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5709 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5710 */
5711 /* binop/2addr vA, vB */
5712 mov r3, rINST, lsr #12 @ r3<- B
5713 ubfx r9, rINST, #8, #4 @ r9<- A
5714 GET_VREG r1, r3 @ r1<- vB
5715 GET_VREG r0, r9 @ r0<- vA
5716 .if 0
5717 cmp r1, #0 @ is second operand zero?
5718 beq common_errDivideByZero
5719 .endif
5720 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5721
5722 and r1, r1, #31 @ optional op; may set condition codes
5723 mov r0, r0, asr r1 @ r0<- op, r0-r3 changed
5724 GET_INST_OPCODE ip @ extract opcode from rINST
5725 SET_VREG r0, r9 @ vAA<- r0
5726 GOTO_OPCODE ip @ jump to next instruction
5727 /* 10-13 instructions */
5728
5729
5730/* ------------------------------ */
5731 .balign 128
5732.L_op_ushr_int_2addr: /* 0xba */
5733/* File: arm/op_ushr_int_2addr.S */
5734/* File: arm/binop2addr.S */
5735 /*
5736 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5737 * that specifies an instruction that performs "result = r0 op r1".
5738 * This could be an ARM instruction or a function call. (If the result
5739 * comes back in a register other than r0, you can override "result".)
5740 *
5741 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5742 * vCC (r1). Useful for integer division and modulus.
5743 *
5744 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5745 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5746 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5747 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5748 */
5749 /* binop/2addr vA, vB */
5750 mov r3, rINST, lsr #12 @ r3<- B
5751 ubfx r9, rINST, #8, #4 @ r9<- A
5752 GET_VREG r1, r3 @ r1<- vB
5753 GET_VREG r0, r9 @ r0<- vA
5754 .if 0
5755 cmp r1, #0 @ is second operand zero?
5756 beq common_errDivideByZero
5757 .endif
5758 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5759
5760 and r1, r1, #31 @ optional op; may set condition codes
5761 mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed
5762 GET_INST_OPCODE ip @ extract opcode from rINST
5763 SET_VREG r0, r9 @ vAA<- r0
5764 GOTO_OPCODE ip @ jump to next instruction
5765 /* 10-13 instructions */
5766
5767
5768/* ------------------------------ */
5769 .balign 128
5770.L_op_add_long_2addr: /* 0xbb */
5771/* File: arm/op_add_long_2addr.S */
5772/* File: arm/binopWide2addr.S */
5773 /*
5774 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5775 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5776 * This could be an ARM instruction or a function call. (If the result
5777 * comes back in a register other than r0, you can override "result".)
5778 *
5779 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5780 * vCC (r1). Useful for integer division and modulus.
5781 *
5782 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5783 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5784 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5785 * rem-double/2addr
5786 */
5787 /* binop/2addr vA, vB */
5788 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08005789 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08005790 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08005791 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08005792 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5793 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5794 .if 0
5795 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5796 beq common_errDivideByZero
5797 .endif
buzbee50cf6002016-02-10 08:59:12 -08005798 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005799 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08005800 adds r0, r0, r2 @ optional op; may set condition codes
5801 adc r1, r1, r3 @ result<- op, r0-r3 changed
5802 GET_INST_OPCODE ip @ extract opcode from rINST
5803 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5804 GOTO_OPCODE ip @ jump to next instruction
5805 /* 12-15 instructions */
5806
5807
5808/* ------------------------------ */
5809 .balign 128
5810.L_op_sub_long_2addr: /* 0xbc */
5811/* File: arm/op_sub_long_2addr.S */
5812/* File: arm/binopWide2addr.S */
5813 /*
5814 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5815 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5816 * This could be an ARM instruction or a function call. (If the result
5817 * comes back in a register other than r0, you can override "result".)
5818 *
5819 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5820 * vCC (r1). Useful for integer division and modulus.
5821 *
5822 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5823 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5824 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5825 * rem-double/2addr
5826 */
5827 /* binop/2addr vA, vB */
5828 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08005829 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08005830 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08005831 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08005832 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5833 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5834 .if 0
5835 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5836 beq common_errDivideByZero
5837 .endif
buzbee50cf6002016-02-10 08:59:12 -08005838 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005839 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08005840 subs r0, r0, r2 @ optional op; may set condition codes
5841 sbc r1, r1, r3 @ result<- op, r0-r3 changed
5842 GET_INST_OPCODE ip @ extract opcode from rINST
5843 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5844 GOTO_OPCODE ip @ jump to next instruction
5845 /* 12-15 instructions */
5846
5847
5848/* ------------------------------ */
5849 .balign 128
5850.L_op_mul_long_2addr: /* 0xbd */
5851/* File: arm/op_mul_long_2addr.S */
5852 /*
5853 * Signed 64-bit integer multiply, "/2addr" version.
5854 *
5855 * See op_mul_long for an explanation.
5856 *
5857 * We get a little tight on registers, so to avoid looking up &fp[A]
5858 * again we stuff it into rINST.
5859 */
5860 /* mul-long/2addr vA, vB */
5861 mov r1, rINST, lsr #12 @ r1<- B
5862 ubfx r9, rINST, #8, #4 @ r9<- A
5863 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
5864 add rINST, rFP, r9, lsl #2 @ rINST<- &fp[A]
5865 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5866 ldmia rINST, {r0-r1} @ r0/r1<- vAA/vAA+1
5867 mul ip, r2, r1 @ ip<- ZxW
5868 umull r9, r10, r2, r0 @ r9/r10 <- ZxX
5869 mla r2, r0, r3, ip @ r2<- YxX + (ZxW)
5870 mov r0, rINST @ r0<- &fp[A] (free up rINST)
5871 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5872 add r10, r2, r10 @ r10<- r10 + low(ZxW + (YxX))
5873 GET_INST_OPCODE ip @ extract opcode from rINST
5874 stmia r0, {r9-r10} @ vAA/vAA+1<- r9/r10
5875 GOTO_OPCODE ip @ jump to next instruction
5876
5877/* ------------------------------ */
5878 .balign 128
5879.L_op_div_long_2addr: /* 0xbe */
5880/* File: arm/op_div_long_2addr.S */
5881/* File: arm/binopWide2addr.S */
5882 /*
5883 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5884 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5885 * This could be an ARM instruction or a function call. (If the result
5886 * comes back in a register other than r0, you can override "result".)
5887 *
5888 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5889 * vCC (r1). Useful for integer division and modulus.
5890 *
5891 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5892 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5893 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5894 * rem-double/2addr
5895 */
5896 /* binop/2addr vA, vB */
5897 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08005898 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08005899 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08005900 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08005901 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5902 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5903 .if 1
5904 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5905 beq common_errDivideByZero
5906 .endif
buzbee50cf6002016-02-10 08:59:12 -08005907 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005908 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08005909 @ optional op; may set condition codes
5910 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
5911 GET_INST_OPCODE ip @ extract opcode from rINST
5912 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5913 GOTO_OPCODE ip @ jump to next instruction
5914 /* 12-15 instructions */
5915
5916
5917/* ------------------------------ */
5918 .balign 128
5919.L_op_rem_long_2addr: /* 0xbf */
5920/* File: arm/op_rem_long_2addr.S */
5921/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
5922/* File: arm/binopWide2addr.S */
5923 /*
5924 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5925 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5926 * This could be an ARM instruction or a function call. (If the result
5927 * comes back in a register other than r0, you can override "result".)
5928 *
5929 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5930 * vCC (r1). Useful for integer division and modulus.
5931 *
5932 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5933 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5934 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5935 * rem-double/2addr
5936 */
5937 /* binop/2addr vA, vB */
5938 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08005939 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08005940 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08005941 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08005942 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5943 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5944 .if 1
5945 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5946 beq common_errDivideByZero
5947 .endif
buzbee50cf6002016-02-10 08:59:12 -08005948 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005949 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08005950 @ optional op; may set condition codes
5951 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
5952 GET_INST_OPCODE ip @ extract opcode from rINST
5953 stmia r9, {r2,r3} @ vAA/vAA+1<- r2/r3
5954 GOTO_OPCODE ip @ jump to next instruction
5955 /* 12-15 instructions */
5956
5957
5958/* ------------------------------ */
5959 .balign 128
5960.L_op_and_long_2addr: /* 0xc0 */
5961/* File: arm/op_and_long_2addr.S */
5962/* File: arm/binopWide2addr.S */
5963 /*
5964 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5965 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5966 * This could be an ARM instruction or a function call. (If the result
5967 * comes back in a register other than r0, you can override "result".)
5968 *
5969 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5970 * vCC (r1). Useful for integer division and modulus.
5971 *
5972 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5973 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5974 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5975 * rem-double/2addr
5976 */
5977 /* binop/2addr vA, vB */
5978 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08005979 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08005980 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08005981 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08005982 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5983 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5984 .if 0
5985 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5986 beq common_errDivideByZero
5987 .endif
buzbee50cf6002016-02-10 08:59:12 -08005988 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08005989 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08005990 and r0, r0, r2 @ optional op; may set condition codes
5991 and r1, r1, r3 @ result<- op, r0-r3 changed
5992 GET_INST_OPCODE ip @ extract opcode from rINST
5993 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5994 GOTO_OPCODE ip @ jump to next instruction
5995 /* 12-15 instructions */
5996
5997
5998/* ------------------------------ */
5999 .balign 128
6000.L_op_or_long_2addr: /* 0xc1 */
6001/* File: arm/op_or_long_2addr.S */
6002/* File: arm/binopWide2addr.S */
6003 /*
6004 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6005 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6006 * This could be an ARM instruction or a function call. (If the result
6007 * comes back in a register other than r0, you can override "result".)
6008 *
6009 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6010 * vCC (r1). Useful for integer division and modulus.
6011 *
6012 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6013 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6014 * sub-double/2addr, mul-double/2addr, div-double/2addr,
6015 * rem-double/2addr
6016 */
6017 /* binop/2addr vA, vB */
6018 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08006019 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08006020 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08006021 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08006022 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6023 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6024 .if 0
6025 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6026 beq common_errDivideByZero
6027 .endif
buzbee50cf6002016-02-10 08:59:12 -08006028 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006029 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08006030 orr r0, r0, r2 @ optional op; may set condition codes
6031 orr r1, r1, r3 @ result<- op, r0-r3 changed
6032 GET_INST_OPCODE ip @ extract opcode from rINST
6033 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6034 GOTO_OPCODE ip @ jump to next instruction
6035 /* 12-15 instructions */
6036
6037
6038/* ------------------------------ */
6039 .balign 128
6040.L_op_xor_long_2addr: /* 0xc2 */
6041/* File: arm/op_xor_long_2addr.S */
6042/* File: arm/binopWide2addr.S */
6043 /*
6044 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6045 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6046 * This could be an ARM instruction or a function call. (If the result
6047 * comes back in a register other than r0, you can override "result".)
6048 *
6049 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6050 * vCC (r1). Useful for integer division and modulus.
6051 *
6052 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6053 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6054 * sub-double/2addr, mul-double/2addr, div-double/2addr,
6055 * rem-double/2addr
6056 */
6057 /* binop/2addr vA, vB */
6058 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08006059 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08006060 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08006061 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08006062 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6063 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6064 .if 0
6065 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6066 beq common_errDivideByZero
6067 .endif
buzbee50cf6002016-02-10 08:59:12 -08006068 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006069 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08006070 eor r0, r0, r2 @ optional op; may set condition codes
6071 eor r1, r1, r3 @ result<- op, r0-r3 changed
6072 GET_INST_OPCODE ip @ extract opcode from rINST
6073 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6074 GOTO_OPCODE ip @ jump to next instruction
6075 /* 12-15 instructions */
6076
6077
6078/* ------------------------------ */
6079 .balign 128
6080.L_op_shl_long_2addr: /* 0xc3 */
6081/* File: arm/op_shl_long_2addr.S */
6082 /*
6083 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
6084 * 32-bit shift distance.
6085 */
6086 /* shl-long/2addr vA, vB */
6087 mov r3, rINST, lsr #12 @ r3<- B
6088 ubfx r9, rINST, #8, #4 @ r9<- A
6089 GET_VREG r2, r3 @ r2<- vB
6090 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6091 and r2, r2, #63 @ r2<- r2 & 0x3f
6092 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6093
6094 mov r1, r1, asl r2 @ r1<- r1 << r2
6095 rsb r3, r2, #32 @ r3<- 32 - r2
6096 orr r1, r1, r0, lsr r3 @ r1<- r1 | (r0 << (32-r2))
6097 subs ip, r2, #32 @ ip<- r2 - 32
6098 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6099 movpl r1, r0, asl ip @ if r2 >= 32, r1<- r0 << (r2-32)
6100 mov r0, r0, asl r2 @ r0<- r0 << r2
6101 GET_INST_OPCODE ip @ extract opcode from rINST
6102 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
6103 GOTO_OPCODE ip @ jump to next instruction
6104
6105/* ------------------------------ */
6106 .balign 128
6107.L_op_shr_long_2addr: /* 0xc4 */
6108/* File: arm/op_shr_long_2addr.S */
6109 /*
6110 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
6111 * 32-bit shift distance.
6112 */
6113 /* shr-long/2addr vA, vB */
6114 mov r3, rINST, lsr #12 @ r3<- B
6115 ubfx r9, rINST, #8, #4 @ r9<- A
6116 GET_VREG r2, r3 @ r2<- vB
6117 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6118 and r2, r2, #63 @ r2<- r2 & 0x3f
6119 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6120
6121 mov r0, r0, lsr r2 @ r0<- r2 >> r2
6122 rsb r3, r2, #32 @ r3<- 32 - r2
6123 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
6124 subs ip, r2, #32 @ ip<- r2 - 32
6125 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6126 movpl r0, r1, asr ip @ if r2 >= 32, r0<-r1 >> (r2-32)
6127 mov r1, r1, asr r2 @ r1<- r1 >> r2
6128 GET_INST_OPCODE ip @ extract opcode from rINST
6129 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
6130 GOTO_OPCODE ip @ jump to next instruction
6131
6132/* ------------------------------ */
6133 .balign 128
6134.L_op_ushr_long_2addr: /* 0xc5 */
6135/* File: arm/op_ushr_long_2addr.S */
6136 /*
6137 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
6138 * 32-bit shift distance.
6139 */
6140 /* ushr-long/2addr vA, vB */
6141 mov r3, rINST, lsr #12 @ r3<- B
6142 ubfx r9, rINST, #8, #4 @ r9<- A
6143 GET_VREG r2, r3 @ r2<- vB
6144 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6145 and r2, r2, #63 @ r2<- r2 & 0x3f
6146 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6147
6148 mov r0, r0, lsr r2 @ r0<- r2 >> r2
6149 rsb r3, r2, #32 @ r3<- 32 - r2
6150 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
6151 subs ip, r2, #32 @ ip<- r2 - 32
6152 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6153 movpl r0, r1, lsr ip @ if r2 >= 32, r0<-r1 >>> (r2-32)
6154 mov r1, r1, lsr r2 @ r1<- r1 >>> r2
6155 GET_INST_OPCODE ip @ extract opcode from rINST
6156 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
6157 GOTO_OPCODE ip @ jump to next instruction
6158
6159/* ------------------------------ */
6160 .balign 128
6161.L_op_add_float_2addr: /* 0xc6 */
6162/* File: arm/op_add_float_2addr.S */
6163/* File: arm/fbinop2addr.S */
6164 /*
6165 * Generic 32-bit floating point "/2addr" binary operation. Provide
6166 * an "instr" line that specifies an instruction that performs
6167 * "s2 = s0 op s1".
6168 *
6169 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6170 */
6171 /* binop/2addr vA, vB */
6172 mov r3, rINST, lsr #12 @ r3<- B
6173 mov r9, rINST, lsr #8 @ r9<- A+
6174 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6175 and r9, r9, #15 @ r9<- A
6176 flds s1, [r3] @ s1<- vB
6177 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6178 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6179 flds s0, [r9] @ s0<- vA
6180
6181 fadds s2, s0, s1 @ s2<- op
6182 GET_INST_OPCODE ip @ extract opcode from rINST
6183 fsts s2, [r9] @ vAA<- s2
6184 GOTO_OPCODE ip @ jump to next instruction
6185
6186
6187/* ------------------------------ */
6188 .balign 128
6189.L_op_sub_float_2addr: /* 0xc7 */
6190/* File: arm/op_sub_float_2addr.S */
6191/* File: arm/fbinop2addr.S */
6192 /*
6193 * Generic 32-bit floating point "/2addr" binary operation. Provide
6194 * an "instr" line that specifies an instruction that performs
6195 * "s2 = s0 op s1".
6196 *
6197 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6198 */
6199 /* binop/2addr vA, vB */
6200 mov r3, rINST, lsr #12 @ r3<- B
6201 mov r9, rINST, lsr #8 @ r9<- A+
6202 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6203 and r9, r9, #15 @ r9<- A
6204 flds s1, [r3] @ s1<- vB
6205 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6206 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6207 flds s0, [r9] @ s0<- vA
6208
6209 fsubs s2, s0, s1 @ s2<- op
6210 GET_INST_OPCODE ip @ extract opcode from rINST
6211 fsts s2, [r9] @ vAA<- s2
6212 GOTO_OPCODE ip @ jump to next instruction
6213
6214
6215/* ------------------------------ */
6216 .balign 128
6217.L_op_mul_float_2addr: /* 0xc8 */
6218/* File: arm/op_mul_float_2addr.S */
6219/* File: arm/fbinop2addr.S */
6220 /*
6221 * Generic 32-bit floating point "/2addr" binary operation. Provide
6222 * an "instr" line that specifies an instruction that performs
6223 * "s2 = s0 op s1".
6224 *
6225 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6226 */
6227 /* binop/2addr vA, vB */
6228 mov r3, rINST, lsr #12 @ r3<- B
6229 mov r9, rINST, lsr #8 @ r9<- A+
6230 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6231 and r9, r9, #15 @ r9<- A
6232 flds s1, [r3] @ s1<- vB
6233 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6234 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6235 flds s0, [r9] @ s0<- vA
6236
6237 fmuls s2, s0, s1 @ s2<- op
6238 GET_INST_OPCODE ip @ extract opcode from rINST
6239 fsts s2, [r9] @ vAA<- s2
6240 GOTO_OPCODE ip @ jump to next instruction
6241
6242
6243/* ------------------------------ */
6244 .balign 128
6245.L_op_div_float_2addr: /* 0xc9 */
6246/* File: arm/op_div_float_2addr.S */
6247/* File: arm/fbinop2addr.S */
6248 /*
6249 * Generic 32-bit floating point "/2addr" binary operation. Provide
6250 * an "instr" line that specifies an instruction that performs
6251 * "s2 = s0 op s1".
6252 *
6253 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6254 */
6255 /* binop/2addr vA, vB */
6256 mov r3, rINST, lsr #12 @ r3<- B
6257 mov r9, rINST, lsr #8 @ r9<- A+
6258 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6259 and r9, r9, #15 @ r9<- A
6260 flds s1, [r3] @ s1<- vB
6261 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6262 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6263 flds s0, [r9] @ s0<- vA
6264
6265 fdivs s2, s0, s1 @ s2<- op
6266 GET_INST_OPCODE ip @ extract opcode from rINST
6267 fsts s2, [r9] @ vAA<- s2
6268 GOTO_OPCODE ip @ jump to next instruction
6269
6270
6271/* ------------------------------ */
6272 .balign 128
6273.L_op_rem_float_2addr: /* 0xca */
6274/* File: arm/op_rem_float_2addr.S */
6275/* EABI doesn't define a float remainder function, but libm does */
6276/* File: arm/binop2addr.S */
6277 /*
6278 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
6279 * that specifies an instruction that performs "result = r0 op r1".
6280 * This could be an ARM instruction or a function call. (If the result
6281 * comes back in a register other than r0, you can override "result".)
6282 *
6283 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6284 * vCC (r1). Useful for integer division and modulus.
6285 *
6286 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6287 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6288 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6289 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6290 */
6291 /* binop/2addr vA, vB */
6292 mov r3, rINST, lsr #12 @ r3<- B
6293 ubfx r9, rINST, #8, #4 @ r9<- A
6294 GET_VREG r1, r3 @ r1<- vB
6295 GET_VREG r0, r9 @ r0<- vA
6296 .if 0
6297 cmp r1, #0 @ is second operand zero?
6298 beq common_errDivideByZero
6299 .endif
6300 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6301
6302 @ optional op; may set condition codes
6303 bl fmodf @ r0<- op, r0-r3 changed
6304 GET_INST_OPCODE ip @ extract opcode from rINST
6305 SET_VREG r0, r9 @ vAA<- r0
6306 GOTO_OPCODE ip @ jump to next instruction
6307 /* 10-13 instructions */
6308
6309
6310/* ------------------------------ */
6311 .balign 128
6312.L_op_add_double_2addr: /* 0xcb */
6313/* File: arm/op_add_double_2addr.S */
6314/* File: arm/fbinopWide2addr.S */
6315 /*
6316 * Generic 64-bit floating point "/2addr" binary operation. Provide
6317 * an "instr" line that specifies an instruction that performs
6318 * "d2 = d0 op d1".
6319 *
6320 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6321 * div-double/2addr
6322 */
6323 /* binop/2addr vA, vB */
6324 mov r3, rINST, lsr #12 @ r3<- B
6325 mov r9, rINST, lsr #8 @ r9<- A+
6326 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6327 and r9, r9, #15 @ r9<- A
6328 fldd d1, [r3] @ d1<- vB
buzbee50cf6002016-02-10 08:59:12 -08006329 CLEAR_SHADOW_PAIR r9, ip, r0 @ Zero out shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006330 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6331 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6332 fldd d0, [r9] @ d0<- vA
buzbee1452bee2015-03-06 14:43:04 -08006333 faddd d2, d0, d1 @ d2<- op
6334 GET_INST_OPCODE ip @ extract opcode from rINST
6335 fstd d2, [r9] @ vAA<- d2
6336 GOTO_OPCODE ip @ jump to next instruction
6337
6338
6339/* ------------------------------ */
6340 .balign 128
6341.L_op_sub_double_2addr: /* 0xcc */
6342/* File: arm/op_sub_double_2addr.S */
6343/* File: arm/fbinopWide2addr.S */
6344 /*
6345 * Generic 64-bit floating point "/2addr" binary operation. Provide
6346 * an "instr" line that specifies an instruction that performs
6347 * "d2 = d0 op d1".
6348 *
6349 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6350 * div-double/2addr
6351 */
6352 /* binop/2addr vA, vB */
6353 mov r3, rINST, lsr #12 @ r3<- B
6354 mov r9, rINST, lsr #8 @ r9<- A+
6355 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6356 and r9, r9, #15 @ r9<- A
6357 fldd d1, [r3] @ d1<- vB
buzbee50cf6002016-02-10 08:59:12 -08006358 CLEAR_SHADOW_PAIR r9, ip, r0 @ Zero out shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006359 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6360 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6361 fldd d0, [r9] @ d0<- vA
buzbee1452bee2015-03-06 14:43:04 -08006362 fsubd d2, d0, d1 @ d2<- op
6363 GET_INST_OPCODE ip @ extract opcode from rINST
6364 fstd d2, [r9] @ vAA<- d2
6365 GOTO_OPCODE ip @ jump to next instruction
6366
6367
6368/* ------------------------------ */
6369 .balign 128
6370.L_op_mul_double_2addr: /* 0xcd */
6371/* File: arm/op_mul_double_2addr.S */
6372/* File: arm/fbinopWide2addr.S */
6373 /*
6374 * Generic 64-bit floating point "/2addr" binary operation. Provide
6375 * an "instr" line that specifies an instruction that performs
6376 * "d2 = d0 op d1".
6377 *
6378 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6379 * div-double/2addr
6380 */
6381 /* binop/2addr vA, vB */
6382 mov r3, rINST, lsr #12 @ r3<- B
6383 mov r9, rINST, lsr #8 @ r9<- A+
6384 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6385 and r9, r9, #15 @ r9<- A
6386 fldd d1, [r3] @ d1<- vB
buzbee50cf6002016-02-10 08:59:12 -08006387 CLEAR_SHADOW_PAIR r9, ip, r0 @ Zero out shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006388 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6389 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6390 fldd d0, [r9] @ d0<- vA
buzbee1452bee2015-03-06 14:43:04 -08006391 fmuld d2, d0, d1 @ d2<- op
6392 GET_INST_OPCODE ip @ extract opcode from rINST
6393 fstd d2, [r9] @ vAA<- d2
6394 GOTO_OPCODE ip @ jump to next instruction
6395
6396
6397/* ------------------------------ */
6398 .balign 128
6399.L_op_div_double_2addr: /* 0xce */
6400/* File: arm/op_div_double_2addr.S */
6401/* File: arm/fbinopWide2addr.S */
6402 /*
6403 * Generic 64-bit floating point "/2addr" binary operation. Provide
6404 * an "instr" line that specifies an instruction that performs
6405 * "d2 = d0 op d1".
6406 *
6407 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6408 * div-double/2addr
6409 */
6410 /* binop/2addr vA, vB */
6411 mov r3, rINST, lsr #12 @ r3<- B
6412 mov r9, rINST, lsr #8 @ r9<- A+
6413 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6414 and r9, r9, #15 @ r9<- A
6415 fldd d1, [r3] @ d1<- vB
buzbee50cf6002016-02-10 08:59:12 -08006416 CLEAR_SHADOW_PAIR r9, ip, r0 @ Zero out shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006417 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6418 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6419 fldd d0, [r9] @ d0<- vA
buzbee1452bee2015-03-06 14:43:04 -08006420 fdivd d2, d0, d1 @ d2<- op
6421 GET_INST_OPCODE ip @ extract opcode from rINST
6422 fstd d2, [r9] @ vAA<- d2
6423 GOTO_OPCODE ip @ jump to next instruction
6424
6425
6426/* ------------------------------ */
6427 .balign 128
6428.L_op_rem_double_2addr: /* 0xcf */
6429/* File: arm/op_rem_double_2addr.S */
6430/* EABI doesn't define a double remainder function, but libm does */
6431/* File: arm/binopWide2addr.S */
6432 /*
6433 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6434 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6435 * This could be an ARM instruction or a function call. (If the result
6436 * comes back in a register other than r0, you can override "result".)
6437 *
6438 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6439 * vCC (r1). Useful for integer division and modulus.
6440 *
6441 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6442 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6443 * sub-double/2addr, mul-double/2addr, div-double/2addr,
6444 * rem-double/2addr
6445 */
6446 /* binop/2addr vA, vB */
6447 mov r1, rINST, lsr #12 @ r1<- B
buzbee50cf6002016-02-10 08:59:12 -08006448 ubfx rINST, rINST, #8, #4 @ rINST<- A
buzbee1452bee2015-03-06 14:43:04 -08006449 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
buzbee50cf6002016-02-10 08:59:12 -08006450 add r9, rFP, rINST, lsl #2 @ r9<- &fp[A]
buzbee1452bee2015-03-06 14:43:04 -08006451 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6452 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6453 .if 0
6454 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6455 beq common_errDivideByZero
6456 .endif
buzbee50cf6002016-02-10 08:59:12 -08006457 CLEAR_SHADOW_PAIR rINST, ip, lr @ Zero shadow regs
buzbee1452bee2015-03-06 14:43:04 -08006458 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08006459 @ optional op; may set condition codes
6460 bl fmod @ result<- op, r0-r3 changed
6461 GET_INST_OPCODE ip @ extract opcode from rINST
6462 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6463 GOTO_OPCODE ip @ jump to next instruction
6464 /* 12-15 instructions */
6465
6466
6467/* ------------------------------ */
6468 .balign 128
6469.L_op_add_int_lit16: /* 0xd0 */
6470/* File: arm/op_add_int_lit16.S */
6471/* File: arm/binopLit16.S */
6472 /*
6473 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6474 * that specifies an instruction that performs "result = r0 op r1".
6475 * This could be an ARM instruction or a function call. (If the result
6476 * comes back in a register other than r0, you can override "result".)
6477 *
6478 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6479 * vCC (r1). Useful for integer division and modulus.
6480 *
6481 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6482 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6483 */
6484 /* binop/lit16 vA, vB, #+CCCC */
6485 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6486 mov r2, rINST, lsr #12 @ r2<- B
6487 ubfx r9, rINST, #8, #4 @ r9<- A
6488 GET_VREG r0, r2 @ r0<- vB
6489 .if 0
6490 cmp r1, #0 @ is second operand zero?
6491 beq common_errDivideByZero
6492 .endif
6493 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6494
6495 add r0, r0, r1 @ r0<- op, r0-r3 changed
6496 GET_INST_OPCODE ip @ extract opcode from rINST
6497 SET_VREG r0, r9 @ vAA<- r0
6498 GOTO_OPCODE ip @ jump to next instruction
6499 /* 10-13 instructions */
6500
6501
6502/* ------------------------------ */
6503 .balign 128
6504.L_op_rsub_int: /* 0xd1 */
6505/* File: arm/op_rsub_int.S */
6506/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
6507/* File: arm/binopLit16.S */
6508 /*
6509 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6510 * that specifies an instruction that performs "result = r0 op r1".
6511 * This could be an ARM instruction or a function call. (If the result
6512 * comes back in a register other than r0, you can override "result".)
6513 *
6514 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6515 * vCC (r1). Useful for integer division and modulus.
6516 *
6517 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6518 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6519 */
6520 /* binop/lit16 vA, vB, #+CCCC */
6521 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6522 mov r2, rINST, lsr #12 @ r2<- B
6523 ubfx r9, rINST, #8, #4 @ r9<- A
6524 GET_VREG r0, r2 @ r0<- vB
6525 .if 0
6526 cmp r1, #0 @ is second operand zero?
6527 beq common_errDivideByZero
6528 .endif
6529 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6530
6531 rsb r0, r0, r1 @ r0<- op, r0-r3 changed
6532 GET_INST_OPCODE ip @ extract opcode from rINST
6533 SET_VREG r0, r9 @ vAA<- r0
6534 GOTO_OPCODE ip @ jump to next instruction
6535 /* 10-13 instructions */
6536
6537
6538/* ------------------------------ */
6539 .balign 128
6540.L_op_mul_int_lit16: /* 0xd2 */
6541/* File: arm/op_mul_int_lit16.S */
6542/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6543/* File: arm/binopLit16.S */
6544 /*
6545 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6546 * that specifies an instruction that performs "result = r0 op r1".
6547 * This could be an ARM instruction or a function call. (If the result
6548 * comes back in a register other than r0, you can override "result".)
6549 *
6550 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6551 * vCC (r1). Useful for integer division and modulus.
6552 *
6553 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6554 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6555 */
6556 /* binop/lit16 vA, vB, #+CCCC */
6557 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6558 mov r2, rINST, lsr #12 @ r2<- B
6559 ubfx r9, rINST, #8, #4 @ r9<- A
6560 GET_VREG r0, r2 @ r0<- vB
6561 .if 0
6562 cmp r1, #0 @ is second operand zero?
6563 beq common_errDivideByZero
6564 .endif
6565 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6566
6567 mul r0, r1, r0 @ r0<- op, r0-r3 changed
6568 GET_INST_OPCODE ip @ extract opcode from rINST
6569 SET_VREG r0, r9 @ vAA<- r0
6570 GOTO_OPCODE ip @ jump to next instruction
6571 /* 10-13 instructions */
6572
6573
6574/* ------------------------------ */
6575 .balign 128
6576.L_op_div_int_lit16: /* 0xd3 */
6577/* File: arm/op_div_int_lit16.S */
6578 /*
6579 * Specialized 32-bit binary operation
6580 *
6581 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
6582 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6583 * ARMv7 CPUs that have hardware division support).
6584 *
6585 * div-int/lit16
6586 *
6587 */
6588 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6589 mov r2, rINST, lsr #12 @ r2<- B
6590 ubfx r9, rINST, #8, #4 @ r9<- A
6591 GET_VREG r0, r2 @ r0<- vB
6592 cmp r1, #0 @ is second operand zero?
6593 beq common_errDivideByZero
6594 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6595
6596#ifdef __ARM_ARCH_EXT_IDIV__
6597 sdiv r0, r0, r1 @ r0<- op
6598#else
6599 bl __aeabi_idiv @ r0<- op, r0-r3 changed
6600#endif
6601 GET_INST_OPCODE ip @ extract opcode from rINST
6602 SET_VREG r0, r9 @ vAA<- r0
6603 GOTO_OPCODE ip @ jump to next instruction
6604 /* 10-13 instructions */
6605
6606/* ------------------------------ */
6607 .balign 128
6608.L_op_rem_int_lit16: /* 0xd4 */
6609/* File: arm/op_rem_int_lit16.S */
6610 /*
6611 * Specialized 32-bit binary operation
6612 *
6613 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
6614 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6615 * ARMv7 CPUs that have hardware division support).
6616 *
6617 * NOTE: idivmod returns quotient in r0 and remainder in r1
6618 *
6619 * rem-int/lit16
6620 *
6621 */
6622 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6623 mov r2, rINST, lsr #12 @ r2<- B
6624 ubfx r9, rINST, #8, #4 @ r9<- A
6625 GET_VREG r0, r2 @ r0<- vB
6626 cmp r1, #0 @ is second operand zero?
6627 beq common_errDivideByZero
6628 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6629
6630#ifdef __ARM_ARCH_EXT_IDIV__
6631 sdiv r2, r0, r1
6632 mls r1, r1, r2, r0 @ r1<- op
6633#else
6634 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
6635#endif
6636 GET_INST_OPCODE ip @ extract opcode from rINST
6637 SET_VREG r1, r9 @ vAA<- r1
6638 GOTO_OPCODE ip @ jump to next instruction
6639 /* 10-13 instructions */
6640
6641/* ------------------------------ */
6642 .balign 128
6643.L_op_and_int_lit16: /* 0xd5 */
6644/* File: arm/op_and_int_lit16.S */
6645/* File: arm/binopLit16.S */
6646 /*
6647 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6648 * that specifies an instruction that performs "result = r0 op r1".
6649 * This could be an ARM instruction or a function call. (If the result
6650 * comes back in a register other than r0, you can override "result".)
6651 *
6652 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6653 * vCC (r1). Useful for integer division and modulus.
6654 *
6655 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6656 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6657 */
6658 /* binop/lit16 vA, vB, #+CCCC */
6659 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6660 mov r2, rINST, lsr #12 @ r2<- B
6661 ubfx r9, rINST, #8, #4 @ r9<- A
6662 GET_VREG r0, r2 @ r0<- vB
6663 .if 0
6664 cmp r1, #0 @ is second operand zero?
6665 beq common_errDivideByZero
6666 .endif
6667 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6668
6669 and r0, r0, r1 @ r0<- op, r0-r3 changed
6670 GET_INST_OPCODE ip @ extract opcode from rINST
6671 SET_VREG r0, r9 @ vAA<- r0
6672 GOTO_OPCODE ip @ jump to next instruction
6673 /* 10-13 instructions */
6674
6675
6676/* ------------------------------ */
6677 .balign 128
6678.L_op_or_int_lit16: /* 0xd6 */
6679/* File: arm/op_or_int_lit16.S */
6680/* File: arm/binopLit16.S */
6681 /*
6682 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6683 * that specifies an instruction that performs "result = r0 op r1".
6684 * This could be an ARM instruction or a function call. (If the result
6685 * comes back in a register other than r0, you can override "result".)
6686 *
6687 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6688 * vCC (r1). Useful for integer division and modulus.
6689 *
6690 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6691 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6692 */
6693 /* binop/lit16 vA, vB, #+CCCC */
6694 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6695 mov r2, rINST, lsr #12 @ r2<- B
6696 ubfx r9, rINST, #8, #4 @ r9<- A
6697 GET_VREG r0, r2 @ r0<- vB
6698 .if 0
6699 cmp r1, #0 @ is second operand zero?
6700 beq common_errDivideByZero
6701 .endif
6702 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6703
6704 orr r0, r0, r1 @ r0<- op, r0-r3 changed
6705 GET_INST_OPCODE ip @ extract opcode from rINST
6706 SET_VREG r0, r9 @ vAA<- r0
6707 GOTO_OPCODE ip @ jump to next instruction
6708 /* 10-13 instructions */
6709
6710
6711/* ------------------------------ */
6712 .balign 128
6713.L_op_xor_int_lit16: /* 0xd7 */
6714/* File: arm/op_xor_int_lit16.S */
6715/* File: arm/binopLit16.S */
6716 /*
6717 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6718 * that specifies an instruction that performs "result = r0 op r1".
6719 * This could be an ARM instruction or a function call. (If the result
6720 * comes back in a register other than r0, you can override "result".)
6721 *
6722 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6723 * vCC (r1). Useful for integer division and modulus.
6724 *
6725 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6726 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6727 */
6728 /* binop/lit16 vA, vB, #+CCCC */
6729 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6730 mov r2, rINST, lsr #12 @ r2<- B
6731 ubfx r9, rINST, #8, #4 @ r9<- A
6732 GET_VREG r0, r2 @ r0<- vB
6733 .if 0
6734 cmp r1, #0 @ is second operand zero?
6735 beq common_errDivideByZero
6736 .endif
6737 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6738
6739 eor r0, r0, r1 @ r0<- op, r0-r3 changed
6740 GET_INST_OPCODE ip @ extract opcode from rINST
6741 SET_VREG r0, r9 @ vAA<- r0
6742 GOTO_OPCODE ip @ jump to next instruction
6743 /* 10-13 instructions */
6744
6745
6746/* ------------------------------ */
6747 .balign 128
6748.L_op_add_int_lit8: /* 0xd8 */
6749/* File: arm/op_add_int_lit8.S */
6750/* File: arm/binopLit8.S */
6751 /*
6752 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6753 * that specifies an instruction that performs "result = r0 op r1".
6754 * This could be an ARM instruction or a function call. (If the result
6755 * comes back in a register other than r0, you can override "result".)
6756 *
6757 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6758 * vCC (r1). Useful for integer division and modulus.
6759 *
6760 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6761 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6762 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6763 */
6764 /* binop/lit8 vAA, vBB, #+CC */
6765 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6766 mov r9, rINST, lsr #8 @ r9<- AA
6767 and r2, r3, #255 @ r2<- BB
6768 GET_VREG r0, r2 @ r0<- vBB
6769 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6770 .if 0
6771 @cmp r1, #0 @ is second operand zero?
6772 beq common_errDivideByZero
6773 .endif
6774 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6775
6776 @ optional op; may set condition codes
6777 add r0, r0, r1 @ r0<- op, r0-r3 changed
6778 GET_INST_OPCODE ip @ extract opcode from rINST
6779 SET_VREG r0, r9 @ vAA<- r0
6780 GOTO_OPCODE ip @ jump to next instruction
6781 /* 10-12 instructions */
6782
6783
6784/* ------------------------------ */
6785 .balign 128
6786.L_op_rsub_int_lit8: /* 0xd9 */
6787/* File: arm/op_rsub_int_lit8.S */
6788/* File: arm/binopLit8.S */
6789 /*
6790 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6791 * that specifies an instruction that performs "result = r0 op r1".
6792 * This could be an ARM instruction or a function call. (If the result
6793 * comes back in a register other than r0, you can override "result".)
6794 *
6795 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6796 * vCC (r1). Useful for integer division and modulus.
6797 *
6798 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6799 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6800 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6801 */
6802 /* binop/lit8 vAA, vBB, #+CC */
6803 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6804 mov r9, rINST, lsr #8 @ r9<- AA
6805 and r2, r3, #255 @ r2<- BB
6806 GET_VREG r0, r2 @ r0<- vBB
6807 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6808 .if 0
6809 @cmp r1, #0 @ is second operand zero?
6810 beq common_errDivideByZero
6811 .endif
6812 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6813
6814 @ optional op; may set condition codes
6815 rsb r0, r0, r1 @ r0<- op, r0-r3 changed
6816 GET_INST_OPCODE ip @ extract opcode from rINST
6817 SET_VREG r0, r9 @ vAA<- r0
6818 GOTO_OPCODE ip @ jump to next instruction
6819 /* 10-12 instructions */
6820
6821
6822/* ------------------------------ */
6823 .balign 128
6824.L_op_mul_int_lit8: /* 0xda */
6825/* File: arm/op_mul_int_lit8.S */
6826/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6827/* File: arm/binopLit8.S */
6828 /*
6829 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6830 * that specifies an instruction that performs "result = r0 op r1".
6831 * This could be an ARM instruction or a function call. (If the result
6832 * comes back in a register other than r0, you can override "result".)
6833 *
6834 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6835 * vCC (r1). Useful for integer division and modulus.
6836 *
6837 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6838 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6839 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6840 */
6841 /* binop/lit8 vAA, vBB, #+CC */
6842 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6843 mov r9, rINST, lsr #8 @ r9<- AA
6844 and r2, r3, #255 @ r2<- BB
6845 GET_VREG r0, r2 @ r0<- vBB
6846 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6847 .if 0
6848 @cmp r1, #0 @ is second operand zero?
6849 beq common_errDivideByZero
6850 .endif
6851 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6852
6853 @ optional op; may set condition codes
6854 mul r0, r1, r0 @ r0<- op, r0-r3 changed
6855 GET_INST_OPCODE ip @ extract opcode from rINST
6856 SET_VREG r0, r9 @ vAA<- r0
6857 GOTO_OPCODE ip @ jump to next instruction
6858 /* 10-12 instructions */
6859
6860
6861/* ------------------------------ */
6862 .balign 128
6863.L_op_div_int_lit8: /* 0xdb */
6864/* File: arm/op_div_int_lit8.S */
6865 /*
6866 * Specialized 32-bit binary operation
6867 *
6868 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
6869 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6870 * ARMv7 CPUs that have hardware division support).
6871 *
6872 * div-int/lit8
6873 *
6874 */
6875 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6876 mov r9, rINST, lsr #8 @ r9<- AA
6877 and r2, r3, #255 @ r2<- BB
6878 GET_VREG r0, r2 @ r0<- vBB
6879 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6880 @cmp r1, #0 @ is second operand zero?
6881 beq common_errDivideByZero
6882 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6883
6884#ifdef __ARM_ARCH_EXT_IDIV__
6885 sdiv r0, r0, r1 @ r0<- op
6886#else
6887 bl __aeabi_idiv @ r0<- op, r0-r3 changed
6888#endif
6889 GET_INST_OPCODE ip @ extract opcode from rINST
6890 SET_VREG r0, r9 @ vAA<- r0
6891 GOTO_OPCODE ip @ jump to next instruction
6892 /* 10-12 instructions */
6893
6894/* ------------------------------ */
6895 .balign 128
6896.L_op_rem_int_lit8: /* 0xdc */
6897/* File: arm/op_rem_int_lit8.S */
6898 /*
6899 * Specialized 32-bit binary operation
6900 *
6901 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
6902 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6903 * ARMv7 CPUs that have hardware division support).
6904 *
6905 * NOTE: idivmod returns quotient in r0 and remainder in r1
6906 *
6907 * rem-int/lit8
6908 *
6909 */
6910 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC)
6911 mov r9, rINST, lsr #8 @ r9<- AA
6912 and r2, r3, #255 @ r2<- BB
6913 GET_VREG r0, r2 @ r0<- vBB
6914 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6915 @cmp r1, #0 @ is second operand zero?
6916 beq common_errDivideByZero
6917 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6918
6919#ifdef __ARM_ARCH_EXT_IDIV__
6920 sdiv r2, r0, r1
6921 mls r1, r1, r2, r0 @ r1<- op
6922#else
6923 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
6924#endif
6925 GET_INST_OPCODE ip @ extract opcode from rINST
6926 SET_VREG r1, r9 @ vAA<- r1
6927 GOTO_OPCODE ip @ jump to next instruction
6928 /* 10-12 instructions */
6929
6930/* ------------------------------ */
6931 .balign 128
6932.L_op_and_int_lit8: /* 0xdd */
6933/* File: arm/op_and_int_lit8.S */
6934/* File: arm/binopLit8.S */
6935 /*
6936 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6937 * that specifies an instruction that performs "result = r0 op r1".
6938 * This could be an ARM instruction or a function call. (If the result
6939 * comes back in a register other than r0, you can override "result".)
6940 *
6941 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6942 * vCC (r1). Useful for integer division and modulus.
6943 *
6944 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6945 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6946 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6947 */
6948 /* binop/lit8 vAA, vBB, #+CC */
6949 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6950 mov r9, rINST, lsr #8 @ r9<- AA
6951 and r2, r3, #255 @ r2<- BB
6952 GET_VREG r0, r2 @ r0<- vBB
6953 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6954 .if 0
6955 @cmp r1, #0 @ is second operand zero?
6956 beq common_errDivideByZero
6957 .endif
6958 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6959
6960 @ optional op; may set condition codes
6961 and r0, r0, r1 @ r0<- op, r0-r3 changed
6962 GET_INST_OPCODE ip @ extract opcode from rINST
6963 SET_VREG r0, r9 @ vAA<- r0
6964 GOTO_OPCODE ip @ jump to next instruction
6965 /* 10-12 instructions */
6966
6967
6968/* ------------------------------ */
6969 .balign 128
6970.L_op_or_int_lit8: /* 0xde */
6971/* File: arm/op_or_int_lit8.S */
6972/* File: arm/binopLit8.S */
6973 /*
6974 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6975 * that specifies an instruction that performs "result = r0 op r1".
6976 * This could be an ARM instruction or a function call. (If the result
6977 * comes back in a register other than r0, you can override "result".)
6978 *
6979 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6980 * vCC (r1). Useful for integer division and modulus.
6981 *
6982 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6983 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6984 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6985 */
6986 /* binop/lit8 vAA, vBB, #+CC */
6987 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6988 mov r9, rINST, lsr #8 @ r9<- AA
6989 and r2, r3, #255 @ r2<- BB
6990 GET_VREG r0, r2 @ r0<- vBB
6991 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6992 .if 0
6993 @cmp r1, #0 @ is second operand zero?
6994 beq common_errDivideByZero
6995 .endif
6996 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6997
6998 @ optional op; may set condition codes
6999 orr r0, r0, r1 @ r0<- op, r0-r3 changed
7000 GET_INST_OPCODE ip @ extract opcode from rINST
7001 SET_VREG r0, r9 @ vAA<- r0
7002 GOTO_OPCODE ip @ jump to next instruction
7003 /* 10-12 instructions */
7004
7005
7006/* ------------------------------ */
7007 .balign 128
7008.L_op_xor_int_lit8: /* 0xdf */
7009/* File: arm/op_xor_int_lit8.S */
7010/* File: arm/binopLit8.S */
7011 /*
7012 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7013 * that specifies an instruction that performs "result = r0 op r1".
7014 * This could be an ARM instruction or a function call. (If the result
7015 * comes back in a register other than r0, you can override "result".)
7016 *
7017 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7018 * vCC (r1). Useful for integer division and modulus.
7019 *
7020 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7021 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7022 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7023 */
7024 /* binop/lit8 vAA, vBB, #+CC */
7025 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7026 mov r9, rINST, lsr #8 @ r9<- AA
7027 and r2, r3, #255 @ r2<- BB
7028 GET_VREG r0, r2 @ r0<- vBB
7029 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7030 .if 0
7031 @cmp r1, #0 @ is second operand zero?
7032 beq common_errDivideByZero
7033 .endif
7034 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7035
7036 @ optional op; may set condition codes
7037 eor r0, r0, r1 @ r0<- op, r0-r3 changed
7038 GET_INST_OPCODE ip @ extract opcode from rINST
7039 SET_VREG r0, r9 @ vAA<- r0
7040 GOTO_OPCODE ip @ jump to next instruction
7041 /* 10-12 instructions */
7042
7043
7044/* ------------------------------ */
7045 .balign 128
7046.L_op_shl_int_lit8: /* 0xe0 */
7047/* File: arm/op_shl_int_lit8.S */
7048/* File: arm/binopLit8.S */
7049 /*
7050 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7051 * that specifies an instruction that performs "result = r0 op r1".
7052 * This could be an ARM instruction or a function call. (If the result
7053 * comes back in a register other than r0, you can override "result".)
7054 *
7055 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7056 * vCC (r1). Useful for integer division and modulus.
7057 *
7058 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7059 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7060 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7061 */
7062 /* binop/lit8 vAA, vBB, #+CC */
7063 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7064 mov r9, rINST, lsr #8 @ r9<- AA
7065 and r2, r3, #255 @ r2<- BB
7066 GET_VREG r0, r2 @ r0<- vBB
7067 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7068 .if 0
7069 @cmp r1, #0 @ is second operand zero?
7070 beq common_errDivideByZero
7071 .endif
7072 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7073
7074 and r1, r1, #31 @ optional op; may set condition codes
7075 mov r0, r0, asl r1 @ r0<- op, r0-r3 changed
7076 GET_INST_OPCODE ip @ extract opcode from rINST
7077 SET_VREG r0, r9 @ vAA<- r0
7078 GOTO_OPCODE ip @ jump to next instruction
7079 /* 10-12 instructions */
7080
7081
7082/* ------------------------------ */
7083 .balign 128
7084.L_op_shr_int_lit8: /* 0xe1 */
7085/* File: arm/op_shr_int_lit8.S */
7086/* File: arm/binopLit8.S */
7087 /*
7088 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7089 * that specifies an instruction that performs "result = r0 op r1".
7090 * This could be an ARM instruction or a function call. (If the result
7091 * comes back in a register other than r0, you can override "result".)
7092 *
7093 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7094 * vCC (r1). Useful for integer division and modulus.
7095 *
7096 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7097 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7098 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7099 */
7100 /* binop/lit8 vAA, vBB, #+CC */
7101 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7102 mov r9, rINST, lsr #8 @ r9<- AA
7103 and r2, r3, #255 @ r2<- BB
7104 GET_VREG r0, r2 @ r0<- vBB
7105 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7106 .if 0
7107 @cmp r1, #0 @ is second operand zero?
7108 beq common_errDivideByZero
7109 .endif
7110 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7111
7112 and r1, r1, #31 @ optional op; may set condition codes
7113 mov r0, r0, asr r1 @ r0<- op, r0-r3 changed
7114 GET_INST_OPCODE ip @ extract opcode from rINST
7115 SET_VREG r0, r9 @ vAA<- r0
7116 GOTO_OPCODE ip @ jump to next instruction
7117 /* 10-12 instructions */
7118
7119
7120/* ------------------------------ */
7121 .balign 128
7122.L_op_ushr_int_lit8: /* 0xe2 */
7123/* File: arm/op_ushr_int_lit8.S */
7124/* File: arm/binopLit8.S */
7125 /*
7126 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7127 * that specifies an instruction that performs "result = r0 op r1".
7128 * This could be an ARM instruction or a function call. (If the result
7129 * comes back in a register other than r0, you can override "result".)
7130 *
7131 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7132 * vCC (r1). Useful for integer division and modulus.
7133 *
7134 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7135 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7136 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7137 */
7138 /* binop/lit8 vAA, vBB, #+CC */
7139 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7140 mov r9, rINST, lsr #8 @ r9<- AA
7141 and r2, r3, #255 @ r2<- BB
7142 GET_VREG r0, r2 @ r0<- vBB
7143 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7144 .if 0
7145 @cmp r1, #0 @ is second operand zero?
7146 beq common_errDivideByZero
7147 .endif
7148 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7149
7150 and r1, r1, #31 @ optional op; may set condition codes
7151 mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed
7152 GET_INST_OPCODE ip @ extract opcode from rINST
7153 SET_VREG r0, r9 @ vAA<- r0
7154 GOTO_OPCODE ip @ jump to next instruction
7155 /* 10-12 instructions */
7156
7157
7158/* ------------------------------ */
7159 .balign 128
7160.L_op_iget_quick: /* 0xe3 */
7161/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007162 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007163 /* op vA, vB, offset@CCCC */
7164 mov r2, rINST, lsr #12 @ r2<- B
7165 FETCH r1, 1 @ r1<- field byte offset
7166 GET_VREG r3, r2 @ r3<- object we're operating on
7167 ubfx r2, rINST, #8, #4 @ r2<- A
7168 cmp r3, #0 @ check object for null
7169 beq common_errNullObject @ object was null
7170 ldr r0, [r3, r1] @ r0<- obj.field
7171 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007172 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007173 GET_INST_OPCODE ip @ extract opcode from rINST
7174 GOTO_OPCODE ip @ jump to next instruction
7175
7176/* ------------------------------ */
7177 .balign 128
7178.L_op_iget_wide_quick: /* 0xe4 */
7179/* File: arm/op_iget_wide_quick.S */
7180 /* iget-wide-quick vA, vB, offset@CCCC */
7181 mov r2, rINST, lsr #12 @ r2<- B
7182 FETCH ip, 1 @ ip<- field byte offset
7183 GET_VREG r3, r2 @ r3<- object we're operating on
7184 ubfx r2, rINST, #8, #4 @ r2<- A
7185 cmp r3, #0 @ check object for null
7186 beq common_errNullObject @ object was null
7187 ldrd r0, [r3, ip] @ r0<- obj.field (64 bits, aligned)
7188 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7189 add r3, rFP, r2, lsl #2 @ r3<- &fp[A]
buzbee50cf6002016-02-10 08:59:12 -08007190 CLEAR_SHADOW_PAIR r2, ip, lr @ Zero out the shadow regs
buzbee1452bee2015-03-06 14:43:04 -08007191 GET_INST_OPCODE ip @ extract opcode from rINST
7192 stmia r3, {r0-r1} @ fp[A]<- r0/r1
7193 GOTO_OPCODE ip @ jump to next instruction
7194
7195/* ------------------------------ */
7196 .balign 128
7197.L_op_iget_object_quick: /* 0xe5 */
7198/* File: arm/op_iget_object_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007199 /* For: iget-object-quick */
buzbee1452bee2015-03-06 14:43:04 -08007200 /* op vA, vB, offset@CCCC */
7201 mov r2, rINST, lsr #12 @ r2<- B
7202 FETCH r1, 1 @ r1<- field byte offset
buzbeebb6e7262016-01-14 05:34:34 -08007203 EXPORT_PC
buzbee76833da2016-01-13 13:06:22 -08007204 GET_VREG r0, r2 @ r0<- object we're operating on
buzbee76833da2016-01-13 13:06:22 -08007205 bl artIGetObjectFromMterp @ (obj, offset)
7206 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
7207 ubfx r2, rINST, #8, #4 @ r2<- A
7208 PREFETCH_INST 2
7209 cmp r3, #0
7210 bne MterpPossibleException @ bail out
buzbee1452bee2015-03-06 14:43:04 -08007211 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
buzbee76833da2016-01-13 13:06:22 -08007212 ADVANCE 2 @ advance rPC
buzbee1452bee2015-03-06 14:43:04 -08007213 GET_INST_OPCODE ip @ extract opcode from rINST
7214 GOTO_OPCODE ip @ jump to next instruction
7215
buzbee1452bee2015-03-06 14:43:04 -08007216/* ------------------------------ */
7217 .balign 128
7218.L_op_iput_quick: /* 0xe6 */
7219/* File: arm/op_iput_quick.S */
7220 /* For: iput-quick, iput-object-quick */
7221 /* op vA, vB, offset@CCCC */
7222 mov r2, rINST, lsr #12 @ r2<- B
7223 FETCH r1, 1 @ r1<- field byte offset
7224 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7225 ubfx r2, rINST, #8, #4 @ r2<- A
7226 cmp r3, #0 @ check object for null
7227 beq common_errNullObject @ object was null
7228 GET_VREG r0, r2 @ r0<- fp[A]
7229 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7230 str r0, [r3, r1] @ obj.field<- r0
7231 GET_INST_OPCODE ip @ extract opcode from rINST
7232 GOTO_OPCODE ip @ jump to next instruction
7233
7234/* ------------------------------ */
7235 .balign 128
7236.L_op_iput_wide_quick: /* 0xe7 */
7237/* File: arm/op_iput_wide_quick.S */
7238 /* iput-wide-quick vA, vB, offset@CCCC */
7239 mov r2, rINST, lsr #12 @ r2<- B
7240 FETCH r3, 1 @ r3<- field byte offset
7241 GET_VREG r2, r2 @ r2<- fp[B], the object pointer
7242 ubfx r0, rINST, #8, #4 @ r0<- A
7243 cmp r2, #0 @ check object for null
7244 beq common_errNullObject @ object was null
7245 add r0, rFP, r0, lsl #2 @ r0<- &fp[A]
7246 ldmia r0, {r0-r1} @ r0/r1<- fp[A]/fp[A+1]
7247 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7248 strd r0, [r2, r3] @ obj.field<- r0/r1
7249 GET_INST_OPCODE ip @ extract opcode from rINST
7250 GOTO_OPCODE ip @ jump to next instruction
7251
7252/* ------------------------------ */
7253 .balign 128
7254.L_op_iput_object_quick: /* 0xe8 */
7255/* File: arm/op_iput_object_quick.S */
7256 EXPORT_PC
7257 add r0, rFP, #OFF_FP_SHADOWFRAME
7258 mov r1, rPC
7259 mov r2, rINST
7260 bl MterpIputObjectQuick
7261 cmp r0, #0
7262 beq MterpException
7263 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7264 GET_INST_OPCODE ip @ extract opcode from rINST
7265 GOTO_OPCODE ip @ jump to next instruction
7266
7267/* ------------------------------ */
7268 .balign 128
7269.L_op_invoke_virtual_quick: /* 0xe9 */
7270/* File: arm/op_invoke_virtual_quick.S */
7271/* File: arm/invoke.S */
7272 /*
7273 * Generic invoke handler wrapper.
7274 */
7275 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7276 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7277 .extern MterpInvokeVirtualQuick
7278 EXPORT_PC
7279 mov r0, rSELF
7280 add r1, rFP, #OFF_FP_SHADOWFRAME
7281 mov r2, rPC
7282 mov r3, rINST
7283 bl MterpInvokeVirtualQuick
7284 cmp r0, #0
7285 beq MterpException
7286 FETCH_ADVANCE_INST 3
7287 GET_INST_OPCODE ip
7288 GOTO_OPCODE ip
7289
7290
7291
7292/* ------------------------------ */
7293 .balign 128
7294.L_op_invoke_virtual_range_quick: /* 0xea */
7295/* File: arm/op_invoke_virtual_range_quick.S */
7296/* File: arm/invoke.S */
7297 /*
7298 * Generic invoke handler wrapper.
7299 */
7300 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7301 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7302 .extern MterpInvokeVirtualQuickRange
7303 EXPORT_PC
7304 mov r0, rSELF
7305 add r1, rFP, #OFF_FP_SHADOWFRAME
7306 mov r2, rPC
7307 mov r3, rINST
7308 bl MterpInvokeVirtualQuickRange
7309 cmp r0, #0
7310 beq MterpException
7311 FETCH_ADVANCE_INST 3
7312 GET_INST_OPCODE ip
7313 GOTO_OPCODE ip
7314
7315
7316
7317/* ------------------------------ */
7318 .balign 128
7319.L_op_iput_boolean_quick: /* 0xeb */
7320/* File: arm/op_iput_boolean_quick.S */
7321/* File: arm/op_iput_quick.S */
7322 /* For: iput-quick, iput-object-quick */
7323 /* op vA, vB, offset@CCCC */
7324 mov r2, rINST, lsr #12 @ r2<- B
7325 FETCH r1, 1 @ r1<- field byte offset
7326 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7327 ubfx r2, rINST, #8, #4 @ r2<- A
7328 cmp r3, #0 @ check object for null
7329 beq common_errNullObject @ object was null
7330 GET_VREG r0, r2 @ r0<- fp[A]
7331 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7332 strb r0, [r3, r1] @ obj.field<- r0
7333 GET_INST_OPCODE ip @ extract opcode from rINST
7334 GOTO_OPCODE ip @ jump to next instruction
7335
7336
7337/* ------------------------------ */
7338 .balign 128
7339.L_op_iput_byte_quick: /* 0xec */
7340/* File: arm/op_iput_byte_quick.S */
7341/* File: arm/op_iput_quick.S */
7342 /* For: iput-quick, iput-object-quick */
7343 /* op vA, vB, offset@CCCC */
7344 mov r2, rINST, lsr #12 @ r2<- B
7345 FETCH r1, 1 @ r1<- field byte offset
7346 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7347 ubfx r2, rINST, #8, #4 @ r2<- A
7348 cmp r3, #0 @ check object for null
7349 beq common_errNullObject @ object was null
7350 GET_VREG r0, r2 @ r0<- fp[A]
7351 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7352 strb r0, [r3, r1] @ obj.field<- r0
7353 GET_INST_OPCODE ip @ extract opcode from rINST
7354 GOTO_OPCODE ip @ jump to next instruction
7355
7356
7357/* ------------------------------ */
7358 .balign 128
7359.L_op_iput_char_quick: /* 0xed */
7360/* File: arm/op_iput_char_quick.S */
7361/* File: arm/op_iput_quick.S */
7362 /* For: iput-quick, iput-object-quick */
7363 /* op vA, vB, offset@CCCC */
7364 mov r2, rINST, lsr #12 @ r2<- B
7365 FETCH r1, 1 @ r1<- field byte offset
7366 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7367 ubfx r2, rINST, #8, #4 @ r2<- A
7368 cmp r3, #0 @ check object for null
7369 beq common_errNullObject @ object was null
7370 GET_VREG r0, r2 @ r0<- fp[A]
7371 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7372 strh r0, [r3, r1] @ obj.field<- r0
7373 GET_INST_OPCODE ip @ extract opcode from rINST
7374 GOTO_OPCODE ip @ jump to next instruction
7375
7376
7377/* ------------------------------ */
7378 .balign 128
7379.L_op_iput_short_quick: /* 0xee */
7380/* File: arm/op_iput_short_quick.S */
7381/* File: arm/op_iput_quick.S */
7382 /* For: iput-quick, iput-object-quick */
7383 /* op vA, vB, offset@CCCC */
7384 mov r2, rINST, lsr #12 @ r2<- B
7385 FETCH r1, 1 @ r1<- field byte offset
7386 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7387 ubfx r2, rINST, #8, #4 @ r2<- A
7388 cmp r3, #0 @ check object for null
7389 beq common_errNullObject @ object was null
7390 GET_VREG r0, r2 @ r0<- fp[A]
7391 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7392 strh r0, [r3, r1] @ obj.field<- r0
7393 GET_INST_OPCODE ip @ extract opcode from rINST
7394 GOTO_OPCODE ip @ jump to next instruction
7395
7396
7397/* ------------------------------ */
7398 .balign 128
7399.L_op_iget_boolean_quick: /* 0xef */
7400/* File: arm/op_iget_boolean_quick.S */
7401/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007402 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007403 /* op vA, vB, offset@CCCC */
7404 mov r2, rINST, lsr #12 @ r2<- B
7405 FETCH r1, 1 @ r1<- field byte offset
7406 GET_VREG r3, r2 @ r3<- object we're operating on
7407 ubfx r2, rINST, #8, #4 @ r2<- A
7408 cmp r3, #0 @ check object for null
7409 beq common_errNullObject @ object was null
7410 ldrb r0, [r3, r1] @ r0<- obj.field
7411 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007412 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007413 GET_INST_OPCODE ip @ extract opcode from rINST
7414 GOTO_OPCODE ip @ jump to next instruction
7415
7416
7417/* ------------------------------ */
7418 .balign 128
7419.L_op_iget_byte_quick: /* 0xf0 */
7420/* File: arm/op_iget_byte_quick.S */
7421/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007422 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007423 /* op vA, vB, offset@CCCC */
7424 mov r2, rINST, lsr #12 @ r2<- B
7425 FETCH r1, 1 @ r1<- field byte offset
7426 GET_VREG r3, r2 @ r3<- object we're operating on
7427 ubfx r2, rINST, #8, #4 @ r2<- A
7428 cmp r3, #0 @ check object for null
7429 beq common_errNullObject @ object was null
7430 ldrsb r0, [r3, r1] @ r0<- obj.field
7431 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007432 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007433 GET_INST_OPCODE ip @ extract opcode from rINST
7434 GOTO_OPCODE ip @ jump to next instruction
7435
7436
7437/* ------------------------------ */
7438 .balign 128
7439.L_op_iget_char_quick: /* 0xf1 */
7440/* File: arm/op_iget_char_quick.S */
7441/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007442 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007443 /* op vA, vB, offset@CCCC */
7444 mov r2, rINST, lsr #12 @ r2<- B
7445 FETCH r1, 1 @ r1<- field byte offset
7446 GET_VREG r3, r2 @ r3<- object we're operating on
7447 ubfx r2, rINST, #8, #4 @ r2<- A
7448 cmp r3, #0 @ check object for null
7449 beq common_errNullObject @ object was null
7450 ldrh r0, [r3, r1] @ r0<- obj.field
7451 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007452 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007453 GET_INST_OPCODE ip @ extract opcode from rINST
7454 GOTO_OPCODE ip @ jump to next instruction
7455
7456
7457/* ------------------------------ */
7458 .balign 128
7459.L_op_iget_short_quick: /* 0xf2 */
7460/* File: arm/op_iget_short_quick.S */
7461/* File: arm/op_iget_quick.S */
buzbee76833da2016-01-13 13:06:22 -08007462 /* For: iget-quick, iget-boolean-quick, iget-byte-quick, iget-char-quick, iget-short-quick */
buzbee1452bee2015-03-06 14:43:04 -08007463 /* op vA, vB, offset@CCCC */
7464 mov r2, rINST, lsr #12 @ r2<- B
7465 FETCH r1, 1 @ r1<- field byte offset
7466 GET_VREG r3, r2 @ r3<- object we're operating on
7467 ubfx r2, rINST, #8, #4 @ r2<- A
7468 cmp r3, #0 @ check object for null
7469 beq common_errNullObject @ object was null
7470 ldrsh r0, [r3, r1] @ r0<- obj.field
7471 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
buzbee1452bee2015-03-06 14:43:04 -08007472 SET_VREG r0, r2 @ fp[A]<- r0
buzbee1452bee2015-03-06 14:43:04 -08007473 GET_INST_OPCODE ip @ extract opcode from rINST
7474 GOTO_OPCODE ip @ jump to next instruction
7475
7476
7477/* ------------------------------ */
7478 .balign 128
7479.L_op_invoke_lambda: /* 0xf3 */
7480/* Transfer stub to alternate interpreter */
7481 b MterpFallback
7482
7483
7484/* ------------------------------ */
7485 .balign 128
7486.L_op_unused_f4: /* 0xf4 */
7487/* File: arm/op_unused_f4.S */
7488/* File: arm/unused.S */
7489/*
7490 * Bail to reference interpreter to throw.
7491 */
7492 b MterpFallback
7493
7494
7495/* ------------------------------ */
7496 .balign 128
7497.L_op_capture_variable: /* 0xf5 */
7498/* Transfer stub to alternate interpreter */
7499 b MterpFallback
7500
7501
7502/* ------------------------------ */
7503 .balign 128
7504.L_op_create_lambda: /* 0xf6 */
7505/* Transfer stub to alternate interpreter */
7506 b MterpFallback
7507
7508
7509/* ------------------------------ */
7510 .balign 128
7511.L_op_liberate_variable: /* 0xf7 */
7512/* Transfer stub to alternate interpreter */
7513 b MterpFallback
7514
7515
7516/* ------------------------------ */
7517 .balign 128
7518.L_op_box_lambda: /* 0xf8 */
7519/* Transfer stub to alternate interpreter */
7520 b MterpFallback
7521
7522
7523/* ------------------------------ */
7524 .balign 128
7525.L_op_unbox_lambda: /* 0xf9 */
7526/* Transfer stub to alternate interpreter */
7527 b MterpFallback
7528
7529
7530/* ------------------------------ */
7531 .balign 128
7532.L_op_unused_fa: /* 0xfa */
7533/* File: arm/op_unused_fa.S */
7534/* File: arm/unused.S */
7535/*
7536 * Bail to reference interpreter to throw.
7537 */
7538 b MterpFallback
7539
7540
7541/* ------------------------------ */
7542 .balign 128
7543.L_op_unused_fb: /* 0xfb */
7544/* File: arm/op_unused_fb.S */
7545/* File: arm/unused.S */
7546/*
7547 * Bail to reference interpreter to throw.
7548 */
7549 b MterpFallback
7550
7551
7552/* ------------------------------ */
7553 .balign 128
7554.L_op_unused_fc: /* 0xfc */
7555/* File: arm/op_unused_fc.S */
7556/* File: arm/unused.S */
7557/*
7558 * Bail to reference interpreter to throw.
7559 */
7560 b MterpFallback
7561
7562
7563/* ------------------------------ */
7564 .balign 128
7565.L_op_unused_fd: /* 0xfd */
7566/* File: arm/op_unused_fd.S */
7567/* File: arm/unused.S */
7568/*
7569 * Bail to reference interpreter to throw.
7570 */
7571 b MterpFallback
7572
7573
7574/* ------------------------------ */
7575 .balign 128
7576.L_op_unused_fe: /* 0xfe */
7577/* File: arm/op_unused_fe.S */
7578/* File: arm/unused.S */
7579/*
7580 * Bail to reference interpreter to throw.
7581 */
7582 b MterpFallback
7583
7584
7585/* ------------------------------ */
7586 .balign 128
7587.L_op_unused_ff: /* 0xff */
7588/* File: arm/op_unused_ff.S */
7589/* File: arm/unused.S */
7590/*
7591 * Bail to reference interpreter to throw.
7592 */
7593 b MterpFallback
7594
7595
7596 .balign 128
7597 .size artMterpAsmInstructionStart, .-artMterpAsmInstructionStart
7598 .global artMterpAsmInstructionEnd
7599artMterpAsmInstructionEnd:
7600
7601/*
7602 * ===========================================================================
7603 * Sister implementations
7604 * ===========================================================================
7605 */
7606 .global artMterpAsmSisterStart
7607 .type artMterpAsmSisterStart, %function
7608 .text
7609 .balign 4
7610artMterpAsmSisterStart:
7611
7612/* continuation for op_cmp_long */
7613
7614.Lop_cmp_long_less:
7615 mvn r1, #0 @ r1<- -1
7616 @ Want to cond code the next mov so we can avoid branch, but don't see it;
7617 @ instead, we just replicate the tail end.
7618 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7619 SET_VREG r1, r9 @ vAA<- r1
7620 GET_INST_OPCODE ip @ extract opcode from rINST
7621 GOTO_OPCODE ip @ jump to next instruction
7622
7623.Lop_cmp_long_greater:
7624 mov r1, #1 @ r1<- 1
7625 @ fall through to _finish
7626
7627.Lop_cmp_long_finish:
7628 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7629 SET_VREG r1, r9 @ vAA<- r1
7630 GET_INST_OPCODE ip @ extract opcode from rINST
7631 GOTO_OPCODE ip @ jump to next instruction
7632
7633/* continuation for op_float_to_long */
7634/*
7635 * Convert the float in r0 to a long in r0/r1.
7636 *
7637 * We have to clip values to long min/max per the specification. The
7638 * expected common case is a "reasonable" value that converts directly
7639 * to modest integer. The EABI convert function isn't doing this for us.
7640 */
7641f2l_doconv:
7642 stmfd sp!, {r4, lr}
7643 mov r1, #0x5f000000 @ (float)maxlong
7644 mov r4, r0
7645 bl __aeabi_fcmpge @ is arg >= maxlong?
7646 cmp r0, #0 @ nonzero == yes
7647 mvnne r0, #0 @ return maxlong (7fffffff)
7648 mvnne r1, #0x80000000
7649 ldmnefd sp!, {r4, pc}
7650
7651 mov r0, r4 @ recover arg
7652 mov r1, #0xdf000000 @ (float)minlong
7653 bl __aeabi_fcmple @ is arg <= minlong?
7654 cmp r0, #0 @ nonzero == yes
7655 movne r0, #0 @ return minlong (80000000)
7656 movne r1, #0x80000000
7657 ldmnefd sp!, {r4, pc}
7658
7659 mov r0, r4 @ recover arg
7660 mov r1, r4
7661 bl __aeabi_fcmpeq @ is arg == self?
7662 cmp r0, #0 @ zero == no
7663 moveq r1, #0 @ return zero for NaN
7664 ldmeqfd sp!, {r4, pc}
7665
7666 mov r0, r4 @ recover arg
7667 bl __aeabi_f2lz @ convert float to long
7668 ldmfd sp!, {r4, pc}
7669
7670/* continuation for op_double_to_long */
7671/*
7672 * Convert the double in r0/r1 to a long in r0/r1.
7673 *
7674 * We have to clip values to long min/max per the specification. The
7675 * expected common case is a "reasonable" value that converts directly
7676 * to modest integer. The EABI convert function isn't doing this for us.
7677 */
7678d2l_doconv:
7679 stmfd sp!, {r4, r5, lr} @ save regs
7680 mov r3, #0x43000000 @ maxlong, as a double (high word)
7681 add r3, #0x00e00000 @ 0x43e00000
7682 mov r2, #0 @ maxlong, as a double (low word)
7683 sub sp, sp, #4 @ align for EABI
7684 mov r4, r0 @ save a copy of r0
7685 mov r5, r1 @ and r1
7686 bl __aeabi_dcmpge @ is arg >= maxlong?
7687 cmp r0, #0 @ nonzero == yes
7688 mvnne r0, #0 @ return maxlong (7fffffffffffffff)
7689 mvnne r1, #0x80000000
7690 bne 1f
7691
7692 mov r0, r4 @ recover arg
7693 mov r1, r5
7694 mov r3, #0xc3000000 @ minlong, as a double (high word)
7695 add r3, #0x00e00000 @ 0xc3e00000
7696 mov r2, #0 @ minlong, as a double (low word)
7697 bl __aeabi_dcmple @ is arg <= minlong?
7698 cmp r0, #0 @ nonzero == yes
7699 movne r0, #0 @ return minlong (8000000000000000)
7700 movne r1, #0x80000000
7701 bne 1f
7702
7703 mov r0, r4 @ recover arg
7704 mov r1, r5
7705 mov r2, r4 @ compare against self
7706 mov r3, r5
7707 bl __aeabi_dcmpeq @ is arg == self?
7708 cmp r0, #0 @ zero == no
7709 moveq r1, #0 @ return zero for NaN
7710 beq 1f
7711
7712 mov r0, r4 @ recover arg
7713 mov r1, r5
7714 bl __aeabi_d2lz @ convert double to long
7715
77161:
7717 add sp, sp, #4
7718 ldmfd sp!, {r4, r5, pc}
7719
7720 .size artMterpAsmSisterStart, .-artMterpAsmSisterStart
7721 .global artMterpAsmSisterEnd
7722artMterpAsmSisterEnd:
7723
7724
7725 .global artMterpAsmAltInstructionStart
7726 .type artMterpAsmAltInstructionStart, %function
7727 .text
7728
7729artMterpAsmAltInstructionStart = .L_ALT_op_nop
7730/* ------------------------------ */
7731 .balign 128
7732.L_ALT_op_nop: /* 0x00 */
7733/* File: arm/alt_stub.S */
7734/*
7735 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7736 * any interesting requests and then jump to the real instruction
7737 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7738 */
7739 .extern MterpCheckBefore
7740 EXPORT_PC
7741 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7742 adrl lr, artMterpAsmInstructionStart + (0 * 128) @ Addr of primary handler.
7743 mov r0, rSELF
7744 add r1, rFP, #OFF_FP_SHADOWFRAME
7745 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7746
7747/* ------------------------------ */
7748 .balign 128
7749.L_ALT_op_move: /* 0x01 */
7750/* File: arm/alt_stub.S */
7751/*
7752 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7753 * any interesting requests and then jump to the real instruction
7754 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7755 */
7756 .extern MterpCheckBefore
7757 EXPORT_PC
7758 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7759 adrl lr, artMterpAsmInstructionStart + (1 * 128) @ Addr of primary handler.
7760 mov r0, rSELF
7761 add r1, rFP, #OFF_FP_SHADOWFRAME
7762 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7763
7764/* ------------------------------ */
7765 .balign 128
7766.L_ALT_op_move_from16: /* 0x02 */
7767/* File: arm/alt_stub.S */
7768/*
7769 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7770 * any interesting requests and then jump to the real instruction
7771 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7772 */
7773 .extern MterpCheckBefore
7774 EXPORT_PC
7775 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7776 adrl lr, artMterpAsmInstructionStart + (2 * 128) @ Addr of primary handler.
7777 mov r0, rSELF
7778 add r1, rFP, #OFF_FP_SHADOWFRAME
7779 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7780
7781/* ------------------------------ */
7782 .balign 128
7783.L_ALT_op_move_16: /* 0x03 */
7784/* File: arm/alt_stub.S */
7785/*
7786 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7787 * any interesting requests and then jump to the real instruction
7788 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7789 */
7790 .extern MterpCheckBefore
7791 EXPORT_PC
7792 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7793 adrl lr, artMterpAsmInstructionStart + (3 * 128) @ Addr of primary handler.
7794 mov r0, rSELF
7795 add r1, rFP, #OFF_FP_SHADOWFRAME
7796 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7797
7798/* ------------------------------ */
7799 .balign 128
7800.L_ALT_op_move_wide: /* 0x04 */
7801/* File: arm/alt_stub.S */
7802/*
7803 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7804 * any interesting requests and then jump to the real instruction
7805 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7806 */
7807 .extern MterpCheckBefore
7808 EXPORT_PC
7809 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7810 adrl lr, artMterpAsmInstructionStart + (4 * 128) @ Addr of primary handler.
7811 mov r0, rSELF
7812 add r1, rFP, #OFF_FP_SHADOWFRAME
7813 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7814
7815/* ------------------------------ */
7816 .balign 128
7817.L_ALT_op_move_wide_from16: /* 0x05 */
7818/* File: arm/alt_stub.S */
7819/*
7820 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7821 * any interesting requests and then jump to the real instruction
7822 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7823 */
7824 .extern MterpCheckBefore
7825 EXPORT_PC
7826 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7827 adrl lr, artMterpAsmInstructionStart + (5 * 128) @ Addr of primary handler.
7828 mov r0, rSELF
7829 add r1, rFP, #OFF_FP_SHADOWFRAME
7830 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7831
7832/* ------------------------------ */
7833 .balign 128
7834.L_ALT_op_move_wide_16: /* 0x06 */
7835/* File: arm/alt_stub.S */
7836/*
7837 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7838 * any interesting requests and then jump to the real instruction
7839 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7840 */
7841 .extern MterpCheckBefore
7842 EXPORT_PC
7843 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7844 adrl lr, artMterpAsmInstructionStart + (6 * 128) @ Addr of primary handler.
7845 mov r0, rSELF
7846 add r1, rFP, #OFF_FP_SHADOWFRAME
7847 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7848
7849/* ------------------------------ */
7850 .balign 128
7851.L_ALT_op_move_object: /* 0x07 */
7852/* File: arm/alt_stub.S */
7853/*
7854 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7855 * any interesting requests and then jump to the real instruction
7856 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7857 */
7858 .extern MterpCheckBefore
7859 EXPORT_PC
7860 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7861 adrl lr, artMterpAsmInstructionStart + (7 * 128) @ Addr of primary handler.
7862 mov r0, rSELF
7863 add r1, rFP, #OFF_FP_SHADOWFRAME
7864 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7865
7866/* ------------------------------ */
7867 .balign 128
7868.L_ALT_op_move_object_from16: /* 0x08 */
7869/* File: arm/alt_stub.S */
7870/*
7871 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7872 * any interesting requests and then jump to the real instruction
7873 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7874 */
7875 .extern MterpCheckBefore
7876 EXPORT_PC
7877 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7878 adrl lr, artMterpAsmInstructionStart + (8 * 128) @ Addr of primary handler.
7879 mov r0, rSELF
7880 add r1, rFP, #OFF_FP_SHADOWFRAME
7881 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7882
7883/* ------------------------------ */
7884 .balign 128
7885.L_ALT_op_move_object_16: /* 0x09 */
7886/* File: arm/alt_stub.S */
7887/*
7888 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7889 * any interesting requests and then jump to the real instruction
7890 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7891 */
7892 .extern MterpCheckBefore
7893 EXPORT_PC
7894 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7895 adrl lr, artMterpAsmInstructionStart + (9 * 128) @ Addr of primary handler.
7896 mov r0, rSELF
7897 add r1, rFP, #OFF_FP_SHADOWFRAME
7898 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7899
7900/* ------------------------------ */
7901 .balign 128
7902.L_ALT_op_move_result: /* 0x0a */
7903/* File: arm/alt_stub.S */
7904/*
7905 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7906 * any interesting requests and then jump to the real instruction
7907 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7908 */
7909 .extern MterpCheckBefore
7910 EXPORT_PC
7911 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7912 adrl lr, artMterpAsmInstructionStart + (10 * 128) @ Addr of primary handler.
7913 mov r0, rSELF
7914 add r1, rFP, #OFF_FP_SHADOWFRAME
7915 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7916
7917/* ------------------------------ */
7918 .balign 128
7919.L_ALT_op_move_result_wide: /* 0x0b */
7920/* File: arm/alt_stub.S */
7921/*
7922 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7923 * any interesting requests and then jump to the real instruction
7924 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7925 */
7926 .extern MterpCheckBefore
7927 EXPORT_PC
7928 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7929 adrl lr, artMterpAsmInstructionStart + (11 * 128) @ Addr of primary handler.
7930 mov r0, rSELF
7931 add r1, rFP, #OFF_FP_SHADOWFRAME
7932 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7933
7934/* ------------------------------ */
7935 .balign 128
7936.L_ALT_op_move_result_object: /* 0x0c */
7937/* File: arm/alt_stub.S */
7938/*
7939 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7940 * any interesting requests and then jump to the real instruction
7941 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7942 */
7943 .extern MterpCheckBefore
7944 EXPORT_PC
7945 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7946 adrl lr, artMterpAsmInstructionStart + (12 * 128) @ Addr of primary handler.
7947 mov r0, rSELF
7948 add r1, rFP, #OFF_FP_SHADOWFRAME
7949 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7950
7951/* ------------------------------ */
7952 .balign 128
7953.L_ALT_op_move_exception: /* 0x0d */
7954/* File: arm/alt_stub.S */
7955/*
7956 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7957 * any interesting requests and then jump to the real instruction
7958 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7959 */
7960 .extern MterpCheckBefore
7961 EXPORT_PC
7962 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7963 adrl lr, artMterpAsmInstructionStart + (13 * 128) @ Addr of primary handler.
7964 mov r0, rSELF
7965 add r1, rFP, #OFF_FP_SHADOWFRAME
7966 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7967
7968/* ------------------------------ */
7969 .balign 128
7970.L_ALT_op_return_void: /* 0x0e */
7971/* File: arm/alt_stub.S */
7972/*
7973 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7974 * any interesting requests and then jump to the real instruction
7975 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7976 */
7977 .extern MterpCheckBefore
7978 EXPORT_PC
7979 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7980 adrl lr, artMterpAsmInstructionStart + (14 * 128) @ Addr of primary handler.
7981 mov r0, rSELF
7982 add r1, rFP, #OFF_FP_SHADOWFRAME
7983 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7984
7985/* ------------------------------ */
7986 .balign 128
7987.L_ALT_op_return: /* 0x0f */
7988/* File: arm/alt_stub.S */
7989/*
7990 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7991 * any interesting requests and then jump to the real instruction
7992 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7993 */
7994 .extern MterpCheckBefore
7995 EXPORT_PC
7996 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7997 adrl lr, artMterpAsmInstructionStart + (15 * 128) @ Addr of primary handler.
7998 mov r0, rSELF
7999 add r1, rFP, #OFF_FP_SHADOWFRAME
8000 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8001
8002/* ------------------------------ */
8003 .balign 128
8004.L_ALT_op_return_wide: /* 0x10 */
8005/* File: arm/alt_stub.S */
8006/*
8007 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8008 * any interesting requests and then jump to the real instruction
8009 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8010 */
8011 .extern MterpCheckBefore
8012 EXPORT_PC
8013 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8014 adrl lr, artMterpAsmInstructionStart + (16 * 128) @ Addr of primary handler.
8015 mov r0, rSELF
8016 add r1, rFP, #OFF_FP_SHADOWFRAME
8017 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8018
8019/* ------------------------------ */
8020 .balign 128
8021.L_ALT_op_return_object: /* 0x11 */
8022/* File: arm/alt_stub.S */
8023/*
8024 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8025 * any interesting requests and then jump to the real instruction
8026 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8027 */
8028 .extern MterpCheckBefore
8029 EXPORT_PC
8030 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8031 adrl lr, artMterpAsmInstructionStart + (17 * 128) @ Addr of primary handler.
8032 mov r0, rSELF
8033 add r1, rFP, #OFF_FP_SHADOWFRAME
8034 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8035
8036/* ------------------------------ */
8037 .balign 128
8038.L_ALT_op_const_4: /* 0x12 */
8039/* File: arm/alt_stub.S */
8040/*
8041 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8042 * any interesting requests and then jump to the real instruction
8043 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8044 */
8045 .extern MterpCheckBefore
8046 EXPORT_PC
8047 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8048 adrl lr, artMterpAsmInstructionStart + (18 * 128) @ Addr of primary handler.
8049 mov r0, rSELF
8050 add r1, rFP, #OFF_FP_SHADOWFRAME
8051 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8052
8053/* ------------------------------ */
8054 .balign 128
8055.L_ALT_op_const_16: /* 0x13 */
8056/* File: arm/alt_stub.S */
8057/*
8058 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8059 * any interesting requests and then jump to the real instruction
8060 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8061 */
8062 .extern MterpCheckBefore
8063 EXPORT_PC
8064 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8065 adrl lr, artMterpAsmInstructionStart + (19 * 128) @ Addr of primary handler.
8066 mov r0, rSELF
8067 add r1, rFP, #OFF_FP_SHADOWFRAME
8068 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8069
8070/* ------------------------------ */
8071 .balign 128
8072.L_ALT_op_const: /* 0x14 */
8073/* File: arm/alt_stub.S */
8074/*
8075 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8076 * any interesting requests and then jump to the real instruction
8077 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8078 */
8079 .extern MterpCheckBefore
8080 EXPORT_PC
8081 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8082 adrl lr, artMterpAsmInstructionStart + (20 * 128) @ Addr of primary handler.
8083 mov r0, rSELF
8084 add r1, rFP, #OFF_FP_SHADOWFRAME
8085 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8086
8087/* ------------------------------ */
8088 .balign 128
8089.L_ALT_op_const_high16: /* 0x15 */
8090/* File: arm/alt_stub.S */
8091/*
8092 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8093 * any interesting requests and then jump to the real instruction
8094 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8095 */
8096 .extern MterpCheckBefore
8097 EXPORT_PC
8098 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8099 adrl lr, artMterpAsmInstructionStart + (21 * 128) @ Addr of primary handler.
8100 mov r0, rSELF
8101 add r1, rFP, #OFF_FP_SHADOWFRAME
8102 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8103
8104/* ------------------------------ */
8105 .balign 128
8106.L_ALT_op_const_wide_16: /* 0x16 */
8107/* File: arm/alt_stub.S */
8108/*
8109 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8110 * any interesting requests and then jump to the real instruction
8111 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8112 */
8113 .extern MterpCheckBefore
8114 EXPORT_PC
8115 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8116 adrl lr, artMterpAsmInstructionStart + (22 * 128) @ Addr of primary handler.
8117 mov r0, rSELF
8118 add r1, rFP, #OFF_FP_SHADOWFRAME
8119 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8120
8121/* ------------------------------ */
8122 .balign 128
8123.L_ALT_op_const_wide_32: /* 0x17 */
8124/* File: arm/alt_stub.S */
8125/*
8126 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8127 * any interesting requests and then jump to the real instruction
8128 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8129 */
8130 .extern MterpCheckBefore
8131 EXPORT_PC
8132 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8133 adrl lr, artMterpAsmInstructionStart + (23 * 128) @ Addr of primary handler.
8134 mov r0, rSELF
8135 add r1, rFP, #OFF_FP_SHADOWFRAME
8136 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8137
8138/* ------------------------------ */
8139 .balign 128
8140.L_ALT_op_const_wide: /* 0x18 */
8141/* File: arm/alt_stub.S */
8142/*
8143 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8144 * any interesting requests and then jump to the real instruction
8145 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8146 */
8147 .extern MterpCheckBefore
8148 EXPORT_PC
8149 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8150 adrl lr, artMterpAsmInstructionStart + (24 * 128) @ Addr of primary handler.
8151 mov r0, rSELF
8152 add r1, rFP, #OFF_FP_SHADOWFRAME
8153 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8154
8155/* ------------------------------ */
8156 .balign 128
8157.L_ALT_op_const_wide_high16: /* 0x19 */
8158/* File: arm/alt_stub.S */
8159/*
8160 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8161 * any interesting requests and then jump to the real instruction
8162 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8163 */
8164 .extern MterpCheckBefore
8165 EXPORT_PC
8166 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8167 adrl lr, artMterpAsmInstructionStart + (25 * 128) @ Addr of primary handler.
8168 mov r0, rSELF
8169 add r1, rFP, #OFF_FP_SHADOWFRAME
8170 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8171
8172/* ------------------------------ */
8173 .balign 128
8174.L_ALT_op_const_string: /* 0x1a */
8175/* File: arm/alt_stub.S */
8176/*
8177 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8178 * any interesting requests and then jump to the real instruction
8179 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8180 */
8181 .extern MterpCheckBefore
8182 EXPORT_PC
8183 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8184 adrl lr, artMterpAsmInstructionStart + (26 * 128) @ Addr of primary handler.
8185 mov r0, rSELF
8186 add r1, rFP, #OFF_FP_SHADOWFRAME
8187 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8188
8189/* ------------------------------ */
8190 .balign 128
8191.L_ALT_op_const_string_jumbo: /* 0x1b */
8192/* File: arm/alt_stub.S */
8193/*
8194 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8195 * any interesting requests and then jump to the real instruction
8196 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8197 */
8198 .extern MterpCheckBefore
8199 EXPORT_PC
8200 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8201 adrl lr, artMterpAsmInstructionStart + (27 * 128) @ Addr of primary handler.
8202 mov r0, rSELF
8203 add r1, rFP, #OFF_FP_SHADOWFRAME
8204 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8205
8206/* ------------------------------ */
8207 .balign 128
8208.L_ALT_op_const_class: /* 0x1c */
8209/* File: arm/alt_stub.S */
8210/*
8211 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8212 * any interesting requests and then jump to the real instruction
8213 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8214 */
8215 .extern MterpCheckBefore
8216 EXPORT_PC
8217 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8218 adrl lr, artMterpAsmInstructionStart + (28 * 128) @ Addr of primary handler.
8219 mov r0, rSELF
8220 add r1, rFP, #OFF_FP_SHADOWFRAME
8221 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8222
8223/* ------------------------------ */
8224 .balign 128
8225.L_ALT_op_monitor_enter: /* 0x1d */
8226/* File: arm/alt_stub.S */
8227/*
8228 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8229 * any interesting requests and then jump to the real instruction
8230 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8231 */
8232 .extern MterpCheckBefore
8233 EXPORT_PC
8234 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8235 adrl lr, artMterpAsmInstructionStart + (29 * 128) @ Addr of primary handler.
8236 mov r0, rSELF
8237 add r1, rFP, #OFF_FP_SHADOWFRAME
8238 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8239
8240/* ------------------------------ */
8241 .balign 128
8242.L_ALT_op_monitor_exit: /* 0x1e */
8243/* File: arm/alt_stub.S */
8244/*
8245 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8246 * any interesting requests and then jump to the real instruction
8247 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8248 */
8249 .extern MterpCheckBefore
8250 EXPORT_PC
8251 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8252 adrl lr, artMterpAsmInstructionStart + (30 * 128) @ Addr of primary handler.
8253 mov r0, rSELF
8254 add r1, rFP, #OFF_FP_SHADOWFRAME
8255 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8256
8257/* ------------------------------ */
8258 .balign 128
8259.L_ALT_op_check_cast: /* 0x1f */
8260/* File: arm/alt_stub.S */
8261/*
8262 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8263 * any interesting requests and then jump to the real instruction
8264 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8265 */
8266 .extern MterpCheckBefore
8267 EXPORT_PC
8268 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8269 adrl lr, artMterpAsmInstructionStart + (31 * 128) @ Addr of primary handler.
8270 mov r0, rSELF
8271 add r1, rFP, #OFF_FP_SHADOWFRAME
8272 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8273
8274/* ------------------------------ */
8275 .balign 128
8276.L_ALT_op_instance_of: /* 0x20 */
8277/* File: arm/alt_stub.S */
8278/*
8279 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8280 * any interesting requests and then jump to the real instruction
8281 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8282 */
8283 .extern MterpCheckBefore
8284 EXPORT_PC
8285 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8286 adrl lr, artMterpAsmInstructionStart + (32 * 128) @ Addr of primary handler.
8287 mov r0, rSELF
8288 add r1, rFP, #OFF_FP_SHADOWFRAME
8289 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8290
8291/* ------------------------------ */
8292 .balign 128
8293.L_ALT_op_array_length: /* 0x21 */
8294/* File: arm/alt_stub.S */
8295/*
8296 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8297 * any interesting requests and then jump to the real instruction
8298 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8299 */
8300 .extern MterpCheckBefore
8301 EXPORT_PC
8302 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8303 adrl lr, artMterpAsmInstructionStart + (33 * 128) @ Addr of primary handler.
8304 mov r0, rSELF
8305 add r1, rFP, #OFF_FP_SHADOWFRAME
8306 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8307
8308/* ------------------------------ */
8309 .balign 128
8310.L_ALT_op_new_instance: /* 0x22 */
8311/* File: arm/alt_stub.S */
8312/*
8313 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8314 * any interesting requests and then jump to the real instruction
8315 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8316 */
8317 .extern MterpCheckBefore
8318 EXPORT_PC
8319 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8320 adrl lr, artMterpAsmInstructionStart + (34 * 128) @ Addr of primary handler.
8321 mov r0, rSELF
8322 add r1, rFP, #OFF_FP_SHADOWFRAME
8323 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8324
8325/* ------------------------------ */
8326 .balign 128
8327.L_ALT_op_new_array: /* 0x23 */
8328/* File: arm/alt_stub.S */
8329/*
8330 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8331 * any interesting requests and then jump to the real instruction
8332 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8333 */
8334 .extern MterpCheckBefore
8335 EXPORT_PC
8336 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8337 adrl lr, artMterpAsmInstructionStart + (35 * 128) @ Addr of primary handler.
8338 mov r0, rSELF
8339 add r1, rFP, #OFF_FP_SHADOWFRAME
8340 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8341
8342/* ------------------------------ */
8343 .balign 128
8344.L_ALT_op_filled_new_array: /* 0x24 */
8345/* File: arm/alt_stub.S */
8346/*
8347 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8348 * any interesting requests and then jump to the real instruction
8349 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8350 */
8351 .extern MterpCheckBefore
8352 EXPORT_PC
8353 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8354 adrl lr, artMterpAsmInstructionStart + (36 * 128) @ Addr of primary handler.
8355 mov r0, rSELF
8356 add r1, rFP, #OFF_FP_SHADOWFRAME
8357 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8358
8359/* ------------------------------ */
8360 .balign 128
8361.L_ALT_op_filled_new_array_range: /* 0x25 */
8362/* File: arm/alt_stub.S */
8363/*
8364 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8365 * any interesting requests and then jump to the real instruction
8366 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8367 */
8368 .extern MterpCheckBefore
8369 EXPORT_PC
8370 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8371 adrl lr, artMterpAsmInstructionStart + (37 * 128) @ Addr of primary handler.
8372 mov r0, rSELF
8373 add r1, rFP, #OFF_FP_SHADOWFRAME
8374 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8375
8376/* ------------------------------ */
8377 .balign 128
8378.L_ALT_op_fill_array_data: /* 0x26 */
8379/* File: arm/alt_stub.S */
8380/*
8381 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8382 * any interesting requests and then jump to the real instruction
8383 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8384 */
8385 .extern MterpCheckBefore
8386 EXPORT_PC
8387 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8388 adrl lr, artMterpAsmInstructionStart + (38 * 128) @ Addr of primary handler.
8389 mov r0, rSELF
8390 add r1, rFP, #OFF_FP_SHADOWFRAME
8391 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8392
8393/* ------------------------------ */
8394 .balign 128
8395.L_ALT_op_throw: /* 0x27 */
8396/* File: arm/alt_stub.S */
8397/*
8398 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8399 * any interesting requests and then jump to the real instruction
8400 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8401 */
8402 .extern MterpCheckBefore
8403 EXPORT_PC
8404 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8405 adrl lr, artMterpAsmInstructionStart + (39 * 128) @ Addr of primary handler.
8406 mov r0, rSELF
8407 add r1, rFP, #OFF_FP_SHADOWFRAME
8408 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8409
8410/* ------------------------------ */
8411 .balign 128
8412.L_ALT_op_goto: /* 0x28 */
8413/* File: arm/alt_stub.S */
8414/*
8415 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8416 * any interesting requests and then jump to the real instruction
8417 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8418 */
8419 .extern MterpCheckBefore
8420 EXPORT_PC
8421 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8422 adrl lr, artMterpAsmInstructionStart + (40 * 128) @ Addr of primary handler.
8423 mov r0, rSELF
8424 add r1, rFP, #OFF_FP_SHADOWFRAME
8425 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8426
8427/* ------------------------------ */
8428 .balign 128
8429.L_ALT_op_goto_16: /* 0x29 */
8430/* File: arm/alt_stub.S */
8431/*
8432 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8433 * any interesting requests and then jump to the real instruction
8434 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8435 */
8436 .extern MterpCheckBefore
8437 EXPORT_PC
8438 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8439 adrl lr, artMterpAsmInstructionStart + (41 * 128) @ Addr of primary handler.
8440 mov r0, rSELF
8441 add r1, rFP, #OFF_FP_SHADOWFRAME
8442 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8443
8444/* ------------------------------ */
8445 .balign 128
8446.L_ALT_op_goto_32: /* 0x2a */
8447/* File: arm/alt_stub.S */
8448/*
8449 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8450 * any interesting requests and then jump to the real instruction
8451 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8452 */
8453 .extern MterpCheckBefore
8454 EXPORT_PC
8455 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8456 adrl lr, artMterpAsmInstructionStart + (42 * 128) @ Addr of primary handler.
8457 mov r0, rSELF
8458 add r1, rFP, #OFF_FP_SHADOWFRAME
8459 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8460
8461/* ------------------------------ */
8462 .balign 128
8463.L_ALT_op_packed_switch: /* 0x2b */
8464/* File: arm/alt_stub.S */
8465/*
8466 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8467 * any interesting requests and then jump to the real instruction
8468 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8469 */
8470 .extern MterpCheckBefore
8471 EXPORT_PC
8472 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8473 adrl lr, artMterpAsmInstructionStart + (43 * 128) @ Addr of primary handler.
8474 mov r0, rSELF
8475 add r1, rFP, #OFF_FP_SHADOWFRAME
8476 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8477
8478/* ------------------------------ */
8479 .balign 128
8480.L_ALT_op_sparse_switch: /* 0x2c */
8481/* File: arm/alt_stub.S */
8482/*
8483 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8484 * any interesting requests and then jump to the real instruction
8485 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8486 */
8487 .extern MterpCheckBefore
8488 EXPORT_PC
8489 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8490 adrl lr, artMterpAsmInstructionStart + (44 * 128) @ Addr of primary handler.
8491 mov r0, rSELF
8492 add r1, rFP, #OFF_FP_SHADOWFRAME
8493 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8494
8495/* ------------------------------ */
8496 .balign 128
8497.L_ALT_op_cmpl_float: /* 0x2d */
8498/* File: arm/alt_stub.S */
8499/*
8500 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8501 * any interesting requests and then jump to the real instruction
8502 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8503 */
8504 .extern MterpCheckBefore
8505 EXPORT_PC
8506 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8507 adrl lr, artMterpAsmInstructionStart + (45 * 128) @ Addr of primary handler.
8508 mov r0, rSELF
8509 add r1, rFP, #OFF_FP_SHADOWFRAME
8510 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8511
8512/* ------------------------------ */
8513 .balign 128
8514.L_ALT_op_cmpg_float: /* 0x2e */
8515/* File: arm/alt_stub.S */
8516/*
8517 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8518 * any interesting requests and then jump to the real instruction
8519 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8520 */
8521 .extern MterpCheckBefore
8522 EXPORT_PC
8523 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8524 adrl lr, artMterpAsmInstructionStart + (46 * 128) @ Addr of primary handler.
8525 mov r0, rSELF
8526 add r1, rFP, #OFF_FP_SHADOWFRAME
8527 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8528
8529/* ------------------------------ */
8530 .balign 128
8531.L_ALT_op_cmpl_double: /* 0x2f */
8532/* File: arm/alt_stub.S */
8533/*
8534 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8535 * any interesting requests and then jump to the real instruction
8536 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8537 */
8538 .extern MterpCheckBefore
8539 EXPORT_PC
8540 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8541 adrl lr, artMterpAsmInstructionStart + (47 * 128) @ Addr of primary handler.
8542 mov r0, rSELF
8543 add r1, rFP, #OFF_FP_SHADOWFRAME
8544 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8545
8546/* ------------------------------ */
8547 .balign 128
8548.L_ALT_op_cmpg_double: /* 0x30 */
8549/* File: arm/alt_stub.S */
8550/*
8551 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8552 * any interesting requests and then jump to the real instruction
8553 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8554 */
8555 .extern MterpCheckBefore
8556 EXPORT_PC
8557 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8558 adrl lr, artMterpAsmInstructionStart + (48 * 128) @ Addr of primary handler.
8559 mov r0, rSELF
8560 add r1, rFP, #OFF_FP_SHADOWFRAME
8561 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8562
8563/* ------------------------------ */
8564 .balign 128
8565.L_ALT_op_cmp_long: /* 0x31 */
8566/* File: arm/alt_stub.S */
8567/*
8568 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8569 * any interesting requests and then jump to the real instruction
8570 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8571 */
8572 .extern MterpCheckBefore
8573 EXPORT_PC
8574 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8575 adrl lr, artMterpAsmInstructionStart + (49 * 128) @ Addr of primary handler.
8576 mov r0, rSELF
8577 add r1, rFP, #OFF_FP_SHADOWFRAME
8578 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8579
8580/* ------------------------------ */
8581 .balign 128
8582.L_ALT_op_if_eq: /* 0x32 */
8583/* File: arm/alt_stub.S */
8584/*
8585 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8586 * any interesting requests and then jump to the real instruction
8587 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8588 */
8589 .extern MterpCheckBefore
8590 EXPORT_PC
8591 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8592 adrl lr, artMterpAsmInstructionStart + (50 * 128) @ Addr of primary handler.
8593 mov r0, rSELF
8594 add r1, rFP, #OFF_FP_SHADOWFRAME
8595 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8596
8597/* ------------------------------ */
8598 .balign 128
8599.L_ALT_op_if_ne: /* 0x33 */
8600/* File: arm/alt_stub.S */
8601/*
8602 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8603 * any interesting requests and then jump to the real instruction
8604 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8605 */
8606 .extern MterpCheckBefore
8607 EXPORT_PC
8608 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8609 adrl lr, artMterpAsmInstructionStart + (51 * 128) @ Addr of primary handler.
8610 mov r0, rSELF
8611 add r1, rFP, #OFF_FP_SHADOWFRAME
8612 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8613
8614/* ------------------------------ */
8615 .balign 128
8616.L_ALT_op_if_lt: /* 0x34 */
8617/* File: arm/alt_stub.S */
8618/*
8619 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8620 * any interesting requests and then jump to the real instruction
8621 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8622 */
8623 .extern MterpCheckBefore
8624 EXPORT_PC
8625 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8626 adrl lr, artMterpAsmInstructionStart + (52 * 128) @ Addr of primary handler.
8627 mov r0, rSELF
8628 add r1, rFP, #OFF_FP_SHADOWFRAME
8629 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8630
8631/* ------------------------------ */
8632 .balign 128
8633.L_ALT_op_if_ge: /* 0x35 */
8634/* File: arm/alt_stub.S */
8635/*
8636 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8637 * any interesting requests and then jump to the real instruction
8638 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8639 */
8640 .extern MterpCheckBefore
8641 EXPORT_PC
8642 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8643 adrl lr, artMterpAsmInstructionStart + (53 * 128) @ Addr of primary handler.
8644 mov r0, rSELF
8645 add r1, rFP, #OFF_FP_SHADOWFRAME
8646 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8647
8648/* ------------------------------ */
8649 .balign 128
8650.L_ALT_op_if_gt: /* 0x36 */
8651/* File: arm/alt_stub.S */
8652/*
8653 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8654 * any interesting requests and then jump to the real instruction
8655 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8656 */
8657 .extern MterpCheckBefore
8658 EXPORT_PC
8659 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8660 adrl lr, artMterpAsmInstructionStart + (54 * 128) @ Addr of primary handler.
8661 mov r0, rSELF
8662 add r1, rFP, #OFF_FP_SHADOWFRAME
8663 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8664
8665/* ------------------------------ */
8666 .balign 128
8667.L_ALT_op_if_le: /* 0x37 */
8668/* File: arm/alt_stub.S */
8669/*
8670 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8671 * any interesting requests and then jump to the real instruction
8672 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8673 */
8674 .extern MterpCheckBefore
8675 EXPORT_PC
8676 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8677 adrl lr, artMterpAsmInstructionStart + (55 * 128) @ Addr of primary handler.
8678 mov r0, rSELF
8679 add r1, rFP, #OFF_FP_SHADOWFRAME
8680 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8681
8682/* ------------------------------ */
8683 .balign 128
8684.L_ALT_op_if_eqz: /* 0x38 */
8685/* File: arm/alt_stub.S */
8686/*
8687 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8688 * any interesting requests and then jump to the real instruction
8689 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8690 */
8691 .extern MterpCheckBefore
8692 EXPORT_PC
8693 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8694 adrl lr, artMterpAsmInstructionStart + (56 * 128) @ Addr of primary handler.
8695 mov r0, rSELF
8696 add r1, rFP, #OFF_FP_SHADOWFRAME
8697 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8698
8699/* ------------------------------ */
8700 .balign 128
8701.L_ALT_op_if_nez: /* 0x39 */
8702/* File: arm/alt_stub.S */
8703/*
8704 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8705 * any interesting requests and then jump to the real instruction
8706 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8707 */
8708 .extern MterpCheckBefore
8709 EXPORT_PC
8710 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8711 adrl lr, artMterpAsmInstructionStart + (57 * 128) @ Addr of primary handler.
8712 mov r0, rSELF
8713 add r1, rFP, #OFF_FP_SHADOWFRAME
8714 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8715
8716/* ------------------------------ */
8717 .balign 128
8718.L_ALT_op_if_ltz: /* 0x3a */
8719/* File: arm/alt_stub.S */
8720/*
8721 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8722 * any interesting requests and then jump to the real instruction
8723 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8724 */
8725 .extern MterpCheckBefore
8726 EXPORT_PC
8727 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8728 adrl lr, artMterpAsmInstructionStart + (58 * 128) @ Addr of primary handler.
8729 mov r0, rSELF
8730 add r1, rFP, #OFF_FP_SHADOWFRAME
8731 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8732
8733/* ------------------------------ */
8734 .balign 128
8735.L_ALT_op_if_gez: /* 0x3b */
8736/* File: arm/alt_stub.S */
8737/*
8738 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8739 * any interesting requests and then jump to the real instruction
8740 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8741 */
8742 .extern MterpCheckBefore
8743 EXPORT_PC
8744 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8745 adrl lr, artMterpAsmInstructionStart + (59 * 128) @ Addr of primary handler.
8746 mov r0, rSELF
8747 add r1, rFP, #OFF_FP_SHADOWFRAME
8748 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8749
8750/* ------------------------------ */
8751 .balign 128
8752.L_ALT_op_if_gtz: /* 0x3c */
8753/* File: arm/alt_stub.S */
8754/*
8755 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8756 * any interesting requests and then jump to the real instruction
8757 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8758 */
8759 .extern MterpCheckBefore
8760 EXPORT_PC
8761 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8762 adrl lr, artMterpAsmInstructionStart + (60 * 128) @ Addr of primary handler.
8763 mov r0, rSELF
8764 add r1, rFP, #OFF_FP_SHADOWFRAME
8765 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8766
8767/* ------------------------------ */
8768 .balign 128
8769.L_ALT_op_if_lez: /* 0x3d */
8770/* File: arm/alt_stub.S */
8771/*
8772 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8773 * any interesting requests and then jump to the real instruction
8774 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8775 */
8776 .extern MterpCheckBefore
8777 EXPORT_PC
8778 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8779 adrl lr, artMterpAsmInstructionStart + (61 * 128) @ Addr of primary handler.
8780 mov r0, rSELF
8781 add r1, rFP, #OFF_FP_SHADOWFRAME
8782 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8783
8784/* ------------------------------ */
8785 .balign 128
8786.L_ALT_op_unused_3e: /* 0x3e */
8787/* File: arm/alt_stub.S */
8788/*
8789 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8790 * any interesting requests and then jump to the real instruction
8791 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8792 */
8793 .extern MterpCheckBefore
8794 EXPORT_PC
8795 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8796 adrl lr, artMterpAsmInstructionStart + (62 * 128) @ Addr of primary handler.
8797 mov r0, rSELF
8798 add r1, rFP, #OFF_FP_SHADOWFRAME
8799 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8800
8801/* ------------------------------ */
8802 .balign 128
8803.L_ALT_op_unused_3f: /* 0x3f */
8804/* File: arm/alt_stub.S */
8805/*
8806 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8807 * any interesting requests and then jump to the real instruction
8808 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8809 */
8810 .extern MterpCheckBefore
8811 EXPORT_PC
8812 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8813 adrl lr, artMterpAsmInstructionStart + (63 * 128) @ Addr of primary handler.
8814 mov r0, rSELF
8815 add r1, rFP, #OFF_FP_SHADOWFRAME
8816 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8817
8818/* ------------------------------ */
8819 .balign 128
8820.L_ALT_op_unused_40: /* 0x40 */
8821/* File: arm/alt_stub.S */
8822/*
8823 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8824 * any interesting requests and then jump to the real instruction
8825 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8826 */
8827 .extern MterpCheckBefore
8828 EXPORT_PC
8829 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8830 adrl lr, artMterpAsmInstructionStart + (64 * 128) @ Addr of primary handler.
8831 mov r0, rSELF
8832 add r1, rFP, #OFF_FP_SHADOWFRAME
8833 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8834
8835/* ------------------------------ */
8836 .balign 128
8837.L_ALT_op_unused_41: /* 0x41 */
8838/* File: arm/alt_stub.S */
8839/*
8840 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8841 * any interesting requests and then jump to the real instruction
8842 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8843 */
8844 .extern MterpCheckBefore
8845 EXPORT_PC
8846 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8847 adrl lr, artMterpAsmInstructionStart + (65 * 128) @ Addr of primary handler.
8848 mov r0, rSELF
8849 add r1, rFP, #OFF_FP_SHADOWFRAME
8850 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8851
8852/* ------------------------------ */
8853 .balign 128
8854.L_ALT_op_unused_42: /* 0x42 */
8855/* File: arm/alt_stub.S */
8856/*
8857 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8858 * any interesting requests and then jump to the real instruction
8859 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8860 */
8861 .extern MterpCheckBefore
8862 EXPORT_PC
8863 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8864 adrl lr, artMterpAsmInstructionStart + (66 * 128) @ Addr of primary handler.
8865 mov r0, rSELF
8866 add r1, rFP, #OFF_FP_SHADOWFRAME
8867 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8868
8869/* ------------------------------ */
8870 .balign 128
8871.L_ALT_op_unused_43: /* 0x43 */
8872/* File: arm/alt_stub.S */
8873/*
8874 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8875 * any interesting requests and then jump to the real instruction
8876 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8877 */
8878 .extern MterpCheckBefore
8879 EXPORT_PC
8880 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8881 adrl lr, artMterpAsmInstructionStart + (67 * 128) @ Addr of primary handler.
8882 mov r0, rSELF
8883 add r1, rFP, #OFF_FP_SHADOWFRAME
8884 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8885
8886/* ------------------------------ */
8887 .balign 128
8888.L_ALT_op_aget: /* 0x44 */
8889/* File: arm/alt_stub.S */
8890/*
8891 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8892 * any interesting requests and then jump to the real instruction
8893 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8894 */
8895 .extern MterpCheckBefore
8896 EXPORT_PC
8897 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8898 adrl lr, artMterpAsmInstructionStart + (68 * 128) @ Addr of primary handler.
8899 mov r0, rSELF
8900 add r1, rFP, #OFF_FP_SHADOWFRAME
8901 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8902
8903/* ------------------------------ */
8904 .balign 128
8905.L_ALT_op_aget_wide: /* 0x45 */
8906/* File: arm/alt_stub.S */
8907/*
8908 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8909 * any interesting requests and then jump to the real instruction
8910 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8911 */
8912 .extern MterpCheckBefore
8913 EXPORT_PC
8914 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8915 adrl lr, artMterpAsmInstructionStart + (69 * 128) @ Addr of primary handler.
8916 mov r0, rSELF
8917 add r1, rFP, #OFF_FP_SHADOWFRAME
8918 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8919
8920/* ------------------------------ */
8921 .balign 128
8922.L_ALT_op_aget_object: /* 0x46 */
8923/* File: arm/alt_stub.S */
8924/*
8925 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8926 * any interesting requests and then jump to the real instruction
8927 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8928 */
8929 .extern MterpCheckBefore
8930 EXPORT_PC
8931 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8932 adrl lr, artMterpAsmInstructionStart + (70 * 128) @ Addr of primary handler.
8933 mov r0, rSELF
8934 add r1, rFP, #OFF_FP_SHADOWFRAME
8935 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8936
8937/* ------------------------------ */
8938 .balign 128
8939.L_ALT_op_aget_boolean: /* 0x47 */
8940/* File: arm/alt_stub.S */
8941/*
8942 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8943 * any interesting requests and then jump to the real instruction
8944 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8945 */
8946 .extern MterpCheckBefore
8947 EXPORT_PC
8948 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8949 adrl lr, artMterpAsmInstructionStart + (71 * 128) @ Addr of primary handler.
8950 mov r0, rSELF
8951 add r1, rFP, #OFF_FP_SHADOWFRAME
8952 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8953
8954/* ------------------------------ */
8955 .balign 128
8956.L_ALT_op_aget_byte: /* 0x48 */
8957/* File: arm/alt_stub.S */
8958/*
8959 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8960 * any interesting requests and then jump to the real instruction
8961 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8962 */
8963 .extern MterpCheckBefore
8964 EXPORT_PC
8965 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8966 adrl lr, artMterpAsmInstructionStart + (72 * 128) @ Addr of primary handler.
8967 mov r0, rSELF
8968 add r1, rFP, #OFF_FP_SHADOWFRAME
8969 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8970
8971/* ------------------------------ */
8972 .balign 128
8973.L_ALT_op_aget_char: /* 0x49 */
8974/* File: arm/alt_stub.S */
8975/*
8976 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8977 * any interesting requests and then jump to the real instruction
8978 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8979 */
8980 .extern MterpCheckBefore
8981 EXPORT_PC
8982 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8983 adrl lr, artMterpAsmInstructionStart + (73 * 128) @ Addr of primary handler.
8984 mov r0, rSELF
8985 add r1, rFP, #OFF_FP_SHADOWFRAME
8986 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8987
8988/* ------------------------------ */
8989 .balign 128
8990.L_ALT_op_aget_short: /* 0x4a */
8991/* File: arm/alt_stub.S */
8992/*
8993 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8994 * any interesting requests and then jump to the real instruction
8995 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8996 */
8997 .extern MterpCheckBefore
8998 EXPORT_PC
8999 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9000 adrl lr, artMterpAsmInstructionStart + (74 * 128) @ Addr of primary handler.
9001 mov r0, rSELF
9002 add r1, rFP, #OFF_FP_SHADOWFRAME
9003 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9004
9005/* ------------------------------ */
9006 .balign 128
9007.L_ALT_op_aput: /* 0x4b */
9008/* File: arm/alt_stub.S */
9009/*
9010 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9011 * any interesting requests and then jump to the real instruction
9012 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9013 */
9014 .extern MterpCheckBefore
9015 EXPORT_PC
9016 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9017 adrl lr, artMterpAsmInstructionStart + (75 * 128) @ Addr of primary handler.
9018 mov r0, rSELF
9019 add r1, rFP, #OFF_FP_SHADOWFRAME
9020 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9021
9022/* ------------------------------ */
9023 .balign 128
9024.L_ALT_op_aput_wide: /* 0x4c */
9025/* File: arm/alt_stub.S */
9026/*
9027 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9028 * any interesting requests and then jump to the real instruction
9029 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9030 */
9031 .extern MterpCheckBefore
9032 EXPORT_PC
9033 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9034 adrl lr, artMterpAsmInstructionStart + (76 * 128) @ Addr of primary handler.
9035 mov r0, rSELF
9036 add r1, rFP, #OFF_FP_SHADOWFRAME
9037 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9038
9039/* ------------------------------ */
9040 .balign 128
9041.L_ALT_op_aput_object: /* 0x4d */
9042/* File: arm/alt_stub.S */
9043/*
9044 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9045 * any interesting requests and then jump to the real instruction
9046 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9047 */
9048 .extern MterpCheckBefore
9049 EXPORT_PC
9050 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9051 adrl lr, artMterpAsmInstructionStart + (77 * 128) @ Addr of primary handler.
9052 mov r0, rSELF
9053 add r1, rFP, #OFF_FP_SHADOWFRAME
9054 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9055
9056/* ------------------------------ */
9057 .balign 128
9058.L_ALT_op_aput_boolean: /* 0x4e */
9059/* File: arm/alt_stub.S */
9060/*
9061 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9062 * any interesting requests and then jump to the real instruction
9063 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9064 */
9065 .extern MterpCheckBefore
9066 EXPORT_PC
9067 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9068 adrl lr, artMterpAsmInstructionStart + (78 * 128) @ Addr of primary handler.
9069 mov r0, rSELF
9070 add r1, rFP, #OFF_FP_SHADOWFRAME
9071 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9072
9073/* ------------------------------ */
9074 .balign 128
9075.L_ALT_op_aput_byte: /* 0x4f */
9076/* File: arm/alt_stub.S */
9077/*
9078 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9079 * any interesting requests and then jump to the real instruction
9080 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9081 */
9082 .extern MterpCheckBefore
9083 EXPORT_PC
9084 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9085 adrl lr, artMterpAsmInstructionStart + (79 * 128) @ Addr of primary handler.
9086 mov r0, rSELF
9087 add r1, rFP, #OFF_FP_SHADOWFRAME
9088 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9089
9090/* ------------------------------ */
9091 .balign 128
9092.L_ALT_op_aput_char: /* 0x50 */
9093/* File: arm/alt_stub.S */
9094/*
9095 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9096 * any interesting requests and then jump to the real instruction
9097 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9098 */
9099 .extern MterpCheckBefore
9100 EXPORT_PC
9101 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9102 adrl lr, artMterpAsmInstructionStart + (80 * 128) @ Addr of primary handler.
9103 mov r0, rSELF
9104 add r1, rFP, #OFF_FP_SHADOWFRAME
9105 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9106
9107/* ------------------------------ */
9108 .balign 128
9109.L_ALT_op_aput_short: /* 0x51 */
9110/* File: arm/alt_stub.S */
9111/*
9112 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9113 * any interesting requests and then jump to the real instruction
9114 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9115 */
9116 .extern MterpCheckBefore
9117 EXPORT_PC
9118 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9119 adrl lr, artMterpAsmInstructionStart + (81 * 128) @ Addr of primary handler.
9120 mov r0, rSELF
9121 add r1, rFP, #OFF_FP_SHADOWFRAME
9122 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9123
9124/* ------------------------------ */
9125 .balign 128
9126.L_ALT_op_iget: /* 0x52 */
9127/* File: arm/alt_stub.S */
9128/*
9129 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9130 * any interesting requests and then jump to the real instruction
9131 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9132 */
9133 .extern MterpCheckBefore
9134 EXPORT_PC
9135 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9136 adrl lr, artMterpAsmInstructionStart + (82 * 128) @ Addr of primary handler.
9137 mov r0, rSELF
9138 add r1, rFP, #OFF_FP_SHADOWFRAME
9139 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9140
9141/* ------------------------------ */
9142 .balign 128
9143.L_ALT_op_iget_wide: /* 0x53 */
9144/* File: arm/alt_stub.S */
9145/*
9146 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9147 * any interesting requests and then jump to the real instruction
9148 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9149 */
9150 .extern MterpCheckBefore
9151 EXPORT_PC
9152 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9153 adrl lr, artMterpAsmInstructionStart + (83 * 128) @ Addr of primary handler.
9154 mov r0, rSELF
9155 add r1, rFP, #OFF_FP_SHADOWFRAME
9156 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9157
9158/* ------------------------------ */
9159 .balign 128
9160.L_ALT_op_iget_object: /* 0x54 */
9161/* File: arm/alt_stub.S */
9162/*
9163 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9164 * any interesting requests and then jump to the real instruction
9165 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9166 */
9167 .extern MterpCheckBefore
9168 EXPORT_PC
9169 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9170 adrl lr, artMterpAsmInstructionStart + (84 * 128) @ Addr of primary handler.
9171 mov r0, rSELF
9172 add r1, rFP, #OFF_FP_SHADOWFRAME
9173 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9174
9175/* ------------------------------ */
9176 .balign 128
9177.L_ALT_op_iget_boolean: /* 0x55 */
9178/* File: arm/alt_stub.S */
9179/*
9180 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9181 * any interesting requests and then jump to the real instruction
9182 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9183 */
9184 .extern MterpCheckBefore
9185 EXPORT_PC
9186 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9187 adrl lr, artMterpAsmInstructionStart + (85 * 128) @ Addr of primary handler.
9188 mov r0, rSELF
9189 add r1, rFP, #OFF_FP_SHADOWFRAME
9190 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9191
9192/* ------------------------------ */
9193 .balign 128
9194.L_ALT_op_iget_byte: /* 0x56 */
9195/* File: arm/alt_stub.S */
9196/*
9197 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9198 * any interesting requests and then jump to the real instruction
9199 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9200 */
9201 .extern MterpCheckBefore
9202 EXPORT_PC
9203 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9204 adrl lr, artMterpAsmInstructionStart + (86 * 128) @ Addr of primary handler.
9205 mov r0, rSELF
9206 add r1, rFP, #OFF_FP_SHADOWFRAME
9207 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9208
9209/* ------------------------------ */
9210 .balign 128
9211.L_ALT_op_iget_char: /* 0x57 */
9212/* File: arm/alt_stub.S */
9213/*
9214 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9215 * any interesting requests and then jump to the real instruction
9216 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9217 */
9218 .extern MterpCheckBefore
9219 EXPORT_PC
9220 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9221 adrl lr, artMterpAsmInstructionStart + (87 * 128) @ Addr of primary handler.
9222 mov r0, rSELF
9223 add r1, rFP, #OFF_FP_SHADOWFRAME
9224 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9225
9226/* ------------------------------ */
9227 .balign 128
9228.L_ALT_op_iget_short: /* 0x58 */
9229/* File: arm/alt_stub.S */
9230/*
9231 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9232 * any interesting requests and then jump to the real instruction
9233 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9234 */
9235 .extern MterpCheckBefore
9236 EXPORT_PC
9237 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9238 adrl lr, artMterpAsmInstructionStart + (88 * 128) @ Addr of primary handler.
9239 mov r0, rSELF
9240 add r1, rFP, #OFF_FP_SHADOWFRAME
9241 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9242
9243/* ------------------------------ */
9244 .balign 128
9245.L_ALT_op_iput: /* 0x59 */
9246/* File: arm/alt_stub.S */
9247/*
9248 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9249 * any interesting requests and then jump to the real instruction
9250 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9251 */
9252 .extern MterpCheckBefore
9253 EXPORT_PC
9254 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9255 adrl lr, artMterpAsmInstructionStart + (89 * 128) @ Addr of primary handler.
9256 mov r0, rSELF
9257 add r1, rFP, #OFF_FP_SHADOWFRAME
9258 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9259
9260/* ------------------------------ */
9261 .balign 128
9262.L_ALT_op_iput_wide: /* 0x5a */
9263/* File: arm/alt_stub.S */
9264/*
9265 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9266 * any interesting requests and then jump to the real instruction
9267 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9268 */
9269 .extern MterpCheckBefore
9270 EXPORT_PC
9271 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9272 adrl lr, artMterpAsmInstructionStart + (90 * 128) @ Addr of primary handler.
9273 mov r0, rSELF
9274 add r1, rFP, #OFF_FP_SHADOWFRAME
9275 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9276
9277/* ------------------------------ */
9278 .balign 128
9279.L_ALT_op_iput_object: /* 0x5b */
9280/* File: arm/alt_stub.S */
9281/*
9282 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9283 * any interesting requests and then jump to the real instruction
9284 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9285 */
9286 .extern MterpCheckBefore
9287 EXPORT_PC
9288 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9289 adrl lr, artMterpAsmInstructionStart + (91 * 128) @ Addr of primary handler.
9290 mov r0, rSELF
9291 add r1, rFP, #OFF_FP_SHADOWFRAME
9292 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9293
9294/* ------------------------------ */
9295 .balign 128
9296.L_ALT_op_iput_boolean: /* 0x5c */
9297/* File: arm/alt_stub.S */
9298/*
9299 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9300 * any interesting requests and then jump to the real instruction
9301 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9302 */
9303 .extern MterpCheckBefore
9304 EXPORT_PC
9305 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9306 adrl lr, artMterpAsmInstructionStart + (92 * 128) @ Addr of primary handler.
9307 mov r0, rSELF
9308 add r1, rFP, #OFF_FP_SHADOWFRAME
9309 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9310
9311/* ------------------------------ */
9312 .balign 128
9313.L_ALT_op_iput_byte: /* 0x5d */
9314/* File: arm/alt_stub.S */
9315/*
9316 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9317 * any interesting requests and then jump to the real instruction
9318 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9319 */
9320 .extern MterpCheckBefore
9321 EXPORT_PC
9322 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9323 adrl lr, artMterpAsmInstructionStart + (93 * 128) @ Addr of primary handler.
9324 mov r0, rSELF
9325 add r1, rFP, #OFF_FP_SHADOWFRAME
9326 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9327
9328/* ------------------------------ */
9329 .balign 128
9330.L_ALT_op_iput_char: /* 0x5e */
9331/* File: arm/alt_stub.S */
9332/*
9333 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9334 * any interesting requests and then jump to the real instruction
9335 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9336 */
9337 .extern MterpCheckBefore
9338 EXPORT_PC
9339 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9340 adrl lr, artMterpAsmInstructionStart + (94 * 128) @ Addr of primary handler.
9341 mov r0, rSELF
9342 add r1, rFP, #OFF_FP_SHADOWFRAME
9343 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9344
9345/* ------------------------------ */
9346 .balign 128
9347.L_ALT_op_iput_short: /* 0x5f */
9348/* File: arm/alt_stub.S */
9349/*
9350 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9351 * any interesting requests and then jump to the real instruction
9352 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9353 */
9354 .extern MterpCheckBefore
9355 EXPORT_PC
9356 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9357 adrl lr, artMterpAsmInstructionStart + (95 * 128) @ Addr of primary handler.
9358 mov r0, rSELF
9359 add r1, rFP, #OFF_FP_SHADOWFRAME
9360 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9361
9362/* ------------------------------ */
9363 .balign 128
9364.L_ALT_op_sget: /* 0x60 */
9365/* File: arm/alt_stub.S */
9366/*
9367 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9368 * any interesting requests and then jump to the real instruction
9369 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9370 */
9371 .extern MterpCheckBefore
9372 EXPORT_PC
9373 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9374 adrl lr, artMterpAsmInstructionStart + (96 * 128) @ Addr of primary handler.
9375 mov r0, rSELF
9376 add r1, rFP, #OFF_FP_SHADOWFRAME
9377 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9378
9379/* ------------------------------ */
9380 .balign 128
9381.L_ALT_op_sget_wide: /* 0x61 */
9382/* File: arm/alt_stub.S */
9383/*
9384 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9385 * any interesting requests and then jump to the real instruction
9386 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9387 */
9388 .extern MterpCheckBefore
9389 EXPORT_PC
9390 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9391 adrl lr, artMterpAsmInstructionStart + (97 * 128) @ Addr of primary handler.
9392 mov r0, rSELF
9393 add r1, rFP, #OFF_FP_SHADOWFRAME
9394 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9395
9396/* ------------------------------ */
9397 .balign 128
9398.L_ALT_op_sget_object: /* 0x62 */
9399/* File: arm/alt_stub.S */
9400/*
9401 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9402 * any interesting requests and then jump to the real instruction
9403 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9404 */
9405 .extern MterpCheckBefore
9406 EXPORT_PC
9407 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9408 adrl lr, artMterpAsmInstructionStart + (98 * 128) @ Addr of primary handler.
9409 mov r0, rSELF
9410 add r1, rFP, #OFF_FP_SHADOWFRAME
9411 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9412
9413/* ------------------------------ */
9414 .balign 128
9415.L_ALT_op_sget_boolean: /* 0x63 */
9416/* File: arm/alt_stub.S */
9417/*
9418 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9419 * any interesting requests and then jump to the real instruction
9420 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9421 */
9422 .extern MterpCheckBefore
9423 EXPORT_PC
9424 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9425 adrl lr, artMterpAsmInstructionStart + (99 * 128) @ Addr of primary handler.
9426 mov r0, rSELF
9427 add r1, rFP, #OFF_FP_SHADOWFRAME
9428 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9429
9430/* ------------------------------ */
9431 .balign 128
9432.L_ALT_op_sget_byte: /* 0x64 */
9433/* File: arm/alt_stub.S */
9434/*
9435 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9436 * any interesting requests and then jump to the real instruction
9437 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9438 */
9439 .extern MterpCheckBefore
9440 EXPORT_PC
9441 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9442 adrl lr, artMterpAsmInstructionStart + (100 * 128) @ Addr of primary handler.
9443 mov r0, rSELF
9444 add r1, rFP, #OFF_FP_SHADOWFRAME
9445 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9446
9447/* ------------------------------ */
9448 .balign 128
9449.L_ALT_op_sget_char: /* 0x65 */
9450/* File: arm/alt_stub.S */
9451/*
9452 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9453 * any interesting requests and then jump to the real instruction
9454 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9455 */
9456 .extern MterpCheckBefore
9457 EXPORT_PC
9458 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9459 adrl lr, artMterpAsmInstructionStart + (101 * 128) @ Addr of primary handler.
9460 mov r0, rSELF
9461 add r1, rFP, #OFF_FP_SHADOWFRAME
9462 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9463
9464/* ------------------------------ */
9465 .balign 128
9466.L_ALT_op_sget_short: /* 0x66 */
9467/* File: arm/alt_stub.S */
9468/*
9469 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9470 * any interesting requests and then jump to the real instruction
9471 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9472 */
9473 .extern MterpCheckBefore
9474 EXPORT_PC
9475 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9476 adrl lr, artMterpAsmInstructionStart + (102 * 128) @ Addr of primary handler.
9477 mov r0, rSELF
9478 add r1, rFP, #OFF_FP_SHADOWFRAME
9479 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9480
9481/* ------------------------------ */
9482 .balign 128
9483.L_ALT_op_sput: /* 0x67 */
9484/* File: arm/alt_stub.S */
9485/*
9486 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9487 * any interesting requests and then jump to the real instruction
9488 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9489 */
9490 .extern MterpCheckBefore
9491 EXPORT_PC
9492 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9493 adrl lr, artMterpAsmInstructionStart + (103 * 128) @ Addr of primary handler.
9494 mov r0, rSELF
9495 add r1, rFP, #OFF_FP_SHADOWFRAME
9496 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9497
9498/* ------------------------------ */
9499 .balign 128
9500.L_ALT_op_sput_wide: /* 0x68 */
9501/* File: arm/alt_stub.S */
9502/*
9503 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9504 * any interesting requests and then jump to the real instruction
9505 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9506 */
9507 .extern MterpCheckBefore
9508 EXPORT_PC
9509 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9510 adrl lr, artMterpAsmInstructionStart + (104 * 128) @ Addr of primary handler.
9511 mov r0, rSELF
9512 add r1, rFP, #OFF_FP_SHADOWFRAME
9513 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9514
9515/* ------------------------------ */
9516 .balign 128
9517.L_ALT_op_sput_object: /* 0x69 */
9518/* File: arm/alt_stub.S */
9519/*
9520 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9521 * any interesting requests and then jump to the real instruction
9522 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9523 */
9524 .extern MterpCheckBefore
9525 EXPORT_PC
9526 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9527 adrl lr, artMterpAsmInstructionStart + (105 * 128) @ Addr of primary handler.
9528 mov r0, rSELF
9529 add r1, rFP, #OFF_FP_SHADOWFRAME
9530 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9531
9532/* ------------------------------ */
9533 .balign 128
9534.L_ALT_op_sput_boolean: /* 0x6a */
9535/* File: arm/alt_stub.S */
9536/*
9537 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9538 * any interesting requests and then jump to the real instruction
9539 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9540 */
9541 .extern MterpCheckBefore
9542 EXPORT_PC
9543 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9544 adrl lr, artMterpAsmInstructionStart + (106 * 128) @ Addr of primary handler.
9545 mov r0, rSELF
9546 add r1, rFP, #OFF_FP_SHADOWFRAME
9547 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9548
9549/* ------------------------------ */
9550 .balign 128
9551.L_ALT_op_sput_byte: /* 0x6b */
9552/* File: arm/alt_stub.S */
9553/*
9554 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9555 * any interesting requests and then jump to the real instruction
9556 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9557 */
9558 .extern MterpCheckBefore
9559 EXPORT_PC
9560 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9561 adrl lr, artMterpAsmInstructionStart + (107 * 128) @ Addr of primary handler.
9562 mov r0, rSELF
9563 add r1, rFP, #OFF_FP_SHADOWFRAME
9564 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9565
9566/* ------------------------------ */
9567 .balign 128
9568.L_ALT_op_sput_char: /* 0x6c */
9569/* File: arm/alt_stub.S */
9570/*
9571 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9572 * any interesting requests and then jump to the real instruction
9573 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9574 */
9575 .extern MterpCheckBefore
9576 EXPORT_PC
9577 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9578 adrl lr, artMterpAsmInstructionStart + (108 * 128) @ Addr of primary handler.
9579 mov r0, rSELF
9580 add r1, rFP, #OFF_FP_SHADOWFRAME
9581 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9582
9583/* ------------------------------ */
9584 .balign 128
9585.L_ALT_op_sput_short: /* 0x6d */
9586/* File: arm/alt_stub.S */
9587/*
9588 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9589 * any interesting requests and then jump to the real instruction
9590 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9591 */
9592 .extern MterpCheckBefore
9593 EXPORT_PC
9594 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9595 adrl lr, artMterpAsmInstructionStart + (109 * 128) @ Addr of primary handler.
9596 mov r0, rSELF
9597 add r1, rFP, #OFF_FP_SHADOWFRAME
9598 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9599
9600/* ------------------------------ */
9601 .balign 128
9602.L_ALT_op_invoke_virtual: /* 0x6e */
9603/* File: arm/alt_stub.S */
9604/*
9605 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9606 * any interesting requests and then jump to the real instruction
9607 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9608 */
9609 .extern MterpCheckBefore
9610 EXPORT_PC
9611 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9612 adrl lr, artMterpAsmInstructionStart + (110 * 128) @ Addr of primary handler.
9613 mov r0, rSELF
9614 add r1, rFP, #OFF_FP_SHADOWFRAME
9615 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9616
9617/* ------------------------------ */
9618 .balign 128
9619.L_ALT_op_invoke_super: /* 0x6f */
9620/* File: arm/alt_stub.S */
9621/*
9622 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9623 * any interesting requests and then jump to the real instruction
9624 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9625 */
9626 .extern MterpCheckBefore
9627 EXPORT_PC
9628 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9629 adrl lr, artMterpAsmInstructionStart + (111 * 128) @ Addr of primary handler.
9630 mov r0, rSELF
9631 add r1, rFP, #OFF_FP_SHADOWFRAME
9632 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9633
9634/* ------------------------------ */
9635 .balign 128
9636.L_ALT_op_invoke_direct: /* 0x70 */
9637/* File: arm/alt_stub.S */
9638/*
9639 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9640 * any interesting requests and then jump to the real instruction
9641 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9642 */
9643 .extern MterpCheckBefore
9644 EXPORT_PC
9645 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9646 adrl lr, artMterpAsmInstructionStart + (112 * 128) @ Addr of primary handler.
9647 mov r0, rSELF
9648 add r1, rFP, #OFF_FP_SHADOWFRAME
9649 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9650
9651/* ------------------------------ */
9652 .balign 128
9653.L_ALT_op_invoke_static: /* 0x71 */
9654/* File: arm/alt_stub.S */
9655/*
9656 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9657 * any interesting requests and then jump to the real instruction
9658 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9659 */
9660 .extern MterpCheckBefore
9661 EXPORT_PC
9662 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9663 adrl lr, artMterpAsmInstructionStart + (113 * 128) @ Addr of primary handler.
9664 mov r0, rSELF
9665 add r1, rFP, #OFF_FP_SHADOWFRAME
9666 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9667
9668/* ------------------------------ */
9669 .balign 128
9670.L_ALT_op_invoke_interface: /* 0x72 */
9671/* File: arm/alt_stub.S */
9672/*
9673 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9674 * any interesting requests and then jump to the real instruction
9675 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9676 */
9677 .extern MterpCheckBefore
9678 EXPORT_PC
9679 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9680 adrl lr, artMterpAsmInstructionStart + (114 * 128) @ Addr of primary handler.
9681 mov r0, rSELF
9682 add r1, rFP, #OFF_FP_SHADOWFRAME
9683 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9684
9685/* ------------------------------ */
9686 .balign 128
9687.L_ALT_op_return_void_no_barrier: /* 0x73 */
9688/* File: arm/alt_stub.S */
9689/*
9690 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9691 * any interesting requests and then jump to the real instruction
9692 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9693 */
9694 .extern MterpCheckBefore
9695 EXPORT_PC
9696 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9697 adrl lr, artMterpAsmInstructionStart + (115 * 128) @ Addr of primary handler.
9698 mov r0, rSELF
9699 add r1, rFP, #OFF_FP_SHADOWFRAME
9700 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9701
9702/* ------------------------------ */
9703 .balign 128
9704.L_ALT_op_invoke_virtual_range: /* 0x74 */
9705/* File: arm/alt_stub.S */
9706/*
9707 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9708 * any interesting requests and then jump to the real instruction
9709 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9710 */
9711 .extern MterpCheckBefore
9712 EXPORT_PC
9713 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9714 adrl lr, artMterpAsmInstructionStart + (116 * 128) @ Addr of primary handler.
9715 mov r0, rSELF
9716 add r1, rFP, #OFF_FP_SHADOWFRAME
9717 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9718
9719/* ------------------------------ */
9720 .balign 128
9721.L_ALT_op_invoke_super_range: /* 0x75 */
9722/* File: arm/alt_stub.S */
9723/*
9724 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9725 * any interesting requests and then jump to the real instruction
9726 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9727 */
9728 .extern MterpCheckBefore
9729 EXPORT_PC
9730 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9731 adrl lr, artMterpAsmInstructionStart + (117 * 128) @ Addr of primary handler.
9732 mov r0, rSELF
9733 add r1, rFP, #OFF_FP_SHADOWFRAME
9734 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9735
9736/* ------------------------------ */
9737 .balign 128
9738.L_ALT_op_invoke_direct_range: /* 0x76 */
9739/* File: arm/alt_stub.S */
9740/*
9741 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9742 * any interesting requests and then jump to the real instruction
9743 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9744 */
9745 .extern MterpCheckBefore
9746 EXPORT_PC
9747 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9748 adrl lr, artMterpAsmInstructionStart + (118 * 128) @ Addr of primary handler.
9749 mov r0, rSELF
9750 add r1, rFP, #OFF_FP_SHADOWFRAME
9751 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9752
9753/* ------------------------------ */
9754 .balign 128
9755.L_ALT_op_invoke_static_range: /* 0x77 */
9756/* File: arm/alt_stub.S */
9757/*
9758 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9759 * any interesting requests and then jump to the real instruction
9760 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9761 */
9762 .extern MterpCheckBefore
9763 EXPORT_PC
9764 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9765 adrl lr, artMterpAsmInstructionStart + (119 * 128) @ Addr of primary handler.
9766 mov r0, rSELF
9767 add r1, rFP, #OFF_FP_SHADOWFRAME
9768 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9769
9770/* ------------------------------ */
9771 .balign 128
9772.L_ALT_op_invoke_interface_range: /* 0x78 */
9773/* File: arm/alt_stub.S */
9774/*
9775 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9776 * any interesting requests and then jump to the real instruction
9777 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9778 */
9779 .extern MterpCheckBefore
9780 EXPORT_PC
9781 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9782 adrl lr, artMterpAsmInstructionStart + (120 * 128) @ Addr of primary handler.
9783 mov r0, rSELF
9784 add r1, rFP, #OFF_FP_SHADOWFRAME
9785 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9786
9787/* ------------------------------ */
9788 .balign 128
9789.L_ALT_op_unused_79: /* 0x79 */
9790/* File: arm/alt_stub.S */
9791/*
9792 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9793 * any interesting requests and then jump to the real instruction
9794 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9795 */
9796 .extern MterpCheckBefore
9797 EXPORT_PC
9798 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9799 adrl lr, artMterpAsmInstructionStart + (121 * 128) @ Addr of primary handler.
9800 mov r0, rSELF
9801 add r1, rFP, #OFF_FP_SHADOWFRAME
9802 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9803
9804/* ------------------------------ */
9805 .balign 128
9806.L_ALT_op_unused_7a: /* 0x7a */
9807/* File: arm/alt_stub.S */
9808/*
9809 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9810 * any interesting requests and then jump to the real instruction
9811 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9812 */
9813 .extern MterpCheckBefore
9814 EXPORT_PC
9815 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9816 adrl lr, artMterpAsmInstructionStart + (122 * 128) @ Addr of primary handler.
9817 mov r0, rSELF
9818 add r1, rFP, #OFF_FP_SHADOWFRAME
9819 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9820
9821/* ------------------------------ */
9822 .balign 128
9823.L_ALT_op_neg_int: /* 0x7b */
9824/* File: arm/alt_stub.S */
9825/*
9826 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9827 * any interesting requests and then jump to the real instruction
9828 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9829 */
9830 .extern MterpCheckBefore
9831 EXPORT_PC
9832 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9833 adrl lr, artMterpAsmInstructionStart + (123 * 128) @ Addr of primary handler.
9834 mov r0, rSELF
9835 add r1, rFP, #OFF_FP_SHADOWFRAME
9836 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9837
9838/* ------------------------------ */
9839 .balign 128
9840.L_ALT_op_not_int: /* 0x7c */
9841/* File: arm/alt_stub.S */
9842/*
9843 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9844 * any interesting requests and then jump to the real instruction
9845 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9846 */
9847 .extern MterpCheckBefore
9848 EXPORT_PC
9849 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9850 adrl lr, artMterpAsmInstructionStart + (124 * 128) @ Addr of primary handler.
9851 mov r0, rSELF
9852 add r1, rFP, #OFF_FP_SHADOWFRAME
9853 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9854
9855/* ------------------------------ */
9856 .balign 128
9857.L_ALT_op_neg_long: /* 0x7d */
9858/* File: arm/alt_stub.S */
9859/*
9860 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9861 * any interesting requests and then jump to the real instruction
9862 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9863 */
9864 .extern MterpCheckBefore
9865 EXPORT_PC
9866 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9867 adrl lr, artMterpAsmInstructionStart + (125 * 128) @ Addr of primary handler.
9868 mov r0, rSELF
9869 add r1, rFP, #OFF_FP_SHADOWFRAME
9870 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9871
9872/* ------------------------------ */
9873 .balign 128
9874.L_ALT_op_not_long: /* 0x7e */
9875/* File: arm/alt_stub.S */
9876/*
9877 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9878 * any interesting requests and then jump to the real instruction
9879 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9880 */
9881 .extern MterpCheckBefore
9882 EXPORT_PC
9883 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9884 adrl lr, artMterpAsmInstructionStart + (126 * 128) @ Addr of primary handler.
9885 mov r0, rSELF
9886 add r1, rFP, #OFF_FP_SHADOWFRAME
9887 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9888
9889/* ------------------------------ */
9890 .balign 128
9891.L_ALT_op_neg_float: /* 0x7f */
9892/* File: arm/alt_stub.S */
9893/*
9894 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9895 * any interesting requests and then jump to the real instruction
9896 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9897 */
9898 .extern MterpCheckBefore
9899 EXPORT_PC
9900 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9901 adrl lr, artMterpAsmInstructionStart + (127 * 128) @ Addr of primary handler.
9902 mov r0, rSELF
9903 add r1, rFP, #OFF_FP_SHADOWFRAME
9904 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9905
9906/* ------------------------------ */
9907 .balign 128
9908.L_ALT_op_neg_double: /* 0x80 */
9909/* File: arm/alt_stub.S */
9910/*
9911 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9912 * any interesting requests and then jump to the real instruction
9913 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9914 */
9915 .extern MterpCheckBefore
9916 EXPORT_PC
9917 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9918 adrl lr, artMterpAsmInstructionStart + (128 * 128) @ Addr of primary handler.
9919 mov r0, rSELF
9920 add r1, rFP, #OFF_FP_SHADOWFRAME
9921 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9922
9923/* ------------------------------ */
9924 .balign 128
9925.L_ALT_op_int_to_long: /* 0x81 */
9926/* File: arm/alt_stub.S */
9927/*
9928 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9929 * any interesting requests and then jump to the real instruction
9930 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9931 */
9932 .extern MterpCheckBefore
9933 EXPORT_PC
9934 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9935 adrl lr, artMterpAsmInstructionStart + (129 * 128) @ Addr of primary handler.
9936 mov r0, rSELF
9937 add r1, rFP, #OFF_FP_SHADOWFRAME
9938 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9939
9940/* ------------------------------ */
9941 .balign 128
9942.L_ALT_op_int_to_float: /* 0x82 */
9943/* File: arm/alt_stub.S */
9944/*
9945 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9946 * any interesting requests and then jump to the real instruction
9947 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9948 */
9949 .extern MterpCheckBefore
9950 EXPORT_PC
9951 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9952 adrl lr, artMterpAsmInstructionStart + (130 * 128) @ Addr of primary handler.
9953 mov r0, rSELF
9954 add r1, rFP, #OFF_FP_SHADOWFRAME
9955 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9956
9957/* ------------------------------ */
9958 .balign 128
9959.L_ALT_op_int_to_double: /* 0x83 */
9960/* File: arm/alt_stub.S */
9961/*
9962 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9963 * any interesting requests and then jump to the real instruction
9964 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9965 */
9966 .extern MterpCheckBefore
9967 EXPORT_PC
9968 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9969 adrl lr, artMterpAsmInstructionStart + (131 * 128) @ Addr of primary handler.
9970 mov r0, rSELF
9971 add r1, rFP, #OFF_FP_SHADOWFRAME
9972 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9973
9974/* ------------------------------ */
9975 .balign 128
9976.L_ALT_op_long_to_int: /* 0x84 */
9977/* File: arm/alt_stub.S */
9978/*
9979 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9980 * any interesting requests and then jump to the real instruction
9981 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9982 */
9983 .extern MterpCheckBefore
9984 EXPORT_PC
9985 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9986 adrl lr, artMterpAsmInstructionStart + (132 * 128) @ Addr of primary handler.
9987 mov r0, rSELF
9988 add r1, rFP, #OFF_FP_SHADOWFRAME
9989 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9990
9991/* ------------------------------ */
9992 .balign 128
9993.L_ALT_op_long_to_float: /* 0x85 */
9994/* File: arm/alt_stub.S */
9995/*
9996 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9997 * any interesting requests and then jump to the real instruction
9998 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9999 */
10000 .extern MterpCheckBefore
10001 EXPORT_PC
10002 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10003 adrl lr, artMterpAsmInstructionStart + (133 * 128) @ Addr of primary handler.
10004 mov r0, rSELF
10005 add r1, rFP, #OFF_FP_SHADOWFRAME
10006 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10007
10008/* ------------------------------ */
10009 .balign 128
10010.L_ALT_op_long_to_double: /* 0x86 */
10011/* File: arm/alt_stub.S */
10012/*
10013 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10014 * any interesting requests and then jump to the real instruction
10015 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10016 */
10017 .extern MterpCheckBefore
10018 EXPORT_PC
10019 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10020 adrl lr, artMterpAsmInstructionStart + (134 * 128) @ Addr of primary handler.
10021 mov r0, rSELF
10022 add r1, rFP, #OFF_FP_SHADOWFRAME
10023 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10024
10025/* ------------------------------ */
10026 .balign 128
10027.L_ALT_op_float_to_int: /* 0x87 */
10028/* File: arm/alt_stub.S */
10029/*
10030 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10031 * any interesting requests and then jump to the real instruction
10032 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10033 */
10034 .extern MterpCheckBefore
10035 EXPORT_PC
10036 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10037 adrl lr, artMterpAsmInstructionStart + (135 * 128) @ Addr of primary handler.
10038 mov r0, rSELF
10039 add r1, rFP, #OFF_FP_SHADOWFRAME
10040 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10041
10042/* ------------------------------ */
10043 .balign 128
10044.L_ALT_op_float_to_long: /* 0x88 */
10045/* File: arm/alt_stub.S */
10046/*
10047 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10048 * any interesting requests and then jump to the real instruction
10049 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10050 */
10051 .extern MterpCheckBefore
10052 EXPORT_PC
10053 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10054 adrl lr, artMterpAsmInstructionStart + (136 * 128) @ Addr of primary handler.
10055 mov r0, rSELF
10056 add r1, rFP, #OFF_FP_SHADOWFRAME
10057 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10058
10059/* ------------------------------ */
10060 .balign 128
10061.L_ALT_op_float_to_double: /* 0x89 */
10062/* File: arm/alt_stub.S */
10063/*
10064 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10065 * any interesting requests and then jump to the real instruction
10066 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10067 */
10068 .extern MterpCheckBefore
10069 EXPORT_PC
10070 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10071 adrl lr, artMterpAsmInstructionStart + (137 * 128) @ Addr of primary handler.
10072 mov r0, rSELF
10073 add r1, rFP, #OFF_FP_SHADOWFRAME
10074 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10075
10076/* ------------------------------ */
10077 .balign 128
10078.L_ALT_op_double_to_int: /* 0x8a */
10079/* File: arm/alt_stub.S */
10080/*
10081 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10082 * any interesting requests and then jump to the real instruction
10083 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10084 */
10085 .extern MterpCheckBefore
10086 EXPORT_PC
10087 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10088 adrl lr, artMterpAsmInstructionStart + (138 * 128) @ Addr of primary handler.
10089 mov r0, rSELF
10090 add r1, rFP, #OFF_FP_SHADOWFRAME
10091 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10092
10093/* ------------------------------ */
10094 .balign 128
10095.L_ALT_op_double_to_long: /* 0x8b */
10096/* File: arm/alt_stub.S */
10097/*
10098 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10099 * any interesting requests and then jump to the real instruction
10100 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10101 */
10102 .extern MterpCheckBefore
10103 EXPORT_PC
10104 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10105 adrl lr, artMterpAsmInstructionStart + (139 * 128) @ Addr of primary handler.
10106 mov r0, rSELF
10107 add r1, rFP, #OFF_FP_SHADOWFRAME
10108 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10109
10110/* ------------------------------ */
10111 .balign 128
10112.L_ALT_op_double_to_float: /* 0x8c */
10113/* File: arm/alt_stub.S */
10114/*
10115 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10116 * any interesting requests and then jump to the real instruction
10117 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10118 */
10119 .extern MterpCheckBefore
10120 EXPORT_PC
10121 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10122 adrl lr, artMterpAsmInstructionStart + (140 * 128) @ Addr of primary handler.
10123 mov r0, rSELF
10124 add r1, rFP, #OFF_FP_SHADOWFRAME
10125 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10126
10127/* ------------------------------ */
10128 .balign 128
10129.L_ALT_op_int_to_byte: /* 0x8d */
10130/* File: arm/alt_stub.S */
10131/*
10132 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10133 * any interesting requests and then jump to the real instruction
10134 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10135 */
10136 .extern MterpCheckBefore
10137 EXPORT_PC
10138 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10139 adrl lr, artMterpAsmInstructionStart + (141 * 128) @ Addr of primary handler.
10140 mov r0, rSELF
10141 add r1, rFP, #OFF_FP_SHADOWFRAME
10142 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10143
10144/* ------------------------------ */
10145 .balign 128
10146.L_ALT_op_int_to_char: /* 0x8e */
10147/* File: arm/alt_stub.S */
10148/*
10149 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10150 * any interesting requests and then jump to the real instruction
10151 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10152 */
10153 .extern MterpCheckBefore
10154 EXPORT_PC
10155 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10156 adrl lr, artMterpAsmInstructionStart + (142 * 128) @ Addr of primary handler.
10157 mov r0, rSELF
10158 add r1, rFP, #OFF_FP_SHADOWFRAME
10159 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10160
10161/* ------------------------------ */
10162 .balign 128
10163.L_ALT_op_int_to_short: /* 0x8f */
10164/* File: arm/alt_stub.S */
10165/*
10166 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10167 * any interesting requests and then jump to the real instruction
10168 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10169 */
10170 .extern MterpCheckBefore
10171 EXPORT_PC
10172 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10173 adrl lr, artMterpAsmInstructionStart + (143 * 128) @ Addr of primary handler.
10174 mov r0, rSELF
10175 add r1, rFP, #OFF_FP_SHADOWFRAME
10176 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10177
10178/* ------------------------------ */
10179 .balign 128
10180.L_ALT_op_add_int: /* 0x90 */
10181/* File: arm/alt_stub.S */
10182/*
10183 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10184 * any interesting requests and then jump to the real instruction
10185 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10186 */
10187 .extern MterpCheckBefore
10188 EXPORT_PC
10189 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10190 adrl lr, artMterpAsmInstructionStart + (144 * 128) @ Addr of primary handler.
10191 mov r0, rSELF
10192 add r1, rFP, #OFF_FP_SHADOWFRAME
10193 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10194
10195/* ------------------------------ */
10196 .balign 128
10197.L_ALT_op_sub_int: /* 0x91 */
10198/* File: arm/alt_stub.S */
10199/*
10200 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10201 * any interesting requests and then jump to the real instruction
10202 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10203 */
10204 .extern MterpCheckBefore
10205 EXPORT_PC
10206 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10207 adrl lr, artMterpAsmInstructionStart + (145 * 128) @ Addr of primary handler.
10208 mov r0, rSELF
10209 add r1, rFP, #OFF_FP_SHADOWFRAME
10210 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10211
10212/* ------------------------------ */
10213 .balign 128
10214.L_ALT_op_mul_int: /* 0x92 */
10215/* File: arm/alt_stub.S */
10216/*
10217 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10218 * any interesting requests and then jump to the real instruction
10219 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10220 */
10221 .extern MterpCheckBefore
10222 EXPORT_PC
10223 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10224 adrl lr, artMterpAsmInstructionStart + (146 * 128) @ Addr of primary handler.
10225 mov r0, rSELF
10226 add r1, rFP, #OFF_FP_SHADOWFRAME
10227 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10228
10229/* ------------------------------ */
10230 .balign 128
10231.L_ALT_op_div_int: /* 0x93 */
10232/* File: arm/alt_stub.S */
10233/*
10234 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10235 * any interesting requests and then jump to the real instruction
10236 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10237 */
10238 .extern MterpCheckBefore
10239 EXPORT_PC
10240 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10241 adrl lr, artMterpAsmInstructionStart + (147 * 128) @ Addr of primary handler.
10242 mov r0, rSELF
10243 add r1, rFP, #OFF_FP_SHADOWFRAME
10244 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10245
10246/* ------------------------------ */
10247 .balign 128
10248.L_ALT_op_rem_int: /* 0x94 */
10249/* File: arm/alt_stub.S */
10250/*
10251 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10252 * any interesting requests and then jump to the real instruction
10253 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10254 */
10255 .extern MterpCheckBefore
10256 EXPORT_PC
10257 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10258 adrl lr, artMterpAsmInstructionStart + (148 * 128) @ Addr of primary handler.
10259 mov r0, rSELF
10260 add r1, rFP, #OFF_FP_SHADOWFRAME
10261 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10262
10263/* ------------------------------ */
10264 .balign 128
10265.L_ALT_op_and_int: /* 0x95 */
10266/* File: arm/alt_stub.S */
10267/*
10268 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10269 * any interesting requests and then jump to the real instruction
10270 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10271 */
10272 .extern MterpCheckBefore
10273 EXPORT_PC
10274 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10275 adrl lr, artMterpAsmInstructionStart + (149 * 128) @ Addr of primary handler.
10276 mov r0, rSELF
10277 add r1, rFP, #OFF_FP_SHADOWFRAME
10278 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10279
10280/* ------------------------------ */
10281 .balign 128
10282.L_ALT_op_or_int: /* 0x96 */
10283/* File: arm/alt_stub.S */
10284/*
10285 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10286 * any interesting requests and then jump to the real instruction
10287 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10288 */
10289 .extern MterpCheckBefore
10290 EXPORT_PC
10291 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10292 adrl lr, artMterpAsmInstructionStart + (150 * 128) @ Addr of primary handler.
10293 mov r0, rSELF
10294 add r1, rFP, #OFF_FP_SHADOWFRAME
10295 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10296
10297/* ------------------------------ */
10298 .balign 128
10299.L_ALT_op_xor_int: /* 0x97 */
10300/* File: arm/alt_stub.S */
10301/*
10302 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10303 * any interesting requests and then jump to the real instruction
10304 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10305 */
10306 .extern MterpCheckBefore
10307 EXPORT_PC
10308 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10309 adrl lr, artMterpAsmInstructionStart + (151 * 128) @ Addr of primary handler.
10310 mov r0, rSELF
10311 add r1, rFP, #OFF_FP_SHADOWFRAME
10312 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10313
10314/* ------------------------------ */
10315 .balign 128
10316.L_ALT_op_shl_int: /* 0x98 */
10317/* File: arm/alt_stub.S */
10318/*
10319 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10320 * any interesting requests and then jump to the real instruction
10321 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10322 */
10323 .extern MterpCheckBefore
10324 EXPORT_PC
10325 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10326 adrl lr, artMterpAsmInstructionStart + (152 * 128) @ Addr of primary handler.
10327 mov r0, rSELF
10328 add r1, rFP, #OFF_FP_SHADOWFRAME
10329 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10330
10331/* ------------------------------ */
10332 .balign 128
10333.L_ALT_op_shr_int: /* 0x99 */
10334/* File: arm/alt_stub.S */
10335/*
10336 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10337 * any interesting requests and then jump to the real instruction
10338 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10339 */
10340 .extern MterpCheckBefore
10341 EXPORT_PC
10342 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10343 adrl lr, artMterpAsmInstructionStart + (153 * 128) @ Addr of primary handler.
10344 mov r0, rSELF
10345 add r1, rFP, #OFF_FP_SHADOWFRAME
10346 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10347
10348/* ------------------------------ */
10349 .balign 128
10350.L_ALT_op_ushr_int: /* 0x9a */
10351/* File: arm/alt_stub.S */
10352/*
10353 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10354 * any interesting requests and then jump to the real instruction
10355 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10356 */
10357 .extern MterpCheckBefore
10358 EXPORT_PC
10359 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10360 adrl lr, artMterpAsmInstructionStart + (154 * 128) @ Addr of primary handler.
10361 mov r0, rSELF
10362 add r1, rFP, #OFF_FP_SHADOWFRAME
10363 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10364
10365/* ------------------------------ */
10366 .balign 128
10367.L_ALT_op_add_long: /* 0x9b */
10368/* File: arm/alt_stub.S */
10369/*
10370 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10371 * any interesting requests and then jump to the real instruction
10372 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10373 */
10374 .extern MterpCheckBefore
10375 EXPORT_PC
10376 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10377 adrl lr, artMterpAsmInstructionStart + (155 * 128) @ Addr of primary handler.
10378 mov r0, rSELF
10379 add r1, rFP, #OFF_FP_SHADOWFRAME
10380 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10381
10382/* ------------------------------ */
10383 .balign 128
10384.L_ALT_op_sub_long: /* 0x9c */
10385/* File: arm/alt_stub.S */
10386/*
10387 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10388 * any interesting requests and then jump to the real instruction
10389 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10390 */
10391 .extern MterpCheckBefore
10392 EXPORT_PC
10393 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10394 adrl lr, artMterpAsmInstructionStart + (156 * 128) @ Addr of primary handler.
10395 mov r0, rSELF
10396 add r1, rFP, #OFF_FP_SHADOWFRAME
10397 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10398
10399/* ------------------------------ */
10400 .balign 128
10401.L_ALT_op_mul_long: /* 0x9d */
10402/* File: arm/alt_stub.S */
10403/*
10404 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10405 * any interesting requests and then jump to the real instruction
10406 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10407 */
10408 .extern MterpCheckBefore
10409 EXPORT_PC
10410 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10411 adrl lr, artMterpAsmInstructionStart + (157 * 128) @ Addr of primary handler.
10412 mov r0, rSELF
10413 add r1, rFP, #OFF_FP_SHADOWFRAME
10414 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10415
10416/* ------------------------------ */
10417 .balign 128
10418.L_ALT_op_div_long: /* 0x9e */
10419/* File: arm/alt_stub.S */
10420/*
10421 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10422 * any interesting requests and then jump to the real instruction
10423 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10424 */
10425 .extern MterpCheckBefore
10426 EXPORT_PC
10427 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10428 adrl lr, artMterpAsmInstructionStart + (158 * 128) @ Addr of primary handler.
10429 mov r0, rSELF
10430 add r1, rFP, #OFF_FP_SHADOWFRAME
10431 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10432
10433/* ------------------------------ */
10434 .balign 128
10435.L_ALT_op_rem_long: /* 0x9f */
10436/* File: arm/alt_stub.S */
10437/*
10438 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10439 * any interesting requests and then jump to the real instruction
10440 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10441 */
10442 .extern MterpCheckBefore
10443 EXPORT_PC
10444 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10445 adrl lr, artMterpAsmInstructionStart + (159 * 128) @ Addr of primary handler.
10446 mov r0, rSELF
10447 add r1, rFP, #OFF_FP_SHADOWFRAME
10448 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10449
10450/* ------------------------------ */
10451 .balign 128
10452.L_ALT_op_and_long: /* 0xa0 */
10453/* File: arm/alt_stub.S */
10454/*
10455 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10456 * any interesting requests and then jump to the real instruction
10457 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10458 */
10459 .extern MterpCheckBefore
10460 EXPORT_PC
10461 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10462 adrl lr, artMterpAsmInstructionStart + (160 * 128) @ Addr of primary handler.
10463 mov r0, rSELF
10464 add r1, rFP, #OFF_FP_SHADOWFRAME
10465 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10466
10467/* ------------------------------ */
10468 .balign 128
10469.L_ALT_op_or_long: /* 0xa1 */
10470/* File: arm/alt_stub.S */
10471/*
10472 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10473 * any interesting requests and then jump to the real instruction
10474 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10475 */
10476 .extern MterpCheckBefore
10477 EXPORT_PC
10478 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10479 adrl lr, artMterpAsmInstructionStart + (161 * 128) @ Addr of primary handler.
10480 mov r0, rSELF
10481 add r1, rFP, #OFF_FP_SHADOWFRAME
10482 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10483
10484/* ------------------------------ */
10485 .balign 128
10486.L_ALT_op_xor_long: /* 0xa2 */
10487/* File: arm/alt_stub.S */
10488/*
10489 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10490 * any interesting requests and then jump to the real instruction
10491 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10492 */
10493 .extern MterpCheckBefore
10494 EXPORT_PC
10495 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10496 adrl lr, artMterpAsmInstructionStart + (162 * 128) @ Addr of primary handler.
10497 mov r0, rSELF
10498 add r1, rFP, #OFF_FP_SHADOWFRAME
10499 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10500
10501/* ------------------------------ */
10502 .balign 128
10503.L_ALT_op_shl_long: /* 0xa3 */
10504/* File: arm/alt_stub.S */
10505/*
10506 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10507 * any interesting requests and then jump to the real instruction
10508 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10509 */
10510 .extern MterpCheckBefore
10511 EXPORT_PC
10512 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10513 adrl lr, artMterpAsmInstructionStart + (163 * 128) @ Addr of primary handler.
10514 mov r0, rSELF
10515 add r1, rFP, #OFF_FP_SHADOWFRAME
10516 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10517
10518/* ------------------------------ */
10519 .balign 128
10520.L_ALT_op_shr_long: /* 0xa4 */
10521/* File: arm/alt_stub.S */
10522/*
10523 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10524 * any interesting requests and then jump to the real instruction
10525 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10526 */
10527 .extern MterpCheckBefore
10528 EXPORT_PC
10529 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10530 adrl lr, artMterpAsmInstructionStart + (164 * 128) @ Addr of primary handler.
10531 mov r0, rSELF
10532 add r1, rFP, #OFF_FP_SHADOWFRAME
10533 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10534
10535/* ------------------------------ */
10536 .balign 128
10537.L_ALT_op_ushr_long: /* 0xa5 */
10538/* File: arm/alt_stub.S */
10539/*
10540 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10541 * any interesting requests and then jump to the real instruction
10542 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10543 */
10544 .extern MterpCheckBefore
10545 EXPORT_PC
10546 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10547 adrl lr, artMterpAsmInstructionStart + (165 * 128) @ Addr of primary handler.
10548 mov r0, rSELF
10549 add r1, rFP, #OFF_FP_SHADOWFRAME
10550 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10551
10552/* ------------------------------ */
10553 .balign 128
10554.L_ALT_op_add_float: /* 0xa6 */
10555/* File: arm/alt_stub.S */
10556/*
10557 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10558 * any interesting requests and then jump to the real instruction
10559 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10560 */
10561 .extern MterpCheckBefore
10562 EXPORT_PC
10563 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10564 adrl lr, artMterpAsmInstructionStart + (166 * 128) @ Addr of primary handler.
10565 mov r0, rSELF
10566 add r1, rFP, #OFF_FP_SHADOWFRAME
10567 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10568
10569/* ------------------------------ */
10570 .balign 128
10571.L_ALT_op_sub_float: /* 0xa7 */
10572/* File: arm/alt_stub.S */
10573/*
10574 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10575 * any interesting requests and then jump to the real instruction
10576 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10577 */
10578 .extern MterpCheckBefore
10579 EXPORT_PC
10580 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10581 adrl lr, artMterpAsmInstructionStart + (167 * 128) @ Addr of primary handler.
10582 mov r0, rSELF
10583 add r1, rFP, #OFF_FP_SHADOWFRAME
10584 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10585
10586/* ------------------------------ */
10587 .balign 128
10588.L_ALT_op_mul_float: /* 0xa8 */
10589/* File: arm/alt_stub.S */
10590/*
10591 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10592 * any interesting requests and then jump to the real instruction
10593 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10594 */
10595 .extern MterpCheckBefore
10596 EXPORT_PC
10597 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10598 adrl lr, artMterpAsmInstructionStart + (168 * 128) @ Addr of primary handler.
10599 mov r0, rSELF
10600 add r1, rFP, #OFF_FP_SHADOWFRAME
10601 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10602
10603/* ------------------------------ */
10604 .balign 128
10605.L_ALT_op_div_float: /* 0xa9 */
10606/* File: arm/alt_stub.S */
10607/*
10608 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10609 * any interesting requests and then jump to the real instruction
10610 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10611 */
10612 .extern MterpCheckBefore
10613 EXPORT_PC
10614 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10615 adrl lr, artMterpAsmInstructionStart + (169 * 128) @ Addr of primary handler.
10616 mov r0, rSELF
10617 add r1, rFP, #OFF_FP_SHADOWFRAME
10618 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10619
10620/* ------------------------------ */
10621 .balign 128
10622.L_ALT_op_rem_float: /* 0xaa */
10623/* File: arm/alt_stub.S */
10624/*
10625 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10626 * any interesting requests and then jump to the real instruction
10627 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10628 */
10629 .extern MterpCheckBefore
10630 EXPORT_PC
10631 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10632 adrl lr, artMterpAsmInstructionStart + (170 * 128) @ Addr of primary handler.
10633 mov r0, rSELF
10634 add r1, rFP, #OFF_FP_SHADOWFRAME
10635 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10636
10637/* ------------------------------ */
10638 .balign 128
10639.L_ALT_op_add_double: /* 0xab */
10640/* File: arm/alt_stub.S */
10641/*
10642 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10643 * any interesting requests and then jump to the real instruction
10644 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10645 */
10646 .extern MterpCheckBefore
10647 EXPORT_PC
10648 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10649 adrl lr, artMterpAsmInstructionStart + (171 * 128) @ Addr of primary handler.
10650 mov r0, rSELF
10651 add r1, rFP, #OFF_FP_SHADOWFRAME
10652 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10653
10654/* ------------------------------ */
10655 .balign 128
10656.L_ALT_op_sub_double: /* 0xac */
10657/* File: arm/alt_stub.S */
10658/*
10659 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10660 * any interesting requests and then jump to the real instruction
10661 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10662 */
10663 .extern MterpCheckBefore
10664 EXPORT_PC
10665 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10666 adrl lr, artMterpAsmInstructionStart + (172 * 128) @ Addr of primary handler.
10667 mov r0, rSELF
10668 add r1, rFP, #OFF_FP_SHADOWFRAME
10669 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10670
10671/* ------------------------------ */
10672 .balign 128
10673.L_ALT_op_mul_double: /* 0xad */
10674/* File: arm/alt_stub.S */
10675/*
10676 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10677 * any interesting requests and then jump to the real instruction
10678 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10679 */
10680 .extern MterpCheckBefore
10681 EXPORT_PC
10682 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10683 adrl lr, artMterpAsmInstructionStart + (173 * 128) @ Addr of primary handler.
10684 mov r0, rSELF
10685 add r1, rFP, #OFF_FP_SHADOWFRAME
10686 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10687
10688/* ------------------------------ */
10689 .balign 128
10690.L_ALT_op_div_double: /* 0xae */
10691/* File: arm/alt_stub.S */
10692/*
10693 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10694 * any interesting requests and then jump to the real instruction
10695 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10696 */
10697 .extern MterpCheckBefore
10698 EXPORT_PC
10699 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10700 adrl lr, artMterpAsmInstructionStart + (174 * 128) @ Addr of primary handler.
10701 mov r0, rSELF
10702 add r1, rFP, #OFF_FP_SHADOWFRAME
10703 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10704
10705/* ------------------------------ */
10706 .balign 128
10707.L_ALT_op_rem_double: /* 0xaf */
10708/* File: arm/alt_stub.S */
10709/*
10710 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10711 * any interesting requests and then jump to the real instruction
10712 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10713 */
10714 .extern MterpCheckBefore
10715 EXPORT_PC
10716 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10717 adrl lr, artMterpAsmInstructionStart + (175 * 128) @ Addr of primary handler.
10718 mov r0, rSELF
10719 add r1, rFP, #OFF_FP_SHADOWFRAME
10720 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10721
10722/* ------------------------------ */
10723 .balign 128
10724.L_ALT_op_add_int_2addr: /* 0xb0 */
10725/* File: arm/alt_stub.S */
10726/*
10727 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10728 * any interesting requests and then jump to the real instruction
10729 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10730 */
10731 .extern MterpCheckBefore
10732 EXPORT_PC
10733 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10734 adrl lr, artMterpAsmInstructionStart + (176 * 128) @ Addr of primary handler.
10735 mov r0, rSELF
10736 add r1, rFP, #OFF_FP_SHADOWFRAME
10737 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10738
10739/* ------------------------------ */
10740 .balign 128
10741.L_ALT_op_sub_int_2addr: /* 0xb1 */
10742/* File: arm/alt_stub.S */
10743/*
10744 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10745 * any interesting requests and then jump to the real instruction
10746 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10747 */
10748 .extern MterpCheckBefore
10749 EXPORT_PC
10750 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10751 adrl lr, artMterpAsmInstructionStart + (177 * 128) @ Addr of primary handler.
10752 mov r0, rSELF
10753 add r1, rFP, #OFF_FP_SHADOWFRAME
10754 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10755
10756/* ------------------------------ */
10757 .balign 128
10758.L_ALT_op_mul_int_2addr: /* 0xb2 */
10759/* File: arm/alt_stub.S */
10760/*
10761 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10762 * any interesting requests and then jump to the real instruction
10763 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10764 */
10765 .extern MterpCheckBefore
10766 EXPORT_PC
10767 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10768 adrl lr, artMterpAsmInstructionStart + (178 * 128) @ Addr of primary handler.
10769 mov r0, rSELF
10770 add r1, rFP, #OFF_FP_SHADOWFRAME
10771 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10772
10773/* ------------------------------ */
10774 .balign 128
10775.L_ALT_op_div_int_2addr: /* 0xb3 */
10776/* File: arm/alt_stub.S */
10777/*
10778 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10779 * any interesting requests and then jump to the real instruction
10780 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10781 */
10782 .extern MterpCheckBefore
10783 EXPORT_PC
10784 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10785 adrl lr, artMterpAsmInstructionStart + (179 * 128) @ Addr of primary handler.
10786 mov r0, rSELF
10787 add r1, rFP, #OFF_FP_SHADOWFRAME
10788 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10789
10790/* ------------------------------ */
10791 .balign 128
10792.L_ALT_op_rem_int_2addr: /* 0xb4 */
10793/* File: arm/alt_stub.S */
10794/*
10795 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10796 * any interesting requests and then jump to the real instruction
10797 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10798 */
10799 .extern MterpCheckBefore
10800 EXPORT_PC
10801 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10802 adrl lr, artMterpAsmInstructionStart + (180 * 128) @ Addr of primary handler.
10803 mov r0, rSELF
10804 add r1, rFP, #OFF_FP_SHADOWFRAME
10805 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10806
10807/* ------------------------------ */
10808 .balign 128
10809.L_ALT_op_and_int_2addr: /* 0xb5 */
10810/* File: arm/alt_stub.S */
10811/*
10812 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10813 * any interesting requests and then jump to the real instruction
10814 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10815 */
10816 .extern MterpCheckBefore
10817 EXPORT_PC
10818 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10819 adrl lr, artMterpAsmInstructionStart + (181 * 128) @ Addr of primary handler.
10820 mov r0, rSELF
10821 add r1, rFP, #OFF_FP_SHADOWFRAME
10822 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10823
10824/* ------------------------------ */
10825 .balign 128
10826.L_ALT_op_or_int_2addr: /* 0xb6 */
10827/* File: arm/alt_stub.S */
10828/*
10829 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10830 * any interesting requests and then jump to the real instruction
10831 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10832 */
10833 .extern MterpCheckBefore
10834 EXPORT_PC
10835 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10836 adrl lr, artMterpAsmInstructionStart + (182 * 128) @ Addr of primary handler.
10837 mov r0, rSELF
10838 add r1, rFP, #OFF_FP_SHADOWFRAME
10839 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10840
10841/* ------------------------------ */
10842 .balign 128
10843.L_ALT_op_xor_int_2addr: /* 0xb7 */
10844/* File: arm/alt_stub.S */
10845/*
10846 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10847 * any interesting requests and then jump to the real instruction
10848 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10849 */
10850 .extern MterpCheckBefore
10851 EXPORT_PC
10852 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10853 adrl lr, artMterpAsmInstructionStart + (183 * 128) @ Addr of primary handler.
10854 mov r0, rSELF
10855 add r1, rFP, #OFF_FP_SHADOWFRAME
10856 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10857
10858/* ------------------------------ */
10859 .balign 128
10860.L_ALT_op_shl_int_2addr: /* 0xb8 */
10861/* File: arm/alt_stub.S */
10862/*
10863 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10864 * any interesting requests and then jump to the real instruction
10865 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10866 */
10867 .extern MterpCheckBefore
10868 EXPORT_PC
10869 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10870 adrl lr, artMterpAsmInstructionStart + (184 * 128) @ Addr of primary handler.
10871 mov r0, rSELF
10872 add r1, rFP, #OFF_FP_SHADOWFRAME
10873 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10874
10875/* ------------------------------ */
10876 .balign 128
10877.L_ALT_op_shr_int_2addr: /* 0xb9 */
10878/* File: arm/alt_stub.S */
10879/*
10880 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10881 * any interesting requests and then jump to the real instruction
10882 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10883 */
10884 .extern MterpCheckBefore
10885 EXPORT_PC
10886 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10887 adrl lr, artMterpAsmInstructionStart + (185 * 128) @ Addr of primary handler.
10888 mov r0, rSELF
10889 add r1, rFP, #OFF_FP_SHADOWFRAME
10890 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10891
10892/* ------------------------------ */
10893 .balign 128
10894.L_ALT_op_ushr_int_2addr: /* 0xba */
10895/* File: arm/alt_stub.S */
10896/*
10897 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10898 * any interesting requests and then jump to the real instruction
10899 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10900 */
10901 .extern MterpCheckBefore
10902 EXPORT_PC
10903 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10904 adrl lr, artMterpAsmInstructionStart + (186 * 128) @ Addr of primary handler.
10905 mov r0, rSELF
10906 add r1, rFP, #OFF_FP_SHADOWFRAME
10907 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10908
10909/* ------------------------------ */
10910 .balign 128
10911.L_ALT_op_add_long_2addr: /* 0xbb */
10912/* File: arm/alt_stub.S */
10913/*
10914 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10915 * any interesting requests and then jump to the real instruction
10916 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10917 */
10918 .extern MterpCheckBefore
10919 EXPORT_PC
10920 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10921 adrl lr, artMterpAsmInstructionStart + (187 * 128) @ Addr of primary handler.
10922 mov r0, rSELF
10923 add r1, rFP, #OFF_FP_SHADOWFRAME
10924 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10925
10926/* ------------------------------ */
10927 .balign 128
10928.L_ALT_op_sub_long_2addr: /* 0xbc */
10929/* File: arm/alt_stub.S */
10930/*
10931 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10932 * any interesting requests and then jump to the real instruction
10933 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10934 */
10935 .extern MterpCheckBefore
10936 EXPORT_PC
10937 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10938 adrl lr, artMterpAsmInstructionStart + (188 * 128) @ Addr of primary handler.
10939 mov r0, rSELF
10940 add r1, rFP, #OFF_FP_SHADOWFRAME
10941 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10942
10943/* ------------------------------ */
10944 .balign 128
10945.L_ALT_op_mul_long_2addr: /* 0xbd */
10946/* File: arm/alt_stub.S */
10947/*
10948 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10949 * any interesting requests and then jump to the real instruction
10950 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10951 */
10952 .extern MterpCheckBefore
10953 EXPORT_PC
10954 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10955 adrl lr, artMterpAsmInstructionStart + (189 * 128) @ Addr of primary handler.
10956 mov r0, rSELF
10957 add r1, rFP, #OFF_FP_SHADOWFRAME
10958 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10959
10960/* ------------------------------ */
10961 .balign 128
10962.L_ALT_op_div_long_2addr: /* 0xbe */
10963/* File: arm/alt_stub.S */
10964/*
10965 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10966 * any interesting requests and then jump to the real instruction
10967 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10968 */
10969 .extern MterpCheckBefore
10970 EXPORT_PC
10971 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10972 adrl lr, artMterpAsmInstructionStart + (190 * 128) @ Addr of primary handler.
10973 mov r0, rSELF
10974 add r1, rFP, #OFF_FP_SHADOWFRAME
10975 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10976
10977/* ------------------------------ */
10978 .balign 128
10979.L_ALT_op_rem_long_2addr: /* 0xbf */
10980/* File: arm/alt_stub.S */
10981/*
10982 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10983 * any interesting requests and then jump to the real instruction
10984 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10985 */
10986 .extern MterpCheckBefore
10987 EXPORT_PC
10988 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10989 adrl lr, artMterpAsmInstructionStart + (191 * 128) @ Addr of primary handler.
10990 mov r0, rSELF
10991 add r1, rFP, #OFF_FP_SHADOWFRAME
10992 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10993
10994/* ------------------------------ */
10995 .balign 128
10996.L_ALT_op_and_long_2addr: /* 0xc0 */
10997/* File: arm/alt_stub.S */
10998/*
10999 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11000 * any interesting requests and then jump to the real instruction
11001 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11002 */
11003 .extern MterpCheckBefore
11004 EXPORT_PC
11005 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11006 adrl lr, artMterpAsmInstructionStart + (192 * 128) @ Addr of primary handler.
11007 mov r0, rSELF
11008 add r1, rFP, #OFF_FP_SHADOWFRAME
11009 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11010
11011/* ------------------------------ */
11012 .balign 128
11013.L_ALT_op_or_long_2addr: /* 0xc1 */
11014/* File: arm/alt_stub.S */
11015/*
11016 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11017 * any interesting requests and then jump to the real instruction
11018 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11019 */
11020 .extern MterpCheckBefore
11021 EXPORT_PC
11022 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11023 adrl lr, artMterpAsmInstructionStart + (193 * 128) @ Addr of primary handler.
11024 mov r0, rSELF
11025 add r1, rFP, #OFF_FP_SHADOWFRAME
11026 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11027
11028/* ------------------------------ */
11029 .balign 128
11030.L_ALT_op_xor_long_2addr: /* 0xc2 */
11031/* File: arm/alt_stub.S */
11032/*
11033 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11034 * any interesting requests and then jump to the real instruction
11035 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11036 */
11037 .extern MterpCheckBefore
11038 EXPORT_PC
11039 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11040 adrl lr, artMterpAsmInstructionStart + (194 * 128) @ Addr of primary handler.
11041 mov r0, rSELF
11042 add r1, rFP, #OFF_FP_SHADOWFRAME
11043 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11044
11045/* ------------------------------ */
11046 .balign 128
11047.L_ALT_op_shl_long_2addr: /* 0xc3 */
11048/* File: arm/alt_stub.S */
11049/*
11050 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11051 * any interesting requests and then jump to the real instruction
11052 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11053 */
11054 .extern MterpCheckBefore
11055 EXPORT_PC
11056 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11057 adrl lr, artMterpAsmInstructionStart + (195 * 128) @ Addr of primary handler.
11058 mov r0, rSELF
11059 add r1, rFP, #OFF_FP_SHADOWFRAME
11060 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11061
11062/* ------------------------------ */
11063 .balign 128
11064.L_ALT_op_shr_long_2addr: /* 0xc4 */
11065/* File: arm/alt_stub.S */
11066/*
11067 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11068 * any interesting requests and then jump to the real instruction
11069 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11070 */
11071 .extern MterpCheckBefore
11072 EXPORT_PC
11073 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11074 adrl lr, artMterpAsmInstructionStart + (196 * 128) @ Addr of primary handler.
11075 mov r0, rSELF
11076 add r1, rFP, #OFF_FP_SHADOWFRAME
11077 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11078
11079/* ------------------------------ */
11080 .balign 128
11081.L_ALT_op_ushr_long_2addr: /* 0xc5 */
11082/* File: arm/alt_stub.S */
11083/*
11084 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11085 * any interesting requests and then jump to the real instruction
11086 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11087 */
11088 .extern MterpCheckBefore
11089 EXPORT_PC
11090 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11091 adrl lr, artMterpAsmInstructionStart + (197 * 128) @ Addr of primary handler.
11092 mov r0, rSELF
11093 add r1, rFP, #OFF_FP_SHADOWFRAME
11094 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11095
11096/* ------------------------------ */
11097 .balign 128
11098.L_ALT_op_add_float_2addr: /* 0xc6 */
11099/* File: arm/alt_stub.S */
11100/*
11101 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11102 * any interesting requests and then jump to the real instruction
11103 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11104 */
11105 .extern MterpCheckBefore
11106 EXPORT_PC
11107 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11108 adrl lr, artMterpAsmInstructionStart + (198 * 128) @ Addr of primary handler.
11109 mov r0, rSELF
11110 add r1, rFP, #OFF_FP_SHADOWFRAME
11111 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11112
11113/* ------------------------------ */
11114 .balign 128
11115.L_ALT_op_sub_float_2addr: /* 0xc7 */
11116/* File: arm/alt_stub.S */
11117/*
11118 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11119 * any interesting requests and then jump to the real instruction
11120 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11121 */
11122 .extern MterpCheckBefore
11123 EXPORT_PC
11124 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11125 adrl lr, artMterpAsmInstructionStart + (199 * 128) @ Addr of primary handler.
11126 mov r0, rSELF
11127 add r1, rFP, #OFF_FP_SHADOWFRAME
11128 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11129
11130/* ------------------------------ */
11131 .balign 128
11132.L_ALT_op_mul_float_2addr: /* 0xc8 */
11133/* File: arm/alt_stub.S */
11134/*
11135 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11136 * any interesting requests and then jump to the real instruction
11137 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11138 */
11139 .extern MterpCheckBefore
11140 EXPORT_PC
11141 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11142 adrl lr, artMterpAsmInstructionStart + (200 * 128) @ Addr of primary handler.
11143 mov r0, rSELF
11144 add r1, rFP, #OFF_FP_SHADOWFRAME
11145 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11146
11147/* ------------------------------ */
11148 .balign 128
11149.L_ALT_op_div_float_2addr: /* 0xc9 */
11150/* File: arm/alt_stub.S */
11151/*
11152 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11153 * any interesting requests and then jump to the real instruction
11154 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11155 */
11156 .extern MterpCheckBefore
11157 EXPORT_PC
11158 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11159 adrl lr, artMterpAsmInstructionStart + (201 * 128) @ Addr of primary handler.
11160 mov r0, rSELF
11161 add r1, rFP, #OFF_FP_SHADOWFRAME
11162 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11163
11164/* ------------------------------ */
11165 .balign 128
11166.L_ALT_op_rem_float_2addr: /* 0xca */
11167/* File: arm/alt_stub.S */
11168/*
11169 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11170 * any interesting requests and then jump to the real instruction
11171 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11172 */
11173 .extern MterpCheckBefore
11174 EXPORT_PC
11175 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11176 adrl lr, artMterpAsmInstructionStart + (202 * 128) @ Addr of primary handler.
11177 mov r0, rSELF
11178 add r1, rFP, #OFF_FP_SHADOWFRAME
11179 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11180
11181/* ------------------------------ */
11182 .balign 128
11183.L_ALT_op_add_double_2addr: /* 0xcb */
11184/* File: arm/alt_stub.S */
11185/*
11186 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11187 * any interesting requests and then jump to the real instruction
11188 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11189 */
11190 .extern MterpCheckBefore
11191 EXPORT_PC
11192 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11193 adrl lr, artMterpAsmInstructionStart + (203 * 128) @ Addr of primary handler.
11194 mov r0, rSELF
11195 add r1, rFP, #OFF_FP_SHADOWFRAME
11196 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11197
11198/* ------------------------------ */
11199 .balign 128
11200.L_ALT_op_sub_double_2addr: /* 0xcc */
11201/* File: arm/alt_stub.S */
11202/*
11203 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11204 * any interesting requests and then jump to the real instruction
11205 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11206 */
11207 .extern MterpCheckBefore
11208 EXPORT_PC
11209 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11210 adrl lr, artMterpAsmInstructionStart + (204 * 128) @ Addr of primary handler.
11211 mov r0, rSELF
11212 add r1, rFP, #OFF_FP_SHADOWFRAME
11213 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11214
11215/* ------------------------------ */
11216 .balign 128
11217.L_ALT_op_mul_double_2addr: /* 0xcd */
11218/* File: arm/alt_stub.S */
11219/*
11220 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11221 * any interesting requests and then jump to the real instruction
11222 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11223 */
11224 .extern MterpCheckBefore
11225 EXPORT_PC
11226 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11227 adrl lr, artMterpAsmInstructionStart + (205 * 128) @ Addr of primary handler.
11228 mov r0, rSELF
11229 add r1, rFP, #OFF_FP_SHADOWFRAME
11230 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11231
11232/* ------------------------------ */
11233 .balign 128
11234.L_ALT_op_div_double_2addr: /* 0xce */
11235/* File: arm/alt_stub.S */
11236/*
11237 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11238 * any interesting requests and then jump to the real instruction
11239 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11240 */
11241 .extern MterpCheckBefore
11242 EXPORT_PC
11243 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11244 adrl lr, artMterpAsmInstructionStart + (206 * 128) @ Addr of primary handler.
11245 mov r0, rSELF
11246 add r1, rFP, #OFF_FP_SHADOWFRAME
11247 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11248
11249/* ------------------------------ */
11250 .balign 128
11251.L_ALT_op_rem_double_2addr: /* 0xcf */
11252/* File: arm/alt_stub.S */
11253/*
11254 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11255 * any interesting requests and then jump to the real instruction
11256 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11257 */
11258 .extern MterpCheckBefore
11259 EXPORT_PC
11260 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11261 adrl lr, artMterpAsmInstructionStart + (207 * 128) @ Addr of primary handler.
11262 mov r0, rSELF
11263 add r1, rFP, #OFF_FP_SHADOWFRAME
11264 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11265
11266/* ------------------------------ */
11267 .balign 128
11268.L_ALT_op_add_int_lit16: /* 0xd0 */
11269/* File: arm/alt_stub.S */
11270/*
11271 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11272 * any interesting requests and then jump to the real instruction
11273 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11274 */
11275 .extern MterpCheckBefore
11276 EXPORT_PC
11277 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11278 adrl lr, artMterpAsmInstructionStart + (208 * 128) @ Addr of primary handler.
11279 mov r0, rSELF
11280 add r1, rFP, #OFF_FP_SHADOWFRAME
11281 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11282
11283/* ------------------------------ */
11284 .balign 128
11285.L_ALT_op_rsub_int: /* 0xd1 */
11286/* File: arm/alt_stub.S */
11287/*
11288 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11289 * any interesting requests and then jump to the real instruction
11290 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11291 */
11292 .extern MterpCheckBefore
11293 EXPORT_PC
11294 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11295 adrl lr, artMterpAsmInstructionStart + (209 * 128) @ Addr of primary handler.
11296 mov r0, rSELF
11297 add r1, rFP, #OFF_FP_SHADOWFRAME
11298 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11299
11300/* ------------------------------ */
11301 .balign 128
11302.L_ALT_op_mul_int_lit16: /* 0xd2 */
11303/* File: arm/alt_stub.S */
11304/*
11305 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11306 * any interesting requests and then jump to the real instruction
11307 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11308 */
11309 .extern MterpCheckBefore
11310 EXPORT_PC
11311 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11312 adrl lr, artMterpAsmInstructionStart + (210 * 128) @ Addr of primary handler.
11313 mov r0, rSELF
11314 add r1, rFP, #OFF_FP_SHADOWFRAME
11315 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11316
11317/* ------------------------------ */
11318 .balign 128
11319.L_ALT_op_div_int_lit16: /* 0xd3 */
11320/* File: arm/alt_stub.S */
11321/*
11322 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11323 * any interesting requests and then jump to the real instruction
11324 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11325 */
11326 .extern MterpCheckBefore
11327 EXPORT_PC
11328 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11329 adrl lr, artMterpAsmInstructionStart + (211 * 128) @ Addr of primary handler.
11330 mov r0, rSELF
11331 add r1, rFP, #OFF_FP_SHADOWFRAME
11332 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11333
11334/* ------------------------------ */
11335 .balign 128
11336.L_ALT_op_rem_int_lit16: /* 0xd4 */
11337/* File: arm/alt_stub.S */
11338/*
11339 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11340 * any interesting requests and then jump to the real instruction
11341 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11342 */
11343 .extern MterpCheckBefore
11344 EXPORT_PC
11345 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11346 adrl lr, artMterpAsmInstructionStart + (212 * 128) @ Addr of primary handler.
11347 mov r0, rSELF
11348 add r1, rFP, #OFF_FP_SHADOWFRAME
11349 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11350
11351/* ------------------------------ */
11352 .balign 128
11353.L_ALT_op_and_int_lit16: /* 0xd5 */
11354/* File: arm/alt_stub.S */
11355/*
11356 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11357 * any interesting requests and then jump to the real instruction
11358 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11359 */
11360 .extern MterpCheckBefore
11361 EXPORT_PC
11362 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11363 adrl lr, artMterpAsmInstructionStart + (213 * 128) @ Addr of primary handler.
11364 mov r0, rSELF
11365 add r1, rFP, #OFF_FP_SHADOWFRAME
11366 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11367
11368/* ------------------------------ */
11369 .balign 128
11370.L_ALT_op_or_int_lit16: /* 0xd6 */
11371/* File: arm/alt_stub.S */
11372/*
11373 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11374 * any interesting requests and then jump to the real instruction
11375 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11376 */
11377 .extern MterpCheckBefore
11378 EXPORT_PC
11379 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11380 adrl lr, artMterpAsmInstructionStart + (214 * 128) @ Addr of primary handler.
11381 mov r0, rSELF
11382 add r1, rFP, #OFF_FP_SHADOWFRAME
11383 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11384
11385/* ------------------------------ */
11386 .balign 128
11387.L_ALT_op_xor_int_lit16: /* 0xd7 */
11388/* File: arm/alt_stub.S */
11389/*
11390 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11391 * any interesting requests and then jump to the real instruction
11392 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11393 */
11394 .extern MterpCheckBefore
11395 EXPORT_PC
11396 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11397 adrl lr, artMterpAsmInstructionStart + (215 * 128) @ Addr of primary handler.
11398 mov r0, rSELF
11399 add r1, rFP, #OFF_FP_SHADOWFRAME
11400 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11401
11402/* ------------------------------ */
11403 .balign 128
11404.L_ALT_op_add_int_lit8: /* 0xd8 */
11405/* File: arm/alt_stub.S */
11406/*
11407 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11408 * any interesting requests and then jump to the real instruction
11409 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11410 */
11411 .extern MterpCheckBefore
11412 EXPORT_PC
11413 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11414 adrl lr, artMterpAsmInstructionStart + (216 * 128) @ Addr of primary handler.
11415 mov r0, rSELF
11416 add r1, rFP, #OFF_FP_SHADOWFRAME
11417 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11418
11419/* ------------------------------ */
11420 .balign 128
11421.L_ALT_op_rsub_int_lit8: /* 0xd9 */
11422/* File: arm/alt_stub.S */
11423/*
11424 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11425 * any interesting requests and then jump to the real instruction
11426 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11427 */
11428 .extern MterpCheckBefore
11429 EXPORT_PC
11430 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11431 adrl lr, artMterpAsmInstructionStart + (217 * 128) @ Addr of primary handler.
11432 mov r0, rSELF
11433 add r1, rFP, #OFF_FP_SHADOWFRAME
11434 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11435
11436/* ------------------------------ */
11437 .balign 128
11438.L_ALT_op_mul_int_lit8: /* 0xda */
11439/* File: arm/alt_stub.S */
11440/*
11441 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11442 * any interesting requests and then jump to the real instruction
11443 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11444 */
11445 .extern MterpCheckBefore
11446 EXPORT_PC
11447 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11448 adrl lr, artMterpAsmInstructionStart + (218 * 128) @ Addr of primary handler.
11449 mov r0, rSELF
11450 add r1, rFP, #OFF_FP_SHADOWFRAME
11451 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11452
11453/* ------------------------------ */
11454 .balign 128
11455.L_ALT_op_div_int_lit8: /* 0xdb */
11456/* File: arm/alt_stub.S */
11457/*
11458 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11459 * any interesting requests and then jump to the real instruction
11460 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11461 */
11462 .extern MterpCheckBefore
11463 EXPORT_PC
11464 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11465 adrl lr, artMterpAsmInstructionStart + (219 * 128) @ Addr of primary handler.
11466 mov r0, rSELF
11467 add r1, rFP, #OFF_FP_SHADOWFRAME
11468 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11469
11470/* ------------------------------ */
11471 .balign 128
11472.L_ALT_op_rem_int_lit8: /* 0xdc */
11473/* File: arm/alt_stub.S */
11474/*
11475 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11476 * any interesting requests and then jump to the real instruction
11477 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11478 */
11479 .extern MterpCheckBefore
11480 EXPORT_PC
11481 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11482 adrl lr, artMterpAsmInstructionStart + (220 * 128) @ Addr of primary handler.
11483 mov r0, rSELF
11484 add r1, rFP, #OFF_FP_SHADOWFRAME
11485 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11486
11487/* ------------------------------ */
11488 .balign 128
11489.L_ALT_op_and_int_lit8: /* 0xdd */
11490/* File: arm/alt_stub.S */
11491/*
11492 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11493 * any interesting requests and then jump to the real instruction
11494 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11495 */
11496 .extern MterpCheckBefore
11497 EXPORT_PC
11498 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11499 adrl lr, artMterpAsmInstructionStart + (221 * 128) @ Addr of primary handler.
11500 mov r0, rSELF
11501 add r1, rFP, #OFF_FP_SHADOWFRAME
11502 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11503
11504/* ------------------------------ */
11505 .balign 128
11506.L_ALT_op_or_int_lit8: /* 0xde */
11507/* File: arm/alt_stub.S */
11508/*
11509 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11510 * any interesting requests and then jump to the real instruction
11511 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11512 */
11513 .extern MterpCheckBefore
11514 EXPORT_PC
11515 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11516 adrl lr, artMterpAsmInstructionStart + (222 * 128) @ Addr of primary handler.
11517 mov r0, rSELF
11518 add r1, rFP, #OFF_FP_SHADOWFRAME
11519 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11520
11521/* ------------------------------ */
11522 .balign 128
11523.L_ALT_op_xor_int_lit8: /* 0xdf */
11524/* File: arm/alt_stub.S */
11525/*
11526 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11527 * any interesting requests and then jump to the real instruction
11528 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11529 */
11530 .extern MterpCheckBefore
11531 EXPORT_PC
11532 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11533 adrl lr, artMterpAsmInstructionStart + (223 * 128) @ Addr of primary handler.
11534 mov r0, rSELF
11535 add r1, rFP, #OFF_FP_SHADOWFRAME
11536 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11537
11538/* ------------------------------ */
11539 .balign 128
11540.L_ALT_op_shl_int_lit8: /* 0xe0 */
11541/* File: arm/alt_stub.S */
11542/*
11543 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11544 * any interesting requests and then jump to the real instruction
11545 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11546 */
11547 .extern MterpCheckBefore
11548 EXPORT_PC
11549 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11550 adrl lr, artMterpAsmInstructionStart + (224 * 128) @ Addr of primary handler.
11551 mov r0, rSELF
11552 add r1, rFP, #OFF_FP_SHADOWFRAME
11553 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11554
11555/* ------------------------------ */
11556 .balign 128
11557.L_ALT_op_shr_int_lit8: /* 0xe1 */
11558/* File: arm/alt_stub.S */
11559/*
11560 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11561 * any interesting requests and then jump to the real instruction
11562 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11563 */
11564 .extern MterpCheckBefore
11565 EXPORT_PC
11566 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11567 adrl lr, artMterpAsmInstructionStart + (225 * 128) @ Addr of primary handler.
11568 mov r0, rSELF
11569 add r1, rFP, #OFF_FP_SHADOWFRAME
11570 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11571
11572/* ------------------------------ */
11573 .balign 128
11574.L_ALT_op_ushr_int_lit8: /* 0xe2 */
11575/* File: arm/alt_stub.S */
11576/*
11577 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11578 * any interesting requests and then jump to the real instruction
11579 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11580 */
11581 .extern MterpCheckBefore
11582 EXPORT_PC
11583 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11584 adrl lr, artMterpAsmInstructionStart + (226 * 128) @ Addr of primary handler.
11585 mov r0, rSELF
11586 add r1, rFP, #OFF_FP_SHADOWFRAME
11587 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11588
11589/* ------------------------------ */
11590 .balign 128
11591.L_ALT_op_iget_quick: /* 0xe3 */
11592/* File: arm/alt_stub.S */
11593/*
11594 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11595 * any interesting requests and then jump to the real instruction
11596 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11597 */
11598 .extern MterpCheckBefore
11599 EXPORT_PC
11600 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11601 adrl lr, artMterpAsmInstructionStart + (227 * 128) @ Addr of primary handler.
11602 mov r0, rSELF
11603 add r1, rFP, #OFF_FP_SHADOWFRAME
11604 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11605
11606/* ------------------------------ */
11607 .balign 128
11608.L_ALT_op_iget_wide_quick: /* 0xe4 */
11609/* File: arm/alt_stub.S */
11610/*
11611 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11612 * any interesting requests and then jump to the real instruction
11613 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11614 */
11615 .extern MterpCheckBefore
11616 EXPORT_PC
11617 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11618 adrl lr, artMterpAsmInstructionStart + (228 * 128) @ Addr of primary handler.
11619 mov r0, rSELF
11620 add r1, rFP, #OFF_FP_SHADOWFRAME
11621 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11622
11623/* ------------------------------ */
11624 .balign 128
11625.L_ALT_op_iget_object_quick: /* 0xe5 */
11626/* File: arm/alt_stub.S */
11627/*
11628 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11629 * any interesting requests and then jump to the real instruction
11630 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11631 */
11632 .extern MterpCheckBefore
11633 EXPORT_PC
11634 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11635 adrl lr, artMterpAsmInstructionStart + (229 * 128) @ Addr of primary handler.
11636 mov r0, rSELF
11637 add r1, rFP, #OFF_FP_SHADOWFRAME
11638 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11639
11640/* ------------------------------ */
11641 .balign 128
11642.L_ALT_op_iput_quick: /* 0xe6 */
11643/* File: arm/alt_stub.S */
11644/*
11645 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11646 * any interesting requests and then jump to the real instruction
11647 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11648 */
11649 .extern MterpCheckBefore
11650 EXPORT_PC
11651 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11652 adrl lr, artMterpAsmInstructionStart + (230 * 128) @ Addr of primary handler.
11653 mov r0, rSELF
11654 add r1, rFP, #OFF_FP_SHADOWFRAME
11655 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11656
11657/* ------------------------------ */
11658 .balign 128
11659.L_ALT_op_iput_wide_quick: /* 0xe7 */
11660/* File: arm/alt_stub.S */
11661/*
11662 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11663 * any interesting requests and then jump to the real instruction
11664 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11665 */
11666 .extern MterpCheckBefore
11667 EXPORT_PC
11668 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11669 adrl lr, artMterpAsmInstructionStart + (231 * 128) @ Addr of primary handler.
11670 mov r0, rSELF
11671 add r1, rFP, #OFF_FP_SHADOWFRAME
11672 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11673
11674/* ------------------------------ */
11675 .balign 128
11676.L_ALT_op_iput_object_quick: /* 0xe8 */
11677/* File: arm/alt_stub.S */
11678/*
11679 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11680 * any interesting requests and then jump to the real instruction
11681 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11682 */
11683 .extern MterpCheckBefore
11684 EXPORT_PC
11685 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11686 adrl lr, artMterpAsmInstructionStart + (232 * 128) @ Addr of primary handler.
11687 mov r0, rSELF
11688 add r1, rFP, #OFF_FP_SHADOWFRAME
11689 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11690
11691/* ------------------------------ */
11692 .balign 128
11693.L_ALT_op_invoke_virtual_quick: /* 0xe9 */
11694/* File: arm/alt_stub.S */
11695/*
11696 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11697 * any interesting requests and then jump to the real instruction
11698 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11699 */
11700 .extern MterpCheckBefore
11701 EXPORT_PC
11702 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11703 adrl lr, artMterpAsmInstructionStart + (233 * 128) @ Addr of primary handler.
11704 mov r0, rSELF
11705 add r1, rFP, #OFF_FP_SHADOWFRAME
11706 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11707
11708/* ------------------------------ */
11709 .balign 128
11710.L_ALT_op_invoke_virtual_range_quick: /* 0xea */
11711/* File: arm/alt_stub.S */
11712/*
11713 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11714 * any interesting requests and then jump to the real instruction
11715 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11716 */
11717 .extern MterpCheckBefore
11718 EXPORT_PC
11719 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11720 adrl lr, artMterpAsmInstructionStart + (234 * 128) @ Addr of primary handler.
11721 mov r0, rSELF
11722 add r1, rFP, #OFF_FP_SHADOWFRAME
11723 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11724
11725/* ------------------------------ */
11726 .balign 128
11727.L_ALT_op_iput_boolean_quick: /* 0xeb */
11728/* File: arm/alt_stub.S */
11729/*
11730 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11731 * any interesting requests and then jump to the real instruction
11732 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11733 */
11734 .extern MterpCheckBefore
11735 EXPORT_PC
11736 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11737 adrl lr, artMterpAsmInstructionStart + (235 * 128) @ Addr of primary handler.
11738 mov r0, rSELF
11739 add r1, rFP, #OFF_FP_SHADOWFRAME
11740 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11741
11742/* ------------------------------ */
11743 .balign 128
11744.L_ALT_op_iput_byte_quick: /* 0xec */
11745/* File: arm/alt_stub.S */
11746/*
11747 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11748 * any interesting requests and then jump to the real instruction
11749 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11750 */
11751 .extern MterpCheckBefore
11752 EXPORT_PC
11753 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11754 adrl lr, artMterpAsmInstructionStart + (236 * 128) @ Addr of primary handler.
11755 mov r0, rSELF
11756 add r1, rFP, #OFF_FP_SHADOWFRAME
11757 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11758
11759/* ------------------------------ */
11760 .balign 128
11761.L_ALT_op_iput_char_quick: /* 0xed */
11762/* File: arm/alt_stub.S */
11763/*
11764 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11765 * any interesting requests and then jump to the real instruction
11766 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11767 */
11768 .extern MterpCheckBefore
11769 EXPORT_PC
11770 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11771 adrl lr, artMterpAsmInstructionStart + (237 * 128) @ Addr of primary handler.
11772 mov r0, rSELF
11773 add r1, rFP, #OFF_FP_SHADOWFRAME
11774 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11775
11776/* ------------------------------ */
11777 .balign 128
11778.L_ALT_op_iput_short_quick: /* 0xee */
11779/* File: arm/alt_stub.S */
11780/*
11781 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11782 * any interesting requests and then jump to the real instruction
11783 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11784 */
11785 .extern MterpCheckBefore
11786 EXPORT_PC
11787 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11788 adrl lr, artMterpAsmInstructionStart + (238 * 128) @ Addr of primary handler.
11789 mov r0, rSELF
11790 add r1, rFP, #OFF_FP_SHADOWFRAME
11791 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11792
11793/* ------------------------------ */
11794 .balign 128
11795.L_ALT_op_iget_boolean_quick: /* 0xef */
11796/* File: arm/alt_stub.S */
11797/*
11798 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11799 * any interesting requests and then jump to the real instruction
11800 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11801 */
11802 .extern MterpCheckBefore
11803 EXPORT_PC
11804 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11805 adrl lr, artMterpAsmInstructionStart + (239 * 128) @ Addr of primary handler.
11806 mov r0, rSELF
11807 add r1, rFP, #OFF_FP_SHADOWFRAME
11808 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11809
11810/* ------------------------------ */
11811 .balign 128
11812.L_ALT_op_iget_byte_quick: /* 0xf0 */
11813/* File: arm/alt_stub.S */
11814/*
11815 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11816 * any interesting requests and then jump to the real instruction
11817 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11818 */
11819 .extern MterpCheckBefore
11820 EXPORT_PC
11821 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11822 adrl lr, artMterpAsmInstructionStart + (240 * 128) @ Addr of primary handler.
11823 mov r0, rSELF
11824 add r1, rFP, #OFF_FP_SHADOWFRAME
11825 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11826
11827/* ------------------------------ */
11828 .balign 128
11829.L_ALT_op_iget_char_quick: /* 0xf1 */
11830/* File: arm/alt_stub.S */
11831/*
11832 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11833 * any interesting requests and then jump to the real instruction
11834 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11835 */
11836 .extern MterpCheckBefore
11837 EXPORT_PC
11838 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11839 adrl lr, artMterpAsmInstructionStart + (241 * 128) @ Addr of primary handler.
11840 mov r0, rSELF
11841 add r1, rFP, #OFF_FP_SHADOWFRAME
11842 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11843
11844/* ------------------------------ */
11845 .balign 128
11846.L_ALT_op_iget_short_quick: /* 0xf2 */
11847/* File: arm/alt_stub.S */
11848/*
11849 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11850 * any interesting requests and then jump to the real instruction
11851 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11852 */
11853 .extern MterpCheckBefore
11854 EXPORT_PC
11855 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11856 adrl lr, artMterpAsmInstructionStart + (242 * 128) @ Addr of primary handler.
11857 mov r0, rSELF
11858 add r1, rFP, #OFF_FP_SHADOWFRAME
11859 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11860
11861/* ------------------------------ */
11862 .balign 128
11863.L_ALT_op_invoke_lambda: /* 0xf3 */
11864/* File: arm/alt_stub.S */
11865/*
11866 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11867 * any interesting requests and then jump to the real instruction
11868 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11869 */
11870 .extern MterpCheckBefore
11871 EXPORT_PC
11872 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11873 adrl lr, artMterpAsmInstructionStart + (243 * 128) @ Addr of primary handler.
11874 mov r0, rSELF
11875 add r1, rFP, #OFF_FP_SHADOWFRAME
11876 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11877
11878/* ------------------------------ */
11879 .balign 128
11880.L_ALT_op_unused_f4: /* 0xf4 */
11881/* File: arm/alt_stub.S */
11882/*
11883 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11884 * any interesting requests and then jump to the real instruction
11885 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11886 */
11887 .extern MterpCheckBefore
11888 EXPORT_PC
11889 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11890 adrl lr, artMterpAsmInstructionStart + (244 * 128) @ Addr of primary handler.
11891 mov r0, rSELF
11892 add r1, rFP, #OFF_FP_SHADOWFRAME
11893 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11894
11895/* ------------------------------ */
11896 .balign 128
11897.L_ALT_op_capture_variable: /* 0xf5 */
11898/* File: arm/alt_stub.S */
11899/*
11900 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11901 * any interesting requests and then jump to the real instruction
11902 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11903 */
11904 .extern MterpCheckBefore
11905 EXPORT_PC
11906 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11907 adrl lr, artMterpAsmInstructionStart + (245 * 128) @ Addr of primary handler.
11908 mov r0, rSELF
11909 add r1, rFP, #OFF_FP_SHADOWFRAME
11910 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11911
11912/* ------------------------------ */
11913 .balign 128
11914.L_ALT_op_create_lambda: /* 0xf6 */
11915/* File: arm/alt_stub.S */
11916/*
11917 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11918 * any interesting requests and then jump to the real instruction
11919 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11920 */
11921 .extern MterpCheckBefore
11922 EXPORT_PC
11923 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11924 adrl lr, artMterpAsmInstructionStart + (246 * 128) @ Addr of primary handler.
11925 mov r0, rSELF
11926 add r1, rFP, #OFF_FP_SHADOWFRAME
11927 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11928
11929/* ------------------------------ */
11930 .balign 128
11931.L_ALT_op_liberate_variable: /* 0xf7 */
11932/* File: arm/alt_stub.S */
11933/*
11934 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11935 * any interesting requests and then jump to the real instruction
11936 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11937 */
11938 .extern MterpCheckBefore
11939 EXPORT_PC
11940 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11941 adrl lr, artMterpAsmInstructionStart + (247 * 128) @ Addr of primary handler.
11942 mov r0, rSELF
11943 add r1, rFP, #OFF_FP_SHADOWFRAME
11944 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11945
11946/* ------------------------------ */
11947 .balign 128
11948.L_ALT_op_box_lambda: /* 0xf8 */
11949/* File: arm/alt_stub.S */
11950/*
11951 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11952 * any interesting requests and then jump to the real instruction
11953 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11954 */
11955 .extern MterpCheckBefore
11956 EXPORT_PC
11957 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11958 adrl lr, artMterpAsmInstructionStart + (248 * 128) @ Addr of primary handler.
11959 mov r0, rSELF
11960 add r1, rFP, #OFF_FP_SHADOWFRAME
11961 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11962
11963/* ------------------------------ */
11964 .balign 128
11965.L_ALT_op_unbox_lambda: /* 0xf9 */
11966/* File: arm/alt_stub.S */
11967/*
11968 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11969 * any interesting requests and then jump to the real instruction
11970 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11971 */
11972 .extern MterpCheckBefore
11973 EXPORT_PC
11974 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11975 adrl lr, artMterpAsmInstructionStart + (249 * 128) @ Addr of primary handler.
11976 mov r0, rSELF
11977 add r1, rFP, #OFF_FP_SHADOWFRAME
11978 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11979
11980/* ------------------------------ */
11981 .balign 128
11982.L_ALT_op_unused_fa: /* 0xfa */
11983/* File: arm/alt_stub.S */
11984/*
11985 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11986 * any interesting requests and then jump to the real instruction
11987 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11988 */
11989 .extern MterpCheckBefore
11990 EXPORT_PC
11991 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11992 adrl lr, artMterpAsmInstructionStart + (250 * 128) @ Addr of primary handler.
11993 mov r0, rSELF
11994 add r1, rFP, #OFF_FP_SHADOWFRAME
11995 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11996
11997/* ------------------------------ */
11998 .balign 128
11999.L_ALT_op_unused_fb: /* 0xfb */
12000/* File: arm/alt_stub.S */
12001/*
12002 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12003 * any interesting requests and then jump to the real instruction
12004 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12005 */
12006 .extern MterpCheckBefore
12007 EXPORT_PC
12008 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12009 adrl lr, artMterpAsmInstructionStart + (251 * 128) @ Addr of primary handler.
12010 mov r0, rSELF
12011 add r1, rFP, #OFF_FP_SHADOWFRAME
12012 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12013
12014/* ------------------------------ */
12015 .balign 128
12016.L_ALT_op_unused_fc: /* 0xfc */
12017/* File: arm/alt_stub.S */
12018/*
12019 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12020 * any interesting requests and then jump to the real instruction
12021 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12022 */
12023 .extern MterpCheckBefore
12024 EXPORT_PC
12025 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12026 adrl lr, artMterpAsmInstructionStart + (252 * 128) @ Addr of primary handler.
12027 mov r0, rSELF
12028 add r1, rFP, #OFF_FP_SHADOWFRAME
12029 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12030
12031/* ------------------------------ */
12032 .balign 128
12033.L_ALT_op_unused_fd: /* 0xfd */
12034/* File: arm/alt_stub.S */
12035/*
12036 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12037 * any interesting requests and then jump to the real instruction
12038 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12039 */
12040 .extern MterpCheckBefore
12041 EXPORT_PC
12042 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12043 adrl lr, artMterpAsmInstructionStart + (253 * 128) @ Addr of primary handler.
12044 mov r0, rSELF
12045 add r1, rFP, #OFF_FP_SHADOWFRAME
12046 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12047
12048/* ------------------------------ */
12049 .balign 128
12050.L_ALT_op_unused_fe: /* 0xfe */
12051/* File: arm/alt_stub.S */
12052/*
12053 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12054 * any interesting requests and then jump to the real instruction
12055 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12056 */
12057 .extern MterpCheckBefore
12058 EXPORT_PC
12059 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12060 adrl lr, artMterpAsmInstructionStart + (254 * 128) @ Addr of primary handler.
12061 mov r0, rSELF
12062 add r1, rFP, #OFF_FP_SHADOWFRAME
12063 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12064
12065/* ------------------------------ */
12066 .balign 128
12067.L_ALT_op_unused_ff: /* 0xff */
12068/* File: arm/alt_stub.S */
12069/*
12070 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12071 * any interesting requests and then jump to the real instruction
12072 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12073 */
12074 .extern MterpCheckBefore
12075 EXPORT_PC
12076 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12077 adrl lr, artMterpAsmInstructionStart + (255 * 128) @ Addr of primary handler.
12078 mov r0, rSELF
12079 add r1, rFP, #OFF_FP_SHADOWFRAME
12080 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12081
12082 .balign 128
12083 .size artMterpAsmAltInstructionStart, .-artMterpAsmAltInstructionStart
12084 .global artMterpAsmAltInstructionEnd
12085artMterpAsmAltInstructionEnd:
12086/* File: arm/footer.S */
12087/*
12088 * ===========================================================================
12089 * Common subroutines and data
12090 * ===========================================================================
12091 */
12092
12093 .text
12094 .align 2
12095
12096/*
12097 * We've detected a condition that will result in an exception, but the exception
12098 * has not yet been thrown. Just bail out to the reference interpreter to deal with it.
12099 * TUNING: for consistency, we may want to just go ahead and handle these here.
12100 */
12101#define MTERP_LOGGING 0
12102common_errDivideByZero:
12103 EXPORT_PC
12104#if MTERP_LOGGING
12105 mov r0, rSELF
12106 add r1, rFP, #OFF_FP_SHADOWFRAME
12107 bl MterpLogDivideByZeroException
12108#endif
12109 b MterpCommonFallback
12110
12111common_errArrayIndex:
12112 EXPORT_PC
12113#if MTERP_LOGGING
12114 mov r0, rSELF
12115 add r1, rFP, #OFF_FP_SHADOWFRAME
12116 bl MterpLogArrayIndexException
12117#endif
12118 b MterpCommonFallback
12119
12120common_errNegativeArraySize:
12121 EXPORT_PC
12122#if MTERP_LOGGING
12123 mov r0, rSELF
12124 add r1, rFP, #OFF_FP_SHADOWFRAME
12125 bl MterpLogNegativeArraySizeException
12126#endif
12127 b MterpCommonFallback
12128
12129common_errNoSuchMethod:
12130 EXPORT_PC
12131#if MTERP_LOGGING
12132 mov r0, rSELF
12133 add r1, rFP, #OFF_FP_SHADOWFRAME
12134 bl MterpLogNoSuchMethodException
12135#endif
12136 b MterpCommonFallback
12137
12138common_errNullObject:
12139 EXPORT_PC
12140#if MTERP_LOGGING
12141 mov r0, rSELF
12142 add r1, rFP, #OFF_FP_SHADOWFRAME
12143 bl MterpLogNullObjectException
12144#endif
12145 b MterpCommonFallback
12146
12147common_exceptionThrown:
12148 EXPORT_PC
12149#if MTERP_LOGGING
12150 mov r0, rSELF
12151 add r1, rFP, #OFF_FP_SHADOWFRAME
12152 bl MterpLogExceptionThrownException
12153#endif
12154 b MterpCommonFallback
12155
12156MterpSuspendFallback:
12157 EXPORT_PC
12158#if MTERP_LOGGING
12159 mov r0, rSELF
12160 add r1, rFP, #OFF_FP_SHADOWFRAME
12161 ldr r2, [rSELF, #THREAD_FLAGS_OFFSET]
12162 bl MterpLogSuspendFallback
12163#endif
12164 b MterpCommonFallback
12165
12166/*
12167 * If we're here, something is out of the ordinary. If there is a pending
12168 * exception, handle it. Otherwise, roll back and retry with the reference
12169 * interpreter.
12170 */
12171MterpPossibleException:
12172 ldr r0, [rSELF, #THREAD_EXCEPTION_OFFSET]
12173 cmp r0, #0 @ Exception pending?
12174 beq MterpFallback @ If not, fall back to reference interpreter.
12175 /* intentional fallthrough - handle pending exception. */
12176/*
12177 * On return from a runtime helper routine, we've found a pending exception.
12178 * Can we handle it here - or need to bail out to caller?
12179 *
12180 */
12181MterpException:
12182 mov r0, rSELF
12183 add r1, rFP, #OFF_FP_SHADOWFRAME
12184 bl MterpHandleException @ (self, shadow_frame)
12185 cmp r0, #0
12186 beq MterpExceptionReturn @ no local catch, back to caller.
12187 ldr r0, [rFP, #OFF_FP_CODE_ITEM]
12188 ldr r1, [rFP, #OFF_FP_DEX_PC]
12189 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]
12190 add rPC, r0, #CODEITEM_INSNS_OFFSET
12191 add rPC, rPC, r1, lsl #1 @ generate new dex_pc_ptr
12192 str rPC, [rFP, #OFF_FP_DEX_PC_PTR]
12193 /* resume execution at catch block */
12194 FETCH_INST
12195 GET_INST_OPCODE ip
12196 GOTO_OPCODE ip
12197 /* NOTE: no fallthrough */
12198
12199/*
12200 * Check for suspend check request. Assumes rINST already loaded, rPC advanced and
12201 * still needs to get the opcode and branch to it, and flags are in lr.
12202 */
12203MterpCheckSuspendAndContinue:
12204 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh rIBASE
12205 EXPORT_PC
12206 mov r0, rSELF
12207 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
12208 blne MterpSuspendCheck @ (self)
12209 GET_INST_OPCODE ip @ extract opcode from rINST
12210 GOTO_OPCODE ip @ jump to next instruction
12211
12212/*
12213 * Bail out to reference interpreter.
12214 */
12215MterpFallback:
12216 EXPORT_PC
buzbee76833da2016-01-13 13:06:22 -080012217#if MTERP_LOGGING
buzbee1452bee2015-03-06 14:43:04 -080012218 mov r0, rSELF
12219 add r1, rFP, #OFF_FP_SHADOWFRAME
12220 bl MterpLogFallback
buzbee76833da2016-01-13 13:06:22 -080012221#endif
buzbee1452bee2015-03-06 14:43:04 -080012222MterpCommonFallback:
12223 mov r0, #0 @ signal retry with reference interpreter.
12224 b MterpDone
12225
12226/*
12227 * We pushed some registers on the stack in ExecuteMterpImpl, then saved
12228 * SP and LR. Here we restore SP, restore the registers, and then restore
12229 * LR to PC.
12230 *
12231 * On entry:
12232 * uint32_t* rFP (should still be live, pointer to base of vregs)
12233 */
12234MterpExceptionReturn:
buzbee1452bee2015-03-06 14:43:04 -080012235 mov r0, #1 @ signal return to caller.
12236 b MterpDone
12237MterpReturn:
12238 ldr r2, [rFP, #OFF_FP_RESULT_REGISTER]
buzbee1452bee2015-03-06 14:43:04 -080012239 str r0, [r2]
12240 str r1, [r2, #4]
buzbee1452bee2015-03-06 14:43:04 -080012241 mov r0, #1 @ signal return to caller.
12242MterpDone:
12243 add sp, sp, #4 @ un-align 64
12244 ldmfd sp!, {r4-r10,fp,pc} @ restore 9 regs and return
12245
12246
12247 .fnend
12248 .size ExecuteMterpImpl, .-ExecuteMterpImpl
12249
12250