blob: 33036e6cd7526814a08b2be74f2035153d769e3c [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
273
274/*
275 * Convert a virtual register index into an address.
276 */
277.macro VREG_INDEX_TO_ADDR reg, vreg
278 add \reg, rFP, \vreg, lsl #2 /* WARNING/FIXME: handle shadow frame vreg zero if store */
279.endm
280
281/*
282 * Refresh handler table.
283 */
284.macro REFRESH_IBASE
285 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]
286.endm
287
288/* File: arm/entry.S */
289/*
290 * Copyright (C) 2016 The Android Open Source Project
291 *
292 * Licensed under the Apache License, Version 2.0 (the "License");
293 * you may not use this file except in compliance with the License.
294 * You may obtain a copy of the License at
295 *
296 * http://www.apache.org/licenses/LICENSE-2.0
297 *
298 * Unless required by applicable law or agreed to in writing, software
299 * distributed under the License is distributed on an "AS IS" BASIS,
300 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
301 * See the License for the specific language governing permissions and
302 * limitations under the License.
303 */
304/*
305 * Interpreter entry point.
306 */
307
308 .text
309 .align 2
310 .global ExecuteMterpImpl
311 .type ExecuteMterpImpl, %function
312
313/*
314 * On entry:
315 * r0 Thread* self/
316 * r1 code_item
317 * r2 ShadowFrame
318 * r3 JValue* result_register
319 *
320 */
321
322ExecuteMterpImpl:
323 .fnstart
324 .save {r4-r10,fp,lr}
325 stmfd sp!, {r4-r10,fp,lr} @ save 9 regs
326 .pad #4
327 sub sp, sp, #4 @ align 64
328
329 /* Remember the return register */
330 str r3, [r2, #SHADOWFRAME_RESULT_REGISTER_OFFSET]
331
332 /* Remember the code_item */
333 str r1, [r2, #SHADOWFRAME_CODE_ITEM_OFFSET]
334
335 /* set up "named" registers */
336 mov rSELF, r0
337 ldr r0, [r2, #SHADOWFRAME_NUMBER_OF_VREGS_OFFSET]
338 add rFP, r2, #SHADOWFRAME_VREGS_OFFSET @ point to insns[] (i.e. - the dalivk byte code).
339 add rREFS, rFP, r0, lsl #2 @ point to reference array in shadow frame
340 ldr r0, [r2, #SHADOWFRAME_DEX_PC_OFFSET] @ Get starting dex_pc.
341 add rPC, r1, #CODEITEM_INSNS_OFFSET @ Point to base of insns[]
342 add rPC, rPC, r0, lsl #1 @ Create direct pointer to 1st dex opcode
343 EXPORT_PC
344
345 /* Starting ibase */
346 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]
347
348 /* start executing the instruction at rPC */
349 FETCH_INST @ load rINST from rPC
350 GET_INST_OPCODE ip @ extract opcode from rINST
351 GOTO_OPCODE ip @ jump to next instruction
352 /* NOTE: no fallthrough */
353
354
355 .global artMterpAsmInstructionStart
356 .type artMterpAsmInstructionStart, %function
357artMterpAsmInstructionStart = .L_op_nop
358 .text
359
360/* ------------------------------ */
361 .balign 128
362.L_op_nop: /* 0x00 */
363/* File: arm/op_nop.S */
364 FETCH_ADVANCE_INST 1 @ advance to next instr, load rINST
365 GET_INST_OPCODE ip @ ip<- opcode from rINST
366 GOTO_OPCODE ip @ execute it
367
368/* ------------------------------ */
369 .balign 128
370.L_op_move: /* 0x01 */
371/* File: arm/op_move.S */
372 /* for move, move-object, long-to-int */
373 /* op vA, vB */
374 mov r1, rINST, lsr #12 @ r1<- B from 15:12
375 ubfx r0, rINST, #8, #4 @ r0<- A from 11:8
376 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
377 GET_VREG r2, r1 @ r2<- fp[B]
378 GET_INST_OPCODE ip @ ip<- opcode from rINST
379 .if 0
380 SET_VREG_OBJECT r2, r0 @ fp[A]<- r2
381 .else
382 SET_VREG r2, r0 @ fp[A]<- r2
383 .endif
384 GOTO_OPCODE ip @ execute next instruction
385
386/* ------------------------------ */
387 .balign 128
388.L_op_move_from16: /* 0x02 */
389/* File: arm/op_move_from16.S */
390 /* for: move/from16, move-object/from16 */
391 /* op vAA, vBBBB */
392 FETCH r1, 1 @ r1<- BBBB
393 mov r0, rINST, lsr #8 @ r0<- AA
394 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
395 GET_VREG r2, r1 @ r2<- fp[BBBB]
396 GET_INST_OPCODE ip @ extract opcode from rINST
397 .if 0
398 SET_VREG_OBJECT r2, r0 @ fp[AA]<- r2
399 .else
400 SET_VREG r2, r0 @ fp[AA]<- r2
401 .endif
402 GOTO_OPCODE ip @ jump to next instruction
403
404/* ------------------------------ */
405 .balign 128
406.L_op_move_16: /* 0x03 */
407/* File: arm/op_move_16.S */
408 /* for: move/16, move-object/16 */
409 /* op vAAAA, vBBBB */
410 FETCH r1, 2 @ r1<- BBBB
411 FETCH r0, 1 @ r0<- AAAA
412 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
413 GET_VREG r2, r1 @ r2<- fp[BBBB]
414 GET_INST_OPCODE ip @ extract opcode from rINST
415 .if 0
416 SET_VREG_OBJECT r2, r0 @ fp[AAAA]<- r2
417 .else
418 SET_VREG r2, r0 @ fp[AAAA]<- r2
419 .endif
420 GOTO_OPCODE ip @ jump to next instruction
421
422/* ------------------------------ */
423 .balign 128
424.L_op_move_wide: /* 0x04 */
425/* File: arm/op_move_wide.S */
426 /* move-wide vA, vB */
427 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
428 mov r3, rINST, lsr #12 @ r3<- B
429 ubfx r2, rINST, #8, #4 @ r2<- A
430 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
431 add r2, rFP, r2, lsl #2 @ r2<- &fp[A]
432 ldmia r3, {r0-r1} @ r0/r1<- fp[B]
433 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
434 GET_INST_OPCODE ip @ extract opcode from rINST
435 stmia r2, {r0-r1} @ fp[A]<- r0/r1
436 GOTO_OPCODE ip @ jump to next instruction
437
438/* ------------------------------ */
439 .balign 128
440.L_op_move_wide_from16: /* 0x05 */
441/* File: arm/op_move_wide_from16.S */
442 /* move-wide/from16 vAA, vBBBB */
443 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
444 FETCH r3, 1 @ r3<- BBBB
445 mov r2, rINST, lsr #8 @ r2<- AA
446 add r3, rFP, r3, lsl #2 @ r3<- &fp[BBBB]
447 add r2, rFP, r2, lsl #2 @ r2<- &fp[AA]
448 ldmia r3, {r0-r1} @ r0/r1<- fp[BBBB]
449 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
450 GET_INST_OPCODE ip @ extract opcode from rINST
451 stmia r2, {r0-r1} @ fp[AA]<- r0/r1
452 GOTO_OPCODE ip @ jump to next instruction
453
454/* ------------------------------ */
455 .balign 128
456.L_op_move_wide_16: /* 0x06 */
457/* File: arm/op_move_wide_16.S */
458 /* move-wide/16 vAAAA, vBBBB */
459 /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
460 FETCH r3, 2 @ r3<- BBBB
461 FETCH r2, 1 @ r2<- AAAA
462 add r3, rFP, r3, lsl #2 @ r3<- &fp[BBBB]
463 add r2, rFP, r2, lsl #2 @ r2<- &fp[AAAA]
464 ldmia r3, {r0-r1} @ r0/r1<- fp[BBBB]
465 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
466 stmia r2, {r0-r1} @ fp[AAAA]<- r0/r1
467 GET_INST_OPCODE ip @ extract opcode from rINST
468 GOTO_OPCODE ip @ jump to next instruction
469
470/* ------------------------------ */
471 .balign 128
472.L_op_move_object: /* 0x07 */
473/* File: arm/op_move_object.S */
474/* File: arm/op_move.S */
475 /* for move, move-object, long-to-int */
476 /* op vA, vB */
477 mov r1, rINST, lsr #12 @ r1<- B from 15:12
478 ubfx r0, rINST, #8, #4 @ r0<- A from 11:8
479 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
480 GET_VREG r2, r1 @ r2<- fp[B]
481 GET_INST_OPCODE ip @ ip<- opcode from rINST
482 .if 1
483 SET_VREG_OBJECT r2, r0 @ fp[A]<- r2
484 .else
485 SET_VREG r2, r0 @ fp[A]<- r2
486 .endif
487 GOTO_OPCODE ip @ execute next instruction
488
489
490/* ------------------------------ */
491 .balign 128
492.L_op_move_object_from16: /* 0x08 */
493/* File: arm/op_move_object_from16.S */
494/* File: arm/op_move_from16.S */
495 /* for: move/from16, move-object/from16 */
496 /* op vAA, vBBBB */
497 FETCH r1, 1 @ r1<- BBBB
498 mov r0, rINST, lsr #8 @ r0<- AA
499 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
500 GET_VREG r2, r1 @ r2<- fp[BBBB]
501 GET_INST_OPCODE ip @ extract opcode from rINST
502 .if 1
503 SET_VREG_OBJECT r2, r0 @ fp[AA]<- r2
504 .else
505 SET_VREG r2, r0 @ fp[AA]<- r2
506 .endif
507 GOTO_OPCODE ip @ jump to next instruction
508
509
510/* ------------------------------ */
511 .balign 128
512.L_op_move_object_16: /* 0x09 */
513/* File: arm/op_move_object_16.S */
514/* File: arm/op_move_16.S */
515 /* for: move/16, move-object/16 */
516 /* op vAAAA, vBBBB */
517 FETCH r1, 2 @ r1<- BBBB
518 FETCH r0, 1 @ r0<- AAAA
519 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
520 GET_VREG r2, r1 @ r2<- fp[BBBB]
521 GET_INST_OPCODE ip @ extract opcode from rINST
522 .if 1
523 SET_VREG_OBJECT r2, r0 @ fp[AAAA]<- r2
524 .else
525 SET_VREG r2, r0 @ fp[AAAA]<- r2
526 .endif
527 GOTO_OPCODE ip @ jump to next instruction
528
529
530/* ------------------------------ */
531 .balign 128
532.L_op_move_result: /* 0x0a */
533/* File: arm/op_move_result.S */
534 /* for: move-result, move-result-object */
535 /* op vAA */
536 mov r2, rINST, lsr #8 @ r2<- AA
537 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
538 ldr r0, [rFP, #OFF_FP_RESULT_REGISTER] @ get pointer to result JType.
539 ldr r0, [r0] @ r0 <- result.i.
540 GET_INST_OPCODE ip @ extract opcode from rINST
541 .if 0
542 SET_VREG_OBJECT r0, r2, r1 @ fp[AA]<- r0
543 .else
544 SET_VREG r0, r2 @ fp[AA]<- r0
545 .endif
546 GOTO_OPCODE ip @ jump to next instruction
547
548/* ------------------------------ */
549 .balign 128
550.L_op_move_result_wide: /* 0x0b */
551/* File: arm/op_move_result_wide.S */
552 /* move-result-wide vAA */
553 mov r2, rINST, lsr #8 @ r2<- AA
554 ldr r3, [rFP, #OFF_FP_RESULT_REGISTER]
555 add r2, rFP, r2, lsl #2 @ r2<- &fp[AA]
556 ldmia r3, {r0-r1} @ r0/r1<- retval.j
557 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
558 stmia r2, {r0-r1} @ fp[AA]<- r0/r1
559 GET_INST_OPCODE ip @ extract opcode from rINST
560 GOTO_OPCODE ip @ jump to next instruction
561
562/* ------------------------------ */
563 .balign 128
564.L_op_move_result_object: /* 0x0c */
565/* File: arm/op_move_result_object.S */
566/* File: arm/op_move_result.S */
567 /* for: move-result, move-result-object */
568 /* op vAA */
569 mov r2, rINST, lsr #8 @ r2<- AA
570 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
571 ldr r0, [rFP, #OFF_FP_RESULT_REGISTER] @ get pointer to result JType.
572 ldr r0, [r0] @ r0 <- result.i.
573 GET_INST_OPCODE ip @ extract opcode from rINST
574 .if 1
575 SET_VREG_OBJECT r0, r2, r1 @ fp[AA]<- r0
576 .else
577 SET_VREG r0, r2 @ fp[AA]<- r0
578 .endif
579 GOTO_OPCODE ip @ jump to next instruction
580
581
582/* ------------------------------ */
583 .balign 128
584.L_op_move_exception: /* 0x0d */
585/* File: arm/op_move_exception.S */
586 /* move-exception vAA */
587 mov r2, rINST, lsr #8 @ r2<- AA
588 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
589 mov r1, #0 @ r1<- 0
590 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
591 SET_VREG_OBJECT r3, r2 @ fp[AA]<- exception obj
592 GET_INST_OPCODE ip @ extract opcode from rINST
593 str r1, [rSELF, #THREAD_EXCEPTION_OFFSET] @ clear exception
594 GOTO_OPCODE ip @ jump to next instruction
595
596/* ------------------------------ */
597 .balign 128
598.L_op_return_void: /* 0x0e */
599/* File: arm/op_return_void.S */
600 .extern MterpThreadFenceForConstructor
601 bl MterpThreadFenceForConstructor
602 mov r0, #0
603 mov r1, #0
604 b MterpReturn
605
606/* ------------------------------ */
607 .balign 128
608.L_op_return: /* 0x0f */
609/* File: arm/op_return.S */
610 /*
611 * Return a 32-bit value.
612 *
613 * for: return, return-object
614 */
615 /* op vAA */
616 .extern MterpThreadFenceForConstructor
617 bl MterpThreadFenceForConstructor
618 mov r2, rINST, lsr #8 @ r2<- AA
619 GET_VREG r0, r2 @ r0<- vAA
620 mov r1, #0
621 b MterpReturn
622
623/* ------------------------------ */
624 .balign 128
625.L_op_return_wide: /* 0x10 */
626/* File: arm/op_return_wide.S */
627 /*
628 * Return a 64-bit value.
629 */
630 /* return-wide vAA */
631 .extern MterpThreadFenceForConstructor
632 bl MterpThreadFenceForConstructor
633 mov r2, rINST, lsr #8 @ r2<- AA
634 add r2, rFP, r2, lsl #2 @ r2<- &fp[AA]
635 ldmia r2, {r0-r1} @ r0/r1 <- vAA/vAA+1
636 b MterpReturn
637
638/* ------------------------------ */
639 .balign 128
640.L_op_return_object: /* 0x11 */
641/* File: arm/op_return_object.S */
642/* File: arm/op_return.S */
643 /*
644 * Return a 32-bit value.
645 *
646 * for: return, return-object
647 */
648 /* op vAA */
649 .extern MterpThreadFenceForConstructor
650 bl MterpThreadFenceForConstructor
651 mov r2, rINST, lsr #8 @ r2<- AA
652 GET_VREG r0, r2 @ r0<- vAA
653 mov r1, #0
654 b MterpReturn
655
656
657/* ------------------------------ */
658 .balign 128
659.L_op_const_4: /* 0x12 */
660/* File: arm/op_const_4.S */
661 /* const/4 vA, #+B */
662 mov r1, rINST, lsl #16 @ r1<- Bxxx0000
663 ubfx r0, rINST, #8, #4 @ r0<- A
664 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
665 mov r1, r1, asr #28 @ r1<- sssssssB (sign-extended)
666 GET_INST_OPCODE ip @ ip<- opcode from rINST
667 SET_VREG r1, r0 @ fp[A]<- r1
668 GOTO_OPCODE ip @ execute next instruction
669
670/* ------------------------------ */
671 .balign 128
672.L_op_const_16: /* 0x13 */
673/* File: arm/op_const_16.S */
674 /* const/16 vAA, #+BBBB */
675 FETCH_S r0, 1 @ r0<- ssssBBBB (sign-extended
676 mov r3, rINST, lsr #8 @ r3<- AA
677 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
678 SET_VREG r0, r3 @ vAA<- r0
679 GET_INST_OPCODE ip @ extract opcode from rINST
680 GOTO_OPCODE ip @ jump to next instruction
681
682/* ------------------------------ */
683 .balign 128
684.L_op_const: /* 0x14 */
685/* File: arm/op_const.S */
686 /* const vAA, #+BBBBbbbb */
687 mov r3, rINST, lsr #8 @ r3<- AA
688 FETCH r0, 1 @ r0<- bbbb (low
689 FETCH r1, 2 @ r1<- BBBB (high
690 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
691 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb
692 GET_INST_OPCODE ip @ extract opcode from rINST
693 SET_VREG r0, r3 @ vAA<- r0
694 GOTO_OPCODE ip @ jump to next instruction
695
696/* ------------------------------ */
697 .balign 128
698.L_op_const_high16: /* 0x15 */
699/* File: arm/op_const_high16.S */
700 /* const/high16 vAA, #+BBBB0000 */
701 FETCH r0, 1 @ r0<- 0000BBBB (zero-extended
702 mov r3, rINST, lsr #8 @ r3<- AA
703 mov r0, r0, lsl #16 @ r0<- BBBB0000
704 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
705 SET_VREG r0, r3 @ vAA<- r0
706 GET_INST_OPCODE ip @ extract opcode from rINST
707 GOTO_OPCODE ip @ jump to next instruction
708
709/* ------------------------------ */
710 .balign 128
711.L_op_const_wide_16: /* 0x16 */
712/* File: arm/op_const_wide_16.S */
713 /* const-wide/16 vAA, #+BBBB */
714 FETCH_S r0, 1 @ r0<- ssssBBBB (sign-extended
715 mov r3, rINST, lsr #8 @ r3<- AA
716 mov r1, r0, asr #31 @ r1<- ssssssss
717 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
718 add r3, rFP, r3, lsl #2 @ r3<- &fp[AA]
719 GET_INST_OPCODE ip @ extract opcode from rINST
720 stmia r3, {r0-r1} @ vAA<- r0/r1
721 GOTO_OPCODE ip @ jump to next instruction
722
723/* ------------------------------ */
724 .balign 128
725.L_op_const_wide_32: /* 0x17 */
726/* File: arm/op_const_wide_32.S */
727 /* const-wide/32 vAA, #+BBBBbbbb */
728 FETCH r0, 1 @ r0<- 0000bbbb (low)
729 mov r3, rINST, lsr #8 @ r3<- AA
730 FETCH_S r2, 2 @ r2<- ssssBBBB (high)
731 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
732 orr r0, r0, r2, lsl #16 @ r0<- BBBBbbbb
733 add r3, rFP, r3, lsl #2 @ r3<- &fp[AA]
734 mov r1, r0, asr #31 @ r1<- ssssssss
735 GET_INST_OPCODE ip @ extract opcode from rINST
736 stmia r3, {r0-r1} @ vAA<- r0/r1
737 GOTO_OPCODE ip @ jump to next instruction
738
739/* ------------------------------ */
740 .balign 128
741.L_op_const_wide: /* 0x18 */
742/* File: arm/op_const_wide.S */
743 /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
744 FETCH r0, 1 @ r0<- bbbb (low)
745 FETCH r1, 2 @ r1<- BBBB (low middle)
746 FETCH r2, 3 @ r2<- hhhh (high middle)
747 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb (low word)
748 FETCH r3, 4 @ r3<- HHHH (high)
749 mov r9, rINST, lsr #8 @ r9<- AA
750 orr r1, r2, r3, lsl #16 @ r1<- HHHHhhhh (high word)
751 FETCH_ADVANCE_INST 5 @ advance rPC, load rINST
752 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
753 GET_INST_OPCODE ip @ extract opcode from rINST
754 stmia r9, {r0-r1} @ vAA<- r0/r1
755 GOTO_OPCODE ip @ jump to next instruction
756
757/* ------------------------------ */
758 .balign 128
759.L_op_const_wide_high16: /* 0x19 */
760/* File: arm/op_const_wide_high16.S */
761 /* const-wide/high16 vAA, #+BBBB000000000000 */
762 FETCH r1, 1 @ r1<- 0000BBBB (zero-extended)
763 mov r3, rINST, lsr #8 @ r3<- AA
764 mov r0, #0 @ r0<- 00000000
765 mov r1, r1, lsl #16 @ r1<- BBBB0000
766 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
767 add r3, rFP, r3, lsl #2 @ r3<- &fp[AA]
768 GET_INST_OPCODE ip @ extract opcode from rINST
769 stmia r3, {r0-r1} @ vAA<- r0/r1
770 GOTO_OPCODE ip @ jump to next instruction
771
772/* ------------------------------ */
773 .balign 128
774.L_op_const_string: /* 0x1a */
775/* File: arm/op_const_string.S */
776 /* const/string vAA, String@BBBB */
777 EXPORT_PC
778 FETCH r0, 1 @ r0<- BBBB
779 mov r1, rINST, lsr #8 @ r1<- AA
780 add r2, rFP, #OFF_FP_SHADOWFRAME
781 mov r3, rSELF
782 bl MterpConstString @ (index, tgt_reg, shadow_frame, self)
783 PREFETCH_INST 2 @ load rINST
784 cmp r0, #0 @ fail?
785 bne MterpPossibleException @ let reference interpreter deal with it.
786 ADVANCE 2 @ advance rPC
787 GET_INST_OPCODE ip @ extract opcode from rINST
788 GOTO_OPCODE ip @ jump to next instruction
789
790/* ------------------------------ */
791 .balign 128
792.L_op_const_string_jumbo: /* 0x1b */
793/* File: arm/op_const_string_jumbo.S */
794 /* const/string vAA, String@BBBBBBBB */
795 EXPORT_PC
796 FETCH r0, 1 @ r0<- bbbb (low
797 FETCH r2, 2 @ r2<- BBBB (high
798 mov r1, rINST, lsr #8 @ r1<- AA
799 orr r0, r0, r2, lsl #16 @ r1<- BBBBbbbb
800 add r2, rFP, #OFF_FP_SHADOWFRAME
801 mov r3, rSELF
802 bl MterpConstString @ (index, tgt_reg, shadow_frame, self)
803 PREFETCH_INST 3 @ advance rPC
804 cmp r0, #0 @ fail?
805 bne MterpPossibleException @ let reference interpreter deal with it.
806 ADVANCE 3 @ advance rPC
807 GET_INST_OPCODE ip @ extract opcode from rINST
808 GOTO_OPCODE ip @ jump to next instruction
809
810/* ------------------------------ */
811 .balign 128
812.L_op_const_class: /* 0x1c */
813/* File: arm/op_const_class.S */
814 /* const/class vAA, Class@BBBB */
815 EXPORT_PC
816 FETCH r0, 1 @ r0<- BBBB
817 mov r1, rINST, lsr #8 @ r1<- AA
818 add r2, rFP, #OFF_FP_SHADOWFRAME
819 mov r3, rSELF
820 bl MterpConstClass @ (index, tgt_reg, shadow_frame, self)
821 PREFETCH_INST 2
822 cmp r0, #0
823 bne MterpPossibleException
824 ADVANCE 2
825 GET_INST_OPCODE ip @ extract opcode from rINST
826 GOTO_OPCODE ip @ jump to next instruction
827
828/* ------------------------------ */
829 .balign 128
830.L_op_monitor_enter: /* 0x1d */
831/* File: arm/op_monitor_enter.S */
832 /*
833 * Synchronize on an object.
834 */
835 /* monitor-enter vAA */
836 EXPORT_PC
837 mov r2, rINST, lsr #8 @ r2<- AA
838 GET_VREG r0, r2 @ r0<- vAA (object)
839 mov r1, rSELF @ r1<- self
840 bl artLockObjectFromCode
841 cmp r0, #0
842 bne MterpException
843 FETCH_ADVANCE_INST 1
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_monitor_exit: /* 0x1e */
850/* File: arm/op_monitor_exit.S */
851 /*
852 * Unlock an object.
853 *
854 * Exceptions that occur when unlocking a monitor need to appear as
855 * if they happened at the following instruction. See the Dalvik
856 * instruction spec.
857 */
858 /* monitor-exit vAA */
859 EXPORT_PC
860 mov r2, rINST, lsr #8 @ r2<- AA
861 GET_VREG r0, r2 @ r0<- vAA (object)
862 mov r1, rSELF @ r0<- self
863 bl artUnlockObjectFromCode @ r0<- success for unlock(self, obj)
864 cmp r0, #0 @ failed?
865 bne MterpException
866 FETCH_ADVANCE_INST 1 @ before throw: advance rPC, load rINST
867 GET_INST_OPCODE ip @ extract opcode from rINST
868 GOTO_OPCODE ip @ jump to next instruction
869
870/* ------------------------------ */
871 .balign 128
872.L_op_check_cast: /* 0x1f */
873/* File: arm/op_check_cast.S */
874 /*
875 * Check to see if a cast from one class to another is allowed.
876 */
877 /* check-cast vAA, class@BBBB */
878 EXPORT_PC
879 FETCH r0, 1 @ r0<- BBBB
880 mov r1, rINST, lsr #8 @ r1<- AA
881 GET_VREG r1, r1 @ r1<- object
882 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- method
883 mov r3, rSELF @ r3<- self
884 bl MterpCheckCast @ (index, obj, method, self)
885 PREFETCH_INST 2
886 cmp r0, #0
887 bne MterpPossibleException
888 ADVANCE 2
889 GET_INST_OPCODE ip @ extract opcode from rINST
890 GOTO_OPCODE ip @ jump to next instruction
891
892/* ------------------------------ */
893 .balign 128
894.L_op_instance_of: /* 0x20 */
895/* File: arm/op_instance_of.S */
896 /*
897 * Check to see if an object reference is an instance of a class.
898 *
899 * Most common situation is a non-null object, being compared against
900 * an already-resolved class.
901 */
902 /* instance-of vA, vB, class@CCCC */
903 EXPORT_PC
904 FETCH r0, 1 @ r0<- CCCC
905 mov r1, rINST, lsr #12 @ r1<- B
906 GET_VREG r1, r1 @ r1<- vB (object)
907 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- method
908 mov r3, rSELF @ r3<- self
909 mov r9, rINST, lsr #8 @ r9<- A+
910 and r9, r9, #15 @ r9<- A
911 bl MterpInstanceOf @ (index, obj, method, self)
912 ldr r1, [rSELF, #THREAD_EXCEPTION_OFFSET]
913 PREFETCH_INST 2
914 cmp r1, #0 @ exception pending?
915 bne MterpException
916 ADVANCE 2 @ advance rPC
917 SET_VREG r0, r9 @ vA<- r0
918 GET_INST_OPCODE ip @ extract opcode from rINST
919 GOTO_OPCODE ip @ jump to next instruction
920
921/* ------------------------------ */
922 .balign 128
923.L_op_array_length: /* 0x21 */
924/* File: arm/op_array_length.S */
925 /*
926 * Return the length of an array.
927 */
928 mov r1, rINST, lsr #12 @ r1<- B
929 ubfx r2, rINST, #8, #4 @ r2<- A
930 GET_VREG r0, r1 @ r0<- vB (object ref)
931 cmp r0, #0 @ is object null?
932 beq common_errNullObject @ yup, fail
933 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
934 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- array length
935 GET_INST_OPCODE ip @ extract opcode from rINST
936 SET_VREG r3, r2 @ vB<- length
937 GOTO_OPCODE ip @ jump to next instruction
938
939/* ------------------------------ */
940 .balign 128
941.L_op_new_instance: /* 0x22 */
942/* File: arm/op_new_instance.S */
943 /*
944 * Create a new instance of a class.
945 */
946 /* new-instance vAA, class@BBBB */
947 EXPORT_PC
948 add r0, rFP, #OFF_FP_SHADOWFRAME
949 mov r1, rSELF
950 mov r2, rINST
951 bl MterpNewInstance @ (shadow_frame, self, inst_data)
952 cmp r0, #0
953 beq MterpPossibleException
954 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
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_new_array: /* 0x23 */
961/* File: arm/op_new_array.S */
962 /*
963 * Allocate an array of objects, specified with the array class
964 * and a count.
965 *
966 * The verifier guarantees that this is an array class, so we don't
967 * check for it here.
968 */
969 /* new-array vA, vB, class@CCCC */
970 EXPORT_PC
971 add r0, rFP, #OFF_FP_SHADOWFRAME
972 mov r1, rPC
973 mov r2, rINST
974 mov r3, rSELF
975 bl MterpNewArray
976 cmp r0, #0
977 beq MterpPossibleException
978 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
979 GET_INST_OPCODE ip @ extract opcode from rINST
980 GOTO_OPCODE ip @ jump to next instruction
981
982/* ------------------------------ */
983 .balign 128
984.L_op_filled_new_array: /* 0x24 */
985/* File: arm/op_filled_new_array.S */
986 /*
987 * Create a new array with elements filled from registers.
988 *
989 * for: filled-new-array, filled-new-array/range
990 */
991 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
992 /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
993 .extern MterpFilledNewArray
994 EXPORT_PC
995 add r0, rFP, #OFF_FP_SHADOWFRAME
996 mov r1, rPC
997 mov r2, rSELF
998 bl MterpFilledNewArray
999 cmp r0, #0
1000 beq MterpPossibleException
1001 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
1002 GET_INST_OPCODE ip @ extract opcode from rINST
1003 GOTO_OPCODE ip @ jump to next instruction
1004
1005/* ------------------------------ */
1006 .balign 128
1007.L_op_filled_new_array_range: /* 0x25 */
1008/* File: arm/op_filled_new_array_range.S */
1009/* File: arm/op_filled_new_array.S */
1010 /*
1011 * Create a new array with elements filled from registers.
1012 *
1013 * for: filled-new-array, filled-new-array/range
1014 */
1015 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1016 /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1017 .extern MterpFilledNewArrayRange
1018 EXPORT_PC
1019 add r0, rFP, #OFF_FP_SHADOWFRAME
1020 mov r1, rPC
1021 mov r2, rSELF
1022 bl MterpFilledNewArrayRange
1023 cmp r0, #0
1024 beq MterpPossibleException
1025 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
1026 GET_INST_OPCODE ip @ extract opcode from rINST
1027 GOTO_OPCODE ip @ jump to next instruction
1028
1029
1030/* ------------------------------ */
1031 .balign 128
1032.L_op_fill_array_data: /* 0x26 */
1033/* File: arm/op_fill_array_data.S */
1034 /* fill-array-data vAA, +BBBBBBBB */
1035 EXPORT_PC
1036 FETCH r0, 1 @ r0<- bbbb (lo)
1037 FETCH r1, 2 @ r1<- BBBB (hi)
1038 mov r3, rINST, lsr #8 @ r3<- AA
1039 orr r1, r0, r1, lsl #16 @ r1<- BBBBbbbb
1040 GET_VREG r0, r3 @ r0<- vAA (array object)
1041 add r1, rPC, r1, lsl #1 @ r1<- PC + BBBBbbbb*2 (array data off.)
1042 bl MterpFillArrayData @ (obj, payload)
1043 cmp r0, #0 @ 0 means an exception is thrown
1044 beq MterpPossibleException @ exception?
1045 FETCH_ADVANCE_INST 3 @ advance rPC, load rINST
1046 GET_INST_OPCODE ip @ extract opcode from rINST
1047 GOTO_OPCODE ip @ jump to next instruction
1048
1049/* ------------------------------ */
1050 .balign 128
1051.L_op_throw: /* 0x27 */
1052/* File: arm/op_throw.S */
1053 /*
1054 * Throw an exception object in the current thread.
1055 */
1056 /* throw vAA */
1057 EXPORT_PC
1058 mov r2, rINST, lsr #8 @ r2<- AA
1059 GET_VREG r1, r2 @ r1<- vAA (exception object)
1060 cmp r1, #0 @ null object?
1061 beq common_errNullObject @ yes, throw an NPE instead
1062 str r1, [rSELF, #THREAD_EXCEPTION_OFFSET] @ thread->exception<- obj
1063 b MterpException
1064
1065/* ------------------------------ */
1066 .balign 128
1067.L_op_goto: /* 0x28 */
1068/* File: arm/op_goto.S */
1069 /*
1070 * Unconditional branch, 8-bit offset.
1071 *
1072 * The branch distance is a signed code-unit offset, which we need to
1073 * double to get a byte offset.
1074 */
1075 /* goto +AA */
1076 /* tuning: use sbfx for 6t2+ targets */
1077#if MTERP_SUSPEND
1078 mov r0, rINST, lsl #16 @ r0<- AAxx0000
1079 movs r1, r0, asr #24 @ r1<- ssssssAA (sign-extended)
1080 add r2, r1, r1 @ r2<- byte offset, set flags
1081 @ If backwards branch refresh rIBASE
1082 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh handler base
1083 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1084 GET_INST_OPCODE ip @ extract opcode from rINST
1085 GOTO_OPCODE ip @ jump to next instruction
1086#else
1087 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1088 mov r0, rINST, lsl #16 @ r0<- AAxx0000
1089 movs r1, r0, asr #24 @ r1<- ssssssAA (sign-extended)
1090 add r2, r1, r1 @ r2<- byte offset, set flags
1091 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1092 @ If backwards branch refresh rIBASE
1093 bmi MterpCheckSuspendAndContinue
1094 GET_INST_OPCODE ip @ extract opcode from rINST
1095 GOTO_OPCODE ip @ jump to next instruction
1096#endif
1097
1098/* ------------------------------ */
1099 .balign 128
1100.L_op_goto_16: /* 0x29 */
1101/* File: arm/op_goto_16.S */
1102 /*
1103 * Unconditional branch, 16-bit offset.
1104 *
1105 * The branch distance is a signed code-unit offset, which we need to
1106 * double to get a byte offset.
1107 */
1108 /* goto/16 +AAAA */
1109#if MTERP_SUSPEND
1110 FETCH_S r0, 1 @ r0<- ssssAAAA (sign-extended)
1111 adds r1, r0, r0 @ r1<- byte offset, flags set
1112 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1113 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh handler base
1114 GET_INST_OPCODE ip @ extract opcode from rINST
1115 GOTO_OPCODE ip @ jump to next instruction
1116#else
1117 FETCH_S r0, 1 @ r0<- ssssAAAA (sign-extended)
1118 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1119 adds r1, r0, r0 @ r1<- byte offset, flags set
1120 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1121 bmi MterpCheckSuspendAndContinue
1122 GET_INST_OPCODE ip @ extract opcode from rINST
1123 GOTO_OPCODE ip @ jump to next instruction
1124#endif
1125
1126/* ------------------------------ */
1127 .balign 128
1128.L_op_goto_32: /* 0x2a */
1129/* File: arm/op_goto_32.S */
1130 /*
1131 * Unconditional branch, 32-bit offset.
1132 *
1133 * The branch distance is a signed code-unit offset, which we need to
1134 * double to get a byte offset.
1135 *
1136 * Unlike most opcodes, this one is allowed to branch to itself, so
1137 * our "backward branch" test must be "<=0" instead of "<0". Because
1138 * we need the V bit set, we'll use an adds to convert from Dalvik
1139 * offset to byte offset.
1140 */
1141 /* goto/32 +AAAAAAAA */
1142#if MTERP_SUSPEND
1143 FETCH r0, 1 @ r0<- aaaa (lo)
1144 FETCH r1, 2 @ r1<- AAAA (hi)
1145 orr r0, r0, r1, lsl #16 @ r0<- AAAAaaaa
1146 adds r1, r0, r0 @ r1<- byte offset
1147 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1148 ldrle rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh handler base
1149 GET_INST_OPCODE ip @ extract opcode from rINST
1150 GOTO_OPCODE ip @ jump to next instruction
1151#else
1152 FETCH r0, 1 @ r0<- aaaa (lo)
1153 FETCH r1, 2 @ r1<- AAAA (hi)
1154 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1155 orr r0, r0, r1, lsl #16 @ r0<- AAAAaaaa
1156 adds r1, r0, r0 @ r1<- byte offset
1157 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1158 ble 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_packed_switch: /* 0x2b */
1166/* File: arm/op_packed_switch.S */
1167 /*
1168 * Handle a packed-switch or sparse-switch instruction. In both cases
1169 * we decode it and hand it off to a helper function.
1170 *
1171 * We don't really expect backward branches in a switch statement, but
1172 * they're perfectly legal, so we check for them here.
1173 *
1174 * for: packed-switch, sparse-switch
1175 */
1176 /* op vAA, +BBBB */
1177#if MTERP_SUSPEND
1178 FETCH r0, 1 @ r0<- bbbb (lo)
1179 FETCH r1, 2 @ r1<- BBBB (hi)
1180 mov r3, rINST, lsr #8 @ r3<- AA
1181 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb
1182 GET_VREG r1, r3 @ r1<- vAA
1183 add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2
1184 bl MterpDoPackedSwitch @ r0<- code-unit branch offset
1185 adds r1, r0, r0 @ r1<- byte offset; clear V
1186 ldrle rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh handler base
1187 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1188 GET_INST_OPCODE ip @ extract opcode from rINST
1189 GOTO_OPCODE ip @ jump to next instruction
1190#else
1191 FETCH r0, 1 @ r0<- bbbb (lo)
1192 FETCH r1, 2 @ r1<- BBBB (hi)
1193 mov r3, rINST, lsr #8 @ r3<- AA
1194 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb
1195 GET_VREG r1, r3 @ r1<- vAA
1196 add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2
1197 bl MterpDoPackedSwitch @ r0<- code-unit branch offset
1198 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1199 adds r1, r0, r0 @ r1<- byte offset; clear V
1200 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1201 ble MterpCheckSuspendAndContinue
1202 GET_INST_OPCODE ip @ extract opcode from rINST
1203 GOTO_OPCODE ip @ jump to next instruction
1204#endif
1205
1206/* ------------------------------ */
1207 .balign 128
1208.L_op_sparse_switch: /* 0x2c */
1209/* File: arm/op_sparse_switch.S */
1210/* File: arm/op_packed_switch.S */
1211 /*
1212 * Handle a packed-switch or sparse-switch instruction. In both cases
1213 * we decode it and hand it off to a helper function.
1214 *
1215 * We don't really expect backward branches in a switch statement, but
1216 * they're perfectly legal, so we check for them here.
1217 *
1218 * for: packed-switch, sparse-switch
1219 */
1220 /* op vAA, +BBBB */
1221#if MTERP_SUSPEND
1222 FETCH r0, 1 @ r0<- bbbb (lo)
1223 FETCH r1, 2 @ r1<- BBBB (hi)
1224 mov r3, rINST, lsr #8 @ r3<- AA
1225 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb
1226 GET_VREG r1, r3 @ r1<- vAA
1227 add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2
1228 bl MterpDoSparseSwitch @ r0<- code-unit branch offset
1229 adds r1, r0, r0 @ r1<- byte offset; clear V
1230 ldrle rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh handler base
1231 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1232 GET_INST_OPCODE ip @ extract opcode from rINST
1233 GOTO_OPCODE ip @ jump to next instruction
1234#else
1235 FETCH r0, 1 @ r0<- bbbb (lo)
1236 FETCH r1, 2 @ r1<- BBBB (hi)
1237 mov r3, rINST, lsr #8 @ r3<- AA
1238 orr r0, r0, r1, lsl #16 @ r0<- BBBBbbbb
1239 GET_VREG r1, r3 @ r1<- vAA
1240 add r0, rPC, r0, lsl #1 @ r0<- PC + BBBBbbbb*2
1241 bl MterpDoSparseSwitch @ r0<- code-unit branch offset
1242 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1243 adds r1, r0, r0 @ r1<- byte offset; clear V
1244 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1245 ble MterpCheckSuspendAndContinue
1246 GET_INST_OPCODE ip @ extract opcode from rINST
1247 GOTO_OPCODE ip @ jump to next instruction
1248#endif
1249
1250
1251/* ------------------------------ */
1252 .balign 128
1253.L_op_cmpl_float: /* 0x2d */
1254/* File: arm/op_cmpl_float.S */
1255 /*
1256 * Compare two floating-point values. Puts 0, 1, or -1 into the
1257 * destination register based on the results of the comparison.
1258 *
1259 * int compare(x, y) {
1260 * if (x == y) {
1261 * return 0;
1262 * } else if (x > y) {
1263 * return 1;
1264 * } else if (x < y) {
1265 * return -1;
1266 * } else {
1267 * return -1;
1268 * }
1269 * }
1270 */
1271 /* op vAA, vBB, vCC */
1272 FETCH r0, 1 @ r0<- CCBB
1273 mov r9, rINST, lsr #8 @ r9<- AA
1274 and r2, r0, #255 @ r2<- BB
1275 mov r3, r0, lsr #8 @ r3<- CC
1276 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
1277 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
1278 flds s0, [r2] @ s0<- vBB
1279 flds s1, [r3] @ s1<- vCC
1280 fcmpes s0, s1 @ compare (vBB, vCC)
1281 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
1282 mvn r0, #0 @ r0<- -1 (default)
1283 GET_INST_OPCODE ip @ extract opcode from rINST
1284 fmstat @ export status flags
1285 movgt r0, #1 @ (greater than) r1<- 1
1286 moveq r0, #0 @ (equal) r1<- 0
1287 SET_VREG r0, r9 @ vAA<- r0
1288 GOTO_OPCODE ip @ jump to next instruction
1289
1290/* ------------------------------ */
1291 .balign 128
1292.L_op_cmpg_float: /* 0x2e */
1293/* File: arm/op_cmpg_float.S */
1294 /*
1295 * Compare two floating-point values. Puts 0, 1, or -1 into the
1296 * destination register based on the results of the comparison.
1297 *
1298 * int compare(x, y) {
1299 * if (x == y) {
1300 * return 0;
1301 * } else if (x < y) {
1302 * return -1;
1303 * } else if (x > y) {
1304 * return 1;
1305 * } else {
1306 * return 1;
1307 * }
1308 * }
1309 */
1310 /* op vAA, vBB, vCC */
1311 FETCH r0, 1 @ r0<- CCBB
1312 mov r9, rINST, lsr #8 @ r9<- AA
1313 and r2, r0, #255 @ r2<- BB
1314 mov r3, r0, lsr #8 @ r3<- CC
1315 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
1316 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
1317 flds s0, [r2] @ s0<- vBB
1318 flds s1, [r3] @ s1<- vCC
1319 fcmpes s0, s1 @ compare (vBB, vCC)
1320 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
1321 mov r0, #1 @ r0<- 1 (default)
1322 GET_INST_OPCODE ip @ extract opcode from rINST
1323 fmstat @ export status flags
1324 mvnmi r0, #0 @ (less than) r1<- -1
1325 moveq r0, #0 @ (equal) r1<- 0
1326 SET_VREG r0, r9 @ vAA<- r0
1327 GOTO_OPCODE ip @ jump to next instruction
1328
1329/* ------------------------------ */
1330 .balign 128
1331.L_op_cmpl_double: /* 0x2f */
1332/* File: arm/op_cmpl_double.S */
1333 /*
1334 * Compare two floating-point values. Puts 0, 1, or -1 into the
1335 * destination register based on the results of the comparison.
1336 *
1337 * int compare(x, y) {
1338 * if (x == y) {
1339 * return 0;
1340 * } else if (x > y) {
1341 * return 1;
1342 * } else if (x < y) {
1343 * return -1;
1344 * } else {
1345 * return -1;
1346 * }
1347 * }
1348 */
1349 /* op vAA, vBB, vCC */
1350 FETCH r0, 1 @ r0<- CCBB
1351 mov r9, rINST, lsr #8 @ r9<- AA
1352 and r2, r0, #255 @ r2<- BB
1353 mov r3, r0, lsr #8 @ r3<- CC
1354 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
1355 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
1356 fldd d0, [r2] @ d0<- vBB
1357 fldd d1, [r3] @ d1<- vCC
1358 fcmped d0, d1 @ compare (vBB, vCC)
1359 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
1360 mvn r0, #0 @ r0<- -1 (default)
1361 GET_INST_OPCODE ip @ extract opcode from rINST
1362 fmstat @ export status flags
1363 movgt r0, #1 @ (greater than) r1<- 1
1364 moveq r0, #0 @ (equal) r1<- 0
1365 SET_VREG r0, r9 @ vAA<- r0
1366 GOTO_OPCODE ip @ jump to next instruction
1367
1368/* ------------------------------ */
1369 .balign 128
1370.L_op_cmpg_double: /* 0x30 */
1371/* File: arm/op_cmpg_double.S */
1372 /*
1373 * Compare two floating-point values. Puts 0, 1, or -1 into the
1374 * destination register based on the results of the comparison.
1375 *
1376 * int compare(x, y) {
1377 * if (x == y) {
1378 * return 0;
1379 * } else if (x < y) {
1380 * return -1;
1381 * } else if (x > y) {
1382 * return 1;
1383 * } else {
1384 * return 1;
1385 * }
1386 * }
1387 */
1388 /* op vAA, vBB, vCC */
1389 FETCH r0, 1 @ r0<- CCBB
1390 mov r9, rINST, lsr #8 @ r9<- AA
1391 and r2, r0, #255 @ r2<- BB
1392 mov r3, r0, lsr #8 @ r3<- CC
1393 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
1394 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
1395 fldd d0, [r2] @ d0<- vBB
1396 fldd d1, [r3] @ d1<- vCC
1397 fcmped d0, d1 @ compare (vBB, vCC)
1398 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
1399 mov r0, #1 @ r0<- 1 (default)
1400 GET_INST_OPCODE ip @ extract opcode from rINST
1401 fmstat @ export status flags
1402 mvnmi r0, #0 @ (less than) r1<- -1
1403 moveq r0, #0 @ (equal) r1<- 0
1404 SET_VREG r0, r9 @ vAA<- r0
1405 GOTO_OPCODE ip @ jump to next instruction
1406
1407/* ------------------------------ */
1408 .balign 128
1409.L_op_cmp_long: /* 0x31 */
1410/* File: arm/op_cmp_long.S */
1411 /*
1412 * Compare two 64-bit values. Puts 0, 1, or -1 into the destination
1413 * register based on the results of the comparison.
1414 *
1415 * We load the full values with LDM, but in practice many values could
1416 * be resolved by only looking at the high word. This could be made
1417 * faster or slower by splitting the LDM into a pair of LDRs.
1418 *
1419 * If we just wanted to set condition flags, we could do this:
1420 * subs ip, r0, r2
1421 * sbcs ip, r1, r3
1422 * subeqs ip, r0, r2
1423 * Leaving { <0, 0, >0 } in ip. However, we have to set it to a specific
1424 * integer value, which we can do with 2 conditional mov/mvn instructions
1425 * (set 1, set -1; if they're equal we already have 0 in ip), giving
1426 * us a constant 5-cycle path plus a branch at the end to the
1427 * instruction epilogue code. The multi-compare approach below needs
1428 * 2 or 3 cycles + branch if the high word doesn't match, 6 + branch
1429 * in the worst case (the 64-bit values are equal).
1430 */
1431 /* cmp-long vAA, vBB, vCC */
1432 FETCH r0, 1 @ r0<- CCBB
1433 mov r9, rINST, lsr #8 @ r9<- AA
1434 and r2, r0, #255 @ r2<- BB
1435 mov r3, r0, lsr #8 @ r3<- CC
1436 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
1437 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
1438 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
1439 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
1440 cmp r1, r3 @ compare (vBB+1, vCC+1)
1441 blt .Lop_cmp_long_less @ signed compare on high part
1442 bgt .Lop_cmp_long_greater
1443 subs r1, r0, r2 @ r1<- r0 - r2
1444 bhi .Lop_cmp_long_greater @ unsigned compare on low part
1445 bne .Lop_cmp_long_less
1446 b .Lop_cmp_long_finish @ equal; r1 already holds 0
1447
1448/* ------------------------------ */
1449 .balign 128
1450.L_op_if_eq: /* 0x32 */
1451/* File: arm/op_if_eq.S */
1452/* File: arm/bincmp.S */
1453 /*
1454 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1455 * fragment that specifies the *reverse* comparison to perform, e.g.
1456 * for "if-le" you would use "gt".
1457 *
1458 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1459 */
1460 /* if-cmp vA, vB, +CCCC */
1461#if MTERP_SUSPEND
1462 mov r1, rINST, lsr #12 @ r1<- B
1463 ubfx r0, rINST, #8, #4 @ r0<- A
1464 GET_VREG r3, r1 @ r3<- vB
1465 GET_VREG r2, r0 @ r2<- vA
1466 FETCH_S r1, 1 @ r1<- branch offset, in code units
1467 cmp r2, r3 @ compare (vA, vB)
1468 movne r1, #2 @ r1<- BYTE branch dist for not-taken
1469 adds r2, r1, r1 @ convert to bytes, check sign
1470 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1471 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh rIBASE
1472 GET_INST_OPCODE ip @ extract opcode from rINST
1473 GOTO_OPCODE ip @ jump to next instruction
1474#else
1475 mov r1, rINST, lsr #12 @ r1<- B
1476 ubfx r0, rINST, #8, #4 @ r0<- A
1477 GET_VREG r3, r1 @ r3<- vB
1478 GET_VREG r2, r0 @ r2<- vA
1479 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1480 FETCH_S r1, 1 @ r1<- branch offset, in code units
1481 cmp r2, r3 @ compare (vA, vB)
1482 movne r1, #2 @ r1<- BYTE branch dist for not-taken
1483 adds r2, r1, r1 @ convert to bytes, check sign
1484 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1485 bmi MterpCheckSuspendAndContinue
1486 GET_INST_OPCODE ip @ extract opcode from rINST
1487 GOTO_OPCODE ip @ jump to next instruction
1488#endif
1489
1490
1491/* ------------------------------ */
1492 .balign 128
1493.L_op_if_ne: /* 0x33 */
1494/* File: arm/op_if_ne.S */
1495/* File: arm/bincmp.S */
1496 /*
1497 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1498 * fragment that specifies the *reverse* comparison to perform, e.g.
1499 * for "if-le" you would use "gt".
1500 *
1501 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1502 */
1503 /* if-cmp vA, vB, +CCCC */
1504#if MTERP_SUSPEND
1505 mov r1, rINST, lsr #12 @ r1<- B
1506 ubfx r0, rINST, #8, #4 @ r0<- A
1507 GET_VREG r3, r1 @ r3<- vB
1508 GET_VREG r2, r0 @ r2<- vA
1509 FETCH_S r1, 1 @ r1<- branch offset, in code units
1510 cmp r2, r3 @ compare (vA, vB)
1511 moveq r1, #2 @ r1<- BYTE branch dist for not-taken
1512 adds r2, r1, r1 @ convert to bytes, check sign
1513 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1514 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh rIBASE
1515 GET_INST_OPCODE ip @ extract opcode from rINST
1516 GOTO_OPCODE ip @ jump to next instruction
1517#else
1518 mov r1, rINST, lsr #12 @ r1<- B
1519 ubfx r0, rINST, #8, #4 @ r0<- A
1520 GET_VREG r3, r1 @ r3<- vB
1521 GET_VREG r2, r0 @ r2<- vA
1522 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1523 FETCH_S r1, 1 @ r1<- branch offset, in code units
1524 cmp r2, r3 @ compare (vA, vB)
1525 moveq r1, #2 @ r1<- BYTE branch dist for not-taken
1526 adds r2, r1, r1 @ convert to bytes, check sign
1527 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1528 bmi MterpCheckSuspendAndContinue
1529 GET_INST_OPCODE ip @ extract opcode from rINST
1530 GOTO_OPCODE ip @ jump to next instruction
1531#endif
1532
1533
1534/* ------------------------------ */
1535 .balign 128
1536.L_op_if_lt: /* 0x34 */
1537/* File: arm/op_if_lt.S */
1538/* File: arm/bincmp.S */
1539 /*
1540 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1541 * fragment that specifies the *reverse* comparison to perform, e.g.
1542 * for "if-le" you would use "gt".
1543 *
1544 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1545 */
1546 /* if-cmp vA, vB, +CCCC */
1547#if MTERP_SUSPEND
1548 mov r1, rINST, lsr #12 @ r1<- B
1549 ubfx r0, rINST, #8, #4 @ r0<- A
1550 GET_VREG r3, r1 @ r3<- vB
1551 GET_VREG r2, r0 @ r2<- vA
1552 FETCH_S r1, 1 @ r1<- branch offset, in code units
1553 cmp r2, r3 @ compare (vA, vB)
1554 movge r1, #2 @ r1<- BYTE branch dist for not-taken
1555 adds r2, r1, r1 @ convert to bytes, check sign
1556 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1557 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh rIBASE
1558 GET_INST_OPCODE ip @ extract opcode from rINST
1559 GOTO_OPCODE ip @ jump to next instruction
1560#else
1561 mov r1, rINST, lsr #12 @ r1<- B
1562 ubfx r0, rINST, #8, #4 @ r0<- A
1563 GET_VREG r3, r1 @ r3<- vB
1564 GET_VREG r2, r0 @ r2<- vA
1565 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1566 FETCH_S r1, 1 @ r1<- branch offset, in code units
1567 cmp r2, r3 @ compare (vA, vB)
1568 movge r1, #2 @ r1<- BYTE branch dist for not-taken
1569 adds r2, r1, r1 @ convert to bytes, check sign
1570 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1571 bmi MterpCheckSuspendAndContinue
1572 GET_INST_OPCODE ip @ extract opcode from rINST
1573 GOTO_OPCODE ip @ jump to next instruction
1574#endif
1575
1576
1577/* ------------------------------ */
1578 .balign 128
1579.L_op_if_ge: /* 0x35 */
1580/* File: arm/op_if_ge.S */
1581/* File: arm/bincmp.S */
1582 /*
1583 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1584 * fragment that specifies the *reverse* comparison to perform, e.g.
1585 * for "if-le" you would use "gt".
1586 *
1587 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1588 */
1589 /* if-cmp vA, vB, +CCCC */
1590#if MTERP_SUSPEND
1591 mov r1, rINST, lsr #12 @ r1<- B
1592 ubfx r0, rINST, #8, #4 @ r0<- A
1593 GET_VREG r3, r1 @ r3<- vB
1594 GET_VREG r2, r0 @ r2<- vA
1595 FETCH_S r1, 1 @ r1<- branch offset, in code units
1596 cmp r2, r3 @ compare (vA, vB)
1597 movlt r1, #2 @ r1<- BYTE branch dist for not-taken
1598 adds r2, r1, r1 @ convert to bytes, check sign
1599 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1600 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh rIBASE
1601 GET_INST_OPCODE ip @ extract opcode from rINST
1602 GOTO_OPCODE ip @ jump to next instruction
1603#else
1604 mov r1, rINST, lsr #12 @ r1<- B
1605 ubfx r0, rINST, #8, #4 @ r0<- A
1606 GET_VREG r3, r1 @ r3<- vB
1607 GET_VREG r2, r0 @ r2<- vA
1608 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1609 FETCH_S r1, 1 @ r1<- branch offset, in code units
1610 cmp r2, r3 @ compare (vA, vB)
1611 movlt r1, #2 @ r1<- BYTE branch dist for not-taken
1612 adds r2, r1, r1 @ convert to bytes, check sign
1613 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1614 bmi MterpCheckSuspendAndContinue
1615 GET_INST_OPCODE ip @ extract opcode from rINST
1616 GOTO_OPCODE ip @ jump to next instruction
1617#endif
1618
1619
1620/* ------------------------------ */
1621 .balign 128
1622.L_op_if_gt: /* 0x36 */
1623/* File: arm/op_if_gt.S */
1624/* File: arm/bincmp.S */
1625 /*
1626 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1627 * fragment that specifies the *reverse* comparison to perform, e.g.
1628 * for "if-le" you would use "gt".
1629 *
1630 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1631 */
1632 /* if-cmp vA, vB, +CCCC */
1633#if MTERP_SUSPEND
1634 mov r1, rINST, lsr #12 @ r1<- B
1635 ubfx r0, rINST, #8, #4 @ r0<- A
1636 GET_VREG r3, r1 @ r3<- vB
1637 GET_VREG r2, r0 @ r2<- vA
1638 FETCH_S r1, 1 @ r1<- branch offset, in code units
1639 cmp r2, r3 @ compare (vA, vB)
1640 movle r1, #2 @ r1<- BYTE branch dist for not-taken
1641 adds r2, r1, r1 @ convert to bytes, check sign
1642 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1643 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh rIBASE
1644 GET_INST_OPCODE ip @ extract opcode from rINST
1645 GOTO_OPCODE ip @ jump to next instruction
1646#else
1647 mov r1, rINST, lsr #12 @ r1<- B
1648 ubfx r0, rINST, #8, #4 @ r0<- A
1649 GET_VREG r3, r1 @ r3<- vB
1650 GET_VREG r2, r0 @ r2<- vA
1651 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1652 FETCH_S r1, 1 @ r1<- branch offset, in code units
1653 cmp r2, r3 @ compare (vA, vB)
1654 movle r1, #2 @ r1<- BYTE branch dist for not-taken
1655 adds r2, r1, r1 @ convert to bytes, check sign
1656 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1657 bmi MterpCheckSuspendAndContinue
1658 GET_INST_OPCODE ip @ extract opcode from rINST
1659 GOTO_OPCODE ip @ jump to next instruction
1660#endif
1661
1662
1663/* ------------------------------ */
1664 .balign 128
1665.L_op_if_le: /* 0x37 */
1666/* File: arm/op_if_le.S */
1667/* File: arm/bincmp.S */
1668 /*
1669 * Generic two-operand compare-and-branch operation. Provide a "revcmp"
1670 * fragment that specifies the *reverse* comparison to perform, e.g.
1671 * for "if-le" you would use "gt".
1672 *
1673 * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1674 */
1675 /* if-cmp vA, vB, +CCCC */
1676#if MTERP_SUSPEND
1677 mov r1, rINST, lsr #12 @ r1<- B
1678 ubfx r0, rINST, #8, #4 @ r0<- A
1679 GET_VREG r3, r1 @ r3<- vB
1680 GET_VREG r2, r0 @ r2<- vA
1681 FETCH_S r1, 1 @ r1<- branch offset, in code units
1682 cmp r2, r3 @ compare (vA, vB)
1683 movgt r1, #2 @ r1<- BYTE branch dist for not-taken
1684 adds r2, r1, r1 @ convert to bytes, check sign
1685 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1686 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh rIBASE
1687 GET_INST_OPCODE ip @ extract opcode from rINST
1688 GOTO_OPCODE ip @ jump to next instruction
1689#else
1690 mov r1, rINST, lsr #12 @ r1<- B
1691 ubfx r0, rINST, #8, #4 @ r0<- A
1692 GET_VREG r3, r1 @ r3<- vB
1693 GET_VREG r2, r0 @ r2<- vA
1694 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1695 FETCH_S r1, 1 @ r1<- branch offset, in code units
1696 cmp r2, r3 @ compare (vA, vB)
1697 movgt r1, #2 @ r1<- BYTE branch dist for not-taken
1698 adds r2, r1, r1 @ convert to bytes, check sign
1699 FETCH_ADVANCE_INST_RB r2 @ update rPC, load rINST
1700 bmi MterpCheckSuspendAndContinue
1701 GET_INST_OPCODE ip @ extract opcode from rINST
1702 GOTO_OPCODE ip @ jump to next instruction
1703#endif
1704
1705
1706/* ------------------------------ */
1707 .balign 128
1708.L_op_if_eqz: /* 0x38 */
1709/* File: arm/op_if_eqz.S */
1710/* File: arm/zcmp.S */
1711 /*
1712 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1713 * fragment that specifies the *reverse* comparison to perform, e.g.
1714 * for "if-le" you would use "gt".
1715 *
1716 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1717 */
1718 /* if-cmp vAA, +BBBB */
1719#if MTERP_SUSPEND
1720 mov r0, rINST, lsr #8 @ r0<- AA
1721 GET_VREG r2, r0 @ r2<- vAA
1722 FETCH_S r1, 1 @ r1<- branch offset, in code units
1723 cmp r2, #0 @ compare (vA, 0)
1724 movne r1, #2 @ r1<- inst branch dist for not-taken
1725 adds r1, r1, r1 @ convert to bytes & set flags
1726 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1727 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh table base
1728 GET_INST_OPCODE ip @ extract opcode from rINST
1729 GOTO_OPCODE ip @ jump to next instruction
1730#else
1731 mov r0, rINST, lsr #8 @ r0<- AA
1732 GET_VREG r2, r0 @ r2<- vAA
1733 FETCH_S r1, 1 @ r1<- branch offset, in code units
1734 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1735 cmp r2, #0 @ compare (vA, 0)
1736 movne r1, #2 @ r1<- inst branch dist for not-taken
1737 adds r1, r1, r1 @ convert to bytes & set flags
1738 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1739 bmi MterpCheckSuspendAndContinue
1740 GET_INST_OPCODE ip @ extract opcode from rINST
1741 GOTO_OPCODE ip @ jump to next instruction
1742#endif
1743
1744
1745/* ------------------------------ */
1746 .balign 128
1747.L_op_if_nez: /* 0x39 */
1748/* File: arm/op_if_nez.S */
1749/* File: arm/zcmp.S */
1750 /*
1751 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1752 * fragment that specifies the *reverse* comparison to perform, e.g.
1753 * for "if-le" you would use "gt".
1754 *
1755 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1756 */
1757 /* if-cmp vAA, +BBBB */
1758#if MTERP_SUSPEND
1759 mov r0, rINST, lsr #8 @ r0<- AA
1760 GET_VREG r2, r0 @ r2<- vAA
1761 FETCH_S r1, 1 @ r1<- branch offset, in code units
1762 cmp r2, #0 @ compare (vA, 0)
1763 moveq r1, #2 @ r1<- inst branch dist for not-taken
1764 adds r1, r1, r1 @ convert to bytes & set flags
1765 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1766 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh table base
1767 GET_INST_OPCODE ip @ extract opcode from rINST
1768 GOTO_OPCODE ip @ jump to next instruction
1769#else
1770 mov r0, rINST, lsr #8 @ r0<- AA
1771 GET_VREG r2, r0 @ r2<- vAA
1772 FETCH_S r1, 1 @ r1<- branch offset, in code units
1773 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1774 cmp r2, #0 @ compare (vA, 0)
1775 moveq r1, #2 @ r1<- inst branch dist for not-taken
1776 adds r1, r1, r1 @ convert to bytes & set flags
1777 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1778 bmi MterpCheckSuspendAndContinue
1779 GET_INST_OPCODE ip @ extract opcode from rINST
1780 GOTO_OPCODE ip @ jump to next instruction
1781#endif
1782
1783
1784/* ------------------------------ */
1785 .balign 128
1786.L_op_if_ltz: /* 0x3a */
1787/* File: arm/op_if_ltz.S */
1788/* File: arm/zcmp.S */
1789 /*
1790 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1791 * fragment that specifies the *reverse* comparison to perform, e.g.
1792 * for "if-le" you would use "gt".
1793 *
1794 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1795 */
1796 /* if-cmp vAA, +BBBB */
1797#if MTERP_SUSPEND
1798 mov r0, rINST, lsr #8 @ r0<- AA
1799 GET_VREG r2, r0 @ r2<- vAA
1800 FETCH_S r1, 1 @ r1<- branch offset, in code units
1801 cmp r2, #0 @ compare (vA, 0)
1802 movge r1, #2 @ r1<- inst branch dist for not-taken
1803 adds r1, r1, r1 @ convert to bytes & set flags
1804 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1805 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh table base
1806 GET_INST_OPCODE ip @ extract opcode from rINST
1807 GOTO_OPCODE ip @ jump to next instruction
1808#else
1809 mov r0, rINST, lsr #8 @ r0<- AA
1810 GET_VREG r2, r0 @ r2<- vAA
1811 FETCH_S r1, 1 @ r1<- branch offset, in code units
1812 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1813 cmp r2, #0 @ compare (vA, 0)
1814 movge r1, #2 @ r1<- inst branch dist for not-taken
1815 adds r1, r1, r1 @ convert to bytes & set flags
1816 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1817 bmi MterpCheckSuspendAndContinue
1818 GET_INST_OPCODE ip @ extract opcode from rINST
1819 GOTO_OPCODE ip @ jump to next instruction
1820#endif
1821
1822
1823/* ------------------------------ */
1824 .balign 128
1825.L_op_if_gez: /* 0x3b */
1826/* File: arm/op_if_gez.S */
1827/* File: arm/zcmp.S */
1828 /*
1829 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1830 * fragment that specifies the *reverse* comparison to perform, e.g.
1831 * for "if-le" you would use "gt".
1832 *
1833 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1834 */
1835 /* if-cmp vAA, +BBBB */
1836#if MTERP_SUSPEND
1837 mov r0, rINST, lsr #8 @ r0<- AA
1838 GET_VREG r2, r0 @ r2<- vAA
1839 FETCH_S r1, 1 @ r1<- branch offset, in code units
1840 cmp r2, #0 @ compare (vA, 0)
1841 movlt r1, #2 @ r1<- inst branch dist for not-taken
1842 adds r1, r1, r1 @ convert to bytes & set flags
1843 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1844 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh table base
1845 GET_INST_OPCODE ip @ extract opcode from rINST
1846 GOTO_OPCODE ip @ jump to next instruction
1847#else
1848 mov r0, rINST, lsr #8 @ r0<- AA
1849 GET_VREG r2, r0 @ r2<- vAA
1850 FETCH_S r1, 1 @ r1<- branch offset, in code units
1851 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1852 cmp r2, #0 @ compare (vA, 0)
1853 movlt r1, #2 @ r1<- inst branch dist for not-taken
1854 adds r1, r1, r1 @ convert to bytes & set flags
1855 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1856 bmi MterpCheckSuspendAndContinue
1857 GET_INST_OPCODE ip @ extract opcode from rINST
1858 GOTO_OPCODE ip @ jump to next instruction
1859#endif
1860
1861
1862/* ------------------------------ */
1863 .balign 128
1864.L_op_if_gtz: /* 0x3c */
1865/* File: arm/op_if_gtz.S */
1866/* File: arm/zcmp.S */
1867 /*
1868 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1869 * fragment that specifies the *reverse* comparison to perform, e.g.
1870 * for "if-le" you would use "gt".
1871 *
1872 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1873 */
1874 /* if-cmp vAA, +BBBB */
1875#if MTERP_SUSPEND
1876 mov r0, rINST, lsr #8 @ r0<- AA
1877 GET_VREG r2, r0 @ r2<- vAA
1878 FETCH_S r1, 1 @ r1<- branch offset, in code units
1879 cmp r2, #0 @ compare (vA, 0)
1880 movle r1, #2 @ r1<- inst branch dist for not-taken
1881 adds r1, r1, r1 @ convert to bytes & set flags
1882 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1883 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh table base
1884 GET_INST_OPCODE ip @ extract opcode from rINST
1885 GOTO_OPCODE ip @ jump to next instruction
1886#else
1887 mov r0, rINST, lsr #8 @ r0<- AA
1888 GET_VREG r2, r0 @ r2<- vAA
1889 FETCH_S r1, 1 @ r1<- branch offset, in code units
1890 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1891 cmp r2, #0 @ compare (vA, 0)
1892 movle r1, #2 @ r1<- inst branch dist for not-taken
1893 adds r1, r1, r1 @ convert to bytes & set flags
1894 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1895 bmi MterpCheckSuspendAndContinue
1896 GET_INST_OPCODE ip @ extract opcode from rINST
1897 GOTO_OPCODE ip @ jump to next instruction
1898#endif
1899
1900
1901/* ------------------------------ */
1902 .balign 128
1903.L_op_if_lez: /* 0x3d */
1904/* File: arm/op_if_lez.S */
1905/* File: arm/zcmp.S */
1906 /*
1907 * Generic one-operand compare-and-branch operation. Provide a "revcmp"
1908 * fragment that specifies the *reverse* comparison to perform, e.g.
1909 * for "if-le" you would use "gt".
1910 *
1911 * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1912 */
1913 /* if-cmp vAA, +BBBB */
1914#if MTERP_SUSPEND
1915 mov r0, rINST, lsr #8 @ r0<- AA
1916 GET_VREG r2, r0 @ r2<- vAA
1917 FETCH_S r1, 1 @ r1<- branch offset, in code units
1918 cmp r2, #0 @ compare (vA, 0)
1919 movgt r1, #2 @ r1<- inst branch dist for not-taken
1920 adds r1, r1, r1 @ convert to bytes & set flags
1921 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1922 ldrmi rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh table base
1923 GET_INST_OPCODE ip @ extract opcode from rINST
1924 GOTO_OPCODE ip @ jump to next instruction
1925#else
1926 mov r0, rINST, lsr #8 @ r0<- AA
1927 GET_VREG r2, r0 @ r2<- vAA
1928 FETCH_S r1, 1 @ r1<- branch offset, in code units
1929 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
1930 cmp r2, #0 @ compare (vA, 0)
1931 movgt r1, #2 @ r1<- inst branch dist for not-taken
1932 adds r1, r1, r1 @ convert to bytes & set flags
1933 FETCH_ADVANCE_INST_RB r1 @ update rPC, load rINST
1934 bmi MterpCheckSuspendAndContinue
1935 GET_INST_OPCODE ip @ extract opcode from rINST
1936 GOTO_OPCODE ip @ jump to next instruction
1937#endif
1938
1939
1940/* ------------------------------ */
1941 .balign 128
1942.L_op_unused_3e: /* 0x3e */
1943/* File: arm/op_unused_3e.S */
1944/* File: arm/unused.S */
1945/*
1946 * Bail to reference interpreter to throw.
1947 */
1948 b MterpFallback
1949
1950
1951/* ------------------------------ */
1952 .balign 128
1953.L_op_unused_3f: /* 0x3f */
1954/* File: arm/op_unused_3f.S */
1955/* File: arm/unused.S */
1956/*
1957 * Bail to reference interpreter to throw.
1958 */
1959 b MterpFallback
1960
1961
1962/* ------------------------------ */
1963 .balign 128
1964.L_op_unused_40: /* 0x40 */
1965/* File: arm/op_unused_40.S */
1966/* File: arm/unused.S */
1967/*
1968 * Bail to reference interpreter to throw.
1969 */
1970 b MterpFallback
1971
1972
1973/* ------------------------------ */
1974 .balign 128
1975.L_op_unused_41: /* 0x41 */
1976/* File: arm/op_unused_41.S */
1977/* File: arm/unused.S */
1978/*
1979 * Bail to reference interpreter to throw.
1980 */
1981 b MterpFallback
1982
1983
1984/* ------------------------------ */
1985 .balign 128
1986.L_op_unused_42: /* 0x42 */
1987/* File: arm/op_unused_42.S */
1988/* File: arm/unused.S */
1989/*
1990 * Bail to reference interpreter to throw.
1991 */
1992 b MterpFallback
1993
1994
1995/* ------------------------------ */
1996 .balign 128
1997.L_op_unused_43: /* 0x43 */
1998/* File: arm/op_unused_43.S */
1999/* File: arm/unused.S */
2000/*
2001 * Bail to reference interpreter to throw.
2002 */
2003 b MterpFallback
2004
2005
2006/* ------------------------------ */
2007 .balign 128
2008.L_op_aget: /* 0x44 */
2009/* File: arm/op_aget.S */
2010 /*
2011 * Array get, 32 bits or less. vAA <- vBB[vCC].
2012 *
2013 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2014 * instructions. We use a pair of FETCH_Bs instead.
2015 *
2016 * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2017 *
2018 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2019 * If this changes, specialize.
2020 */
2021 /* op vAA, vBB, vCC */
2022 FETCH_B r2, 1, 0 @ r2<- BB
2023 mov r9, rINST, lsr #8 @ r9<- AA
2024 FETCH_B r3, 1, 1 @ r3<- CC
2025 GET_VREG r0, r2 @ r0<- vBB (array object)
2026 GET_VREG r1, r3 @ r1<- vCC (requested index)
2027 cmp r0, #0 @ null array object?
2028 beq common_errNullObject @ yes, bail
2029 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2030 add r0, r0, r1, lsl #2 @ r0<- arrayObj + index*width
2031 cmp r1, r3 @ compare unsigned index, length
2032 bcs common_errArrayIndex @ index >= length, bail
2033 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2034 ldr r2, [r0, #MIRROR_INT_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2035 GET_INST_OPCODE ip @ extract opcode from rINST
2036 .if 0
2037 SET_VREG_OBJECT r2, r9 @ vAA<- r2
2038 .else
2039 SET_VREG r2, r9 @ vAA<- r2
2040 .endif
2041 GOTO_OPCODE ip @ jump to next instruction
2042
2043/* ------------------------------ */
2044 .balign 128
2045.L_op_aget_wide: /* 0x45 */
2046/* File: arm/op_aget_wide.S */
2047 /*
2048 * Array get, 64 bits. vAA <- vBB[vCC].
2049 *
2050 * Arrays of long/double are 64-bit aligned, so it's okay to use LDRD.
2051 */
2052 /* aget-wide vAA, vBB, vCC */
2053 FETCH r0, 1 @ r0<- CCBB
2054 mov r9, rINST, lsr #8 @ r9<- AA
2055 and r2, r0, #255 @ r2<- BB
2056 mov r3, r0, lsr #8 @ r3<- CC
2057 GET_VREG r0, r2 @ r0<- vBB (array object)
2058 GET_VREG r1, r3 @ r1<- vCC (requested index)
2059 cmp r0, #0 @ null array object?
2060 beq common_errNullObject @ yes, bail
2061 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2062 add r0, r0, r1, lsl #3 @ r0<- arrayObj + index*width
2063 cmp r1, r3 @ compare unsigned index, length
2064 bcs common_errArrayIndex @ index >= length, bail
2065 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2066 ldrd r2, [r0, #MIRROR_WIDE_ARRAY_DATA_OFFSET] @ r2/r3<- vBB[vCC]
2067 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
2068 GET_INST_OPCODE ip @ extract opcode from rINST
2069 stmia r9, {r2-r3} @ vAA/vAA+1<- r2/r3
2070 GOTO_OPCODE ip @ jump to next instruction
2071
2072/* ------------------------------ */
2073 .balign 128
2074.L_op_aget_object: /* 0x46 */
2075/* File: arm/op_aget_object.S */
2076 /*
2077 * Array object get. vAA <- vBB[vCC].
2078 *
2079 * for: aget-object
2080 */
2081 /* op vAA, vBB, vCC */
2082 FETCH_B r2, 1, 0 @ r2<- BB
2083 mov r9, rINST, lsr #8 @ r9<- AA
2084 FETCH_B r3, 1, 1 @ r3<- CC
2085 EXPORT_PC
2086 GET_VREG r0, r2 @ r0<- vBB (array object)
2087 GET_VREG r1, r3 @ r1<- vCC (requested index)
2088 bl artAGetObjectFromMterp @ (array, index)
2089 ldr r1, [rSELF, #THREAD_EXCEPTION_OFFSET]
2090 PREFETCH_INST 2
2091 cmp r1, #0
2092 bne MterpException
2093 SET_VREG_OBJECT r0, r9
2094 ADVANCE 2
2095 GET_INST_OPCODE ip
2096 GOTO_OPCODE ip @ jump to next instruction
2097
2098/* ------------------------------ */
2099 .balign 128
2100.L_op_aget_boolean: /* 0x47 */
2101/* File: arm/op_aget_boolean.S */
2102/* File: arm/op_aget.S */
2103 /*
2104 * Array get, 32 bits or less. vAA <- vBB[vCC].
2105 *
2106 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2107 * instructions. We use a pair of FETCH_Bs instead.
2108 *
2109 * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2110 *
2111 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2112 * If this changes, specialize.
2113 */
2114 /* op vAA, vBB, vCC */
2115 FETCH_B r2, 1, 0 @ r2<- BB
2116 mov r9, rINST, lsr #8 @ r9<- AA
2117 FETCH_B r3, 1, 1 @ r3<- CC
2118 GET_VREG r0, r2 @ r0<- vBB (array object)
2119 GET_VREG r1, r3 @ r1<- vCC (requested index)
2120 cmp r0, #0 @ null array object?
2121 beq common_errNullObject @ yes, bail
2122 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2123 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2124 cmp r1, r3 @ compare unsigned index, length
2125 bcs common_errArrayIndex @ index >= length, bail
2126 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2127 ldrb r2, [r0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2128 GET_INST_OPCODE ip @ extract opcode from rINST
2129 .if 0
2130 SET_VREG_OBJECT r2, r9 @ vAA<- r2
2131 .else
2132 SET_VREG r2, r9 @ vAA<- r2
2133 .endif
2134 GOTO_OPCODE ip @ jump to next instruction
2135
2136
2137/* ------------------------------ */
2138 .balign 128
2139.L_op_aget_byte: /* 0x48 */
2140/* File: arm/op_aget_byte.S */
2141/* File: arm/op_aget.S */
2142 /*
2143 * Array get, 32 bits or less. vAA <- vBB[vCC].
2144 *
2145 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2146 * instructions. We use a pair of FETCH_Bs instead.
2147 *
2148 * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2149 *
2150 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2151 * If this changes, specialize.
2152 */
2153 /* op vAA, vBB, vCC */
2154 FETCH_B r2, 1, 0 @ r2<- BB
2155 mov r9, rINST, lsr #8 @ r9<- AA
2156 FETCH_B r3, 1, 1 @ r3<- CC
2157 GET_VREG r0, r2 @ r0<- vBB (array object)
2158 GET_VREG r1, r3 @ r1<- vCC (requested index)
2159 cmp r0, #0 @ null array object?
2160 beq common_errNullObject @ yes, bail
2161 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2162 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2163 cmp r1, r3 @ compare unsigned index, length
2164 bcs common_errArrayIndex @ index >= length, bail
2165 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2166 ldrsb r2, [r0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2167 GET_INST_OPCODE ip @ extract opcode from rINST
2168 .if 0
2169 SET_VREG_OBJECT r2, r9 @ vAA<- r2
2170 .else
2171 SET_VREG r2, r9 @ vAA<- r2
2172 .endif
2173 GOTO_OPCODE ip @ jump to next instruction
2174
2175
2176/* ------------------------------ */
2177 .balign 128
2178.L_op_aget_char: /* 0x49 */
2179/* File: arm/op_aget_char.S */
2180/* File: arm/op_aget.S */
2181 /*
2182 * Array get, 32 bits or less. vAA <- vBB[vCC].
2183 *
2184 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2185 * instructions. We use a pair of FETCH_Bs instead.
2186 *
2187 * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2188 *
2189 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2190 * If this changes, specialize.
2191 */
2192 /* op vAA, vBB, vCC */
2193 FETCH_B r2, 1, 0 @ r2<- BB
2194 mov r9, rINST, lsr #8 @ r9<- AA
2195 FETCH_B r3, 1, 1 @ r3<- CC
2196 GET_VREG r0, r2 @ r0<- vBB (array object)
2197 GET_VREG r1, r3 @ r1<- vCC (requested index)
2198 cmp r0, #0 @ null array object?
2199 beq common_errNullObject @ yes, bail
2200 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2201 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2202 cmp r1, r3 @ compare unsigned index, length
2203 bcs common_errArrayIndex @ index >= length, bail
2204 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2205 ldrh r2, [r0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2206 GET_INST_OPCODE ip @ extract opcode from rINST
2207 .if 0
2208 SET_VREG_OBJECT r2, r9 @ vAA<- r2
2209 .else
2210 SET_VREG r2, r9 @ vAA<- r2
2211 .endif
2212 GOTO_OPCODE ip @ jump to next instruction
2213
2214
2215/* ------------------------------ */
2216 .balign 128
2217.L_op_aget_short: /* 0x4a */
2218/* File: arm/op_aget_short.S */
2219/* File: arm/op_aget.S */
2220 /*
2221 * Array get, 32 bits or less. vAA <- vBB[vCC].
2222 *
2223 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2224 * instructions. We use a pair of FETCH_Bs instead.
2225 *
2226 * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2227 *
2228 * NOTE: assumes data offset for arrays is the same for all non-wide types.
2229 * If this changes, specialize.
2230 */
2231 /* op vAA, vBB, vCC */
2232 FETCH_B r2, 1, 0 @ r2<- BB
2233 mov r9, rINST, lsr #8 @ r9<- AA
2234 FETCH_B r3, 1, 1 @ r3<- CC
2235 GET_VREG r0, r2 @ r0<- vBB (array object)
2236 GET_VREG r1, r3 @ r1<- vCC (requested index)
2237 cmp r0, #0 @ null array object?
2238 beq common_errNullObject @ yes, bail
2239 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2240 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2241 cmp r1, r3 @ compare unsigned index, length
2242 bcs common_errArrayIndex @ index >= length, bail
2243 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2244 ldrsh r2, [r0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] @ r2<- vBB[vCC]
2245 GET_INST_OPCODE ip @ extract opcode from rINST
2246 .if 0
2247 SET_VREG_OBJECT r2, r9 @ vAA<- r2
2248 .else
2249 SET_VREG r2, r9 @ vAA<- r2
2250 .endif
2251 GOTO_OPCODE ip @ jump to next instruction
2252
2253
2254/* ------------------------------ */
2255 .balign 128
2256.L_op_aput: /* 0x4b */
2257/* File: arm/op_aput.S */
2258 /*
2259 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2260 *
2261 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2262 * instructions. We use a pair of FETCH_Bs instead.
2263 *
2264 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2265 *
2266 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2267 * If this changes, specialize.
2268 */
2269 /* op vAA, vBB, vCC */
2270 FETCH_B r2, 1, 0 @ r2<- BB
2271 mov r9, rINST, lsr #8 @ r9<- AA
2272 FETCH_B r3, 1, 1 @ r3<- CC
2273 GET_VREG r0, r2 @ r0<- vBB (array object)
2274 GET_VREG r1, r3 @ r1<- vCC (requested index)
2275 cmp r0, #0 @ null array object?
2276 beq common_errNullObject @ yes, bail
2277 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2278 add r0, r0, r1, lsl #2 @ r0<- arrayObj + index*width
2279 cmp r1, r3 @ compare unsigned index, length
2280 bcs common_errArrayIndex @ index >= length, bail
2281 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2282 GET_VREG r2, r9 @ r2<- vAA
2283 GET_INST_OPCODE ip @ extract opcode from rINST
2284 str r2, [r0, #MIRROR_INT_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2285 GOTO_OPCODE ip @ jump to next instruction
2286
2287/* ------------------------------ */
2288 .balign 128
2289.L_op_aput_wide: /* 0x4c */
2290/* File: arm/op_aput_wide.S */
2291 /*
2292 * Array put, 64 bits. vBB[vCC] <- vAA.
2293 *
2294 * Arrays of long/double are 64-bit aligned, so it's okay to use STRD.
2295 */
2296 /* aput-wide vAA, vBB, vCC */
2297 FETCH r0, 1 @ r0<- CCBB
2298 mov r9, rINST, lsr #8 @ r9<- AA
2299 and r2, r0, #255 @ r2<- BB
2300 mov r3, r0, lsr #8 @ r3<- CC
2301 GET_VREG r0, r2 @ r0<- vBB (array object)
2302 GET_VREG r1, r3 @ r1<- vCC (requested index)
2303 cmp r0, #0 @ null array object?
2304 beq common_errNullObject @ yes, bail
2305 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2306 add r0, r0, r1, lsl #3 @ r0<- arrayObj + index*width
2307 cmp r1, r3 @ compare unsigned index, length
2308 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
2309 bcs common_errArrayIndex @ index >= length, bail
2310 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2311 ldmia r9, {r2-r3} @ r2/r3<- vAA/vAA+1
2312 GET_INST_OPCODE ip @ extract opcode from rINST
2313 strd r2, [r0, #MIRROR_WIDE_ARRAY_DATA_OFFSET] @ r2/r3<- vBB[vCC]
2314 GOTO_OPCODE ip @ jump to next instruction
2315
2316/* ------------------------------ */
2317 .balign 128
2318.L_op_aput_object: /* 0x4d */
2319/* File: arm/op_aput_object.S */
2320 /*
2321 * Store an object into an array. vBB[vCC] <- vAA.
2322 */
2323 /* op vAA, vBB, vCC */
2324 EXPORT_PC
2325 add r0, rFP, #OFF_FP_SHADOWFRAME
2326 mov r1, rPC
2327 mov r2, rINST
2328 bl MterpAputObject
2329 cmp r0, #0
2330 beq MterpPossibleException
2331 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2332 GET_INST_OPCODE ip @ extract opcode from rINST
2333 GOTO_OPCODE ip @ jump to next instruction
2334
2335/* ------------------------------ */
2336 .balign 128
2337.L_op_aput_boolean: /* 0x4e */
2338/* File: arm/op_aput_boolean.S */
2339/* File: arm/op_aput.S */
2340 /*
2341 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2342 *
2343 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2344 * instructions. We use a pair of FETCH_Bs instead.
2345 *
2346 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2347 *
2348 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2349 * If this changes, specialize.
2350 */
2351 /* op vAA, vBB, vCC */
2352 FETCH_B r2, 1, 0 @ r2<- BB
2353 mov r9, rINST, lsr #8 @ r9<- AA
2354 FETCH_B r3, 1, 1 @ r3<- CC
2355 GET_VREG r0, r2 @ r0<- vBB (array object)
2356 GET_VREG r1, r3 @ r1<- vCC (requested index)
2357 cmp r0, #0 @ null array object?
2358 beq common_errNullObject @ yes, bail
2359 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2360 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2361 cmp r1, r3 @ compare unsigned index, length
2362 bcs common_errArrayIndex @ index >= length, bail
2363 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2364 GET_VREG r2, r9 @ r2<- vAA
2365 GET_INST_OPCODE ip @ extract opcode from rINST
2366 strb r2, [r0, #MIRROR_BOOLEAN_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2367 GOTO_OPCODE ip @ jump to next instruction
2368
2369
2370/* ------------------------------ */
2371 .balign 128
2372.L_op_aput_byte: /* 0x4f */
2373/* File: arm/op_aput_byte.S */
2374/* File: arm/op_aput.S */
2375 /*
2376 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2377 *
2378 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2379 * instructions. We use a pair of FETCH_Bs instead.
2380 *
2381 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2382 *
2383 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2384 * If this changes, specialize.
2385 */
2386 /* op vAA, vBB, vCC */
2387 FETCH_B r2, 1, 0 @ r2<- BB
2388 mov r9, rINST, lsr #8 @ r9<- AA
2389 FETCH_B r3, 1, 1 @ r3<- CC
2390 GET_VREG r0, r2 @ r0<- vBB (array object)
2391 GET_VREG r1, r3 @ r1<- vCC (requested index)
2392 cmp r0, #0 @ null array object?
2393 beq common_errNullObject @ yes, bail
2394 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2395 add r0, r0, r1, lsl #0 @ r0<- arrayObj + index*width
2396 cmp r1, r3 @ compare unsigned index, length
2397 bcs common_errArrayIndex @ index >= length, bail
2398 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2399 GET_VREG r2, r9 @ r2<- vAA
2400 GET_INST_OPCODE ip @ extract opcode from rINST
2401 strb r2, [r0, #MIRROR_BYTE_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2402 GOTO_OPCODE ip @ jump to next instruction
2403
2404
2405/* ------------------------------ */
2406 .balign 128
2407.L_op_aput_char: /* 0x50 */
2408/* File: arm/op_aput_char.S */
2409/* File: arm/op_aput.S */
2410 /*
2411 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2412 *
2413 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2414 * instructions. We use a pair of FETCH_Bs instead.
2415 *
2416 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2417 *
2418 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2419 * If this changes, specialize.
2420 */
2421 /* op vAA, vBB, vCC */
2422 FETCH_B r2, 1, 0 @ r2<- BB
2423 mov r9, rINST, lsr #8 @ r9<- AA
2424 FETCH_B r3, 1, 1 @ r3<- CC
2425 GET_VREG r0, r2 @ r0<- vBB (array object)
2426 GET_VREG r1, r3 @ r1<- vCC (requested index)
2427 cmp r0, #0 @ null array object?
2428 beq common_errNullObject @ yes, bail
2429 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2430 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2431 cmp r1, r3 @ compare unsigned index, length
2432 bcs common_errArrayIndex @ index >= length, bail
2433 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2434 GET_VREG r2, r9 @ r2<- vAA
2435 GET_INST_OPCODE ip @ extract opcode from rINST
2436 strh r2, [r0, #MIRROR_CHAR_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2437 GOTO_OPCODE ip @ jump to next instruction
2438
2439
2440/* ------------------------------ */
2441 .balign 128
2442.L_op_aput_short: /* 0x51 */
2443/* File: arm/op_aput_short.S */
2444/* File: arm/op_aput.S */
2445 /*
2446 * Array put, 32 bits or less. vBB[vCC] <- vAA.
2447 *
2448 * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2449 * instructions. We use a pair of FETCH_Bs instead.
2450 *
2451 * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2452 *
2453 * NOTE: this assumes data offset for arrays is the same for all non-wide types.
2454 * If this changes, specialize.
2455 */
2456 /* op vAA, vBB, vCC */
2457 FETCH_B r2, 1, 0 @ r2<- BB
2458 mov r9, rINST, lsr #8 @ r9<- AA
2459 FETCH_B r3, 1, 1 @ r3<- CC
2460 GET_VREG r0, r2 @ r0<- vBB (array object)
2461 GET_VREG r1, r3 @ r1<- vCC (requested index)
2462 cmp r0, #0 @ null array object?
2463 beq common_errNullObject @ yes, bail
2464 ldr r3, [r0, #MIRROR_ARRAY_LENGTH_OFFSET] @ r3<- arrayObj->length
2465 add r0, r0, r1, lsl #1 @ r0<- arrayObj + index*width
2466 cmp r1, r3 @ compare unsigned index, length
2467 bcs common_errArrayIndex @ index >= length, bail
2468 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2469 GET_VREG r2, r9 @ r2<- vAA
2470 GET_INST_OPCODE ip @ extract opcode from rINST
2471 strh r2, [r0, #MIRROR_SHORT_ARRAY_DATA_OFFSET] @ vBB[vCC]<- r2
2472 GOTO_OPCODE ip @ jump to next instruction
2473
2474
2475/* ------------------------------ */
2476 .balign 128
2477.L_op_iget: /* 0x52 */
2478/* File: arm/op_iget.S */
2479 /*
2480 * General instance field get.
2481 *
2482 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2483 */
2484 EXPORT_PC
2485 FETCH r0, 1 @ r0<- field ref CCCC
2486 mov r1, rINST, lsr #12 @ r1<- B
2487 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2488 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2489 mov r3, rSELF @ r3<- self
2490 bl artGet32InstanceFromCode
2491 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2492 ubfx r2, rINST, #8, #4 @ r2<- A
2493 PREFETCH_INST 2
2494 cmp r3, #0
2495 bne MterpPossibleException @ bail out
2496 .if 0
2497 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2498 .else
2499 SET_VREG r0, r2 @ fp[A]<- r0
2500 .endif
2501 ADVANCE 2
2502 GET_INST_OPCODE ip @ extract opcode from rINST
2503 GOTO_OPCODE ip @ jump to next instruction
2504
2505/* ------------------------------ */
2506 .balign 128
2507.L_op_iget_wide: /* 0x53 */
2508/* File: arm/op_iget_wide.S */
2509 /*
2510 * 64-bit instance field get.
2511 *
2512 * for: iget-wide
2513 */
2514 EXPORT_PC
2515 FETCH r0, 1 @ r0<- field ref CCCC
2516 mov r1, rINST, lsr #12 @ r1<- B
2517 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2518 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2519 mov r3, rSELF @ r3<- self
2520 bl artGet64InstanceFromCode
2521 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2522 ubfx r2, rINST, #8, #4 @ r2<- A
2523 PREFETCH_INST 2
2524 cmp r3, #0
2525 bne MterpException @ bail out
2526 add r3, rFP, r2, lsl #2 @ r3<- &fp[A]
2527 stmia r3, {r0-r1} @ fp[A]<- r0/r1
2528 ADVANCE 2
2529 GET_INST_OPCODE ip @ extract opcode from rINST
2530 GOTO_OPCODE ip @ jump to next instruction
2531
2532/* ------------------------------ */
2533 .balign 128
2534.L_op_iget_object: /* 0x54 */
2535/* File: arm/op_iget_object.S */
2536/* File: arm/op_iget.S */
2537 /*
2538 * General instance field get.
2539 *
2540 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2541 */
2542 EXPORT_PC
2543 FETCH r0, 1 @ r0<- field ref CCCC
2544 mov r1, rINST, lsr #12 @ r1<- B
2545 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2546 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2547 mov r3, rSELF @ r3<- self
2548 bl artGetObjInstanceFromCode
2549 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2550 ubfx r2, rINST, #8, #4 @ r2<- A
2551 PREFETCH_INST 2
2552 cmp r3, #0
2553 bne MterpPossibleException @ bail out
2554 .if 1
2555 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2556 .else
2557 SET_VREG r0, r2 @ fp[A]<- r0
2558 .endif
2559 ADVANCE 2
2560 GET_INST_OPCODE ip @ extract opcode from rINST
2561 GOTO_OPCODE ip @ jump to next instruction
2562
2563
2564/* ------------------------------ */
2565 .balign 128
2566.L_op_iget_boolean: /* 0x55 */
2567/* File: arm/op_iget_boolean.S */
2568/* File: arm/op_iget.S */
2569 /*
2570 * General instance field get.
2571 *
2572 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2573 */
2574 EXPORT_PC
2575 FETCH r0, 1 @ r0<- field ref CCCC
2576 mov r1, rINST, lsr #12 @ r1<- B
2577 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2578 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2579 mov r3, rSELF @ r3<- self
2580 bl artGetBooleanInstanceFromCode
2581 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2582 ubfx r2, rINST, #8, #4 @ r2<- A
2583 PREFETCH_INST 2
2584 cmp r3, #0
2585 bne MterpPossibleException @ bail out
2586 .if 0
2587 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2588 .else
2589 SET_VREG r0, r2 @ fp[A]<- r0
2590 .endif
2591 ADVANCE 2
2592 GET_INST_OPCODE ip @ extract opcode from rINST
2593 GOTO_OPCODE ip @ jump to next instruction
2594
2595
2596/* ------------------------------ */
2597 .balign 128
2598.L_op_iget_byte: /* 0x56 */
2599/* File: arm/op_iget_byte.S */
2600/* File: arm/op_iget.S */
2601 /*
2602 * General instance field get.
2603 *
2604 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2605 */
2606 EXPORT_PC
2607 FETCH r0, 1 @ r0<- field ref CCCC
2608 mov r1, rINST, lsr #12 @ r1<- B
2609 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2610 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2611 mov r3, rSELF @ r3<- self
2612 bl artGetByteInstanceFromCode
2613 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2614 ubfx r2, rINST, #8, #4 @ r2<- A
2615 PREFETCH_INST 2
2616 cmp r3, #0
2617 bne MterpPossibleException @ bail out
2618 .if 0
2619 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2620 .else
2621 SET_VREG r0, r2 @ fp[A]<- r0
2622 .endif
2623 ADVANCE 2
2624 GET_INST_OPCODE ip @ extract opcode from rINST
2625 GOTO_OPCODE ip @ jump to next instruction
2626
2627
2628/* ------------------------------ */
2629 .balign 128
2630.L_op_iget_char: /* 0x57 */
2631/* File: arm/op_iget_char.S */
2632/* File: arm/op_iget.S */
2633 /*
2634 * General instance field get.
2635 *
2636 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2637 */
2638 EXPORT_PC
2639 FETCH r0, 1 @ r0<- field ref CCCC
2640 mov r1, rINST, lsr #12 @ r1<- B
2641 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2642 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2643 mov r3, rSELF @ r3<- self
2644 bl artGetCharInstanceFromCode
2645 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2646 ubfx r2, rINST, #8, #4 @ r2<- A
2647 PREFETCH_INST 2
2648 cmp r3, #0
2649 bne MterpPossibleException @ bail out
2650 .if 0
2651 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2652 .else
2653 SET_VREG r0, r2 @ fp[A]<- r0
2654 .endif
2655 ADVANCE 2
2656 GET_INST_OPCODE ip @ extract opcode from rINST
2657 GOTO_OPCODE ip @ jump to next instruction
2658
2659
2660/* ------------------------------ */
2661 .balign 128
2662.L_op_iget_short: /* 0x58 */
2663/* File: arm/op_iget_short.S */
2664/* File: arm/op_iget.S */
2665 /*
2666 * General instance field get.
2667 *
2668 * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2669 */
2670 EXPORT_PC
2671 FETCH r0, 1 @ r0<- field ref CCCC
2672 mov r1, rINST, lsr #12 @ r1<- B
2673 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2674 ldr r2, [rFP, #OFF_FP_METHOD] @ r2<- referrer
2675 mov r3, rSELF @ r3<- self
2676 bl artGetShortInstanceFromCode
2677 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2678 ubfx r2, rINST, #8, #4 @ r2<- A
2679 PREFETCH_INST 2
2680 cmp r3, #0
2681 bne MterpPossibleException @ bail out
2682 .if 0
2683 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
2684 .else
2685 SET_VREG r0, r2 @ fp[A]<- r0
2686 .endif
2687 ADVANCE 2
2688 GET_INST_OPCODE ip @ extract opcode from rINST
2689 GOTO_OPCODE ip @ jump to next instruction
2690
2691
2692/* ------------------------------ */
2693 .balign 128
2694.L_op_iput: /* 0x59 */
2695/* File: arm/op_iput.S */
2696 /*
2697 * General 32-bit instance field put.
2698 *
2699 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2700 */
2701 /* op vA, vB, field@CCCC */
2702 .extern artSet32InstanceFromMterp
2703 EXPORT_PC
2704 FETCH r0, 1 @ r0<- field ref CCCC
2705 mov r1, rINST, lsr #12 @ r1<- B
2706 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2707 ubfx r2, rINST, #8, #4 @ r2<- A
2708 GET_VREG r2, r2 @ r2<- fp[A]
2709 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2710 PREFETCH_INST 2
2711 bl artSet32InstanceFromMterp
2712 cmp r0, #0
2713 bne MterpPossibleException
2714 ADVANCE 2 @ advance rPC
2715 GET_INST_OPCODE ip @ extract opcode from rINST
2716 GOTO_OPCODE ip @ jump to next instruction
2717
2718/* ------------------------------ */
2719 .balign 128
2720.L_op_iput_wide: /* 0x5a */
2721/* File: arm/op_iput_wide.S */
2722 /* iput-wide vA, vB, field@CCCC */
2723 .extern artSet64InstanceFromMterp
2724 EXPORT_PC
2725 FETCH r0, 1 @ r0<- field ref CCCC
2726 mov r1, rINST, lsr #12 @ r1<- B
2727 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2728 ubfx r2, rINST, #8, #4 @ r2<- A
2729 add r2, rFP, r2, lsl #2 @ r2<- &fp[A]
2730 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2731 PREFETCH_INST 2
2732 bl artSet64InstanceFromMterp
2733 cmp r0, #0
2734 bne MterpPossibleException
2735 ADVANCE 2 @ advance rPC
2736 GET_INST_OPCODE ip @ extract opcode from rINST
2737 GOTO_OPCODE ip @ jump to next instruction
2738
2739/* ------------------------------ */
2740 .balign 128
2741.L_op_iput_object: /* 0x5b */
2742/* File: arm/op_iput_object.S */
2743 EXPORT_PC
2744 add r0, rFP, #OFF_FP_SHADOWFRAME
2745 mov r1, rPC
2746 mov r2, rINST
2747 mov r3, rSELF
2748 bl MterpIputObject
2749 cmp r0, #0
2750 beq MterpException
2751 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2752 GET_INST_OPCODE ip @ extract opcode from rINST
2753 GOTO_OPCODE ip @ jump to next instruction
2754
2755/* ------------------------------ */
2756 .balign 128
2757.L_op_iput_boolean: /* 0x5c */
2758/* File: arm/op_iput_boolean.S */
2759/* File: arm/op_iput.S */
2760 /*
2761 * General 32-bit instance field put.
2762 *
2763 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2764 */
2765 /* op vA, vB, field@CCCC */
2766 .extern artSet8InstanceFromMterp
2767 EXPORT_PC
2768 FETCH r0, 1 @ r0<- field ref CCCC
2769 mov r1, rINST, lsr #12 @ r1<- B
2770 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2771 ubfx r2, rINST, #8, #4 @ r2<- A
2772 GET_VREG r2, r2 @ r2<- fp[A]
2773 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2774 PREFETCH_INST 2
2775 bl artSet8InstanceFromMterp
2776 cmp r0, #0
2777 bne MterpPossibleException
2778 ADVANCE 2 @ advance rPC
2779 GET_INST_OPCODE ip @ extract opcode from rINST
2780 GOTO_OPCODE ip @ jump to next instruction
2781
2782
2783/* ------------------------------ */
2784 .balign 128
2785.L_op_iput_byte: /* 0x5d */
2786/* File: arm/op_iput_byte.S */
2787/* File: arm/op_iput.S */
2788 /*
2789 * General 32-bit instance field put.
2790 *
2791 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2792 */
2793 /* op vA, vB, field@CCCC */
2794 .extern artSet8InstanceFromMterp
2795 EXPORT_PC
2796 FETCH r0, 1 @ r0<- field ref CCCC
2797 mov r1, rINST, lsr #12 @ r1<- B
2798 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2799 ubfx r2, rINST, #8, #4 @ r2<- A
2800 GET_VREG r2, r2 @ r2<- fp[A]
2801 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2802 PREFETCH_INST 2
2803 bl artSet8InstanceFromMterp
2804 cmp r0, #0
2805 bne MterpPossibleException
2806 ADVANCE 2 @ advance rPC
2807 GET_INST_OPCODE ip @ extract opcode from rINST
2808 GOTO_OPCODE ip @ jump to next instruction
2809
2810
2811/* ------------------------------ */
2812 .balign 128
2813.L_op_iput_char: /* 0x5e */
2814/* File: arm/op_iput_char.S */
2815/* File: arm/op_iput.S */
2816 /*
2817 * General 32-bit instance field put.
2818 *
2819 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2820 */
2821 /* op vA, vB, field@CCCC */
2822 .extern artSet16InstanceFromMterp
2823 EXPORT_PC
2824 FETCH r0, 1 @ r0<- field ref CCCC
2825 mov r1, rINST, lsr #12 @ r1<- B
2826 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2827 ubfx r2, rINST, #8, #4 @ r2<- A
2828 GET_VREG r2, r2 @ r2<- fp[A]
2829 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2830 PREFETCH_INST 2
2831 bl artSet16InstanceFromMterp
2832 cmp r0, #0
2833 bne MterpPossibleException
2834 ADVANCE 2 @ advance rPC
2835 GET_INST_OPCODE ip @ extract opcode from rINST
2836 GOTO_OPCODE ip @ jump to next instruction
2837
2838
2839/* ------------------------------ */
2840 .balign 128
2841.L_op_iput_short: /* 0x5f */
2842/* File: arm/op_iput_short.S */
2843/* File: arm/op_iput.S */
2844 /*
2845 * General 32-bit instance field put.
2846 *
2847 * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2848 */
2849 /* op vA, vB, field@CCCC */
2850 .extern artSet16InstanceFromMterp
2851 EXPORT_PC
2852 FETCH r0, 1 @ r0<- field ref CCCC
2853 mov r1, rINST, lsr #12 @ r1<- B
2854 GET_VREG r1, r1 @ r1<- fp[B], the object pointer
2855 ubfx r2, rINST, #8, #4 @ r2<- A
2856 GET_VREG r2, r2 @ r2<- fp[A]
2857 ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer
2858 PREFETCH_INST 2
2859 bl artSet16InstanceFromMterp
2860 cmp r0, #0
2861 bne MterpPossibleException
2862 ADVANCE 2 @ advance rPC
2863 GET_INST_OPCODE ip @ extract opcode from rINST
2864 GOTO_OPCODE ip @ jump to next instruction
2865
2866
2867/* ------------------------------ */
2868 .balign 128
2869.L_op_sget: /* 0x60 */
2870/* File: arm/op_sget.S */
2871 /*
2872 * General SGET handler wrapper.
2873 *
2874 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2875 */
2876 /* op vAA, field@BBBB */
2877
2878 .extern artGet32StaticFromCode
2879 EXPORT_PC
2880 FETCH r0, 1 @ r0<- field ref BBBB
2881 ldr r1, [rFP, #OFF_FP_METHOD]
2882 mov r2, rSELF
2883 bl artGet32StaticFromCode
2884 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2885 mov r2, rINST, lsr #8 @ r2<- AA
2886 PREFETCH_INST 2
2887 cmp r3, #0 @ Fail to resolve?
2888 bne MterpException @ bail out
2889.if 0
2890 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
2891.else
2892 SET_VREG r0, r2 @ fp[AA]<- r0
2893.endif
2894 ADVANCE 2
2895 GET_INST_OPCODE ip @ extract opcode from rINST
2896 GOTO_OPCODE ip
2897
2898/* ------------------------------ */
2899 .balign 128
2900.L_op_sget_wide: /* 0x61 */
2901/* File: arm/op_sget_wide.S */
2902 /*
2903 * SGET_WIDE handler wrapper.
2904 *
2905 */
2906 /* sget-wide vAA, field@BBBB */
2907
2908 .extern artGet64StaticFromCode
2909 EXPORT_PC
2910 FETCH r0, 1 @ r0<- field ref BBBB
2911 ldr r1, [rFP, #OFF_FP_METHOD]
2912 mov r2, rSELF
2913 bl artGet64StaticFromCode
2914 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2915 mov r9, rINST, lsr #8 @ r9<- AA
2916 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
2917 cmp r3, #0 @ Fail to resolve?
2918 bne MterpException @ bail out
2919 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
2920 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
2921 GET_INST_OPCODE ip @ extract opcode from rINST
2922 GOTO_OPCODE ip @ jump to next instruction
2923
2924/* ------------------------------ */
2925 .balign 128
2926.L_op_sget_object: /* 0x62 */
2927/* File: arm/op_sget_object.S */
2928/* File: arm/op_sget.S */
2929 /*
2930 * General SGET handler wrapper.
2931 *
2932 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2933 */
2934 /* op vAA, field@BBBB */
2935
2936 .extern artGetObjStaticFromCode
2937 EXPORT_PC
2938 FETCH r0, 1 @ r0<- field ref BBBB
2939 ldr r1, [rFP, #OFF_FP_METHOD]
2940 mov r2, rSELF
2941 bl artGetObjStaticFromCode
2942 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2943 mov r2, rINST, lsr #8 @ r2<- AA
2944 PREFETCH_INST 2
2945 cmp r3, #0 @ Fail to resolve?
2946 bne MterpException @ bail out
2947.if 1
2948 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
2949.else
2950 SET_VREG r0, r2 @ fp[AA]<- r0
2951.endif
2952 ADVANCE 2
2953 GET_INST_OPCODE ip @ extract opcode from rINST
2954 GOTO_OPCODE ip
2955
2956
2957/* ------------------------------ */
2958 .balign 128
2959.L_op_sget_boolean: /* 0x63 */
2960/* File: arm/op_sget_boolean.S */
2961/* File: arm/op_sget.S */
2962 /*
2963 * General SGET handler wrapper.
2964 *
2965 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2966 */
2967 /* op vAA, field@BBBB */
2968
2969 .extern artGetBooleanStaticFromCode
2970 EXPORT_PC
2971 FETCH r0, 1 @ r0<- field ref BBBB
2972 ldr r1, [rFP, #OFF_FP_METHOD]
2973 mov r2, rSELF
2974 bl artGetBooleanStaticFromCode
2975 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
2976 mov r2, rINST, lsr #8 @ r2<- AA
2977 PREFETCH_INST 2
2978 cmp r3, #0 @ Fail to resolve?
2979 bne MterpException @ bail out
2980.if 0
2981 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
2982.else
2983 SET_VREG r0, r2 @ fp[AA]<- r0
2984.endif
2985 ADVANCE 2
2986 GET_INST_OPCODE ip @ extract opcode from rINST
2987 GOTO_OPCODE ip
2988
2989
2990/* ------------------------------ */
2991 .balign 128
2992.L_op_sget_byte: /* 0x64 */
2993/* File: arm/op_sget_byte.S */
2994/* File: arm/op_sget.S */
2995 /*
2996 * General SGET handler wrapper.
2997 *
2998 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2999 */
3000 /* op vAA, field@BBBB */
3001
3002 .extern artGetByteStaticFromCode
3003 EXPORT_PC
3004 FETCH r0, 1 @ r0<- field ref BBBB
3005 ldr r1, [rFP, #OFF_FP_METHOD]
3006 mov r2, rSELF
3007 bl artGetByteStaticFromCode
3008 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3009 mov r2, rINST, lsr #8 @ r2<- AA
3010 PREFETCH_INST 2
3011 cmp r3, #0 @ Fail to resolve?
3012 bne MterpException @ bail out
3013.if 0
3014 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3015.else
3016 SET_VREG r0, r2 @ fp[AA]<- r0
3017.endif
3018 ADVANCE 2
3019 GET_INST_OPCODE ip @ extract opcode from rINST
3020 GOTO_OPCODE ip
3021
3022
3023/* ------------------------------ */
3024 .balign 128
3025.L_op_sget_char: /* 0x65 */
3026/* File: arm/op_sget_char.S */
3027/* File: arm/op_sget.S */
3028 /*
3029 * General SGET handler wrapper.
3030 *
3031 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3032 */
3033 /* op vAA, field@BBBB */
3034
3035 .extern artGetCharStaticFromCode
3036 EXPORT_PC
3037 FETCH r0, 1 @ r0<- field ref BBBB
3038 ldr r1, [rFP, #OFF_FP_METHOD]
3039 mov r2, rSELF
3040 bl artGetCharStaticFromCode
3041 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3042 mov r2, rINST, lsr #8 @ r2<- AA
3043 PREFETCH_INST 2
3044 cmp r3, #0 @ Fail to resolve?
3045 bne MterpException @ bail out
3046.if 0
3047 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3048.else
3049 SET_VREG r0, r2 @ fp[AA]<- r0
3050.endif
3051 ADVANCE 2
3052 GET_INST_OPCODE ip @ extract opcode from rINST
3053 GOTO_OPCODE ip
3054
3055
3056/* ------------------------------ */
3057 .balign 128
3058.L_op_sget_short: /* 0x66 */
3059/* File: arm/op_sget_short.S */
3060/* File: arm/op_sget.S */
3061 /*
3062 * General SGET handler wrapper.
3063 *
3064 * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
3065 */
3066 /* op vAA, field@BBBB */
3067
3068 .extern artGetShortStaticFromCode
3069 EXPORT_PC
3070 FETCH r0, 1 @ r0<- field ref BBBB
3071 ldr r1, [rFP, #OFF_FP_METHOD]
3072 mov r2, rSELF
3073 bl artGetShortStaticFromCode
3074 ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET]
3075 mov r2, rINST, lsr #8 @ r2<- AA
3076 PREFETCH_INST 2
3077 cmp r3, #0 @ Fail to resolve?
3078 bne MterpException @ bail out
3079.if 0
3080 SET_VREG_OBJECT r0, r2 @ fp[AA]<- r0
3081.else
3082 SET_VREG r0, r2 @ fp[AA]<- r0
3083.endif
3084 ADVANCE 2
3085 GET_INST_OPCODE ip @ extract opcode from rINST
3086 GOTO_OPCODE ip
3087
3088
3089/* ------------------------------ */
3090 .balign 128
3091.L_op_sput: /* 0x67 */
3092/* File: arm/op_sput.S */
3093 /*
3094 * General SPUT handler wrapper.
3095 *
3096 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3097 */
3098 /* op vAA, field@BBBB */
3099 EXPORT_PC
3100 FETCH r0, 1 @ r0<- field ref BBBB
3101 mov r3, rINST, lsr #8 @ r3<- AA
3102 GET_VREG r1, r3 @ r1<= fp[AA]
3103 ldr r2, [rFP, #OFF_FP_METHOD]
3104 mov r3, rSELF
3105 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3106 bl artSet32StaticFromCode
3107 cmp r0, #0 @ 0 on success, -1 on failure
3108 bne MterpException
3109 ADVANCE 2 @ Past exception point - now advance rPC
3110 GET_INST_OPCODE ip @ extract opcode from rINST
3111 GOTO_OPCODE ip @ jump to next instruction
3112
3113/* ------------------------------ */
3114 .balign 128
3115.L_op_sput_wide: /* 0x68 */
3116/* File: arm/op_sput_wide.S */
3117 /*
3118 * SPUT_WIDE handler wrapper.
3119 *
3120 */
3121 /* sput-wide vAA, field@BBBB */
3122 .extern artSet64IndirectStaticFromMterp
3123 EXPORT_PC
3124 FETCH r0, 1 @ r0<- field ref BBBB
3125 ldr r1, [rFP, #OFF_FP_METHOD]
3126 mov r2, rINST, lsr #8 @ r3<- AA
3127 add r2, rFP, r2, lsl #2
3128 mov r3, rSELF
3129 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3130 bl artSet64IndirectStaticFromMterp
3131 cmp r0, #0 @ 0 on success, -1 on failure
3132 bne MterpException
3133 ADVANCE 2 @ Past exception point - now advance rPC
3134 GET_INST_OPCODE ip @ extract opcode from rINST
3135 GOTO_OPCODE ip @ jump to next instruction
3136
3137/* ------------------------------ */
3138 .balign 128
3139.L_op_sput_object: /* 0x69 */
3140/* File: arm/op_sput_object.S */
3141 EXPORT_PC
3142 add r0, rFP, #OFF_FP_SHADOWFRAME
3143 mov r1, rPC
3144 mov r2, rINST
3145 mov r3, rSELF
3146 bl MterpSputObject
3147 cmp r0, #0
3148 beq MterpException
3149 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
3150 GET_INST_OPCODE ip @ extract opcode from rINST
3151 GOTO_OPCODE ip @ jump to next instruction
3152
3153/* ------------------------------ */
3154 .balign 128
3155.L_op_sput_boolean: /* 0x6a */
3156/* File: arm/op_sput_boolean.S */
3157/* File: arm/op_sput.S */
3158 /*
3159 * General SPUT handler wrapper.
3160 *
3161 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3162 */
3163 /* op vAA, field@BBBB */
3164 EXPORT_PC
3165 FETCH r0, 1 @ r0<- field ref BBBB
3166 mov r3, rINST, lsr #8 @ r3<- AA
3167 GET_VREG r1, r3 @ r1<= fp[AA]
3168 ldr r2, [rFP, #OFF_FP_METHOD]
3169 mov r3, rSELF
3170 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3171 bl artSet8StaticFromCode
3172 cmp r0, #0 @ 0 on success, -1 on failure
3173 bne MterpException
3174 ADVANCE 2 @ Past exception point - now advance rPC
3175 GET_INST_OPCODE ip @ extract opcode from rINST
3176 GOTO_OPCODE ip @ jump to next instruction
3177
3178
3179/* ------------------------------ */
3180 .balign 128
3181.L_op_sput_byte: /* 0x6b */
3182/* File: arm/op_sput_byte.S */
3183/* File: arm/op_sput.S */
3184 /*
3185 * General SPUT handler wrapper.
3186 *
3187 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3188 */
3189 /* op vAA, field@BBBB */
3190 EXPORT_PC
3191 FETCH r0, 1 @ r0<- field ref BBBB
3192 mov r3, rINST, lsr #8 @ r3<- AA
3193 GET_VREG r1, r3 @ r1<= fp[AA]
3194 ldr r2, [rFP, #OFF_FP_METHOD]
3195 mov r3, rSELF
3196 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3197 bl artSet8StaticFromCode
3198 cmp r0, #0 @ 0 on success, -1 on failure
3199 bne MterpException
3200 ADVANCE 2 @ Past exception point - now advance rPC
3201 GET_INST_OPCODE ip @ extract opcode from rINST
3202 GOTO_OPCODE ip @ jump to next instruction
3203
3204
3205/* ------------------------------ */
3206 .balign 128
3207.L_op_sput_char: /* 0x6c */
3208/* File: arm/op_sput_char.S */
3209/* File: arm/op_sput.S */
3210 /*
3211 * General SPUT handler wrapper.
3212 *
3213 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3214 */
3215 /* op vAA, field@BBBB */
3216 EXPORT_PC
3217 FETCH r0, 1 @ r0<- field ref BBBB
3218 mov r3, rINST, lsr #8 @ r3<- AA
3219 GET_VREG r1, r3 @ r1<= fp[AA]
3220 ldr r2, [rFP, #OFF_FP_METHOD]
3221 mov r3, rSELF
3222 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3223 bl artSet16StaticFromCode
3224 cmp r0, #0 @ 0 on success, -1 on failure
3225 bne MterpException
3226 ADVANCE 2 @ Past exception point - now advance rPC
3227 GET_INST_OPCODE ip @ extract opcode from rINST
3228 GOTO_OPCODE ip @ jump to next instruction
3229
3230
3231/* ------------------------------ */
3232 .balign 128
3233.L_op_sput_short: /* 0x6d */
3234/* File: arm/op_sput_short.S */
3235/* File: arm/op_sput.S */
3236 /*
3237 * General SPUT handler wrapper.
3238 *
3239 * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3240 */
3241 /* op vAA, field@BBBB */
3242 EXPORT_PC
3243 FETCH r0, 1 @ r0<- field ref BBBB
3244 mov r3, rINST, lsr #8 @ r3<- AA
3245 GET_VREG r1, r3 @ r1<= fp[AA]
3246 ldr r2, [rFP, #OFF_FP_METHOD]
3247 mov r3, rSELF
3248 PREFETCH_INST 2 @ Get next inst, but don't advance rPC
3249 bl artSet16StaticFromCode
3250 cmp r0, #0 @ 0 on success, -1 on failure
3251 bne MterpException
3252 ADVANCE 2 @ Past exception point - now advance rPC
3253 GET_INST_OPCODE ip @ extract opcode from rINST
3254 GOTO_OPCODE ip @ jump to next instruction
3255
3256
3257/* ------------------------------ */
3258 .balign 128
3259.L_op_invoke_virtual: /* 0x6e */
3260/* File: arm/op_invoke_virtual.S */
3261/* File: arm/invoke.S */
3262 /*
3263 * Generic invoke handler wrapper.
3264 */
3265 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3266 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3267 .extern MterpInvokeVirtual
3268 EXPORT_PC
3269 mov r0, rSELF
3270 add r1, rFP, #OFF_FP_SHADOWFRAME
3271 mov r2, rPC
3272 mov r3, rINST
3273 bl MterpInvokeVirtual
3274 cmp r0, #0
3275 beq MterpException
3276 FETCH_ADVANCE_INST 3
3277 GET_INST_OPCODE ip
3278 GOTO_OPCODE ip
3279
3280
3281 /*
3282 * Handle a virtual method call.
3283 *
3284 * for: invoke-virtual, invoke-virtual/range
3285 */
3286 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3287 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3288
3289/* ------------------------------ */
3290 .balign 128
3291.L_op_invoke_super: /* 0x6f */
3292/* File: arm/op_invoke_super.S */
3293/* File: arm/invoke.S */
3294 /*
3295 * Generic invoke handler wrapper.
3296 */
3297 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3298 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3299 .extern MterpInvokeSuper
3300 EXPORT_PC
3301 mov r0, rSELF
3302 add r1, rFP, #OFF_FP_SHADOWFRAME
3303 mov r2, rPC
3304 mov r3, rINST
3305 bl MterpInvokeSuper
3306 cmp r0, #0
3307 beq MterpException
3308 FETCH_ADVANCE_INST 3
3309 GET_INST_OPCODE ip
3310 GOTO_OPCODE ip
3311
3312
3313 /*
3314 * Handle a "super" method call.
3315 *
3316 * for: invoke-super, invoke-super/range
3317 */
3318 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3319 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3320
3321/* ------------------------------ */
3322 .balign 128
3323.L_op_invoke_direct: /* 0x70 */
3324/* File: arm/op_invoke_direct.S */
3325/* File: arm/invoke.S */
3326 /*
3327 * Generic invoke handler wrapper.
3328 */
3329 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3330 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3331 .extern MterpInvokeDirect
3332 EXPORT_PC
3333 mov r0, rSELF
3334 add r1, rFP, #OFF_FP_SHADOWFRAME
3335 mov r2, rPC
3336 mov r3, rINST
3337 bl MterpInvokeDirect
3338 cmp r0, #0
3339 beq MterpException
3340 FETCH_ADVANCE_INST 3
3341 GET_INST_OPCODE ip
3342 GOTO_OPCODE ip
3343
3344
3345
3346/* ------------------------------ */
3347 .balign 128
3348.L_op_invoke_static: /* 0x71 */
3349/* File: arm/op_invoke_static.S */
3350/* File: arm/invoke.S */
3351 /*
3352 * Generic invoke handler wrapper.
3353 */
3354 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3355 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3356 .extern MterpInvokeStatic
3357 EXPORT_PC
3358 mov r0, rSELF
3359 add r1, rFP, #OFF_FP_SHADOWFRAME
3360 mov r2, rPC
3361 mov r3, rINST
3362 bl MterpInvokeStatic
3363 cmp r0, #0
3364 beq MterpException
3365 FETCH_ADVANCE_INST 3
3366 GET_INST_OPCODE ip
3367 GOTO_OPCODE ip
3368
3369
3370
3371
3372/* ------------------------------ */
3373 .balign 128
3374.L_op_invoke_interface: /* 0x72 */
3375/* File: arm/op_invoke_interface.S */
3376/* File: arm/invoke.S */
3377 /*
3378 * Generic invoke handler wrapper.
3379 */
3380 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3381 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3382 .extern MterpInvokeInterface
3383 EXPORT_PC
3384 mov r0, rSELF
3385 add r1, rFP, #OFF_FP_SHADOWFRAME
3386 mov r2, rPC
3387 mov r3, rINST
3388 bl MterpInvokeInterface
3389 cmp r0, #0
3390 beq MterpException
3391 FETCH_ADVANCE_INST 3
3392 GET_INST_OPCODE ip
3393 GOTO_OPCODE ip
3394
3395
3396 /*
3397 * Handle an interface method call.
3398 *
3399 * for: invoke-interface, invoke-interface/range
3400 */
3401 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3402 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3403
3404/* ------------------------------ */
3405 .balign 128
3406.L_op_return_void_no_barrier: /* 0x73 */
3407/* File: arm/op_return_void_no_barrier.S */
3408 mov r0, #0
3409 mov r1, #0
3410 b MterpReturn
3411
3412/* ------------------------------ */
3413 .balign 128
3414.L_op_invoke_virtual_range: /* 0x74 */
3415/* File: arm/op_invoke_virtual_range.S */
3416/* File: arm/invoke.S */
3417 /*
3418 * Generic invoke handler wrapper.
3419 */
3420 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3421 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3422 .extern MterpInvokeVirtualRange
3423 EXPORT_PC
3424 mov r0, rSELF
3425 add r1, rFP, #OFF_FP_SHADOWFRAME
3426 mov r2, rPC
3427 mov r3, rINST
3428 bl MterpInvokeVirtualRange
3429 cmp r0, #0
3430 beq MterpException
3431 FETCH_ADVANCE_INST 3
3432 GET_INST_OPCODE ip
3433 GOTO_OPCODE ip
3434
3435
3436
3437/* ------------------------------ */
3438 .balign 128
3439.L_op_invoke_super_range: /* 0x75 */
3440/* File: arm/op_invoke_super_range.S */
3441/* File: arm/invoke.S */
3442 /*
3443 * Generic invoke handler wrapper.
3444 */
3445 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3446 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3447 .extern MterpInvokeSuperRange
3448 EXPORT_PC
3449 mov r0, rSELF
3450 add r1, rFP, #OFF_FP_SHADOWFRAME
3451 mov r2, rPC
3452 mov r3, rINST
3453 bl MterpInvokeSuperRange
3454 cmp r0, #0
3455 beq MterpException
3456 FETCH_ADVANCE_INST 3
3457 GET_INST_OPCODE ip
3458 GOTO_OPCODE ip
3459
3460
3461
3462/* ------------------------------ */
3463 .balign 128
3464.L_op_invoke_direct_range: /* 0x76 */
3465/* File: arm/op_invoke_direct_range.S */
3466/* File: arm/invoke.S */
3467 /*
3468 * Generic invoke handler wrapper.
3469 */
3470 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3471 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3472 .extern MterpInvokeDirectRange
3473 EXPORT_PC
3474 mov r0, rSELF
3475 add r1, rFP, #OFF_FP_SHADOWFRAME
3476 mov r2, rPC
3477 mov r3, rINST
3478 bl MterpInvokeDirectRange
3479 cmp r0, #0
3480 beq MterpException
3481 FETCH_ADVANCE_INST 3
3482 GET_INST_OPCODE ip
3483 GOTO_OPCODE ip
3484
3485
3486
3487/* ------------------------------ */
3488 .balign 128
3489.L_op_invoke_static_range: /* 0x77 */
3490/* File: arm/op_invoke_static_range.S */
3491/* File: arm/invoke.S */
3492 /*
3493 * Generic invoke handler wrapper.
3494 */
3495 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3496 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3497 .extern MterpInvokeStaticRange
3498 EXPORT_PC
3499 mov r0, rSELF
3500 add r1, rFP, #OFF_FP_SHADOWFRAME
3501 mov r2, rPC
3502 mov r3, rINST
3503 bl MterpInvokeStaticRange
3504 cmp r0, #0
3505 beq MterpException
3506 FETCH_ADVANCE_INST 3
3507 GET_INST_OPCODE ip
3508 GOTO_OPCODE ip
3509
3510
3511
3512/* ------------------------------ */
3513 .balign 128
3514.L_op_invoke_interface_range: /* 0x78 */
3515/* File: arm/op_invoke_interface_range.S */
3516/* File: arm/invoke.S */
3517 /*
3518 * Generic invoke handler wrapper.
3519 */
3520 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3521 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3522 .extern MterpInvokeInterfaceRange
3523 EXPORT_PC
3524 mov r0, rSELF
3525 add r1, rFP, #OFF_FP_SHADOWFRAME
3526 mov r2, rPC
3527 mov r3, rINST
3528 bl MterpInvokeInterfaceRange
3529 cmp r0, #0
3530 beq MterpException
3531 FETCH_ADVANCE_INST 3
3532 GET_INST_OPCODE ip
3533 GOTO_OPCODE ip
3534
3535
3536
3537/* ------------------------------ */
3538 .balign 128
3539.L_op_unused_79: /* 0x79 */
3540/* File: arm/op_unused_79.S */
3541/* File: arm/unused.S */
3542/*
3543 * Bail to reference interpreter to throw.
3544 */
3545 b MterpFallback
3546
3547
3548/* ------------------------------ */
3549 .balign 128
3550.L_op_unused_7a: /* 0x7a */
3551/* File: arm/op_unused_7a.S */
3552/* File: arm/unused.S */
3553/*
3554 * Bail to reference interpreter to throw.
3555 */
3556 b MterpFallback
3557
3558
3559/* ------------------------------ */
3560 .balign 128
3561.L_op_neg_int: /* 0x7b */
3562/* File: arm/op_neg_int.S */
3563/* File: arm/unop.S */
3564 /*
3565 * Generic 32-bit unary operation. Provide an "instr" line that
3566 * specifies an instruction that performs "result = op r0".
3567 * This could be an ARM instruction or a function call.
3568 *
3569 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3570 * int-to-byte, int-to-char, int-to-short
3571 */
3572 /* unop vA, vB */
3573 mov r3, rINST, lsr #12 @ r3<- B
3574 ubfx r9, rINST, #8, #4 @ r9<- A
3575 GET_VREG r0, r3 @ r0<- vB
3576 @ optional op; may set condition codes
3577 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3578 rsb r0, r0, #0 @ r0<- op, r0-r3 changed
3579 GET_INST_OPCODE ip @ extract opcode from rINST
3580 SET_VREG r0, r9 @ vAA<- r0
3581 GOTO_OPCODE ip @ jump to next instruction
3582 /* 8-9 instructions */
3583
3584
3585/* ------------------------------ */
3586 .balign 128
3587.L_op_not_int: /* 0x7c */
3588/* File: arm/op_not_int.S */
3589/* File: arm/unop.S */
3590 /*
3591 * Generic 32-bit unary operation. Provide an "instr" line that
3592 * specifies an instruction that performs "result = op r0".
3593 * This could be an ARM instruction or a function call.
3594 *
3595 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3596 * int-to-byte, int-to-char, int-to-short
3597 */
3598 /* unop vA, vB */
3599 mov r3, rINST, lsr #12 @ r3<- B
3600 ubfx r9, rINST, #8, #4 @ r9<- A
3601 GET_VREG r0, r3 @ r0<- vB
3602 @ optional op; may set condition codes
3603 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3604 mvn r0, r0 @ r0<- op, r0-r3 changed
3605 GET_INST_OPCODE ip @ extract opcode from rINST
3606 SET_VREG r0, r9 @ vAA<- r0
3607 GOTO_OPCODE ip @ jump to next instruction
3608 /* 8-9 instructions */
3609
3610
3611/* ------------------------------ */
3612 .balign 128
3613.L_op_neg_long: /* 0x7d */
3614/* File: arm/op_neg_long.S */
3615/* File: arm/unopWide.S */
3616 /*
3617 * Generic 64-bit unary operation. Provide an "instr" line that
3618 * specifies an instruction that performs "result = op r0/r1".
3619 * This could be an ARM instruction or a function call.
3620 *
3621 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3622 */
3623 /* unop vA, vB */
3624 mov r3, rINST, lsr #12 @ r3<- B
3625 ubfx r9, rINST, #8, #4 @ r9<- A
3626 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
3627 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
3628 ldmia r3, {r0-r1} @ r0/r1<- vAA
3629 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3630 rsbs r0, r0, #0 @ optional op; may set condition codes
3631 rsc r1, r1, #0 @ r0/r1<- op, r2-r3 changed
3632 GET_INST_OPCODE ip @ extract opcode from rINST
3633 stmia r9, {r0-r1} @ vAA<- r0/r1
3634 GOTO_OPCODE ip @ jump to next instruction
3635 /* 10-11 instructions */
3636
3637
3638/* ------------------------------ */
3639 .balign 128
3640.L_op_not_long: /* 0x7e */
3641/* File: arm/op_not_long.S */
3642/* File: arm/unopWide.S */
3643 /*
3644 * Generic 64-bit unary operation. Provide an "instr" line that
3645 * specifies an instruction that performs "result = op r0/r1".
3646 * This could be an ARM instruction or a function call.
3647 *
3648 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3649 */
3650 /* unop vA, vB */
3651 mov r3, rINST, lsr #12 @ r3<- B
3652 ubfx r9, rINST, #8, #4 @ r9<- A
3653 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
3654 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
3655 ldmia r3, {r0-r1} @ r0/r1<- vAA
3656 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3657 mvn r0, r0 @ optional op; may set condition codes
3658 mvn r1, r1 @ r0/r1<- op, r2-r3 changed
3659 GET_INST_OPCODE ip @ extract opcode from rINST
3660 stmia r9, {r0-r1} @ vAA<- r0/r1
3661 GOTO_OPCODE ip @ jump to next instruction
3662 /* 10-11 instructions */
3663
3664
3665/* ------------------------------ */
3666 .balign 128
3667.L_op_neg_float: /* 0x7f */
3668/* File: arm/op_neg_float.S */
3669/* File: arm/unop.S */
3670 /*
3671 * Generic 32-bit unary operation. Provide an "instr" line that
3672 * specifies an instruction that performs "result = op r0".
3673 * This could be an ARM instruction or a function call.
3674 *
3675 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3676 * int-to-byte, int-to-char, int-to-short
3677 */
3678 /* unop vA, vB */
3679 mov r3, rINST, lsr #12 @ r3<- B
3680 ubfx r9, rINST, #8, #4 @ r9<- A
3681 GET_VREG r0, r3 @ r0<- vB
3682 @ optional op; may set condition codes
3683 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3684 add r0, r0, #0x80000000 @ r0<- op, r0-r3 changed
3685 GET_INST_OPCODE ip @ extract opcode from rINST
3686 SET_VREG r0, r9 @ vAA<- r0
3687 GOTO_OPCODE ip @ jump to next instruction
3688 /* 8-9 instructions */
3689
3690
3691/* ------------------------------ */
3692 .balign 128
3693.L_op_neg_double: /* 0x80 */
3694/* File: arm/op_neg_double.S */
3695/* File: arm/unopWide.S */
3696 /*
3697 * Generic 64-bit unary operation. Provide an "instr" line that
3698 * specifies an instruction that performs "result = op r0/r1".
3699 * This could be an ARM instruction or a function call.
3700 *
3701 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3702 */
3703 /* unop vA, vB */
3704 mov r3, rINST, lsr #12 @ r3<- B
3705 ubfx r9, rINST, #8, #4 @ r9<- A
3706 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
3707 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
3708 ldmia r3, {r0-r1} @ r0/r1<- vAA
3709 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3710 @ optional op; may set condition codes
3711 add r1, r1, #0x80000000 @ r0/r1<- op, r2-r3 changed
3712 GET_INST_OPCODE ip @ extract opcode from rINST
3713 stmia r9, {r0-r1} @ vAA<- r0/r1
3714 GOTO_OPCODE ip @ jump to next instruction
3715 /* 10-11 instructions */
3716
3717
3718/* ------------------------------ */
3719 .balign 128
3720.L_op_int_to_long: /* 0x81 */
3721/* File: arm/op_int_to_long.S */
3722/* File: arm/unopWider.S */
3723 /*
3724 * Generic 32bit-to-64bit unary operation. Provide an "instr" line
3725 * that specifies an instruction that performs "result = op r0", where
3726 * "result" is a 64-bit quantity in r0/r1.
3727 *
3728 * For: int-to-long, int-to-double, float-to-long, float-to-double
3729 */
3730 /* unop vA, vB */
3731 mov r3, rINST, lsr #12 @ r3<- B
3732 ubfx r9, rINST, #8, #4 @ r9<- A
3733 GET_VREG r0, r3 @ r0<- vB
3734 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
3735 @ optional op; may set condition codes
3736 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3737 mov r1, r0, asr #31 @ r0<- op, r0-r3 changed
3738 GET_INST_OPCODE ip @ extract opcode from rINST
3739 stmia r9, {r0-r1} @ vA/vA+1<- r0/r1
3740 GOTO_OPCODE ip @ jump to next instruction
3741 /* 9-10 instructions */
3742
3743
3744/* ------------------------------ */
3745 .balign 128
3746.L_op_int_to_float: /* 0x82 */
3747/* File: arm/op_int_to_float.S */
3748/* File: arm/funop.S */
3749 /*
3750 * Generic 32-bit unary floating-point operation. Provide an "instr"
3751 * line that specifies an instruction that performs "s1 = op s0".
3752 *
3753 * for: int-to-float, float-to-int
3754 */
3755 /* unop vA, vB */
3756 mov r3, rINST, lsr #12 @ r3<- B
3757 mov r9, rINST, lsr #8 @ r9<- A+
3758 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3759 flds s0, [r3] @ s0<- vB
3760 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3761 and r9, r9, #15 @ r9<- A
3762 fsitos s1, s0 @ s1<- op
3763 GET_INST_OPCODE ip @ extract opcode from rINST
3764 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
3765 fsts s1, [r9] @ vA<- s1
3766 GOTO_OPCODE ip @ jump to next instruction
3767
3768
3769/* ------------------------------ */
3770 .balign 128
3771.L_op_int_to_double: /* 0x83 */
3772/* File: arm/op_int_to_double.S */
3773/* File: arm/funopWider.S */
3774 /*
3775 * Generic 32bit-to-64bit floating point unary operation. Provide an
3776 * "instr" line that specifies an instruction that performs "d0 = op s0".
3777 *
3778 * For: int-to-double, float-to-double
3779 */
3780 /* unop vA, vB */
3781 mov r3, rINST, lsr #12 @ r3<- B
3782 mov r9, rINST, lsr #8 @ r9<- A+
3783 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3784 flds s0, [r3] @ s0<- vB
3785 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3786 and r9, r9, #15 @ r9<- A
3787 fsitod d0, s0 @ d0<- op
3788 GET_INST_OPCODE ip @ extract opcode from rINST
3789 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
3790 fstd d0, [r9] @ vA<- d0
3791 GOTO_OPCODE ip @ jump to next instruction
3792
3793
3794/* ------------------------------ */
3795 .balign 128
3796.L_op_long_to_int: /* 0x84 */
3797/* File: arm/op_long_to_int.S */
3798/* we ignore the high word, making this equivalent to a 32-bit reg move */
3799/* File: arm/op_move.S */
3800 /* for move, move-object, long-to-int */
3801 /* op vA, vB */
3802 mov r1, rINST, lsr #12 @ r1<- B from 15:12
3803 ubfx r0, rINST, #8, #4 @ r0<- A from 11:8
3804 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3805 GET_VREG r2, r1 @ r2<- fp[B]
3806 GET_INST_OPCODE ip @ ip<- opcode from rINST
3807 .if 0
3808 SET_VREG_OBJECT r2, r0 @ fp[A]<- r2
3809 .else
3810 SET_VREG r2, r0 @ fp[A]<- r2
3811 .endif
3812 GOTO_OPCODE ip @ execute next instruction
3813
3814
3815/* ------------------------------ */
3816 .balign 128
3817.L_op_long_to_float: /* 0x85 */
3818/* File: arm/op_long_to_float.S */
3819/* File: arm/unopNarrower.S */
3820 /*
3821 * Generic 64bit-to-32bit unary operation. Provide an "instr" line
3822 * that specifies an instruction that performs "result = op r0/r1", where
3823 * "result" is a 32-bit quantity in r0.
3824 *
3825 * For: long-to-float, double-to-int, double-to-float
3826 *
3827 * (This would work for long-to-int, but that instruction is actually
3828 * an exact match for op_move.)
3829 */
3830 /* unop vA, vB */
3831 mov r3, rINST, lsr #12 @ r3<- B
3832 ubfx r9, rINST, #8, #4 @ r9<- A
3833 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
3834 ldmia r3, {r0-r1} @ r0/r1<- vB/vB+1
3835 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3836 @ optional op; may set condition codes
3837 bl __aeabi_l2f @ r0<- op, r0-r3 changed
3838 GET_INST_OPCODE ip @ extract opcode from rINST
3839 SET_VREG r0, r9 @ vA<- r0
3840 GOTO_OPCODE ip @ jump to next instruction
3841 /* 9-10 instructions */
3842
3843
3844/* ------------------------------ */
3845 .balign 128
3846.L_op_long_to_double: /* 0x86 */
3847/* File: arm/op_long_to_double.S */
3848 /*
3849 * Specialised 64-bit floating point operation.
3850 *
3851 * Note: The result will be returned in d2.
3852 *
3853 * For: long-to-double
3854 */
3855 mov r3, rINST, lsr #12 @ r3<- B
3856 ubfx r9, rINST, #8, #4 @ r9<- A
3857 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
3858 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
3859 vldr d0, [r3] @ d0<- vAA
3860 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3861
3862 vcvt.f64.s32 d1, s1 @ d1<- (double)(vAAh)
3863 vcvt.f64.u32 d2, s0 @ d2<- (double)(vAAl)
3864 vldr d3, constvalop_long_to_double
3865 vmla.f64 d2, d1, d3 @ d2<- vAAh*2^32 + vAAl
3866
3867 GET_INST_OPCODE ip @ extract opcode from rINST
3868 vstr.64 d2, [r9] @ vAA<- d2
3869 GOTO_OPCODE ip @ jump to next instruction
3870
3871 /* literal pool helper */
3872constvalop_long_to_double:
3873 .8byte 0x41f0000000000000
3874
3875/* ------------------------------ */
3876 .balign 128
3877.L_op_float_to_int: /* 0x87 */
3878/* File: arm/op_float_to_int.S */
3879/* File: arm/funop.S */
3880 /*
3881 * Generic 32-bit unary floating-point operation. Provide an "instr"
3882 * line that specifies an instruction that performs "s1 = op s0".
3883 *
3884 * for: int-to-float, float-to-int
3885 */
3886 /* unop vA, vB */
3887 mov r3, rINST, lsr #12 @ r3<- B
3888 mov r9, rINST, lsr #8 @ r9<- A+
3889 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3890 flds s0, [r3] @ s0<- vB
3891 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3892 and r9, r9, #15 @ r9<- A
3893 ftosizs s1, s0 @ s1<- op
3894 GET_INST_OPCODE ip @ extract opcode from rINST
3895 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
3896 fsts s1, [r9] @ vA<- s1
3897 GOTO_OPCODE ip @ jump to next instruction
3898
3899
3900/* ------------------------------ */
3901 .balign 128
3902.L_op_float_to_long: /* 0x88 */
3903/* File: arm/op_float_to_long.S */
3904@include "arm/unopWider.S" {"instr":"bl __aeabi_f2lz"}
3905/* File: arm/unopWider.S */
3906 /*
3907 * Generic 32bit-to-64bit unary operation. Provide an "instr" line
3908 * that specifies an instruction that performs "result = op r0", where
3909 * "result" is a 64-bit quantity in r0/r1.
3910 *
3911 * For: int-to-long, int-to-double, float-to-long, float-to-double
3912 */
3913 /* unop vA, vB */
3914 mov r3, rINST, lsr #12 @ r3<- B
3915 ubfx r9, rINST, #8, #4 @ r9<- A
3916 GET_VREG r0, r3 @ r0<- vB
3917 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
3918 @ optional op; may set condition codes
3919 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3920 bl f2l_doconv @ r0<- op, r0-r3 changed
3921 GET_INST_OPCODE ip @ extract opcode from rINST
3922 stmia r9, {r0-r1} @ vA/vA+1<- r0/r1
3923 GOTO_OPCODE ip @ jump to next instruction
3924 /* 9-10 instructions */
3925
3926
3927
3928/* ------------------------------ */
3929 .balign 128
3930.L_op_float_to_double: /* 0x89 */
3931/* File: arm/op_float_to_double.S */
3932/* File: arm/funopWider.S */
3933 /*
3934 * Generic 32bit-to-64bit floating point unary operation. Provide an
3935 * "instr" line that specifies an instruction that performs "d0 = op s0".
3936 *
3937 * For: int-to-double, float-to-double
3938 */
3939 /* unop vA, vB */
3940 mov r3, rINST, lsr #12 @ r3<- B
3941 mov r9, rINST, lsr #8 @ r9<- A+
3942 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3943 flds s0, [r3] @ s0<- vB
3944 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3945 and r9, r9, #15 @ r9<- A
3946 fcvtds d0, s0 @ d0<- op
3947 GET_INST_OPCODE ip @ extract opcode from rINST
3948 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
3949 fstd d0, [r9] @ vA<- d0
3950 GOTO_OPCODE ip @ jump to next instruction
3951
3952
3953/* ------------------------------ */
3954 .balign 128
3955.L_op_double_to_int: /* 0x8a */
3956/* File: arm/op_double_to_int.S */
3957/* File: arm/funopNarrower.S */
3958 /*
3959 * Generic 64bit-to-32bit unary floating point operation. Provide an
3960 * "instr" line that specifies an instruction that performs "s0 = op d0".
3961 *
3962 * For: double-to-int, double-to-float
3963 */
3964 /* unop vA, vB */
3965 mov r3, rINST, lsr #12 @ r3<- B
3966 mov r9, rINST, lsr #8 @ r9<- A+
3967 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
3968 fldd d0, [r3] @ d0<- vB
3969 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3970 and r9, r9, #15 @ r9<- A
3971 ftosizd s0, d0 @ s0<- op
3972 GET_INST_OPCODE ip @ extract opcode from rINST
3973 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
3974 fsts s0, [r9] @ vA<- s0
3975 GOTO_OPCODE ip @ jump to next instruction
3976
3977
3978/* ------------------------------ */
3979 .balign 128
3980.L_op_double_to_long: /* 0x8b */
3981/* File: arm/op_double_to_long.S */
3982@include "arm/unopWide.S" {"instr":"bl __aeabi_d2lz"}
3983/* File: arm/unopWide.S */
3984 /*
3985 * Generic 64-bit unary operation. Provide an "instr" line that
3986 * specifies an instruction that performs "result = op r0/r1".
3987 * This could be an ARM instruction or a function call.
3988 *
3989 * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3990 */
3991 /* unop vA, vB */
3992 mov r3, rINST, lsr #12 @ r3<- B
3993 ubfx r9, rINST, #8, #4 @ r9<- A
3994 add r3, rFP, r3, lsl #2 @ r3<- &fp[B]
3995 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
3996 ldmia r3, {r0-r1} @ r0/r1<- vAA
3997 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
3998 @ optional op; may set condition codes
3999 bl d2l_doconv @ r0/r1<- op, r2-r3 changed
4000 GET_INST_OPCODE ip @ extract opcode from rINST
4001 stmia r9, {r0-r1} @ vAA<- r0/r1
4002 GOTO_OPCODE ip @ jump to next instruction
4003 /* 10-11 instructions */
4004
4005
4006
4007/* ------------------------------ */
4008 .balign 128
4009.L_op_double_to_float: /* 0x8c */
4010/* File: arm/op_double_to_float.S */
4011/* File: arm/funopNarrower.S */
4012 /*
4013 * Generic 64bit-to-32bit unary floating point operation. Provide an
4014 * "instr" line that specifies an instruction that performs "s0 = op d0".
4015 *
4016 * For: double-to-int, double-to-float
4017 */
4018 /* unop vA, vB */
4019 mov r3, rINST, lsr #12 @ r3<- B
4020 mov r9, rINST, lsr #8 @ r9<- A+
4021 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
4022 fldd d0, [r3] @ d0<- vB
4023 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4024 and r9, r9, #15 @ r9<- A
4025 fcvtsd s0, d0 @ s0<- op
4026 GET_INST_OPCODE ip @ extract opcode from rINST
4027 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
4028 fsts s0, [r9] @ vA<- s0
4029 GOTO_OPCODE ip @ jump to next instruction
4030
4031
4032/* ------------------------------ */
4033 .balign 128
4034.L_op_int_to_byte: /* 0x8d */
4035/* File: arm/op_int_to_byte.S */
4036/* File: arm/unop.S */
4037 /*
4038 * Generic 32-bit unary operation. Provide an "instr" line that
4039 * specifies an instruction that performs "result = op r0".
4040 * This could be an ARM instruction or a function call.
4041 *
4042 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4043 * int-to-byte, int-to-char, int-to-short
4044 */
4045 /* unop vA, vB */
4046 mov r3, rINST, lsr #12 @ r3<- B
4047 ubfx r9, rINST, #8, #4 @ r9<- A
4048 GET_VREG r0, r3 @ r0<- vB
4049 @ optional op; may set condition codes
4050 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4051 sxtb r0, r0 @ r0<- op, r0-r3 changed
4052 GET_INST_OPCODE ip @ extract opcode from rINST
4053 SET_VREG r0, r9 @ vAA<- r0
4054 GOTO_OPCODE ip @ jump to next instruction
4055 /* 8-9 instructions */
4056
4057
4058/* ------------------------------ */
4059 .balign 128
4060.L_op_int_to_char: /* 0x8e */
4061/* File: arm/op_int_to_char.S */
4062/* File: arm/unop.S */
4063 /*
4064 * Generic 32-bit unary operation. Provide an "instr" line that
4065 * specifies an instruction that performs "result = op r0".
4066 * This could be an ARM instruction or a function call.
4067 *
4068 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4069 * int-to-byte, int-to-char, int-to-short
4070 */
4071 /* unop vA, vB */
4072 mov r3, rINST, lsr #12 @ r3<- B
4073 ubfx r9, rINST, #8, #4 @ r9<- A
4074 GET_VREG r0, r3 @ r0<- vB
4075 @ optional op; may set condition codes
4076 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4077 uxth r0, r0 @ r0<- op, r0-r3 changed
4078 GET_INST_OPCODE ip @ extract opcode from rINST
4079 SET_VREG r0, r9 @ vAA<- r0
4080 GOTO_OPCODE ip @ jump to next instruction
4081 /* 8-9 instructions */
4082
4083
4084/* ------------------------------ */
4085 .balign 128
4086.L_op_int_to_short: /* 0x8f */
4087/* File: arm/op_int_to_short.S */
4088/* File: arm/unop.S */
4089 /*
4090 * Generic 32-bit unary operation. Provide an "instr" line that
4091 * specifies an instruction that performs "result = op r0".
4092 * This could be an ARM instruction or a function call.
4093 *
4094 * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4095 * int-to-byte, int-to-char, int-to-short
4096 */
4097 /* unop vA, vB */
4098 mov r3, rINST, lsr #12 @ r3<- B
4099 ubfx r9, rINST, #8, #4 @ r9<- A
4100 GET_VREG r0, r3 @ r0<- vB
4101 @ optional op; may set condition codes
4102 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
4103 sxth r0, r0 @ r0<- op, r0-r3 changed
4104 GET_INST_OPCODE ip @ extract opcode from rINST
4105 SET_VREG r0, r9 @ vAA<- r0
4106 GOTO_OPCODE ip @ jump to next instruction
4107 /* 8-9 instructions */
4108
4109
4110/* ------------------------------ */
4111 .balign 128
4112.L_op_add_int: /* 0x90 */
4113/* File: arm/op_add_int.S */
4114/* File: arm/binop.S */
4115 /*
4116 * Generic 32-bit binary operation. Provide an "instr" line that
4117 * specifies an instruction that performs "result = r0 op r1".
4118 * This could be an ARM instruction or a function call. (If the result
4119 * comes back in a register other than r0, you can override "result".)
4120 *
4121 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4122 * vCC (r1). Useful for integer division and modulus. Note that we
4123 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4124 * handles it correctly.
4125 *
4126 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4127 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4128 * mul-float, div-float, rem-float
4129 */
4130 /* binop vAA, vBB, vCC */
4131 FETCH r0, 1 @ r0<- CCBB
4132 mov r9, rINST, lsr #8 @ r9<- AA
4133 mov r3, r0, lsr #8 @ r3<- CC
4134 and r2, r0, #255 @ r2<- BB
4135 GET_VREG r1, r3 @ r1<- vCC
4136 GET_VREG r0, r2 @ r0<- vBB
4137 .if 0
4138 cmp r1, #0 @ is second operand zero?
4139 beq common_errDivideByZero
4140 .endif
4141
4142 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4143 @ optional op; may set condition codes
4144 add r0, r0, r1 @ r0<- op, r0-r3 changed
4145 GET_INST_OPCODE ip @ extract opcode from rINST
4146 SET_VREG r0, r9 @ vAA<- r0
4147 GOTO_OPCODE ip @ jump to next instruction
4148 /* 11-14 instructions */
4149
4150
4151/* ------------------------------ */
4152 .balign 128
4153.L_op_sub_int: /* 0x91 */
4154/* File: arm/op_sub_int.S */
4155/* File: arm/binop.S */
4156 /*
4157 * Generic 32-bit binary operation. Provide an "instr" line that
4158 * specifies an instruction that performs "result = r0 op r1".
4159 * This could be an ARM instruction or a function call. (If the result
4160 * comes back in a register other than r0, you can override "result".)
4161 *
4162 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4163 * vCC (r1). Useful for integer division and modulus. Note that we
4164 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4165 * handles it correctly.
4166 *
4167 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4168 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4169 * mul-float, div-float, rem-float
4170 */
4171 /* binop vAA, vBB, vCC */
4172 FETCH r0, 1 @ r0<- CCBB
4173 mov r9, rINST, lsr #8 @ r9<- AA
4174 mov r3, r0, lsr #8 @ r3<- CC
4175 and r2, r0, #255 @ r2<- BB
4176 GET_VREG r1, r3 @ r1<- vCC
4177 GET_VREG r0, r2 @ r0<- vBB
4178 .if 0
4179 cmp r1, #0 @ is second operand zero?
4180 beq common_errDivideByZero
4181 .endif
4182
4183 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4184 @ optional op; may set condition codes
4185 sub r0, r0, r1 @ r0<- op, r0-r3 changed
4186 GET_INST_OPCODE ip @ extract opcode from rINST
4187 SET_VREG r0, r9 @ vAA<- r0
4188 GOTO_OPCODE ip @ jump to next instruction
4189 /* 11-14 instructions */
4190
4191
4192/* ------------------------------ */
4193 .balign 128
4194.L_op_mul_int: /* 0x92 */
4195/* File: arm/op_mul_int.S */
4196/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
4197/* File: arm/binop.S */
4198 /*
4199 * Generic 32-bit binary operation. Provide an "instr" line that
4200 * specifies an instruction that performs "result = r0 op r1".
4201 * This could be an ARM instruction or a function call. (If the result
4202 * comes back in a register other than r0, you can override "result".)
4203 *
4204 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4205 * vCC (r1). Useful for integer division and modulus. Note that we
4206 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4207 * handles it correctly.
4208 *
4209 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4210 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4211 * mul-float, div-float, rem-float
4212 */
4213 /* binop vAA, vBB, vCC */
4214 FETCH r0, 1 @ r0<- CCBB
4215 mov r9, rINST, lsr #8 @ r9<- AA
4216 mov r3, r0, lsr #8 @ r3<- CC
4217 and r2, r0, #255 @ r2<- BB
4218 GET_VREG r1, r3 @ r1<- vCC
4219 GET_VREG r0, r2 @ r0<- vBB
4220 .if 0
4221 cmp r1, #0 @ is second operand zero?
4222 beq common_errDivideByZero
4223 .endif
4224
4225 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4226 @ optional op; may set condition codes
4227 mul r0, r1, r0 @ r0<- op, r0-r3 changed
4228 GET_INST_OPCODE ip @ extract opcode from rINST
4229 SET_VREG r0, r9 @ vAA<- r0
4230 GOTO_OPCODE ip @ jump to next instruction
4231 /* 11-14 instructions */
4232
4233
4234/* ------------------------------ */
4235 .balign 128
4236.L_op_div_int: /* 0x93 */
4237/* File: arm/op_div_int.S */
4238 /*
4239 * Specialized 32-bit binary operation
4240 *
4241 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
4242 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
4243 * ARMv7 CPUs that have hardware division support).
4244 *
4245 * div-int
4246 *
4247 */
4248 FETCH r0, 1 @ r0<- CCBB
4249 mov r9, rINST, lsr #8 @ r9<- AA
4250 mov r3, r0, lsr #8 @ r3<- CC
4251 and r2, r0, #255 @ r2<- BB
4252 GET_VREG r1, r3 @ r1<- vCC
4253 GET_VREG r0, r2 @ r0<- vBB
4254 cmp r1, #0 @ is second operand zero?
4255 beq common_errDivideByZero
4256
4257 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4258#ifdef __ARM_ARCH_EXT_IDIV__
4259 sdiv r0, r0, r1 @ r0<- op
4260#else
4261 bl __aeabi_idiv @ r0<- op, r0-r3 changed
4262#endif
4263 GET_INST_OPCODE ip @ extract opcode from rINST
4264 SET_VREG r0, r9 @ vAA<- r0
4265 GOTO_OPCODE ip @ jump to next instruction
4266 /* 11-14 instructions */
4267
4268/* ------------------------------ */
4269 .balign 128
4270.L_op_rem_int: /* 0x94 */
4271/* File: arm/op_rem_int.S */
4272 /*
4273 * Specialized 32-bit binary operation
4274 *
4275 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
4276 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
4277 * ARMv7 CPUs that have hardware division support).
4278 *
4279 * NOTE: idivmod returns quotient in r0 and remainder in r1
4280 *
4281 * rem-int
4282 *
4283 */
4284 FETCH r0, 1 @ r0<- CCBB
4285 mov r9, rINST, lsr #8 @ r9<- AA
4286 mov r3, r0, lsr #8 @ r3<- CC
4287 and r2, r0, #255 @ r2<- BB
4288 GET_VREG r1, r3 @ r1<- vCC
4289 GET_VREG r0, r2 @ r0<- vBB
4290 cmp r1, #0 @ is second operand zero?
4291 beq common_errDivideByZero
4292
4293 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4294#ifdef __ARM_ARCH_EXT_IDIV__
4295 sdiv r2, r0, r1
4296 mls r1, r1, r2, r0 @ r1<- op, r0-r2 changed
4297#else
4298 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
4299#endif
4300 GET_INST_OPCODE ip @ extract opcode from rINST
4301 SET_VREG r1, r9 @ vAA<- r1
4302 GOTO_OPCODE ip @ jump to next instruction
4303 /* 11-14 instructions */
4304
4305/* ------------------------------ */
4306 .balign 128
4307.L_op_and_int: /* 0x95 */
4308/* File: arm/op_and_int.S */
4309/* File: arm/binop.S */
4310 /*
4311 * Generic 32-bit binary operation. Provide an "instr" line that
4312 * specifies an instruction that performs "result = r0 op r1".
4313 * This could be an ARM instruction or a function call. (If the result
4314 * comes back in a register other than r0, you can override "result".)
4315 *
4316 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4317 * vCC (r1). Useful for integer division and modulus. Note that we
4318 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4319 * handles it correctly.
4320 *
4321 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4322 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4323 * mul-float, div-float, rem-float
4324 */
4325 /* binop vAA, vBB, vCC */
4326 FETCH r0, 1 @ r0<- CCBB
4327 mov r9, rINST, lsr #8 @ r9<- AA
4328 mov r3, r0, lsr #8 @ r3<- CC
4329 and r2, r0, #255 @ r2<- BB
4330 GET_VREG r1, r3 @ r1<- vCC
4331 GET_VREG r0, r2 @ r0<- vBB
4332 .if 0
4333 cmp r1, #0 @ is second operand zero?
4334 beq common_errDivideByZero
4335 .endif
4336
4337 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4338 @ optional op; may set condition codes
4339 and r0, r0, r1 @ r0<- op, r0-r3 changed
4340 GET_INST_OPCODE ip @ extract opcode from rINST
4341 SET_VREG r0, r9 @ vAA<- r0
4342 GOTO_OPCODE ip @ jump to next instruction
4343 /* 11-14 instructions */
4344
4345
4346/* ------------------------------ */
4347 .balign 128
4348.L_op_or_int: /* 0x96 */
4349/* File: arm/op_or_int.S */
4350/* File: arm/binop.S */
4351 /*
4352 * Generic 32-bit binary operation. Provide an "instr" line that
4353 * specifies an instruction that performs "result = r0 op r1".
4354 * This could be an ARM instruction or a function call. (If the result
4355 * comes back in a register other than r0, you can override "result".)
4356 *
4357 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4358 * vCC (r1). Useful for integer division and modulus. Note that we
4359 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4360 * handles it correctly.
4361 *
4362 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4363 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4364 * mul-float, div-float, rem-float
4365 */
4366 /* binop vAA, vBB, vCC */
4367 FETCH r0, 1 @ r0<- CCBB
4368 mov r9, rINST, lsr #8 @ r9<- AA
4369 mov r3, r0, lsr #8 @ r3<- CC
4370 and r2, r0, #255 @ r2<- BB
4371 GET_VREG r1, r3 @ r1<- vCC
4372 GET_VREG r0, r2 @ r0<- vBB
4373 .if 0
4374 cmp r1, #0 @ is second operand zero?
4375 beq common_errDivideByZero
4376 .endif
4377
4378 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4379 @ optional op; may set condition codes
4380 orr r0, r0, r1 @ r0<- op, r0-r3 changed
4381 GET_INST_OPCODE ip @ extract opcode from rINST
4382 SET_VREG r0, r9 @ vAA<- r0
4383 GOTO_OPCODE ip @ jump to next instruction
4384 /* 11-14 instructions */
4385
4386
4387/* ------------------------------ */
4388 .balign 128
4389.L_op_xor_int: /* 0x97 */
4390/* File: arm/op_xor_int.S */
4391/* File: arm/binop.S */
4392 /*
4393 * Generic 32-bit binary operation. Provide an "instr" line that
4394 * specifies an instruction that performs "result = r0 op r1".
4395 * This could be an ARM instruction or a function call. (If the result
4396 * comes back in a register other than r0, you can override "result".)
4397 *
4398 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4399 * vCC (r1). Useful for integer division and modulus. Note that we
4400 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4401 * handles it correctly.
4402 *
4403 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4404 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4405 * mul-float, div-float, rem-float
4406 */
4407 /* binop vAA, vBB, vCC */
4408 FETCH r0, 1 @ r0<- CCBB
4409 mov r9, rINST, lsr #8 @ r9<- AA
4410 mov r3, r0, lsr #8 @ r3<- CC
4411 and r2, r0, #255 @ r2<- BB
4412 GET_VREG r1, r3 @ r1<- vCC
4413 GET_VREG r0, r2 @ r0<- vBB
4414 .if 0
4415 cmp r1, #0 @ is second operand zero?
4416 beq common_errDivideByZero
4417 .endif
4418
4419 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4420 @ optional op; may set condition codes
4421 eor r0, r0, r1 @ r0<- op, r0-r3 changed
4422 GET_INST_OPCODE ip @ extract opcode from rINST
4423 SET_VREG r0, r9 @ vAA<- r0
4424 GOTO_OPCODE ip @ jump to next instruction
4425 /* 11-14 instructions */
4426
4427
4428/* ------------------------------ */
4429 .balign 128
4430.L_op_shl_int: /* 0x98 */
4431/* File: arm/op_shl_int.S */
4432/* File: arm/binop.S */
4433 /*
4434 * Generic 32-bit binary operation. Provide an "instr" line that
4435 * specifies an instruction that performs "result = r0 op r1".
4436 * This could be an ARM instruction or a function call. (If the result
4437 * comes back in a register other than r0, you can override "result".)
4438 *
4439 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4440 * vCC (r1). Useful for integer division and modulus. Note that we
4441 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4442 * handles it correctly.
4443 *
4444 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4445 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4446 * mul-float, div-float, rem-float
4447 */
4448 /* binop vAA, vBB, vCC */
4449 FETCH r0, 1 @ r0<- CCBB
4450 mov r9, rINST, lsr #8 @ r9<- AA
4451 mov r3, r0, lsr #8 @ r3<- CC
4452 and r2, r0, #255 @ r2<- BB
4453 GET_VREG r1, r3 @ r1<- vCC
4454 GET_VREG r0, r2 @ r0<- vBB
4455 .if 0
4456 cmp r1, #0 @ is second operand zero?
4457 beq common_errDivideByZero
4458 .endif
4459
4460 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4461 and r1, r1, #31 @ optional op; may set condition codes
4462 mov r0, r0, asl r1 @ r0<- op, r0-r3 changed
4463 GET_INST_OPCODE ip @ extract opcode from rINST
4464 SET_VREG r0, r9 @ vAA<- r0
4465 GOTO_OPCODE ip @ jump to next instruction
4466 /* 11-14 instructions */
4467
4468
4469/* ------------------------------ */
4470 .balign 128
4471.L_op_shr_int: /* 0x99 */
4472/* File: arm/op_shr_int.S */
4473/* File: arm/binop.S */
4474 /*
4475 * Generic 32-bit binary operation. Provide an "instr" line that
4476 * specifies an instruction that performs "result = r0 op r1".
4477 * This could be an ARM instruction or a function call. (If the result
4478 * comes back in a register other than r0, you can override "result".)
4479 *
4480 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4481 * vCC (r1). Useful for integer division and modulus. Note that we
4482 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4483 * handles it correctly.
4484 *
4485 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4486 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4487 * mul-float, div-float, rem-float
4488 */
4489 /* binop vAA, vBB, vCC */
4490 FETCH r0, 1 @ r0<- CCBB
4491 mov r9, rINST, lsr #8 @ r9<- AA
4492 mov r3, r0, lsr #8 @ r3<- CC
4493 and r2, r0, #255 @ r2<- BB
4494 GET_VREG r1, r3 @ r1<- vCC
4495 GET_VREG r0, r2 @ r0<- vBB
4496 .if 0
4497 cmp r1, #0 @ is second operand zero?
4498 beq common_errDivideByZero
4499 .endif
4500
4501 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4502 and r1, r1, #31 @ optional op; may set condition codes
4503 mov r0, r0, asr r1 @ r0<- op, r0-r3 changed
4504 GET_INST_OPCODE ip @ extract opcode from rINST
4505 SET_VREG r0, r9 @ vAA<- r0
4506 GOTO_OPCODE ip @ jump to next instruction
4507 /* 11-14 instructions */
4508
4509
4510/* ------------------------------ */
4511 .balign 128
4512.L_op_ushr_int: /* 0x9a */
4513/* File: arm/op_ushr_int.S */
4514/* File: arm/binop.S */
4515 /*
4516 * Generic 32-bit binary operation. Provide an "instr" line that
4517 * specifies an instruction that performs "result = r0 op r1".
4518 * This could be an ARM instruction or a function call. (If the result
4519 * comes back in a register other than r0, you can override "result".)
4520 *
4521 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4522 * vCC (r1). Useful for integer division and modulus. Note that we
4523 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4524 * handles it correctly.
4525 *
4526 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4527 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4528 * mul-float, div-float, rem-float
4529 */
4530 /* binop vAA, vBB, vCC */
4531 FETCH r0, 1 @ r0<- CCBB
4532 mov r9, rINST, lsr #8 @ r9<- AA
4533 mov r3, r0, lsr #8 @ r3<- CC
4534 and r2, r0, #255 @ r2<- BB
4535 GET_VREG r1, r3 @ r1<- vCC
4536 GET_VREG r0, r2 @ r0<- vBB
4537 .if 0
4538 cmp r1, #0 @ is second operand zero?
4539 beq common_errDivideByZero
4540 .endif
4541
4542 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4543 and r1, r1, #31 @ optional op; may set condition codes
4544 mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed
4545 GET_INST_OPCODE ip @ extract opcode from rINST
4546 SET_VREG r0, r9 @ vAA<- r0
4547 GOTO_OPCODE ip @ jump to next instruction
4548 /* 11-14 instructions */
4549
4550
4551/* ------------------------------ */
4552 .balign 128
4553.L_op_add_long: /* 0x9b */
4554/* File: arm/op_add_long.S */
4555/* File: arm/binopWide.S */
4556 /*
4557 * Generic 64-bit binary operation. Provide an "instr" line that
4558 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4559 * This could be an ARM instruction or a function call. (If the result
4560 * comes back in a register other than r0, you can override "result".)
4561 *
4562 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4563 * vCC (r1). Useful for integer division and modulus.
4564 *
4565 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4566 * xor-long, add-double, sub-double, mul-double, div-double,
4567 * rem-double
4568 *
4569 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4570 */
4571 /* binop vAA, vBB, vCC */
4572 FETCH r0, 1 @ r0<- CCBB
4573 mov r9, rINST, lsr #8 @ r9<- AA
4574 and r2, r0, #255 @ r2<- BB
4575 mov r3, r0, lsr #8 @ r3<- CC
4576 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4577 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4578 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4579 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4580 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4581 .if 0
4582 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4583 beq common_errDivideByZero
4584 .endif
4585 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4586
4587 adds r0, r0, r2 @ optional op; may set condition codes
4588 adc r1, r1, r3 @ result<- op, r0-r3 changed
4589 GET_INST_OPCODE ip @ extract opcode from rINST
4590 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4591 GOTO_OPCODE ip @ jump to next instruction
4592 /* 14-17 instructions */
4593
4594
4595/* ------------------------------ */
4596 .balign 128
4597.L_op_sub_long: /* 0x9c */
4598/* File: arm/op_sub_long.S */
4599/* File: arm/binopWide.S */
4600 /*
4601 * Generic 64-bit binary operation. Provide an "instr" line that
4602 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4603 * This could be an ARM instruction or a function call. (If the result
4604 * comes back in a register other than r0, you can override "result".)
4605 *
4606 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4607 * vCC (r1). Useful for integer division and modulus.
4608 *
4609 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4610 * xor-long, add-double, sub-double, mul-double, div-double,
4611 * rem-double
4612 *
4613 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4614 */
4615 /* binop vAA, vBB, vCC */
4616 FETCH r0, 1 @ r0<- CCBB
4617 mov r9, rINST, lsr #8 @ r9<- AA
4618 and r2, r0, #255 @ r2<- BB
4619 mov r3, r0, lsr #8 @ r3<- CC
4620 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4621 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4622 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4623 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4624 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4625 .if 0
4626 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4627 beq common_errDivideByZero
4628 .endif
4629 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4630
4631 subs r0, r0, r2 @ optional op; may set condition codes
4632 sbc r1, r1, r3 @ result<- op, r0-r3 changed
4633 GET_INST_OPCODE ip @ extract opcode from rINST
4634 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4635 GOTO_OPCODE ip @ jump to next instruction
4636 /* 14-17 instructions */
4637
4638
4639/* ------------------------------ */
4640 .balign 128
4641.L_op_mul_long: /* 0x9d */
4642/* File: arm/op_mul_long.S */
4643 /*
4644 * Signed 64-bit integer multiply.
4645 *
4646 * Consider WXxYZ (r1r0 x r3r2) with a long multiply:
4647 * WX
4648 * x YZ
4649 * --------
4650 * ZW ZX
4651 * YW YX
4652 *
4653 * The low word of the result holds ZX, the high word holds
4654 * (ZW+YX) + (the high overflow from ZX). YW doesn't matter because
4655 * it doesn't fit in the low 64 bits.
4656 *
4657 * Unlike most ARM math operations, multiply instructions have
4658 * restrictions on using the same register more than once (Rd and Rm
4659 * cannot be the same).
4660 */
4661 /* mul-long vAA, vBB, vCC */
4662 FETCH r0, 1 @ r0<- CCBB
4663 and r2, r0, #255 @ r2<- BB
4664 mov r3, r0, lsr #8 @ r3<- CC
4665 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4666 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4667 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4668 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4669 mul ip, r2, r1 @ ip<- ZxW
4670 umull r9, r10, r2, r0 @ r9/r10 <- ZxX
4671 mla r2, r0, r3, ip @ r2<- YxX + (ZxW)
4672 mov r0, rINST, lsr #8 @ r0<- AA
4673 add r10, r2, r10 @ r10<- r10 + low(ZxW + (YxX))
4674 add r0, rFP, r0, lsl #2 @ r0<- &fp[AA]
4675 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4676 GET_INST_OPCODE ip @ extract opcode from rINST
4677 stmia r0, {r9-r10} @ vAA/vAA+1<- r9/r10
4678 GOTO_OPCODE ip @ jump to next instruction
4679
4680/* ------------------------------ */
4681 .balign 128
4682.L_op_div_long: /* 0x9e */
4683/* File: arm/op_div_long.S */
4684/* File: arm/binopWide.S */
4685 /*
4686 * Generic 64-bit binary operation. Provide an "instr" line that
4687 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4688 * This could be an ARM instruction or a function call. (If the result
4689 * comes back in a register other than r0, you can override "result".)
4690 *
4691 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4692 * vCC (r1). Useful for integer division and modulus.
4693 *
4694 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4695 * xor-long, add-double, sub-double, mul-double, div-double,
4696 * rem-double
4697 *
4698 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4699 */
4700 /* binop vAA, vBB, vCC */
4701 FETCH r0, 1 @ r0<- CCBB
4702 mov r9, rINST, lsr #8 @ r9<- AA
4703 and r2, r0, #255 @ r2<- BB
4704 mov r3, r0, lsr #8 @ r3<- CC
4705 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4706 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4707 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4708 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4709 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4710 .if 1
4711 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4712 beq common_errDivideByZero
4713 .endif
4714 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4715
4716 @ optional op; may set condition codes
4717 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
4718 GET_INST_OPCODE ip @ extract opcode from rINST
4719 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4720 GOTO_OPCODE ip @ jump to next instruction
4721 /* 14-17 instructions */
4722
4723
4724/* ------------------------------ */
4725 .balign 128
4726.L_op_rem_long: /* 0x9f */
4727/* File: arm/op_rem_long.S */
4728/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
4729/* File: arm/binopWide.S */
4730 /*
4731 * Generic 64-bit binary operation. Provide an "instr" line that
4732 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4733 * This could be an ARM instruction or a function call. (If the result
4734 * comes back in a register other than r0, you can override "result".)
4735 *
4736 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4737 * vCC (r1). Useful for integer division and modulus.
4738 *
4739 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4740 * xor-long, add-double, sub-double, mul-double, div-double,
4741 * rem-double
4742 *
4743 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4744 */
4745 /* binop vAA, vBB, vCC */
4746 FETCH r0, 1 @ r0<- CCBB
4747 mov r9, rINST, lsr #8 @ r9<- AA
4748 and r2, r0, #255 @ r2<- BB
4749 mov r3, r0, lsr #8 @ r3<- CC
4750 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4751 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4752 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4753 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4754 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4755 .if 1
4756 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4757 beq common_errDivideByZero
4758 .endif
4759 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4760
4761 @ optional op; may set condition codes
4762 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
4763 GET_INST_OPCODE ip @ extract opcode from rINST
4764 stmia r9, {r2,r3} @ vAA/vAA+1<- r2/r3
4765 GOTO_OPCODE ip @ jump to next instruction
4766 /* 14-17 instructions */
4767
4768
4769/* ------------------------------ */
4770 .balign 128
4771.L_op_and_long: /* 0xa0 */
4772/* File: arm/op_and_long.S */
4773/* File: arm/binopWide.S */
4774 /*
4775 * Generic 64-bit binary operation. Provide an "instr" line that
4776 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4777 * This could be an ARM instruction or a function call. (If the result
4778 * comes back in a register other than r0, you can override "result".)
4779 *
4780 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4781 * vCC (r1). Useful for integer division and modulus.
4782 *
4783 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4784 * xor-long, add-double, sub-double, mul-double, div-double,
4785 * rem-double
4786 *
4787 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4788 */
4789 /* binop vAA, vBB, vCC */
4790 FETCH r0, 1 @ r0<- CCBB
4791 mov r9, rINST, lsr #8 @ r9<- AA
4792 and r2, r0, #255 @ r2<- BB
4793 mov r3, r0, lsr #8 @ r3<- CC
4794 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4795 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4796 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4797 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4798 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4799 .if 0
4800 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4801 beq common_errDivideByZero
4802 .endif
4803 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4804
4805 and r0, r0, r2 @ optional op; may set condition codes
4806 and r1, r1, r3 @ result<- op, r0-r3 changed
4807 GET_INST_OPCODE ip @ extract opcode from rINST
4808 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4809 GOTO_OPCODE ip @ jump to next instruction
4810 /* 14-17 instructions */
4811
4812
4813/* ------------------------------ */
4814 .balign 128
4815.L_op_or_long: /* 0xa1 */
4816/* File: arm/op_or_long.S */
4817/* File: arm/binopWide.S */
4818 /*
4819 * Generic 64-bit binary operation. Provide an "instr" line that
4820 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4821 * This could be an ARM instruction or a function call. (If the result
4822 * comes back in a register other than r0, you can override "result".)
4823 *
4824 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4825 * vCC (r1). Useful for integer division and modulus.
4826 *
4827 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4828 * xor-long, add-double, sub-double, mul-double, div-double,
4829 * rem-double
4830 *
4831 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4832 */
4833 /* binop vAA, vBB, vCC */
4834 FETCH r0, 1 @ r0<- CCBB
4835 mov r9, rINST, lsr #8 @ r9<- AA
4836 and r2, r0, #255 @ r2<- BB
4837 mov r3, r0, lsr #8 @ r3<- CC
4838 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4839 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4840 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4841 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4842 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4843 .if 0
4844 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4845 beq common_errDivideByZero
4846 .endif
4847 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4848
4849 orr r0, r0, r2 @ optional op; may set condition codes
4850 orr r1, r1, r3 @ result<- op, r0-r3 changed
4851 GET_INST_OPCODE ip @ extract opcode from rINST
4852 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4853 GOTO_OPCODE ip @ jump to next instruction
4854 /* 14-17 instructions */
4855
4856
4857/* ------------------------------ */
4858 .balign 128
4859.L_op_xor_long: /* 0xa2 */
4860/* File: arm/op_xor_long.S */
4861/* File: arm/binopWide.S */
4862 /*
4863 * Generic 64-bit binary operation. Provide an "instr" line that
4864 * specifies an instruction that performs "result = r0-r1 op r2-r3".
4865 * This could be an ARM instruction or a function call. (If the result
4866 * comes back in a register other than r0, you can override "result".)
4867 *
4868 * If "chkzero" is set to 1, we perform a divide-by-zero check on
4869 * vCC (r1). Useful for integer division and modulus.
4870 *
4871 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4872 * xor-long, add-double, sub-double, mul-double, div-double,
4873 * rem-double
4874 *
4875 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4876 */
4877 /* binop vAA, vBB, vCC */
4878 FETCH r0, 1 @ r0<- CCBB
4879 mov r9, rINST, lsr #8 @ r9<- AA
4880 and r2, r0, #255 @ r2<- BB
4881 mov r3, r0, lsr #8 @ r3<- CC
4882 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4883 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
4884 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
4885 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
4886 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
4887 .if 0
4888 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
4889 beq common_errDivideByZero
4890 .endif
4891 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4892
4893 eor r0, r0, r2 @ optional op; may set condition codes
4894 eor r1, r1, r3 @ result<- op, r0-r3 changed
4895 GET_INST_OPCODE ip @ extract opcode from rINST
4896 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
4897 GOTO_OPCODE ip @ jump to next instruction
4898 /* 14-17 instructions */
4899
4900
4901/* ------------------------------ */
4902 .balign 128
4903.L_op_shl_long: /* 0xa3 */
4904/* File: arm/op_shl_long.S */
4905 /*
4906 * Long integer shift. This is different from the generic 32/64-bit
4907 * binary operations because vAA/vBB are 64-bit but vCC (the shift
4908 * distance) is 32-bit. Also, Dalvik requires us to mask off the low
4909 * 6 bits of the shift distance.
4910 */
4911 /* shl-long vAA, vBB, vCC */
4912 FETCH r0, 1 @ r0<- CCBB
4913 mov r9, rINST, lsr #8 @ r9<- AA
4914 and r3, r0, #255 @ r3<- BB
4915 mov r0, r0, lsr #8 @ r0<- CC
4916 add r3, rFP, r3, lsl #2 @ r3<- &fp[BB]
4917 GET_VREG r2, r0 @ r2<- vCC
4918 ldmia r3, {r0-r1} @ r0/r1<- vBB/vBB+1
4919 and r2, r2, #63 @ r2<- r2 & 0x3f
4920 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4921
4922 mov r1, r1, asl r2 @ r1<- r1 << r2
4923 rsb r3, r2, #32 @ r3<- 32 - r2
4924 orr r1, r1, r0, lsr r3 @ r1<- r1 | (r0 << (32-r2))
4925 subs ip, r2, #32 @ ip<- r2 - 32
4926 movpl r1, r0, asl ip @ if r2 >= 32, r1<- r0 << (r2-32)
4927 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4928 mov r0, r0, asl r2 @ r0<- r0 << r2
4929 GET_INST_OPCODE ip @ extract opcode from rINST
4930 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
4931 GOTO_OPCODE ip @ jump to next instruction
4932
4933/* ------------------------------ */
4934 .balign 128
4935.L_op_shr_long: /* 0xa4 */
4936/* File: arm/op_shr_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 /* shr-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 @ r0<- r0 & 0x3f
4952 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
4953
4954 mov r0, r0, lsr r2 @ r0<- r2 >> r2
4955 rsb r3, r2, #32 @ r3<- 32 - r2
4956 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
4957 subs ip, r2, #32 @ ip<- r2 - 32
4958 movpl r0, r1, asr ip @ if r2 >= 32, r0<-r1 >> (r2-32)
4959 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4960 mov r1, r1, asr r2 @ r1<- r1 >> 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_ushr_long: /* 0xa5 */
4968/* File: arm/op_ushr_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 /* ushr-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, lsr ip @ if r2 >= 32, r0<-r1 >>> (r2-32)
4991 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
4992 mov r1, r1, lsr 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_add_float: /* 0xa6 */
5000/* File: arm/op_add_float.S */
5001/* File: arm/fbinop.S */
5002 /*
5003 * Generic 32-bit floating-point operation. Provide an "instr" line that
5004 * specifies an instruction that performs "s2 = s0 op s1". Because we
5005 * use the "softfp" ABI, this must be an instruction, not a function call.
5006 *
5007 * For: add-float, sub-float, mul-float, div-float
5008 */
5009 /* floatop vAA, vBB, vCC */
5010 FETCH r0, 1 @ r0<- CCBB
5011 mov r9, rINST, lsr #8 @ r9<- AA
5012 mov r3, r0, lsr #8 @ r3<- CC
5013 and r2, r0, #255 @ r2<- BB
5014 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5015 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5016 flds s1, [r3] @ s1<- vCC
5017 flds s0, [r2] @ s0<- vBB
5018
5019 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5020 fadds s2, s0, s1 @ s2<- op
5021 GET_INST_OPCODE ip @ extract opcode from rINST
5022 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5023 fsts s2, [r9] @ vAA<- s2
5024 GOTO_OPCODE ip @ jump to next instruction
5025
5026
5027/* ------------------------------ */
5028 .balign 128
5029.L_op_sub_float: /* 0xa7 */
5030/* File: arm/op_sub_float.S */
5031/* File: arm/fbinop.S */
5032 /*
5033 * Generic 32-bit floating-point operation. Provide an "instr" line that
5034 * specifies an instruction that performs "s2 = s0 op s1". Because we
5035 * use the "softfp" ABI, this must be an instruction, not a function call.
5036 *
5037 * For: add-float, sub-float, mul-float, div-float
5038 */
5039 /* floatop vAA, vBB, vCC */
5040 FETCH r0, 1 @ r0<- CCBB
5041 mov r9, rINST, lsr #8 @ r9<- AA
5042 mov r3, r0, lsr #8 @ r3<- CC
5043 and r2, r0, #255 @ r2<- BB
5044 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5045 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5046 flds s1, [r3] @ s1<- vCC
5047 flds s0, [r2] @ s0<- vBB
5048
5049 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5050 fsubs s2, s0, s1 @ s2<- op
5051 GET_INST_OPCODE ip @ extract opcode from rINST
5052 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5053 fsts s2, [r9] @ vAA<- s2
5054 GOTO_OPCODE ip @ jump to next instruction
5055
5056
5057/* ------------------------------ */
5058 .balign 128
5059.L_op_mul_float: /* 0xa8 */
5060/* File: arm/op_mul_float.S */
5061/* File: arm/fbinop.S */
5062 /*
5063 * Generic 32-bit floating-point operation. Provide an "instr" line that
5064 * specifies an instruction that performs "s2 = s0 op s1". Because we
5065 * use the "softfp" ABI, this must be an instruction, not a function call.
5066 *
5067 * For: add-float, sub-float, mul-float, div-float
5068 */
5069 /* floatop vAA, vBB, vCC */
5070 FETCH r0, 1 @ r0<- CCBB
5071 mov r9, rINST, lsr #8 @ r9<- AA
5072 mov r3, r0, lsr #8 @ r3<- CC
5073 and r2, r0, #255 @ r2<- BB
5074 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5075 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5076 flds s1, [r3] @ s1<- vCC
5077 flds s0, [r2] @ s0<- vBB
5078
5079 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5080 fmuls s2, s0, s1 @ s2<- op
5081 GET_INST_OPCODE ip @ extract opcode from rINST
5082 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5083 fsts s2, [r9] @ vAA<- s2
5084 GOTO_OPCODE ip @ jump to next instruction
5085
5086
5087/* ------------------------------ */
5088 .balign 128
5089.L_op_div_float: /* 0xa9 */
5090/* File: arm/op_div_float.S */
5091/* File: arm/fbinop.S */
5092 /*
5093 * Generic 32-bit floating-point operation. Provide an "instr" line that
5094 * specifies an instruction that performs "s2 = s0 op s1". Because we
5095 * use the "softfp" ABI, this must be an instruction, not a function call.
5096 *
5097 * For: add-float, sub-float, mul-float, div-float
5098 */
5099 /* floatop vAA, vBB, vCC */
5100 FETCH r0, 1 @ r0<- CCBB
5101 mov r9, rINST, lsr #8 @ r9<- AA
5102 mov r3, r0, lsr #8 @ r3<- CC
5103 and r2, r0, #255 @ r2<- BB
5104 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5105 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5106 flds s1, [r3] @ s1<- vCC
5107 flds s0, [r2] @ s0<- vBB
5108
5109 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5110 fdivs s2, s0, s1 @ s2<- op
5111 GET_INST_OPCODE ip @ extract opcode from rINST
5112 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5113 fsts s2, [r9] @ vAA<- s2
5114 GOTO_OPCODE ip @ jump to next instruction
5115
5116
5117/* ------------------------------ */
5118 .balign 128
5119.L_op_rem_float: /* 0xaa */
5120/* File: arm/op_rem_float.S */
5121/* EABI doesn't define a float remainder function, but libm does */
5122/* File: arm/binop.S */
5123 /*
5124 * Generic 32-bit binary operation. Provide an "instr" line that
5125 * specifies an instruction that performs "result = r0 op r1".
5126 * This could be an ARM instruction or a function call. (If the result
5127 * comes back in a register other than r0, you can override "result".)
5128 *
5129 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5130 * vCC (r1). Useful for integer division and modulus. Note that we
5131 * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5132 * handles it correctly.
5133 *
5134 * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5135 * xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5136 * mul-float, div-float, rem-float
5137 */
5138 /* binop vAA, vBB, vCC */
5139 FETCH r0, 1 @ r0<- CCBB
5140 mov r9, rINST, lsr #8 @ r9<- AA
5141 mov r3, r0, lsr #8 @ r3<- CC
5142 and r2, r0, #255 @ r2<- BB
5143 GET_VREG r1, r3 @ r1<- vCC
5144 GET_VREG r0, r2 @ r0<- vBB
5145 .if 0
5146 cmp r1, #0 @ is second operand zero?
5147 beq common_errDivideByZero
5148 .endif
5149
5150 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5151 @ optional op; may set condition codes
5152 bl fmodf @ r0<- op, r0-r3 changed
5153 GET_INST_OPCODE ip @ extract opcode from rINST
5154 SET_VREG r0, r9 @ vAA<- r0
5155 GOTO_OPCODE ip @ jump to next instruction
5156 /* 11-14 instructions */
5157
5158
5159/* ------------------------------ */
5160 .balign 128
5161.L_op_add_double: /* 0xab */
5162/* File: arm/op_add_double.S */
5163/* File: arm/fbinopWide.S */
5164 /*
5165 * Generic 64-bit double-precision floating point binary operation.
5166 * Provide an "instr" line that specifies an instruction that performs
5167 * "d2 = d0 op d1".
5168 *
5169 * for: add-double, sub-double, mul-double, div-double
5170 */
5171 /* doubleop vAA, vBB, vCC */
5172 FETCH r0, 1 @ r0<- CCBB
5173 mov r9, rINST, lsr #8 @ r9<- AA
5174 mov r3, r0, lsr #8 @ r3<- CC
5175 and r2, r0, #255 @ r2<- BB
5176 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5177 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5178 fldd d1, [r3] @ d1<- vCC
5179 fldd d0, [r2] @ d0<- vBB
5180
5181 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5182 faddd d2, d0, d1 @ s2<- op
5183 GET_INST_OPCODE ip @ extract opcode from rINST
5184 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5185 fstd d2, [r9] @ vAA<- d2
5186 GOTO_OPCODE ip @ jump to next instruction
5187
5188
5189/* ------------------------------ */
5190 .balign 128
5191.L_op_sub_double: /* 0xac */
5192/* File: arm/op_sub_double.S */
5193/* File: arm/fbinopWide.S */
5194 /*
5195 * Generic 64-bit double-precision floating point binary operation.
5196 * Provide an "instr" line that specifies an instruction that performs
5197 * "d2 = d0 op d1".
5198 *
5199 * for: add-double, sub-double, mul-double, div-double
5200 */
5201 /* doubleop vAA, vBB, vCC */
5202 FETCH r0, 1 @ r0<- CCBB
5203 mov r9, rINST, lsr #8 @ r9<- AA
5204 mov r3, r0, lsr #8 @ r3<- CC
5205 and r2, r0, #255 @ r2<- BB
5206 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5207 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5208 fldd d1, [r3] @ d1<- vCC
5209 fldd d0, [r2] @ d0<- vBB
5210
5211 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5212 fsubd d2, d0, d1 @ s2<- op
5213 GET_INST_OPCODE ip @ extract opcode from rINST
5214 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5215 fstd d2, [r9] @ vAA<- d2
5216 GOTO_OPCODE ip @ jump to next instruction
5217
5218
5219/* ------------------------------ */
5220 .balign 128
5221.L_op_mul_double: /* 0xad */
5222/* File: arm/op_mul_double.S */
5223/* File: arm/fbinopWide.S */
5224 /*
5225 * Generic 64-bit double-precision floating point binary operation.
5226 * Provide an "instr" line that specifies an instruction that performs
5227 * "d2 = d0 op d1".
5228 *
5229 * for: add-double, sub-double, mul-double, div-double
5230 */
5231 /* doubleop vAA, vBB, vCC */
5232 FETCH r0, 1 @ r0<- CCBB
5233 mov r9, rINST, lsr #8 @ r9<- AA
5234 mov r3, r0, lsr #8 @ r3<- CC
5235 and r2, r0, #255 @ r2<- BB
5236 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5237 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5238 fldd d1, [r3] @ d1<- vCC
5239 fldd d0, [r2] @ d0<- vBB
5240
5241 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5242 fmuld d2, d0, d1 @ s2<- op
5243 GET_INST_OPCODE ip @ extract opcode from rINST
5244 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5245 fstd d2, [r9] @ vAA<- d2
5246 GOTO_OPCODE ip @ jump to next instruction
5247
5248
5249/* ------------------------------ */
5250 .balign 128
5251.L_op_div_double: /* 0xae */
5252/* File: arm/op_div_double.S */
5253/* File: arm/fbinopWide.S */
5254 /*
5255 * Generic 64-bit double-precision floating point binary operation.
5256 * Provide an "instr" line that specifies an instruction that performs
5257 * "d2 = d0 op d1".
5258 *
5259 * for: add-double, sub-double, mul-double, div-double
5260 */
5261 /* doubleop vAA, vBB, vCC */
5262 FETCH r0, 1 @ r0<- CCBB
5263 mov r9, rINST, lsr #8 @ r9<- AA
5264 mov r3, r0, lsr #8 @ r3<- CC
5265 and r2, r0, #255 @ r2<- BB
5266 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vCC
5267 VREG_INDEX_TO_ADDR r2, r2 @ r2<- &vBB
5268 fldd d1, [r3] @ d1<- vCC
5269 fldd d0, [r2] @ d0<- vBB
5270
5271 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5272 fdivd d2, d0, d1 @ s2<- op
5273 GET_INST_OPCODE ip @ extract opcode from rINST
5274 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vAA
5275 fstd d2, [r9] @ vAA<- d2
5276 GOTO_OPCODE ip @ jump to next instruction
5277
5278
5279/* ------------------------------ */
5280 .balign 128
5281.L_op_rem_double: /* 0xaf */
5282/* File: arm/op_rem_double.S */
5283/* EABI doesn't define a double remainder function, but libm does */
5284/* File: arm/binopWide.S */
5285 /*
5286 * Generic 64-bit binary operation. Provide an "instr" line that
5287 * specifies an instruction that performs "result = r0-r1 op r2-r3".
5288 * This could be an ARM instruction or a function call. (If the result
5289 * comes back in a register other than r0, you can override "result".)
5290 *
5291 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5292 * vCC (r1). Useful for integer division and modulus.
5293 *
5294 * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5295 * xor-long, add-double, sub-double, mul-double, div-double,
5296 * rem-double
5297 *
5298 * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5299 */
5300 /* binop vAA, vBB, vCC */
5301 FETCH r0, 1 @ r0<- CCBB
5302 mov r9, rINST, lsr #8 @ r9<- AA
5303 and r2, r0, #255 @ r2<- BB
5304 mov r3, r0, lsr #8 @ r3<- CC
5305 add r9, rFP, r9, lsl #2 @ r9<- &fp[AA]
5306 add r2, rFP, r2, lsl #2 @ r2<- &fp[BB]
5307 add r3, rFP, r3, lsl #2 @ r3<- &fp[CC]
5308 ldmia r2, {r0-r1} @ r0/r1<- vBB/vBB+1
5309 ldmia r3, {r2-r3} @ r2/r3<- vCC/vCC+1
5310 .if 0
5311 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5312 beq common_errDivideByZero
5313 .endif
5314 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
5315
5316 @ optional op; may set condition codes
5317 bl fmod @ result<- op, r0-r3 changed
5318 GET_INST_OPCODE ip @ extract opcode from rINST
5319 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5320 GOTO_OPCODE ip @ jump to next instruction
5321 /* 14-17 instructions */
5322
5323
5324/* ------------------------------ */
5325 .balign 128
5326.L_op_add_int_2addr: /* 0xb0 */
5327/* File: arm/op_add_int_2addr.S */
5328/* File: arm/binop2addr.S */
5329 /*
5330 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5331 * that specifies an instruction that performs "result = r0 op r1".
5332 * This could be an ARM instruction or a function call. (If the result
5333 * comes back in a register other than r0, you can override "result".)
5334 *
5335 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5336 * vCC (r1). Useful for integer division and modulus.
5337 *
5338 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5339 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5340 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5341 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5342 */
5343 /* binop/2addr vA, vB */
5344 mov r3, rINST, lsr #12 @ r3<- B
5345 ubfx r9, rINST, #8, #4 @ r9<- A
5346 GET_VREG r1, r3 @ r1<- vB
5347 GET_VREG r0, r9 @ r0<- vA
5348 .if 0
5349 cmp r1, #0 @ is second operand zero?
5350 beq common_errDivideByZero
5351 .endif
5352 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5353
5354 @ optional op; may set condition codes
5355 add r0, r0, r1 @ r0<- op, r0-r3 changed
5356 GET_INST_OPCODE ip @ extract opcode from rINST
5357 SET_VREG r0, r9 @ vAA<- r0
5358 GOTO_OPCODE ip @ jump to next instruction
5359 /* 10-13 instructions */
5360
5361
5362/* ------------------------------ */
5363 .balign 128
5364.L_op_sub_int_2addr: /* 0xb1 */
5365/* File: arm/op_sub_int_2addr.S */
5366/* File: arm/binop2addr.S */
5367 /*
5368 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5369 * that specifies an instruction that performs "result = r0 op r1".
5370 * This could be an ARM instruction or a function call. (If the result
5371 * comes back in a register other than r0, you can override "result".)
5372 *
5373 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5374 * vCC (r1). Useful for integer division and modulus.
5375 *
5376 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5377 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5378 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5379 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5380 */
5381 /* binop/2addr vA, vB */
5382 mov r3, rINST, lsr #12 @ r3<- B
5383 ubfx r9, rINST, #8, #4 @ r9<- A
5384 GET_VREG r1, r3 @ r1<- vB
5385 GET_VREG r0, r9 @ r0<- vA
5386 .if 0
5387 cmp r1, #0 @ is second operand zero?
5388 beq common_errDivideByZero
5389 .endif
5390 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5391
5392 @ optional op; may set condition codes
5393 sub r0, r0, r1 @ r0<- op, r0-r3 changed
5394 GET_INST_OPCODE ip @ extract opcode from rINST
5395 SET_VREG r0, r9 @ vAA<- r0
5396 GOTO_OPCODE ip @ jump to next instruction
5397 /* 10-13 instructions */
5398
5399
5400/* ------------------------------ */
5401 .balign 128
5402.L_op_mul_int_2addr: /* 0xb2 */
5403/* File: arm/op_mul_int_2addr.S */
5404/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
5405/* File: arm/binop2addr.S */
5406 /*
5407 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5408 * that specifies an instruction that performs "result = r0 op r1".
5409 * This could be an ARM instruction or a function call. (If the result
5410 * comes back in a register other than r0, you can override "result".)
5411 *
5412 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5413 * vCC (r1). Useful for integer division and modulus.
5414 *
5415 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5416 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5417 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5418 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5419 */
5420 /* binop/2addr vA, vB */
5421 mov r3, rINST, lsr #12 @ r3<- B
5422 ubfx r9, rINST, #8, #4 @ r9<- A
5423 GET_VREG r1, r3 @ r1<- vB
5424 GET_VREG r0, r9 @ r0<- vA
5425 .if 0
5426 cmp r1, #0 @ is second operand zero?
5427 beq common_errDivideByZero
5428 .endif
5429 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5430
5431 @ optional op; may set condition codes
5432 mul r0, r1, r0 @ r0<- op, r0-r3 changed
5433 GET_INST_OPCODE ip @ extract opcode from rINST
5434 SET_VREG r0, r9 @ vAA<- r0
5435 GOTO_OPCODE ip @ jump to next instruction
5436 /* 10-13 instructions */
5437
5438
5439/* ------------------------------ */
5440 .balign 128
5441.L_op_div_int_2addr: /* 0xb3 */
5442/* File: arm/op_div_int_2addr.S */
5443 /*
5444 * Specialized 32-bit binary operation
5445 *
5446 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
5447 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
5448 * ARMv7 CPUs that have hardware division support).
5449 *
5450 * div-int/2addr
5451 *
5452 */
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 cmp r1, #0 @ is second operand zero?
5458 beq common_errDivideByZero
5459 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5460
5461#ifdef __ARM_ARCH_EXT_IDIV__
5462 sdiv r0, r0, r1 @ r0<- op
5463#else
5464 bl __aeabi_idiv @ r0<- op, r0-r3 changed
5465#endif
5466 GET_INST_OPCODE ip @ extract opcode from rINST
5467 SET_VREG r0, r9 @ vAA<- r0
5468 GOTO_OPCODE ip @ jump to next instruction
5469 /* 10-13 instructions */
5470
5471
5472/* ------------------------------ */
5473 .balign 128
5474.L_op_rem_int_2addr: /* 0xb4 */
5475/* File: arm/op_rem_int_2addr.S */
5476 /*
5477 * Specialized 32-bit binary operation
5478 *
5479 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
5480 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
5481 * ARMv7 CPUs that have hardware division support).
5482 *
5483 * NOTE: idivmod returns quotient in r0 and remainder in r1
5484 *
5485 * rem-int/2addr
5486 *
5487 */
5488 mov r3, rINST, lsr #12 @ r3<- B
5489 ubfx r9, rINST, #8, #4 @ r9<- A
5490 GET_VREG r1, r3 @ r1<- vB
5491 GET_VREG r0, r9 @ r0<- vA
5492 cmp r1, #0 @ is second operand zero?
5493 beq common_errDivideByZero
5494 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5495
5496#ifdef __ARM_ARCH_EXT_IDIV__
5497 sdiv r2, r0, r1
5498 mls r1, r1, r2, r0 @ r1<- op
5499#else
5500 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
5501#endif
5502 GET_INST_OPCODE ip @ extract opcode from rINST
5503 SET_VREG r1, r9 @ vAA<- r1
5504 GOTO_OPCODE ip @ jump to next instruction
5505 /* 10-13 instructions */
5506
5507
5508/* ------------------------------ */
5509 .balign 128
5510.L_op_and_int_2addr: /* 0xb5 */
5511/* File: arm/op_and_int_2addr.S */
5512/* File: arm/binop2addr.S */
5513 /*
5514 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5515 * that specifies an instruction that performs "result = r0 op r1".
5516 * This could be an ARM instruction or a function call. (If the result
5517 * comes back in a register other than r0, you can override "result".)
5518 *
5519 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5520 * vCC (r1). Useful for integer division and modulus.
5521 *
5522 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5523 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5524 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5525 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5526 */
5527 /* binop/2addr vA, vB */
5528 mov r3, rINST, lsr #12 @ r3<- B
5529 ubfx r9, rINST, #8, #4 @ r9<- A
5530 GET_VREG r1, r3 @ r1<- vB
5531 GET_VREG r0, r9 @ r0<- vA
5532 .if 0
5533 cmp r1, #0 @ is second operand zero?
5534 beq common_errDivideByZero
5535 .endif
5536 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5537
5538 @ optional op; may set condition codes
5539 and r0, r0, r1 @ r0<- op, r0-r3 changed
5540 GET_INST_OPCODE ip @ extract opcode from rINST
5541 SET_VREG r0, r9 @ vAA<- r0
5542 GOTO_OPCODE ip @ jump to next instruction
5543 /* 10-13 instructions */
5544
5545
5546/* ------------------------------ */
5547 .balign 128
5548.L_op_or_int_2addr: /* 0xb6 */
5549/* File: arm/op_or_int_2addr.S */
5550/* File: arm/binop2addr.S */
5551 /*
5552 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5553 * that specifies an instruction that performs "result = r0 op r1".
5554 * This could be an ARM instruction or a function call. (If the result
5555 * comes back in a register other than r0, you can override "result".)
5556 *
5557 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5558 * vCC (r1). Useful for integer division and modulus.
5559 *
5560 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5561 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5562 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5563 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5564 */
5565 /* binop/2addr vA, vB */
5566 mov r3, rINST, lsr #12 @ r3<- B
5567 ubfx r9, rINST, #8, #4 @ r9<- A
5568 GET_VREG r1, r3 @ r1<- vB
5569 GET_VREG r0, r9 @ r0<- vA
5570 .if 0
5571 cmp r1, #0 @ is second operand zero?
5572 beq common_errDivideByZero
5573 .endif
5574 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5575
5576 @ optional op; may set condition codes
5577 orr r0, r0, r1 @ r0<- op, r0-r3 changed
5578 GET_INST_OPCODE ip @ extract opcode from rINST
5579 SET_VREG r0, r9 @ vAA<- r0
5580 GOTO_OPCODE ip @ jump to next instruction
5581 /* 10-13 instructions */
5582
5583
5584/* ------------------------------ */
5585 .balign 128
5586.L_op_xor_int_2addr: /* 0xb7 */
5587/* File: arm/op_xor_int_2addr.S */
5588/* File: arm/binop2addr.S */
5589 /*
5590 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5591 * that specifies an instruction that performs "result = r0 op r1".
5592 * This could be an ARM instruction or a function call. (If the result
5593 * comes back in a register other than r0, you can override "result".)
5594 *
5595 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5596 * vCC (r1). Useful for integer division and modulus.
5597 *
5598 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5599 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5600 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5601 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5602 */
5603 /* binop/2addr vA, vB */
5604 mov r3, rINST, lsr #12 @ r3<- B
5605 ubfx r9, rINST, #8, #4 @ r9<- A
5606 GET_VREG r1, r3 @ r1<- vB
5607 GET_VREG r0, r9 @ r0<- vA
5608 .if 0
5609 cmp r1, #0 @ is second operand zero?
5610 beq common_errDivideByZero
5611 .endif
5612 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5613
5614 @ optional op; may set condition codes
5615 eor r0, r0, r1 @ r0<- op, r0-r3 changed
5616 GET_INST_OPCODE ip @ extract opcode from rINST
5617 SET_VREG r0, r9 @ vAA<- r0
5618 GOTO_OPCODE ip @ jump to next instruction
5619 /* 10-13 instructions */
5620
5621
5622/* ------------------------------ */
5623 .balign 128
5624.L_op_shl_int_2addr: /* 0xb8 */
5625/* File: arm/op_shl_int_2addr.S */
5626/* File: arm/binop2addr.S */
5627 /*
5628 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5629 * that specifies an instruction that performs "result = r0 op r1".
5630 * This could be an ARM instruction or a function call. (If the result
5631 * comes back in a register other than r0, you can override "result".)
5632 *
5633 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5634 * vCC (r1). Useful for integer division and modulus.
5635 *
5636 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5637 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5638 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5639 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5640 */
5641 /* binop/2addr vA, vB */
5642 mov r3, rINST, lsr #12 @ r3<- B
5643 ubfx r9, rINST, #8, #4 @ r9<- A
5644 GET_VREG r1, r3 @ r1<- vB
5645 GET_VREG r0, r9 @ r0<- vA
5646 .if 0
5647 cmp r1, #0 @ is second operand zero?
5648 beq common_errDivideByZero
5649 .endif
5650 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5651
5652 and r1, r1, #31 @ optional op; may set condition codes
5653 mov r0, r0, asl r1 @ r0<- op, r0-r3 changed
5654 GET_INST_OPCODE ip @ extract opcode from rINST
5655 SET_VREG r0, r9 @ vAA<- r0
5656 GOTO_OPCODE ip @ jump to next instruction
5657 /* 10-13 instructions */
5658
5659
5660/* ------------------------------ */
5661 .balign 128
5662.L_op_shr_int_2addr: /* 0xb9 */
5663/* File: arm/op_shr_int_2addr.S */
5664/* File: arm/binop2addr.S */
5665 /*
5666 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5667 * that specifies an instruction that performs "result = r0 op r1".
5668 * This could be an ARM instruction or a function call. (If the result
5669 * comes back in a register other than r0, you can override "result".)
5670 *
5671 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5672 * vCC (r1). Useful for integer division and modulus.
5673 *
5674 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5675 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5676 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5677 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5678 */
5679 /* binop/2addr vA, vB */
5680 mov r3, rINST, lsr #12 @ r3<- B
5681 ubfx r9, rINST, #8, #4 @ r9<- A
5682 GET_VREG r1, r3 @ r1<- vB
5683 GET_VREG r0, r9 @ r0<- vA
5684 .if 0
5685 cmp r1, #0 @ is second operand zero?
5686 beq common_errDivideByZero
5687 .endif
5688 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5689
5690 and r1, r1, #31 @ optional op; may set condition codes
5691 mov r0, r0, asr r1 @ r0<- op, r0-r3 changed
5692 GET_INST_OPCODE ip @ extract opcode from rINST
5693 SET_VREG r0, r9 @ vAA<- r0
5694 GOTO_OPCODE ip @ jump to next instruction
5695 /* 10-13 instructions */
5696
5697
5698/* ------------------------------ */
5699 .balign 128
5700.L_op_ushr_int_2addr: /* 0xba */
5701/* File: arm/op_ushr_int_2addr.S */
5702/* File: arm/binop2addr.S */
5703 /*
5704 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
5705 * that specifies an instruction that performs "result = r0 op r1".
5706 * This could be an ARM instruction or a function call. (If the result
5707 * comes back in a register other than r0, you can override "result".)
5708 *
5709 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5710 * vCC (r1). Useful for integer division and modulus.
5711 *
5712 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5713 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5714 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5715 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5716 */
5717 /* binop/2addr vA, vB */
5718 mov r3, rINST, lsr #12 @ r3<- B
5719 ubfx r9, rINST, #8, #4 @ r9<- A
5720 GET_VREG r1, r3 @ r1<- vB
5721 GET_VREG r0, r9 @ r0<- vA
5722 .if 0
5723 cmp r1, #0 @ is second operand zero?
5724 beq common_errDivideByZero
5725 .endif
5726 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5727
5728 and r1, r1, #31 @ optional op; may set condition codes
5729 mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed
5730 GET_INST_OPCODE ip @ extract opcode from rINST
5731 SET_VREG r0, r9 @ vAA<- r0
5732 GOTO_OPCODE ip @ jump to next instruction
5733 /* 10-13 instructions */
5734
5735
5736/* ------------------------------ */
5737 .balign 128
5738.L_op_add_long_2addr: /* 0xbb */
5739/* File: arm/op_add_long_2addr.S */
5740/* File: arm/binopWide2addr.S */
5741 /*
5742 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5743 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5744 * This could be an ARM instruction or a function call. (If the result
5745 * comes back in a register other than r0, you can override "result".)
5746 *
5747 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5748 * vCC (r1). Useful for integer division and modulus.
5749 *
5750 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5751 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5752 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5753 * rem-double/2addr
5754 */
5755 /* binop/2addr vA, vB */
5756 mov r1, rINST, lsr #12 @ r1<- B
5757 ubfx r9, rINST, #8, #4 @ r9<- A
5758 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
5759 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
5760 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5761 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5762 .if 0
5763 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5764 beq common_errDivideByZero
5765 .endif
5766 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5767
5768 adds r0, r0, r2 @ optional op; may set condition codes
5769 adc r1, r1, r3 @ result<- op, r0-r3 changed
5770 GET_INST_OPCODE ip @ extract opcode from rINST
5771 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5772 GOTO_OPCODE ip @ jump to next instruction
5773 /* 12-15 instructions */
5774
5775
5776/* ------------------------------ */
5777 .balign 128
5778.L_op_sub_long_2addr: /* 0xbc */
5779/* File: arm/op_sub_long_2addr.S */
5780/* File: arm/binopWide2addr.S */
5781 /*
5782 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5783 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5784 * This could be an ARM instruction or a function call. (If the result
5785 * comes back in a register other than r0, you can override "result".)
5786 *
5787 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5788 * vCC (r1). Useful for integer division and modulus.
5789 *
5790 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5791 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5792 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5793 * rem-double/2addr
5794 */
5795 /* binop/2addr vA, vB */
5796 mov r1, rINST, lsr #12 @ r1<- B
5797 ubfx r9, rINST, #8, #4 @ r9<- A
5798 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
5799 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
5800 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5801 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5802 .if 0
5803 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5804 beq common_errDivideByZero
5805 .endif
5806 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5807
5808 subs r0, r0, r2 @ optional op; may set condition codes
5809 sbc r1, r1, r3 @ result<- op, r0-r3 changed
5810 GET_INST_OPCODE ip @ extract opcode from rINST
5811 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5812 GOTO_OPCODE ip @ jump to next instruction
5813 /* 12-15 instructions */
5814
5815
5816/* ------------------------------ */
5817 .balign 128
5818.L_op_mul_long_2addr: /* 0xbd */
5819/* File: arm/op_mul_long_2addr.S */
5820 /*
5821 * Signed 64-bit integer multiply, "/2addr" version.
5822 *
5823 * See op_mul_long for an explanation.
5824 *
5825 * We get a little tight on registers, so to avoid looking up &fp[A]
5826 * again we stuff it into rINST.
5827 */
5828 /* mul-long/2addr vA, vB */
5829 mov r1, rINST, lsr #12 @ r1<- B
5830 ubfx r9, rINST, #8, #4 @ r9<- A
5831 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
5832 add rINST, rFP, r9, lsl #2 @ rINST<- &fp[A]
5833 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5834 ldmia rINST, {r0-r1} @ r0/r1<- vAA/vAA+1
5835 mul ip, r2, r1 @ ip<- ZxW
5836 umull r9, r10, r2, r0 @ r9/r10 <- ZxX
5837 mla r2, r0, r3, ip @ r2<- YxX + (ZxW)
5838 mov r0, rINST @ r0<- &fp[A] (free up rINST)
5839 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5840 add r10, r2, r10 @ r10<- r10 + low(ZxW + (YxX))
5841 GET_INST_OPCODE ip @ extract opcode from rINST
5842 stmia r0, {r9-r10} @ vAA/vAA+1<- r9/r10
5843 GOTO_OPCODE ip @ jump to next instruction
5844
5845/* ------------------------------ */
5846 .balign 128
5847.L_op_div_long_2addr: /* 0xbe */
5848/* File: arm/op_div_long_2addr.S */
5849/* File: arm/binopWide2addr.S */
5850 /*
5851 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5852 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5853 * This could be an ARM instruction or a function call. (If the result
5854 * comes back in a register other than r0, you can override "result".)
5855 *
5856 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5857 * vCC (r1). Useful for integer division and modulus.
5858 *
5859 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5860 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5861 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5862 * rem-double/2addr
5863 */
5864 /* binop/2addr vA, vB */
5865 mov r1, rINST, lsr #12 @ r1<- B
5866 ubfx r9, rINST, #8, #4 @ r9<- A
5867 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
5868 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
5869 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5870 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5871 .if 1
5872 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5873 beq common_errDivideByZero
5874 .endif
5875 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5876
5877 @ optional op; may set condition codes
5878 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
5879 GET_INST_OPCODE ip @ extract opcode from rINST
5880 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5881 GOTO_OPCODE ip @ jump to next instruction
5882 /* 12-15 instructions */
5883
5884
5885/* ------------------------------ */
5886 .balign 128
5887.L_op_rem_long_2addr: /* 0xbf */
5888/* File: arm/op_rem_long_2addr.S */
5889/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
5890/* File: arm/binopWide2addr.S */
5891 /*
5892 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5893 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5894 * This could be an ARM instruction or a function call. (If the result
5895 * comes back in a register other than r0, you can override "result".)
5896 *
5897 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5898 * vCC (r1). Useful for integer division and modulus.
5899 *
5900 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5901 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5902 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5903 * rem-double/2addr
5904 */
5905 /* binop/2addr vA, vB */
5906 mov r1, rINST, lsr #12 @ r1<- B
5907 ubfx r9, rINST, #8, #4 @ r9<- A
5908 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
5909 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
5910 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5911 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5912 .if 1
5913 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5914 beq common_errDivideByZero
5915 .endif
5916 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5917
5918 @ optional op; may set condition codes
5919 bl __aeabi_ldivmod @ result<- op, r0-r3 changed
5920 GET_INST_OPCODE ip @ extract opcode from rINST
5921 stmia r9, {r2,r3} @ vAA/vAA+1<- r2/r3
5922 GOTO_OPCODE ip @ jump to next instruction
5923 /* 12-15 instructions */
5924
5925
5926/* ------------------------------ */
5927 .balign 128
5928.L_op_and_long_2addr: /* 0xc0 */
5929/* File: arm/op_and_long_2addr.S */
5930/* File: arm/binopWide2addr.S */
5931 /*
5932 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5933 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5934 * This could be an ARM instruction or a function call. (If the result
5935 * comes back in a register other than r0, you can override "result".)
5936 *
5937 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5938 * vCC (r1). Useful for integer division and modulus.
5939 *
5940 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5941 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5942 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5943 * rem-double/2addr
5944 */
5945 /* binop/2addr vA, vB */
5946 mov r1, rINST, lsr #12 @ r1<- B
5947 ubfx r9, rINST, #8, #4 @ r9<- A
5948 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
5949 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
5950 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5951 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5952 .if 0
5953 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5954 beq common_errDivideByZero
5955 .endif
5956 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5957
5958 and r0, r0, r2 @ optional op; may set condition codes
5959 and r1, r1, r3 @ result<- op, r0-r3 changed
5960 GET_INST_OPCODE ip @ extract opcode from rINST
5961 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
5962 GOTO_OPCODE ip @ jump to next instruction
5963 /* 12-15 instructions */
5964
5965
5966/* ------------------------------ */
5967 .balign 128
5968.L_op_or_long_2addr: /* 0xc1 */
5969/* File: arm/op_or_long_2addr.S */
5970/* File: arm/binopWide2addr.S */
5971 /*
5972 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
5973 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5974 * This could be an ARM instruction or a function call. (If the result
5975 * comes back in a register other than r0, you can override "result".)
5976 *
5977 * If "chkzero" is set to 1, we perform a divide-by-zero check on
5978 * vCC (r1). Useful for integer division and modulus.
5979 *
5980 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5981 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5982 * sub-double/2addr, mul-double/2addr, div-double/2addr,
5983 * rem-double/2addr
5984 */
5985 /* binop/2addr vA, vB */
5986 mov r1, rINST, lsr #12 @ r1<- B
5987 ubfx r9, rINST, #8, #4 @ r9<- A
5988 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
5989 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
5990 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
5991 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
5992 .if 0
5993 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
5994 beq common_errDivideByZero
5995 .endif
5996 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
5997
5998 orr r0, r0, r2 @ optional op; may set condition codes
5999 orr r1, r1, r3 @ result<- op, r0-r3 changed
6000 GET_INST_OPCODE ip @ extract opcode from rINST
6001 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6002 GOTO_OPCODE ip @ jump to next instruction
6003 /* 12-15 instructions */
6004
6005
6006/* ------------------------------ */
6007 .balign 128
6008.L_op_xor_long_2addr: /* 0xc2 */
6009/* File: arm/op_xor_long_2addr.S */
6010/* File: arm/binopWide2addr.S */
6011 /*
6012 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6013 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6014 * This could be an ARM instruction or a function call. (If the result
6015 * comes back in a register other than r0, you can override "result".)
6016 *
6017 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6018 * vCC (r1). Useful for integer division and modulus.
6019 *
6020 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6021 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6022 * sub-double/2addr, mul-double/2addr, div-double/2addr,
6023 * rem-double/2addr
6024 */
6025 /* binop/2addr vA, vB */
6026 mov r1, rINST, lsr #12 @ r1<- B
6027 ubfx r9, rINST, #8, #4 @ r9<- A
6028 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
6029 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6030 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6031 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6032 .if 0
6033 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6034 beq common_errDivideByZero
6035 .endif
6036 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6037
6038 eor r0, r0, r2 @ optional op; may set condition codes
6039 eor r1, r1, r3 @ result<- op, r0-r3 changed
6040 GET_INST_OPCODE ip @ extract opcode from rINST
6041 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6042 GOTO_OPCODE ip @ jump to next instruction
6043 /* 12-15 instructions */
6044
6045
6046/* ------------------------------ */
6047 .balign 128
6048.L_op_shl_long_2addr: /* 0xc3 */
6049/* File: arm/op_shl_long_2addr.S */
6050 /*
6051 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
6052 * 32-bit shift distance.
6053 */
6054 /* shl-long/2addr vA, vB */
6055 mov r3, rINST, lsr #12 @ r3<- B
6056 ubfx r9, rINST, #8, #4 @ r9<- A
6057 GET_VREG r2, r3 @ r2<- vB
6058 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6059 and r2, r2, #63 @ r2<- r2 & 0x3f
6060 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6061
6062 mov r1, r1, asl r2 @ r1<- r1 << r2
6063 rsb r3, r2, #32 @ r3<- 32 - r2
6064 orr r1, r1, r0, lsr r3 @ r1<- r1 | (r0 << (32-r2))
6065 subs ip, r2, #32 @ ip<- r2 - 32
6066 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6067 movpl r1, r0, asl ip @ if r2 >= 32, r1<- r0 << (r2-32)
6068 mov r0, r0, asl r2 @ r0<- r0 << r2
6069 GET_INST_OPCODE ip @ extract opcode from rINST
6070 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
6071 GOTO_OPCODE ip @ jump to next instruction
6072
6073/* ------------------------------ */
6074 .balign 128
6075.L_op_shr_long_2addr: /* 0xc4 */
6076/* File: arm/op_shr_long_2addr.S */
6077 /*
6078 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
6079 * 32-bit shift distance.
6080 */
6081 /* shr-long/2addr vA, vB */
6082 mov r3, rINST, lsr #12 @ r3<- B
6083 ubfx r9, rINST, #8, #4 @ r9<- A
6084 GET_VREG r2, r3 @ r2<- vB
6085 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6086 and r2, r2, #63 @ r2<- r2 & 0x3f
6087 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6088
6089 mov r0, r0, lsr r2 @ r0<- r2 >> r2
6090 rsb r3, r2, #32 @ r3<- 32 - r2
6091 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
6092 subs ip, r2, #32 @ ip<- r2 - 32
6093 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6094 movpl r0, r1, asr ip @ if r2 >= 32, r0<-r1 >> (r2-32)
6095 mov r1, r1, asr r2 @ r1<- r1 >> r2
6096 GET_INST_OPCODE ip @ extract opcode from rINST
6097 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
6098 GOTO_OPCODE ip @ jump to next instruction
6099
6100/* ------------------------------ */
6101 .balign 128
6102.L_op_ushr_long_2addr: /* 0xc5 */
6103/* File: arm/op_ushr_long_2addr.S */
6104 /*
6105 * Long integer shift, 2addr version. vA is 64-bit value/result, vB is
6106 * 32-bit shift distance.
6107 */
6108 /* ushr-long/2addr vA, vB */
6109 mov r3, rINST, lsr #12 @ r3<- B
6110 ubfx r9, rINST, #8, #4 @ r9<- A
6111 GET_VREG r2, r3 @ r2<- vB
6112 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6113 and r2, r2, #63 @ r2<- r2 & 0x3f
6114 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6115
6116 mov r0, r0, lsr r2 @ r0<- r2 >> r2
6117 rsb r3, r2, #32 @ r3<- 32 - r2
6118 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
6119 subs ip, r2, #32 @ ip<- r2 - 32
6120 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6121 movpl r0, r1, lsr ip @ if r2 >= 32, r0<-r1 >>> (r2-32)
6122 mov r1, r1, lsr r2 @ r1<- r1 >>> r2
6123 GET_INST_OPCODE ip @ extract opcode from rINST
6124 stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1
6125 GOTO_OPCODE ip @ jump to next instruction
6126
6127/* ------------------------------ */
6128 .balign 128
6129.L_op_add_float_2addr: /* 0xc6 */
6130/* File: arm/op_add_float_2addr.S */
6131/* File: arm/fbinop2addr.S */
6132 /*
6133 * Generic 32-bit floating point "/2addr" binary operation. Provide
6134 * an "instr" line that specifies an instruction that performs
6135 * "s2 = s0 op s1".
6136 *
6137 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6138 */
6139 /* binop/2addr vA, vB */
6140 mov r3, rINST, lsr #12 @ r3<- B
6141 mov r9, rINST, lsr #8 @ r9<- A+
6142 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6143 and r9, r9, #15 @ r9<- A
6144 flds s1, [r3] @ s1<- vB
6145 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6146 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6147 flds s0, [r9] @ s0<- vA
6148
6149 fadds s2, s0, s1 @ s2<- op
6150 GET_INST_OPCODE ip @ extract opcode from rINST
6151 fsts s2, [r9] @ vAA<- s2
6152 GOTO_OPCODE ip @ jump to next instruction
6153
6154
6155/* ------------------------------ */
6156 .balign 128
6157.L_op_sub_float_2addr: /* 0xc7 */
6158/* File: arm/op_sub_float_2addr.S */
6159/* File: arm/fbinop2addr.S */
6160 /*
6161 * Generic 32-bit floating point "/2addr" binary operation. Provide
6162 * an "instr" line that specifies an instruction that performs
6163 * "s2 = s0 op s1".
6164 *
6165 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6166 */
6167 /* binop/2addr vA, vB */
6168 mov r3, rINST, lsr #12 @ r3<- B
6169 mov r9, rINST, lsr #8 @ r9<- A+
6170 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6171 and r9, r9, #15 @ r9<- A
6172 flds s1, [r3] @ s1<- vB
6173 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6174 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6175 flds s0, [r9] @ s0<- vA
6176
6177 fsubs s2, s0, s1 @ s2<- op
6178 GET_INST_OPCODE ip @ extract opcode from rINST
6179 fsts s2, [r9] @ vAA<- s2
6180 GOTO_OPCODE ip @ jump to next instruction
6181
6182
6183/* ------------------------------ */
6184 .balign 128
6185.L_op_mul_float_2addr: /* 0xc8 */
6186/* File: arm/op_mul_float_2addr.S */
6187/* File: arm/fbinop2addr.S */
6188 /*
6189 * Generic 32-bit floating point "/2addr" binary operation. Provide
6190 * an "instr" line that specifies an instruction that performs
6191 * "s2 = s0 op s1".
6192 *
6193 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6194 */
6195 /* binop/2addr vA, vB */
6196 mov r3, rINST, lsr #12 @ r3<- B
6197 mov r9, rINST, lsr #8 @ r9<- A+
6198 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6199 and r9, r9, #15 @ r9<- A
6200 flds s1, [r3] @ s1<- vB
6201 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6202 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6203 flds s0, [r9] @ s0<- vA
6204
6205 fmuls s2, s0, s1 @ s2<- op
6206 GET_INST_OPCODE ip @ extract opcode from rINST
6207 fsts s2, [r9] @ vAA<- s2
6208 GOTO_OPCODE ip @ jump to next instruction
6209
6210
6211/* ------------------------------ */
6212 .balign 128
6213.L_op_div_float_2addr: /* 0xc9 */
6214/* File: arm/op_div_float_2addr.S */
6215/* File: arm/fbinop2addr.S */
6216 /*
6217 * Generic 32-bit floating point "/2addr" binary operation. Provide
6218 * an "instr" line that specifies an instruction that performs
6219 * "s2 = s0 op s1".
6220 *
6221 * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6222 */
6223 /* binop/2addr vA, vB */
6224 mov r3, rINST, lsr #12 @ r3<- B
6225 mov r9, rINST, lsr #8 @ r9<- A+
6226 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6227 and r9, r9, #15 @ r9<- A
6228 flds s1, [r3] @ s1<- vB
6229 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6230 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6231 flds s0, [r9] @ s0<- vA
6232
6233 fdivs s2, s0, s1 @ s2<- op
6234 GET_INST_OPCODE ip @ extract opcode from rINST
6235 fsts s2, [r9] @ vAA<- s2
6236 GOTO_OPCODE ip @ jump to next instruction
6237
6238
6239/* ------------------------------ */
6240 .balign 128
6241.L_op_rem_float_2addr: /* 0xca */
6242/* File: arm/op_rem_float_2addr.S */
6243/* EABI doesn't define a float remainder function, but libm does */
6244/* File: arm/binop2addr.S */
6245 /*
6246 * Generic 32-bit "/2addr" binary operation. Provide an "instr" line
6247 * that specifies an instruction that performs "result = r0 op r1".
6248 * This could be an ARM instruction or a function call. (If the result
6249 * comes back in a register other than r0, you can override "result".)
6250 *
6251 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6252 * vCC (r1). Useful for integer division and modulus.
6253 *
6254 * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6255 * rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6256 * shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6257 * sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6258 */
6259 /* binop/2addr vA, vB */
6260 mov r3, rINST, lsr #12 @ r3<- B
6261 ubfx r9, rINST, #8, #4 @ r9<- A
6262 GET_VREG r1, r3 @ r1<- vB
6263 GET_VREG r0, r9 @ r0<- vA
6264 .if 0
6265 cmp r1, #0 @ is second operand zero?
6266 beq common_errDivideByZero
6267 .endif
6268 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6269
6270 @ optional op; may set condition codes
6271 bl fmodf @ r0<- op, r0-r3 changed
6272 GET_INST_OPCODE ip @ extract opcode from rINST
6273 SET_VREG r0, r9 @ vAA<- r0
6274 GOTO_OPCODE ip @ jump to next instruction
6275 /* 10-13 instructions */
6276
6277
6278/* ------------------------------ */
6279 .balign 128
6280.L_op_add_double_2addr: /* 0xcb */
6281/* File: arm/op_add_double_2addr.S */
6282/* File: arm/fbinopWide2addr.S */
6283 /*
6284 * Generic 64-bit floating point "/2addr" binary operation. Provide
6285 * an "instr" line that specifies an instruction that performs
6286 * "d2 = d0 op d1".
6287 *
6288 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6289 * div-double/2addr
6290 */
6291 /* binop/2addr vA, vB */
6292 mov r3, rINST, lsr #12 @ r3<- B
6293 mov r9, rINST, lsr #8 @ r9<- A+
6294 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6295 and r9, r9, #15 @ r9<- A
6296 fldd d1, [r3] @ d1<- vB
6297 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6298 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6299 fldd d0, [r9] @ d0<- vA
6300
6301 faddd d2, d0, d1 @ d2<- op
6302 GET_INST_OPCODE ip @ extract opcode from rINST
6303 fstd d2, [r9] @ vAA<- d2
6304 GOTO_OPCODE ip @ jump to next instruction
6305
6306
6307/* ------------------------------ */
6308 .balign 128
6309.L_op_sub_double_2addr: /* 0xcc */
6310/* File: arm/op_sub_double_2addr.S */
6311/* File: arm/fbinopWide2addr.S */
6312 /*
6313 * Generic 64-bit floating point "/2addr" binary operation. Provide
6314 * an "instr" line that specifies an instruction that performs
6315 * "d2 = d0 op d1".
6316 *
6317 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6318 * div-double/2addr
6319 */
6320 /* binop/2addr vA, vB */
6321 mov r3, rINST, lsr #12 @ r3<- B
6322 mov r9, rINST, lsr #8 @ r9<- A+
6323 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6324 and r9, r9, #15 @ r9<- A
6325 fldd d1, [r3] @ d1<- vB
6326 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6327 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6328 fldd d0, [r9] @ d0<- vA
6329
6330 fsubd d2, d0, d1 @ d2<- op
6331 GET_INST_OPCODE ip @ extract opcode from rINST
6332 fstd d2, [r9] @ vAA<- d2
6333 GOTO_OPCODE ip @ jump to next instruction
6334
6335
6336/* ------------------------------ */
6337 .balign 128
6338.L_op_mul_double_2addr: /* 0xcd */
6339/* File: arm/op_mul_double_2addr.S */
6340/* File: arm/fbinopWide2addr.S */
6341 /*
6342 * Generic 64-bit floating point "/2addr" binary operation. Provide
6343 * an "instr" line that specifies an instruction that performs
6344 * "d2 = d0 op d1".
6345 *
6346 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6347 * div-double/2addr
6348 */
6349 /* binop/2addr vA, vB */
6350 mov r3, rINST, lsr #12 @ r3<- B
6351 mov r9, rINST, lsr #8 @ r9<- A+
6352 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6353 and r9, r9, #15 @ r9<- A
6354 fldd d1, [r3] @ d1<- vB
6355 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6356 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6357 fldd d0, [r9] @ d0<- vA
6358
6359 fmuld d2, d0, d1 @ d2<- op
6360 GET_INST_OPCODE ip @ extract opcode from rINST
6361 fstd d2, [r9] @ vAA<- d2
6362 GOTO_OPCODE ip @ jump to next instruction
6363
6364
6365/* ------------------------------ */
6366 .balign 128
6367.L_op_div_double_2addr: /* 0xce */
6368/* File: arm/op_div_double_2addr.S */
6369/* File: arm/fbinopWide2addr.S */
6370 /*
6371 * Generic 64-bit floating point "/2addr" binary operation. Provide
6372 * an "instr" line that specifies an instruction that performs
6373 * "d2 = d0 op d1".
6374 *
6375 * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6376 * div-double/2addr
6377 */
6378 /* binop/2addr vA, vB */
6379 mov r3, rINST, lsr #12 @ r3<- B
6380 mov r9, rINST, lsr #8 @ r9<- A+
6381 VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB
6382 and r9, r9, #15 @ r9<- A
6383 fldd d1, [r3] @ d1<- vB
6384 VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA
6385 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6386 fldd d0, [r9] @ d0<- vA
6387
6388 fdivd d2, d0, d1 @ d2<- op
6389 GET_INST_OPCODE ip @ extract opcode from rINST
6390 fstd d2, [r9] @ vAA<- d2
6391 GOTO_OPCODE ip @ jump to next instruction
6392
6393
6394/* ------------------------------ */
6395 .balign 128
6396.L_op_rem_double_2addr: /* 0xcf */
6397/* File: arm/op_rem_double_2addr.S */
6398/* EABI doesn't define a double remainder function, but libm does */
6399/* File: arm/binopWide2addr.S */
6400 /*
6401 * Generic 64-bit "/2addr" binary operation. Provide an "instr" line
6402 * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6403 * This could be an ARM instruction or a function call. (If the result
6404 * comes back in a register other than r0, you can override "result".)
6405 *
6406 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6407 * vCC (r1). Useful for integer division and modulus.
6408 *
6409 * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6410 * and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6411 * sub-double/2addr, mul-double/2addr, div-double/2addr,
6412 * rem-double/2addr
6413 */
6414 /* binop/2addr vA, vB */
6415 mov r1, rINST, lsr #12 @ r1<- B
6416 ubfx r9, rINST, #8, #4 @ r9<- A
6417 add r1, rFP, r1, lsl #2 @ r1<- &fp[B]
6418 add r9, rFP, r9, lsl #2 @ r9<- &fp[A]
6419 ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1
6420 ldmia r9, {r0-r1} @ r0/r1<- vAA/vAA+1
6421 .if 0
6422 orrs ip, r2, r3 @ second arg (r2-r3) is zero?
6423 beq common_errDivideByZero
6424 .endif
6425 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST
6426
6427 @ optional op; may set condition codes
6428 bl fmod @ result<- op, r0-r3 changed
6429 GET_INST_OPCODE ip @ extract opcode from rINST
6430 stmia r9, {r0,r1} @ vAA/vAA+1<- r0/r1
6431 GOTO_OPCODE ip @ jump to next instruction
6432 /* 12-15 instructions */
6433
6434
6435/* ------------------------------ */
6436 .balign 128
6437.L_op_add_int_lit16: /* 0xd0 */
6438/* File: arm/op_add_int_lit16.S */
6439/* File: arm/binopLit16.S */
6440 /*
6441 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6442 * that specifies an instruction that performs "result = r0 op r1".
6443 * This could be an ARM instruction or a function call. (If the result
6444 * comes back in a register other than r0, you can override "result".)
6445 *
6446 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6447 * vCC (r1). Useful for integer division and modulus.
6448 *
6449 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6450 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6451 */
6452 /* binop/lit16 vA, vB, #+CCCC */
6453 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6454 mov r2, rINST, lsr #12 @ r2<- B
6455 ubfx r9, rINST, #8, #4 @ r9<- A
6456 GET_VREG r0, r2 @ r0<- vB
6457 .if 0
6458 cmp r1, #0 @ is second operand zero?
6459 beq common_errDivideByZero
6460 .endif
6461 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6462
6463 add r0, r0, r1 @ r0<- op, r0-r3 changed
6464 GET_INST_OPCODE ip @ extract opcode from rINST
6465 SET_VREG r0, r9 @ vAA<- r0
6466 GOTO_OPCODE ip @ jump to next instruction
6467 /* 10-13 instructions */
6468
6469
6470/* ------------------------------ */
6471 .balign 128
6472.L_op_rsub_int: /* 0xd1 */
6473/* File: arm/op_rsub_int.S */
6474/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
6475/* File: arm/binopLit16.S */
6476 /*
6477 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6478 * that specifies an instruction that performs "result = r0 op r1".
6479 * This could be an ARM instruction or a function call. (If the result
6480 * comes back in a register other than r0, you can override "result".)
6481 *
6482 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6483 * vCC (r1). Useful for integer division and modulus.
6484 *
6485 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6486 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6487 */
6488 /* binop/lit16 vA, vB, #+CCCC */
6489 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6490 mov r2, rINST, lsr #12 @ r2<- B
6491 ubfx r9, rINST, #8, #4 @ r9<- A
6492 GET_VREG r0, r2 @ r0<- vB
6493 .if 0
6494 cmp r1, #0 @ is second operand zero?
6495 beq common_errDivideByZero
6496 .endif
6497 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6498
6499 rsb r0, r0, r1 @ r0<- op, r0-r3 changed
6500 GET_INST_OPCODE ip @ extract opcode from rINST
6501 SET_VREG r0, r9 @ vAA<- r0
6502 GOTO_OPCODE ip @ jump to next instruction
6503 /* 10-13 instructions */
6504
6505
6506/* ------------------------------ */
6507 .balign 128
6508.L_op_mul_int_lit16: /* 0xd2 */
6509/* File: arm/op_mul_int_lit16.S */
6510/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6511/* File: arm/binopLit16.S */
6512 /*
6513 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6514 * that specifies an instruction that performs "result = r0 op r1".
6515 * This could be an ARM instruction or a function call. (If the result
6516 * comes back in a register other than r0, you can override "result".)
6517 *
6518 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6519 * vCC (r1). Useful for integer division and modulus.
6520 *
6521 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6522 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6523 */
6524 /* binop/lit16 vA, vB, #+CCCC */
6525 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6526 mov r2, rINST, lsr #12 @ r2<- B
6527 ubfx r9, rINST, #8, #4 @ r9<- A
6528 GET_VREG r0, r2 @ r0<- vB
6529 .if 0
6530 cmp r1, #0 @ is second operand zero?
6531 beq common_errDivideByZero
6532 .endif
6533 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6534
6535 mul r0, r1, r0 @ r0<- op, r0-r3 changed
6536 GET_INST_OPCODE ip @ extract opcode from rINST
6537 SET_VREG r0, r9 @ vAA<- r0
6538 GOTO_OPCODE ip @ jump to next instruction
6539 /* 10-13 instructions */
6540
6541
6542/* ------------------------------ */
6543 .balign 128
6544.L_op_div_int_lit16: /* 0xd3 */
6545/* File: arm/op_div_int_lit16.S */
6546 /*
6547 * Specialized 32-bit binary operation
6548 *
6549 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
6550 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6551 * ARMv7 CPUs that have hardware division support).
6552 *
6553 * div-int/lit16
6554 *
6555 */
6556 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6557 mov r2, rINST, lsr #12 @ r2<- B
6558 ubfx r9, rINST, #8, #4 @ r9<- A
6559 GET_VREG r0, r2 @ r0<- vB
6560 cmp r1, #0 @ is second operand zero?
6561 beq common_errDivideByZero
6562 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6563
6564#ifdef __ARM_ARCH_EXT_IDIV__
6565 sdiv r0, r0, r1 @ r0<- op
6566#else
6567 bl __aeabi_idiv @ r0<- op, r0-r3 changed
6568#endif
6569 GET_INST_OPCODE ip @ extract opcode from rINST
6570 SET_VREG r0, r9 @ vAA<- r0
6571 GOTO_OPCODE ip @ jump to next instruction
6572 /* 10-13 instructions */
6573
6574/* ------------------------------ */
6575 .balign 128
6576.L_op_rem_int_lit16: /* 0xd4 */
6577/* File: arm/op_rem_int_lit16.S */
6578 /*
6579 * Specialized 32-bit binary operation
6580 *
6581 * Performs "r1 = r0 rem r1". The selection between sdiv block 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 * NOTE: idivmod returns quotient in r0 and remainder in r1
6586 *
6587 * rem-int/lit16
6588 *
6589 */
6590 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6591 mov r2, rINST, lsr #12 @ r2<- B
6592 ubfx r9, rINST, #8, #4 @ r9<- A
6593 GET_VREG r0, r2 @ r0<- vB
6594 cmp r1, #0 @ is second operand zero?
6595 beq common_errDivideByZero
6596 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6597
6598#ifdef __ARM_ARCH_EXT_IDIV__
6599 sdiv r2, r0, r1
6600 mls r1, r1, r2, r0 @ r1<- op
6601#else
6602 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
6603#endif
6604 GET_INST_OPCODE ip @ extract opcode from rINST
6605 SET_VREG r1, r9 @ vAA<- r1
6606 GOTO_OPCODE ip @ jump to next instruction
6607 /* 10-13 instructions */
6608
6609/* ------------------------------ */
6610 .balign 128
6611.L_op_and_int_lit16: /* 0xd5 */
6612/* File: arm/op_and_int_lit16.S */
6613/* File: arm/binopLit16.S */
6614 /*
6615 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6616 * that specifies an instruction that performs "result = r0 op r1".
6617 * This could be an ARM instruction or a function call. (If the result
6618 * comes back in a register other than r0, you can override "result".)
6619 *
6620 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6621 * vCC (r1). Useful for integer division and modulus.
6622 *
6623 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6624 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6625 */
6626 /* binop/lit16 vA, vB, #+CCCC */
6627 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6628 mov r2, rINST, lsr #12 @ r2<- B
6629 ubfx r9, rINST, #8, #4 @ r9<- A
6630 GET_VREG r0, r2 @ r0<- vB
6631 .if 0
6632 cmp r1, #0 @ is second operand zero?
6633 beq common_errDivideByZero
6634 .endif
6635 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6636
6637 and r0, r0, r1 @ r0<- op, r0-r3 changed
6638 GET_INST_OPCODE ip @ extract opcode from rINST
6639 SET_VREG r0, r9 @ vAA<- r0
6640 GOTO_OPCODE ip @ jump to next instruction
6641 /* 10-13 instructions */
6642
6643
6644/* ------------------------------ */
6645 .balign 128
6646.L_op_or_int_lit16: /* 0xd6 */
6647/* File: arm/op_or_int_lit16.S */
6648/* File: arm/binopLit16.S */
6649 /*
6650 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6651 * that specifies an instruction that performs "result = r0 op r1".
6652 * This could be an ARM instruction or a function call. (If the result
6653 * comes back in a register other than r0, you can override "result".)
6654 *
6655 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6656 * vCC (r1). Useful for integer division and modulus.
6657 *
6658 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6659 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6660 */
6661 /* binop/lit16 vA, vB, #+CCCC */
6662 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6663 mov r2, rINST, lsr #12 @ r2<- B
6664 ubfx r9, rINST, #8, #4 @ r9<- A
6665 GET_VREG r0, r2 @ r0<- vB
6666 .if 0
6667 cmp r1, #0 @ is second operand zero?
6668 beq common_errDivideByZero
6669 .endif
6670 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6671
6672 orr r0, r0, r1 @ r0<- op, r0-r3 changed
6673 GET_INST_OPCODE ip @ extract opcode from rINST
6674 SET_VREG r0, r9 @ vAA<- r0
6675 GOTO_OPCODE ip @ jump to next instruction
6676 /* 10-13 instructions */
6677
6678
6679/* ------------------------------ */
6680 .balign 128
6681.L_op_xor_int_lit16: /* 0xd7 */
6682/* File: arm/op_xor_int_lit16.S */
6683/* File: arm/binopLit16.S */
6684 /*
6685 * Generic 32-bit "lit16" binary operation. Provide an "instr" line
6686 * that specifies an instruction that performs "result = r0 op r1".
6687 * This could be an ARM instruction or a function call. (If the result
6688 * comes back in a register other than r0, you can override "result".)
6689 *
6690 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6691 * vCC (r1). Useful for integer division and modulus.
6692 *
6693 * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6694 * rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6695 */
6696 /* binop/lit16 vA, vB, #+CCCC */
6697 FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended)
6698 mov r2, rINST, lsr #12 @ r2<- B
6699 ubfx r9, rINST, #8, #4 @ r9<- A
6700 GET_VREG r0, r2 @ r0<- vB
6701 .if 0
6702 cmp r1, #0 @ is second operand zero?
6703 beq common_errDivideByZero
6704 .endif
6705 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6706
6707 eor r0, r0, r1 @ r0<- op, r0-r3 changed
6708 GET_INST_OPCODE ip @ extract opcode from rINST
6709 SET_VREG r0, r9 @ vAA<- r0
6710 GOTO_OPCODE ip @ jump to next instruction
6711 /* 10-13 instructions */
6712
6713
6714/* ------------------------------ */
6715 .balign 128
6716.L_op_add_int_lit8: /* 0xd8 */
6717/* File: arm/op_add_int_lit8.S */
6718/* File: arm/binopLit8.S */
6719 /*
6720 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6721 * that specifies an instruction that performs "result = r0 op r1".
6722 * This could be an ARM instruction or a function call. (If the result
6723 * comes back in a register other than r0, you can override "result".)
6724 *
6725 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6726 * vCC (r1). Useful for integer division and modulus.
6727 *
6728 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6729 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6730 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6731 */
6732 /* binop/lit8 vAA, vBB, #+CC */
6733 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6734 mov r9, rINST, lsr #8 @ r9<- AA
6735 and r2, r3, #255 @ r2<- BB
6736 GET_VREG r0, r2 @ r0<- vBB
6737 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6738 .if 0
6739 @cmp r1, #0 @ is second operand zero?
6740 beq common_errDivideByZero
6741 .endif
6742 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6743
6744 @ optional op; may set condition codes
6745 add r0, r0, r1 @ r0<- op, r0-r3 changed
6746 GET_INST_OPCODE ip @ extract opcode from rINST
6747 SET_VREG r0, r9 @ vAA<- r0
6748 GOTO_OPCODE ip @ jump to next instruction
6749 /* 10-12 instructions */
6750
6751
6752/* ------------------------------ */
6753 .balign 128
6754.L_op_rsub_int_lit8: /* 0xd9 */
6755/* File: arm/op_rsub_int_lit8.S */
6756/* File: arm/binopLit8.S */
6757 /*
6758 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6759 * that specifies an instruction that performs "result = r0 op r1".
6760 * This could be an ARM instruction or a function call. (If the result
6761 * comes back in a register other than r0, you can override "result".)
6762 *
6763 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6764 * vCC (r1). Useful for integer division and modulus.
6765 *
6766 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6767 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6768 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6769 */
6770 /* binop/lit8 vAA, vBB, #+CC */
6771 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6772 mov r9, rINST, lsr #8 @ r9<- AA
6773 and r2, r3, #255 @ r2<- BB
6774 GET_VREG r0, r2 @ r0<- vBB
6775 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6776 .if 0
6777 @cmp r1, #0 @ is second operand zero?
6778 beq common_errDivideByZero
6779 .endif
6780 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6781
6782 @ optional op; may set condition codes
6783 rsb r0, r0, r1 @ r0<- op, r0-r3 changed
6784 GET_INST_OPCODE ip @ extract opcode from rINST
6785 SET_VREG r0, r9 @ vAA<- r0
6786 GOTO_OPCODE ip @ jump to next instruction
6787 /* 10-12 instructions */
6788
6789
6790/* ------------------------------ */
6791 .balign 128
6792.L_op_mul_int_lit8: /* 0xda */
6793/* File: arm/op_mul_int_lit8.S */
6794/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6795/* File: arm/binopLit8.S */
6796 /*
6797 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6798 * that specifies an instruction that performs "result = r0 op r1".
6799 * This could be an ARM instruction or a function call. (If the result
6800 * comes back in a register other than r0, you can override "result".)
6801 *
6802 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6803 * vCC (r1). Useful for integer division and modulus.
6804 *
6805 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6806 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6807 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6808 */
6809 /* binop/lit8 vAA, vBB, #+CC */
6810 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6811 mov r9, rINST, lsr #8 @ r9<- AA
6812 and r2, r3, #255 @ r2<- BB
6813 GET_VREG r0, r2 @ r0<- vBB
6814 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6815 .if 0
6816 @cmp r1, #0 @ is second operand zero?
6817 beq common_errDivideByZero
6818 .endif
6819 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6820
6821 @ optional op; may set condition codes
6822 mul r0, r1, r0 @ r0<- op, r0-r3 changed
6823 GET_INST_OPCODE ip @ extract opcode from rINST
6824 SET_VREG r0, r9 @ vAA<- r0
6825 GOTO_OPCODE ip @ jump to next instruction
6826 /* 10-12 instructions */
6827
6828
6829/* ------------------------------ */
6830 .balign 128
6831.L_op_div_int_lit8: /* 0xdb */
6832/* File: arm/op_div_int_lit8.S */
6833 /*
6834 * Specialized 32-bit binary operation
6835 *
6836 * Performs "r0 = r0 div r1". The selection between sdiv or the gcc helper
6837 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6838 * ARMv7 CPUs that have hardware division support).
6839 *
6840 * div-int/lit8
6841 *
6842 */
6843 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6844 mov r9, rINST, lsr #8 @ r9<- AA
6845 and r2, r3, #255 @ r2<- BB
6846 GET_VREG r0, r2 @ r0<- vBB
6847 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6848 @cmp r1, #0 @ is second operand zero?
6849 beq common_errDivideByZero
6850 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6851
6852#ifdef __ARM_ARCH_EXT_IDIV__
6853 sdiv r0, r0, r1 @ r0<- op
6854#else
6855 bl __aeabi_idiv @ r0<- op, r0-r3 changed
6856#endif
6857 GET_INST_OPCODE ip @ extract opcode from rINST
6858 SET_VREG r0, r9 @ vAA<- r0
6859 GOTO_OPCODE ip @ jump to next instruction
6860 /* 10-12 instructions */
6861
6862/* ------------------------------ */
6863 .balign 128
6864.L_op_rem_int_lit8: /* 0xdc */
6865/* File: arm/op_rem_int_lit8.S */
6866 /*
6867 * Specialized 32-bit binary operation
6868 *
6869 * Performs "r1 = r0 rem r1". The selection between sdiv block or the gcc helper
6870 * depends on the compile time value of __ARM_ARCH_EXT_IDIV__ (defined for
6871 * ARMv7 CPUs that have hardware division support).
6872 *
6873 * NOTE: idivmod returns quotient in r0 and remainder in r1
6874 *
6875 * rem-int/lit8
6876 *
6877 */
6878 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC)
6879 mov r9, rINST, lsr #8 @ r9<- AA
6880 and r2, r3, #255 @ r2<- BB
6881 GET_VREG r0, r2 @ r0<- vBB
6882 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6883 @cmp r1, #0 @ is second operand zero?
6884 beq common_errDivideByZero
6885 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6886
6887#ifdef __ARM_ARCH_EXT_IDIV__
6888 sdiv r2, r0, r1
6889 mls r1, r1, r2, r0 @ r1<- op
6890#else
6891 bl __aeabi_idivmod @ r1<- op, r0-r3 changed
6892#endif
6893 GET_INST_OPCODE ip @ extract opcode from rINST
6894 SET_VREG r1, r9 @ vAA<- r1
6895 GOTO_OPCODE ip @ jump to next instruction
6896 /* 10-12 instructions */
6897
6898/* ------------------------------ */
6899 .balign 128
6900.L_op_and_int_lit8: /* 0xdd */
6901/* File: arm/op_and_int_lit8.S */
6902/* File: arm/binopLit8.S */
6903 /*
6904 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6905 * that specifies an instruction that performs "result = r0 op r1".
6906 * This could be an ARM instruction or a function call. (If the result
6907 * comes back in a register other than r0, you can override "result".)
6908 *
6909 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6910 * vCC (r1). Useful for integer division and modulus.
6911 *
6912 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6913 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6914 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6915 */
6916 /* binop/lit8 vAA, vBB, #+CC */
6917 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6918 mov r9, rINST, lsr #8 @ r9<- AA
6919 and r2, r3, #255 @ r2<- BB
6920 GET_VREG r0, r2 @ r0<- vBB
6921 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6922 .if 0
6923 @cmp r1, #0 @ is second operand zero?
6924 beq common_errDivideByZero
6925 .endif
6926 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6927
6928 @ optional op; may set condition codes
6929 and r0, r0, r1 @ r0<- op, r0-r3 changed
6930 GET_INST_OPCODE ip @ extract opcode from rINST
6931 SET_VREG r0, r9 @ vAA<- r0
6932 GOTO_OPCODE ip @ jump to next instruction
6933 /* 10-12 instructions */
6934
6935
6936/* ------------------------------ */
6937 .balign 128
6938.L_op_or_int_lit8: /* 0xde */
6939/* File: arm/op_or_int_lit8.S */
6940/* File: arm/binopLit8.S */
6941 /*
6942 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6943 * that specifies an instruction that performs "result = r0 op r1".
6944 * This could be an ARM instruction or a function call. (If the result
6945 * comes back in a register other than r0, you can override "result".)
6946 *
6947 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6948 * vCC (r1). Useful for integer division and modulus.
6949 *
6950 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6951 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6952 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6953 */
6954 /* binop/lit8 vAA, vBB, #+CC */
6955 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6956 mov r9, rINST, lsr #8 @ r9<- AA
6957 and r2, r3, #255 @ r2<- BB
6958 GET_VREG r0, r2 @ r0<- vBB
6959 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6960 .if 0
6961 @cmp r1, #0 @ is second operand zero?
6962 beq common_errDivideByZero
6963 .endif
6964 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
6965
6966 @ optional op; may set condition codes
6967 orr r0, r0, r1 @ r0<- op, r0-r3 changed
6968 GET_INST_OPCODE ip @ extract opcode from rINST
6969 SET_VREG r0, r9 @ vAA<- r0
6970 GOTO_OPCODE ip @ jump to next instruction
6971 /* 10-12 instructions */
6972
6973
6974/* ------------------------------ */
6975 .balign 128
6976.L_op_xor_int_lit8: /* 0xdf */
6977/* File: arm/op_xor_int_lit8.S */
6978/* File: arm/binopLit8.S */
6979 /*
6980 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
6981 * that specifies an instruction that performs "result = r0 op r1".
6982 * This could be an ARM instruction or a function call. (If the result
6983 * comes back in a register other than r0, you can override "result".)
6984 *
6985 * If "chkzero" is set to 1, we perform a divide-by-zero check on
6986 * vCC (r1). Useful for integer division and modulus.
6987 *
6988 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6989 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6990 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
6991 */
6992 /* binop/lit8 vAA, vBB, #+CC */
6993 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
6994 mov r9, rINST, lsr #8 @ r9<- AA
6995 and r2, r3, #255 @ r2<- BB
6996 GET_VREG r0, r2 @ r0<- vBB
6997 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
6998 .if 0
6999 @cmp r1, #0 @ is second operand zero?
7000 beq common_errDivideByZero
7001 .endif
7002 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7003
7004 @ optional op; may set condition codes
7005 eor r0, r0, r1 @ r0<- op, r0-r3 changed
7006 GET_INST_OPCODE ip @ extract opcode from rINST
7007 SET_VREG r0, r9 @ vAA<- r0
7008 GOTO_OPCODE ip @ jump to next instruction
7009 /* 10-12 instructions */
7010
7011
7012/* ------------------------------ */
7013 .balign 128
7014.L_op_shl_int_lit8: /* 0xe0 */
7015/* File: arm/op_shl_int_lit8.S */
7016/* File: arm/binopLit8.S */
7017 /*
7018 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7019 * that specifies an instruction that performs "result = r0 op r1".
7020 * This could be an ARM instruction or a function call. (If the result
7021 * comes back in a register other than r0, you can override "result".)
7022 *
7023 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7024 * vCC (r1). Useful for integer division and modulus.
7025 *
7026 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7027 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7028 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7029 */
7030 /* binop/lit8 vAA, vBB, #+CC */
7031 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7032 mov r9, rINST, lsr #8 @ r9<- AA
7033 and r2, r3, #255 @ r2<- BB
7034 GET_VREG r0, r2 @ r0<- vBB
7035 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7036 .if 0
7037 @cmp r1, #0 @ is second operand zero?
7038 beq common_errDivideByZero
7039 .endif
7040 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7041
7042 and r1, r1, #31 @ optional op; may set condition codes
7043 mov r0, r0, asl r1 @ r0<- op, r0-r3 changed
7044 GET_INST_OPCODE ip @ extract opcode from rINST
7045 SET_VREG r0, r9 @ vAA<- r0
7046 GOTO_OPCODE ip @ jump to next instruction
7047 /* 10-12 instructions */
7048
7049
7050/* ------------------------------ */
7051 .balign 128
7052.L_op_shr_int_lit8: /* 0xe1 */
7053/* File: arm/op_shr_int_lit8.S */
7054/* File: arm/binopLit8.S */
7055 /*
7056 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7057 * that specifies an instruction that performs "result = r0 op r1".
7058 * This could be an ARM instruction or a function call. (If the result
7059 * comes back in a register other than r0, you can override "result".)
7060 *
7061 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7062 * vCC (r1). Useful for integer division and modulus.
7063 *
7064 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7065 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7066 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7067 */
7068 /* binop/lit8 vAA, vBB, #+CC */
7069 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7070 mov r9, rINST, lsr #8 @ r9<- AA
7071 and r2, r3, #255 @ r2<- BB
7072 GET_VREG r0, r2 @ r0<- vBB
7073 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7074 .if 0
7075 @cmp r1, #0 @ is second operand zero?
7076 beq common_errDivideByZero
7077 .endif
7078 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7079
7080 and r1, r1, #31 @ optional op; may set condition codes
7081 mov r0, r0, asr r1 @ r0<- op, r0-r3 changed
7082 GET_INST_OPCODE ip @ extract opcode from rINST
7083 SET_VREG r0, r9 @ vAA<- r0
7084 GOTO_OPCODE ip @ jump to next instruction
7085 /* 10-12 instructions */
7086
7087
7088/* ------------------------------ */
7089 .balign 128
7090.L_op_ushr_int_lit8: /* 0xe2 */
7091/* File: arm/op_ushr_int_lit8.S */
7092/* File: arm/binopLit8.S */
7093 /*
7094 * Generic 32-bit "lit8" binary operation. Provide an "instr" line
7095 * that specifies an instruction that performs "result = r0 op r1".
7096 * This could be an ARM instruction or a function call. (If the result
7097 * comes back in a register other than r0, you can override "result".)
7098 *
7099 * If "chkzero" is set to 1, we perform a divide-by-zero check on
7100 * vCC (r1). Useful for integer division and modulus.
7101 *
7102 * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7103 * rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7104 * shl-int/lit8, shr-int/lit8, ushr-int/lit8
7105 */
7106 /* binop/lit8 vAA, vBB, #+CC */
7107 FETCH_S r3, 1 @ r3<- ssssCCBB (sign-extended for CC
7108 mov r9, rINST, lsr #8 @ r9<- AA
7109 and r2, r3, #255 @ r2<- BB
7110 GET_VREG r0, r2 @ r0<- vBB
7111 movs r1, r3, asr #8 @ r1<- ssssssCC (sign extended)
7112 .if 0
7113 @cmp r1, #0 @ is second operand zero?
7114 beq common_errDivideByZero
7115 .endif
7116 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7117
7118 and r1, r1, #31 @ optional op; may set condition codes
7119 mov r0, r0, lsr r1 @ r0<- op, r0-r3 changed
7120 GET_INST_OPCODE ip @ extract opcode from rINST
7121 SET_VREG r0, r9 @ vAA<- r0
7122 GOTO_OPCODE ip @ jump to next instruction
7123 /* 10-12 instructions */
7124
7125
7126/* ------------------------------ */
7127 .balign 128
7128.L_op_iget_quick: /* 0xe3 */
7129/* File: arm/op_iget_quick.S */
7130 /* For: iget-quick, iget-object-quick */
7131 /* op vA, vB, offset@CCCC */
7132 mov r2, rINST, lsr #12 @ r2<- B
7133 FETCH r1, 1 @ r1<- field byte offset
7134 GET_VREG r3, r2 @ r3<- object we're operating on
7135 ubfx r2, rINST, #8, #4 @ r2<- A
7136 cmp r3, #0 @ check object for null
7137 beq common_errNullObject @ object was null
7138 ldr r0, [r3, r1] @ r0<- obj.field
7139 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7140 .if 0
7141 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
7142 .else
7143 SET_VREG r0, r2 @ fp[A]<- r0
7144 .endif
7145 GET_INST_OPCODE ip @ extract opcode from rINST
7146 GOTO_OPCODE ip @ jump to next instruction
7147
7148/* ------------------------------ */
7149 .balign 128
7150.L_op_iget_wide_quick: /* 0xe4 */
7151/* File: arm/op_iget_wide_quick.S */
7152 /* iget-wide-quick vA, vB, offset@CCCC */
7153 mov r2, rINST, lsr #12 @ r2<- B
7154 FETCH ip, 1 @ ip<- field byte offset
7155 GET_VREG r3, r2 @ r3<- object we're operating on
7156 ubfx r2, rINST, #8, #4 @ r2<- A
7157 cmp r3, #0 @ check object for null
7158 beq common_errNullObject @ object was null
7159 ldrd r0, [r3, ip] @ r0<- obj.field (64 bits, aligned)
7160 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7161 add r3, rFP, r2, lsl #2 @ r3<- &fp[A]
7162 GET_INST_OPCODE ip @ extract opcode from rINST
7163 stmia r3, {r0-r1} @ fp[A]<- r0/r1
7164 GOTO_OPCODE ip @ jump to next instruction
7165
7166/* ------------------------------ */
7167 .balign 128
7168.L_op_iget_object_quick: /* 0xe5 */
7169/* File: arm/op_iget_object_quick.S */
7170/* File: arm/op_iget_quick.S */
7171 /* For: iget-quick, iget-object-quick */
7172 /* op vA, vB, offset@CCCC */
7173 mov r2, rINST, lsr #12 @ r2<- B
7174 FETCH r1, 1 @ r1<- field byte offset
7175 GET_VREG r3, r2 @ r3<- object we're operating on
7176 ubfx r2, rINST, #8, #4 @ r2<- A
7177 cmp r3, #0 @ check object for null
7178 beq common_errNullObject @ object was null
7179 ldr r0, [r3, r1] @ r0<- obj.field
7180 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7181 .if 1
7182 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
7183 .else
7184 SET_VREG r0, r2 @ fp[A]<- r0
7185 .endif
7186 GET_INST_OPCODE ip @ extract opcode from rINST
7187 GOTO_OPCODE ip @ jump to next instruction
7188
7189
7190/* ------------------------------ */
7191 .balign 128
7192.L_op_iput_quick: /* 0xe6 */
7193/* File: arm/op_iput_quick.S */
7194 /* For: iput-quick, iput-object-quick */
7195 /* op vA, vB, offset@CCCC */
7196 mov r2, rINST, lsr #12 @ r2<- B
7197 FETCH r1, 1 @ r1<- field byte offset
7198 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7199 ubfx r2, rINST, #8, #4 @ r2<- A
7200 cmp r3, #0 @ check object for null
7201 beq common_errNullObject @ object was null
7202 GET_VREG r0, r2 @ r0<- fp[A]
7203 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7204 str r0, [r3, r1] @ obj.field<- r0
7205 GET_INST_OPCODE ip @ extract opcode from rINST
7206 GOTO_OPCODE ip @ jump to next instruction
7207
7208/* ------------------------------ */
7209 .balign 128
7210.L_op_iput_wide_quick: /* 0xe7 */
7211/* File: arm/op_iput_wide_quick.S */
7212 /* iput-wide-quick vA, vB, offset@CCCC */
7213 mov r2, rINST, lsr #12 @ r2<- B
7214 FETCH r3, 1 @ r3<- field byte offset
7215 GET_VREG r2, r2 @ r2<- fp[B], the object pointer
7216 ubfx r0, rINST, #8, #4 @ r0<- A
7217 cmp r2, #0 @ check object for null
7218 beq common_errNullObject @ object was null
7219 add r0, rFP, r0, lsl #2 @ r0<- &fp[A]
7220 ldmia r0, {r0-r1} @ r0/r1<- fp[A]/fp[A+1]
7221 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7222 strd r0, [r2, r3] @ obj.field<- r0/r1
7223 GET_INST_OPCODE ip @ extract opcode from rINST
7224 GOTO_OPCODE ip @ jump to next instruction
7225
7226/* ------------------------------ */
7227 .balign 128
7228.L_op_iput_object_quick: /* 0xe8 */
7229/* File: arm/op_iput_object_quick.S */
7230 EXPORT_PC
7231 add r0, rFP, #OFF_FP_SHADOWFRAME
7232 mov r1, rPC
7233 mov r2, rINST
7234 bl MterpIputObjectQuick
7235 cmp r0, #0
7236 beq MterpException
7237 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7238 GET_INST_OPCODE ip @ extract opcode from rINST
7239 GOTO_OPCODE ip @ jump to next instruction
7240
7241/* ------------------------------ */
7242 .balign 128
7243.L_op_invoke_virtual_quick: /* 0xe9 */
7244/* File: arm/op_invoke_virtual_quick.S */
7245/* File: arm/invoke.S */
7246 /*
7247 * Generic invoke handler wrapper.
7248 */
7249 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7250 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7251 .extern MterpInvokeVirtualQuick
7252 EXPORT_PC
7253 mov r0, rSELF
7254 add r1, rFP, #OFF_FP_SHADOWFRAME
7255 mov r2, rPC
7256 mov r3, rINST
7257 bl MterpInvokeVirtualQuick
7258 cmp r0, #0
7259 beq MterpException
7260 FETCH_ADVANCE_INST 3
7261 GET_INST_OPCODE ip
7262 GOTO_OPCODE ip
7263
7264
7265
7266/* ------------------------------ */
7267 .balign 128
7268.L_op_invoke_virtual_range_quick: /* 0xea */
7269/* File: arm/op_invoke_virtual_range_quick.S */
7270/* File: arm/invoke.S */
7271 /*
7272 * Generic invoke handler wrapper.
7273 */
7274 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7275 /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7276 .extern MterpInvokeVirtualQuickRange
7277 EXPORT_PC
7278 mov r0, rSELF
7279 add r1, rFP, #OFF_FP_SHADOWFRAME
7280 mov r2, rPC
7281 mov r3, rINST
7282 bl MterpInvokeVirtualQuickRange
7283 cmp r0, #0
7284 beq MterpException
7285 FETCH_ADVANCE_INST 3
7286 GET_INST_OPCODE ip
7287 GOTO_OPCODE ip
7288
7289
7290
7291/* ------------------------------ */
7292 .balign 128
7293.L_op_iput_boolean_quick: /* 0xeb */
7294/* File: arm/op_iput_boolean_quick.S */
7295/* File: arm/op_iput_quick.S */
7296 /* For: iput-quick, iput-object-quick */
7297 /* op vA, vB, offset@CCCC */
7298 mov r2, rINST, lsr #12 @ r2<- B
7299 FETCH r1, 1 @ r1<- field byte offset
7300 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7301 ubfx r2, rINST, #8, #4 @ r2<- A
7302 cmp r3, #0 @ check object for null
7303 beq common_errNullObject @ object was null
7304 GET_VREG r0, r2 @ r0<- fp[A]
7305 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7306 strb r0, [r3, r1] @ obj.field<- r0
7307 GET_INST_OPCODE ip @ extract opcode from rINST
7308 GOTO_OPCODE ip @ jump to next instruction
7309
7310
7311/* ------------------------------ */
7312 .balign 128
7313.L_op_iput_byte_quick: /* 0xec */
7314/* File: arm/op_iput_byte_quick.S */
7315/* File: arm/op_iput_quick.S */
7316 /* For: iput-quick, iput-object-quick */
7317 /* op vA, vB, offset@CCCC */
7318 mov r2, rINST, lsr #12 @ r2<- B
7319 FETCH r1, 1 @ r1<- field byte offset
7320 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7321 ubfx r2, rINST, #8, #4 @ r2<- A
7322 cmp r3, #0 @ check object for null
7323 beq common_errNullObject @ object was null
7324 GET_VREG r0, r2 @ r0<- fp[A]
7325 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7326 strb r0, [r3, r1] @ obj.field<- r0
7327 GET_INST_OPCODE ip @ extract opcode from rINST
7328 GOTO_OPCODE ip @ jump to next instruction
7329
7330
7331/* ------------------------------ */
7332 .balign 128
7333.L_op_iput_char_quick: /* 0xed */
7334/* File: arm/op_iput_char_quick.S */
7335/* File: arm/op_iput_quick.S */
7336 /* For: iput-quick, iput-object-quick */
7337 /* op vA, vB, offset@CCCC */
7338 mov r2, rINST, lsr #12 @ r2<- B
7339 FETCH r1, 1 @ r1<- field byte offset
7340 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7341 ubfx r2, rINST, #8, #4 @ r2<- A
7342 cmp r3, #0 @ check object for null
7343 beq common_errNullObject @ object was null
7344 GET_VREG r0, r2 @ r0<- fp[A]
7345 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7346 strh r0, [r3, r1] @ obj.field<- r0
7347 GET_INST_OPCODE ip @ extract opcode from rINST
7348 GOTO_OPCODE ip @ jump to next instruction
7349
7350
7351/* ------------------------------ */
7352 .balign 128
7353.L_op_iput_short_quick: /* 0xee */
7354/* File: arm/op_iput_short_quick.S */
7355/* File: arm/op_iput_quick.S */
7356 /* For: iput-quick, iput-object-quick */
7357 /* op vA, vB, offset@CCCC */
7358 mov r2, rINST, lsr #12 @ r2<- B
7359 FETCH r1, 1 @ r1<- field byte offset
7360 GET_VREG r3, r2 @ r3<- fp[B], the object pointer
7361 ubfx r2, rINST, #8, #4 @ r2<- A
7362 cmp r3, #0 @ check object for null
7363 beq common_errNullObject @ object was null
7364 GET_VREG r0, r2 @ r0<- fp[A]
7365 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7366 strh r0, [r3, r1] @ obj.field<- r0
7367 GET_INST_OPCODE ip @ extract opcode from rINST
7368 GOTO_OPCODE ip @ jump to next instruction
7369
7370
7371/* ------------------------------ */
7372 .balign 128
7373.L_op_iget_boolean_quick: /* 0xef */
7374/* File: arm/op_iget_boolean_quick.S */
7375/* File: arm/op_iget_quick.S */
7376 /* For: iget-quick, iget-object-quick */
7377 /* op vA, vB, offset@CCCC */
7378 mov r2, rINST, lsr #12 @ r2<- B
7379 FETCH r1, 1 @ r1<- field byte offset
7380 GET_VREG r3, r2 @ r3<- object we're operating on
7381 ubfx r2, rINST, #8, #4 @ r2<- A
7382 cmp r3, #0 @ check object for null
7383 beq common_errNullObject @ object was null
7384 ldrb r0, [r3, r1] @ r0<- obj.field
7385 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7386 .if 0
7387 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
7388 .else
7389 SET_VREG r0, r2 @ fp[A]<- r0
7390 .endif
7391 GET_INST_OPCODE ip @ extract opcode from rINST
7392 GOTO_OPCODE ip @ jump to next instruction
7393
7394
7395/* ------------------------------ */
7396 .balign 128
7397.L_op_iget_byte_quick: /* 0xf0 */
7398/* File: arm/op_iget_byte_quick.S */
7399/* File: arm/op_iget_quick.S */
7400 /* For: iget-quick, iget-object-quick */
7401 /* op vA, vB, offset@CCCC */
7402 mov r2, rINST, lsr #12 @ r2<- B
7403 FETCH r1, 1 @ r1<- field byte offset
7404 GET_VREG r3, r2 @ r3<- object we're operating on
7405 ubfx r2, rINST, #8, #4 @ r2<- A
7406 cmp r3, #0 @ check object for null
7407 beq common_errNullObject @ object was null
7408 ldrsb r0, [r3, r1] @ r0<- obj.field
7409 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7410 .if 0
7411 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
7412 .else
7413 SET_VREG r0, r2 @ fp[A]<- r0
7414 .endif
7415 GET_INST_OPCODE ip @ extract opcode from rINST
7416 GOTO_OPCODE ip @ jump to next instruction
7417
7418
7419/* ------------------------------ */
7420 .balign 128
7421.L_op_iget_char_quick: /* 0xf1 */
7422/* File: arm/op_iget_char_quick.S */
7423/* File: arm/op_iget_quick.S */
7424 /* For: iget-quick, iget-object-quick */
7425 /* op vA, vB, offset@CCCC */
7426 mov r2, rINST, lsr #12 @ r2<- B
7427 FETCH r1, 1 @ r1<- field byte offset
7428 GET_VREG r3, r2 @ r3<- object we're operating on
7429 ubfx r2, rINST, #8, #4 @ r2<- A
7430 cmp r3, #0 @ check object for null
7431 beq common_errNullObject @ object was null
7432 ldrh r0, [r3, r1] @ r0<- obj.field
7433 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7434 .if 0
7435 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
7436 .else
7437 SET_VREG r0, r2 @ fp[A]<- r0
7438 .endif
7439 GET_INST_OPCODE ip @ extract opcode from rINST
7440 GOTO_OPCODE ip @ jump to next instruction
7441
7442
7443/* ------------------------------ */
7444 .balign 128
7445.L_op_iget_short_quick: /* 0xf2 */
7446/* File: arm/op_iget_short_quick.S */
7447/* File: arm/op_iget_quick.S */
7448 /* For: iget-quick, iget-object-quick */
7449 /* op vA, vB, offset@CCCC */
7450 mov r2, rINST, lsr #12 @ r2<- B
7451 FETCH r1, 1 @ r1<- field byte offset
7452 GET_VREG r3, r2 @ r3<- object we're operating on
7453 ubfx r2, rINST, #8, #4 @ r2<- A
7454 cmp r3, #0 @ check object for null
7455 beq common_errNullObject @ object was null
7456 ldrsh r0, [r3, r1] @ r0<- obj.field
7457 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7458 .if 0
7459 SET_VREG_OBJECT r0, r2 @ fp[A]<- r0
7460 .else
7461 SET_VREG r0, r2 @ fp[A]<- r0
7462 .endif
7463 GET_INST_OPCODE ip @ extract opcode from rINST
7464 GOTO_OPCODE ip @ jump to next instruction
7465
7466
7467/* ------------------------------ */
7468 .balign 128
7469.L_op_invoke_lambda: /* 0xf3 */
7470/* Transfer stub to alternate interpreter */
7471 b MterpFallback
7472
7473
7474/* ------------------------------ */
7475 .balign 128
7476.L_op_unused_f4: /* 0xf4 */
7477/* File: arm/op_unused_f4.S */
7478/* File: arm/unused.S */
7479/*
7480 * Bail to reference interpreter to throw.
7481 */
7482 b MterpFallback
7483
7484
7485/* ------------------------------ */
7486 .balign 128
7487.L_op_capture_variable: /* 0xf5 */
7488/* Transfer stub to alternate interpreter */
7489 b MterpFallback
7490
7491
7492/* ------------------------------ */
7493 .balign 128
7494.L_op_create_lambda: /* 0xf6 */
7495/* Transfer stub to alternate interpreter */
7496 b MterpFallback
7497
7498
7499/* ------------------------------ */
7500 .balign 128
7501.L_op_liberate_variable: /* 0xf7 */
7502/* Transfer stub to alternate interpreter */
7503 b MterpFallback
7504
7505
7506/* ------------------------------ */
7507 .balign 128
7508.L_op_box_lambda: /* 0xf8 */
7509/* Transfer stub to alternate interpreter */
7510 b MterpFallback
7511
7512
7513/* ------------------------------ */
7514 .balign 128
7515.L_op_unbox_lambda: /* 0xf9 */
7516/* Transfer stub to alternate interpreter */
7517 b MterpFallback
7518
7519
7520/* ------------------------------ */
7521 .balign 128
7522.L_op_unused_fa: /* 0xfa */
7523/* File: arm/op_unused_fa.S */
7524/* File: arm/unused.S */
7525/*
7526 * Bail to reference interpreter to throw.
7527 */
7528 b MterpFallback
7529
7530
7531/* ------------------------------ */
7532 .balign 128
7533.L_op_unused_fb: /* 0xfb */
7534/* File: arm/op_unused_fb.S */
7535/* File: arm/unused.S */
7536/*
7537 * Bail to reference interpreter to throw.
7538 */
7539 b MterpFallback
7540
7541
7542/* ------------------------------ */
7543 .balign 128
7544.L_op_unused_fc: /* 0xfc */
7545/* File: arm/op_unused_fc.S */
7546/* File: arm/unused.S */
7547/*
7548 * Bail to reference interpreter to throw.
7549 */
7550 b MterpFallback
7551
7552
7553/* ------------------------------ */
7554 .balign 128
7555.L_op_unused_fd: /* 0xfd */
7556/* File: arm/op_unused_fd.S */
7557/* File: arm/unused.S */
7558/*
7559 * Bail to reference interpreter to throw.
7560 */
7561 b MterpFallback
7562
7563
7564/* ------------------------------ */
7565 .balign 128
7566.L_op_unused_fe: /* 0xfe */
7567/* File: arm/op_unused_fe.S */
7568/* File: arm/unused.S */
7569/*
7570 * Bail to reference interpreter to throw.
7571 */
7572 b MterpFallback
7573
7574
7575/* ------------------------------ */
7576 .balign 128
7577.L_op_unused_ff: /* 0xff */
7578/* File: arm/op_unused_ff.S */
7579/* File: arm/unused.S */
7580/*
7581 * Bail to reference interpreter to throw.
7582 */
7583 b MterpFallback
7584
7585
7586 .balign 128
7587 .size artMterpAsmInstructionStart, .-artMterpAsmInstructionStart
7588 .global artMterpAsmInstructionEnd
7589artMterpAsmInstructionEnd:
7590
7591/*
7592 * ===========================================================================
7593 * Sister implementations
7594 * ===========================================================================
7595 */
7596 .global artMterpAsmSisterStart
7597 .type artMterpAsmSisterStart, %function
7598 .text
7599 .balign 4
7600artMterpAsmSisterStart:
7601
7602/* continuation for op_cmp_long */
7603
7604.Lop_cmp_long_less:
7605 mvn r1, #0 @ r1<- -1
7606 @ Want to cond code the next mov so we can avoid branch, but don't see it;
7607 @ instead, we just replicate the tail end.
7608 FETCH_ADVANCE_INST 2 @ advance rPC, load rINST
7609 SET_VREG r1, r9 @ vAA<- r1
7610 GET_INST_OPCODE ip @ extract opcode from rINST
7611 GOTO_OPCODE ip @ jump to next instruction
7612
7613.Lop_cmp_long_greater:
7614 mov r1, #1 @ r1<- 1
7615 @ fall through to _finish
7616
7617.Lop_cmp_long_finish:
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/* continuation for op_float_to_long */
7624/*
7625 * Convert the float in r0 to a long in r0/r1.
7626 *
7627 * We have to clip values to long min/max per the specification. The
7628 * expected common case is a "reasonable" value that converts directly
7629 * to modest integer. The EABI convert function isn't doing this for us.
7630 */
7631f2l_doconv:
7632 stmfd sp!, {r4, lr}
7633 mov r1, #0x5f000000 @ (float)maxlong
7634 mov r4, r0
7635 bl __aeabi_fcmpge @ is arg >= maxlong?
7636 cmp r0, #0 @ nonzero == yes
7637 mvnne r0, #0 @ return maxlong (7fffffff)
7638 mvnne r1, #0x80000000
7639 ldmnefd sp!, {r4, pc}
7640
7641 mov r0, r4 @ recover arg
7642 mov r1, #0xdf000000 @ (float)minlong
7643 bl __aeabi_fcmple @ is arg <= minlong?
7644 cmp r0, #0 @ nonzero == yes
7645 movne r0, #0 @ return minlong (80000000)
7646 movne r1, #0x80000000
7647 ldmnefd sp!, {r4, pc}
7648
7649 mov r0, r4 @ recover arg
7650 mov r1, r4
7651 bl __aeabi_fcmpeq @ is arg == self?
7652 cmp r0, #0 @ zero == no
7653 moveq r1, #0 @ return zero for NaN
7654 ldmeqfd sp!, {r4, pc}
7655
7656 mov r0, r4 @ recover arg
7657 bl __aeabi_f2lz @ convert float to long
7658 ldmfd sp!, {r4, pc}
7659
7660/* continuation for op_double_to_long */
7661/*
7662 * Convert the double in r0/r1 to a long in r0/r1.
7663 *
7664 * We have to clip values to long min/max per the specification. The
7665 * expected common case is a "reasonable" value that converts directly
7666 * to modest integer. The EABI convert function isn't doing this for us.
7667 */
7668d2l_doconv:
7669 stmfd sp!, {r4, r5, lr} @ save regs
7670 mov r3, #0x43000000 @ maxlong, as a double (high word)
7671 add r3, #0x00e00000 @ 0x43e00000
7672 mov r2, #0 @ maxlong, as a double (low word)
7673 sub sp, sp, #4 @ align for EABI
7674 mov r4, r0 @ save a copy of r0
7675 mov r5, r1 @ and r1
7676 bl __aeabi_dcmpge @ is arg >= maxlong?
7677 cmp r0, #0 @ nonzero == yes
7678 mvnne r0, #0 @ return maxlong (7fffffffffffffff)
7679 mvnne r1, #0x80000000
7680 bne 1f
7681
7682 mov r0, r4 @ recover arg
7683 mov r1, r5
7684 mov r3, #0xc3000000 @ minlong, as a double (high word)
7685 add r3, #0x00e00000 @ 0xc3e00000
7686 mov r2, #0 @ minlong, as a double (low word)
7687 bl __aeabi_dcmple @ is arg <= minlong?
7688 cmp r0, #0 @ nonzero == yes
7689 movne r0, #0 @ return minlong (8000000000000000)
7690 movne r1, #0x80000000
7691 bne 1f
7692
7693 mov r0, r4 @ recover arg
7694 mov r1, r5
7695 mov r2, r4 @ compare against self
7696 mov r3, r5
7697 bl __aeabi_dcmpeq @ is arg == self?
7698 cmp r0, #0 @ zero == no
7699 moveq r1, #0 @ return zero for NaN
7700 beq 1f
7701
7702 mov r0, r4 @ recover arg
7703 mov r1, r5
7704 bl __aeabi_d2lz @ convert double to long
7705
77061:
7707 add sp, sp, #4
7708 ldmfd sp!, {r4, r5, pc}
7709
7710 .size artMterpAsmSisterStart, .-artMterpAsmSisterStart
7711 .global artMterpAsmSisterEnd
7712artMterpAsmSisterEnd:
7713
7714
7715 .global artMterpAsmAltInstructionStart
7716 .type artMterpAsmAltInstructionStart, %function
7717 .text
7718
7719artMterpAsmAltInstructionStart = .L_ALT_op_nop
7720/* ------------------------------ */
7721 .balign 128
7722.L_ALT_op_nop: /* 0x00 */
7723/* File: arm/alt_stub.S */
7724/*
7725 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7726 * any interesting requests and then jump to the real instruction
7727 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7728 */
7729 .extern MterpCheckBefore
7730 EXPORT_PC
7731 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7732 adrl lr, artMterpAsmInstructionStart + (0 * 128) @ Addr of primary handler.
7733 mov r0, rSELF
7734 add r1, rFP, #OFF_FP_SHADOWFRAME
7735 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7736
7737/* ------------------------------ */
7738 .balign 128
7739.L_ALT_op_move: /* 0x01 */
7740/* File: arm/alt_stub.S */
7741/*
7742 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7743 * any interesting requests and then jump to the real instruction
7744 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7745 */
7746 .extern MterpCheckBefore
7747 EXPORT_PC
7748 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7749 adrl lr, artMterpAsmInstructionStart + (1 * 128) @ Addr of primary handler.
7750 mov r0, rSELF
7751 add r1, rFP, #OFF_FP_SHADOWFRAME
7752 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7753
7754/* ------------------------------ */
7755 .balign 128
7756.L_ALT_op_move_from16: /* 0x02 */
7757/* File: arm/alt_stub.S */
7758/*
7759 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7760 * any interesting requests and then jump to the real instruction
7761 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7762 */
7763 .extern MterpCheckBefore
7764 EXPORT_PC
7765 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7766 adrl lr, artMterpAsmInstructionStart + (2 * 128) @ Addr of primary handler.
7767 mov r0, rSELF
7768 add r1, rFP, #OFF_FP_SHADOWFRAME
7769 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7770
7771/* ------------------------------ */
7772 .balign 128
7773.L_ALT_op_move_16: /* 0x03 */
7774/* File: arm/alt_stub.S */
7775/*
7776 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7777 * any interesting requests and then jump to the real instruction
7778 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7779 */
7780 .extern MterpCheckBefore
7781 EXPORT_PC
7782 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7783 adrl lr, artMterpAsmInstructionStart + (3 * 128) @ Addr of primary handler.
7784 mov r0, rSELF
7785 add r1, rFP, #OFF_FP_SHADOWFRAME
7786 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7787
7788/* ------------------------------ */
7789 .balign 128
7790.L_ALT_op_move_wide: /* 0x04 */
7791/* File: arm/alt_stub.S */
7792/*
7793 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7794 * any interesting requests and then jump to the real instruction
7795 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7796 */
7797 .extern MterpCheckBefore
7798 EXPORT_PC
7799 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7800 adrl lr, artMterpAsmInstructionStart + (4 * 128) @ Addr of primary handler.
7801 mov r0, rSELF
7802 add r1, rFP, #OFF_FP_SHADOWFRAME
7803 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7804
7805/* ------------------------------ */
7806 .balign 128
7807.L_ALT_op_move_wide_from16: /* 0x05 */
7808/* File: arm/alt_stub.S */
7809/*
7810 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7811 * any interesting requests and then jump to the real instruction
7812 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7813 */
7814 .extern MterpCheckBefore
7815 EXPORT_PC
7816 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7817 adrl lr, artMterpAsmInstructionStart + (5 * 128) @ Addr of primary handler.
7818 mov r0, rSELF
7819 add r1, rFP, #OFF_FP_SHADOWFRAME
7820 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7821
7822/* ------------------------------ */
7823 .balign 128
7824.L_ALT_op_move_wide_16: /* 0x06 */
7825/* File: arm/alt_stub.S */
7826/*
7827 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7828 * any interesting requests and then jump to the real instruction
7829 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7830 */
7831 .extern MterpCheckBefore
7832 EXPORT_PC
7833 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7834 adrl lr, artMterpAsmInstructionStart + (6 * 128) @ Addr of primary handler.
7835 mov r0, rSELF
7836 add r1, rFP, #OFF_FP_SHADOWFRAME
7837 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7838
7839/* ------------------------------ */
7840 .balign 128
7841.L_ALT_op_move_object: /* 0x07 */
7842/* File: arm/alt_stub.S */
7843/*
7844 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7845 * any interesting requests and then jump to the real instruction
7846 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7847 */
7848 .extern MterpCheckBefore
7849 EXPORT_PC
7850 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7851 adrl lr, artMterpAsmInstructionStart + (7 * 128) @ Addr of primary handler.
7852 mov r0, rSELF
7853 add r1, rFP, #OFF_FP_SHADOWFRAME
7854 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7855
7856/* ------------------------------ */
7857 .balign 128
7858.L_ALT_op_move_object_from16: /* 0x08 */
7859/* File: arm/alt_stub.S */
7860/*
7861 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7862 * any interesting requests and then jump to the real instruction
7863 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7864 */
7865 .extern MterpCheckBefore
7866 EXPORT_PC
7867 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7868 adrl lr, artMterpAsmInstructionStart + (8 * 128) @ Addr of primary handler.
7869 mov r0, rSELF
7870 add r1, rFP, #OFF_FP_SHADOWFRAME
7871 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7872
7873/* ------------------------------ */
7874 .balign 128
7875.L_ALT_op_move_object_16: /* 0x09 */
7876/* File: arm/alt_stub.S */
7877/*
7878 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7879 * any interesting requests and then jump to the real instruction
7880 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7881 */
7882 .extern MterpCheckBefore
7883 EXPORT_PC
7884 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7885 adrl lr, artMterpAsmInstructionStart + (9 * 128) @ Addr of primary handler.
7886 mov r0, rSELF
7887 add r1, rFP, #OFF_FP_SHADOWFRAME
7888 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7889
7890/* ------------------------------ */
7891 .balign 128
7892.L_ALT_op_move_result: /* 0x0a */
7893/* File: arm/alt_stub.S */
7894/*
7895 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7896 * any interesting requests and then jump to the real instruction
7897 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7898 */
7899 .extern MterpCheckBefore
7900 EXPORT_PC
7901 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7902 adrl lr, artMterpAsmInstructionStart + (10 * 128) @ Addr of primary handler.
7903 mov r0, rSELF
7904 add r1, rFP, #OFF_FP_SHADOWFRAME
7905 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7906
7907/* ------------------------------ */
7908 .balign 128
7909.L_ALT_op_move_result_wide: /* 0x0b */
7910/* File: arm/alt_stub.S */
7911/*
7912 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7913 * any interesting requests and then jump to the real instruction
7914 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7915 */
7916 .extern MterpCheckBefore
7917 EXPORT_PC
7918 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7919 adrl lr, artMterpAsmInstructionStart + (11 * 128) @ Addr of primary handler.
7920 mov r0, rSELF
7921 add r1, rFP, #OFF_FP_SHADOWFRAME
7922 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7923
7924/* ------------------------------ */
7925 .balign 128
7926.L_ALT_op_move_result_object: /* 0x0c */
7927/* File: arm/alt_stub.S */
7928/*
7929 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7930 * any interesting requests and then jump to the real instruction
7931 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7932 */
7933 .extern MterpCheckBefore
7934 EXPORT_PC
7935 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7936 adrl lr, artMterpAsmInstructionStart + (12 * 128) @ Addr of primary handler.
7937 mov r0, rSELF
7938 add r1, rFP, #OFF_FP_SHADOWFRAME
7939 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7940
7941/* ------------------------------ */
7942 .balign 128
7943.L_ALT_op_move_exception: /* 0x0d */
7944/* File: arm/alt_stub.S */
7945/*
7946 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7947 * any interesting requests and then jump to the real instruction
7948 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7949 */
7950 .extern MterpCheckBefore
7951 EXPORT_PC
7952 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7953 adrl lr, artMterpAsmInstructionStart + (13 * 128) @ Addr of primary handler.
7954 mov r0, rSELF
7955 add r1, rFP, #OFF_FP_SHADOWFRAME
7956 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7957
7958/* ------------------------------ */
7959 .balign 128
7960.L_ALT_op_return_void: /* 0x0e */
7961/* File: arm/alt_stub.S */
7962/*
7963 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7964 * any interesting requests and then jump to the real instruction
7965 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7966 */
7967 .extern MterpCheckBefore
7968 EXPORT_PC
7969 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7970 adrl lr, artMterpAsmInstructionStart + (14 * 128) @ Addr of primary handler.
7971 mov r0, rSELF
7972 add r1, rFP, #OFF_FP_SHADOWFRAME
7973 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7974
7975/* ------------------------------ */
7976 .balign 128
7977.L_ALT_op_return: /* 0x0f */
7978/* File: arm/alt_stub.S */
7979/*
7980 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7981 * any interesting requests and then jump to the real instruction
7982 * handler. Note that the call to MterpCheckBefore is done as a tail call.
7983 */
7984 .extern MterpCheckBefore
7985 EXPORT_PC
7986 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
7987 adrl lr, artMterpAsmInstructionStart + (15 * 128) @ Addr of primary handler.
7988 mov r0, rSELF
7989 add r1, rFP, #OFF_FP_SHADOWFRAME
7990 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
7991
7992/* ------------------------------ */
7993 .balign 128
7994.L_ALT_op_return_wide: /* 0x10 */
7995/* File: arm/alt_stub.S */
7996/*
7997 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
7998 * any interesting requests and then jump to the real instruction
7999 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8000 */
8001 .extern MterpCheckBefore
8002 EXPORT_PC
8003 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8004 adrl lr, artMterpAsmInstructionStart + (16 * 128) @ Addr of primary handler.
8005 mov r0, rSELF
8006 add r1, rFP, #OFF_FP_SHADOWFRAME
8007 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8008
8009/* ------------------------------ */
8010 .balign 128
8011.L_ALT_op_return_object: /* 0x11 */
8012/* File: arm/alt_stub.S */
8013/*
8014 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8015 * any interesting requests and then jump to the real instruction
8016 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8017 */
8018 .extern MterpCheckBefore
8019 EXPORT_PC
8020 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8021 adrl lr, artMterpAsmInstructionStart + (17 * 128) @ Addr of primary handler.
8022 mov r0, rSELF
8023 add r1, rFP, #OFF_FP_SHADOWFRAME
8024 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8025
8026/* ------------------------------ */
8027 .balign 128
8028.L_ALT_op_const_4: /* 0x12 */
8029/* File: arm/alt_stub.S */
8030/*
8031 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8032 * any interesting requests and then jump to the real instruction
8033 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8034 */
8035 .extern MterpCheckBefore
8036 EXPORT_PC
8037 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8038 adrl lr, artMterpAsmInstructionStart + (18 * 128) @ Addr of primary handler.
8039 mov r0, rSELF
8040 add r1, rFP, #OFF_FP_SHADOWFRAME
8041 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8042
8043/* ------------------------------ */
8044 .balign 128
8045.L_ALT_op_const_16: /* 0x13 */
8046/* File: arm/alt_stub.S */
8047/*
8048 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8049 * any interesting requests and then jump to the real instruction
8050 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8051 */
8052 .extern MterpCheckBefore
8053 EXPORT_PC
8054 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8055 adrl lr, artMterpAsmInstructionStart + (19 * 128) @ Addr of primary handler.
8056 mov r0, rSELF
8057 add r1, rFP, #OFF_FP_SHADOWFRAME
8058 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8059
8060/* ------------------------------ */
8061 .balign 128
8062.L_ALT_op_const: /* 0x14 */
8063/* File: arm/alt_stub.S */
8064/*
8065 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8066 * any interesting requests and then jump to the real instruction
8067 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8068 */
8069 .extern MterpCheckBefore
8070 EXPORT_PC
8071 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8072 adrl lr, artMterpAsmInstructionStart + (20 * 128) @ Addr of primary handler.
8073 mov r0, rSELF
8074 add r1, rFP, #OFF_FP_SHADOWFRAME
8075 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8076
8077/* ------------------------------ */
8078 .balign 128
8079.L_ALT_op_const_high16: /* 0x15 */
8080/* File: arm/alt_stub.S */
8081/*
8082 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8083 * any interesting requests and then jump to the real instruction
8084 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8085 */
8086 .extern MterpCheckBefore
8087 EXPORT_PC
8088 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8089 adrl lr, artMterpAsmInstructionStart + (21 * 128) @ Addr of primary handler.
8090 mov r0, rSELF
8091 add r1, rFP, #OFF_FP_SHADOWFRAME
8092 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8093
8094/* ------------------------------ */
8095 .balign 128
8096.L_ALT_op_const_wide_16: /* 0x16 */
8097/* File: arm/alt_stub.S */
8098/*
8099 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8100 * any interesting requests and then jump to the real instruction
8101 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8102 */
8103 .extern MterpCheckBefore
8104 EXPORT_PC
8105 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8106 adrl lr, artMterpAsmInstructionStart + (22 * 128) @ Addr of primary handler.
8107 mov r0, rSELF
8108 add r1, rFP, #OFF_FP_SHADOWFRAME
8109 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8110
8111/* ------------------------------ */
8112 .balign 128
8113.L_ALT_op_const_wide_32: /* 0x17 */
8114/* File: arm/alt_stub.S */
8115/*
8116 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8117 * any interesting requests and then jump to the real instruction
8118 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8119 */
8120 .extern MterpCheckBefore
8121 EXPORT_PC
8122 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8123 adrl lr, artMterpAsmInstructionStart + (23 * 128) @ Addr of primary handler.
8124 mov r0, rSELF
8125 add r1, rFP, #OFF_FP_SHADOWFRAME
8126 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8127
8128/* ------------------------------ */
8129 .balign 128
8130.L_ALT_op_const_wide: /* 0x18 */
8131/* File: arm/alt_stub.S */
8132/*
8133 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8134 * any interesting requests and then jump to the real instruction
8135 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8136 */
8137 .extern MterpCheckBefore
8138 EXPORT_PC
8139 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8140 adrl lr, artMterpAsmInstructionStart + (24 * 128) @ Addr of primary handler.
8141 mov r0, rSELF
8142 add r1, rFP, #OFF_FP_SHADOWFRAME
8143 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8144
8145/* ------------------------------ */
8146 .balign 128
8147.L_ALT_op_const_wide_high16: /* 0x19 */
8148/* File: arm/alt_stub.S */
8149/*
8150 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8151 * any interesting requests and then jump to the real instruction
8152 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8153 */
8154 .extern MterpCheckBefore
8155 EXPORT_PC
8156 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8157 adrl lr, artMterpAsmInstructionStart + (25 * 128) @ Addr of primary handler.
8158 mov r0, rSELF
8159 add r1, rFP, #OFF_FP_SHADOWFRAME
8160 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8161
8162/* ------------------------------ */
8163 .balign 128
8164.L_ALT_op_const_string: /* 0x1a */
8165/* File: arm/alt_stub.S */
8166/*
8167 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8168 * any interesting requests and then jump to the real instruction
8169 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8170 */
8171 .extern MterpCheckBefore
8172 EXPORT_PC
8173 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8174 adrl lr, artMterpAsmInstructionStart + (26 * 128) @ Addr of primary handler.
8175 mov r0, rSELF
8176 add r1, rFP, #OFF_FP_SHADOWFRAME
8177 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8178
8179/* ------------------------------ */
8180 .balign 128
8181.L_ALT_op_const_string_jumbo: /* 0x1b */
8182/* File: arm/alt_stub.S */
8183/*
8184 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8185 * any interesting requests and then jump to the real instruction
8186 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8187 */
8188 .extern MterpCheckBefore
8189 EXPORT_PC
8190 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8191 adrl lr, artMterpAsmInstructionStart + (27 * 128) @ Addr of primary handler.
8192 mov r0, rSELF
8193 add r1, rFP, #OFF_FP_SHADOWFRAME
8194 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8195
8196/* ------------------------------ */
8197 .balign 128
8198.L_ALT_op_const_class: /* 0x1c */
8199/* File: arm/alt_stub.S */
8200/*
8201 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8202 * any interesting requests and then jump to the real instruction
8203 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8204 */
8205 .extern MterpCheckBefore
8206 EXPORT_PC
8207 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8208 adrl lr, artMterpAsmInstructionStart + (28 * 128) @ Addr of primary handler.
8209 mov r0, rSELF
8210 add r1, rFP, #OFF_FP_SHADOWFRAME
8211 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8212
8213/* ------------------------------ */
8214 .balign 128
8215.L_ALT_op_monitor_enter: /* 0x1d */
8216/* File: arm/alt_stub.S */
8217/*
8218 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8219 * any interesting requests and then jump to the real instruction
8220 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8221 */
8222 .extern MterpCheckBefore
8223 EXPORT_PC
8224 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8225 adrl lr, artMterpAsmInstructionStart + (29 * 128) @ Addr of primary handler.
8226 mov r0, rSELF
8227 add r1, rFP, #OFF_FP_SHADOWFRAME
8228 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8229
8230/* ------------------------------ */
8231 .balign 128
8232.L_ALT_op_monitor_exit: /* 0x1e */
8233/* File: arm/alt_stub.S */
8234/*
8235 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8236 * any interesting requests and then jump to the real instruction
8237 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8238 */
8239 .extern MterpCheckBefore
8240 EXPORT_PC
8241 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8242 adrl lr, artMterpAsmInstructionStart + (30 * 128) @ Addr of primary handler.
8243 mov r0, rSELF
8244 add r1, rFP, #OFF_FP_SHADOWFRAME
8245 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8246
8247/* ------------------------------ */
8248 .balign 128
8249.L_ALT_op_check_cast: /* 0x1f */
8250/* File: arm/alt_stub.S */
8251/*
8252 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8253 * any interesting requests and then jump to the real instruction
8254 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8255 */
8256 .extern MterpCheckBefore
8257 EXPORT_PC
8258 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8259 adrl lr, artMterpAsmInstructionStart + (31 * 128) @ Addr of primary handler.
8260 mov r0, rSELF
8261 add r1, rFP, #OFF_FP_SHADOWFRAME
8262 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8263
8264/* ------------------------------ */
8265 .balign 128
8266.L_ALT_op_instance_of: /* 0x20 */
8267/* File: arm/alt_stub.S */
8268/*
8269 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8270 * any interesting requests and then jump to the real instruction
8271 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8272 */
8273 .extern MterpCheckBefore
8274 EXPORT_PC
8275 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8276 adrl lr, artMterpAsmInstructionStart + (32 * 128) @ Addr of primary handler.
8277 mov r0, rSELF
8278 add r1, rFP, #OFF_FP_SHADOWFRAME
8279 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8280
8281/* ------------------------------ */
8282 .balign 128
8283.L_ALT_op_array_length: /* 0x21 */
8284/* File: arm/alt_stub.S */
8285/*
8286 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8287 * any interesting requests and then jump to the real instruction
8288 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8289 */
8290 .extern MterpCheckBefore
8291 EXPORT_PC
8292 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8293 adrl lr, artMterpAsmInstructionStart + (33 * 128) @ Addr of primary handler.
8294 mov r0, rSELF
8295 add r1, rFP, #OFF_FP_SHADOWFRAME
8296 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8297
8298/* ------------------------------ */
8299 .balign 128
8300.L_ALT_op_new_instance: /* 0x22 */
8301/* File: arm/alt_stub.S */
8302/*
8303 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8304 * any interesting requests and then jump to the real instruction
8305 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8306 */
8307 .extern MterpCheckBefore
8308 EXPORT_PC
8309 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8310 adrl lr, artMterpAsmInstructionStart + (34 * 128) @ Addr of primary handler.
8311 mov r0, rSELF
8312 add r1, rFP, #OFF_FP_SHADOWFRAME
8313 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8314
8315/* ------------------------------ */
8316 .balign 128
8317.L_ALT_op_new_array: /* 0x23 */
8318/* File: arm/alt_stub.S */
8319/*
8320 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8321 * any interesting requests and then jump to the real instruction
8322 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8323 */
8324 .extern MterpCheckBefore
8325 EXPORT_PC
8326 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8327 adrl lr, artMterpAsmInstructionStart + (35 * 128) @ Addr of primary handler.
8328 mov r0, rSELF
8329 add r1, rFP, #OFF_FP_SHADOWFRAME
8330 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8331
8332/* ------------------------------ */
8333 .balign 128
8334.L_ALT_op_filled_new_array: /* 0x24 */
8335/* File: arm/alt_stub.S */
8336/*
8337 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8338 * any interesting requests and then jump to the real instruction
8339 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8340 */
8341 .extern MterpCheckBefore
8342 EXPORT_PC
8343 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8344 adrl lr, artMterpAsmInstructionStart + (36 * 128) @ Addr of primary handler.
8345 mov r0, rSELF
8346 add r1, rFP, #OFF_FP_SHADOWFRAME
8347 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8348
8349/* ------------------------------ */
8350 .balign 128
8351.L_ALT_op_filled_new_array_range: /* 0x25 */
8352/* File: arm/alt_stub.S */
8353/*
8354 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8355 * any interesting requests and then jump to the real instruction
8356 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8357 */
8358 .extern MterpCheckBefore
8359 EXPORT_PC
8360 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8361 adrl lr, artMterpAsmInstructionStart + (37 * 128) @ Addr of primary handler.
8362 mov r0, rSELF
8363 add r1, rFP, #OFF_FP_SHADOWFRAME
8364 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8365
8366/* ------------------------------ */
8367 .balign 128
8368.L_ALT_op_fill_array_data: /* 0x26 */
8369/* File: arm/alt_stub.S */
8370/*
8371 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8372 * any interesting requests and then jump to the real instruction
8373 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8374 */
8375 .extern MterpCheckBefore
8376 EXPORT_PC
8377 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8378 adrl lr, artMterpAsmInstructionStart + (38 * 128) @ Addr of primary handler.
8379 mov r0, rSELF
8380 add r1, rFP, #OFF_FP_SHADOWFRAME
8381 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8382
8383/* ------------------------------ */
8384 .balign 128
8385.L_ALT_op_throw: /* 0x27 */
8386/* File: arm/alt_stub.S */
8387/*
8388 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8389 * any interesting requests and then jump to the real instruction
8390 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8391 */
8392 .extern MterpCheckBefore
8393 EXPORT_PC
8394 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8395 adrl lr, artMterpAsmInstructionStart + (39 * 128) @ Addr of primary handler.
8396 mov r0, rSELF
8397 add r1, rFP, #OFF_FP_SHADOWFRAME
8398 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8399
8400/* ------------------------------ */
8401 .balign 128
8402.L_ALT_op_goto: /* 0x28 */
8403/* File: arm/alt_stub.S */
8404/*
8405 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8406 * any interesting requests and then jump to the real instruction
8407 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8408 */
8409 .extern MterpCheckBefore
8410 EXPORT_PC
8411 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8412 adrl lr, artMterpAsmInstructionStart + (40 * 128) @ Addr of primary handler.
8413 mov r0, rSELF
8414 add r1, rFP, #OFF_FP_SHADOWFRAME
8415 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8416
8417/* ------------------------------ */
8418 .balign 128
8419.L_ALT_op_goto_16: /* 0x29 */
8420/* File: arm/alt_stub.S */
8421/*
8422 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8423 * any interesting requests and then jump to the real instruction
8424 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8425 */
8426 .extern MterpCheckBefore
8427 EXPORT_PC
8428 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8429 adrl lr, artMterpAsmInstructionStart + (41 * 128) @ Addr of primary handler.
8430 mov r0, rSELF
8431 add r1, rFP, #OFF_FP_SHADOWFRAME
8432 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8433
8434/* ------------------------------ */
8435 .balign 128
8436.L_ALT_op_goto_32: /* 0x2a */
8437/* File: arm/alt_stub.S */
8438/*
8439 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8440 * any interesting requests and then jump to the real instruction
8441 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8442 */
8443 .extern MterpCheckBefore
8444 EXPORT_PC
8445 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8446 adrl lr, artMterpAsmInstructionStart + (42 * 128) @ Addr of primary handler.
8447 mov r0, rSELF
8448 add r1, rFP, #OFF_FP_SHADOWFRAME
8449 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8450
8451/* ------------------------------ */
8452 .balign 128
8453.L_ALT_op_packed_switch: /* 0x2b */
8454/* File: arm/alt_stub.S */
8455/*
8456 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8457 * any interesting requests and then jump to the real instruction
8458 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8459 */
8460 .extern MterpCheckBefore
8461 EXPORT_PC
8462 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8463 adrl lr, artMterpAsmInstructionStart + (43 * 128) @ Addr of primary handler.
8464 mov r0, rSELF
8465 add r1, rFP, #OFF_FP_SHADOWFRAME
8466 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8467
8468/* ------------------------------ */
8469 .balign 128
8470.L_ALT_op_sparse_switch: /* 0x2c */
8471/* File: arm/alt_stub.S */
8472/*
8473 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8474 * any interesting requests and then jump to the real instruction
8475 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8476 */
8477 .extern MterpCheckBefore
8478 EXPORT_PC
8479 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8480 adrl lr, artMterpAsmInstructionStart + (44 * 128) @ Addr of primary handler.
8481 mov r0, rSELF
8482 add r1, rFP, #OFF_FP_SHADOWFRAME
8483 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8484
8485/* ------------------------------ */
8486 .balign 128
8487.L_ALT_op_cmpl_float: /* 0x2d */
8488/* File: arm/alt_stub.S */
8489/*
8490 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8491 * any interesting requests and then jump to the real instruction
8492 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8493 */
8494 .extern MterpCheckBefore
8495 EXPORT_PC
8496 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8497 adrl lr, artMterpAsmInstructionStart + (45 * 128) @ Addr of primary handler.
8498 mov r0, rSELF
8499 add r1, rFP, #OFF_FP_SHADOWFRAME
8500 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8501
8502/* ------------------------------ */
8503 .balign 128
8504.L_ALT_op_cmpg_float: /* 0x2e */
8505/* File: arm/alt_stub.S */
8506/*
8507 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8508 * any interesting requests and then jump to the real instruction
8509 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8510 */
8511 .extern MterpCheckBefore
8512 EXPORT_PC
8513 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8514 adrl lr, artMterpAsmInstructionStart + (46 * 128) @ Addr of primary handler.
8515 mov r0, rSELF
8516 add r1, rFP, #OFF_FP_SHADOWFRAME
8517 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8518
8519/* ------------------------------ */
8520 .balign 128
8521.L_ALT_op_cmpl_double: /* 0x2f */
8522/* File: arm/alt_stub.S */
8523/*
8524 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8525 * any interesting requests and then jump to the real instruction
8526 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8527 */
8528 .extern MterpCheckBefore
8529 EXPORT_PC
8530 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8531 adrl lr, artMterpAsmInstructionStart + (47 * 128) @ Addr of primary handler.
8532 mov r0, rSELF
8533 add r1, rFP, #OFF_FP_SHADOWFRAME
8534 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8535
8536/* ------------------------------ */
8537 .balign 128
8538.L_ALT_op_cmpg_double: /* 0x30 */
8539/* File: arm/alt_stub.S */
8540/*
8541 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8542 * any interesting requests and then jump to the real instruction
8543 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8544 */
8545 .extern MterpCheckBefore
8546 EXPORT_PC
8547 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8548 adrl lr, artMterpAsmInstructionStart + (48 * 128) @ Addr of primary handler.
8549 mov r0, rSELF
8550 add r1, rFP, #OFF_FP_SHADOWFRAME
8551 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8552
8553/* ------------------------------ */
8554 .balign 128
8555.L_ALT_op_cmp_long: /* 0x31 */
8556/* File: arm/alt_stub.S */
8557/*
8558 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8559 * any interesting requests and then jump to the real instruction
8560 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8561 */
8562 .extern MterpCheckBefore
8563 EXPORT_PC
8564 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8565 adrl lr, artMterpAsmInstructionStart + (49 * 128) @ Addr of primary handler.
8566 mov r0, rSELF
8567 add r1, rFP, #OFF_FP_SHADOWFRAME
8568 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8569
8570/* ------------------------------ */
8571 .balign 128
8572.L_ALT_op_if_eq: /* 0x32 */
8573/* File: arm/alt_stub.S */
8574/*
8575 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8576 * any interesting requests and then jump to the real instruction
8577 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8578 */
8579 .extern MterpCheckBefore
8580 EXPORT_PC
8581 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8582 adrl lr, artMterpAsmInstructionStart + (50 * 128) @ Addr of primary handler.
8583 mov r0, rSELF
8584 add r1, rFP, #OFF_FP_SHADOWFRAME
8585 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8586
8587/* ------------------------------ */
8588 .balign 128
8589.L_ALT_op_if_ne: /* 0x33 */
8590/* File: arm/alt_stub.S */
8591/*
8592 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8593 * any interesting requests and then jump to the real instruction
8594 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8595 */
8596 .extern MterpCheckBefore
8597 EXPORT_PC
8598 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8599 adrl lr, artMterpAsmInstructionStart + (51 * 128) @ Addr of primary handler.
8600 mov r0, rSELF
8601 add r1, rFP, #OFF_FP_SHADOWFRAME
8602 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8603
8604/* ------------------------------ */
8605 .balign 128
8606.L_ALT_op_if_lt: /* 0x34 */
8607/* File: arm/alt_stub.S */
8608/*
8609 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8610 * any interesting requests and then jump to the real instruction
8611 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8612 */
8613 .extern MterpCheckBefore
8614 EXPORT_PC
8615 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8616 adrl lr, artMterpAsmInstructionStart + (52 * 128) @ Addr of primary handler.
8617 mov r0, rSELF
8618 add r1, rFP, #OFF_FP_SHADOWFRAME
8619 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8620
8621/* ------------------------------ */
8622 .balign 128
8623.L_ALT_op_if_ge: /* 0x35 */
8624/* File: arm/alt_stub.S */
8625/*
8626 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8627 * any interesting requests and then jump to the real instruction
8628 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8629 */
8630 .extern MterpCheckBefore
8631 EXPORT_PC
8632 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8633 adrl lr, artMterpAsmInstructionStart + (53 * 128) @ Addr of primary handler.
8634 mov r0, rSELF
8635 add r1, rFP, #OFF_FP_SHADOWFRAME
8636 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8637
8638/* ------------------------------ */
8639 .balign 128
8640.L_ALT_op_if_gt: /* 0x36 */
8641/* File: arm/alt_stub.S */
8642/*
8643 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8644 * any interesting requests and then jump to the real instruction
8645 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8646 */
8647 .extern MterpCheckBefore
8648 EXPORT_PC
8649 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8650 adrl lr, artMterpAsmInstructionStart + (54 * 128) @ Addr of primary handler.
8651 mov r0, rSELF
8652 add r1, rFP, #OFF_FP_SHADOWFRAME
8653 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8654
8655/* ------------------------------ */
8656 .balign 128
8657.L_ALT_op_if_le: /* 0x37 */
8658/* File: arm/alt_stub.S */
8659/*
8660 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8661 * any interesting requests and then jump to the real instruction
8662 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8663 */
8664 .extern MterpCheckBefore
8665 EXPORT_PC
8666 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8667 adrl lr, artMterpAsmInstructionStart + (55 * 128) @ Addr of primary handler.
8668 mov r0, rSELF
8669 add r1, rFP, #OFF_FP_SHADOWFRAME
8670 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8671
8672/* ------------------------------ */
8673 .balign 128
8674.L_ALT_op_if_eqz: /* 0x38 */
8675/* File: arm/alt_stub.S */
8676/*
8677 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8678 * any interesting requests and then jump to the real instruction
8679 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8680 */
8681 .extern MterpCheckBefore
8682 EXPORT_PC
8683 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8684 adrl lr, artMterpAsmInstructionStart + (56 * 128) @ Addr of primary handler.
8685 mov r0, rSELF
8686 add r1, rFP, #OFF_FP_SHADOWFRAME
8687 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8688
8689/* ------------------------------ */
8690 .balign 128
8691.L_ALT_op_if_nez: /* 0x39 */
8692/* File: arm/alt_stub.S */
8693/*
8694 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8695 * any interesting requests and then jump to the real instruction
8696 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8697 */
8698 .extern MterpCheckBefore
8699 EXPORT_PC
8700 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8701 adrl lr, artMterpAsmInstructionStart + (57 * 128) @ Addr of primary handler.
8702 mov r0, rSELF
8703 add r1, rFP, #OFF_FP_SHADOWFRAME
8704 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8705
8706/* ------------------------------ */
8707 .balign 128
8708.L_ALT_op_if_ltz: /* 0x3a */
8709/* File: arm/alt_stub.S */
8710/*
8711 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8712 * any interesting requests and then jump to the real instruction
8713 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8714 */
8715 .extern MterpCheckBefore
8716 EXPORT_PC
8717 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8718 adrl lr, artMterpAsmInstructionStart + (58 * 128) @ Addr of primary handler.
8719 mov r0, rSELF
8720 add r1, rFP, #OFF_FP_SHADOWFRAME
8721 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8722
8723/* ------------------------------ */
8724 .balign 128
8725.L_ALT_op_if_gez: /* 0x3b */
8726/* File: arm/alt_stub.S */
8727/*
8728 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8729 * any interesting requests and then jump to the real instruction
8730 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8731 */
8732 .extern MterpCheckBefore
8733 EXPORT_PC
8734 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8735 adrl lr, artMterpAsmInstructionStart + (59 * 128) @ Addr of primary handler.
8736 mov r0, rSELF
8737 add r1, rFP, #OFF_FP_SHADOWFRAME
8738 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8739
8740/* ------------------------------ */
8741 .balign 128
8742.L_ALT_op_if_gtz: /* 0x3c */
8743/* File: arm/alt_stub.S */
8744/*
8745 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8746 * any interesting requests and then jump to the real instruction
8747 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8748 */
8749 .extern MterpCheckBefore
8750 EXPORT_PC
8751 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8752 adrl lr, artMterpAsmInstructionStart + (60 * 128) @ Addr of primary handler.
8753 mov r0, rSELF
8754 add r1, rFP, #OFF_FP_SHADOWFRAME
8755 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8756
8757/* ------------------------------ */
8758 .balign 128
8759.L_ALT_op_if_lez: /* 0x3d */
8760/* File: arm/alt_stub.S */
8761/*
8762 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8763 * any interesting requests and then jump to the real instruction
8764 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8765 */
8766 .extern MterpCheckBefore
8767 EXPORT_PC
8768 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8769 adrl lr, artMterpAsmInstructionStart + (61 * 128) @ Addr of primary handler.
8770 mov r0, rSELF
8771 add r1, rFP, #OFF_FP_SHADOWFRAME
8772 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8773
8774/* ------------------------------ */
8775 .balign 128
8776.L_ALT_op_unused_3e: /* 0x3e */
8777/* File: arm/alt_stub.S */
8778/*
8779 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8780 * any interesting requests and then jump to the real instruction
8781 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8782 */
8783 .extern MterpCheckBefore
8784 EXPORT_PC
8785 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8786 adrl lr, artMterpAsmInstructionStart + (62 * 128) @ Addr of primary handler.
8787 mov r0, rSELF
8788 add r1, rFP, #OFF_FP_SHADOWFRAME
8789 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8790
8791/* ------------------------------ */
8792 .balign 128
8793.L_ALT_op_unused_3f: /* 0x3f */
8794/* File: arm/alt_stub.S */
8795/*
8796 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8797 * any interesting requests and then jump to the real instruction
8798 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8799 */
8800 .extern MterpCheckBefore
8801 EXPORT_PC
8802 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8803 adrl lr, artMterpAsmInstructionStart + (63 * 128) @ Addr of primary handler.
8804 mov r0, rSELF
8805 add r1, rFP, #OFF_FP_SHADOWFRAME
8806 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8807
8808/* ------------------------------ */
8809 .balign 128
8810.L_ALT_op_unused_40: /* 0x40 */
8811/* File: arm/alt_stub.S */
8812/*
8813 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8814 * any interesting requests and then jump to the real instruction
8815 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8816 */
8817 .extern MterpCheckBefore
8818 EXPORT_PC
8819 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8820 adrl lr, artMterpAsmInstructionStart + (64 * 128) @ Addr of primary handler.
8821 mov r0, rSELF
8822 add r1, rFP, #OFF_FP_SHADOWFRAME
8823 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8824
8825/* ------------------------------ */
8826 .balign 128
8827.L_ALT_op_unused_41: /* 0x41 */
8828/* File: arm/alt_stub.S */
8829/*
8830 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8831 * any interesting requests and then jump to the real instruction
8832 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8833 */
8834 .extern MterpCheckBefore
8835 EXPORT_PC
8836 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8837 adrl lr, artMterpAsmInstructionStart + (65 * 128) @ Addr of primary handler.
8838 mov r0, rSELF
8839 add r1, rFP, #OFF_FP_SHADOWFRAME
8840 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8841
8842/* ------------------------------ */
8843 .balign 128
8844.L_ALT_op_unused_42: /* 0x42 */
8845/* File: arm/alt_stub.S */
8846/*
8847 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8848 * any interesting requests and then jump to the real instruction
8849 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8850 */
8851 .extern MterpCheckBefore
8852 EXPORT_PC
8853 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8854 adrl lr, artMterpAsmInstructionStart + (66 * 128) @ Addr of primary handler.
8855 mov r0, rSELF
8856 add r1, rFP, #OFF_FP_SHADOWFRAME
8857 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8858
8859/* ------------------------------ */
8860 .balign 128
8861.L_ALT_op_unused_43: /* 0x43 */
8862/* File: arm/alt_stub.S */
8863/*
8864 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8865 * any interesting requests and then jump to the real instruction
8866 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8867 */
8868 .extern MterpCheckBefore
8869 EXPORT_PC
8870 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8871 adrl lr, artMterpAsmInstructionStart + (67 * 128) @ Addr of primary handler.
8872 mov r0, rSELF
8873 add r1, rFP, #OFF_FP_SHADOWFRAME
8874 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8875
8876/* ------------------------------ */
8877 .balign 128
8878.L_ALT_op_aget: /* 0x44 */
8879/* File: arm/alt_stub.S */
8880/*
8881 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8882 * any interesting requests and then jump to the real instruction
8883 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8884 */
8885 .extern MterpCheckBefore
8886 EXPORT_PC
8887 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8888 adrl lr, artMterpAsmInstructionStart + (68 * 128) @ Addr of primary handler.
8889 mov r0, rSELF
8890 add r1, rFP, #OFF_FP_SHADOWFRAME
8891 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8892
8893/* ------------------------------ */
8894 .balign 128
8895.L_ALT_op_aget_wide: /* 0x45 */
8896/* File: arm/alt_stub.S */
8897/*
8898 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8899 * any interesting requests and then jump to the real instruction
8900 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8901 */
8902 .extern MterpCheckBefore
8903 EXPORT_PC
8904 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8905 adrl lr, artMterpAsmInstructionStart + (69 * 128) @ Addr of primary handler.
8906 mov r0, rSELF
8907 add r1, rFP, #OFF_FP_SHADOWFRAME
8908 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8909
8910/* ------------------------------ */
8911 .balign 128
8912.L_ALT_op_aget_object: /* 0x46 */
8913/* File: arm/alt_stub.S */
8914/*
8915 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8916 * any interesting requests and then jump to the real instruction
8917 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8918 */
8919 .extern MterpCheckBefore
8920 EXPORT_PC
8921 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8922 adrl lr, artMterpAsmInstructionStart + (70 * 128) @ Addr of primary handler.
8923 mov r0, rSELF
8924 add r1, rFP, #OFF_FP_SHADOWFRAME
8925 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8926
8927/* ------------------------------ */
8928 .balign 128
8929.L_ALT_op_aget_boolean: /* 0x47 */
8930/* File: arm/alt_stub.S */
8931/*
8932 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8933 * any interesting requests and then jump to the real instruction
8934 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8935 */
8936 .extern MterpCheckBefore
8937 EXPORT_PC
8938 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8939 adrl lr, artMterpAsmInstructionStart + (71 * 128) @ Addr of primary handler.
8940 mov r0, rSELF
8941 add r1, rFP, #OFF_FP_SHADOWFRAME
8942 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8943
8944/* ------------------------------ */
8945 .balign 128
8946.L_ALT_op_aget_byte: /* 0x48 */
8947/* File: arm/alt_stub.S */
8948/*
8949 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8950 * any interesting requests and then jump to the real instruction
8951 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8952 */
8953 .extern MterpCheckBefore
8954 EXPORT_PC
8955 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8956 adrl lr, artMterpAsmInstructionStart + (72 * 128) @ Addr of primary handler.
8957 mov r0, rSELF
8958 add r1, rFP, #OFF_FP_SHADOWFRAME
8959 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8960
8961/* ------------------------------ */
8962 .balign 128
8963.L_ALT_op_aget_char: /* 0x49 */
8964/* File: arm/alt_stub.S */
8965/*
8966 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8967 * any interesting requests and then jump to the real instruction
8968 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8969 */
8970 .extern MterpCheckBefore
8971 EXPORT_PC
8972 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8973 adrl lr, artMterpAsmInstructionStart + (73 * 128) @ Addr of primary handler.
8974 mov r0, rSELF
8975 add r1, rFP, #OFF_FP_SHADOWFRAME
8976 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8977
8978/* ------------------------------ */
8979 .balign 128
8980.L_ALT_op_aget_short: /* 0x4a */
8981/* File: arm/alt_stub.S */
8982/*
8983 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
8984 * any interesting requests and then jump to the real instruction
8985 * handler. Note that the call to MterpCheckBefore is done as a tail call.
8986 */
8987 .extern MterpCheckBefore
8988 EXPORT_PC
8989 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
8990 adrl lr, artMterpAsmInstructionStart + (74 * 128) @ Addr of primary handler.
8991 mov r0, rSELF
8992 add r1, rFP, #OFF_FP_SHADOWFRAME
8993 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
8994
8995/* ------------------------------ */
8996 .balign 128
8997.L_ALT_op_aput: /* 0x4b */
8998/* File: arm/alt_stub.S */
8999/*
9000 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9001 * any interesting requests and then jump to the real instruction
9002 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9003 */
9004 .extern MterpCheckBefore
9005 EXPORT_PC
9006 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9007 adrl lr, artMterpAsmInstructionStart + (75 * 128) @ Addr of primary handler.
9008 mov r0, rSELF
9009 add r1, rFP, #OFF_FP_SHADOWFRAME
9010 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9011
9012/* ------------------------------ */
9013 .balign 128
9014.L_ALT_op_aput_wide: /* 0x4c */
9015/* File: arm/alt_stub.S */
9016/*
9017 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9018 * any interesting requests and then jump to the real instruction
9019 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9020 */
9021 .extern MterpCheckBefore
9022 EXPORT_PC
9023 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9024 adrl lr, artMterpAsmInstructionStart + (76 * 128) @ Addr of primary handler.
9025 mov r0, rSELF
9026 add r1, rFP, #OFF_FP_SHADOWFRAME
9027 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9028
9029/* ------------------------------ */
9030 .balign 128
9031.L_ALT_op_aput_object: /* 0x4d */
9032/* File: arm/alt_stub.S */
9033/*
9034 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9035 * any interesting requests and then jump to the real instruction
9036 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9037 */
9038 .extern MterpCheckBefore
9039 EXPORT_PC
9040 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9041 adrl lr, artMterpAsmInstructionStart + (77 * 128) @ Addr of primary handler.
9042 mov r0, rSELF
9043 add r1, rFP, #OFF_FP_SHADOWFRAME
9044 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9045
9046/* ------------------------------ */
9047 .balign 128
9048.L_ALT_op_aput_boolean: /* 0x4e */
9049/* File: arm/alt_stub.S */
9050/*
9051 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9052 * any interesting requests and then jump to the real instruction
9053 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9054 */
9055 .extern MterpCheckBefore
9056 EXPORT_PC
9057 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9058 adrl lr, artMterpAsmInstructionStart + (78 * 128) @ Addr of primary handler.
9059 mov r0, rSELF
9060 add r1, rFP, #OFF_FP_SHADOWFRAME
9061 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9062
9063/* ------------------------------ */
9064 .balign 128
9065.L_ALT_op_aput_byte: /* 0x4f */
9066/* File: arm/alt_stub.S */
9067/*
9068 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9069 * any interesting requests and then jump to the real instruction
9070 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9071 */
9072 .extern MterpCheckBefore
9073 EXPORT_PC
9074 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9075 adrl lr, artMterpAsmInstructionStart + (79 * 128) @ Addr of primary handler.
9076 mov r0, rSELF
9077 add r1, rFP, #OFF_FP_SHADOWFRAME
9078 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9079
9080/* ------------------------------ */
9081 .balign 128
9082.L_ALT_op_aput_char: /* 0x50 */
9083/* File: arm/alt_stub.S */
9084/*
9085 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9086 * any interesting requests and then jump to the real instruction
9087 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9088 */
9089 .extern MterpCheckBefore
9090 EXPORT_PC
9091 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9092 adrl lr, artMterpAsmInstructionStart + (80 * 128) @ Addr of primary handler.
9093 mov r0, rSELF
9094 add r1, rFP, #OFF_FP_SHADOWFRAME
9095 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9096
9097/* ------------------------------ */
9098 .balign 128
9099.L_ALT_op_aput_short: /* 0x51 */
9100/* File: arm/alt_stub.S */
9101/*
9102 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9103 * any interesting requests and then jump to the real instruction
9104 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9105 */
9106 .extern MterpCheckBefore
9107 EXPORT_PC
9108 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9109 adrl lr, artMterpAsmInstructionStart + (81 * 128) @ Addr of primary handler.
9110 mov r0, rSELF
9111 add r1, rFP, #OFF_FP_SHADOWFRAME
9112 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9113
9114/* ------------------------------ */
9115 .balign 128
9116.L_ALT_op_iget: /* 0x52 */
9117/* File: arm/alt_stub.S */
9118/*
9119 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9120 * any interesting requests and then jump to the real instruction
9121 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9122 */
9123 .extern MterpCheckBefore
9124 EXPORT_PC
9125 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9126 adrl lr, artMterpAsmInstructionStart + (82 * 128) @ Addr of primary handler.
9127 mov r0, rSELF
9128 add r1, rFP, #OFF_FP_SHADOWFRAME
9129 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9130
9131/* ------------------------------ */
9132 .balign 128
9133.L_ALT_op_iget_wide: /* 0x53 */
9134/* File: arm/alt_stub.S */
9135/*
9136 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9137 * any interesting requests and then jump to the real instruction
9138 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9139 */
9140 .extern MterpCheckBefore
9141 EXPORT_PC
9142 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9143 adrl lr, artMterpAsmInstructionStart + (83 * 128) @ Addr of primary handler.
9144 mov r0, rSELF
9145 add r1, rFP, #OFF_FP_SHADOWFRAME
9146 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9147
9148/* ------------------------------ */
9149 .balign 128
9150.L_ALT_op_iget_object: /* 0x54 */
9151/* File: arm/alt_stub.S */
9152/*
9153 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9154 * any interesting requests and then jump to the real instruction
9155 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9156 */
9157 .extern MterpCheckBefore
9158 EXPORT_PC
9159 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9160 adrl lr, artMterpAsmInstructionStart + (84 * 128) @ Addr of primary handler.
9161 mov r0, rSELF
9162 add r1, rFP, #OFF_FP_SHADOWFRAME
9163 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9164
9165/* ------------------------------ */
9166 .balign 128
9167.L_ALT_op_iget_boolean: /* 0x55 */
9168/* File: arm/alt_stub.S */
9169/*
9170 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9171 * any interesting requests and then jump to the real instruction
9172 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9173 */
9174 .extern MterpCheckBefore
9175 EXPORT_PC
9176 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9177 adrl lr, artMterpAsmInstructionStart + (85 * 128) @ Addr of primary handler.
9178 mov r0, rSELF
9179 add r1, rFP, #OFF_FP_SHADOWFRAME
9180 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9181
9182/* ------------------------------ */
9183 .balign 128
9184.L_ALT_op_iget_byte: /* 0x56 */
9185/* File: arm/alt_stub.S */
9186/*
9187 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9188 * any interesting requests and then jump to the real instruction
9189 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9190 */
9191 .extern MterpCheckBefore
9192 EXPORT_PC
9193 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9194 adrl lr, artMterpAsmInstructionStart + (86 * 128) @ Addr of primary handler.
9195 mov r0, rSELF
9196 add r1, rFP, #OFF_FP_SHADOWFRAME
9197 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9198
9199/* ------------------------------ */
9200 .balign 128
9201.L_ALT_op_iget_char: /* 0x57 */
9202/* File: arm/alt_stub.S */
9203/*
9204 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9205 * any interesting requests and then jump to the real instruction
9206 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9207 */
9208 .extern MterpCheckBefore
9209 EXPORT_PC
9210 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9211 adrl lr, artMterpAsmInstructionStart + (87 * 128) @ Addr of primary handler.
9212 mov r0, rSELF
9213 add r1, rFP, #OFF_FP_SHADOWFRAME
9214 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9215
9216/* ------------------------------ */
9217 .balign 128
9218.L_ALT_op_iget_short: /* 0x58 */
9219/* File: arm/alt_stub.S */
9220/*
9221 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9222 * any interesting requests and then jump to the real instruction
9223 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9224 */
9225 .extern MterpCheckBefore
9226 EXPORT_PC
9227 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9228 adrl lr, artMterpAsmInstructionStart + (88 * 128) @ Addr of primary handler.
9229 mov r0, rSELF
9230 add r1, rFP, #OFF_FP_SHADOWFRAME
9231 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9232
9233/* ------------------------------ */
9234 .balign 128
9235.L_ALT_op_iput: /* 0x59 */
9236/* File: arm/alt_stub.S */
9237/*
9238 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9239 * any interesting requests and then jump to the real instruction
9240 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9241 */
9242 .extern MterpCheckBefore
9243 EXPORT_PC
9244 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9245 adrl lr, artMterpAsmInstructionStart + (89 * 128) @ Addr of primary handler.
9246 mov r0, rSELF
9247 add r1, rFP, #OFF_FP_SHADOWFRAME
9248 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9249
9250/* ------------------------------ */
9251 .balign 128
9252.L_ALT_op_iput_wide: /* 0x5a */
9253/* File: arm/alt_stub.S */
9254/*
9255 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9256 * any interesting requests and then jump to the real instruction
9257 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9258 */
9259 .extern MterpCheckBefore
9260 EXPORT_PC
9261 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9262 adrl lr, artMterpAsmInstructionStart + (90 * 128) @ Addr of primary handler.
9263 mov r0, rSELF
9264 add r1, rFP, #OFF_FP_SHADOWFRAME
9265 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9266
9267/* ------------------------------ */
9268 .balign 128
9269.L_ALT_op_iput_object: /* 0x5b */
9270/* File: arm/alt_stub.S */
9271/*
9272 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9273 * any interesting requests and then jump to the real instruction
9274 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9275 */
9276 .extern MterpCheckBefore
9277 EXPORT_PC
9278 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9279 adrl lr, artMterpAsmInstructionStart + (91 * 128) @ Addr of primary handler.
9280 mov r0, rSELF
9281 add r1, rFP, #OFF_FP_SHADOWFRAME
9282 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9283
9284/* ------------------------------ */
9285 .balign 128
9286.L_ALT_op_iput_boolean: /* 0x5c */
9287/* File: arm/alt_stub.S */
9288/*
9289 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9290 * any interesting requests and then jump to the real instruction
9291 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9292 */
9293 .extern MterpCheckBefore
9294 EXPORT_PC
9295 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9296 adrl lr, artMterpAsmInstructionStart + (92 * 128) @ Addr of primary handler.
9297 mov r0, rSELF
9298 add r1, rFP, #OFF_FP_SHADOWFRAME
9299 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9300
9301/* ------------------------------ */
9302 .balign 128
9303.L_ALT_op_iput_byte: /* 0x5d */
9304/* File: arm/alt_stub.S */
9305/*
9306 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9307 * any interesting requests and then jump to the real instruction
9308 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9309 */
9310 .extern MterpCheckBefore
9311 EXPORT_PC
9312 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9313 adrl lr, artMterpAsmInstructionStart + (93 * 128) @ Addr of primary handler.
9314 mov r0, rSELF
9315 add r1, rFP, #OFF_FP_SHADOWFRAME
9316 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9317
9318/* ------------------------------ */
9319 .balign 128
9320.L_ALT_op_iput_char: /* 0x5e */
9321/* File: arm/alt_stub.S */
9322/*
9323 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9324 * any interesting requests and then jump to the real instruction
9325 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9326 */
9327 .extern MterpCheckBefore
9328 EXPORT_PC
9329 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9330 adrl lr, artMterpAsmInstructionStart + (94 * 128) @ Addr of primary handler.
9331 mov r0, rSELF
9332 add r1, rFP, #OFF_FP_SHADOWFRAME
9333 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9334
9335/* ------------------------------ */
9336 .balign 128
9337.L_ALT_op_iput_short: /* 0x5f */
9338/* File: arm/alt_stub.S */
9339/*
9340 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9341 * any interesting requests and then jump to the real instruction
9342 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9343 */
9344 .extern MterpCheckBefore
9345 EXPORT_PC
9346 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9347 adrl lr, artMterpAsmInstructionStart + (95 * 128) @ Addr of primary handler.
9348 mov r0, rSELF
9349 add r1, rFP, #OFF_FP_SHADOWFRAME
9350 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9351
9352/* ------------------------------ */
9353 .balign 128
9354.L_ALT_op_sget: /* 0x60 */
9355/* File: arm/alt_stub.S */
9356/*
9357 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9358 * any interesting requests and then jump to the real instruction
9359 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9360 */
9361 .extern MterpCheckBefore
9362 EXPORT_PC
9363 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9364 adrl lr, artMterpAsmInstructionStart + (96 * 128) @ Addr of primary handler.
9365 mov r0, rSELF
9366 add r1, rFP, #OFF_FP_SHADOWFRAME
9367 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9368
9369/* ------------------------------ */
9370 .balign 128
9371.L_ALT_op_sget_wide: /* 0x61 */
9372/* File: arm/alt_stub.S */
9373/*
9374 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9375 * any interesting requests and then jump to the real instruction
9376 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9377 */
9378 .extern MterpCheckBefore
9379 EXPORT_PC
9380 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9381 adrl lr, artMterpAsmInstructionStart + (97 * 128) @ Addr of primary handler.
9382 mov r0, rSELF
9383 add r1, rFP, #OFF_FP_SHADOWFRAME
9384 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9385
9386/* ------------------------------ */
9387 .balign 128
9388.L_ALT_op_sget_object: /* 0x62 */
9389/* File: arm/alt_stub.S */
9390/*
9391 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9392 * any interesting requests and then jump to the real instruction
9393 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9394 */
9395 .extern MterpCheckBefore
9396 EXPORT_PC
9397 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9398 adrl lr, artMterpAsmInstructionStart + (98 * 128) @ Addr of primary handler.
9399 mov r0, rSELF
9400 add r1, rFP, #OFF_FP_SHADOWFRAME
9401 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9402
9403/* ------------------------------ */
9404 .balign 128
9405.L_ALT_op_sget_boolean: /* 0x63 */
9406/* File: arm/alt_stub.S */
9407/*
9408 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9409 * any interesting requests and then jump to the real instruction
9410 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9411 */
9412 .extern MterpCheckBefore
9413 EXPORT_PC
9414 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9415 adrl lr, artMterpAsmInstructionStart + (99 * 128) @ Addr of primary handler.
9416 mov r0, rSELF
9417 add r1, rFP, #OFF_FP_SHADOWFRAME
9418 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9419
9420/* ------------------------------ */
9421 .balign 128
9422.L_ALT_op_sget_byte: /* 0x64 */
9423/* File: arm/alt_stub.S */
9424/*
9425 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9426 * any interesting requests and then jump to the real instruction
9427 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9428 */
9429 .extern MterpCheckBefore
9430 EXPORT_PC
9431 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9432 adrl lr, artMterpAsmInstructionStart + (100 * 128) @ Addr of primary handler.
9433 mov r0, rSELF
9434 add r1, rFP, #OFF_FP_SHADOWFRAME
9435 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9436
9437/* ------------------------------ */
9438 .balign 128
9439.L_ALT_op_sget_char: /* 0x65 */
9440/* File: arm/alt_stub.S */
9441/*
9442 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9443 * any interesting requests and then jump to the real instruction
9444 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9445 */
9446 .extern MterpCheckBefore
9447 EXPORT_PC
9448 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9449 adrl lr, artMterpAsmInstructionStart + (101 * 128) @ Addr of primary handler.
9450 mov r0, rSELF
9451 add r1, rFP, #OFF_FP_SHADOWFRAME
9452 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9453
9454/* ------------------------------ */
9455 .balign 128
9456.L_ALT_op_sget_short: /* 0x66 */
9457/* File: arm/alt_stub.S */
9458/*
9459 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9460 * any interesting requests and then jump to the real instruction
9461 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9462 */
9463 .extern MterpCheckBefore
9464 EXPORT_PC
9465 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9466 adrl lr, artMterpAsmInstructionStart + (102 * 128) @ Addr of primary handler.
9467 mov r0, rSELF
9468 add r1, rFP, #OFF_FP_SHADOWFRAME
9469 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9470
9471/* ------------------------------ */
9472 .balign 128
9473.L_ALT_op_sput: /* 0x67 */
9474/* File: arm/alt_stub.S */
9475/*
9476 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9477 * any interesting requests and then jump to the real instruction
9478 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9479 */
9480 .extern MterpCheckBefore
9481 EXPORT_PC
9482 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9483 adrl lr, artMterpAsmInstructionStart + (103 * 128) @ Addr of primary handler.
9484 mov r0, rSELF
9485 add r1, rFP, #OFF_FP_SHADOWFRAME
9486 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9487
9488/* ------------------------------ */
9489 .balign 128
9490.L_ALT_op_sput_wide: /* 0x68 */
9491/* File: arm/alt_stub.S */
9492/*
9493 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9494 * any interesting requests and then jump to the real instruction
9495 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9496 */
9497 .extern MterpCheckBefore
9498 EXPORT_PC
9499 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9500 adrl lr, artMterpAsmInstructionStart + (104 * 128) @ Addr of primary handler.
9501 mov r0, rSELF
9502 add r1, rFP, #OFF_FP_SHADOWFRAME
9503 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9504
9505/* ------------------------------ */
9506 .balign 128
9507.L_ALT_op_sput_object: /* 0x69 */
9508/* File: arm/alt_stub.S */
9509/*
9510 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9511 * any interesting requests and then jump to the real instruction
9512 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9513 */
9514 .extern MterpCheckBefore
9515 EXPORT_PC
9516 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9517 adrl lr, artMterpAsmInstructionStart + (105 * 128) @ Addr of primary handler.
9518 mov r0, rSELF
9519 add r1, rFP, #OFF_FP_SHADOWFRAME
9520 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9521
9522/* ------------------------------ */
9523 .balign 128
9524.L_ALT_op_sput_boolean: /* 0x6a */
9525/* File: arm/alt_stub.S */
9526/*
9527 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9528 * any interesting requests and then jump to the real instruction
9529 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9530 */
9531 .extern MterpCheckBefore
9532 EXPORT_PC
9533 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9534 adrl lr, artMterpAsmInstructionStart + (106 * 128) @ Addr of primary handler.
9535 mov r0, rSELF
9536 add r1, rFP, #OFF_FP_SHADOWFRAME
9537 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9538
9539/* ------------------------------ */
9540 .balign 128
9541.L_ALT_op_sput_byte: /* 0x6b */
9542/* File: arm/alt_stub.S */
9543/*
9544 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9545 * any interesting requests and then jump to the real instruction
9546 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9547 */
9548 .extern MterpCheckBefore
9549 EXPORT_PC
9550 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9551 adrl lr, artMterpAsmInstructionStart + (107 * 128) @ Addr of primary handler.
9552 mov r0, rSELF
9553 add r1, rFP, #OFF_FP_SHADOWFRAME
9554 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9555
9556/* ------------------------------ */
9557 .balign 128
9558.L_ALT_op_sput_char: /* 0x6c */
9559/* File: arm/alt_stub.S */
9560/*
9561 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9562 * any interesting requests and then jump to the real instruction
9563 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9564 */
9565 .extern MterpCheckBefore
9566 EXPORT_PC
9567 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9568 adrl lr, artMterpAsmInstructionStart + (108 * 128) @ Addr of primary handler.
9569 mov r0, rSELF
9570 add r1, rFP, #OFF_FP_SHADOWFRAME
9571 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9572
9573/* ------------------------------ */
9574 .balign 128
9575.L_ALT_op_sput_short: /* 0x6d */
9576/* File: arm/alt_stub.S */
9577/*
9578 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9579 * any interesting requests and then jump to the real instruction
9580 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9581 */
9582 .extern MterpCheckBefore
9583 EXPORT_PC
9584 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9585 adrl lr, artMterpAsmInstructionStart + (109 * 128) @ Addr of primary handler.
9586 mov r0, rSELF
9587 add r1, rFP, #OFF_FP_SHADOWFRAME
9588 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9589
9590/* ------------------------------ */
9591 .balign 128
9592.L_ALT_op_invoke_virtual: /* 0x6e */
9593/* File: arm/alt_stub.S */
9594/*
9595 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9596 * any interesting requests and then jump to the real instruction
9597 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9598 */
9599 .extern MterpCheckBefore
9600 EXPORT_PC
9601 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9602 adrl lr, artMterpAsmInstructionStart + (110 * 128) @ Addr of primary handler.
9603 mov r0, rSELF
9604 add r1, rFP, #OFF_FP_SHADOWFRAME
9605 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9606
9607/* ------------------------------ */
9608 .balign 128
9609.L_ALT_op_invoke_super: /* 0x6f */
9610/* File: arm/alt_stub.S */
9611/*
9612 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9613 * any interesting requests and then jump to the real instruction
9614 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9615 */
9616 .extern MterpCheckBefore
9617 EXPORT_PC
9618 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9619 adrl lr, artMterpAsmInstructionStart + (111 * 128) @ Addr of primary handler.
9620 mov r0, rSELF
9621 add r1, rFP, #OFF_FP_SHADOWFRAME
9622 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9623
9624/* ------------------------------ */
9625 .balign 128
9626.L_ALT_op_invoke_direct: /* 0x70 */
9627/* File: arm/alt_stub.S */
9628/*
9629 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9630 * any interesting requests and then jump to the real instruction
9631 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9632 */
9633 .extern MterpCheckBefore
9634 EXPORT_PC
9635 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9636 adrl lr, artMterpAsmInstructionStart + (112 * 128) @ Addr of primary handler.
9637 mov r0, rSELF
9638 add r1, rFP, #OFF_FP_SHADOWFRAME
9639 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9640
9641/* ------------------------------ */
9642 .balign 128
9643.L_ALT_op_invoke_static: /* 0x71 */
9644/* File: arm/alt_stub.S */
9645/*
9646 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9647 * any interesting requests and then jump to the real instruction
9648 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9649 */
9650 .extern MterpCheckBefore
9651 EXPORT_PC
9652 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9653 adrl lr, artMterpAsmInstructionStart + (113 * 128) @ Addr of primary handler.
9654 mov r0, rSELF
9655 add r1, rFP, #OFF_FP_SHADOWFRAME
9656 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9657
9658/* ------------------------------ */
9659 .balign 128
9660.L_ALT_op_invoke_interface: /* 0x72 */
9661/* File: arm/alt_stub.S */
9662/*
9663 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9664 * any interesting requests and then jump to the real instruction
9665 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9666 */
9667 .extern MterpCheckBefore
9668 EXPORT_PC
9669 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9670 adrl lr, artMterpAsmInstructionStart + (114 * 128) @ Addr of primary handler.
9671 mov r0, rSELF
9672 add r1, rFP, #OFF_FP_SHADOWFRAME
9673 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9674
9675/* ------------------------------ */
9676 .balign 128
9677.L_ALT_op_return_void_no_barrier: /* 0x73 */
9678/* File: arm/alt_stub.S */
9679/*
9680 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9681 * any interesting requests and then jump to the real instruction
9682 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9683 */
9684 .extern MterpCheckBefore
9685 EXPORT_PC
9686 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9687 adrl lr, artMterpAsmInstructionStart + (115 * 128) @ Addr of primary handler.
9688 mov r0, rSELF
9689 add r1, rFP, #OFF_FP_SHADOWFRAME
9690 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9691
9692/* ------------------------------ */
9693 .balign 128
9694.L_ALT_op_invoke_virtual_range: /* 0x74 */
9695/* File: arm/alt_stub.S */
9696/*
9697 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9698 * any interesting requests and then jump to the real instruction
9699 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9700 */
9701 .extern MterpCheckBefore
9702 EXPORT_PC
9703 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9704 adrl lr, artMterpAsmInstructionStart + (116 * 128) @ Addr of primary handler.
9705 mov r0, rSELF
9706 add r1, rFP, #OFF_FP_SHADOWFRAME
9707 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9708
9709/* ------------------------------ */
9710 .balign 128
9711.L_ALT_op_invoke_super_range: /* 0x75 */
9712/* File: arm/alt_stub.S */
9713/*
9714 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9715 * any interesting requests and then jump to the real instruction
9716 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9717 */
9718 .extern MterpCheckBefore
9719 EXPORT_PC
9720 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9721 adrl lr, artMterpAsmInstructionStart + (117 * 128) @ Addr of primary handler.
9722 mov r0, rSELF
9723 add r1, rFP, #OFF_FP_SHADOWFRAME
9724 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9725
9726/* ------------------------------ */
9727 .balign 128
9728.L_ALT_op_invoke_direct_range: /* 0x76 */
9729/* File: arm/alt_stub.S */
9730/*
9731 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9732 * any interesting requests and then jump to the real instruction
9733 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9734 */
9735 .extern MterpCheckBefore
9736 EXPORT_PC
9737 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9738 adrl lr, artMterpAsmInstructionStart + (118 * 128) @ Addr of primary handler.
9739 mov r0, rSELF
9740 add r1, rFP, #OFF_FP_SHADOWFRAME
9741 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9742
9743/* ------------------------------ */
9744 .balign 128
9745.L_ALT_op_invoke_static_range: /* 0x77 */
9746/* File: arm/alt_stub.S */
9747/*
9748 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9749 * any interesting requests and then jump to the real instruction
9750 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9751 */
9752 .extern MterpCheckBefore
9753 EXPORT_PC
9754 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9755 adrl lr, artMterpAsmInstructionStart + (119 * 128) @ Addr of primary handler.
9756 mov r0, rSELF
9757 add r1, rFP, #OFF_FP_SHADOWFRAME
9758 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9759
9760/* ------------------------------ */
9761 .balign 128
9762.L_ALT_op_invoke_interface_range: /* 0x78 */
9763/* File: arm/alt_stub.S */
9764/*
9765 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9766 * any interesting requests and then jump to the real instruction
9767 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9768 */
9769 .extern MterpCheckBefore
9770 EXPORT_PC
9771 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9772 adrl lr, artMterpAsmInstructionStart + (120 * 128) @ Addr of primary handler.
9773 mov r0, rSELF
9774 add r1, rFP, #OFF_FP_SHADOWFRAME
9775 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9776
9777/* ------------------------------ */
9778 .balign 128
9779.L_ALT_op_unused_79: /* 0x79 */
9780/* File: arm/alt_stub.S */
9781/*
9782 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9783 * any interesting requests and then jump to the real instruction
9784 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9785 */
9786 .extern MterpCheckBefore
9787 EXPORT_PC
9788 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9789 adrl lr, artMterpAsmInstructionStart + (121 * 128) @ Addr of primary handler.
9790 mov r0, rSELF
9791 add r1, rFP, #OFF_FP_SHADOWFRAME
9792 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9793
9794/* ------------------------------ */
9795 .balign 128
9796.L_ALT_op_unused_7a: /* 0x7a */
9797/* File: arm/alt_stub.S */
9798/*
9799 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9800 * any interesting requests and then jump to the real instruction
9801 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9802 */
9803 .extern MterpCheckBefore
9804 EXPORT_PC
9805 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9806 adrl lr, artMterpAsmInstructionStart + (122 * 128) @ Addr of primary handler.
9807 mov r0, rSELF
9808 add r1, rFP, #OFF_FP_SHADOWFRAME
9809 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9810
9811/* ------------------------------ */
9812 .balign 128
9813.L_ALT_op_neg_int: /* 0x7b */
9814/* File: arm/alt_stub.S */
9815/*
9816 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9817 * any interesting requests and then jump to the real instruction
9818 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9819 */
9820 .extern MterpCheckBefore
9821 EXPORT_PC
9822 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9823 adrl lr, artMterpAsmInstructionStart + (123 * 128) @ Addr of primary handler.
9824 mov r0, rSELF
9825 add r1, rFP, #OFF_FP_SHADOWFRAME
9826 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9827
9828/* ------------------------------ */
9829 .balign 128
9830.L_ALT_op_not_int: /* 0x7c */
9831/* File: arm/alt_stub.S */
9832/*
9833 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9834 * any interesting requests and then jump to the real instruction
9835 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9836 */
9837 .extern MterpCheckBefore
9838 EXPORT_PC
9839 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9840 adrl lr, artMterpAsmInstructionStart + (124 * 128) @ Addr of primary handler.
9841 mov r0, rSELF
9842 add r1, rFP, #OFF_FP_SHADOWFRAME
9843 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9844
9845/* ------------------------------ */
9846 .balign 128
9847.L_ALT_op_neg_long: /* 0x7d */
9848/* File: arm/alt_stub.S */
9849/*
9850 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9851 * any interesting requests and then jump to the real instruction
9852 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9853 */
9854 .extern MterpCheckBefore
9855 EXPORT_PC
9856 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9857 adrl lr, artMterpAsmInstructionStart + (125 * 128) @ Addr of primary handler.
9858 mov r0, rSELF
9859 add r1, rFP, #OFF_FP_SHADOWFRAME
9860 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9861
9862/* ------------------------------ */
9863 .balign 128
9864.L_ALT_op_not_long: /* 0x7e */
9865/* File: arm/alt_stub.S */
9866/*
9867 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9868 * any interesting requests and then jump to the real instruction
9869 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9870 */
9871 .extern MterpCheckBefore
9872 EXPORT_PC
9873 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9874 adrl lr, artMterpAsmInstructionStart + (126 * 128) @ Addr of primary handler.
9875 mov r0, rSELF
9876 add r1, rFP, #OFF_FP_SHADOWFRAME
9877 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9878
9879/* ------------------------------ */
9880 .balign 128
9881.L_ALT_op_neg_float: /* 0x7f */
9882/* File: arm/alt_stub.S */
9883/*
9884 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9885 * any interesting requests and then jump to the real instruction
9886 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9887 */
9888 .extern MterpCheckBefore
9889 EXPORT_PC
9890 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9891 adrl lr, artMterpAsmInstructionStart + (127 * 128) @ Addr of primary handler.
9892 mov r0, rSELF
9893 add r1, rFP, #OFF_FP_SHADOWFRAME
9894 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9895
9896/* ------------------------------ */
9897 .balign 128
9898.L_ALT_op_neg_double: /* 0x80 */
9899/* File: arm/alt_stub.S */
9900/*
9901 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9902 * any interesting requests and then jump to the real instruction
9903 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9904 */
9905 .extern MterpCheckBefore
9906 EXPORT_PC
9907 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9908 adrl lr, artMterpAsmInstructionStart + (128 * 128) @ Addr of primary handler.
9909 mov r0, rSELF
9910 add r1, rFP, #OFF_FP_SHADOWFRAME
9911 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9912
9913/* ------------------------------ */
9914 .balign 128
9915.L_ALT_op_int_to_long: /* 0x81 */
9916/* File: arm/alt_stub.S */
9917/*
9918 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9919 * any interesting requests and then jump to the real instruction
9920 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9921 */
9922 .extern MterpCheckBefore
9923 EXPORT_PC
9924 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9925 adrl lr, artMterpAsmInstructionStart + (129 * 128) @ Addr of primary handler.
9926 mov r0, rSELF
9927 add r1, rFP, #OFF_FP_SHADOWFRAME
9928 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9929
9930/* ------------------------------ */
9931 .balign 128
9932.L_ALT_op_int_to_float: /* 0x82 */
9933/* File: arm/alt_stub.S */
9934/*
9935 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9936 * any interesting requests and then jump to the real instruction
9937 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9938 */
9939 .extern MterpCheckBefore
9940 EXPORT_PC
9941 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9942 adrl lr, artMterpAsmInstructionStart + (130 * 128) @ Addr of primary handler.
9943 mov r0, rSELF
9944 add r1, rFP, #OFF_FP_SHADOWFRAME
9945 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9946
9947/* ------------------------------ */
9948 .balign 128
9949.L_ALT_op_int_to_double: /* 0x83 */
9950/* File: arm/alt_stub.S */
9951/*
9952 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9953 * any interesting requests and then jump to the real instruction
9954 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9955 */
9956 .extern MterpCheckBefore
9957 EXPORT_PC
9958 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9959 adrl lr, artMterpAsmInstructionStart + (131 * 128) @ Addr of primary handler.
9960 mov r0, rSELF
9961 add r1, rFP, #OFF_FP_SHADOWFRAME
9962 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9963
9964/* ------------------------------ */
9965 .balign 128
9966.L_ALT_op_long_to_int: /* 0x84 */
9967/* File: arm/alt_stub.S */
9968/*
9969 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9970 * any interesting requests and then jump to the real instruction
9971 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9972 */
9973 .extern MterpCheckBefore
9974 EXPORT_PC
9975 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9976 adrl lr, artMterpAsmInstructionStart + (132 * 128) @ Addr of primary handler.
9977 mov r0, rSELF
9978 add r1, rFP, #OFF_FP_SHADOWFRAME
9979 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9980
9981/* ------------------------------ */
9982 .balign 128
9983.L_ALT_op_long_to_float: /* 0x85 */
9984/* File: arm/alt_stub.S */
9985/*
9986 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
9987 * any interesting requests and then jump to the real instruction
9988 * handler. Note that the call to MterpCheckBefore is done as a tail call.
9989 */
9990 .extern MterpCheckBefore
9991 EXPORT_PC
9992 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
9993 adrl lr, artMterpAsmInstructionStart + (133 * 128) @ Addr of primary handler.
9994 mov r0, rSELF
9995 add r1, rFP, #OFF_FP_SHADOWFRAME
9996 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
9997
9998/* ------------------------------ */
9999 .balign 128
10000.L_ALT_op_long_to_double: /* 0x86 */
10001/* File: arm/alt_stub.S */
10002/*
10003 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10004 * any interesting requests and then jump to the real instruction
10005 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10006 */
10007 .extern MterpCheckBefore
10008 EXPORT_PC
10009 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10010 adrl lr, artMterpAsmInstructionStart + (134 * 128) @ Addr of primary handler.
10011 mov r0, rSELF
10012 add r1, rFP, #OFF_FP_SHADOWFRAME
10013 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10014
10015/* ------------------------------ */
10016 .balign 128
10017.L_ALT_op_float_to_int: /* 0x87 */
10018/* File: arm/alt_stub.S */
10019/*
10020 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10021 * any interesting requests and then jump to the real instruction
10022 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10023 */
10024 .extern MterpCheckBefore
10025 EXPORT_PC
10026 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10027 adrl lr, artMterpAsmInstructionStart + (135 * 128) @ Addr of primary handler.
10028 mov r0, rSELF
10029 add r1, rFP, #OFF_FP_SHADOWFRAME
10030 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10031
10032/* ------------------------------ */
10033 .balign 128
10034.L_ALT_op_float_to_long: /* 0x88 */
10035/* File: arm/alt_stub.S */
10036/*
10037 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10038 * any interesting requests and then jump to the real instruction
10039 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10040 */
10041 .extern MterpCheckBefore
10042 EXPORT_PC
10043 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10044 adrl lr, artMterpAsmInstructionStart + (136 * 128) @ Addr of primary handler.
10045 mov r0, rSELF
10046 add r1, rFP, #OFF_FP_SHADOWFRAME
10047 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10048
10049/* ------------------------------ */
10050 .balign 128
10051.L_ALT_op_float_to_double: /* 0x89 */
10052/* File: arm/alt_stub.S */
10053/*
10054 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10055 * any interesting requests and then jump to the real instruction
10056 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10057 */
10058 .extern MterpCheckBefore
10059 EXPORT_PC
10060 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10061 adrl lr, artMterpAsmInstructionStart + (137 * 128) @ Addr of primary handler.
10062 mov r0, rSELF
10063 add r1, rFP, #OFF_FP_SHADOWFRAME
10064 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10065
10066/* ------------------------------ */
10067 .balign 128
10068.L_ALT_op_double_to_int: /* 0x8a */
10069/* File: arm/alt_stub.S */
10070/*
10071 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10072 * any interesting requests and then jump to the real instruction
10073 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10074 */
10075 .extern MterpCheckBefore
10076 EXPORT_PC
10077 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10078 adrl lr, artMterpAsmInstructionStart + (138 * 128) @ Addr of primary handler.
10079 mov r0, rSELF
10080 add r1, rFP, #OFF_FP_SHADOWFRAME
10081 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10082
10083/* ------------------------------ */
10084 .balign 128
10085.L_ALT_op_double_to_long: /* 0x8b */
10086/* File: arm/alt_stub.S */
10087/*
10088 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10089 * any interesting requests and then jump to the real instruction
10090 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10091 */
10092 .extern MterpCheckBefore
10093 EXPORT_PC
10094 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10095 adrl lr, artMterpAsmInstructionStart + (139 * 128) @ Addr of primary handler.
10096 mov r0, rSELF
10097 add r1, rFP, #OFF_FP_SHADOWFRAME
10098 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10099
10100/* ------------------------------ */
10101 .balign 128
10102.L_ALT_op_double_to_float: /* 0x8c */
10103/* File: arm/alt_stub.S */
10104/*
10105 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10106 * any interesting requests and then jump to the real instruction
10107 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10108 */
10109 .extern MterpCheckBefore
10110 EXPORT_PC
10111 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10112 adrl lr, artMterpAsmInstructionStart + (140 * 128) @ Addr of primary handler.
10113 mov r0, rSELF
10114 add r1, rFP, #OFF_FP_SHADOWFRAME
10115 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10116
10117/* ------------------------------ */
10118 .balign 128
10119.L_ALT_op_int_to_byte: /* 0x8d */
10120/* File: arm/alt_stub.S */
10121/*
10122 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10123 * any interesting requests and then jump to the real instruction
10124 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10125 */
10126 .extern MterpCheckBefore
10127 EXPORT_PC
10128 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10129 adrl lr, artMterpAsmInstructionStart + (141 * 128) @ Addr of primary handler.
10130 mov r0, rSELF
10131 add r1, rFP, #OFF_FP_SHADOWFRAME
10132 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10133
10134/* ------------------------------ */
10135 .balign 128
10136.L_ALT_op_int_to_char: /* 0x8e */
10137/* File: arm/alt_stub.S */
10138/*
10139 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10140 * any interesting requests and then jump to the real instruction
10141 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10142 */
10143 .extern MterpCheckBefore
10144 EXPORT_PC
10145 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10146 adrl lr, artMterpAsmInstructionStart + (142 * 128) @ Addr of primary handler.
10147 mov r0, rSELF
10148 add r1, rFP, #OFF_FP_SHADOWFRAME
10149 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10150
10151/* ------------------------------ */
10152 .balign 128
10153.L_ALT_op_int_to_short: /* 0x8f */
10154/* File: arm/alt_stub.S */
10155/*
10156 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10157 * any interesting requests and then jump to the real instruction
10158 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10159 */
10160 .extern MterpCheckBefore
10161 EXPORT_PC
10162 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10163 adrl lr, artMterpAsmInstructionStart + (143 * 128) @ Addr of primary handler.
10164 mov r0, rSELF
10165 add r1, rFP, #OFF_FP_SHADOWFRAME
10166 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10167
10168/* ------------------------------ */
10169 .balign 128
10170.L_ALT_op_add_int: /* 0x90 */
10171/* File: arm/alt_stub.S */
10172/*
10173 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10174 * any interesting requests and then jump to the real instruction
10175 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10176 */
10177 .extern MterpCheckBefore
10178 EXPORT_PC
10179 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10180 adrl lr, artMterpAsmInstructionStart + (144 * 128) @ Addr of primary handler.
10181 mov r0, rSELF
10182 add r1, rFP, #OFF_FP_SHADOWFRAME
10183 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10184
10185/* ------------------------------ */
10186 .balign 128
10187.L_ALT_op_sub_int: /* 0x91 */
10188/* File: arm/alt_stub.S */
10189/*
10190 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10191 * any interesting requests and then jump to the real instruction
10192 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10193 */
10194 .extern MterpCheckBefore
10195 EXPORT_PC
10196 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10197 adrl lr, artMterpAsmInstructionStart + (145 * 128) @ Addr of primary handler.
10198 mov r0, rSELF
10199 add r1, rFP, #OFF_FP_SHADOWFRAME
10200 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10201
10202/* ------------------------------ */
10203 .balign 128
10204.L_ALT_op_mul_int: /* 0x92 */
10205/* File: arm/alt_stub.S */
10206/*
10207 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10208 * any interesting requests and then jump to the real instruction
10209 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10210 */
10211 .extern MterpCheckBefore
10212 EXPORT_PC
10213 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10214 adrl lr, artMterpAsmInstructionStart + (146 * 128) @ Addr of primary handler.
10215 mov r0, rSELF
10216 add r1, rFP, #OFF_FP_SHADOWFRAME
10217 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10218
10219/* ------------------------------ */
10220 .balign 128
10221.L_ALT_op_div_int: /* 0x93 */
10222/* File: arm/alt_stub.S */
10223/*
10224 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10225 * any interesting requests and then jump to the real instruction
10226 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10227 */
10228 .extern MterpCheckBefore
10229 EXPORT_PC
10230 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10231 adrl lr, artMterpAsmInstructionStart + (147 * 128) @ Addr of primary handler.
10232 mov r0, rSELF
10233 add r1, rFP, #OFF_FP_SHADOWFRAME
10234 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10235
10236/* ------------------------------ */
10237 .balign 128
10238.L_ALT_op_rem_int: /* 0x94 */
10239/* File: arm/alt_stub.S */
10240/*
10241 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10242 * any interesting requests and then jump to the real instruction
10243 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10244 */
10245 .extern MterpCheckBefore
10246 EXPORT_PC
10247 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10248 adrl lr, artMterpAsmInstructionStart + (148 * 128) @ Addr of primary handler.
10249 mov r0, rSELF
10250 add r1, rFP, #OFF_FP_SHADOWFRAME
10251 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10252
10253/* ------------------------------ */
10254 .balign 128
10255.L_ALT_op_and_int: /* 0x95 */
10256/* File: arm/alt_stub.S */
10257/*
10258 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10259 * any interesting requests and then jump to the real instruction
10260 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10261 */
10262 .extern MterpCheckBefore
10263 EXPORT_PC
10264 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10265 adrl lr, artMterpAsmInstructionStart + (149 * 128) @ Addr of primary handler.
10266 mov r0, rSELF
10267 add r1, rFP, #OFF_FP_SHADOWFRAME
10268 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10269
10270/* ------------------------------ */
10271 .balign 128
10272.L_ALT_op_or_int: /* 0x96 */
10273/* File: arm/alt_stub.S */
10274/*
10275 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10276 * any interesting requests and then jump to the real instruction
10277 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10278 */
10279 .extern MterpCheckBefore
10280 EXPORT_PC
10281 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10282 adrl lr, artMterpAsmInstructionStart + (150 * 128) @ Addr of primary handler.
10283 mov r0, rSELF
10284 add r1, rFP, #OFF_FP_SHADOWFRAME
10285 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10286
10287/* ------------------------------ */
10288 .balign 128
10289.L_ALT_op_xor_int: /* 0x97 */
10290/* File: arm/alt_stub.S */
10291/*
10292 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10293 * any interesting requests and then jump to the real instruction
10294 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10295 */
10296 .extern MterpCheckBefore
10297 EXPORT_PC
10298 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10299 adrl lr, artMterpAsmInstructionStart + (151 * 128) @ Addr of primary handler.
10300 mov r0, rSELF
10301 add r1, rFP, #OFF_FP_SHADOWFRAME
10302 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10303
10304/* ------------------------------ */
10305 .balign 128
10306.L_ALT_op_shl_int: /* 0x98 */
10307/* File: arm/alt_stub.S */
10308/*
10309 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10310 * any interesting requests and then jump to the real instruction
10311 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10312 */
10313 .extern MterpCheckBefore
10314 EXPORT_PC
10315 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10316 adrl lr, artMterpAsmInstructionStart + (152 * 128) @ Addr of primary handler.
10317 mov r0, rSELF
10318 add r1, rFP, #OFF_FP_SHADOWFRAME
10319 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10320
10321/* ------------------------------ */
10322 .balign 128
10323.L_ALT_op_shr_int: /* 0x99 */
10324/* File: arm/alt_stub.S */
10325/*
10326 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10327 * any interesting requests and then jump to the real instruction
10328 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10329 */
10330 .extern MterpCheckBefore
10331 EXPORT_PC
10332 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10333 adrl lr, artMterpAsmInstructionStart + (153 * 128) @ Addr of primary handler.
10334 mov r0, rSELF
10335 add r1, rFP, #OFF_FP_SHADOWFRAME
10336 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10337
10338/* ------------------------------ */
10339 .balign 128
10340.L_ALT_op_ushr_int: /* 0x9a */
10341/* File: arm/alt_stub.S */
10342/*
10343 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10344 * any interesting requests and then jump to the real instruction
10345 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10346 */
10347 .extern MterpCheckBefore
10348 EXPORT_PC
10349 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10350 adrl lr, artMterpAsmInstructionStart + (154 * 128) @ Addr of primary handler.
10351 mov r0, rSELF
10352 add r1, rFP, #OFF_FP_SHADOWFRAME
10353 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10354
10355/* ------------------------------ */
10356 .balign 128
10357.L_ALT_op_add_long: /* 0x9b */
10358/* File: arm/alt_stub.S */
10359/*
10360 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10361 * any interesting requests and then jump to the real instruction
10362 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10363 */
10364 .extern MterpCheckBefore
10365 EXPORT_PC
10366 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10367 adrl lr, artMterpAsmInstructionStart + (155 * 128) @ Addr of primary handler.
10368 mov r0, rSELF
10369 add r1, rFP, #OFF_FP_SHADOWFRAME
10370 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10371
10372/* ------------------------------ */
10373 .balign 128
10374.L_ALT_op_sub_long: /* 0x9c */
10375/* File: arm/alt_stub.S */
10376/*
10377 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10378 * any interesting requests and then jump to the real instruction
10379 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10380 */
10381 .extern MterpCheckBefore
10382 EXPORT_PC
10383 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10384 adrl lr, artMterpAsmInstructionStart + (156 * 128) @ Addr of primary handler.
10385 mov r0, rSELF
10386 add r1, rFP, #OFF_FP_SHADOWFRAME
10387 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10388
10389/* ------------------------------ */
10390 .balign 128
10391.L_ALT_op_mul_long: /* 0x9d */
10392/* File: arm/alt_stub.S */
10393/*
10394 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10395 * any interesting requests and then jump to the real instruction
10396 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10397 */
10398 .extern MterpCheckBefore
10399 EXPORT_PC
10400 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10401 adrl lr, artMterpAsmInstructionStart + (157 * 128) @ Addr of primary handler.
10402 mov r0, rSELF
10403 add r1, rFP, #OFF_FP_SHADOWFRAME
10404 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10405
10406/* ------------------------------ */
10407 .balign 128
10408.L_ALT_op_div_long: /* 0x9e */
10409/* File: arm/alt_stub.S */
10410/*
10411 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10412 * any interesting requests and then jump to the real instruction
10413 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10414 */
10415 .extern MterpCheckBefore
10416 EXPORT_PC
10417 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10418 adrl lr, artMterpAsmInstructionStart + (158 * 128) @ Addr of primary handler.
10419 mov r0, rSELF
10420 add r1, rFP, #OFF_FP_SHADOWFRAME
10421 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10422
10423/* ------------------------------ */
10424 .balign 128
10425.L_ALT_op_rem_long: /* 0x9f */
10426/* File: arm/alt_stub.S */
10427/*
10428 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10429 * any interesting requests and then jump to the real instruction
10430 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10431 */
10432 .extern MterpCheckBefore
10433 EXPORT_PC
10434 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10435 adrl lr, artMterpAsmInstructionStart + (159 * 128) @ Addr of primary handler.
10436 mov r0, rSELF
10437 add r1, rFP, #OFF_FP_SHADOWFRAME
10438 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10439
10440/* ------------------------------ */
10441 .balign 128
10442.L_ALT_op_and_long: /* 0xa0 */
10443/* File: arm/alt_stub.S */
10444/*
10445 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10446 * any interesting requests and then jump to the real instruction
10447 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10448 */
10449 .extern MterpCheckBefore
10450 EXPORT_PC
10451 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10452 adrl lr, artMterpAsmInstructionStart + (160 * 128) @ Addr of primary handler.
10453 mov r0, rSELF
10454 add r1, rFP, #OFF_FP_SHADOWFRAME
10455 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10456
10457/* ------------------------------ */
10458 .balign 128
10459.L_ALT_op_or_long: /* 0xa1 */
10460/* File: arm/alt_stub.S */
10461/*
10462 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10463 * any interesting requests and then jump to the real instruction
10464 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10465 */
10466 .extern MterpCheckBefore
10467 EXPORT_PC
10468 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10469 adrl lr, artMterpAsmInstructionStart + (161 * 128) @ Addr of primary handler.
10470 mov r0, rSELF
10471 add r1, rFP, #OFF_FP_SHADOWFRAME
10472 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10473
10474/* ------------------------------ */
10475 .balign 128
10476.L_ALT_op_xor_long: /* 0xa2 */
10477/* File: arm/alt_stub.S */
10478/*
10479 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10480 * any interesting requests and then jump to the real instruction
10481 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10482 */
10483 .extern MterpCheckBefore
10484 EXPORT_PC
10485 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10486 adrl lr, artMterpAsmInstructionStart + (162 * 128) @ Addr of primary handler.
10487 mov r0, rSELF
10488 add r1, rFP, #OFF_FP_SHADOWFRAME
10489 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10490
10491/* ------------------------------ */
10492 .balign 128
10493.L_ALT_op_shl_long: /* 0xa3 */
10494/* File: arm/alt_stub.S */
10495/*
10496 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10497 * any interesting requests and then jump to the real instruction
10498 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10499 */
10500 .extern MterpCheckBefore
10501 EXPORT_PC
10502 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10503 adrl lr, artMterpAsmInstructionStart + (163 * 128) @ Addr of primary handler.
10504 mov r0, rSELF
10505 add r1, rFP, #OFF_FP_SHADOWFRAME
10506 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10507
10508/* ------------------------------ */
10509 .balign 128
10510.L_ALT_op_shr_long: /* 0xa4 */
10511/* File: arm/alt_stub.S */
10512/*
10513 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10514 * any interesting requests and then jump to the real instruction
10515 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10516 */
10517 .extern MterpCheckBefore
10518 EXPORT_PC
10519 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10520 adrl lr, artMterpAsmInstructionStart + (164 * 128) @ Addr of primary handler.
10521 mov r0, rSELF
10522 add r1, rFP, #OFF_FP_SHADOWFRAME
10523 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10524
10525/* ------------------------------ */
10526 .balign 128
10527.L_ALT_op_ushr_long: /* 0xa5 */
10528/* File: arm/alt_stub.S */
10529/*
10530 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10531 * any interesting requests and then jump to the real instruction
10532 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10533 */
10534 .extern MterpCheckBefore
10535 EXPORT_PC
10536 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10537 adrl lr, artMterpAsmInstructionStart + (165 * 128) @ Addr of primary handler.
10538 mov r0, rSELF
10539 add r1, rFP, #OFF_FP_SHADOWFRAME
10540 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10541
10542/* ------------------------------ */
10543 .balign 128
10544.L_ALT_op_add_float: /* 0xa6 */
10545/* File: arm/alt_stub.S */
10546/*
10547 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10548 * any interesting requests and then jump to the real instruction
10549 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10550 */
10551 .extern MterpCheckBefore
10552 EXPORT_PC
10553 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10554 adrl lr, artMterpAsmInstructionStart + (166 * 128) @ Addr of primary handler.
10555 mov r0, rSELF
10556 add r1, rFP, #OFF_FP_SHADOWFRAME
10557 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10558
10559/* ------------------------------ */
10560 .balign 128
10561.L_ALT_op_sub_float: /* 0xa7 */
10562/* File: arm/alt_stub.S */
10563/*
10564 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10565 * any interesting requests and then jump to the real instruction
10566 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10567 */
10568 .extern MterpCheckBefore
10569 EXPORT_PC
10570 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10571 adrl lr, artMterpAsmInstructionStart + (167 * 128) @ Addr of primary handler.
10572 mov r0, rSELF
10573 add r1, rFP, #OFF_FP_SHADOWFRAME
10574 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10575
10576/* ------------------------------ */
10577 .balign 128
10578.L_ALT_op_mul_float: /* 0xa8 */
10579/* File: arm/alt_stub.S */
10580/*
10581 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10582 * any interesting requests and then jump to the real instruction
10583 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10584 */
10585 .extern MterpCheckBefore
10586 EXPORT_PC
10587 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10588 adrl lr, artMterpAsmInstructionStart + (168 * 128) @ Addr of primary handler.
10589 mov r0, rSELF
10590 add r1, rFP, #OFF_FP_SHADOWFRAME
10591 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10592
10593/* ------------------------------ */
10594 .balign 128
10595.L_ALT_op_div_float: /* 0xa9 */
10596/* File: arm/alt_stub.S */
10597/*
10598 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10599 * any interesting requests and then jump to the real instruction
10600 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10601 */
10602 .extern MterpCheckBefore
10603 EXPORT_PC
10604 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10605 adrl lr, artMterpAsmInstructionStart + (169 * 128) @ Addr of primary handler.
10606 mov r0, rSELF
10607 add r1, rFP, #OFF_FP_SHADOWFRAME
10608 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10609
10610/* ------------------------------ */
10611 .balign 128
10612.L_ALT_op_rem_float: /* 0xaa */
10613/* File: arm/alt_stub.S */
10614/*
10615 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10616 * any interesting requests and then jump to the real instruction
10617 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10618 */
10619 .extern MterpCheckBefore
10620 EXPORT_PC
10621 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10622 adrl lr, artMterpAsmInstructionStart + (170 * 128) @ Addr of primary handler.
10623 mov r0, rSELF
10624 add r1, rFP, #OFF_FP_SHADOWFRAME
10625 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10626
10627/* ------------------------------ */
10628 .balign 128
10629.L_ALT_op_add_double: /* 0xab */
10630/* File: arm/alt_stub.S */
10631/*
10632 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10633 * any interesting requests and then jump to the real instruction
10634 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10635 */
10636 .extern MterpCheckBefore
10637 EXPORT_PC
10638 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10639 adrl lr, artMterpAsmInstructionStart + (171 * 128) @ Addr of primary handler.
10640 mov r0, rSELF
10641 add r1, rFP, #OFF_FP_SHADOWFRAME
10642 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10643
10644/* ------------------------------ */
10645 .balign 128
10646.L_ALT_op_sub_double: /* 0xac */
10647/* File: arm/alt_stub.S */
10648/*
10649 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10650 * any interesting requests and then jump to the real instruction
10651 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10652 */
10653 .extern MterpCheckBefore
10654 EXPORT_PC
10655 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10656 adrl lr, artMterpAsmInstructionStart + (172 * 128) @ Addr of primary handler.
10657 mov r0, rSELF
10658 add r1, rFP, #OFF_FP_SHADOWFRAME
10659 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10660
10661/* ------------------------------ */
10662 .balign 128
10663.L_ALT_op_mul_double: /* 0xad */
10664/* File: arm/alt_stub.S */
10665/*
10666 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10667 * any interesting requests and then jump to the real instruction
10668 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10669 */
10670 .extern MterpCheckBefore
10671 EXPORT_PC
10672 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10673 adrl lr, artMterpAsmInstructionStart + (173 * 128) @ Addr of primary handler.
10674 mov r0, rSELF
10675 add r1, rFP, #OFF_FP_SHADOWFRAME
10676 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10677
10678/* ------------------------------ */
10679 .balign 128
10680.L_ALT_op_div_double: /* 0xae */
10681/* File: arm/alt_stub.S */
10682/*
10683 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10684 * any interesting requests and then jump to the real instruction
10685 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10686 */
10687 .extern MterpCheckBefore
10688 EXPORT_PC
10689 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10690 adrl lr, artMterpAsmInstructionStart + (174 * 128) @ Addr of primary handler.
10691 mov r0, rSELF
10692 add r1, rFP, #OFF_FP_SHADOWFRAME
10693 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10694
10695/* ------------------------------ */
10696 .balign 128
10697.L_ALT_op_rem_double: /* 0xaf */
10698/* File: arm/alt_stub.S */
10699/*
10700 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10701 * any interesting requests and then jump to the real instruction
10702 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10703 */
10704 .extern MterpCheckBefore
10705 EXPORT_PC
10706 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10707 adrl lr, artMterpAsmInstructionStart + (175 * 128) @ Addr of primary handler.
10708 mov r0, rSELF
10709 add r1, rFP, #OFF_FP_SHADOWFRAME
10710 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10711
10712/* ------------------------------ */
10713 .balign 128
10714.L_ALT_op_add_int_2addr: /* 0xb0 */
10715/* File: arm/alt_stub.S */
10716/*
10717 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10718 * any interesting requests and then jump to the real instruction
10719 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10720 */
10721 .extern MterpCheckBefore
10722 EXPORT_PC
10723 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10724 adrl lr, artMterpAsmInstructionStart + (176 * 128) @ Addr of primary handler.
10725 mov r0, rSELF
10726 add r1, rFP, #OFF_FP_SHADOWFRAME
10727 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10728
10729/* ------------------------------ */
10730 .balign 128
10731.L_ALT_op_sub_int_2addr: /* 0xb1 */
10732/* File: arm/alt_stub.S */
10733/*
10734 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10735 * any interesting requests and then jump to the real instruction
10736 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10737 */
10738 .extern MterpCheckBefore
10739 EXPORT_PC
10740 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10741 adrl lr, artMterpAsmInstructionStart + (177 * 128) @ Addr of primary handler.
10742 mov r0, rSELF
10743 add r1, rFP, #OFF_FP_SHADOWFRAME
10744 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10745
10746/* ------------------------------ */
10747 .balign 128
10748.L_ALT_op_mul_int_2addr: /* 0xb2 */
10749/* File: arm/alt_stub.S */
10750/*
10751 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10752 * any interesting requests and then jump to the real instruction
10753 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10754 */
10755 .extern MterpCheckBefore
10756 EXPORT_PC
10757 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10758 adrl lr, artMterpAsmInstructionStart + (178 * 128) @ Addr of primary handler.
10759 mov r0, rSELF
10760 add r1, rFP, #OFF_FP_SHADOWFRAME
10761 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10762
10763/* ------------------------------ */
10764 .balign 128
10765.L_ALT_op_div_int_2addr: /* 0xb3 */
10766/* File: arm/alt_stub.S */
10767/*
10768 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10769 * any interesting requests and then jump to the real instruction
10770 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10771 */
10772 .extern MterpCheckBefore
10773 EXPORT_PC
10774 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10775 adrl lr, artMterpAsmInstructionStart + (179 * 128) @ Addr of primary handler.
10776 mov r0, rSELF
10777 add r1, rFP, #OFF_FP_SHADOWFRAME
10778 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10779
10780/* ------------------------------ */
10781 .balign 128
10782.L_ALT_op_rem_int_2addr: /* 0xb4 */
10783/* File: arm/alt_stub.S */
10784/*
10785 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10786 * any interesting requests and then jump to the real instruction
10787 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10788 */
10789 .extern MterpCheckBefore
10790 EXPORT_PC
10791 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10792 adrl lr, artMterpAsmInstructionStart + (180 * 128) @ Addr of primary handler.
10793 mov r0, rSELF
10794 add r1, rFP, #OFF_FP_SHADOWFRAME
10795 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10796
10797/* ------------------------------ */
10798 .balign 128
10799.L_ALT_op_and_int_2addr: /* 0xb5 */
10800/* File: arm/alt_stub.S */
10801/*
10802 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10803 * any interesting requests and then jump to the real instruction
10804 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10805 */
10806 .extern MterpCheckBefore
10807 EXPORT_PC
10808 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10809 adrl lr, artMterpAsmInstructionStart + (181 * 128) @ Addr of primary handler.
10810 mov r0, rSELF
10811 add r1, rFP, #OFF_FP_SHADOWFRAME
10812 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10813
10814/* ------------------------------ */
10815 .balign 128
10816.L_ALT_op_or_int_2addr: /* 0xb6 */
10817/* File: arm/alt_stub.S */
10818/*
10819 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10820 * any interesting requests and then jump to the real instruction
10821 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10822 */
10823 .extern MterpCheckBefore
10824 EXPORT_PC
10825 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10826 adrl lr, artMterpAsmInstructionStart + (182 * 128) @ Addr of primary handler.
10827 mov r0, rSELF
10828 add r1, rFP, #OFF_FP_SHADOWFRAME
10829 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10830
10831/* ------------------------------ */
10832 .balign 128
10833.L_ALT_op_xor_int_2addr: /* 0xb7 */
10834/* File: arm/alt_stub.S */
10835/*
10836 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10837 * any interesting requests and then jump to the real instruction
10838 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10839 */
10840 .extern MterpCheckBefore
10841 EXPORT_PC
10842 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10843 adrl lr, artMterpAsmInstructionStart + (183 * 128) @ Addr of primary handler.
10844 mov r0, rSELF
10845 add r1, rFP, #OFF_FP_SHADOWFRAME
10846 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10847
10848/* ------------------------------ */
10849 .balign 128
10850.L_ALT_op_shl_int_2addr: /* 0xb8 */
10851/* File: arm/alt_stub.S */
10852/*
10853 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10854 * any interesting requests and then jump to the real instruction
10855 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10856 */
10857 .extern MterpCheckBefore
10858 EXPORT_PC
10859 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10860 adrl lr, artMterpAsmInstructionStart + (184 * 128) @ Addr of primary handler.
10861 mov r0, rSELF
10862 add r1, rFP, #OFF_FP_SHADOWFRAME
10863 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10864
10865/* ------------------------------ */
10866 .balign 128
10867.L_ALT_op_shr_int_2addr: /* 0xb9 */
10868/* File: arm/alt_stub.S */
10869/*
10870 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10871 * any interesting requests and then jump to the real instruction
10872 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10873 */
10874 .extern MterpCheckBefore
10875 EXPORT_PC
10876 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10877 adrl lr, artMterpAsmInstructionStart + (185 * 128) @ Addr of primary handler.
10878 mov r0, rSELF
10879 add r1, rFP, #OFF_FP_SHADOWFRAME
10880 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10881
10882/* ------------------------------ */
10883 .balign 128
10884.L_ALT_op_ushr_int_2addr: /* 0xba */
10885/* File: arm/alt_stub.S */
10886/*
10887 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10888 * any interesting requests and then jump to the real instruction
10889 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10890 */
10891 .extern MterpCheckBefore
10892 EXPORT_PC
10893 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10894 adrl lr, artMterpAsmInstructionStart + (186 * 128) @ Addr of primary handler.
10895 mov r0, rSELF
10896 add r1, rFP, #OFF_FP_SHADOWFRAME
10897 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10898
10899/* ------------------------------ */
10900 .balign 128
10901.L_ALT_op_add_long_2addr: /* 0xbb */
10902/* File: arm/alt_stub.S */
10903/*
10904 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10905 * any interesting requests and then jump to the real instruction
10906 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10907 */
10908 .extern MterpCheckBefore
10909 EXPORT_PC
10910 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10911 adrl lr, artMterpAsmInstructionStart + (187 * 128) @ Addr of primary handler.
10912 mov r0, rSELF
10913 add r1, rFP, #OFF_FP_SHADOWFRAME
10914 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10915
10916/* ------------------------------ */
10917 .balign 128
10918.L_ALT_op_sub_long_2addr: /* 0xbc */
10919/* File: arm/alt_stub.S */
10920/*
10921 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10922 * any interesting requests and then jump to the real instruction
10923 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10924 */
10925 .extern MterpCheckBefore
10926 EXPORT_PC
10927 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10928 adrl lr, artMterpAsmInstructionStart + (188 * 128) @ Addr of primary handler.
10929 mov r0, rSELF
10930 add r1, rFP, #OFF_FP_SHADOWFRAME
10931 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10932
10933/* ------------------------------ */
10934 .balign 128
10935.L_ALT_op_mul_long_2addr: /* 0xbd */
10936/* File: arm/alt_stub.S */
10937/*
10938 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10939 * any interesting requests and then jump to the real instruction
10940 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10941 */
10942 .extern MterpCheckBefore
10943 EXPORT_PC
10944 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10945 adrl lr, artMterpAsmInstructionStart + (189 * 128) @ Addr of primary handler.
10946 mov r0, rSELF
10947 add r1, rFP, #OFF_FP_SHADOWFRAME
10948 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10949
10950/* ------------------------------ */
10951 .balign 128
10952.L_ALT_op_div_long_2addr: /* 0xbe */
10953/* File: arm/alt_stub.S */
10954/*
10955 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10956 * any interesting requests and then jump to the real instruction
10957 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10958 */
10959 .extern MterpCheckBefore
10960 EXPORT_PC
10961 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10962 adrl lr, artMterpAsmInstructionStart + (190 * 128) @ Addr of primary handler.
10963 mov r0, rSELF
10964 add r1, rFP, #OFF_FP_SHADOWFRAME
10965 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10966
10967/* ------------------------------ */
10968 .balign 128
10969.L_ALT_op_rem_long_2addr: /* 0xbf */
10970/* File: arm/alt_stub.S */
10971/*
10972 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10973 * any interesting requests and then jump to the real instruction
10974 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10975 */
10976 .extern MterpCheckBefore
10977 EXPORT_PC
10978 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10979 adrl lr, artMterpAsmInstructionStart + (191 * 128) @ Addr of primary handler.
10980 mov r0, rSELF
10981 add r1, rFP, #OFF_FP_SHADOWFRAME
10982 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
10983
10984/* ------------------------------ */
10985 .balign 128
10986.L_ALT_op_and_long_2addr: /* 0xc0 */
10987/* File: arm/alt_stub.S */
10988/*
10989 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
10990 * any interesting requests and then jump to the real instruction
10991 * handler. Note that the call to MterpCheckBefore is done as a tail call.
10992 */
10993 .extern MterpCheckBefore
10994 EXPORT_PC
10995 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
10996 adrl lr, artMterpAsmInstructionStart + (192 * 128) @ Addr of primary handler.
10997 mov r0, rSELF
10998 add r1, rFP, #OFF_FP_SHADOWFRAME
10999 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11000
11001/* ------------------------------ */
11002 .balign 128
11003.L_ALT_op_or_long_2addr: /* 0xc1 */
11004/* File: arm/alt_stub.S */
11005/*
11006 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11007 * any interesting requests and then jump to the real instruction
11008 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11009 */
11010 .extern MterpCheckBefore
11011 EXPORT_PC
11012 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11013 adrl lr, artMterpAsmInstructionStart + (193 * 128) @ Addr of primary handler.
11014 mov r0, rSELF
11015 add r1, rFP, #OFF_FP_SHADOWFRAME
11016 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11017
11018/* ------------------------------ */
11019 .balign 128
11020.L_ALT_op_xor_long_2addr: /* 0xc2 */
11021/* File: arm/alt_stub.S */
11022/*
11023 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11024 * any interesting requests and then jump to the real instruction
11025 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11026 */
11027 .extern MterpCheckBefore
11028 EXPORT_PC
11029 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11030 adrl lr, artMterpAsmInstructionStart + (194 * 128) @ Addr of primary handler.
11031 mov r0, rSELF
11032 add r1, rFP, #OFF_FP_SHADOWFRAME
11033 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11034
11035/* ------------------------------ */
11036 .balign 128
11037.L_ALT_op_shl_long_2addr: /* 0xc3 */
11038/* File: arm/alt_stub.S */
11039/*
11040 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11041 * any interesting requests and then jump to the real instruction
11042 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11043 */
11044 .extern MterpCheckBefore
11045 EXPORT_PC
11046 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11047 adrl lr, artMterpAsmInstructionStart + (195 * 128) @ Addr of primary handler.
11048 mov r0, rSELF
11049 add r1, rFP, #OFF_FP_SHADOWFRAME
11050 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11051
11052/* ------------------------------ */
11053 .balign 128
11054.L_ALT_op_shr_long_2addr: /* 0xc4 */
11055/* File: arm/alt_stub.S */
11056/*
11057 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11058 * any interesting requests and then jump to the real instruction
11059 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11060 */
11061 .extern MterpCheckBefore
11062 EXPORT_PC
11063 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11064 adrl lr, artMterpAsmInstructionStart + (196 * 128) @ Addr of primary handler.
11065 mov r0, rSELF
11066 add r1, rFP, #OFF_FP_SHADOWFRAME
11067 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11068
11069/* ------------------------------ */
11070 .balign 128
11071.L_ALT_op_ushr_long_2addr: /* 0xc5 */
11072/* File: arm/alt_stub.S */
11073/*
11074 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11075 * any interesting requests and then jump to the real instruction
11076 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11077 */
11078 .extern MterpCheckBefore
11079 EXPORT_PC
11080 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11081 adrl lr, artMterpAsmInstructionStart + (197 * 128) @ Addr of primary handler.
11082 mov r0, rSELF
11083 add r1, rFP, #OFF_FP_SHADOWFRAME
11084 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11085
11086/* ------------------------------ */
11087 .balign 128
11088.L_ALT_op_add_float_2addr: /* 0xc6 */
11089/* File: arm/alt_stub.S */
11090/*
11091 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11092 * any interesting requests and then jump to the real instruction
11093 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11094 */
11095 .extern MterpCheckBefore
11096 EXPORT_PC
11097 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11098 adrl lr, artMterpAsmInstructionStart + (198 * 128) @ Addr of primary handler.
11099 mov r0, rSELF
11100 add r1, rFP, #OFF_FP_SHADOWFRAME
11101 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11102
11103/* ------------------------------ */
11104 .balign 128
11105.L_ALT_op_sub_float_2addr: /* 0xc7 */
11106/* File: arm/alt_stub.S */
11107/*
11108 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11109 * any interesting requests and then jump to the real instruction
11110 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11111 */
11112 .extern MterpCheckBefore
11113 EXPORT_PC
11114 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11115 adrl lr, artMterpAsmInstructionStart + (199 * 128) @ Addr of primary handler.
11116 mov r0, rSELF
11117 add r1, rFP, #OFF_FP_SHADOWFRAME
11118 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11119
11120/* ------------------------------ */
11121 .balign 128
11122.L_ALT_op_mul_float_2addr: /* 0xc8 */
11123/* File: arm/alt_stub.S */
11124/*
11125 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11126 * any interesting requests and then jump to the real instruction
11127 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11128 */
11129 .extern MterpCheckBefore
11130 EXPORT_PC
11131 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11132 adrl lr, artMterpAsmInstructionStart + (200 * 128) @ Addr of primary handler.
11133 mov r0, rSELF
11134 add r1, rFP, #OFF_FP_SHADOWFRAME
11135 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11136
11137/* ------------------------------ */
11138 .balign 128
11139.L_ALT_op_div_float_2addr: /* 0xc9 */
11140/* File: arm/alt_stub.S */
11141/*
11142 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11143 * any interesting requests and then jump to the real instruction
11144 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11145 */
11146 .extern MterpCheckBefore
11147 EXPORT_PC
11148 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11149 adrl lr, artMterpAsmInstructionStart + (201 * 128) @ Addr of primary handler.
11150 mov r0, rSELF
11151 add r1, rFP, #OFF_FP_SHADOWFRAME
11152 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11153
11154/* ------------------------------ */
11155 .balign 128
11156.L_ALT_op_rem_float_2addr: /* 0xca */
11157/* File: arm/alt_stub.S */
11158/*
11159 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11160 * any interesting requests and then jump to the real instruction
11161 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11162 */
11163 .extern MterpCheckBefore
11164 EXPORT_PC
11165 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11166 adrl lr, artMterpAsmInstructionStart + (202 * 128) @ Addr of primary handler.
11167 mov r0, rSELF
11168 add r1, rFP, #OFF_FP_SHADOWFRAME
11169 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11170
11171/* ------------------------------ */
11172 .balign 128
11173.L_ALT_op_add_double_2addr: /* 0xcb */
11174/* File: arm/alt_stub.S */
11175/*
11176 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11177 * any interesting requests and then jump to the real instruction
11178 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11179 */
11180 .extern MterpCheckBefore
11181 EXPORT_PC
11182 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11183 adrl lr, artMterpAsmInstructionStart + (203 * 128) @ Addr of primary handler.
11184 mov r0, rSELF
11185 add r1, rFP, #OFF_FP_SHADOWFRAME
11186 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11187
11188/* ------------------------------ */
11189 .balign 128
11190.L_ALT_op_sub_double_2addr: /* 0xcc */
11191/* File: arm/alt_stub.S */
11192/*
11193 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11194 * any interesting requests and then jump to the real instruction
11195 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11196 */
11197 .extern MterpCheckBefore
11198 EXPORT_PC
11199 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11200 adrl lr, artMterpAsmInstructionStart + (204 * 128) @ Addr of primary handler.
11201 mov r0, rSELF
11202 add r1, rFP, #OFF_FP_SHADOWFRAME
11203 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11204
11205/* ------------------------------ */
11206 .balign 128
11207.L_ALT_op_mul_double_2addr: /* 0xcd */
11208/* File: arm/alt_stub.S */
11209/*
11210 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11211 * any interesting requests and then jump to the real instruction
11212 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11213 */
11214 .extern MterpCheckBefore
11215 EXPORT_PC
11216 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11217 adrl lr, artMterpAsmInstructionStart + (205 * 128) @ Addr of primary handler.
11218 mov r0, rSELF
11219 add r1, rFP, #OFF_FP_SHADOWFRAME
11220 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11221
11222/* ------------------------------ */
11223 .balign 128
11224.L_ALT_op_div_double_2addr: /* 0xce */
11225/* File: arm/alt_stub.S */
11226/*
11227 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11228 * any interesting requests and then jump to the real instruction
11229 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11230 */
11231 .extern MterpCheckBefore
11232 EXPORT_PC
11233 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11234 adrl lr, artMterpAsmInstructionStart + (206 * 128) @ Addr of primary handler.
11235 mov r0, rSELF
11236 add r1, rFP, #OFF_FP_SHADOWFRAME
11237 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11238
11239/* ------------------------------ */
11240 .balign 128
11241.L_ALT_op_rem_double_2addr: /* 0xcf */
11242/* File: arm/alt_stub.S */
11243/*
11244 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11245 * any interesting requests and then jump to the real instruction
11246 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11247 */
11248 .extern MterpCheckBefore
11249 EXPORT_PC
11250 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11251 adrl lr, artMterpAsmInstructionStart + (207 * 128) @ Addr of primary handler.
11252 mov r0, rSELF
11253 add r1, rFP, #OFF_FP_SHADOWFRAME
11254 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11255
11256/* ------------------------------ */
11257 .balign 128
11258.L_ALT_op_add_int_lit16: /* 0xd0 */
11259/* File: arm/alt_stub.S */
11260/*
11261 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11262 * any interesting requests and then jump to the real instruction
11263 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11264 */
11265 .extern MterpCheckBefore
11266 EXPORT_PC
11267 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11268 adrl lr, artMterpAsmInstructionStart + (208 * 128) @ Addr of primary handler.
11269 mov r0, rSELF
11270 add r1, rFP, #OFF_FP_SHADOWFRAME
11271 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11272
11273/* ------------------------------ */
11274 .balign 128
11275.L_ALT_op_rsub_int: /* 0xd1 */
11276/* File: arm/alt_stub.S */
11277/*
11278 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11279 * any interesting requests and then jump to the real instruction
11280 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11281 */
11282 .extern MterpCheckBefore
11283 EXPORT_PC
11284 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11285 adrl lr, artMterpAsmInstructionStart + (209 * 128) @ Addr of primary handler.
11286 mov r0, rSELF
11287 add r1, rFP, #OFF_FP_SHADOWFRAME
11288 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11289
11290/* ------------------------------ */
11291 .balign 128
11292.L_ALT_op_mul_int_lit16: /* 0xd2 */
11293/* File: arm/alt_stub.S */
11294/*
11295 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11296 * any interesting requests and then jump to the real instruction
11297 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11298 */
11299 .extern MterpCheckBefore
11300 EXPORT_PC
11301 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11302 adrl lr, artMterpAsmInstructionStart + (210 * 128) @ Addr of primary handler.
11303 mov r0, rSELF
11304 add r1, rFP, #OFF_FP_SHADOWFRAME
11305 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11306
11307/* ------------------------------ */
11308 .balign 128
11309.L_ALT_op_div_int_lit16: /* 0xd3 */
11310/* File: arm/alt_stub.S */
11311/*
11312 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11313 * any interesting requests and then jump to the real instruction
11314 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11315 */
11316 .extern MterpCheckBefore
11317 EXPORT_PC
11318 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11319 adrl lr, artMterpAsmInstructionStart + (211 * 128) @ Addr of primary handler.
11320 mov r0, rSELF
11321 add r1, rFP, #OFF_FP_SHADOWFRAME
11322 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11323
11324/* ------------------------------ */
11325 .balign 128
11326.L_ALT_op_rem_int_lit16: /* 0xd4 */
11327/* File: arm/alt_stub.S */
11328/*
11329 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11330 * any interesting requests and then jump to the real instruction
11331 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11332 */
11333 .extern MterpCheckBefore
11334 EXPORT_PC
11335 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11336 adrl lr, artMterpAsmInstructionStart + (212 * 128) @ Addr of primary handler.
11337 mov r0, rSELF
11338 add r1, rFP, #OFF_FP_SHADOWFRAME
11339 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11340
11341/* ------------------------------ */
11342 .balign 128
11343.L_ALT_op_and_int_lit16: /* 0xd5 */
11344/* File: arm/alt_stub.S */
11345/*
11346 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11347 * any interesting requests and then jump to the real instruction
11348 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11349 */
11350 .extern MterpCheckBefore
11351 EXPORT_PC
11352 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11353 adrl lr, artMterpAsmInstructionStart + (213 * 128) @ Addr of primary handler.
11354 mov r0, rSELF
11355 add r1, rFP, #OFF_FP_SHADOWFRAME
11356 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11357
11358/* ------------------------------ */
11359 .balign 128
11360.L_ALT_op_or_int_lit16: /* 0xd6 */
11361/* File: arm/alt_stub.S */
11362/*
11363 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11364 * any interesting requests and then jump to the real instruction
11365 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11366 */
11367 .extern MterpCheckBefore
11368 EXPORT_PC
11369 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11370 adrl lr, artMterpAsmInstructionStart + (214 * 128) @ Addr of primary handler.
11371 mov r0, rSELF
11372 add r1, rFP, #OFF_FP_SHADOWFRAME
11373 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11374
11375/* ------------------------------ */
11376 .balign 128
11377.L_ALT_op_xor_int_lit16: /* 0xd7 */
11378/* File: arm/alt_stub.S */
11379/*
11380 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11381 * any interesting requests and then jump to the real instruction
11382 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11383 */
11384 .extern MterpCheckBefore
11385 EXPORT_PC
11386 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11387 adrl lr, artMterpAsmInstructionStart + (215 * 128) @ Addr of primary handler.
11388 mov r0, rSELF
11389 add r1, rFP, #OFF_FP_SHADOWFRAME
11390 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11391
11392/* ------------------------------ */
11393 .balign 128
11394.L_ALT_op_add_int_lit8: /* 0xd8 */
11395/* File: arm/alt_stub.S */
11396/*
11397 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11398 * any interesting requests and then jump to the real instruction
11399 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11400 */
11401 .extern MterpCheckBefore
11402 EXPORT_PC
11403 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11404 adrl lr, artMterpAsmInstructionStart + (216 * 128) @ Addr of primary handler.
11405 mov r0, rSELF
11406 add r1, rFP, #OFF_FP_SHADOWFRAME
11407 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11408
11409/* ------------------------------ */
11410 .balign 128
11411.L_ALT_op_rsub_int_lit8: /* 0xd9 */
11412/* File: arm/alt_stub.S */
11413/*
11414 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11415 * any interesting requests and then jump to the real instruction
11416 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11417 */
11418 .extern MterpCheckBefore
11419 EXPORT_PC
11420 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11421 adrl lr, artMterpAsmInstructionStart + (217 * 128) @ Addr of primary handler.
11422 mov r0, rSELF
11423 add r1, rFP, #OFF_FP_SHADOWFRAME
11424 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11425
11426/* ------------------------------ */
11427 .balign 128
11428.L_ALT_op_mul_int_lit8: /* 0xda */
11429/* File: arm/alt_stub.S */
11430/*
11431 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11432 * any interesting requests and then jump to the real instruction
11433 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11434 */
11435 .extern MterpCheckBefore
11436 EXPORT_PC
11437 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11438 adrl lr, artMterpAsmInstructionStart + (218 * 128) @ Addr of primary handler.
11439 mov r0, rSELF
11440 add r1, rFP, #OFF_FP_SHADOWFRAME
11441 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11442
11443/* ------------------------------ */
11444 .balign 128
11445.L_ALT_op_div_int_lit8: /* 0xdb */
11446/* File: arm/alt_stub.S */
11447/*
11448 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11449 * any interesting requests and then jump to the real instruction
11450 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11451 */
11452 .extern MterpCheckBefore
11453 EXPORT_PC
11454 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11455 adrl lr, artMterpAsmInstructionStart + (219 * 128) @ Addr of primary handler.
11456 mov r0, rSELF
11457 add r1, rFP, #OFF_FP_SHADOWFRAME
11458 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11459
11460/* ------------------------------ */
11461 .balign 128
11462.L_ALT_op_rem_int_lit8: /* 0xdc */
11463/* File: arm/alt_stub.S */
11464/*
11465 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11466 * any interesting requests and then jump to the real instruction
11467 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11468 */
11469 .extern MterpCheckBefore
11470 EXPORT_PC
11471 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11472 adrl lr, artMterpAsmInstructionStart + (220 * 128) @ Addr of primary handler.
11473 mov r0, rSELF
11474 add r1, rFP, #OFF_FP_SHADOWFRAME
11475 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11476
11477/* ------------------------------ */
11478 .balign 128
11479.L_ALT_op_and_int_lit8: /* 0xdd */
11480/* File: arm/alt_stub.S */
11481/*
11482 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11483 * any interesting requests and then jump to the real instruction
11484 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11485 */
11486 .extern MterpCheckBefore
11487 EXPORT_PC
11488 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11489 adrl lr, artMterpAsmInstructionStart + (221 * 128) @ Addr of primary handler.
11490 mov r0, rSELF
11491 add r1, rFP, #OFF_FP_SHADOWFRAME
11492 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11493
11494/* ------------------------------ */
11495 .balign 128
11496.L_ALT_op_or_int_lit8: /* 0xde */
11497/* File: arm/alt_stub.S */
11498/*
11499 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11500 * any interesting requests and then jump to the real instruction
11501 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11502 */
11503 .extern MterpCheckBefore
11504 EXPORT_PC
11505 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11506 adrl lr, artMterpAsmInstructionStart + (222 * 128) @ Addr of primary handler.
11507 mov r0, rSELF
11508 add r1, rFP, #OFF_FP_SHADOWFRAME
11509 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11510
11511/* ------------------------------ */
11512 .balign 128
11513.L_ALT_op_xor_int_lit8: /* 0xdf */
11514/* File: arm/alt_stub.S */
11515/*
11516 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11517 * any interesting requests and then jump to the real instruction
11518 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11519 */
11520 .extern MterpCheckBefore
11521 EXPORT_PC
11522 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11523 adrl lr, artMterpAsmInstructionStart + (223 * 128) @ Addr of primary handler.
11524 mov r0, rSELF
11525 add r1, rFP, #OFF_FP_SHADOWFRAME
11526 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11527
11528/* ------------------------------ */
11529 .balign 128
11530.L_ALT_op_shl_int_lit8: /* 0xe0 */
11531/* File: arm/alt_stub.S */
11532/*
11533 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11534 * any interesting requests and then jump to the real instruction
11535 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11536 */
11537 .extern MterpCheckBefore
11538 EXPORT_PC
11539 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11540 adrl lr, artMterpAsmInstructionStart + (224 * 128) @ Addr of primary handler.
11541 mov r0, rSELF
11542 add r1, rFP, #OFF_FP_SHADOWFRAME
11543 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11544
11545/* ------------------------------ */
11546 .balign 128
11547.L_ALT_op_shr_int_lit8: /* 0xe1 */
11548/* File: arm/alt_stub.S */
11549/*
11550 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11551 * any interesting requests and then jump to the real instruction
11552 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11553 */
11554 .extern MterpCheckBefore
11555 EXPORT_PC
11556 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11557 adrl lr, artMterpAsmInstructionStart + (225 * 128) @ Addr of primary handler.
11558 mov r0, rSELF
11559 add r1, rFP, #OFF_FP_SHADOWFRAME
11560 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11561
11562/* ------------------------------ */
11563 .balign 128
11564.L_ALT_op_ushr_int_lit8: /* 0xe2 */
11565/* File: arm/alt_stub.S */
11566/*
11567 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11568 * any interesting requests and then jump to the real instruction
11569 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11570 */
11571 .extern MterpCheckBefore
11572 EXPORT_PC
11573 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11574 adrl lr, artMterpAsmInstructionStart + (226 * 128) @ Addr of primary handler.
11575 mov r0, rSELF
11576 add r1, rFP, #OFF_FP_SHADOWFRAME
11577 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11578
11579/* ------------------------------ */
11580 .balign 128
11581.L_ALT_op_iget_quick: /* 0xe3 */
11582/* File: arm/alt_stub.S */
11583/*
11584 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11585 * any interesting requests and then jump to the real instruction
11586 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11587 */
11588 .extern MterpCheckBefore
11589 EXPORT_PC
11590 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11591 adrl lr, artMterpAsmInstructionStart + (227 * 128) @ Addr of primary handler.
11592 mov r0, rSELF
11593 add r1, rFP, #OFF_FP_SHADOWFRAME
11594 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11595
11596/* ------------------------------ */
11597 .balign 128
11598.L_ALT_op_iget_wide_quick: /* 0xe4 */
11599/* File: arm/alt_stub.S */
11600/*
11601 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11602 * any interesting requests and then jump to the real instruction
11603 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11604 */
11605 .extern MterpCheckBefore
11606 EXPORT_PC
11607 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11608 adrl lr, artMterpAsmInstructionStart + (228 * 128) @ Addr of primary handler.
11609 mov r0, rSELF
11610 add r1, rFP, #OFF_FP_SHADOWFRAME
11611 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11612
11613/* ------------------------------ */
11614 .balign 128
11615.L_ALT_op_iget_object_quick: /* 0xe5 */
11616/* File: arm/alt_stub.S */
11617/*
11618 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11619 * any interesting requests and then jump to the real instruction
11620 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11621 */
11622 .extern MterpCheckBefore
11623 EXPORT_PC
11624 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11625 adrl lr, artMterpAsmInstructionStart + (229 * 128) @ Addr of primary handler.
11626 mov r0, rSELF
11627 add r1, rFP, #OFF_FP_SHADOWFRAME
11628 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11629
11630/* ------------------------------ */
11631 .balign 128
11632.L_ALT_op_iput_quick: /* 0xe6 */
11633/* File: arm/alt_stub.S */
11634/*
11635 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11636 * any interesting requests and then jump to the real instruction
11637 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11638 */
11639 .extern MterpCheckBefore
11640 EXPORT_PC
11641 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11642 adrl lr, artMterpAsmInstructionStart + (230 * 128) @ Addr of primary handler.
11643 mov r0, rSELF
11644 add r1, rFP, #OFF_FP_SHADOWFRAME
11645 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11646
11647/* ------------------------------ */
11648 .balign 128
11649.L_ALT_op_iput_wide_quick: /* 0xe7 */
11650/* File: arm/alt_stub.S */
11651/*
11652 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11653 * any interesting requests and then jump to the real instruction
11654 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11655 */
11656 .extern MterpCheckBefore
11657 EXPORT_PC
11658 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11659 adrl lr, artMterpAsmInstructionStart + (231 * 128) @ Addr of primary handler.
11660 mov r0, rSELF
11661 add r1, rFP, #OFF_FP_SHADOWFRAME
11662 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11663
11664/* ------------------------------ */
11665 .balign 128
11666.L_ALT_op_iput_object_quick: /* 0xe8 */
11667/* File: arm/alt_stub.S */
11668/*
11669 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11670 * any interesting requests and then jump to the real instruction
11671 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11672 */
11673 .extern MterpCheckBefore
11674 EXPORT_PC
11675 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11676 adrl lr, artMterpAsmInstructionStart + (232 * 128) @ Addr of primary handler.
11677 mov r0, rSELF
11678 add r1, rFP, #OFF_FP_SHADOWFRAME
11679 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11680
11681/* ------------------------------ */
11682 .balign 128
11683.L_ALT_op_invoke_virtual_quick: /* 0xe9 */
11684/* File: arm/alt_stub.S */
11685/*
11686 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11687 * any interesting requests and then jump to the real instruction
11688 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11689 */
11690 .extern MterpCheckBefore
11691 EXPORT_PC
11692 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11693 adrl lr, artMterpAsmInstructionStart + (233 * 128) @ Addr of primary handler.
11694 mov r0, rSELF
11695 add r1, rFP, #OFF_FP_SHADOWFRAME
11696 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11697
11698/* ------------------------------ */
11699 .balign 128
11700.L_ALT_op_invoke_virtual_range_quick: /* 0xea */
11701/* File: arm/alt_stub.S */
11702/*
11703 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11704 * any interesting requests and then jump to the real instruction
11705 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11706 */
11707 .extern MterpCheckBefore
11708 EXPORT_PC
11709 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11710 adrl lr, artMterpAsmInstructionStart + (234 * 128) @ Addr of primary handler.
11711 mov r0, rSELF
11712 add r1, rFP, #OFF_FP_SHADOWFRAME
11713 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11714
11715/* ------------------------------ */
11716 .balign 128
11717.L_ALT_op_iput_boolean_quick: /* 0xeb */
11718/* File: arm/alt_stub.S */
11719/*
11720 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11721 * any interesting requests and then jump to the real instruction
11722 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11723 */
11724 .extern MterpCheckBefore
11725 EXPORT_PC
11726 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11727 adrl lr, artMterpAsmInstructionStart + (235 * 128) @ Addr of primary handler.
11728 mov r0, rSELF
11729 add r1, rFP, #OFF_FP_SHADOWFRAME
11730 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11731
11732/* ------------------------------ */
11733 .balign 128
11734.L_ALT_op_iput_byte_quick: /* 0xec */
11735/* File: arm/alt_stub.S */
11736/*
11737 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11738 * any interesting requests and then jump to the real instruction
11739 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11740 */
11741 .extern MterpCheckBefore
11742 EXPORT_PC
11743 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11744 adrl lr, artMterpAsmInstructionStart + (236 * 128) @ Addr of primary handler.
11745 mov r0, rSELF
11746 add r1, rFP, #OFF_FP_SHADOWFRAME
11747 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11748
11749/* ------------------------------ */
11750 .balign 128
11751.L_ALT_op_iput_char_quick: /* 0xed */
11752/* File: arm/alt_stub.S */
11753/*
11754 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11755 * any interesting requests and then jump to the real instruction
11756 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11757 */
11758 .extern MterpCheckBefore
11759 EXPORT_PC
11760 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11761 adrl lr, artMterpAsmInstructionStart + (237 * 128) @ Addr of primary handler.
11762 mov r0, rSELF
11763 add r1, rFP, #OFF_FP_SHADOWFRAME
11764 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11765
11766/* ------------------------------ */
11767 .balign 128
11768.L_ALT_op_iput_short_quick: /* 0xee */
11769/* File: arm/alt_stub.S */
11770/*
11771 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11772 * any interesting requests and then jump to the real instruction
11773 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11774 */
11775 .extern MterpCheckBefore
11776 EXPORT_PC
11777 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11778 adrl lr, artMterpAsmInstructionStart + (238 * 128) @ Addr of primary handler.
11779 mov r0, rSELF
11780 add r1, rFP, #OFF_FP_SHADOWFRAME
11781 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11782
11783/* ------------------------------ */
11784 .balign 128
11785.L_ALT_op_iget_boolean_quick: /* 0xef */
11786/* File: arm/alt_stub.S */
11787/*
11788 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11789 * any interesting requests and then jump to the real instruction
11790 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11791 */
11792 .extern MterpCheckBefore
11793 EXPORT_PC
11794 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11795 adrl lr, artMterpAsmInstructionStart + (239 * 128) @ Addr of primary handler.
11796 mov r0, rSELF
11797 add r1, rFP, #OFF_FP_SHADOWFRAME
11798 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11799
11800/* ------------------------------ */
11801 .balign 128
11802.L_ALT_op_iget_byte_quick: /* 0xf0 */
11803/* File: arm/alt_stub.S */
11804/*
11805 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11806 * any interesting requests and then jump to the real instruction
11807 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11808 */
11809 .extern MterpCheckBefore
11810 EXPORT_PC
11811 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11812 adrl lr, artMterpAsmInstructionStart + (240 * 128) @ Addr of primary handler.
11813 mov r0, rSELF
11814 add r1, rFP, #OFF_FP_SHADOWFRAME
11815 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11816
11817/* ------------------------------ */
11818 .balign 128
11819.L_ALT_op_iget_char_quick: /* 0xf1 */
11820/* File: arm/alt_stub.S */
11821/*
11822 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11823 * any interesting requests and then jump to the real instruction
11824 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11825 */
11826 .extern MterpCheckBefore
11827 EXPORT_PC
11828 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11829 adrl lr, artMterpAsmInstructionStart + (241 * 128) @ Addr of primary handler.
11830 mov r0, rSELF
11831 add r1, rFP, #OFF_FP_SHADOWFRAME
11832 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11833
11834/* ------------------------------ */
11835 .balign 128
11836.L_ALT_op_iget_short_quick: /* 0xf2 */
11837/* File: arm/alt_stub.S */
11838/*
11839 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11840 * any interesting requests and then jump to the real instruction
11841 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11842 */
11843 .extern MterpCheckBefore
11844 EXPORT_PC
11845 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11846 adrl lr, artMterpAsmInstructionStart + (242 * 128) @ Addr of primary handler.
11847 mov r0, rSELF
11848 add r1, rFP, #OFF_FP_SHADOWFRAME
11849 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11850
11851/* ------------------------------ */
11852 .balign 128
11853.L_ALT_op_invoke_lambda: /* 0xf3 */
11854/* File: arm/alt_stub.S */
11855/*
11856 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11857 * any interesting requests and then jump to the real instruction
11858 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11859 */
11860 .extern MterpCheckBefore
11861 EXPORT_PC
11862 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11863 adrl lr, artMterpAsmInstructionStart + (243 * 128) @ Addr of primary handler.
11864 mov r0, rSELF
11865 add r1, rFP, #OFF_FP_SHADOWFRAME
11866 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11867
11868/* ------------------------------ */
11869 .balign 128
11870.L_ALT_op_unused_f4: /* 0xf4 */
11871/* File: arm/alt_stub.S */
11872/*
11873 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11874 * any interesting requests and then jump to the real instruction
11875 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11876 */
11877 .extern MterpCheckBefore
11878 EXPORT_PC
11879 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11880 adrl lr, artMterpAsmInstructionStart + (244 * 128) @ Addr of primary handler.
11881 mov r0, rSELF
11882 add r1, rFP, #OFF_FP_SHADOWFRAME
11883 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11884
11885/* ------------------------------ */
11886 .balign 128
11887.L_ALT_op_capture_variable: /* 0xf5 */
11888/* File: arm/alt_stub.S */
11889/*
11890 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11891 * any interesting requests and then jump to the real instruction
11892 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11893 */
11894 .extern MterpCheckBefore
11895 EXPORT_PC
11896 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11897 adrl lr, artMterpAsmInstructionStart + (245 * 128) @ Addr of primary handler.
11898 mov r0, rSELF
11899 add r1, rFP, #OFF_FP_SHADOWFRAME
11900 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11901
11902/* ------------------------------ */
11903 .balign 128
11904.L_ALT_op_create_lambda: /* 0xf6 */
11905/* File: arm/alt_stub.S */
11906/*
11907 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11908 * any interesting requests and then jump to the real instruction
11909 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11910 */
11911 .extern MterpCheckBefore
11912 EXPORT_PC
11913 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11914 adrl lr, artMterpAsmInstructionStart + (246 * 128) @ Addr of primary handler.
11915 mov r0, rSELF
11916 add r1, rFP, #OFF_FP_SHADOWFRAME
11917 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11918
11919/* ------------------------------ */
11920 .balign 128
11921.L_ALT_op_liberate_variable: /* 0xf7 */
11922/* File: arm/alt_stub.S */
11923/*
11924 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11925 * any interesting requests and then jump to the real instruction
11926 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11927 */
11928 .extern MterpCheckBefore
11929 EXPORT_PC
11930 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11931 adrl lr, artMterpAsmInstructionStart + (247 * 128) @ Addr of primary handler.
11932 mov r0, rSELF
11933 add r1, rFP, #OFF_FP_SHADOWFRAME
11934 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11935
11936/* ------------------------------ */
11937 .balign 128
11938.L_ALT_op_box_lambda: /* 0xf8 */
11939/* File: arm/alt_stub.S */
11940/*
11941 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11942 * any interesting requests and then jump to the real instruction
11943 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11944 */
11945 .extern MterpCheckBefore
11946 EXPORT_PC
11947 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11948 adrl lr, artMterpAsmInstructionStart + (248 * 128) @ Addr of primary handler.
11949 mov r0, rSELF
11950 add r1, rFP, #OFF_FP_SHADOWFRAME
11951 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11952
11953/* ------------------------------ */
11954 .balign 128
11955.L_ALT_op_unbox_lambda: /* 0xf9 */
11956/* File: arm/alt_stub.S */
11957/*
11958 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11959 * any interesting requests and then jump to the real instruction
11960 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11961 */
11962 .extern MterpCheckBefore
11963 EXPORT_PC
11964 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11965 adrl lr, artMterpAsmInstructionStart + (249 * 128) @ Addr of primary handler.
11966 mov r0, rSELF
11967 add r1, rFP, #OFF_FP_SHADOWFRAME
11968 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11969
11970/* ------------------------------ */
11971 .balign 128
11972.L_ALT_op_unused_fa: /* 0xfa */
11973/* File: arm/alt_stub.S */
11974/*
11975 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11976 * any interesting requests and then jump to the real instruction
11977 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11978 */
11979 .extern MterpCheckBefore
11980 EXPORT_PC
11981 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11982 adrl lr, artMterpAsmInstructionStart + (250 * 128) @ Addr of primary handler.
11983 mov r0, rSELF
11984 add r1, rFP, #OFF_FP_SHADOWFRAME
11985 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
11986
11987/* ------------------------------ */
11988 .balign 128
11989.L_ALT_op_unused_fb: /* 0xfb */
11990/* File: arm/alt_stub.S */
11991/*
11992 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
11993 * any interesting requests and then jump to the real instruction
11994 * handler. Note that the call to MterpCheckBefore is done as a tail call.
11995 */
11996 .extern MterpCheckBefore
11997 EXPORT_PC
11998 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
11999 adrl lr, artMterpAsmInstructionStart + (251 * 128) @ Addr of primary handler.
12000 mov r0, rSELF
12001 add r1, rFP, #OFF_FP_SHADOWFRAME
12002 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12003
12004/* ------------------------------ */
12005 .balign 128
12006.L_ALT_op_unused_fc: /* 0xfc */
12007/* File: arm/alt_stub.S */
12008/*
12009 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12010 * any interesting requests and then jump to the real instruction
12011 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12012 */
12013 .extern MterpCheckBefore
12014 EXPORT_PC
12015 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12016 adrl lr, artMterpAsmInstructionStart + (252 * 128) @ Addr of primary handler.
12017 mov r0, rSELF
12018 add r1, rFP, #OFF_FP_SHADOWFRAME
12019 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12020
12021/* ------------------------------ */
12022 .balign 128
12023.L_ALT_op_unused_fd: /* 0xfd */
12024/* File: arm/alt_stub.S */
12025/*
12026 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12027 * any interesting requests and then jump to the real instruction
12028 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12029 */
12030 .extern MterpCheckBefore
12031 EXPORT_PC
12032 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12033 adrl lr, artMterpAsmInstructionStart + (253 * 128) @ Addr of primary handler.
12034 mov r0, rSELF
12035 add r1, rFP, #OFF_FP_SHADOWFRAME
12036 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12037
12038/* ------------------------------ */
12039 .balign 128
12040.L_ALT_op_unused_fe: /* 0xfe */
12041/* File: arm/alt_stub.S */
12042/*
12043 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12044 * any interesting requests and then jump to the real instruction
12045 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12046 */
12047 .extern MterpCheckBefore
12048 EXPORT_PC
12049 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12050 adrl lr, artMterpAsmInstructionStart + (254 * 128) @ Addr of primary handler.
12051 mov r0, rSELF
12052 add r1, rFP, #OFF_FP_SHADOWFRAME
12053 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12054
12055/* ------------------------------ */
12056 .balign 128
12057.L_ALT_op_unused_ff: /* 0xff */
12058/* File: arm/alt_stub.S */
12059/*
12060 * Inter-instruction transfer stub. Call out to MterpCheckBefore to handle
12061 * any interesting requests and then jump to the real instruction
12062 * handler. Note that the call to MterpCheckBefore is done as a tail call.
12063 */
12064 .extern MterpCheckBefore
12065 EXPORT_PC
12066 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh IBASE.
12067 adrl lr, artMterpAsmInstructionStart + (255 * 128) @ Addr of primary handler.
12068 mov r0, rSELF
12069 add r1, rFP, #OFF_FP_SHADOWFRAME
12070 b MterpCheckBefore @ (self, shadow_frame) @ Tail call.
12071
12072 .balign 128
12073 .size artMterpAsmAltInstructionStart, .-artMterpAsmAltInstructionStart
12074 .global artMterpAsmAltInstructionEnd
12075artMterpAsmAltInstructionEnd:
12076/* File: arm/footer.S */
12077/*
12078 * ===========================================================================
12079 * Common subroutines and data
12080 * ===========================================================================
12081 */
12082
12083 .text
12084 .align 2
12085
12086/*
12087 * We've detected a condition that will result in an exception, but the exception
12088 * has not yet been thrown. Just bail out to the reference interpreter to deal with it.
12089 * TUNING: for consistency, we may want to just go ahead and handle these here.
12090 */
12091#define MTERP_LOGGING 0
12092common_errDivideByZero:
12093 EXPORT_PC
12094#if MTERP_LOGGING
12095 mov r0, rSELF
12096 add r1, rFP, #OFF_FP_SHADOWFRAME
12097 bl MterpLogDivideByZeroException
12098#endif
12099 b MterpCommonFallback
12100
12101common_errArrayIndex:
12102 EXPORT_PC
12103#if MTERP_LOGGING
12104 mov r0, rSELF
12105 add r1, rFP, #OFF_FP_SHADOWFRAME
12106 bl MterpLogArrayIndexException
12107#endif
12108 b MterpCommonFallback
12109
12110common_errNegativeArraySize:
12111 EXPORT_PC
12112#if MTERP_LOGGING
12113 mov r0, rSELF
12114 add r1, rFP, #OFF_FP_SHADOWFRAME
12115 bl MterpLogNegativeArraySizeException
12116#endif
12117 b MterpCommonFallback
12118
12119common_errNoSuchMethod:
12120 EXPORT_PC
12121#if MTERP_LOGGING
12122 mov r0, rSELF
12123 add r1, rFP, #OFF_FP_SHADOWFRAME
12124 bl MterpLogNoSuchMethodException
12125#endif
12126 b MterpCommonFallback
12127
12128common_errNullObject:
12129 EXPORT_PC
12130#if MTERP_LOGGING
12131 mov r0, rSELF
12132 add r1, rFP, #OFF_FP_SHADOWFRAME
12133 bl MterpLogNullObjectException
12134#endif
12135 b MterpCommonFallback
12136
12137common_exceptionThrown:
12138 EXPORT_PC
12139#if MTERP_LOGGING
12140 mov r0, rSELF
12141 add r1, rFP, #OFF_FP_SHADOWFRAME
12142 bl MterpLogExceptionThrownException
12143#endif
12144 b MterpCommonFallback
12145
12146MterpSuspendFallback:
12147 EXPORT_PC
12148#if MTERP_LOGGING
12149 mov r0, rSELF
12150 add r1, rFP, #OFF_FP_SHADOWFRAME
12151 ldr r2, [rSELF, #THREAD_FLAGS_OFFSET]
12152 bl MterpLogSuspendFallback
12153#endif
12154 b MterpCommonFallback
12155
12156/*
12157 * If we're here, something is out of the ordinary. If there is a pending
12158 * exception, handle it. Otherwise, roll back and retry with the reference
12159 * interpreter.
12160 */
12161MterpPossibleException:
12162 ldr r0, [rSELF, #THREAD_EXCEPTION_OFFSET]
12163 cmp r0, #0 @ Exception pending?
12164 beq MterpFallback @ If not, fall back to reference interpreter.
12165 /* intentional fallthrough - handle pending exception. */
12166/*
12167 * On return from a runtime helper routine, we've found a pending exception.
12168 * Can we handle it here - or need to bail out to caller?
12169 *
12170 */
12171MterpException:
12172 mov r0, rSELF
12173 add r1, rFP, #OFF_FP_SHADOWFRAME
12174 bl MterpHandleException @ (self, shadow_frame)
12175 cmp r0, #0
12176 beq MterpExceptionReturn @ no local catch, back to caller.
12177 ldr r0, [rFP, #OFF_FP_CODE_ITEM]
12178 ldr r1, [rFP, #OFF_FP_DEX_PC]
12179 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET]
12180 add rPC, r0, #CODEITEM_INSNS_OFFSET
12181 add rPC, rPC, r1, lsl #1 @ generate new dex_pc_ptr
12182 str rPC, [rFP, #OFF_FP_DEX_PC_PTR]
12183 /* resume execution at catch block */
12184 FETCH_INST
12185 GET_INST_OPCODE ip
12186 GOTO_OPCODE ip
12187 /* NOTE: no fallthrough */
12188
12189/*
12190 * Check for suspend check request. Assumes rINST already loaded, rPC advanced and
12191 * still needs to get the opcode and branch to it, and flags are in lr.
12192 */
12193MterpCheckSuspendAndContinue:
12194 ldr rIBASE, [rSELF, #THREAD_CURRENT_IBASE_OFFSET] @ refresh rIBASE
12195 EXPORT_PC
12196 mov r0, rSELF
12197 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
12198 blne MterpSuspendCheck @ (self)
12199 GET_INST_OPCODE ip @ extract opcode from rINST
12200 GOTO_OPCODE ip @ jump to next instruction
12201
12202/*
12203 * Bail out to reference interpreter.
12204 */
12205MterpFallback:
12206 EXPORT_PC
12207 mov r0, rSELF
12208 add r1, rFP, #OFF_FP_SHADOWFRAME
12209 bl MterpLogFallback
12210MterpCommonFallback:
12211 mov r0, #0 @ signal retry with reference interpreter.
12212 b MterpDone
12213
12214/*
12215 * We pushed some registers on the stack in ExecuteMterpImpl, then saved
12216 * SP and LR. Here we restore SP, restore the registers, and then restore
12217 * LR to PC.
12218 *
12219 * On entry:
12220 * uint32_t* rFP (should still be live, pointer to base of vregs)
12221 */
12222MterpExceptionReturn:
12223 ldr r2, [rFP, #OFF_FP_RESULT_REGISTER]
12224 str r0, [r2]
12225 str r1, [r2, #4]
12226 mov r0, #1 @ signal return to caller.
12227 b MterpDone
12228MterpReturn:
12229 ldr r2, [rFP, #OFF_FP_RESULT_REGISTER]
12230 ldr lr, [rSELF, #THREAD_FLAGS_OFFSET]
12231 str r0, [r2]
12232 str r1, [r2, #4]
12233 mov r0, rSELF
12234 ands lr, #(THREAD_SUSPEND_REQUEST | THREAD_CHECKPOINT_REQUEST)
12235 blne MterpSuspendCheck @ (self)
12236 mov r0, #1 @ signal return to caller.
12237MterpDone:
12238 add sp, sp, #4 @ un-align 64
12239 ldmfd sp!, {r4-r10,fp,pc} @ restore 9 regs and return
12240
12241
12242 .fnend
12243 .size ExecuteMterpImpl, .-ExecuteMterpImpl
12244
12245